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

bogdandm / json2python-models / 3822451468

pending completion
3822451468

Pull #55

github

GitHub
Merge 8c3a0adb5 into cdd441319
Pull Request #55: Add python3.11 to test matrix

1553 of 1584 relevant lines covered (98.04%)

4.9 hits per line

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

97.67
/json_to_models/models/utils.py
1
from collections import defaultdict
5✔
2
from typing import Generic, TypeVar, Union
5✔
3

4
from . import INDENT
5✔
5

6
T = TypeVar('T')
5✔
7

8

9
class ListEx(list, Generic[T]):
5✔
10
    """
11
    Extended list with shortcut methods
12
    """
13

14
    def safe_index(self, value: T):
5✔
15
        try:
5✔
16
            return self.index(value)
5✔
17
        except ValueError:
5✔
18
            return None
19

20
    def _safe_indexes(self, *values: T):
5✔
21
        return [i for i in map(self.safe_index, values) if i is not None]
5✔
22

23
    def insert_before(self, value: T, *before: T):
5✔
24
        ix = self._safe_indexes(*before)
5✔
25
        if not ix:
5✔
26
            raise ValueError
5✔
27
        pos = min(ix)
5✔
28
        self.insert(pos, value)
5✔
29
        return pos
5✔
30

31
    def insert_after(self, value: T, *after: T):
5✔
32
        ix = self._safe_indexes(*after)
5✔
33
        if not ix:
5✔
34
            raise ValueError
×
35
        pos = max(ix) + 1
5✔
36
        self.insert(pos, value)
5✔
37
        return pos
5✔
38

39

40
class PositionsDict(defaultdict):
5✔
41
    # Dict contains mapping Index -> position, where position is list index to insert nested element of Index
42
    INC = object()
5✔
43

44
    def __init__(self, default_factory=int, **kwargs):
5✔
45
        super().__init__(default_factory, **kwargs)
5✔
46

47
    def update_position(self, key: str, value: Union[object, int]):
5✔
48
        """
49
        Shift all elements which are placed after updated one
50

51
        :param key: Index or "root"
52
        :param value: Could be position or PositionsDict.INC to perform quick increment (x+=1)
53
        :return:
54
        """
55
        if value is self.INC:
5✔
56
            value = self[key] + 1
5✔
57
        if key in self:
5✔
58
            old_value = self[key]
5✔
59
            delta = value - old_value
5✔
60
        else:
61
            old_value = value
5✔
62
            delta = 1
5✔
63
        for k, v in self.items():
5✔
64
            if k != key and v >= old_value:
5✔
65
                self[k] += delta
5✔
66
        self[key] = value
5✔
67

68

69
def indent(string: str, lvl: int = 1, indent: str = INDENT) -> str:
5✔
70
    """
71
    Indent all lines of string by ``indent * lvl``
72
    """
73
    return "\n".join(indent * lvl + line for line in string.split("\n"))
5✔
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