scrall 0.7.0__tar.gz → 0.8.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of scrall might be problematic. Click here for more details.
- {scrall-0.7.0/src/scrall.egg-info → scrall-0.8.1}/PKG-INFO +1 -1
- {scrall-0.7.0 → scrall-0.8.1}/pyproject.toml +1 -1
- scrall-0.8.1/src/scrall/__init__.py +1 -0
- {scrall-0.7.0 → scrall-0.8.1}/src/scrall/parse/scrall.peg +4 -3
- {scrall-0.7.0 → scrall-0.8.1}/src/scrall/parse/visitor.py +31 -10
- {scrall-0.7.0 → scrall-0.8.1/src/scrall.egg-info}/PKG-INFO +1 -1
- {scrall-0.7.0 → scrall-0.8.1}/tests/test_ping_actions.py +4 -4
- {scrall-0.7.0 → scrall-0.8.1}/tests/test_selection.py +8 -8
- {scrall-0.7.0 → scrall-0.8.1}/tests/test_state_actions.py +1 -1
- scrall-0.7.0/src/scrall/__init__.py +0 -1
- {scrall-0.7.0 → scrall-0.8.1}/LICENSE +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/MANIFEST.in +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/README.md +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/setup.cfg +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/src/scrall/__main__.py +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/src/scrall/exceptions.py +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/src/scrall/log.conf +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/src/scrall/parse/__init__.py +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/src/scrall/parse/parser.py +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/src/scrall.egg-info/SOURCES.txt +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/src/scrall.egg-info/dependency_links.txt +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/src/scrall.egg-info/entry_points.txt +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/src/scrall.egg-info/requires.txt +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/src/scrall.egg-info/top_level.txt +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/tests/test_delete.py +0 -0
- {scrall-0.7.0 → scrall-0.8.1}/tests/test_signals.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "scrall"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.8.1"
|
|
8
8
|
description = "Starr's Concise Relational Action Language - For Shlaer-Mellor Executable UML"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [{ name = "Leon Starr", email = "leon_starr@modelint.com" }]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "0.8.1"
|
|
@@ -92,10 +92,11 @@ OUTPUT = '=>>'
|
|
|
92
92
|
|
|
93
93
|
// Instance set
|
|
94
94
|
instance_set = new_instance / ((operation / name / path) (reflexive_selection / selection / operation / path)*)
|
|
95
|
-
selection = '(' SP*
|
|
96
|
-
|
|
95
|
+
selection = '(' SP* (rank_selection / criteria_selection) SP* ')'
|
|
96
|
+
rank_selection = CARD ', ' SP* RANKR name
|
|
97
|
+
criteria_selection = (CARD ', ' SP* scalar_expr) / CARD / scalar_expr
|
|
97
98
|
CARD = '1' / '*'
|
|
98
|
-
RANKR = '
|
|
99
|
+
RANKR = '^+' / '^-'
|
|
99
100
|
IN = '^'
|
|
100
101
|
TRUE = 'TRUE'
|
|
101
102
|
FALSE = 'FALSE'
|
|
@@ -16,7 +16,8 @@ Call_a = namedtuple('Call_a', 'call op_chain')
|
|
|
16
16
|
Scalar_Call_a = namedtuple('Scalar_Call_a', 'call')
|
|
17
17
|
"""The subject of a call could be an instance set (method) or an external entity (ee operation)"""
|
|
18
18
|
Attr_Access_a = namedtuple('Attr_Access_a', 'cname its attr')
|
|
19
|
-
|
|
19
|
+
Rank_Selection_a = namedtuple('Rank_Selection_a', 'card rankr attr')
|
|
20
|
+
Criteria_Selection_a = namedtuple('Criteria_Selection_a', 'card criteria')
|
|
20
21
|
Inst_Assignment_a = namedtuple('Inst_Assignment_a', 'lhs card rhs X')
|
|
21
22
|
EE_Signal_a = namedtuple('EE_Signal_a', 'event supplied_params ee')
|
|
22
23
|
Signal_a = namedtuple('Signal_a', 'event supplied_params dest')
|
|
@@ -72,7 +73,8 @@ Migration_a = namedtuple('Migration_a','from_inst to_subclass')
|
|
|
72
73
|
Rank_a = namedtuple('Rank_a', "card extent")
|
|
73
74
|
|
|
74
75
|
|
|
75
|
-
rank_symbol = {'
|
|
76
|
+
rank_symbol = {'^+': "greatest", '^-': "least"}
|
|
77
|
+
card_symbol = {'1':'ONE', '*':'ALL'}
|
|
76
78
|
|
|
77
79
|
table_op = {
|
|
78
80
|
'^': 'INTERSECT',
|
|
@@ -441,7 +443,7 @@ class ScrallVisitor(PTNodeVisitor):
|
|
|
441
443
|
if type(table).__name__ == 'INST_a':
|
|
442
444
|
last_comp = table.components[-1]
|
|
443
445
|
|
|
444
|
-
if last_comp and type(last_comp).__name__ == '
|
|
446
|
+
if last_comp and type(last_comp).__name__ == 'Criteria_Selection_a':
|
|
445
447
|
if s:
|
|
446
448
|
# We have two selection phrases. The first is terminating the instance set and the second is
|
|
447
449
|
# picked up as 's' above. We will take the first one and ignore the second,
|
|
@@ -916,22 +918,41 @@ class ScrallVisitor(PTNodeVisitor):
|
|
|
916
918
|
return result
|
|
917
919
|
|
|
918
920
|
@classmethod
|
|
919
|
-
def
|
|
921
|
+
def visit_rank_selection(cls, node, children):
|
|
920
922
|
"""
|
|
921
|
-
|
|
923
|
+
CARD ', ' SP* RANKR name
|
|
922
924
|
"""
|
|
923
|
-
_logger.info(f"{node.rule_name} =
|
|
925
|
+
_logger.info(f"{node.rule_name} = CARD ', ' SP* RANKR name")
|
|
926
|
+
_logger.info(f">> {[k for k in children.results.keys()]}")
|
|
927
|
+
_logger.info(f' :: {node.value}')
|
|
928
|
+
|
|
929
|
+
_logger.info(f" < {children}")
|
|
930
|
+
card_parse = children.results['CARD'][0]
|
|
931
|
+
card = card_symbol[card_parse]
|
|
932
|
+
attr_parse = children.results['name'][0]
|
|
933
|
+
attr = attr_parse.name
|
|
934
|
+
rankr_parse = children.results['RANKR']
|
|
935
|
+
rankr = rank_symbol[rankr_parse[0]]
|
|
936
|
+
result = Rank_Selection_a(card=card, rankr=rankr, attr=attr)
|
|
937
|
+
_logger.info(f" > {result}")
|
|
938
|
+
return result
|
|
939
|
+
|
|
940
|
+
@classmethod
|
|
941
|
+
def visit_criteria_selection(cls, node, children):
|
|
942
|
+
"""
|
|
943
|
+
(CARD ', ' SP* scalar_expr) / CARD / scalar_expr
|
|
944
|
+
"""
|
|
945
|
+
_logger.info(f"{node.rule_name} = (CARD ', ' SP* scalar_expr) / CARD / scalar_expr")
|
|
924
946
|
_logger.info(f">> {[k for k in children.results.keys()]}")
|
|
925
947
|
_logger.info(f' :: {node.value}')
|
|
926
948
|
|
|
927
949
|
_logger.info(f" < {children}")
|
|
928
950
|
explicit_card = children.results.get('CARD')
|
|
929
|
-
|
|
951
|
+
card_parse = '*' if not explicit_card else explicit_card[0]
|
|
952
|
+
card = card_symbol[card_parse]
|
|
930
953
|
criteria = children.results.get('scalar_expr')
|
|
931
|
-
rankr = children.results.get('RANKR')
|
|
932
|
-
rankr_parse = rank_symbol[rankr[0]] if rankr else None # assign greatest or least
|
|
933
954
|
if criteria:
|
|
934
|
-
result =
|
|
955
|
+
result = Criteria_Selection_a(card=card, criteria=criteria[0])
|
|
935
956
|
else:
|
|
936
957
|
result = [card]
|
|
937
958
|
_logger.info(f" > {result}")
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import pytest
|
|
4
4
|
from scrall.parse.parser import ScrallParser
|
|
5
5
|
from scrall.parse.visitor import Execution_Unit_a, Signal_a, Signal_Dest_a, N_a, INST_a, PATH_a, R_a,\
|
|
6
|
-
Inst_Assignment_a, Flow_Output_a,
|
|
6
|
+
Inst_Assignment_a, Flow_Output_a, Criteria_Selection_a, Rank_Selection_a, BOOL_a, Supplied_Parameter_a, Call_a, Op_a, IN_a, \
|
|
7
7
|
Table_Assignment_a, TEXPR_a, Projection_a, Seq_Statement_Set_a, Scalar_Assignment_a, Scalar_RHS_a, \
|
|
8
8
|
Sequence_Token_a, Case_a, Switch_a, Enum_a, Output_Flow_a, INST_PROJ_a, Comp_Statement_Set_a
|
|
9
9
|
|
|
@@ -40,7 +40,7 @@ actions = [
|
|
|
40
40
|
statement=Table_Assignment_a(type='implicit', assign_tuple=False,
|
|
41
41
|
lhs='stop here floors',
|
|
42
42
|
rhs=TEXPR_a(table=INST_a(components=[N_a(name='shaft aslevs')]), hexpr=None,
|
|
43
|
-
selection=
|
|
43
|
+
selection=Criteria_Selection_a(card='ALL', criteria=N_a(name='Stop requested')),
|
|
44
44
|
projection=Projection_a(expand=None, attrs=[N_a(name='Floor')])),
|
|
45
45
|
X=(0, 56)), block=None), output_token=None)),
|
|
46
46
|
("Try redirect( ^new dest ) -> /R53/Cabin",
|
|
@@ -80,14 +80,14 @@ actions = [
|
|
|
80
80
|
Execution_Unit_a(statement_set=Seq_Statement_Set_a(input_tokens=None,
|
|
81
81
|
statement=Inst_Assignment_a(
|
|
82
82
|
lhs=Flow_Output_a(name=N_a(name='requested stops'), exp_type=None), card='M',
|
|
83
|
-
rhs=INST_a(components=[N_a(name='shaft aslevs'),
|
|
83
|
+
rhs=INST_a(components=[N_a(name='shaft aslevs'), Criteria_Selection_a(card='ALL',
|
|
84
84
|
criteria=BOOL_a(op='==', operands=[N_a(name='Stop requested'), N_a(name='avalue')]))]),
|
|
85
85
|
X=(0, 58)), block=None), output_token=None)
|
|
86
86
|
),
|
|
87
87
|
("=>> Accessible Shaft Level( Floor: nearest dest.Floor; Shaft )",
|
|
88
88
|
Execution_Unit_a(statement_set=Seq_Statement_Set_a(input_tokens=None, statement=Output_Flow_a(
|
|
89
89
|
output=INST_PROJ_a(iset=INST_a(components=[N_a(name='Accessible Shaft Level'),
|
|
90
|
-
|
|
90
|
+
Criteria_Selection_a(card='ALL', criteria=BOOL_a(op='AND', operands=[
|
|
91
91
|
BOOL_a(op='==', operands=[N_a(name='Floor'),
|
|
92
92
|
INST_PROJ_a(iset=N_a(name='nearest dest'),
|
|
93
93
|
projection=Projection_a(expand=None, attrs=[N_a(name='Floor')]))]),
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
import pytest
|
|
4
4
|
from scrall.parse.parser import ScrallParser
|
|
5
5
|
from scrall.parse.visitor import Execution_Unit_a, Signal_a, Signal_Dest_a, N_a, INST_a, PATH_a, R_a,\
|
|
6
|
-
Inst_Assignment_a, Flow_Output_a,
|
|
6
|
+
Inst_Assignment_a, Flow_Output_a, Rank_Selection_a, Criteria_Selection_a, BOOL_a, Op_a, Enum_a, MATH_a, Seq_Statement_Set_a
|
|
7
7
|
|
|
8
8
|
actions = [
|
|
9
9
|
("s ..= Shaft(Inservice; Cleared)",
|
|
10
10
|
Execution_Unit_a(statement_set=Seq_Statement_Set_a(input_tokens=None,
|
|
11
11
|
statement=Inst_Assignment_a(
|
|
12
12
|
lhs=Flow_Output_a(name=N_a(name='s'), exp_type=None), card='M',
|
|
13
|
-
rhs=INST_a(components=[N_a(name='Shaft'),
|
|
13
|
+
rhs=INST_a(components=[N_a(name='Shaft'), Criteria_Selection_a(card='ALL',
|
|
14
14
|
criteria=BOOL_a(op='AND', operands=[N_a(name='Inservice'), N_a(name='Cleared')]))]),
|
|
15
15
|
X=(0, 31)), block=None), output_token=None)
|
|
16
16
|
),
|
|
@@ -18,7 +18,7 @@ actions = [
|
|
|
18
18
|
Execution_Unit_a(statement_set=Seq_Statement_Set_a(input_tokens=None,
|
|
19
19
|
statement=Inst_Assignment_a(
|
|
20
20
|
lhs=Flow_Output_a(name=N_a(name='c'), exp_type=None), card='M',
|
|
21
|
-
rhs=INST_a(components=[N_a(name='Cabin'),
|
|
21
|
+
rhs=INST_a(components=[N_a(name='Cabin'), Criteria_Selection_a(card='ALL',
|
|
22
22
|
criteria=BOOL_a(op='>', operands=[N_a(name='Speed'),
|
|
23
23
|
MATH_a(op='+', operands=[N_a(name='slowest'), N_a(name='buffer')])]))]),
|
|
24
24
|
X=(0, 37)), block=None), output_token=None)
|
|
@@ -27,7 +27,7 @@ actions = [
|
|
|
27
27
|
Execution_Unit_a(statement_set=Seq_Statement_Set_a(input_tokens=None,
|
|
28
28
|
statement=Inst_Assignment_a(
|
|
29
29
|
lhs=Flow_Output_a(name=N_a(name='c'), exp_type=None), card='M',
|
|
30
|
-
rhs=INST_a(components=[N_a(name='Cabin'),
|
|
30
|
+
rhs=INST_a(components=[N_a(name='Cabin'), Criteria_Selection_a(card='ALL',
|
|
31
31
|
criteria=BOOL_a(op='>', operands=[N_a(name='Speed'), N_a(name='slowest')]))]),
|
|
32
32
|
X=(0, 28)), block=None), output_token=None)
|
|
33
33
|
),
|
|
@@ -35,14 +35,14 @@ actions = [
|
|
|
35
35
|
Execution_Unit_a(statement_set=Seq_Statement_Set_a(input_tokens=None,
|
|
36
36
|
statement=Inst_Assignment_a(
|
|
37
37
|
lhs=Flow_Output_a(name=N_a(name='s'), exp_type=None), card='M',
|
|
38
|
-
rhs=INST_a(components=[N_a(name='Shaft'),
|
|
38
|
+
rhs=INST_a(components=[N_a(name='Shaft'), Criteria_Selection_a(card='ALL',
|
|
39
39
|
criteria=BOOL_a(op='==', operands=[N_a(name='In service'), 'TRUE']))]),
|
|
40
40
|
X=(0, 29)), block=None), output_token=None)
|
|
41
41
|
),
|
|
42
42
|
("s ..= Shaft(In service)",
|
|
43
43
|
Execution_Unit_a(statement_set=Seq_Statement_Set_a(input_tokens=None,
|
|
44
44
|
statement=Inst_Assignment_a(lhs=Flow_Output_a(name=N_a(name='s'), exp_type=None), card='M',
|
|
45
|
-
rhs=INST_a(components=[N_a(name='Shaft'),
|
|
45
|
+
rhs=INST_a(components=[N_a(name='Shaft'), Criteria_Selection_a(card='ALL',
|
|
46
46
|
criteria=N_a(name='In service'))]),
|
|
47
47
|
X=(0, 23)), block=None), output_token=None)
|
|
48
48
|
),
|
|
@@ -50,7 +50,7 @@ actions = [
|
|
|
50
50
|
Execution_Unit_a(statement_set=Seq_Statement_Set_a(input_tokens=None,
|
|
51
51
|
statement=Inst_Assignment_a(
|
|
52
52
|
lhs=Flow_Output_a(name=N_a(name='x'), exp_type=None), card='1',
|
|
53
|
-
rhs=INST_a(components=[N_a(name='Bank'),
|
|
53
|
+
rhs=INST_a(components=[N_a(name='Bank'), Criteria_Selection_a(card='ALL',
|
|
54
54
|
criteria=BOOL_a(op='OR', operands=[
|
|
55
55
|
BOOL_a(op='==', operands=[
|
|
56
56
|
N_a(name='Max close attempts'),
|
|
@@ -63,7 +63,7 @@ actions = [
|
|
|
63
63
|
statement=Inst_Assignment_a(
|
|
64
64
|
lhs=Flow_Output_a(name=N_a(name='x'), exp_type=None), card='M',
|
|
65
65
|
rhs=INST_a(components=[Op_a(owner='car', op_name='findsome', supplied_params=[]),
|
|
66
|
-
|
|
66
|
+
Criteria_Selection_a(card='ALL', criteria=BOOL_a(op='==',
|
|
67
67
|
operands=[N_a(name='color'), Enum_a(value=N_a(name='red'))]))]),
|
|
68
68
|
X=(0, 33)), block=None), output_token=None)
|
|
69
69
|
),
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import pytest
|
|
4
4
|
from scrall.parse.parser import ScrallParser
|
|
5
5
|
from scrall.parse.visitor import Execution_Unit_a, Signal_a, Signal_Dest_a, N_a, INST_a, PATH_a, R_a,\
|
|
6
|
-
Inst_Assignment_a, Flow_Output_a,
|
|
6
|
+
Inst_Assignment_a, Flow_Output_a, Criteria_Selection_a, BOOL_a, Supplied_Parameter_a, Call_a, Op_a, IN_a, \
|
|
7
7
|
Table_Assignment_a, TEXPR_a, Projection_a, Seq_Statement_Set_a, Scalar_Assignment_a, Scalar_RHS_a, \
|
|
8
8
|
Sequence_Token_a, Case_a, Switch_a, Enum_a, Output_Flow_a, INST_PROJ_a, Comp_Statement_Set_a, \
|
|
9
9
|
Decision_a
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
version = "0.7.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|