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

rjfarmer / gfModParser / 18605112114

17 Oct 2025 09:18PM UTC coverage: 88.291% (+0.09%) from 88.199%
18605112114

push

github

rjfarmer
More typing

137 of 146 new or added lines in 15 files covered. (93.84%)

1 existing line in 1 file now uncovered.

1018 of 1153 relevant lines covered (88.29%)

0.88 hits per line

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

82.09
/gfModParser/modules/properties.py
1
# SPDX-License-Identifier: GPL-2.0+
2
from packaging.version import Version
1✔
3
from functools import cache
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
    @property
1✔
53
    @cache
1✔
54
    def components(self) -> components.Components:
1✔
55
        if not len(self._properties):
1✔
56
            self._load()
1✔
57

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

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

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

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

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

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

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

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

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

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

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

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

133
    @property
1✔
134
    def actual_argument(self) -> procedures.Arglist:
1✔
NEW
135
        if not len(self._properties):
×
136
            self._load()
×
137
        return procedures.Arglist(self._properties[9], version=self.version)
×
138

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

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

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

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

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