Skip to content

Commit 6e4e84d

Browse files
committed
docker: add Julia mixed-language study
1 parent bce2e19 commit 6e4e84d

5 files changed

Lines changed: 168 additions & 9 deletions

File tree

concore_cli/commands/build.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ def _write_docker_compose(output_path, console, zmq_mode=False):
138138
compose_lines.append("volumes:")
139139
for v in sorted(named_volumes):
140140
compose_lines.append(f" {v}:")
141+
compose_lines.append(f" name: {_yaml_quote(v)}")
141142

142143
compose_lines.append("")
143144
compose_lines.append("networks:")

concoredocker.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
simtime = 0
3737

3838
def _port_path(base, port_num):
39-
return os.path.join(base, str(port_num))
39+
return base + str(port_num)
4040

4141
concore_params_file = os.path.join(_port_path(inpath, 1), "concore.params")
4242
concore_maxtime_file = os.path.join(_port_path(inpath, 1), "concore.maxtime")

demo/sampleJ.graphml

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd" xmlns:y="http://www.yworks.com/xml/graphml">
3+
<key for="node" id="d6" yfiles.type="nodegraphics"/>
4+
<key for="edge" id="d10" yfiles.type="edgegraphics"/>
5+
<graph edgedefault="directed" id="1638389982514" projectName="sample">
6+
<node id="23fe819b-a16c-43cb-9d94-f3b53d06985f">
7+
<data key="d6">
8+
<y:ShapeNode>
9+
<y:Geometry height="50" width="132" x="100" y="100"/>
10+
<y:Fill color="#ffcc00" opacity="1"/>
11+
<y:BorderStyle color="#000" width="1"/>
12+
<y:NodeLabel>CZ:controller_jl.jl</y:NodeLabel>
13+
<y:Shape type="rectangle"/>
14+
</y:ShapeNode>
15+
</data>
16+
</node>
17+
<node id="9c5e14c8-1f5c-420e-a72d-46b2efa244a6">
18+
<data key="d6">
19+
<y:ShapeNode>
20+
<y:Geometry height="50" width="100" x="99" y="262"/>
21+
<y:Fill color="#ffcc00" opacity="1"/>
22+
<y:BorderStyle color="#000" width="1"/>
23+
<y:NodeLabel>PZ:pm.py</y:NodeLabel>
24+
<y:Shape type="rectangle"/>
25+
</y:ShapeNode>
26+
</data>
27+
</node>
28+
<edge id="0" source="23fe819b-a16c-43cb-9d94-f3b53d06985f" target="9c5e14c8-1f5c-420e-a72d-46b2efa244a6">
29+
<data key="d10">
30+
<y:GenericEdge configuration="com.yworks.bpmn.Connection">
31+
<y:LineStyle color="#f44336" width="1" type="solid"/>
32+
<y:Arrows source="none" target="delta"/>
33+
<y:EdgeLabel>CU</y:EdgeLabel>
34+
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
35+
<y:Point x="99.42283950617283" y="193.5"/>
36+
</y:Path>
37+
</y:GenericEdge>
38+
</data>
39+
</edge>
40+
<edge id="1" source="9c5e14c8-1f5c-420e-a72d-46b2efa244a6" target="23fe819b-a16c-43cb-9d94-f3b53d06985f">
41+
<data key="d10">
42+
<y:GenericEdge configuration="com.yworks.bpmn.Connection">
43+
<y:LineStyle color="#827717" width="1" type="solid"/>
44+
<y:Arrows source="none" target="delta"/>
45+
<y:EdgeLabel>PYM</y:EdgeLabel>
46+
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
47+
<y:Point x="122.24371946735148" y="167.84209541286452"/>
48+
</y:Path>
49+
</y:GenericEdge>
50+
</data>
51+
</edge>
52+
<actionHistory>
53+
<tid>1638390071794</tid>
54+
<authorName>Pradeeban</authorName>
55+
<inverse>
56+
<actionName>DEL_NODE</actionName>
57+
<parameters>WyIyM2ZlODE5Yi1hMTZjLTQzY2ItOWQ5NC1mM2I1M2QwNjk4NWYiXQ==</parameters>
58+
</inverse>
59+
<equivalent>
60+
<actionName>ADD_NODE</actionName>
61+
<parameters>WyJDWjpjb250cm9sbGVyLnB5Iix7IndpZHRoIjoxMzIsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5IjoxMDB9LHt9LCIyM2ZlODE5Yi1hMTZjLTQzY2ItOWQ5NC1mM2I1M2QwNjk4NWYiXQ==</parameters>
62+
</equivalent>
63+
</actionHistory>
64+
<actionHistory>
65+
<tid>1638390078744</tid>
66+
<authorName>Pradeeban</authorName>
67+
<inverse>
68+
<actionName>DEL_NODE</actionName>
69+
<parameters>WyI5YzVlMTRjOC0xZjVjLTQyMGUtYTcyZC00NmIyZWZhMjQ0YTYiXQ==</parameters>
70+
</inverse>
71+
<equivalent>
72+
<actionName>ADD_NODE</actionName>
73+
<parameters>WyJQWjpwbS5weSIseyJ3aWR0aCI6MTAwLCJoZWlnaHQiOjUwLCJzaGFwZSI6InJlY3RhbmdsZSIsIm9wYWNpdHkiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZmNjMDAiLCJib3JkZXJDb2xvciI6IiMwMDAiLCJib3JkZXJXaWR0aCI6MX0sIm9yZGluIix7IngiOjk5LCJ5IjoyNjJ9LHt9LCI5YzVlMTRjOC0xZjVjLTQyMGUtYTcyZC00NmIyZWZhMjQ0YTYiXQ==</parameters>
74+
</equivalent>
75+
</actionHistory>
76+
<actionHistory>
77+
<tid>1638390083602</tid>
78+
<authorName>Pradeeban</authorName>
79+
<inverse>
80+
<actionName>SET_POS</actionName>
81+
<parameters>WyI5YzVlMTRjOC0xZjVjLTQyMGUtYTcyZC00NmIyZWZhMjQ0YTYiLHsieCI6MTEwLCJ5IjoxMTB9LHsieCI6OTksInkiOjI2Mn1d</parameters>
82+
</inverse>
83+
<equivalent>
84+
<actionName>SET_POS</actionName>
85+
<parameters>WyI5YzVlMTRjOC0xZjVjLTQyMGUtYTcyZC00NmIyZWZhMjQ0YTYiLHsieCI6OTksInkiOjI2Mn0seyJ4IjoxMTAsInkiOjExMH1d</parameters>
86+
</equivalent>
87+
</actionHistory>
88+
<actionHistory>
89+
<tid>1638390087263</tid>
90+
<authorName>Pradeeban</authorName>
91+
<inverse>
92+
<actionName>DEL_EDGE</actionName>
93+
<parameters>WyI0ZTY3NzY3Ny1jYmI5LTRlMGUtOGUwYS0zNDUxMDJkODIzYWYiXQ==</parameters>
94+
</inverse>
95+
<equivalent>
96+
<actionName>ADD_EDGE</actionName>
97+
<parameters>W3sic291cmNlSUQiOiIyM2ZlODE5Yi1hMTZjLTQzY2ItOWQ5NC1mM2I1M2QwNjk4NWYiLCJ0YXJnZXRJRCI6IjljNWUxNGM4LTFmNWMtNDIwZS1hNzJkLTQ2YjJlZmEyNDRhNiIsImxhYmVsIjoiQyIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2Y0NDMzNiIsInNoYXBlIjoic29saWQifSwiaWQiOiI0ZTY3NzY3Ny1jYmI5LTRlMGUtOGUwYS0zNDUxMDJkODIzYWYifV0=</parameters>
98+
</equivalent>
99+
</actionHistory>
100+
<actionHistory>
101+
<tid>1638390162285</tid>
102+
<authorName>Pradeeban</authorName>
103+
<inverse>
104+
<actionName>DEL_EDGE</actionName>
105+
<parameters>WyI4NzRiYmZiNi02NTMwLTQxMzgtOTI4Zi1kMDI5NDEyZGQwN2UiXQ==</parameters>
106+
</inverse>
107+
<equivalent>
108+
<actionName>ADD_EDGE</actionName>
109+
<parameters>W3sic291cmNlSUQiOiI5YzVlMTRjOC0xZjVjLTQyMGUtYTcyZC00NmIyZWZhMjQ0YTYiLCJ0YXJnZXRJRCI6IjIzZmU4MTliLWExNmMtNDNjYi05ZDk0LWYzYjUzZDA2OTg1ZiIsImxhYmVsIjoiUCIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiI4NzRiYmZiNi02NTMwLTQxMzgtOTI4Zi1kMDI5NDEyZGQwN2UifV0=</parameters>
110+
</equivalent>
111+
</actionHistory>
112+
<actionHistory>
113+
<tid>1638390238818</tid>
114+
<authorName>Pradeeban</authorName>
115+
<inverse>
116+
<actionName>UPDATE_EDGE</actionName>
117+
<parameters>WyI0ZTY3NzY3Ny1jYmI5LTRlMGUtOGUwYS0zNDUxMDJkODIzYWYiLHsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZjQ0MzM2Iiwic2hhcGUiOiJzb2xpZCJ9LCJDIix0cnVlXQ==</parameters>
118+
</inverse>
119+
<equivalent>
120+
<actionName>UPDATE_EDGE</actionName>
121+
<parameters>WyI0ZTY3NzY3Ny1jYmI5LTRlMGUtOGUwYS0zNDUxMDJkODIzYWYiLHsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZjQ0MzM2Iiwic2hhcGUiOiJzb2xpZCJ9LCJDVSIsdHJ1ZV0=</parameters>
122+
</equivalent>
123+
</actionHistory>
124+
<actionHistory>
125+
<tid>1638390244629</tid>
126+
<authorName>Pradeeban</authorName>
127+
<inverse>
128+
<actionName>UPDATE_EDGE</actionName>
129+
<parameters>WyI4NzRiYmZiNi02NTMwLTQxMzgtOTI4Zi1kMDI5NDEyZGQwN2UiLHsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjODI3NzE3Iiwic2hhcGUiOiJzb2xpZCJ9LCJQIix0cnVlXQ==</parameters>
130+
</inverse>
131+
<equivalent>
132+
<actionName>UPDATE_EDGE</actionName>
133+
<parameters>WyI4NzRiYmZiNi02NTMwLTQxMzgtOTI4Zi1kMDI5NDEyZGQwN2UiLHsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjODI3NzE3Iiwic2hhcGUiOiJzb2xpZCJ9LCJQWU0iLHRydWVd</parameters>
134+
</equivalent>
135+
</actionHistory>
136+
</graph>
137+
</graphml>

tests/test_compose_generation.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ def test_compose_has_network_section(tmp_path):
2727
assert "networks:" in content
2828

2929

30+
def test_compose_preserves_named_volume(tmp_path):
31+
(tmp_path / "run").write_text(
32+
"docker run --name node1 -v CU:/out1 concore/py &"
33+
)
34+
path = _write_docker_compose(tmp_path, Console(quiet=True))
35+
content = path.read_text()
36+
assert " CU:\n name: 'CU'" in content
37+
38+
3039
def test_compose_depends_on_second_service(tmp_path):
3140
_fake_run_script(
3241
tmp_path,

tests/test_concoredocker.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ def test_returns_default_for_bad_syntax(self, temp_dir):
4444
assert result == "fallback"
4545

4646

47+
class TestDockerPaths:
48+
def test_port_path_matches_docker_mounts(self):
49+
from concoredocker import _port_path
50+
51+
assert _port_path("/in", 1) == "/in1"
52+
assert _port_path("/out", 2) == "/out2"
53+
54+
4755
class TestUnchanged:
4856
def test_returns_true_when_unchanged(self):
4957
import concoredocker
@@ -89,9 +97,10 @@ def test_writes_list_with_simtime(self, temp_dir):
8997
import concoredocker
9098

9199
old_outpath = concoredocker.outpath
92-
outdir = os.path.join(temp_dir, "1")
100+
outpath = os.path.join(temp_dir, "out")
101+
outdir = outpath + "1"
93102
os.makedirs(outdir)
94-
concoredocker.outpath = temp_dir
103+
concoredocker.outpath = outpath
95104
concoredocker.simtime = 5.0
96105

97106
concoredocker.write(1, "testfile", [1.0, 2.0], delta=0)
@@ -105,9 +114,10 @@ def test_writes_with_delta(self, temp_dir):
105114
import concoredocker
106115

107116
old_outpath = concoredocker.outpath
108-
outdir = os.path.join(temp_dir, "1")
117+
outpath = os.path.join(temp_dir, "out")
118+
outdir = outpath + "1"
109119
os.makedirs(outdir)
110-
concoredocker.outpath = temp_dir
120+
concoredocker.outpath = outpath
111121
concoredocker.simtime = 10.0
112122

113123
concoredocker.write(1, "testfile", [3.0], delta=2)
@@ -126,9 +136,10 @@ def test_reads_and_parses_data(self, temp_dir):
126136

127137
old_inpath = concoredocker.inpath
128138
old_delay = concoredocker.delay
129-
indir = os.path.join(temp_dir, "1")
139+
inpath = os.path.join(temp_dir, "in")
140+
indir = inpath + "1"
130141
os.makedirs(indir)
131-
concoredocker.inpath = temp_dir
142+
concoredocker.inpath = inpath
132143
concoredocker.delay = 0.001
133144

134145
with open(os.path.join(indir, "data"), "w") as f:
@@ -149,9 +160,10 @@ def test_returns_default_when_file_missing(self, temp_dir):
149160

150161
old_inpath = concoredocker.inpath
151162
old_delay = concoredocker.delay
152-
indir = os.path.join(temp_dir, "1")
163+
inpath = os.path.join(temp_dir, "in")
164+
indir = inpath + "1"
153165
os.makedirs(indir)
154-
concoredocker.inpath = temp_dir
166+
concoredocker.inpath = inpath
155167
concoredocker.delay = 0.001
156168

157169
concoredocker.s = ""

0 commit comments

Comments
 (0)