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

rjfarmer / gfModParser / 18614139848

18 Oct 2025 09:59AM UTC coverage: 88.036% (-0.3%) from 88.291%
18614139848

push

github

rjfarmer
More typing

70 of 73 new or added lines in 8 files covered. (95.89%)

986 of 1120 relevant lines covered (88.04%)

0.88 hits per line

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

93.48
/gfModParser/modules/operators.py
1
import operator
1✔
2
from packaging.version import Version
1✔
3
from functools import cache, cached_property
1✔
4
import abc
1✔
5

6
from .. import utils
1✔
7
from . import utils as u
1✔
8

9

10
_default_ops = {
1✔
11
    "UPLUS": operator.__add__,
12
    "UMINUS": operator.__sub__,
13
    "PLUS": operator.__add__,
14
    "MINUS": operator.__sub__,
15
    "TIMES": operator.__mul__,
16
    "DIVIDE": operator.__truediv__,
17
    "POWER": operator.__pow__,
18
    "CONCAT": operator.__add__,  # Only for strings
19
    "AND": operator.__and__,
20
    "OR": operator.__or__,
21
    "EQV": operator.__eq__,
22
    "NEQV": operator.__ne__,
23
    "EQ_SIGN": operator.__eq__,
24
    "EQ": operator.__eq__,
25
    "NE_SIGN": operator.__ne__,
26
    "NE": operator.__ne__,
27
    "GT_SIGN": operator.__gt__,
28
    "GT": operator.__gt__,
29
    "GE_SIGN": operator.__ge__,
30
    "GE": operator.__ge__,
31
    "LT_SIGN": operator.__le__,
32
    "LT": operator.__le__,
33
    "LE_SIGN": operator.__le__,
34
    "LE": operator.__le__,
35
    "NOT": operator.__not__,
36
    "PARENTHESES": None,
37
    "USER": None,
38
    "NULL": None,
39
}
40

41

42
class base_interface(abc.ABC):
1✔
43
    def __init__(self, symbols, *, version: Version) -> None:
1✔
44
        self._raw = symbols
1✔
45
        self.version = version
1✔
46

47
    @abc.abstractmethod
1✔
48
    def extract(self) -> dict[str, u.ListSymbols]:
1✔
NEW
49
        raise NotImplementedError
×
50

51
    def keys(self):
1✔
52
        return self.extract().keys()
1✔
53

54
    def __getitem__(self, key: str) -> u.ListSymbols:
1✔
55
        return self.extract()[key]
1✔
56

57
    def values(self):
1✔
NEW
58
        return self.extract().values()
×
59

60
    def items(self):
1✔
NEW
61
        return self.extract().items()
×
62

63

64
class Interfaces(base_interface):
1✔
65
    """
66
    For overriding inbuilt functions (like +,*,-,/ etc)
67
    """
68

69
    @cache
1✔
70
    def extract(self):
1✔
71
        res = {}
1✔
72
        face = utils.bracket_split(self._raw)[0]
1✔
73

74
        for index, value in enumerate(face):
1✔
75
            if len(value):
1✔
76
                key = list(_default_ops.keys())[index]
1✔
77
                res[key] = u.ListSymbols(value, version=self.version)
1✔
78
        return res
1✔
79

80
    def op(self, key):
1✔
81
        return _default_ops[key]
1✔
82

83

84
class Generics(base_interface):
1✔
85
    """
86
    Provides generic interfaces (type overloading)
87
    """
88

89
    @cache
1✔
90
    def extract(self):
1✔
91
        res = {}
1✔
92
        face = utils.bracket_split(self._raw)[0]
1✔
93

94
        for value in face:
1✔
95
            (name, _, *num) = value
1✔
96
            name = utils.string_clean(name)
1✔
97
            res[name] = u.ListSymbols(num, version=self.version)
1✔
98
        return res
1✔
99

100

101
class Operators(Generics):
1✔
102
    """
103
    Provides custom operators like .my_op.
104
    """
105

106
    pass
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc