• R/O
  • SSH

提交

标签
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Castle: The best Real-Time/Embedded/HighTech language EVER. Attempt 2


Commit MetaInfo

修订版1403faaa44fb4319baa0ac784a3d017a71cdefc5 (tree)
时间2023-10-19 00:05:00
作者Albert Mietus < albert AT mietus DOT nl >
CommiterAlbert Mietus < albert AT mietus DOT nl >

Log Message

ASIS (busy with NameSpace)

更改概述

差异

diff -r 26824204f5e1 -r 1403faaa44fb Makefile
--- a/Makefile Wed Oct 18 16:06:13 2023 +0200
+++ b/Makefile Wed Oct 18 17:05:00 2023 +0200
@@ -21,10 +21,12 @@
2121 pytst/aigr/test_0_aid.py \
2222 #
2323 rPY_CURRENT = \
24+ pytst/aigr/test_3_namespaces.py \
25+#
26+CC2CPy_TODO = \
27+ pytst/aigr/test_0_AIGR.py \
2428 pytst/writers/RPy/test_3_SieveProtocols.py \
2529 pytst/writers/RPy/test_4_NameSpaces.py \
26-#
27-CC2CPy_TODO = \
2830 pytst/writers/RPy/test_99_SieveMoats.py \
2931 pytst/writers/RPy/test_999.py \
3032 #
diff -r 26824204f5e1 -r 1403faaa44fb TestDoubles/AIGR/base/__init__.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/TestDoubles/AIGR/base/__init__.py Wed Oct 18 17:05:00 2023 +0200
@@ -0,0 +1,5 @@
1+# (C) Albert Mietus, 2023. Part of Castle/CCastle project
2+
3+from castle.aigr.protocols import baseProtocol
4+
5+Protocol = baseProtocol
diff -r 26824204f5e1 -r 1403faaa44fb TestDoubles/AIGR/sieve/__init__.py
--- a/TestDoubles/AIGR/sieve/__init__.py Wed Oct 18 16:06:13 2023 +0200
+++ b/TestDoubles/AIGR/sieve/__init__.py Wed Oct 18 17:05:00 2023 +0200
@@ -1,4 +1,5 @@
11 # (C) Albert Mietus, 2023. Part of Castle/CCastle project
22
33 from .protocols import *
4-from .moats import *
4+from .namespaces import *
5+#XXXfrom .moats import *
diff -r 26824204f5e1 -r 1403faaa44fb TestDoubles/AIGR/sieve/protocols.py
--- a/TestDoubles/AIGR/sieve/protocols.py Wed Oct 18 16:06:13 2023 +0200
+++ b/TestDoubles/AIGR/sieve/protocols.py Wed Oct 18 17:05:00 2023 +0200
@@ -10,6 +10,7 @@
1010 Event(name='runTo', return_type=None, typedParameters=(TypedParameter(name='max', type=int),)),
1111 Event(name='newMax', return_type=None, typedParameters=(TypedParameter(name='max', type=int),))))
1212
13+
1314 SlowStart = EventProtocol('SlowStart',
1415 typedParameters=(TypedParameter(name='queue_max', type=int),),
1516 events=(
@@ -17,7 +18,7 @@
1718
1819 SlowStart_1 = ProtocolWrapper("SlowStart_1",
1920 based_on=SlowStart,
20- #arguments=(Argument(name=queue_max, value=1),))
21+ #OR: arguments=(Argument(name=queue_max, value=1),))
2122 arguments=(Argument(value=1),))
2223
2324 SimpleSieve = EventProtocol('SimpleSieve',
diff -r 26824204f5e1 -r 1403faaa44fb TestDoubles/reference/protocols/SimpleSieve.rpy
--- a/TestDoubles/reference/protocols/SimpleSieve.rpy Wed Oct 18 16:06:13 2023 +0200
+++ b/TestDoubles/reference/protocols/SimpleSieve.rpy Wed Oct 18 17:05:00 2023 +0200
@@ -6,8 +6,7 @@
66 from CC import buildin
77 from CC import base
88
9-#Put the Castle/generated imports here
10-
9+import SlowStart_1
1110
1211
1312 ##
@@ -19,7 +18,7 @@
1918
2019 cc_P_SimpleSieve = buildin.CC_B_Protocol(name="SimpleSieve",
2120 kind=buildin.ProtocolKind.Event,
22- inherit_from=cc_P_SlowStart_1,
21+ inherit_from=SlowStart_1.cc_P_SlowStart_1,
2322 events=[])
2423
2524 cc_P_SimpleSieve.events.append(buildin.CC_B_P_EventID(name="input",
diff -r 26824204f5e1 -r 1403faaa44fb TestDoubles/reference/protocols/SlowStart.rpy
--- a/TestDoubles/reference/protocols/SlowStart.rpy Wed Oct 18 16:06:13 2023 +0200
+++ b/TestDoubles/reference/protocols/SlowStart.rpy Wed Oct 18 17:05:00 2023 +0200
@@ -22,7 +22,7 @@
2222 ('queue_max', int),
2323 ),
2424 kind=buildin.ProtocolKind.Event,
25- inherit_from=cc_P_Protocol,
25+ inherit_from=base.cc_P_Protocol,
2626 events=[])
2727
2828 cc_P_SlowStart.events.append(buildin.CC_B_P_EventID(name="setMax",
diff -r 26824204f5e1 -r 1403faaa44fb TestDoubles/reference/protocols/SlowStart_1.rpy
--- a/TestDoubles/reference/protocols/SlowStart_1.rpy Wed Oct 18 16:06:13 2023 +0200
+++ b/TestDoubles/reference/protocols/SlowStart_1.rpy Wed Oct 18 17:05:00 2023 +0200
@@ -6,8 +6,7 @@
66 from CC import buildin
77 from CC import base
88
9-#Put the Castle/generated imports here
10-
9+import SlowStart
1110
1211
1312 ##
@@ -19,7 +18,7 @@
1918
2019 cc_P_SlowStart_1 = buildin.CC_B_Protocol(name="SlowStart_1",
2120 kind=buildin.ProtocolKind.Event,
22- inherit_from=cc_P_SlowStart,
21+ inherit_from=SlowStart.cc_P_SlowStart,
2322 events=[])
2423
2524 cc_P_SlowStart_1.events.append(buildin.CC_B_P_EventID(name="setMax",
diff -r 26824204f5e1 -r 1403faaa44fb TestDoubles/reference/protocols/StartSieve.rpy
--- a/TestDoubles/reference/protocols/StartSieve.rpy Wed Oct 18 16:06:13 2023 +0200
+++ b/TestDoubles/reference/protocols/StartSieve.rpy Wed Oct 18 17:05:00 2023 +0200
@@ -20,7 +20,7 @@
2020
2121 cc_P_StartSieve = buildin.CC_B_Protocol(name="StartSieve",
2222 kind=buildin.ProtocolKind.Event,
23- inherit_from=cc_P_Protocol,
23+ inherit_from=base.cc_P_Protocol,
2424 events=[])
2525
2626 cc_P_StartSieve.events.append(buildin.CC_B_P_EventID(name="runTo",
diff -r 26824204f5e1 -r 1403faaa44fb castle/aigr/__init__.py
--- a/castle/aigr/__init__.py Wed Oct 18 16:06:13 2023 +0200
+++ b/castle/aigr/__init__.py Wed Oct 18 17:05:00 2023 +0200
@@ -13,3 +13,4 @@
1313 from .events import *
1414 from .protocols import *
1515 from .interfaces import *
16+from .namespaces import *
diff -r 26824204f5e1 -r 1403faaa44fb castle/aigr/namespaces.py
--- a/castle/aigr/namespaces.py Wed Oct 18 16:06:13 2023 +0200
+++ b/castle/aigr/namespaces.py Wed Oct 18 17:05:00 2023 +0200
@@ -4,14 +4,75 @@
44
55 There are several NameSpaces: the most prominent one is the ``Source_NS``, roughly the file that contains the (Castle) code.
66 """
7+from __future__ import annotations
78
8-from __future__ import annotations
9+__all__ = ['NameSpace', 'Source_NS', 'GENERATED']
10+
11+import logging; logger = logging.getLogger(__name__)
912 import typing as PTH # Python TypeHints
1013 from enum import Enum
1114 from dataclasses import dataclass, KW_ONLY
1215 from dataclasses import field as dc_field
1316
14-from . import AIGR
1517
16-class NameSpace(AIGR): pass
17-class Source_NS(NameSpace): pass
18+from . import AIGR, _Marker
19+
20+class GENERATED(_Marker):pass
21+
22+
23+class NamedNode(AIGR): pass # Move up, name:str is part of it
24+class NameError(AttributeError):pass
25+
26+@dataclass
27+class NameSpace(AIGR):
28+ """This models a namespace (like a file, see ``Source_NS``).
29+
30+ It contained *"named nodes"* that should be :method:`register()`ed and can be found by :method:`getID()` and/or :method:`findNode()`.
31+
32+ XXX More"""
33+
34+ name :str
35+ _: KW_ONLY
36+ _dict :dict=dc_field(init=None, default_factory=lambda: dict())
37+
38+ def register(self, named_node :NamedNode):
39+ name = named_node.name
40+ if name in self._dict:
41+ old=self._dict[name]
42+ logger.warning(f"The '{name}'-node is already in this namespace; -- it will be lost." +
43+ f"Removed: {old}. New: {named_node}")
44+
45+ self._dict[name] = named_node
46+ named_node.ns = self
47+
48+
49+ def findNode(self, name :str) ->PTH.Optional(NamedNode):
50+ """Return the NamedNode with the specified name (aka ID), or None.
51+ See :method:`getID` for an alternative"""
52+ return self._dict.get(name, None)
53+
54+
55+ def getID(self, name :str) ->NamedNode: #Or raise NameError
56+ """Return the NamedNode with the specified name (aka ID), or raised an NameError:AttributeError.
57+ See :method:`findNode` for an alternative"""
58+ node = self.findNode(name)
59+ if node is None:
60+ raise NameError(f"No node named {name} in NS:{self.name}")
61+ return node
62+
63+ def search(self, dottedName :str) ->PTH.Optional(NamedNode):
64+ """Search the namespace for the 1st part of `dottedName`, then that NS for the next part, etc. And return the "deepest" node, or None"""
65+
66+ parts = dottedName.split('.',maxsplit=1) # parts is [<name>, (<name>.)*] parts[1] can be absent, parts[0] always exist
67+ node = self.findNode(parts[0])
68+ if len(parts) == 1:
69+ return node
70+ try:
71+ return node.search(parts[1])
72+ except AttributeError: #node isn't a search'able/NameSpace --> Not found --> return None
73+ return none
74+
75+@dataclass
76+class Source_NS(NameSpace):
77+ _: KW_ONLY
78+ source :str
diff -r 26824204f5e1 -r 1403faaa44fb castle/aigr/protocols.py
--- a/castle/aigr/protocols.py Wed Oct 18 16:06:13 2023 +0200
+++ b/castle/aigr/protocols.py Wed Oct 18 17:05:00 2023 +0200
@@ -10,6 +10,7 @@
1010 from . import AIGR, _Marker
1111 from .events import Event
1212 from .aid import TypedParameter, Argument # Castle/AIGR types
13+from .namespaces import NameSpace
1314
1415 __all__ = ['ProtocolKind', 'Protocol', 'EventProtocol']
1516 # DataProtocol, StreamProtocol are added/implemented later
@@ -35,11 +36,12 @@
3536 """
3637 _BASE: PTH.ClassVar=None # pragma: no mutate
3738
38- name: str
39+ name :str
3940 _: KW_ONLY
40- kind: ProtocolKind
41- based_on: PTH.Optional[Protocol]=dc_field(default_factory= lambda :Protocol._BASE) # pragma: no mutate
42- typedParameters: PTH.Optional[PTH.Sequence[TypedParameter]]=()
41+ kind :ProtocolKind
42+ based_on :PTH.Optional[Protocol]=dc_field(default_factory= lambda :Protocol._BASE) # pragma: no mutate
43+ typedParameters :PTH.Optional[PTH.Sequence[TypedParameter]]=()
44+ _ns :PTH.Optional[NameSpace]=dc_field(init=None, default=None)
4345
4446
4547 @dataclass # pragma: no mutate
diff -r 26824204f5e1 -r 1403faaa44fb castle/writers/RPy/templates/parts/interface_DataStructures.jinja2
--- a/castle/writers/RPy/templates/parts/interface_DataStructures.jinja2 Wed Oct 18 16:06:13 2023 +0200
+++ b/castle/writers/RPy/templates/parts/interface_DataStructures.jinja2 Wed Oct 18 17:05:00 2023 +0200
@@ -14,7 +14,7 @@
1414 {% for p in interface.ports %}
1515 {{- m.comp_interface_Name(interface.name) }}.ports.append(buildin.CC_B_C_PortID(name="{{ p.name }}",
1616 protocol={{m.ProtocolName(p.type.name)}},
17- direction=XXX_NS_XXX. {{p.direction}},
17+ direction={{p.direction}},
1818 part_of={{ m.comp_interface_Name(interface.name) }}))
1919 {% endfor %} {#- ports #}
2020
diff -r 26824204f5e1 -r 1403faaa44fb castle/writers/RPy/templates/parts/protocol_DataStructures.jinja2
--- a/castle/writers/RPy/templates/parts/protocol_DataStructures.jinja2 Wed Oct 18 16:06:13 2023 +0200
+++ b/castle/writers/RPy/templates/parts/protocol_DataStructures.jinja2 Wed Oct 18 17:05:00 2023 +0200
@@ -24,7 +24,7 @@
2424
2525 {% endif %}
2626 kind=buildin.{{proto.kind}},
27- inherit_from={{m.ProtocolName(proto.based_on.name)}},
27+ inherit_from={{proto.based_on.ns}}.{{m.ProtocolName(proto.based_on.name)}}, # XXX NS not ready
2828 events=[])
2929
3030 {% for e in proto.events %}
diff -r 26824204f5e1 -r 1403faaa44fb castle/writers/RPy/templates/parts/protocol_imports.jinja2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/castle/writers/RPy/templates/parts/protocol_imports.jinja2 Wed Oct 18 17:05:00 2023 +0200
@@ -0,0 +1,1 @@
1+XXX protocol_imports.jinja2
diff -r 26824204f5e1 -r 1403faaa44fb castle/writers/RPy/templates/protocol.jinja2
--- a/castle/writers/RPy/templates/protocol.jinja2 Wed Oct 18 16:06:13 2023 +0200
+++ b/castle/writers/RPy/templates/protocol.jinja2 Wed Oct 18 17:05:00 2023 +0200
@@ -15,8 +15,10 @@
1515
1616 {% block imports %}
1717 #Put the Castle/generated imports here
18+{% include 'parts/protocol_imports.jinja2' %}
1819 {% endblock %}
1920
21+
2022 {% block EventIndexes %}
2123 {% for protocol in protocols %}
2224 {% set events = protocol.events %}
diff -r 26824204f5e1 -r 1403faaa44fb pytst/writers/RPy/test_3_SieveProtocols.py
--- a/pytst/writers/RPy/test_3_SieveProtocols.py Wed Oct 18 16:06:13 2023 +0200
+++ b/pytst/writers/RPy/test_3_SieveProtocols.py Wed Oct 18 17:05:00 2023 +0200
@@ -8,16 +8,23 @@
88 from . import T_Protocol
99
1010
11-
11+@pytest.mark.xfail(reason="NS support in ``TestDoubles/reference/protocols/*``, not in code")
1212 def test_01_StartSieve(generatedProtocol_verifier):
1313 generatedProtocol_verifier(aigr_mock=sieve.StartSieve, td=TstDoubles('protocols/StartSieve'))
1414
15+
16+@pytest.mark.skip("Top one first")
17+@pytest.mark.xfail(reason="NS support in ``TestDoubles/reference/protocols/*``, not in code")
1518 def test_02_SlowStart(generatedProtocol_verifier):
1619 generatedProtocol_verifier(aigr_mock=sieve.SlowStart, td=TstDoubles('protocols/SlowStart'))
1720
21+@pytest.mark.skip("Top one first")
22+@pytest.mark.xfail(reason="NS support in ``TestDoubles/reference/protocols/*``, not in code")
1823 def test_03a_SlowStart1(generatedProtocol_verifier):
1924 generatedProtocol_verifier(aigr_mock=sieve.SlowStart_1, td=TstDoubles('protocols/SlowStart_1'))
2025
26+@pytest.mark.skip("Top one first")
27+@pytest.mark.xfail(reason="NS support in ``TestDoubles/reference/protocols/*``, not in code")
2128 def test_03b_SimpleSieve(generatedProtocol_verifier):
2229 generatedProtocol_verifier(aigr_mock=sieve.SimpleSieve, td=TstDoubles('protocols/SimpleSieve'))
2330