• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

SlowAPI / fast-json-pointer / 3710072713

pending completion
3710072713

push

github

Tristan Sweeney
Add dataclasses

35 of 35 new or added lines in 2 files covered. (100.0%)

81 of 82 relevant lines covered (98.78%)

0.99 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.06
/src/fast_json_pointer/pointer.py
1
from __future__ import annotations
1✔
2
from dataclasses import dataclass
1✔
3
from typing import *
1✔
4

5
from . import rfc6901_parser, rel_parser
1✔
6

7
class _ReprStrMixin:
1✔
8
    def __repr__(self) -> str:
1✔
9
        # inner single quotes is consistent w/ how str.__repr__ works
10
        return f"{type(self).__name__}('{str(self)}')"
1✔
11

12

13

14
@dataclass(repr=False)
1✔
15
class JsonPointer(_ReprStrMixin):
1✔
16
    '''Primitive dataclass for RFC 6901 json pointers.
1✔
17
    
18
    >>> JsonPointer(['~home', 'foo.txt', 'mime/type'])
19
    JsonPointer('/~0home/foo.txt/mime~1type')
20
    '''
21
    parts: list[str]
1✔
22
    '''Unescaped list of path parts.
1✔
23
    
24
    >>> JsonPointer.parse("/data/items/0/id").parts
25
    ['data', 'items', '0', 'id']
26
    '''
27

28
    def __str__(self) -> str:
1✔
29
        '''Serialize to RFC 6901 json pointer.
30
        '''
31
        return rfc6901_parser.unparse(self.parts)
1✔
32

33
    @classmethod
1✔
34
    def parse(cls, s: str) -> Self:
1✔
35
        '''Parse a serialized RFC 6901 json pointer.
36
        '''
37
        return cls(parts=rfc6901_parser.parse(s))
×
38

39
    # I dediced against this, as it's nagged at me since I first wrote it that you should't
40
    # resolve JSON pointers w/o having a Doccument you're resolving them across.
41
    #
42
    #def join(self, other: JsonPointer | RelativeJsonPointer | str) -> Self:
43
    #    match other:
44
    #        case JsonPointer(parts):
45
    #            return type(self)(parts=[*self.parts, *parts])
46
    #
47
    #        case str():
48
    #            return type(self)(parts=[*self.parts, other])
49
    #
50
    #        case RelativeJsonPointer(offset, pointer):
51
    #            remaining = len(self.parts) - offset
52
    #            if remaining < 0:
53
    #                raise PathJoiningException(
54
    #                    "Tried to ascend past root of json doc when appending relative pointer"
55
    #                )
56
    #            our_parts = self.parts[:remaining]
57
    #            their_parts = [] if pointer is None else pointer.parts
58
    #
59
    #            return type(self)(parts=[*our_parts, *their_parts])
60
       
61

62

63

64
@dataclass(repr=False)
1✔
65
class RelativeJsonPointer((_ReprStrMixin)):
1✔
66
    '''Primitive data class for 2020-12 draft json pointers.
1✔
67

68
    >>> RelativeJsonPointer(0, JsonPointer(['data', 'items']))
69
    RelativeJsonPointer('0/data/items')
70

71
    >>> RelativeJsonPointer(0, None)
72
    RelativeJsonPointer('0#')
73
    '''
74
    # https://json-schema.org/draft/2019-09/relative-json-pointer.html
75
    offset: int
1✔
76
    pointer: JsonPointer | None
1✔
77
    
78
    @property
1✔
79
    def parts(self) -> list[str] | None:
1✔
80
        '''Unescaped list of path parts, if this isn't an index reference.
81
        
82
        >>> RelativeJsonPointer.parse("0/data/items/0/id").parts
83
        ['data', 'items', '0', 'id']
84
        >>> RelativeJsonPointer.parse("0#").parts is None
85
        True
86
        '''
87
        return None if self.pointer is None else self.pointer.parts
1✔
88

89
    @property
1✔
90
    def is_index_ref(self) -> bool:
1✔
91
        '''
92
        >>> RelativeJsonPointer.parse("0").is_index_ref
93
        False
94
        >>> RelativeJsonPointer.parse("0/").is_index_ref
95
        False
96
        >>> RelativeJsonPointer.parse("0#").is_index_ref
97
        True
98
        '''
99
        return self.pointer is None
1✔
100

101
    def __str__(self) -> str:
1✔
102
        '''Serialize to 2020-12 draft relative json pointer.
103
        '''
104
        return rel_parser.unparse(self.offset, self.parts)
1✔
105

106
    @classmethod
1✔
107
    def parse(cls, s: str) -> Self:
1✔
108
        '''Parse a serialized 2020-12 draft relative json pointer.
109
        '''
110
        offset, parts = rel_parser.parse(s)
1✔
111
        return cls(offset=offset, pointer=None if parts is None else JsonPointer(parts=parts))
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc