summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml4
-rw-r--r--jsonpointer.py28
-rw-r--r--setup.py6
-rwxr-xr-xtests.py21
4 files changed, 37 insertions, 22 deletions
diff --git a/.travis.yml b/.travis.yml
index 52f3048..9065721 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,9 +2,9 @@ language: python
python:
- "2.6"
- "2.7"
- - "3.2"
- "3.3"
- "3.4"
+ - "3.5"
- "pypy"
- "pypy3"
@@ -16,3 +16,5 @@ script:
after_script:
- coveralls
+
+sudo: false
diff --git a/jsonpointer.py b/jsonpointer.py
index 7e94705..4f2bfc7 100644
--- a/jsonpointer.py
+++ b/jsonpointer.py
@@ -36,7 +36,7 @@ from __future__ import unicode_literals
# Will be parsed by setup.py to determine package metadata
__author__ = 'Stefan Kögl <stefan@skoegl.net>'
-__version__ = '1.5'
+__version__ = '1.10'
__website__ = 'https://github.com/stefankoegl/python-json-pointer'
__license__ = 'Modified BSD License'
@@ -44,6 +44,7 @@ __license__ = 'Modified BSD License'
try:
from urllib import unquote
from itertools import izip
+ str = unicode
except ImportError: # Python 3
from urllib.parse import unquote
izip = zip
@@ -83,7 +84,7 @@ def set_pointer(doc, pointer, value, inplace=True):
def resolve_pointer(doc, pointer, default=_nothing):
- """Resolves pointer against doc and returns the referenced object
+ """ Resolves pointer against doc and returns the referenced object
>>> obj = {'foo': {'anArray': [ {'prop': 44}], 'another prop': {'baz': 'A string' }}}
@@ -158,8 +159,7 @@ class JsonPointer(object):
raise JsonPointerException('location must starts with /')
parts = map(unquote, parts)
- parts = [part.replace('~1', '/') for part in parts]
- parts = [part.replace('~0', '~') for part in parts]
+ parts = [unescape(part) for part in parts]
self.parts = parts
def to_last(self, doc):
@@ -263,9 +263,11 @@ class JsonPointer(object):
def contains(self, ptr):
"""Returns True if self contains the given ptr"""
+ return self.parts[:len(ptr.parts)] == ptr.parts
- return len(self.parts) > len(ptr.parts) and \
- self.parts[:len(ptr.parts)] == ptr.parts
+ def __contains__(self, item):
+ """Returns True if self contains the given ptr"""
+ return self.contains(item)
@property
def path(self):
@@ -273,8 +275,7 @@ class JsonPointer(object):
>>> ptr = JsonPointer('/~0/0/~1').path == '/~0/0/~1'
"""
- parts = [part.replace('~', '~0') for part in self.parts]
- parts = [part.replace('/', '~1') for part in parts]
+ parts = [escape(part) for part in self.parts]
return ''.join('/' + part for part in parts)
def __eq__(self, other):
@@ -300,8 +301,13 @@ class JsonPointer(object):
>>> JsonPointer.from_parts(['a', '~', '/', 0]).path == '/a/~0/~1/0'
True
"""
- parts = [str(part) for part in parts]
- parts = [part.replace('~', '~0') for part in parts]
- parts = [part.replace('/', '~1') for part in parts]
+ parts = [escape(str(part)) for part in parts]
ptr = cls(''.join('/' + part for part in parts))
return ptr
+
+
+def escape(s):
+ return s.replace('~', '~0').replace('/', '~1')
+
+def unescape(s):
+ return s.replace('~1', '/').replace('~0', '~')
diff --git a/setup.py b/setup.py
index c002302..2c65e44 100644
--- a/setup.py
+++ b/setup.py
@@ -45,9 +45,9 @@ CLASSIFIERS = [
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.2',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
+ 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: Implementation :: CPython',
'Programming Language :: Python :: Implementation :: PyPy',
'Topic :: Software Development :: Libraries',
@@ -64,9 +64,5 @@ setup(name=PACKAGE,
url=WEBSITE,
py_modules=MODULES,
scripts=['bin/jsonpointer'],
- entry_points = {
- 'console_scripts': [
- 'jsonpointer = jsonpointer:main',
- ]},
classifiers=CLASSIFIERS,
)
diff --git a/tests.py b/tests.py
index 2b5608e..cf5c61a 100755
--- a/tests.py
+++ b/tests.py
@@ -1,6 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
import doctest
import unittest
import sys
@@ -61,6 +63,7 @@ class SpecificationTests(unittest.TestCase):
"/k\"l",
"/ ",
"/m~0n",
+ '/\xee',
]
for path in paths:
ptr = JsonPointer(path)
@@ -72,6 +75,11 @@ class SpecificationTests(unittest.TestCase):
class ComparisonTests(unittest.TestCase):
+ def setUp(self):
+ self.ptr1 = JsonPointer("/a/b/c")
+ self.ptr2 = JsonPointer("/a/b")
+ self.ptr3 = JsonPointer("/b/c")
+
def test_eq_hash(self):
p1 = JsonPointer("/something/1/b")
p2 = JsonPointer("/something/1/b")
@@ -89,13 +97,16 @@ class ComparisonTests(unittest.TestCase):
self.assertFalse(p1 == "/something/1/b")
def test_contains(self):
- p1 = JsonPointer("/a/b/c")
- p2 = JsonPointer("/a/b")
- p3 = JsonPointer("/b/c")
- self.assertTrue(p1.contains(p2))
- self.assertFalse(p1.contains(p3))
+ self.assertTrue(self.ptr1.contains(self.ptr2))
+ self.assertTrue(self.ptr1.contains(self.ptr1))
+ self.assertFalse(self.ptr1.contains(self.ptr3))
+
+ def test_contains_magic(self):
+ self.assertTrue(self.ptr2 in self.ptr1)
+ self.assertTrue(self.ptr1 in self.ptr1)
+ self.assertFalse(self.ptr3 in self.ptr1)
class WrongInputTests(unittest.TestCase):