Skip to content

Commit 0ef584a

Browse files
Merge pull request #4 from Cloudrisk/develop
Develop
2 parents b0d5f12 + 90fb3fd commit 0ef584a

File tree

9 files changed

+64
-24
lines changed

9 files changed

+64
-24
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ __pycache__
2525
build
2626
src/rune.runtime.egg-info
2727
rune.runtime-*.whl
28-
src/rune/runtime/version.py
28+
src/rune/runtime/version.py
29+
/.coverage

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ dependencies = [
1111
]
1212
optional-dependencies.dev = [
1313
"pytest",
14+
"pytest-cov",
1415
"pytest-mock"
1516
]
1617
description = "rune-runtime: the Rune DSL runtime for Python"

src/rune/runtime/metadata.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
'''Classes representing annotated basic Rune types'''
2-
from enum import Enum
2+
import uuid
3+
import datetime
34
import importlib
5+
from enum import Enum
46
from functools import partial, lru_cache
5-
import uuid
67
from decimal import Decimal
78
from typing import Any, Never, get_args
8-
import datetime
99
from typing_extensions import Self, Tuple
1010
from pydantic import (PlainSerializer, PlainValidator, WrapValidator,
1111
WrapSerializer)
12+
from pydantic_core import PydanticCustomError
1213
# from rune.runtime.object_registry import get_object
1314

1415
META_CONTAINER = '__rune_metadata'
@@ -365,6 +366,11 @@ def deserialize(cls, obj, allowed_meta: set[str]):
365366
if isinstance(obj, Reference):
366367
return obj
367368

369+
if not isinstance(obj, dict):
370+
raise PydanticCustomError('Input Validation Error',
371+
'Expected either {my_type} or dict but '
372+
'got {type}.',
373+
{'type': type(obj), 'my_type': cls})
368374
metadata = {k: obj[k] for k in obj.keys() if k.startswith('@')}
369375

370376
# References deserialization treatment

test/cdm/test_validation.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
'''Full attribute validation - pydantic and constraints'''
2+
import pytest
3+
from pydantic import ValidationError
4+
try:
5+
# pylint: disable=unused-import
6+
# type: ignore
7+
from cdm.base.math.NonNegativeQuantity import NonNegativeQuantity
8+
from cdm.base.math.UnitType import UnitType
9+
NO_SER_TEST_MOD = False
10+
except ImportError:
11+
NO_SER_TEST_MOD = True
12+
13+
14+
@pytest.mark.skipif(NO_SER_TEST_MOD, reason='CDM package not found')
15+
def test_bad_attrib_validation():
16+
'''Invalid attribute assigned'''
17+
unit = UnitType(currency='EUR')
18+
mq = NonNegativeQuantity(value=10, unit=unit)
19+
mq.frequency = 'Blah'
20+
with pytest.raises(ValidationError):
21+
mq.validate_model()
22+
23+
# EOF

test/serializer-round-trip/test_enumtype.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,19 @@
1515
@pytest.mark.skipif(NO_SER_TEST_MOD, reason='Generated test package not found')
1616
def test_enum_types_single():
1717
'''no doc'''
18+
# import serialization.test.passing.enumtypes.Root
19+
# import serialization.test.passing.enumtypes.EnumSingle
20+
# import serialization.test.passing.enumtypes.EnumType
21+
22+
# root = serialization.test.passing.enumtypes.Root.Root(
23+
# enumSingle=serialization.test.passing.enumtypes.EnumSingle.EnumSingle(
24+
# enumType=serialization.test.passing.enumtypes.EnumType.EnumType.A
25+
# ))
26+
# resp_json = root.rune_serialize()
1827
json_str = '''
1928
{
2029
"@model": "serialization",
21-
"@type": "serialization.test.enumtypes.Root",
30+
"@type": "serialization.test.passing.enumtypes.Root",
2231
"@version": "0.0.0",
2332
"enumSingle": {
2433
"enumType": "A"
@@ -36,7 +45,7 @@ def test_enum_types_list():
3645
json_str = '''
3746
{
3847
"@model": "serialization",
39-
"@type": "serialization.test.enumtypes.Root",
48+
"@type": "serialization.test.passing.enumtypes.Root",
4049
"@version": "0.0.0",
4150
"enumList": {
4251
"enumType": ["A", "B", "C", "B"]

test/serializer-round-trip/test_extension.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def test_base_type():
1818
'''no doc'''
1919
json_str = '''{
2020
"@model": "serialization",
21-
"@type": "serialization.test.extension.Root",
21+
"@type": "serialization.test.passing.extension.Root",
2222
"@version": "0.0.0",
2323
"typeA": {
2424
"fieldA": "foo"
@@ -34,12 +34,12 @@ def test_extended_type_concrete():
3434
'''no doc'''
3535
json_str = '''{
3636
"@model": "serialization",
37-
"@type": "serialization.test.extension.Root",
37+
"@type": "serialization.test.passing.extension.Root",
3838
"@version": "0.0.0",
3939
"typeB": {
4040
"fieldA": "foo",
4141
"fieldB": "foo",
42-
"@type": "serialization.test.extension.B"
42+
"@type": "serialization.test.passing.extension.B"
4343
}
4444
}'''
4545
model = BaseDataClass.rune_deserialize(json_str)
@@ -55,15 +55,15 @@ def test_extended_type_polymorphic():
5555
'''no doc'''
5656
json_str = '''{
5757
"@model": "serialization",
58-
"@type": "serialization.test.extension.Root",
58+
"@type": "serialization.test.passing.extension.Root",
5959
"@version": "0.0.0",
6060
"typeA": {
6161
"fieldA": "bar",
6262
"fieldB": "foo",
63-
"@type": "serialization.test.extension.B"
63+
"@type": "serialization.test.passing.extension.B"
6464
}
6565
}'''
66-
# import serialization.test.extension.Root
66+
# import serialization.test.passing.extension.Root
6767
model = BaseDataClass.rune_deserialize(json_str)
6868
resp_json = model.rune_serialize()
6969
assert json.loads(resp_json) == json.loads(json_str)
@@ -72,14 +72,14 @@ def test_extended_type_polymorphic():
7272
@pytest.mark.skipif(NO_SER_TEST_MOD, reason='Generated test package not found')
7373
def test_at_type():
7474
'''no doc'''
75-
from serialization.test.extension.B import B
75+
from serialization.test.passing.extension.B import B
7676
json_str = '''
7777
{
78-
"@type": "serialization.test.extension.Root",
78+
"@type": "serialization.test.passing.extension.Root",
7979
"typeA" : {
8080
"fieldA" : "bar",
8181
"fieldB" : "foo",
82-
"@type" : "serialization.test.extension.B"
82+
"@type" : "serialization.test.passing.extension.B"
8383
}
8484
}
8585
'''
@@ -90,7 +90,7 @@ def test_at_type():
9090
@pytest.mark.skipif(NO_SER_TEST_MOD, reason='Generated test package not found')
9191
def test_temp():
9292
'''no doc'''
93-
from serialization.test.metakey.Root import Root
93+
from serialization.test.passing.metakey.Root import Root
9494
json_str = '''
9595
{
9696
"nodeRef" : {
@@ -112,7 +112,7 @@ def test_temp():
112112
@pytest.mark.skipif(NO_SER_TEST_MOD, reason='Generated test package not found')
113113
def test_enums():
114114
'''no doc'''
115-
from serialization.test.enumtypes.Root import Root
115+
from serialization.test.passing.enumtypes.Root import Root
116116
json_str = '{"enumSingle":{"enumType":"A"}}'
117117
json_dict = json.loads(json_str)
118118
model1 = Root.model_validate(json_dict)

test/serializer-round-trip/test_metakey.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ def test_generated_attribute_ref():
172172
'''attribute-ref.json'''
173173
json_str = '''{
174174
"@model": "serialization",
175-
"@type": "serialization.test.metakey.Root",
175+
"@type": "serialization.test.passing.metakey.Root",
176176
"@version": "0.0.0",
177177
"attributeRef": {
178178
"dateField": {
@@ -198,7 +198,7 @@ def test_generated_node_ref():
198198
'''attribute-ref.json'''
199199
json_str = '''{
200200
"@model": "serialization",
201-
"@type": "serialization.test.metakey.Root",
201+
"@type": "serialization.test.passing.metakey.Root",
202202
"@version": "0.0.0",
203203
"nodeRef": {
204204
"typeA": {
@@ -224,7 +224,7 @@ def test_generated_dangling_node_ref():
224224
'''attribute-ref.json'''
225225
json_str = '''{
226226
"@model": "serialization",
227-
"@type": "serialization.test.metakey.Root",
227+
"@type": "serialization.test.passing.metakey.Root",
228228
"@version": "0.0.0",
229229
"nodeRef": {
230230
"aReference": {
@@ -243,7 +243,7 @@ def test_generated_dangling_attribute_ref():
243243
'''attribute-ref.json'''
244244
json_str = '''{
245245
"@model": "serialization",
246-
"@type": "serialization.test.metakey.Root",
246+
"@type": "serialization.test.passing.metakey.Root",
247247
"@version": "0.0.0",
248248
"attributeRef": {
249249
"dateReference": {

test/serializer-round-trip/test_metalocation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def test_address():
1818
'''no doc'''
1919
json_str = ''' {
2020
"@model": "serialization",
21-
"@type": "serialization.test.metalocation.Root",
21+
"@type": "serialization.test.passing.metalocation.Root",
2222
"@version": "0.0.0",
2323
"typeA": {
2424
"b": {

test/serializer-round-trip/test_metascheme.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def test_enum_single():
1818
json_str = '''
1919
{
2020
"@model": "serialization",
21-
"@type": "serialization.test.metascheme.Root",
21+
"@type": "serialization.test.passing.metascheme.Root",
2222
"@version": "0.0.0",
2323
"enumType": {
2424
"@data": "A",
@@ -37,7 +37,7 @@ def test_enum_list():
3737
json_str = '''
3838
{
3939
"@model": "serialization",
40-
"@type": "serialization.test.metascheme.Root",
40+
"@type": "serialization.test.passing.metascheme.Root",
4141
"@version": "0.0.0",
4242
"enumTypeList": [{
4343
"@data": "A",

0 commit comments

Comments
 (0)