Skip to content

Commit b50a7a1

Browse files
committed
#16 Export transpilation traces
1 parent daa9c84 commit b50a7a1

5 files changed

+28
-14
lines changed

pylasu/emf/metamodel_builder.py

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ def provide_class(self, cls: type):
4040
eclass.eClass.ePackage = self.package
4141
return eclass
4242

43+
def generate(self):
44+
return self.package
45+
4346

4447
def getannotations(cls):
4548
import inspect

pylasu/emf/model.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ def find_eclass_in_resource(cls: type, resource: Resource):
1616
def find_eclass(self: Resource, cls: type):
1717
eclass = find_eclass_in_resource(cls, self)
1818
if not eclass:
19-
for r in (self.resource_set.resources if self.resource_set else []):
20-
if r != self:
21-
eclass = find_eclass_in_resource(cls, r)
19+
for uri in (self.resource_set.resources if self.resource_set else {}):
20+
resource = self.resource_set.resources[uri]
21+
if resource != self:
22+
eclass = find_eclass_in_resource(cls, resource)
2223
if eclass:
2324
return eclass
2425
return eclass

pylasu/playground/transpilation_trace.py

+15-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
from dataclasses import dataclass, field
2+
from io import BytesIO
23
from typing import List
34

4-
from pyecore.resources import Resource
5+
from pyecore.resources import Resource, ResourceSet, URI
56

67
from pylasu import StrumentaLanguageSupport as starlasu
78
from pylasu.emf.model import to_eobject
8-
from pylasu.playground.transpilation_trace_ecore import TranspilationTrace as ETranspilationTrace
9+
from pylasu.playground.transpilation_trace_ecore import TranspilationTrace as ETranspilationTrace, JsonResource
910
from pylasu.validation.validation import Result, Issue
1011

1112

@@ -25,3 +26,15 @@ def to_eobject(self, resource: Resource):
2526
target_result=starlasu.Result(root=to_eobject(self.target_result.root, resource, mappings)),
2627
generated_code=self.generated_code
2728
)
29+
30+
def save_as_json(self, name, *packages):
31+
rset = ResourceSet()
32+
rset.resource_factory['json'] = JsonResource
33+
resource = rset.create_resource(URI(name))
34+
for pkg in packages:
35+
package_resource = rset.create_resource(URI(pkg.nsURI))
36+
package_resource.contents.append(pkg)
37+
resource.contents.append(self.to_eobject(resource))
38+
with BytesIO() as out:
39+
resource.save(out)
40+
return out.getvalue().decode('utf-8')

pylasu/playground/transpilation_trace_ecore.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def save_as_json(self, name, *packages):
4848
resource = rset.create_resource(URI(name))
4949
for pkg in packages:
5050
package_resource = rset.create_resource(URI(pkg.nsURI))
51-
package_resource.contents.add(pkg)
51+
package_resource.contents.append(pkg)
5252
resource.contents.append(self)
5353
with BytesIO() as out:
5454
resource.save(out)

tests/test_transpilation_trace.py

+5-8
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
import json
22
import unittest
33

4+
from pyecore.ecore import EString, EAttribute, EInt
5+
46
import pylasu.StrumentaLanguageSupport as starlasu
57
from pylasu.StrumentaLanguageSupport import ASTNode
68
from pylasu.emf.metamodel_builder import MetamodelBuilder
7-
from pylasu.emf.model import to_eobject
89
from pylasu.playground.transpilation_trace import TranspilationTrace
910
from pylasu.playground.transpilation_trace_ecore import TranspilationTrace as ETranspilationTrace
10-
from pyecore.ecore import EString, EAttribute, EInt, MetaEClass
11-
from pyecore.resources import Resource
12-
1311
from pylasu.validation.validation import Result
1412
from tests.fixtures import Box
1513

@@ -75,14 +73,13 @@ def test_serialize_transpilation_issue(self):
7573
self.assertEqual(json.loads(expected), json.loads(tt.save_as_json("foo.json")))
7674

7775
def test_serialize_transpilation_from_nodes(self):
78-
res = Resource()
79-
mmb = MetamodelBuilder("tests.fixtures", "https://strumenta.com/pylasu/test/fixtures", resource=res)
76+
mmb = MetamodelBuilder("tests.fixtures", "https://strumenta.com/pylasu/test/fixtures")
8077
mmb.provide_class(Box)
8178

8279
tt = TranspilationTrace(
8380
original_code="box(a)[foo, bar]", generated_code='<box name="a"><foo /><bar /></box>',
8481
source_result=Result(Box("a")),
85-
target_result=Result(Box("a"))).to_eobject(res)
82+
target_result=Result(Box("a")))
8683

8784
expected = """{
8885
"eClass": "https://strumenta.com/kolasu/transpilation/v1#//TranspilationTrace",
@@ -91,5 +88,5 @@ def test_serialize_transpilation_from_nodes(self):
9188
"sourceResult": {"root": {"eClass": "https://strumenta.com/pylasu/test/fixtures#//Box"}},
9289
"targetResult": {"root": {"eClass": "https://strumenta.com/pylasu/test/fixtures#//Box"}}
9390
}"""
94-
as_json = tt.save_as_json("foo.json")
91+
as_json = tt.save_as_json("foo.json", mmb.generate())
9592
self.assertEqual(json.loads(expected), json.loads(as_json))

0 commit comments

Comments
 (0)