Skip to content

Commit 2d248ec

Browse files
committed
#16 Implement transpilation traces.
1 parent 804db42 commit 2d248ec

File tree

4 files changed

+83
-21
lines changed

4 files changed

+83
-21
lines changed
+37-13
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,54 @@
1-
from pyecore.ecore import EAttribute, EObject, EPackage, EReference, EString, MetaEClass
1+
from io import IOBase, BytesIO
2+
3+
from pyecore.ecore import EAttribute, EObject, EReference, EString, MetaEClass
4+
from pyecore.resources import ResourceSet, URI
5+
from pyecore.resources.json import JsonResource as BaseJsonResource
26

37
from pylasu.StrumentaLanguageSupport import Result, Issue
48

5-
TRANSPILATION_METAMODEL = EPackage(
6-
name="StrumentaLanguageSupportTranspilation", nsURI="https://strumenta.com/kolasu/transpilation/v1")
9+
nsURI = "https://strumenta.com/kolasu/transpilation/v1"
10+
name = "StrumentaLanguageSupportTranspilation"
11+
12+
13+
class JsonResource(BaseJsonResource):
14+
15+
def open_out_stream(self, other=None):
16+
if isinstance(other, IOBase):
17+
return other
18+
else:
19+
return super().open_out_stream(other)
720

821

922
class TranspilationTrace(EObject, metaclass=MetaEClass):
10-
original_code = EAttribute(name="originalCode", eType=EString)
11-
source_result = EReference(name="sourceResult", containment=True, eType=Result)
12-
target_result = EReference(name="targetResult", containment=True, eType=Result)
13-
generated_code = EAttribute(name="generatedCode", eType=EString)
23+
# Note: we use camelCase here because Pyecore's JSON serialization doesn't handle having different names for
24+
# Python attributes and their corresponding Ecore structural features.
25+
originalCode = EAttribute(eType=EString)
26+
sourceResult = EReference(containment=True, eType=Result)
27+
targetResult = EReference(containment=True, eType=Result)
28+
generatedCode = EAttribute(eType=EString)
1429
issues = EReference(containment=True, eType=Issue, upper=-1)
1530

1631
def __init__(self, *, original_code=None, source_result=None, target_result=None, generated_code=None, issues=None):
1732
super().__init__()
1833
if original_code is not None:
19-
self.original_code = original_code
34+
self.originalCode = original_code
2035
if source_result is not None:
21-
self.source_result = source_result
36+
self.sourceResult = source_result
2237
if target_result is not None:
23-
self.target_result = target_result
38+
self.targetResult = target_result
2439
if generated_code is not None:
25-
self.generated_code = generated_code
40+
self.generatedCode = generated_code
2641
if issues:
2742
self.issues.extend(issues)
2843

29-
30-
TRANSPILATION_METAMODEL.eContents.append(TranspilationTrace)
44+
def save_as_json(self, name, *packages):
45+
rset = ResourceSet()
46+
rset.resource_factory['json'] = JsonResource
47+
resource = rset.create_resource(URI(name))
48+
for pkg in packages:
49+
package_resource = rset.create_resource(URI(pkg.nsURI))
50+
package_resource.contents.add(pkg)
51+
resource.contents.append(self)
52+
with BytesIO() as out:
53+
resource.save(out)
54+
return out.getvalue().decode('utf-8')

setup.cfg

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
1+
[metadata]
2+
name = Pylasu
3+
version: 0.2.0
4+
15
[coverage:run]
26
branch = True
37

48
[coverage:report]
59
show_missing = True
6-
skip_covered = True
10+
skip_covered = True
11+
12+
[options.extras_require]
13+
ecore =
14+
pyecore

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
setup(
33
name='pylasu',
44
packages=find_packages(exclude=["tests"]),
5-
version='0.1.0',
5+
version='0.2.0',
66
description='Pylasu',
77
author='Strumenta S.R.L.',
88
license='Apache License V2',

tests/test_transpilation_trace.py

+36-6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import json
12
import unittest
23

34
import pylasu.StrumentaLanguageSupport as starlasu_metamodel
@@ -6,6 +7,10 @@
67
from pyecore.ecore import EString, EAttribute, EInt
78

89

10+
nsURI = "http://mypackage.com"
11+
name = "StrumentaLanguageSupportTranspilationTest"
12+
13+
914
class ANode(ASTNode):
1015
name = EAttribute(eType=EString)
1116
value = EAttribute(eType=EInt)
@@ -30,10 +35,35 @@ def test_serialize_transpilation_issue(self):
3035
message="some issue",
3136
severity=starlasu_metamodel.IssueSeverity.getEEnumLiteral("WARNING"))]
3237
)
33-
self.assertEqual("a:1", tt.original_code)
34-
self.assertEqual("b:2", tt.generated_code)
38+
self.assertEqual("a:1", tt.originalCode)
39+
self.assertEqual("b:2", tt.generatedCode)
3540
self.assertEqual("some issue", tt.issues[0].message)
36-
self.assertEqual("a", tt.source_result.root.name)
37-
self.assertEqual(1, tt.source_result.root.value)
38-
self.assertEqual("b", tt.target_result.root.name)
39-
self.assertEqual(2, tt.target_result.root.value)
41+
self.assertEqual("a", tt.sourceResult.root.name)
42+
self.assertEqual(1, tt.sourceResult.root.value)
43+
self.assertEqual("b", tt.targetResult.root.name)
44+
self.assertEqual(2, tt.targetResult.root.value)
45+
46+
expected = """{
47+
"eClass" : "https://strumenta.com/kolasu/transpilation/v1#//TranspilationTrace",
48+
"originalCode" : "a:1",
49+
"sourceResult" : {
50+
"root" : {
51+
"eClass" : "http://mypackage.com#//ANode",
52+
"name" : "a",
53+
"value" : 1
54+
}
55+
},
56+
"targetResult" : {
57+
"root" : {
58+
"eClass" : "http://mypackage.com#//ANode",
59+
"name" : "b",
60+
"value" : 2
61+
}
62+
},
63+
"generatedCode" : "b:2",
64+
"issues" : [ {
65+
"message" : "some issue",
66+
"severity" : "WARNING"
67+
} ]
68+
}"""
69+
self.assertEqual(json.loads(expected), json.loads(tt.save_as_json("foo.json")))

0 commit comments

Comments
 (0)