Skip to content

Commit 323122e

Browse files
authored
Merge pull request #327 from Point72/pit/define_struct
Deprecate defineStruct and defineNestedStruct in favor of define_struct and define_nested_struct
2 parents c6fd90e + 71fbf26 commit 323122e

File tree

9 files changed

+53
-27
lines changed

9 files changed

+53
-27
lines changed

conda/dev-environment-unix.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ dependencies:
1111
- codespell>=2.2.6,<2.3
1212
- compilers
1313
- cyrus-sasl
14+
- deprecated
1415
- exprtk
1516
- flex
1617
- graphviz

conda/dev-environment-win.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ dependencies:
1010
- codespell>=2.2.6,<2.3
1111
- compilers
1212
- cyrus-sasl
13+
- deprecated
1314
- exprtk
1415
- graphviz
1516
- gtest

csp/adapters/db.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,9 +267,9 @@ def schema_struct(self):
267267
table = db.Table(self._table_name, db_metadata, autoload_with=self._connection)
268268
struct_metadata = {col: col_obj.type.python_type for col, col_obj in table.columns.items()}
269269

270-
from csp.impl.struct import defineStruct
270+
from csp.impl.struct import define_struct
271271

272-
typ = defineStruct(name, struct_metadata)
272+
typ = define_struct(name, struct_metadata)
273273
globals()[name] = typ
274274
return globals()[name]
275275

csp/build/csp_autogen.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ class Derived(Test):
498498
flt: float
499499

500500

501-
# Test2 = csp.impl.struct.defineStruct( 'Test2', { 'A' + str(i) : bool for i in range(25 )})
501+
# Test2 = csp.impl.struct.define_struct( 'Test2', { 'A' + str(i) : bool for i in range(25 )})
502502

503503
if __name__ == "__main__":
504504
parser = argparse.ArgumentParser()

csp/impl/pandas_accessor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import csp
99
from csp import ts
1010
from csp.impl.pandas_ext_type import TsDtype, is_csp_type
11-
from csp.impl.struct import defineNestedStruct
11+
from csp.impl.struct import define_nested_struct
1212
from csp.impl.wiring.edge import Edge
1313

1414
T = TypeVar("T")
@@ -615,7 +615,7 @@ def collect(self, columns=None, struct_type=None, delim=" "):
615615
datatree[parts[-1]] = self._obj[col]
616616

617617
if not struct_type:
618-
struct_type = defineNestedStruct("_C", metadata, defaults)
618+
struct_type = define_nested_struct("_C", metadata, defaults)
619619

620620
if not data:
621621
return csp.null_ts(struct_type)

csp/impl/struct.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import ruamel.yaml
33
import typing
44
from copy import deepcopy
5+
from deprecated import deprecated
56

67
import csp
78
from csp.impl.__csptypesimpl import _csptypesimpl
@@ -226,7 +227,7 @@ def __dir__(self):
226227
return self.__full_metadata_typed__.keys()
227228

228229

229-
def defineStruct(name, metadata: dict, defaults: dict = {}, base=Struct):
230+
def define_struct(name, metadata: dict, defaults: dict = {}, base=Struct):
230231
"""Helper method to dynamically create struct types"""
231232

232233
dct = deepcopy(defaults)
@@ -235,18 +236,28 @@ def defineStruct(name, metadata: dict, defaults: dict = {}, base=Struct):
235236
return clazz
236237

237238

238-
def defineNestedStruct(name, metadata: dict, defaults: dict = {}, base=Struct):
239+
def define_nested_struct(name, metadata: dict, defaults: dict = {}, base=Struct):
239240
"""Helper method to dynamically create nested struct types.
240241
metadata and defaults can be a nested dictionaries"""
241242
metadata = deepcopy(metadata)
242243
defaults = deepcopy(defaults)
243244
child_structs = {
244-
field: defineNestedStruct(f"{name}_{field}", submeta, defaults.get(field, {}))
245+
field: define_nested_struct(f"{name}_{field}", submeta, defaults.get(field, {}))
245246
for field, submeta in metadata.items()
246247
if isinstance(submeta, dict)
247248
}
248249
for fld, struct in child_structs.items():
249250
if fld in defaults:
250251
defaults[fld] = struct()
251252
metadata.update(child_structs)
252-
return defineStruct(name, metadata, defaults, base)
253+
return define_struct(name, metadata, defaults, base)
254+
255+
256+
@deprecated(version="0.0.6", reason="Replaced by define_struct")
257+
def defineStruct(name, metadata: dict, defaults: dict = {}, base=Struct):
258+
return define_struct(name, metadata, defaults, base)
259+
260+
261+
@deprecated(version="0.0.6", reason="Replaced by define_nested_struct")
262+
def defineNestedStruct(name, metadata: dict, defaults: dict = {}, base=Struct):
263+
return define_nested_struct(name, metadata, defaults, base)

csp/tests/impl/test_struct.py

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from datetime import date, datetime, time, timedelta
88

99
import csp
10-
from csp.impl.struct import defineStruct
10+
from csp.impl.struct import define_nested_struct, define_struct, defineNestedStruct, defineStruct
1111
from csp.impl.types.typing_utils import FastList
1212

1313

@@ -761,9 +761,7 @@ def test_update(self):
761761
self.assertEqual(dest, DerivedPartialNative(l=[2, 3, 4], f=3.14, b=False, i=5, s="bar"))
762762

763763
def test_multibyte_mask(self):
764-
from csp.impl.struct import defineStruct
765-
766-
BigStruct = defineStruct("BigStruct", {k: float for k in "abcdefghijklmnopqrdtuvwxyz"})
764+
BigStruct = define_struct("BigStruct", {k: float for k in "abcdefghijklmnopqrdtuvwxyz"})
767765

768766
s = BigStruct()
769767
for key in BigStruct.metadata().keys():
@@ -1062,9 +1060,18 @@ def graph2():
10621060
for _ in range(100):
10631061
csp.run(graph2, starttime=datetime(2020, 1, 1), endtime=timedelta(seconds=1000))
10641062

1065-
def test_defineNestedStruct(self):
1066-
from csp.impl.struct import defineNestedStruct
1063+
def test_deprecated_defineStruct(self):
1064+
metadata = {
1065+
"a": float,
1066+
"b": int,
1067+
}
1068+
defaults = {"a": 0.0, "b": 1}
1069+
TestStruct = define_struct("TestStruct", metadata, defaults)
1070+
TestStruct2 = defineStruct("TestStruct", metadata, defaults)
1071+
self.assertEqual(TestStruct.metadata(), TestStruct2.metadata())
1072+
self.assertEqual(TestStruct.__defaults__, TestStruct2.__defaults__)
10671073

1074+
def test_define_nested_struct(self):
10681075
metadata = {
10691076
"a": float,
10701077
"b": int,
@@ -1084,7 +1091,7 @@ def test_defineNestedStruct(self):
10841091
},
10851092
"d": {"s": object, "t": [object, True]},
10861093
}
1087-
TestStruct = defineNestedStruct("TestStruct", metadata)
1094+
TestStruct = define_nested_struct("TestStruct", metadata)
10881095
self.assertEqual(TestStruct.__name__, "TestStruct")
10891096
self.assertEqual(list(TestStruct.metadata().keys()), list(normalized_metadata.keys()))
10901097
self.assertEqual(TestStruct.metadata()["a"], normalized_metadata["a"])
@@ -1099,20 +1106,26 @@ def test_defineNestedStruct(self):
10991106
self.assertEqual(d.metadata(), normalized_metadata["d"])
11001107

11011108
defaults = {"a": 0.0, "c": {"y": []}, "d": {}}
1102-
TestStruct2 = defineNestedStruct("TestStruct2", metadata, defaults)
1109+
TestStruct2 = define_nested_struct("TestStruct2", metadata, defaults)
11031110
s = TestStruct2()
11041111
self.assertEqual(s.a, 0.0)
11051112
self.assertEqual(s.c, s.metadata()["c"]())
11061113
self.assertEqual(s.c.y, [])
11071114
self.assertEqual(s.d, s.metadata()["d"]())
11081115

1109-
def test_all_fields_set(self):
1110-
from csp.impl.struct import defineStruct
1116+
# Make sure deprecated function still works without raising
1117+
TestStruct3 = defineNestedStruct("TestStruct3", metadata, defaults)
1118+
s = TestStruct3()
1119+
self.assertEqual(s.a, 0.0)
1120+
self.assertEqual(s.c, s.metadata()["c"]())
1121+
self.assertEqual(s.c.y, [])
1122+
self.assertEqual(s.d, s.metadata()["d"]())
11111123

1124+
def test_all_fields_set(self):
11121125
types = [int, bool, list, str]
11131126
for num_fields in range(1, 25):
11141127
meta = {chr(ord("a") + x): types[x % len(types)] for x in range(num_fields)}
1115-
stype = defineStruct("foo", meta)
1128+
stype = define_struct("foo", meta)
11161129
s = stype()
11171130
self.assertFalse(s.all_fields_set())
11181131
keys = list(meta.keys())
@@ -1125,7 +1138,7 @@ def test_all_fields_set(self):
11251138

11261139
# Test derived structs
11271140
meta2 = {k + "2": t for k, t in meta.items()}
1128-
stype2 = defineStruct("foo", meta2, base=stype)
1141+
stype2 = define_struct("foo", meta2, base=stype)
11291142
s2 = stype2()
11301143
self.assertFalse(s2.all_fields_set())
11311144
keys = list(stype2.metadata().keys())
@@ -1160,12 +1173,10 @@ def test_struct_pickle(self):
11601173
self.assertNotEqual(id(foo), id(foo_unpickled))
11611174

11621175
def test_struct_type_alloc(self):
1163-
from csp.impl.struct import defineStruct
1164-
11651176
for i in range(1000):
11661177
name = f"struct_{i}"
11671178
fieldname = f"field{i}"
1168-
S = defineStruct(name, {fieldname: int})
1179+
S = define_struct(name, {fieldname: int})
11691180
s = S()
11701181
setattr(s, fieldname, i)
11711182
ts = getattr(csp.const(s), fieldname)
@@ -1352,7 +1363,7 @@ class Outer(csp.Struct):
13521363

13531364
all = []
13541365
for i in range(10000):
1355-
sType = defineStruct("foo", {"a": dict})
1366+
sType = define_struct("foo", {"a": dict})
13561367
all.append(Outer(s=sType(a={"foo": "bar"})))
13571368
repr(all)
13581369
all = all[:100]

csp/tests/test_baselib.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import csp
1111
from csp import ts
1212
from csp.baselib import _convert_ts_object_for_print
13-
from csp.impl.struct import defineStruct
13+
from csp.impl.struct import define_struct
1414

1515

1616
class TestBaselib(unittest.TestCase):
@@ -1074,7 +1074,7 @@ def graph():
10741074

10751075
# test log dominated graph (proper thread waiting/joining)
10761076
fields = 1000
1077-
LargeStruct = defineStruct("LargeStruct", {f"{i}": int for i in range(fields)}) # struct with 1000 int fields
1077+
LargeStruct = define_struct("LargeStruct", {f"{i}": int for i in range(fields)}) # struct with 1000 int fields
10781078
structs = []
10791079
for i in range(60):
10801080
struct = LargeStruct()

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
[build-system]
22
requires = [
33
"cmake",
4+
"deprecated", # Because used in csp.impl.struct, which is used in autogen
45
"oldest-supported-numpy",
56
"pyarrow>=7.0.0",
67
"ruamel.yaml",
@@ -19,6 +20,7 @@ requires-python = ">=3.8"
1920

2021
dependencies = [
2122
"backports.zoneinfo; python_version<'3.9'",
23+
"deprecated",
2224
"numpy<2",
2325
"packaging",
2426
"pandas",

0 commit comments

Comments
 (0)