rsmp 0.43.2 → 0.45.1
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.
- checksums.yaml +4 -4
- data/.github/workflows/rubocop.yaml +1 -1
- data/.github/workflows/sus.yaml +1 -1
- data/.gitignore +0 -1
- data/CHANGELOG.md +12 -1
- data/Gemfile +0 -2
- data/Gemfile.lock +10 -88
- data/README.md +30 -35
- data/Rakefile +2 -2
- data/config/supervisor.yaml +2 -1
- data/config/tlc.yaml +2 -2
- data/documentation/configuration.md +12 -11
- data/documentation/message_distribution.md +1 -2
- data/documentation/tasks.md +1 -2
- data/exe/rsmp +1 -2
- data/lib/rsmp/cli.rb +62 -8
- data/lib/rsmp/component/component.rb +0 -4
- data/lib/rsmp/component/component_base.rb +15 -2
- data/lib/rsmp/component/component_proxy.rb +1 -1
- data/lib/rsmp/component/components.rb +22 -1
- data/lib/rsmp/convert/export/json_schema/outputs.rb +19 -0
- data/lib/rsmp/convert/export/json_schema/values.rb +7 -5
- data/lib/rsmp/convert/export/json_schema.rb +15 -3
- data/lib/rsmp/helpers/deep_merge.rb +2 -2
- data/lib/rsmp/message.rb +32 -0
- data/lib/rsmp/node/site/site.rb +34 -10
- data/lib/rsmp/node/supervisor/modules/configuration.rb +32 -5
- data/lib/rsmp/node/supervisor/modules/connection.rb +0 -2
- data/lib/rsmp/node/supervisor/supervisor.rb +0 -7
- data/lib/rsmp/options/options.rb +55 -6
- data/lib/rsmp/options/schemas/site.json +6 -3
- data/lib/rsmp/options/schemas/supervisor.json +5 -2
- data/lib/rsmp/options/schemas/supervisor_site.json +5 -2
- data/lib/rsmp/options/site_options.rb +3 -2
- data/lib/rsmp/options/supervisor_options.rb +3 -1
- data/lib/rsmp/proxy/modules/acknowledgements.rb +2 -0
- data/lib/rsmp/proxy/modules/receive.rb +5 -2
- data/lib/rsmp/proxy/modules/state.rb +1 -0
- data/lib/rsmp/proxy/modules/versions.rb +90 -15
- data/lib/rsmp/proxy/proxy.rb +52 -3
- data/lib/rsmp/proxy/site/modules/status.rb +5 -3
- data/lib/rsmp/proxy/site/site_proxy.rb +68 -35
- data/lib/rsmp/proxy/site/sxl_selection.rb +54 -0
- data/lib/rsmp/proxy/supervisor/supervisor_proxy.rb +54 -18
- data/lib/rsmp/schema/core_sxl_resolution.rb +69 -0
- data/lib/rsmp/schema/message_resolution.rb +104 -0
- data/lib/rsmp/schema/validation.rb +57 -0
- data/lib/rsmp/schema.rb +87 -32
- data/lib/rsmp/schema_error.rb +7 -1
- data/lib/rsmp/sxl/interface.rb +48 -0
- data/lib/rsmp/sxl/registry.rb +55 -0
- data/lib/rsmp/sxl/site_interface.rb +10 -0
- data/lib/rsmp/sxl/supervisor_interface.rb +21 -0
- data/lib/rsmp/tlc/detector_logic.rb +2 -2
- data/lib/rsmp/tlc/signal_group.rb +2 -2
- data/lib/rsmp/tlc/site_interface.rb +10 -0
- data/lib/rsmp/tlc/{traffic_controller_proxy.rb → supervisor_interface.rb} +19 -34
- data/lib/rsmp/tlc/traffic_controller.rb +10 -2
- data/lib/rsmp/tlc/traffic_controller_site.rb +4 -2
- data/lib/rsmp/tlc.rb +10 -0
- data/lib/rsmp/version.rb +1 -1
- data/lib/rsmp.rb +8 -1
- data/rsmp.gemspec +5 -5
- data/schemas/core/3.3.0/aggregated_status.json +25 -0
- data/schemas/core/3.3.0/aggregated_status_request.json +9 -0
- data/schemas/core/3.3.0/alarm.json +71 -0
- data/schemas/core/3.3.0/alarm_acknowledge.json +11 -0
- data/schemas/core/3.3.0/alarm_issue.json +44 -0
- data/schemas/core/3.3.0/alarm_request.json +3 -0
- data/schemas/core/3.3.0/alarm_suspend_resume.json +3 -0
- data/schemas/core/3.3.0/alarm_suspended_resumed.json +44 -0
- data/schemas/core/3.3.0/command_request.json +24 -0
- data/schemas/core/3.3.0/command_response.json +35 -0
- data/schemas/core/3.3.0/component_list.json +24 -0
- data/schemas/core/3.3.0/core.json +40 -0
- data/schemas/core/3.3.0/definitions.json +133 -0
- data/schemas/core/3.3.0/message_ack.json +11 -0
- data/schemas/core/3.3.0/message_not_ack.json +15 -0
- data/schemas/core/3.3.0/rsmp.json +142 -0
- data/schemas/core/3.3.0/status.json +21 -0
- data/schemas/core/3.3.0/status_request.json +5 -0
- data/schemas/core/3.3.0/status_response.json +41 -0
- data/schemas/core/3.3.0/status_subscribe.json +31 -0
- data/schemas/core/3.3.0/status_unsubscribe.json +5 -0
- data/schemas/core/3.3.0/status_update.json +41 -0
- data/schemas/core/3.3.0/version.json +144 -0
- data/schemas/core/3.3.0/watchdog.json +9 -0
- data/schemas/tlc/1.0.10/rsmp.json +2 -1
- data/schemas/tlc/1.0.10/sxl.yaml +1 -0
- data/schemas/tlc/1.0.10/sxl_index.json +356 -0
- data/schemas/tlc/1.0.13/rsmp.json +2 -1
- data/schemas/tlc/1.0.13/sxl.yaml +1 -0
- data/schemas/tlc/1.0.13/sxl_index.json +436 -0
- data/schemas/tlc/1.0.14/rsmp.json +2 -1
- data/schemas/tlc/1.0.14/sxl.yaml +1 -0
- data/schemas/tlc/1.0.14/sxl_index.json +468 -0
- data/schemas/tlc/1.0.15/rsmp.json +2 -1
- data/schemas/tlc/1.0.15/sxl.yaml +1 -0
- data/schemas/tlc/1.0.15/sxl_index.json +508 -0
- data/schemas/tlc/1.0.7/rsmp.json +2 -1
- data/schemas/tlc/1.0.7/sxl.yaml +1 -0
- data/schemas/tlc/1.0.7/sxl_index.json +356 -0
- data/schemas/tlc/1.0.8/rsmp.json +2 -1
- data/schemas/tlc/1.0.8/sxl.yaml +1 -0
- data/schemas/tlc/1.0.8/sxl_index.json +356 -0
- data/schemas/tlc/1.0.9/rsmp.json +2 -1
- data/schemas/tlc/1.0.9/sxl.yaml +1 -0
- data/schemas/tlc/1.0.9/sxl_index.json +356 -0
- data/schemas/tlc/1.1.0/rsmp.json +2 -1
- data/schemas/tlc/1.1.0/sxl.yaml +1 -0
- data/schemas/tlc/1.1.0/sxl_index.json +572 -0
- data/schemas/tlc/1.2.0/rsmp.json +2 -1
- data/schemas/tlc/1.2.0/sxl.yaml +1 -0
- data/schemas/tlc/1.2.0/sxl_index.json +571 -0
- data/schemas/tlc/1.2.1/rsmp.json +2 -1
- data/schemas/tlc/1.2.1/sxl.yaml +1 -0
- data/schemas/tlc/1.2.1/sxl_index.json +571 -0
- data/schemas/tlc/1.3.0/alarms/A0001.json +4 -0
- data/schemas/tlc/1.3.0/alarms/A0002.json +4 -0
- data/schemas/tlc/1.3.0/alarms/A0003.json +4 -0
- data/schemas/tlc/1.3.0/alarms/A0004.json +4 -0
- data/schemas/tlc/1.3.0/alarms/A0005.json +4 -0
- data/schemas/tlc/1.3.0/alarms/A0006.json +4 -0
- data/schemas/tlc/1.3.0/alarms/A0007.json +34 -0
- data/schemas/tlc/1.3.0/alarms/A0008.json +30 -0
- data/schemas/tlc/1.3.0/alarms/A0009.json +4 -0
- data/schemas/tlc/1.3.0/alarms/A0010.json +4 -0
- data/schemas/tlc/1.3.0/alarms/A0101.json +4 -0
- data/schemas/tlc/1.3.0/alarms/A0201.json +35 -0
- data/schemas/tlc/1.3.0/alarms/A0202.json +35 -0
- data/schemas/tlc/1.3.0/alarms/A0301.json +92 -0
- data/schemas/tlc/1.3.0/alarms/A0302.json +115 -0
- data/schemas/tlc/1.3.0/alarms/A0303.json +92 -0
- data/schemas/tlc/1.3.0/alarms/A0304.json +115 -0
- data/schemas/tlc/1.3.0/alarms/alarms.json +287 -0
- data/schemas/tlc/1.3.0/commands/M0001.json +92 -0
- data/schemas/tlc/1.3.0/commands/M0002.json +69 -0
- data/schemas/tlc/1.3.0/commands/M0003.json +69 -0
- data/schemas/tlc/1.3.0/commands/M0004.json +51 -0
- data/schemas/tlc/1.3.0/commands/M0005.json +69 -0
- data/schemas/tlc/1.3.0/commands/M0006.json +69 -0
- data/schemas/tlc/1.3.0/commands/M0007.json +51 -0
- data/schemas/tlc/1.3.0/commands/M0008.json +87 -0
- data/schemas/tlc/1.3.0/commands/M0010.json +51 -0
- data/schemas/tlc/1.3.0/commands/M0011.json +51 -0
- data/schemas/tlc/1.3.0/commands/M0012.json +51 -0
- data/schemas/tlc/1.3.0/commands/M0013.json +51 -0
- data/schemas/tlc/1.3.0/commands/M0014.json +69 -0
- data/schemas/tlc/1.3.0/commands/M0015.json +69 -0
- data/schemas/tlc/1.3.0/commands/M0016.json +51 -0
- data/schemas/tlc/1.3.0/commands/M0017.json +51 -0
- data/schemas/tlc/1.3.0/commands/M0018.json +69 -0
- data/schemas/tlc/1.3.0/commands/M0019.json +87 -0
- data/schemas/tlc/1.3.0/commands/M0020.json +87 -0
- data/schemas/tlc/1.3.0/commands/M0021.json +51 -0
- data/schemas/tlc/1.3.0/commands/M0022.json +249 -0
- data/schemas/tlc/1.3.0/commands/M0023.json +51 -0
- data/schemas/tlc/1.3.0/commands/M0024.json +33 -0
- data/schemas/tlc/1.3.0/commands/M0103.json +72 -0
- data/schemas/tlc/1.3.0/commands/M0104.json +141 -0
- data/schemas/tlc/1.3.0/commands/command_requests.json +8 -0
- data/schemas/tlc/1.3.0/commands/command_responses.json +8 -0
- data/schemas/tlc/1.3.0/commands/commands.json +415 -0
- data/schemas/tlc/1.3.0/defs/definitions.json +133 -0
- data/schemas/tlc/1.3.0/defs/guards.json +24 -0
- data/schemas/tlc/1.3.0/rsmp.json +75 -0
- data/schemas/tlc/1.3.0/statuses/S0001.json +109 -0
- data/schemas/tlc/1.3.0/statuses/S0002.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0003.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0004.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0005.json +72 -0
- data/schemas/tlc/1.3.0/statuses/S0006.json +54 -0
- data/schemas/tlc/1.3.0/statuses/S0007.json +73 -0
- data/schemas/tlc/1.3.0/statuses/S0008.json +73 -0
- data/schemas/tlc/1.3.0/statuses/S0009.json +73 -0
- data/schemas/tlc/1.3.0/statuses/S0010.json +73 -0
- data/schemas/tlc/1.3.0/statuses/S0011.json +73 -0
- data/schemas/tlc/1.3.0/statuses/S0012.json +73 -0
- data/schemas/tlc/1.3.0/statuses/S0013.json +54 -0
- data/schemas/tlc/1.3.0/statuses/S0014.json +55 -0
- data/schemas/tlc/1.3.0/statuses/S0015.json +55 -0
- data/schemas/tlc/1.3.0/statuses/S0016.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0017.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0018.json +61 -0
- data/schemas/tlc/1.3.0/statuses/S0019.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0020.json +54 -0
- data/schemas/tlc/1.3.0/statuses/S0021.json +37 -0
- data/schemas/tlc/1.3.0/statuses/S0022.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0023.json +37 -0
- data/schemas/tlc/1.3.0/statuses/S0024.json +37 -0
- data/schemas/tlc/1.3.0/statuses/S0025.json +162 -0
- data/schemas/tlc/1.3.0/statuses/S0026.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0027.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0028.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0029.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0030.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0031.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0032.json +73 -0
- data/schemas/tlc/1.3.0/statuses/S0033.json +77 -0
- data/schemas/tlc/1.3.0/statuses/S0034.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0035.json +49 -0
- data/schemas/tlc/1.3.0/statuses/S0091.json +40 -0
- data/schemas/tlc/1.3.0/statuses/S0092.json +40 -0
- data/schemas/tlc/1.3.0/statuses/S0095.json +36 -0
- data/schemas/tlc/1.3.0/statuses/S0096.json +126 -0
- data/schemas/tlc/1.3.0/statuses/S0097.json +54 -0
- data/schemas/tlc/1.3.0/statuses/S0098.json +72 -0
- data/schemas/tlc/1.3.0/statuses/S0201.json +54 -0
- data/schemas/tlc/1.3.0/statuses/S0202.json +54 -0
- data/schemas/tlc/1.3.0/statuses/S0203.json +54 -0
- data/schemas/tlc/1.3.0/statuses/S0204.json +198 -0
- data/schemas/tlc/1.3.0/statuses/S0205.json +54 -0
- data/schemas/tlc/1.3.0/statuses/S0206.json +54 -0
- data/schemas/tlc/1.3.0/statuses/S0207.json +54 -0
- data/schemas/tlc/1.3.0/statuses/S0208.json +198 -0
- data/schemas/tlc/1.3.0/statuses/statuses.json +787 -0
- data/schemas/tlc/1.3.0/sxl.yaml +2297 -0
- data/schemas/tlc/1.3.0/sxl_index.json +578 -0
- metadata +157 -15
- data/.github/copilot-instructions.md +0 -33
- data/.rspec +0 -1
- data/cucumber.yml +0 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a71c7f02cc5b94aa0b4d4f4b7ad87fbd0406c3b8cd1ceacfc7fa12aad6ccaba5
|
|
4
|
+
data.tar.gz: 7de215575f1e79a7494c629ae9211f86b31077586f348c12041590d70f859605
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5580aa1b51574cc1f81feb53040b44c8b540287e15f09a966c5dbb90ce16d54a67be73043a6882ae93075636163f0d7f72e181716fd95d691ade8d8e899b722e
|
|
7
|
+
data.tar.gz: e7aa473295a9ed35350f5ae4b04e114959f68322d1e19a6ef88ec8743b46af5b448b2e4a9dd2f9b95f531b719c5952af0e1bd73af88ebb63c896492777817eb5
|
data/.github/workflows/sus.yaml
CHANGED
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -658,4 +658,15 @@ Initial release.
|
|
|
658
658
|
- rsmp_schema folded into this gem
|
|
659
659
|
- all schema files vendored into this repo, with rake task to update them
|
|
660
660
|
- moved `rake regenerate` to `rsmp schema generate` CLI
|
|
661
|
-
|
|
661
|
+
|
|
662
|
+
## 0.43.1
|
|
663
|
+
- update gems
|
|
664
|
+
|
|
665
|
+
## 0.43.2
|
|
666
|
+
- maintenance release
|
|
667
|
+
|
|
668
|
+
## 0.45.0
|
|
669
|
+
- initial suport for core 3.3.0 and TLC SXL 1.3.0
|
|
670
|
+
- fix issues with config normalization
|
|
671
|
+
- make collector cancellation raise pending errors
|
|
672
|
+
- replace Cucumber/Aruba CLI tests with sus tests that call the Thor CLI directly
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,26 +1,19 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
rsmp (0.
|
|
5
|
-
async (~> 2.
|
|
4
|
+
rsmp (0.45.1)
|
|
5
|
+
async (~> 2.39)
|
|
6
6
|
colorize (~> 1.1)
|
|
7
|
-
io-endpoint (~> 0.
|
|
8
|
-
io-stream (~> 0.
|
|
7
|
+
io-endpoint (~> 0.17)
|
|
8
|
+
io-stream (~> 0.13)
|
|
9
9
|
json_schemer (~> 2.5)
|
|
10
|
-
logger (~> 1.
|
|
10
|
+
logger (~> 1.7)
|
|
11
11
|
ostruct (~> 0.6)
|
|
12
12
|
thor (~> 1.5)
|
|
13
13
|
|
|
14
14
|
GEM
|
|
15
15
|
remote: https://rubygems.org/
|
|
16
16
|
specs:
|
|
17
|
-
aruba (2.4.1)
|
|
18
|
-
bundler (>= 1.17)
|
|
19
|
-
contracts (>= 0.16.0, < 0.18.0)
|
|
20
|
-
cucumber (>= 8.0, < 12.0)
|
|
21
|
-
irb (~> 1.16)
|
|
22
|
-
rspec-expectations (>= 3.4, < 5.0)
|
|
23
|
-
thor (~> 1.0)
|
|
24
17
|
ast (2.4.3)
|
|
25
18
|
async (2.39.0)
|
|
26
19
|
console (~> 1.29)
|
|
@@ -29,60 +22,20 @@ GEM
|
|
|
29
22
|
metrics (~> 0.12)
|
|
30
23
|
traces (~> 0.18)
|
|
31
24
|
bigdecimal (4.1.2)
|
|
32
|
-
builder (3.3.0)
|
|
33
25
|
colorize (1.1.0)
|
|
34
|
-
console (1.
|
|
26
|
+
console (1.36.0)
|
|
35
27
|
fiber-annotation
|
|
36
28
|
fiber-local (~> 1.1)
|
|
37
29
|
json
|
|
38
|
-
contracts (0.17.3)
|
|
39
|
-
cucumber (9.2.1)
|
|
40
|
-
builder (~> 3.2)
|
|
41
|
-
cucumber-ci-environment (> 9, < 11)
|
|
42
|
-
cucumber-core (> 13, < 14)
|
|
43
|
-
cucumber-cucumber-expressions (~> 17.0)
|
|
44
|
-
cucumber-gherkin (> 24, < 28)
|
|
45
|
-
cucumber-html-formatter (> 20.3, < 22)
|
|
46
|
-
cucumber-messages (> 19, < 25)
|
|
47
|
-
diff-lcs (~> 1.5)
|
|
48
|
-
mini_mime (~> 1.1)
|
|
49
|
-
multi_test (~> 1.1)
|
|
50
|
-
sys-uname (~> 1.2)
|
|
51
|
-
cucumber-ci-environment (10.0.1)
|
|
52
|
-
cucumber-core (13.0.3)
|
|
53
|
-
cucumber-gherkin (>= 27, < 28)
|
|
54
|
-
cucumber-messages (>= 20, < 23)
|
|
55
|
-
cucumber-tag-expressions (> 5, < 7)
|
|
56
|
-
cucumber-cucumber-expressions (17.1.0)
|
|
57
|
-
bigdecimal
|
|
58
|
-
cucumber-gherkin (27.0.0)
|
|
59
|
-
cucumber-messages (>= 19.1.4, < 23)
|
|
60
|
-
cucumber-html-formatter (21.15.1)
|
|
61
|
-
cucumber-messages (> 19, < 28)
|
|
62
|
-
cucumber-messages (22.0.0)
|
|
63
|
-
cucumber-tag-expressions (6.1.2)
|
|
64
|
-
date (3.5.1)
|
|
65
|
-
diff-lcs (1.6.2)
|
|
66
|
-
erb (6.0.4)
|
|
67
|
-
ffi (1.17.4-arm64-darwin)
|
|
68
|
-
ffi (1.17.4-x64-mingw-ucrt)
|
|
69
|
-
ffi (1.17.4-x86_64-darwin)
|
|
70
|
-
ffi (1.17.4-x86_64-linux-gnu)
|
|
71
30
|
fiber-annotation (0.2.0)
|
|
72
31
|
fiber-local (1.1.0)
|
|
73
32
|
fiber-storage
|
|
74
33
|
fiber-storage (1.0.1)
|
|
75
34
|
hana (1.3.7)
|
|
76
|
-
io-console (0.8.2)
|
|
77
35
|
io-endpoint (0.17.2)
|
|
78
36
|
io-event (1.16.1)
|
|
79
37
|
io-stream (0.13.0)
|
|
80
|
-
|
|
81
|
-
pp (>= 0.6.0)
|
|
82
|
-
prism (>= 1.3.0)
|
|
83
|
-
rdoc (>= 4.0.0)
|
|
84
|
-
reline (>= 0.4.2)
|
|
85
|
-
json (2.19.7)
|
|
38
|
+
json (2.19.8)
|
|
86
39
|
json_schemer (2.5.0)
|
|
87
40
|
bigdecimal
|
|
88
41
|
hana (~> 1.3)
|
|
@@ -91,37 +44,18 @@ GEM
|
|
|
91
44
|
language_server-protocol (3.17.0.5)
|
|
92
45
|
lint_roller (1.1.0)
|
|
93
46
|
logger (1.7.0)
|
|
94
|
-
memoist3 (1.0.0)
|
|
95
47
|
metrics (0.15.0)
|
|
96
|
-
mini_mime (1.1.5)
|
|
97
|
-
multi_test (1.1.0)
|
|
98
48
|
ostruct (0.6.3)
|
|
99
49
|
parallel (2.1.0)
|
|
100
50
|
parser (3.3.11.1)
|
|
101
51
|
ast (~> 2.4.1)
|
|
102
52
|
racc
|
|
103
|
-
pp (0.6.3)
|
|
104
|
-
prettyprint
|
|
105
|
-
prettyprint (0.2.0)
|
|
106
53
|
prism (1.9.0)
|
|
107
|
-
psych (5.3.1)
|
|
108
|
-
date
|
|
109
|
-
stringio
|
|
110
54
|
racc (1.8.1)
|
|
111
55
|
rainbow (3.1.1)
|
|
112
56
|
rake (13.4.2)
|
|
113
|
-
rdoc (7.2.0)
|
|
114
|
-
erb
|
|
115
|
-
psych (>= 4.0.0)
|
|
116
|
-
tsort
|
|
117
57
|
regexp_parser (2.12.0)
|
|
118
|
-
|
|
119
|
-
io-console (~> 0.5)
|
|
120
|
-
rspec-expectations (3.13.5)
|
|
121
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
|
122
|
-
rspec-support (~> 3.13.0)
|
|
123
|
-
rspec-support (3.13.7)
|
|
124
|
-
rubocop (1.86.2)
|
|
58
|
+
rubocop (1.87.0)
|
|
125
59
|
json (~> 2.3)
|
|
126
60
|
language_server-protocol (~> 3.17.0.2)
|
|
127
61
|
lint_roller (~> 1.1.0)
|
|
@@ -140,26 +74,16 @@ GEM
|
|
|
140
74
|
rubocop (>= 1.72.1)
|
|
141
75
|
ruby-progressbar (1.13.0)
|
|
142
76
|
simpleidn (0.2.3)
|
|
143
|
-
|
|
144
|
-
sus (0.36.0)
|
|
77
|
+
sus (0.37.0)
|
|
145
78
|
sus-fixtures-async (0.2.0)
|
|
146
79
|
async
|
|
147
80
|
sus (~> 0.10)
|
|
148
|
-
sys-uname (1.5.1)
|
|
149
|
-
ffi (~> 1.1)
|
|
150
|
-
memoist3 (~> 1.0.0)
|
|
151
|
-
sys-uname (1.5.1-universal-mingw32)
|
|
152
|
-
ffi (~> 1.1)
|
|
153
|
-
memoist3 (~> 1.0.0)
|
|
154
|
-
win32ole
|
|
155
81
|
thor (1.5.0)
|
|
156
82
|
timecop (0.9.11)
|
|
157
83
|
traces (0.18.2)
|
|
158
|
-
tsort (0.2.0)
|
|
159
84
|
unicode-display_width (3.2.0)
|
|
160
85
|
unicode-emoji (~> 4.1)
|
|
161
86
|
unicode-emoji (4.2.0)
|
|
162
|
-
win32ole (1.9.3)
|
|
163
87
|
|
|
164
88
|
PLATFORMS
|
|
165
89
|
arm64-darwin-23
|
|
@@ -169,9 +93,7 @@ PLATFORMS
|
|
|
169
93
|
x86_64-linux
|
|
170
94
|
|
|
171
95
|
DEPENDENCIES
|
|
172
|
-
aruba (~> 2.3)
|
|
173
96
|
bundler (~> 4.0)
|
|
174
|
-
cucumber (~> 9.2)
|
|
175
97
|
rake (~> 13.2)
|
|
176
98
|
rsmp!
|
|
177
99
|
rubocop
|
|
@@ -181,4 +103,4 @@ DEPENDENCIES
|
|
|
181
103
|
timecop (~> 0.9)
|
|
182
104
|
|
|
183
105
|
BUNDLED WITH
|
|
184
|
-
4.0.
|
|
106
|
+
4.0.13
|
data/README.md
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
# rsmp
|
|
2
2
|
This is a Ruby implementation of the RSMP protocol, including:
|
|
3
3
|
- RSMP classes that can be used to build tests or other RSMP tools
|
|
4
|
-
- Command-line tools for quickly running RSMP supervisors or sites and
|
|
4
|
+
- Command-line tools for quickly running RSMP supervisors or sites and viewing exchanged messages
|
|
5
|
+
- Vendored RSMP Core and SXL JSON Schemas, including Core 3.3.0 and TLC SXL 1.3.0
|
|
5
6
|
|
|
6
7
|
## Installation
|
|
7
|
-
You need
|
|
8
|
+
You need Ruby 3.4 or later.
|
|
8
9
|
|
|
9
10
|
Install required gems:
|
|
10
11
|
|
|
@@ -62,19 +63,19 @@ Async do |task|
|
|
|
62
63
|
site = RSMP::Site.new(site_settings:settings)
|
|
63
64
|
site.start # run concurrently since we're inside an Async block
|
|
64
65
|
loop do
|
|
65
|
-
|
|
66
|
+
sleep 1 # sleep yields to other fibers inside Async
|
|
66
67
|
puts "Latest archive item: #{site.archive.items.last}"
|
|
67
68
|
end
|
|
68
69
|
end
|
|
69
70
|
```
|
|
70
71
|
|
|
71
|
-
Use task.show_hierarchy to see what task are created
|
|
72
|
+
Use task.show_hierarchy to see what task are created and task.stop() to stop all sites and supervisors running inside it:
|
|
72
73
|
|
|
73
74
|
```ruby
|
|
74
75
|
require 'rsmp'
|
|
75
76
|
Async do |task|
|
|
76
77
|
RSMP::Site.new.start
|
|
77
|
-
|
|
78
|
+
sleep 1
|
|
78
79
|
task.print_hierarchy
|
|
79
80
|
task.stop # stop everything inside this Async block
|
|
80
81
|
end
|
|
@@ -103,7 +104,7 @@ archive = RSMP::Archive.new
|
|
|
103
104
|
Async do |task|
|
|
104
105
|
RSMP::Supervisor.new(archive:archive,logger:logger).start
|
|
105
106
|
RSMP::Site.new(archive:archive,logger:logger).start
|
|
106
|
-
|
|
107
|
+
sleep 0.1
|
|
107
108
|
task.stop
|
|
108
109
|
end
|
|
109
110
|
|
|
@@ -124,7 +125,24 @@ RN+SU0001 RN+SI0001 --> f8c7 Received Version message for sites [RN+SI
|
|
|
124
125
|
```
|
|
125
126
|
|
|
126
127
|
### JSON Schema validation
|
|
127
|
-
All messages sent and received
|
|
128
|
+
All messages sent and received are validated against the vendored RSMP JSON Schemas maintained in
|
|
129
|
+
the RSMP Core and SXL source repositories.
|
|
130
|
+
|
|
131
|
+
Core and SXL schemas are selected with a flat map:
|
|
132
|
+
|
|
133
|
+
```ruby
|
|
134
|
+
RSMP::Schema.validate(message, {
|
|
135
|
+
core: '3.3.0',
|
|
136
|
+
tlc: '1.3.0'
|
|
137
|
+
})
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Sites and supervisors configure one or more SXLs with `sxls`:
|
|
141
|
+
|
|
142
|
+
```yaml
|
|
143
|
+
sxls:
|
|
144
|
+
tlc: '1.3.0'
|
|
145
|
+
```
|
|
128
146
|
|
|
129
147
|
## Command-line tool
|
|
130
148
|
Tools for easily running RSMP supervisors and sites. The binary is called ```rsmp```.
|
|
@@ -166,36 +184,13 @@ Use ```--help <command>``` to get a list of available options.
|
|
|
166
184
|
Use ```--config <path>``` or ```--options <path>``` to point to a .yaml config file, controlling things like IP adresses, ports, and log output. Examples of config files can be found the folder ```config/```.
|
|
167
185
|
|
|
168
186
|
## Tests
|
|
169
|
-
###
|
|
170
|
-
|
|
187
|
+
### Sus
|
|
188
|
+
Sus tests are located in test/. Some tests start supervisors and sites to test communication, but will do so on port 13111, rather than the usual port 12111, to avoid interference with other RSMP processes running locally. CLI tests call the Thor CLI class directly, without spawning a separate `rsmp` process.
|
|
171
189
|
|
|
172
|
-
Note that these tests are NOT
|
|
190
|
+
Note that these tests are NOT intended for testing external equipment or systems. The tests are for validating the code in this repository. To test external equipment or systems use the rsmp_validator tool.
|
|
173
191
|
|
|
174
192
|
```console
|
|
175
|
-
$
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
Finished in 0.12746 seconds (files took 0.6571 seconds to load)
|
|
179
|
-
25 examples, 0 failures
|
|
193
|
+
$ bundle exec sus
|
|
194
|
+
301 passed out of 301 total (830 assertions)
|
|
180
195
|
|
|
181
196
|
```
|
|
182
|
-
|
|
183
|
-
# Cucumber
|
|
184
|
-
Cucumber is used to test the CLI binaries.
|
|
185
|
-
|
|
186
|
-
```console
|
|
187
|
-
$ cucumber
|
|
188
|
-
Feature: Help
|
|
189
|
-
|
|
190
|
-
Scenario: Displaying help # features/help.feature:3
|
|
191
|
-
When I run `rsmp help` # aruba-0.14.11/lib/aruba/cucumber/command.rb:6
|
|
192
|
-
Then it should pass with "Commands:" # aruba-0.14.11/lib/aruba/cucumber/command.rb:271
|
|
193
|
-
|
|
194
|
-
Feature: Run site
|
|
195
|
-
...
|
|
196
|
-
|
|
197
|
-
7 scenarios (7 passed)
|
|
198
|
-
28 steps (28 passed)
|
|
199
|
-
0m7.036s
|
|
200
|
-
```
|
|
201
|
-
|
data/Rakefile
CHANGED
|
@@ -4,8 +4,8 @@ task :test do
|
|
|
4
4
|
sh 'bundle exec sus'
|
|
5
5
|
end
|
|
6
6
|
|
|
7
|
-
CORE_VERSIONS = %w[3.1.2 3.1.3 3.1.4 3.1.5 3.2.0 3.2.1 3.2.2].freeze
|
|
8
|
-
TLC_VERSIONS = %w[1.0.7 1.0.8 1.0.9 1.0.10 1.0.13 1.0.14 1.0.15 1.1.0 1.2.0 1.2.1].freeze
|
|
7
|
+
CORE_VERSIONS = %w[3.1.2 3.1.3 3.1.4 3.1.5 3.2.0 3.2.1 3.2.2 3.3.0].freeze
|
|
8
|
+
TLC_VERSIONS = %w[1.0.7 1.0.8 1.0.9 1.0.10 1.0.13 1.0.14 1.0.15 1.1.0 1.2.0 1.2.1 1.3.0].freeze
|
|
9
9
|
|
|
10
10
|
# Update vendored schemas from source repos.
|
|
11
11
|
# Usage: rake schemas:update[/path/to/rsmp_core,/path/to/rsmp_sxl_traffic_lights]
|
data/config/supervisor.yaml
CHANGED
data/config/tlc.yaml
CHANGED
|
@@ -41,8 +41,8 @@ site_id: RN+SI0001
|
|
|
41
41
|
supervisors:
|
|
42
42
|
- ip: 127.0.0.1
|
|
43
43
|
port: 12111
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
sxls:
|
|
45
|
+
tlc: "1.3.0"
|
|
46
46
|
components:
|
|
47
47
|
main:
|
|
48
48
|
TC:
|
|
@@ -55,7 +55,8 @@ log:
|
|
|
55
55
|
```yaml
|
|
56
56
|
port: 12111
|
|
57
57
|
default:
|
|
58
|
-
|
|
58
|
+
sxls:
|
|
59
|
+
tlc: "1.3.0"
|
|
59
60
|
intervals:
|
|
60
61
|
timer: 0.1
|
|
61
62
|
watchdog: 0.1
|
|
@@ -63,8 +64,8 @@ log:
|
|
|
63
64
|
json: true
|
|
64
65
|
sites:
|
|
65
66
|
TLC001:
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
sxls:
|
|
68
|
+
tlc: "1.3.0"
|
|
68
69
|
intervals:
|
|
69
70
|
timer: 0.1
|
|
70
71
|
watchdog: 0.1
|
|
@@ -76,7 +77,7 @@ sites:
|
|
|
76
77
|
TC:
|
|
77
78
|
```
|
|
78
79
|
|
|
79
|
-
Per-site configuration follows the supervisor-side site schema (`lib/rsmp/options/schemas/supervisor_site.json`). Each site entry
|
|
80
|
+
Per-site configuration follows the supervisor-side site schema (`lib/rsmp/options/schemas/supervisor_site.json`). Each site entry can define an `sxls` map, or inherit it from `default`. The SXL name `core` is reserved for the RSMP core schema and cannot be used as an SXL key.
|
|
80
81
|
|
|
81
82
|
## Supervisor settings
|
|
82
83
|
|
|
@@ -90,8 +91,8 @@ Top-level supervisor settings
|
|
|
90
91
|
- `site_id`: string — optional site identifier for the supervisor itself.
|
|
91
92
|
- `max_sites`: integer — limit concurrent connected sites.
|
|
92
93
|
- `default`: object — default settings applied to sites that don't have a specific `sites` entry. Contains keys:
|
|
93
|
-
- `
|
|
94
|
-
- `
|
|
94
|
+
- `sxls`: object — default SXL versions for default sites, for example `{ "tlc": "1.3.0" }`.
|
|
95
|
+
- `core_version`: string for the accepted RSMP Core version.
|
|
95
96
|
- `intervals`: object with `timer`, `watchdog` (numbers, seconds).
|
|
96
97
|
- `timeouts`: object with `watchdog`, `acknowledgement` (numbers, seconds).
|
|
97
98
|
- `log`: object — log settings (see `log_settings` elsewhere in docs).
|
|
@@ -101,13 +102,13 @@ Top-level supervisor settings
|
|
|
101
102
|
|
|
102
103
|
Each key under `sites` is a site id (for example `TLC001`) and the value is the supervisor-side configuration for that site. These settings tell the supervisor how to handle incoming connections from that specific site (which SXL/schema to use, per-site timeouts, component layout, etc.). Per-site configuration follows the supervisor-side schema at `lib/rsmp/options/schemas/supervisor_site.json`.
|
|
103
104
|
|
|
104
|
-
If a connecting site's id is not present under `sites`, the supervisor will fall back to the `default` settings. The runtime configuration check will raise `RSMP::ConfigurationError` if
|
|
105
|
+
If a connecting site's id is not present under `sites`, the supervisor will fall back to the `default` settings. The runtime configuration check will raise `RSMP::ConfigurationError` if neither the site entry nor the default settings provide usable SXL information.
|
|
105
106
|
|
|
106
107
|
|
|
107
108
|
Common per-site keys
|
|
108
109
|
|
|
109
|
-
- `
|
|
110
|
-
- `
|
|
110
|
+
- `sxls` (object): SXL versions to use for this site, keyed by SXL name, for example `tlc: "1.3.0"`. The supervisor will attempt to load the corresponding schemas for these SXLs.
|
|
111
|
+
- `core_version` (string): accepted RSMP Core version for this site.
|
|
111
112
|
- `type` (string): optional human-readable type identifier.
|
|
112
113
|
- `site_id` (string): explicit site identifier (if different from the mapping key).
|
|
113
114
|
- `supervisors` (array): list of supervisor endpoints (objects with `ip` and `port`). Useful for reverse mappings or local-site configs.
|
|
@@ -4,7 +4,7 @@ Proxy - - Distributor --> Receivers
|
|
|
4
4
|
|
|
5
5
|
A proxy distributes messages to receivers, when they are installed.
|
|
6
6
|
|
|
7
|
-
Collectors are special
|
|
7
|
+
Collectors are special receivers that wait for specific messages, and are used to implement methods for waiting for RSMP responses, statuses, alarms, etc.
|
|
8
8
|
|
|
9
9
|
Note that Archive is not a receiver, and does not receive messages via the Distributor. Instead the Archive gets and stores messages via the log() interface in the Logging module. The reason is that the items that the Archive and the Logger contain other data as well as the message, like error messages, warnings, text descriptions, colors codes, etc. The Distributor and Receiver handles only Message objects.
|
|
10
10
|
|
|
@@ -20,4 +20,3 @@ the client receives the collection.
|
|
|
20
20
|
|
|
21
21
|
## Proxy
|
|
22
22
|
A proxy includes the Distributor module and distributes each message to receivers after processing it.
|
|
23
|
-
|
data/documentation/tasks.md
CHANGED
|
@@ -145,5 +145,4 @@ If you mark an Async task with `transient: true` when you created it, that task
|
|
|
145
145
|
|
|
146
146
|
Transient tasks can be used to cleanup, but using an `ensure` block in the transient task. When you call `stop` on a task, an Async::Stop exception is raised, which will run the code in the `ensure` block.
|
|
147
147
|
|
|
148
|
-
Some
|
|
149
|
-
|
|
148
|
+
Some sus tests run in transient tasks. As soon as the main test code is complete, any subtasks like Sites or Supervisors that might otherwise prevent the test from completing will be stopped automatically.
|
data/exe/rsmp
CHANGED
data/lib/rsmp/cli.rb
CHANGED
|
@@ -44,6 +44,9 @@ module RSMP
|
|
|
44
44
|
run_site(site_class, settings, log_settings)
|
|
45
45
|
rescue Interrupt
|
|
46
46
|
# ctrl-c
|
|
47
|
+
rescue RSMP::ConfigurationError => e
|
|
48
|
+
puts "Error: #{e}"
|
|
49
|
+
exit 1
|
|
47
50
|
rescue StandardError => e
|
|
48
51
|
puts "Uncaught error: #{e}"
|
|
49
52
|
puts caller.join("\n")
|
|
@@ -75,7 +78,7 @@ module RSMP
|
|
|
75
78
|
return [settings, log_settings] unless options[:config]
|
|
76
79
|
|
|
77
80
|
begin
|
|
78
|
-
options_object =
|
|
81
|
+
options_object = site_options_class.load_file(options[:config])
|
|
79
82
|
settings = options_object.to_h
|
|
80
83
|
log_settings = log_settings.deep_merge(options_object.log_settings)
|
|
81
84
|
rescue RSMP::ConfigurationError => e
|
|
@@ -89,6 +92,15 @@ module RSMP
|
|
|
89
92
|
|
|
90
93
|
private
|
|
91
94
|
|
|
95
|
+
def site_options_class
|
|
96
|
+
case site_type
|
|
97
|
+
when 'tlc'
|
|
98
|
+
RSMP::TLC::TrafficControllerSite::Options
|
|
99
|
+
else
|
|
100
|
+
RSMP::Site::Options
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
92
104
|
def apply_site_options(settings, log_settings)
|
|
93
105
|
apply_basic_site_options(settings)
|
|
94
106
|
parse_supervisors(settings) if options[:supervisors]
|
|
@@ -98,30 +110,72 @@ module RSMP
|
|
|
98
110
|
def apply_basic_site_options(settings)
|
|
99
111
|
settings['site_id'] = options[:id] if options[:id]
|
|
100
112
|
settings['core_version'] = options[:core] || ENV['CORE_VERSION'] if options[:core] || ENV['CORE_VERSION']
|
|
101
|
-
settings['
|
|
113
|
+
settings['sxls'] = parse_sxls(ENV['SXLS']) if ENV['SXLS']
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def parse_sxls(value)
|
|
117
|
+
value.split(',').each_with_object({}) do |item, memo|
|
|
118
|
+
parts = item.split(':')
|
|
119
|
+
unless parts.length == 2
|
|
120
|
+
raise RSMP::ConfigurationError, "Invalid SXLS item #{item.inspect}, expected name:version"
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
name, version = parts
|
|
124
|
+
memo[name] = version
|
|
125
|
+
end
|
|
102
126
|
end
|
|
103
127
|
|
|
104
128
|
def parse_supervisors(settings)
|
|
129
|
+
default_port = default_supervisor_port(settings)
|
|
105
130
|
settings['supervisors'] = []
|
|
106
131
|
options[:supervisors].split(',').each do |supervisor|
|
|
107
|
-
ip, port = supervisor
|
|
108
|
-
ip = '127.0.0.1' if ip.empty?
|
|
109
|
-
port = '12111' if port.empty?
|
|
132
|
+
ip, port = parse_supervisor(supervisor, default_port)
|
|
110
133
|
settings['supervisors'] << { 'ip' => ip, 'port' => port }
|
|
111
134
|
end
|
|
112
135
|
end
|
|
113
136
|
|
|
137
|
+
def parse_supervisor(supervisor, default_port)
|
|
138
|
+
parts = supervisor.split(':', -1)
|
|
139
|
+
|
|
140
|
+
case parts.size
|
|
141
|
+
when 1
|
|
142
|
+
ip = parts.first
|
|
143
|
+
port = default_port
|
|
144
|
+
when 2
|
|
145
|
+
ip, port = parts
|
|
146
|
+
else
|
|
147
|
+
raise RSMP::ConfigurationError,
|
|
148
|
+
"Invalid supervisor #{supervisor.inspect}, expected ip[:port]"
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
if port.nil? || port.to_s.empty?
|
|
152
|
+
raise RSMP::ConfigurationError,
|
|
153
|
+
"Invalid supervisor #{supervisor.inspect}, expected ip[:port] with a non-empty port"
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
ip = '127.0.0.1' if ip.empty?
|
|
157
|
+
[ip, port]
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def default_supervisor_port(settings)
|
|
161
|
+
settings.dig('supervisors', 0, 'port') ||
|
|
162
|
+
site_options_class.new.to_h.dig('supervisors', 0, 'port')
|
|
163
|
+
end
|
|
164
|
+
|
|
114
165
|
def determine_site_class(settings)
|
|
115
|
-
site_type
|
|
116
|
-
case site_type
|
|
166
|
+
case site_type(settings)
|
|
117
167
|
when 'tlc'
|
|
118
168
|
RSMP::TLC::TrafficControllerSite
|
|
119
169
|
else
|
|
120
|
-
puts "Error: Unknown site type #{site_type}"
|
|
170
|
+
puts "Error: Unknown site type #{site_type(settings)}"
|
|
121
171
|
exit
|
|
122
172
|
end
|
|
123
173
|
end
|
|
124
174
|
|
|
175
|
+
def site_type(settings = nil)
|
|
176
|
+
options[:type] || settings&.fetch('type', nil)
|
|
177
|
+
end
|
|
178
|
+
|
|
125
179
|
def run_site(site_class, settings, log_settings)
|
|
126
180
|
Async do |task|
|
|
127
181
|
task.annotate 'cli'
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
module RSMP
|
|
2
2
|
# RSMP component
|
|
3
3
|
class Component < ComponentBase
|
|
4
|
-
def initialize(node:, id:, ntsoid: nil, xnid: nil, grouped: false)
|
|
5
|
-
super
|
|
6
|
-
end
|
|
7
|
-
|
|
8
4
|
def handle_command(command_code, _arg)
|
|
9
5
|
raise UnknownCommand, "Command #{command_code} not implemented by #{self.class}"
|
|
10
6
|
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module RSMP
|
|
2
2
|
# RSMP component base class.
|
|
3
3
|
class ComponentBase
|
|
4
|
-
attr_reader :c_id, :ntsoid, :xnid, :node, :alarms, :statuses,
|
|
4
|
+
attr_reader :c_id, :component_type, :name, :ntsoid, :xnid, :node, :alarms, :statuses,
|
|
5
5
|
:aggregated_status, :aggregated_status_bools, :grouped
|
|
6
6
|
|
|
7
7
|
AGGREGATED_STATUS_KEYS = %i[local_control
|
|
@@ -13,13 +13,21 @@ module RSMP
|
|
|
13
13
|
rest
|
|
14
14
|
not_connected].freeze
|
|
15
15
|
|
|
16
|
-
def initialize(node:, id:,
|
|
16
|
+
def initialize(node:, id:, **attributes)
|
|
17
|
+
type = attributes[:type]
|
|
18
|
+
name = attributes[:name]
|
|
19
|
+
ntsoid = attributes[:ntsoid]
|
|
20
|
+
xnid = attributes[:xnid]
|
|
21
|
+
grouped = attributes.fetch(:grouped, false)
|
|
22
|
+
|
|
17
23
|
if grouped == false && (ntsoid || xnid)
|
|
18
24
|
raise RSMP::ConfigurationError,
|
|
19
25
|
'ntsoid and xnid are only allowed for grouped objects'
|
|
20
26
|
end
|
|
21
27
|
|
|
22
28
|
@c_id = id
|
|
29
|
+
@component_type = type
|
|
30
|
+
@name = name || id
|
|
23
31
|
@ntsoid = ntsoid
|
|
24
32
|
@xnid = xnid
|
|
25
33
|
@node = node
|
|
@@ -32,6 +40,11 @@ module RSMP
|
|
|
32
40
|
"#<#{self.class.name}:#{object_id}:#{object_id} c_id:#{@c_id}>"
|
|
33
41
|
end
|
|
34
42
|
|
|
43
|
+
def update_metadata(type: nil, name: nil)
|
|
44
|
+
@component_type = type if type
|
|
45
|
+
@name = name if name
|
|
46
|
+
end
|
|
47
|
+
|
|
35
48
|
def now
|
|
36
49
|
node.now
|
|
37
50
|
end
|