From 72c8dc8c570c8c5165bec6bc37ff3283518439df Mon Sep 17 00:00:00 2001 From: Ferris Nehme Date: Mon, 2 Jul 2018 14:22:13 -0700 Subject: [PATCH 1/2] Add support for uri fragments --- jsonpointer.py | 9 +++++++-- tests.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/jsonpointer.py b/jsonpointer.py index ec18cbe..b8fa67b 100644 --- a/jsonpointer.py +++ b/jsonpointer.py @@ -53,6 +53,7 @@ from collections import Mapping, Sequence from itertools import tee +from requests.utils import unquote import re import copy @@ -178,10 +179,14 @@ def __init__(self, pointer): invalid_escape.group())) parts = pointer.split('/') - if parts.pop(0) != '': - raise JsonPointerException('Location must start with /') + first_part = parts.pop(0) + if first_part not in ('', '#'): + raise JsonPointerException('Location must start with / or #') parts = [unescape(part) for part in parts] + if first_part == '#': + parts = [unquote(part) for part in parts] + self.parts = parts def to_last(self, doc): diff --git a/tests.py b/tests.py index 54ca436..9a82dc2 100755 --- a/tests.py +++ b/tests.py @@ -42,6 +42,34 @@ def test_example(self): self.assertEqual(resolve_pointer(doc, "/m~0n"), 8) + def test_example_uri_fragment(self): + doc = { + "foo": ["bar", "baz"], + "": 0, + "a/b": 1, + "c%d": 2, + "e^f": 3, + "g|h": 4, + "i\\j": 5, + "k\"l": 6, + " ": 7, + "m~n": 8 + } + + self.assertEqual(resolve_pointer(doc, "#"), doc) + self.assertEqual(resolve_pointer(doc, "#/foo"), ["bar", "baz"]) + self.assertEqual(resolve_pointer(doc, "#/foo/0"), "bar") + self.assertEqual(resolve_pointer(doc, "#/"), 0) + self.assertEqual(resolve_pointer(doc, "#/a~1b"), 1) + self.assertEqual(resolve_pointer(doc, "#/c%25d"), 2) + self.assertEqual(resolve_pointer(doc, "#/e%5Ef"), 3) + self.assertEqual(resolve_pointer(doc, "#/g%7Ch"), 4) + self.assertEqual(resolve_pointer(doc, "#/i%5Cj"), 5) + self.assertEqual(resolve_pointer(doc, "#/k%22l"), 6) + self.assertEqual(resolve_pointer(doc, "#/%20"), 7) + self.assertEqual(resolve_pointer(doc, "#/m~0n"), 8) + + def test_eol(self): doc = { "foo": ["bar", "baz"] From 4117221411c6c0cab45a808ed70ee9fd3c357dc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20K=C3=B6gl?= Date: Sat, 3 Oct 2026 23:12:07 +0200 Subject: [PATCH 2/2] Import unquote from urllib, not requests Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- jsonpointer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/jsonpointer.py b/jsonpointer.py index b8fa67b..6b6e855 100644 --- a/jsonpointer.py +++ b/jsonpointer.py @@ -53,7 +53,10 @@ from collections import Mapping, Sequence from itertools import tee -from requests.utils import unquote +try: + from urllib.parse import unquote +except ImportError: # Python 2 + from urllib import unquote import re import copy