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

rjfarmer / gfModParser / 24637443406

19 Apr 2026 07:38PM UTC coverage: 96.543% (-0.1%) from 96.681%
24637443406

push

github

rjfarmer
Fill out operators

12 of 12 new or added lines in 1 file covered. (100.0%)

10 existing lines in 2 files now uncovered.

1145 of 1186 relevant lines covered (96.54%)

0.97 hits per line

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

93.38
/gfModParser/modules/properties.py
1
# SPDX-License-Identifier: GPL-2.0+
2
from packaging.version import Version
1✔
3
from functools import cached_property
1✔
4

5

6
from typing import Type, Any
1✔
7

8

9
from gfModParser import utils
1✔
10

11
from . import attributes
1✔
12
from . import components
1✔
13
from . import expressions
1✔
14
from . import simds
1✔
15
from . import namespaces
1✔
16
from . import procedures
1✔
17
from . import arrays
1✔
18
from . import namelists
1✔
19

20

21
class Properties:
1✔
22
    """
23
    Stores properties of an object
24
    """
25

26
    def __init__(self, properties, *, version: Version) -> None:
1✔
27
        self._raw = properties
1✔
28
        self.version = version
1✔
29
        self._properties: list[Any] = []
1✔
30

31
        self._comp_access = ""
1✔
32
        self._exp_type = None
1✔
33

34
    def _load(self) -> None:
1✔
35
        self._properties = []
1✔
36
        p = utils.bracket_split(self._raw)
1✔
37
        self._properties = p[0]
1✔
38

39
        if isinstance(self._properties[2], str):
1✔
40
            self._comp_access = self._properties[2]
1✔
41
            _ = self._properties.pop(2)
1✔
42
        if self.attributes.is_parameter:
1✔
43
            self._exp_type = self._properties[6]
1✔
44
            _ = self._properties.pop(6)
1✔
45

46
    @property
1✔
47
    def attributes(self) -> attributes.Attributes:
1✔
48
        if not len(self._properties):
1✔
49
            self._load()
1✔
50
        return attributes.Attributes(self._properties[0], version=self.version)
1✔
51

52
    @cached_property
1✔
53
    def components(self) -> components.Components:
1✔
54
        if not len(self._properties):
1✔
55
            self._load()
1✔
56

57
        return components.Components(self._properties[1], version=self.version)
1✔
58

59
    @property
1✔
60
    def component_access(self):
1✔
61
        if not len(self._properties):
1✔
62
            self._load()
1✔
63
        return self._comp_access
1✔
64

65
    @property
1✔
66
    def typespec(self) -> expressions.typespec:
1✔
67
        if not len(self._properties):
1✔
68
            self._load()
1✔
69
        return expressions.typespec(self._properties[2], version=self.version)
1✔
70

71
    @property
1✔
72
    def namespace(self) -> namespaces.namespace:
1✔
73
        if not len(self._properties):
1✔
74
            self._load()
1✔
75
        return namespaces.namespace(self._properties[3], version=self.version)
1✔
76

77
    @property
1✔
78
    def common_symbol(self) -> int:
1✔
79
        if not len(self._properties):
1✔
80
            self._load()
1✔
81
        return int(self._properties[4])
1✔
82

83
    @property
1✔
84
    def formal_argument(self) -> procedures.Arglist:
1✔
85
        """
86
        Symbol references for the procedure arguments
87
        """
88
        if not len(self._properties):
1✔
89
            self._load()
1✔
90
        return procedures.Arglist(self._properties[5], version=self.version)
1✔
91

92
    @property
1✔
93
    def exp_type(self) -> expressions.Expression | None:
1✔
94
        if not len(self._properties):
1✔
95
            self._load()
1✔
96

97
        if self._exp_type is not None:
1✔
98
            return expressions.Expression(self._exp_type, version=self.version)
1✔
99
        return None
×
100

101
    @property
1✔
102
    def array_spec(self) -> arrays.arrayspec:
1✔
103
        if not len(self._properties):
1✔
104
            self._load()
1✔
105
        return arrays.arrayspec(self._properties[6], version=self.version)
1✔
106

107
    @property
1✔
108
    def symbol_reference(self) -> int:
1✔
109
        """
110
        0 if a subroutine, else the symbol reference for a function result
111
        """
112
        if not len(self._properties):
1✔
113
            self._load()
1✔
114
        if not any([i == "CRAY_POINTER" for i in self.attributes.attributes]):
1✔
115
            return int(self._properties[7])
1✔
116
        return -1
×
117

118
    @property
1✔
119
    def cray_pointer_reference(self) -> int:
1✔
120
        if not len(self._properties):
1✔
121
            self._load()
1✔
122
        if any([i == "CRAY_POINTER" for i in self.attributes.attributes]):
1✔
123
            return int(self._properties[7])
1✔
124
        return -1
1✔
125

126
    @property
1✔
127
    def derived(self) -> namespaces.derived_ns:
1✔
128
        if not len(self._properties):
1✔
129
            self._load()
1✔
130
        return namespaces.derived_ns(self._properties[8], version=self.version)
1✔
131

132
    @property
1✔
133
    def actual_argument(self) -> "procedures.Arglist | procedures.actual_arglist":
1✔
134
        if not len(self._properties):
1✔
135
            self._load()
1✔
136
        p = self._properties[9]
1✔
137
        if len(p) > 0 and isinstance(p[0], list):
1✔
138
            return procedures.actual_arglist(p, version=self.version)
1✔
139
        return procedures.Arglist(p, version=self.version)
1✔
140

141
    @property
1✔
142
    def namelist(self) -> namelists.Namelist | None:
1✔
143
        if not len(self._properties):
1✔
144
            self._load()
1✔
145
        if self.attributes.is_namelist:
1✔
146
            return namelists.Namelist(self._properties[10], version=self.version)
1✔
147
        return None
1✔
148

149
    @property
1✔
150
    def intrinsic(self) -> bool:
1✔
151
        if not len(self._properties):
1✔
UNCOV
152
            self._load()
×
153
        return self._properties[11] == 1
1✔
154

155
    @property
1✔
156
    def intrinsic_symbol(self) -> bool:
1✔
157
        if not len(self._properties):
1✔
158
            self._load()
×
159
        if len(self._properties) > 12:
1✔
160
            return self._properties[12] == 1
1✔
UNCOV
161
        return False
×
162

163
    @property
1✔
164
    def hash(self) -> int:
1✔
165
        if not len(self._properties):
1✔
UNCOV
166
            self._load()
×
167
        if len(self._properties) > 13:
1✔
UNCOV
168
            return int(self._properties[13])
×
169
        return -1
1✔
170

171
    @property
1✔
172
    def simd(self) -> simds.simd_dec | None:
1✔
173
        if not len(self._properties):
1✔
UNCOV
174
            self._load()
×
175
        if len(self._properties) >= 14:
1✔
UNCOV
176
            return simds.simd_dec(self._properties[14], version=self.version)
×
177
        return None
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

© 2026 Coveralls, Inc