everysk-lib 1.10.3__cp312-cp312-win_amd64.whl → 1.11.0__cp312-cp312-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,9 @@
1
+ ###############################################################################
2
+ #
3
+ # (C) Copyright 2025 EVERYSK TECHNOLOGIES
4
+ #
5
+ # This is an unpublished work containing confidential and proprietary
6
+ # information of EVERYSK TECHNOLOGIES. Disclosure, use, or reproduction
7
+ # without authorization of EVERYSK TECHNOLOGIES is prohibited.
8
+ #
9
+ ###############################################################################
@@ -0,0 +1,306 @@
1
+ ###############################################################################
2
+ #
3
+ # (C) Copyright 2025 EVERYSK TECHNOLOGIES
4
+ #
5
+ # This is an unpublished work containing confidential and proprietary
6
+ # information of EVERYSK TECHNOLOGIES. Disclosure, use, or reproduction
7
+ # without authorization of EVERYSK TECHNOLOGIES is prohibited.
8
+ #
9
+ ###############################################################################
10
+ from everysk.core.mapping import BaseMapping
11
+ from everysk.core.object import BaseDict, BaseObject
12
+ from everysk.core.unittests import TestCase
13
+
14
+
15
+ class TestClass(BaseMapping):
16
+ __invalid_keys__: frozenset[str] = frozenset({'field6'})
17
+
18
+ field1: int = 10
19
+ field2: int
20
+ field3 = 3.0
21
+ field6: str = 'value'
22
+
23
+
24
+ class BaseMappingTestCase(TestCase):
25
+ def tearDown(self) -> None:
26
+ # Reset TestClass to initial state after each test
27
+ TestClass.field1 = 10
28
+ TestClass.field2 = None
29
+ TestClass.field3 = 3.0
30
+ TestClass._generate_attributes() # noqa: SLF001
31
+
32
+ def test_attributes(self) -> None:
33
+ self.assertSetEqual(TestClass.__attributes__, {'field1', 'field2', 'field3', 'field6'})
34
+
35
+ def test_attributes_inheritance(self) -> None:
36
+ class SubTestClass(TestClass):
37
+ field4: str = 'test'
38
+ field5: float
39
+
40
+ self.assertSetEqual(SubTestClass.__attributes__, {'field1', 'field2', 'field3', 'field4', 'field5', 'field6'})
41
+
42
+ def test_attributes_add(self) -> None:
43
+ class SubTestClass(TestClass):
44
+ field4: str = 'test'
45
+
46
+ SubTestClass.field5 = 5.0 # Adding attribute after class creation
47
+ self.assertSetEqual(SubTestClass.__attributes__, {'field1', 'field2', 'field3', 'field4', 'field5', 'field6'})
48
+
49
+ def test_changed_attributes(self) -> None:
50
+ obj = TestClass()
51
+ obj.field2 = 20
52
+ obj.field1 = 10
53
+ obj.field3 = 5.0
54
+ self.assertDictEqual(obj, {'field1': 10, 'field2': 20, 'field3': 5.0})
55
+
56
+ def test_changed_keys(self) -> None:
57
+ obj = TestClass()
58
+ obj['field2'] = 25
59
+ obj['field1'] = 10
60
+ obj['field3'] = 4.0
61
+ self.assertDictEqual(obj, {'field1': 10, 'field2': 25, 'field3': 4.0})
62
+
63
+ def test_delete_attribute(self) -> None:
64
+ obj = TestClass(field2=30)
65
+ self.assertEqual(obj.field2, 30)
66
+ self.assertEqual(obj['field2'], 30)
67
+ del obj.field2
68
+ with self.assertRaises(AttributeError) as context:
69
+ _ = obj.field2
70
+ self.assertEqual(str(context.exception), "'TestClass' object has no attribute 'field2'.")
71
+ with self.assertRaises(KeyError) as context:
72
+ _ = obj['field2']
73
+ self.assertEqual(str(context.exception), "'field2'")
74
+
75
+ def test_delete_key(self) -> None:
76
+ obj = TestClass(field2=30)
77
+ self.assertEqual(obj.field2, 30)
78
+ self.assertEqual(obj['field2'], 30)
79
+ del obj['field2']
80
+ with self.assertRaises(AttributeError) as context:
81
+ _ = obj.field2
82
+ self.assertEqual(str(context.exception), "'TestClass' object has no attribute 'field2'.")
83
+ with self.assertRaises(KeyError) as context:
84
+ _ = obj['field2']
85
+ self.assertEqual(str(context.exception), "'field2'")
86
+
87
+ def test_equal(self) -> None:
88
+ obj1 = TestClass()
89
+ obj2 = TestClass()
90
+ self.assertDictEqual(obj1, obj2)
91
+
92
+ obj1.field2 = 20
93
+ self.assertNotEqual(obj1, obj2)
94
+
95
+ obj2.field2 = 20
96
+ self.assertDictEqual(obj1, obj2)
97
+
98
+ def test_equal_changed_class_value(self) -> None:
99
+ obj1 = TestClass()
100
+ obj2 = TestClass()
101
+ self.assertDictEqual(obj1, obj2)
102
+
103
+ TestClass.field1 = 15
104
+ self.assertDictEqual(obj1, obj2)
105
+ self.assertEqual(obj1.field1, 10)
106
+ self.assertEqual(obj1['field1'], 10)
107
+ self.assertEqual(obj2.field1, 10)
108
+ self.assertEqual(obj2['field1'], 10)
109
+
110
+ def test_field_type(self) -> None:
111
+ self.assertDictEqual(
112
+ TestClass.__annotations__,
113
+ {'__invalid_keys__': frozenset[str], 'field1': int, 'field2': int, 'field6': str, 'field3': float},
114
+ )
115
+ self.assertEqual(TestClass.__dict__['field1'].field_type, int)
116
+ self.assertEqual(TestClass.__dict__['field2'].field_type, int)
117
+ self.assertEqual(TestClass.__dict__['field3'].field_type, float)
118
+ self.assertEqual(TestClass.__dict__['field6'].field_type, str)
119
+
120
+ def test_field_type_generic_alias(self) -> None:
121
+ class GenericTestClass(BaseMapping):
122
+ field1: list[int] = None
123
+
124
+ self.assertEqual(GenericTestClass.__dict__['field1'].field_type, list)
125
+
126
+ def test_field_type_union(self) -> None:
127
+ class UnionTestClass(BaseMapping):
128
+ field1: int | list[str] | None = None
129
+
130
+ self.assertEqual(UnionTestClass.__dict__['field1'].field_type, int | list)
131
+
132
+ def test_inherited_changed(self) -> None:
133
+ class SubTestClass(TestClass):
134
+ field4: str = 'test'
135
+
136
+ obj = SubTestClass()
137
+ obj2 = SubTestClass()
138
+
139
+ obj.field2 = 20
140
+ obj.field4 = 'changed'
141
+ self.assertDictEqual(obj, {'field1': 10, 'field2': 20, 'field3': 3.0, 'field4': 'changed'})
142
+ self.assertDictEqual(obj2, {'field1': 10, 'field2': None, 'field3': 3.0, 'field4': 'test'})
143
+
144
+ def test_inherited_attribute(self) -> None:
145
+ class SubTestClass(TestClass):
146
+ pass
147
+
148
+ obj = SubTestClass()
149
+ self.assertEqual(obj.field1, 10)
150
+ self.assertEqual(obj.field2, None)
151
+ self.assertEqual(obj.field3, 3.0)
152
+ self.assertEqual(obj.field6, 'value')
153
+ # Fields that are keys don't have inherited values
154
+ TestClass.field1 = 20
155
+ self.assertEqual(obj.field1, 10)
156
+ self.assertEqual(obj['field1'], 10)
157
+ # Fields that are attributes only have inherited values
158
+ TestClass.field6 = 'new_value'
159
+ self.assertEqual(obj.field6, 'new_value')
160
+
161
+ def test_init(self) -> None:
162
+ obj = TestClass(field2=25, field3=4.5)
163
+ self.assertEqual(obj.field1, 10)
164
+ self.assertEqual(obj['field1'], 10)
165
+ self.assertEqual(obj.field2, 25)
166
+ self.assertEqual(obj['field2'], 25)
167
+ self.assertEqual(obj.field3, 4.5)
168
+ self.assertEqual(obj['field3'], 4.5)
169
+ self.assertDictEqual(obj, {'field1': 10, 'field2': 25, 'field3': 4.5})
170
+
171
+ def test_init_new_attribute(self) -> None:
172
+ obj = BaseMapping(key='value')
173
+ self.assertEqual(obj.key, 'value')
174
+ self.assertEqual(obj['key'], 'value')
175
+
176
+ def test_isinstance(self) -> None:
177
+ self.assertIsInstance(BaseMapping(), dict)
178
+ self.assertIsInstance(BaseMapping(), BaseDict)
179
+ self.assertIsInstance(BaseMapping(), BaseMapping)
180
+ self.assertNotIsInstance(BaseDict(), dict)
181
+ self.assertIsInstance(BaseDict(), BaseDict)
182
+ self.assertNotIsInstance(BaseDict(), BaseMapping)
183
+
184
+ def test_key(self) -> None:
185
+ obj = TestClass()
186
+ self.assertEqual(obj['field1'], 10)
187
+ self.assertEqual(obj['field2'], None)
188
+ self.assertEqual(obj['field3'], 3.0)
189
+
190
+ def test_key_changed(self) -> None:
191
+ obj = TestClass()
192
+ obj['field2'] = 30
193
+ self.assertEqual(obj.field2, 30)
194
+ self.assertEqual(obj['field2'], 30)
195
+
196
+ def test_key_invalid(self) -> None:
197
+ class SubTestClass(TestClass):
198
+ __invalid_keys__ = frozenset({'field3'})
199
+
200
+ obj = SubTestClass()
201
+ with self.assertRaises(KeyError):
202
+ _ = obj['field3']
203
+
204
+ self.assertEqual(obj.field3, 3.0)
205
+ obj.field3 = 5.0
206
+ self.assertEqual(obj.field3, 5.0)
207
+ with self.assertRaises(KeyError):
208
+ _ = obj['field3']
209
+
210
+ del obj.field3
211
+ with self.assertRaises(AttributeError):
212
+ _ = obj.field3
213
+
214
+ with self.assertRaises(KeyError):
215
+ _ = obj['field3']
216
+
217
+ def test_new_attribute(self) -> None:
218
+ obj = TestClass()
219
+ obj.new = 'new_value'
220
+ self.assertEqual(obj.new, 'new_value')
221
+ self.assertEqual(obj['new'], 'new_value')
222
+
223
+ def test_value_class(self) -> None:
224
+ obj = TestClass()
225
+ self.assertEqual(TestClass.field1, 10)
226
+ self.assertEqual(obj.field1, 10)
227
+ self.assertEqual(obj['field1'], 10)
228
+ TestClass.field1 = 15
229
+ self.assertEqual(TestClass.field1, 15)
230
+ # Values that are fields don't change in the instance only in the class
231
+ self.assertEqual(obj.field1, 10)
232
+ self.assertEqual(obj['field1'], 10)
233
+
234
+ def test_value_instance(self) -> None:
235
+ obj = TestClass()
236
+ self.assertEqual(TestClass.field1, 10)
237
+ self.assertEqual(obj.field1, 10)
238
+ self.assertEqual(obj['field1'], 10)
239
+ obj.field1 = 20
240
+ self.assertEqual(TestClass.field1, 10)
241
+ self.assertEqual(obj.field1, 20)
242
+ self.assertEqual(obj['field1'], 20)
243
+
244
+ def test_value_instances(self) -> None:
245
+ obj1 = TestClass()
246
+ obj2 = TestClass()
247
+ self.assertEqual(TestClass.field1, 10)
248
+ self.assertEqual(obj1.field1, 10)
249
+ self.assertEqual(obj1['field1'], 10)
250
+ self.assertEqual(obj2.field1, 10)
251
+ self.assertEqual(obj2['field1'], 10)
252
+
253
+ obj1.field1 = 20
254
+ self.assertEqual(TestClass.field1, 10)
255
+ self.assertEqual(obj1.field1, 20)
256
+ self.assertEqual(obj1['field1'], 20)
257
+ self.assertEqual(obj2.field1, 10)
258
+ self.assertEqual(obj2['field1'], 10)
259
+
260
+ def test_to_dict_defaults(self) -> None:
261
+ obj = TestClass()
262
+ expected_dict = {'field1': 10, 'field2': None, 'field3': 3.0}
263
+ self.assertDictEqual(obj.to_dict(), expected_dict)
264
+
265
+ def test_to_dict_defaults_sub_object(self) -> None:
266
+ class SubTestClass(TestClass):
267
+ field4: str = 'default'
268
+
269
+ obj = SubTestClass()
270
+ expected_dict = {'field1': 10, 'field2': None, 'field3': 3.0, 'field4': 'default'}
271
+ self.assertDictEqual(obj.to_dict(), expected_dict)
272
+
273
+ def test_to_dict_add_class_path(self) -> None:
274
+ obj = TestClass()
275
+ expected_dict = {
276
+ 'field1': 10,
277
+ 'field2': None,
278
+ 'field3': 3.0,
279
+ '__class_path__': obj.get_full_dotted_class_path(),
280
+ }
281
+ self.assertDictEqual(obj.to_dict(add_class_path=True), expected_dict)
282
+
283
+ def test_to_dict_exclude_keys(self) -> None:
284
+ class SubTestClass(TestClass):
285
+ def _to_dict_excluded_keys(self) -> set[str]:
286
+ return {'field2', 'field3'}
287
+
288
+ obj = SubTestClass()
289
+ expected_dict = {'field1': 10}
290
+ self.assertDictEqual(obj.to_dict(), expected_dict)
291
+
292
+ def test_to_dict_recursive(self) -> None:
293
+ class SubTestClass(BaseMapping):
294
+ field1: BaseMapping = BaseMapping(field1=10)
295
+ field2: BaseDict = BaseDict(key='value')
296
+ field3: BaseObject = BaseObject(attr='value')
297
+
298
+ obj = SubTestClass()
299
+ expected_dict = {'field1': {'field1': 10}, 'field2': {'key': 'value'}, 'field3': {'attr': 'value'}}
300
+ self.assertDictEqual(obj.to_dict(recursion=True), expected_dict)
301
+
302
+ def test_to_native(self) -> None:
303
+ obj = TestClass()
304
+ result = obj.to_native()
305
+ expected_dict = {'field1': 10, 'field2': None, 'field3': 3.0}
306
+ self.assertDictEqual(result, expected_dict)