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.
Files changed (222) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rubocop.yaml +1 -1
  3. data/.github/workflows/sus.yaml +1 -1
  4. data/.gitignore +0 -1
  5. data/CHANGELOG.md +12 -1
  6. data/Gemfile +0 -2
  7. data/Gemfile.lock +10 -88
  8. data/README.md +30 -35
  9. data/Rakefile +2 -2
  10. data/config/supervisor.yaml +2 -1
  11. data/config/tlc.yaml +2 -2
  12. data/documentation/configuration.md +12 -11
  13. data/documentation/message_distribution.md +1 -2
  14. data/documentation/tasks.md +1 -2
  15. data/exe/rsmp +1 -2
  16. data/lib/rsmp/cli.rb +62 -8
  17. data/lib/rsmp/component/component.rb +0 -4
  18. data/lib/rsmp/component/component_base.rb +15 -2
  19. data/lib/rsmp/component/component_proxy.rb +1 -1
  20. data/lib/rsmp/component/components.rb +22 -1
  21. data/lib/rsmp/convert/export/json_schema/outputs.rb +19 -0
  22. data/lib/rsmp/convert/export/json_schema/values.rb +7 -5
  23. data/lib/rsmp/convert/export/json_schema.rb +15 -3
  24. data/lib/rsmp/helpers/deep_merge.rb +2 -2
  25. data/lib/rsmp/message.rb +32 -0
  26. data/lib/rsmp/node/site/site.rb +34 -10
  27. data/lib/rsmp/node/supervisor/modules/configuration.rb +32 -5
  28. data/lib/rsmp/node/supervisor/modules/connection.rb +0 -2
  29. data/lib/rsmp/node/supervisor/supervisor.rb +0 -7
  30. data/lib/rsmp/options/options.rb +55 -6
  31. data/lib/rsmp/options/schemas/site.json +6 -3
  32. data/lib/rsmp/options/schemas/supervisor.json +5 -2
  33. data/lib/rsmp/options/schemas/supervisor_site.json +5 -2
  34. data/lib/rsmp/options/site_options.rb +3 -2
  35. data/lib/rsmp/options/supervisor_options.rb +3 -1
  36. data/lib/rsmp/proxy/modules/acknowledgements.rb +2 -0
  37. data/lib/rsmp/proxy/modules/receive.rb +5 -2
  38. data/lib/rsmp/proxy/modules/state.rb +1 -0
  39. data/lib/rsmp/proxy/modules/versions.rb +90 -15
  40. data/lib/rsmp/proxy/proxy.rb +52 -3
  41. data/lib/rsmp/proxy/site/modules/status.rb +5 -3
  42. data/lib/rsmp/proxy/site/site_proxy.rb +68 -35
  43. data/lib/rsmp/proxy/site/sxl_selection.rb +54 -0
  44. data/lib/rsmp/proxy/supervisor/supervisor_proxy.rb +54 -18
  45. data/lib/rsmp/schema/core_sxl_resolution.rb +69 -0
  46. data/lib/rsmp/schema/message_resolution.rb +104 -0
  47. data/lib/rsmp/schema/validation.rb +57 -0
  48. data/lib/rsmp/schema.rb +87 -32
  49. data/lib/rsmp/schema_error.rb +7 -1
  50. data/lib/rsmp/sxl/interface.rb +48 -0
  51. data/lib/rsmp/sxl/registry.rb +55 -0
  52. data/lib/rsmp/sxl/site_interface.rb +10 -0
  53. data/lib/rsmp/sxl/supervisor_interface.rb +21 -0
  54. data/lib/rsmp/tlc/detector_logic.rb +2 -2
  55. data/lib/rsmp/tlc/signal_group.rb +2 -2
  56. data/lib/rsmp/tlc/site_interface.rb +10 -0
  57. data/lib/rsmp/tlc/{traffic_controller_proxy.rb → supervisor_interface.rb} +19 -34
  58. data/lib/rsmp/tlc/traffic_controller.rb +10 -2
  59. data/lib/rsmp/tlc/traffic_controller_site.rb +4 -2
  60. data/lib/rsmp/tlc.rb +10 -0
  61. data/lib/rsmp/version.rb +1 -1
  62. data/lib/rsmp.rb +8 -1
  63. data/rsmp.gemspec +5 -5
  64. data/schemas/core/3.3.0/aggregated_status.json +25 -0
  65. data/schemas/core/3.3.0/aggregated_status_request.json +9 -0
  66. data/schemas/core/3.3.0/alarm.json +71 -0
  67. data/schemas/core/3.3.0/alarm_acknowledge.json +11 -0
  68. data/schemas/core/3.3.0/alarm_issue.json +44 -0
  69. data/schemas/core/3.3.0/alarm_request.json +3 -0
  70. data/schemas/core/3.3.0/alarm_suspend_resume.json +3 -0
  71. data/schemas/core/3.3.0/alarm_suspended_resumed.json +44 -0
  72. data/schemas/core/3.3.0/command_request.json +24 -0
  73. data/schemas/core/3.3.0/command_response.json +35 -0
  74. data/schemas/core/3.3.0/component_list.json +24 -0
  75. data/schemas/core/3.3.0/core.json +40 -0
  76. data/schemas/core/3.3.0/definitions.json +133 -0
  77. data/schemas/core/3.3.0/message_ack.json +11 -0
  78. data/schemas/core/3.3.0/message_not_ack.json +15 -0
  79. data/schemas/core/3.3.0/rsmp.json +142 -0
  80. data/schemas/core/3.3.0/status.json +21 -0
  81. data/schemas/core/3.3.0/status_request.json +5 -0
  82. data/schemas/core/3.3.0/status_response.json +41 -0
  83. data/schemas/core/3.3.0/status_subscribe.json +31 -0
  84. data/schemas/core/3.3.0/status_unsubscribe.json +5 -0
  85. data/schemas/core/3.3.0/status_update.json +41 -0
  86. data/schemas/core/3.3.0/version.json +144 -0
  87. data/schemas/core/3.3.0/watchdog.json +9 -0
  88. data/schemas/tlc/1.0.10/rsmp.json +2 -1
  89. data/schemas/tlc/1.0.10/sxl.yaml +1 -0
  90. data/schemas/tlc/1.0.10/sxl_index.json +356 -0
  91. data/schemas/tlc/1.0.13/rsmp.json +2 -1
  92. data/schemas/tlc/1.0.13/sxl.yaml +1 -0
  93. data/schemas/tlc/1.0.13/sxl_index.json +436 -0
  94. data/schemas/tlc/1.0.14/rsmp.json +2 -1
  95. data/schemas/tlc/1.0.14/sxl.yaml +1 -0
  96. data/schemas/tlc/1.0.14/sxl_index.json +468 -0
  97. data/schemas/tlc/1.0.15/rsmp.json +2 -1
  98. data/schemas/tlc/1.0.15/sxl.yaml +1 -0
  99. data/schemas/tlc/1.0.15/sxl_index.json +508 -0
  100. data/schemas/tlc/1.0.7/rsmp.json +2 -1
  101. data/schemas/tlc/1.0.7/sxl.yaml +1 -0
  102. data/schemas/tlc/1.0.7/sxl_index.json +356 -0
  103. data/schemas/tlc/1.0.8/rsmp.json +2 -1
  104. data/schemas/tlc/1.0.8/sxl.yaml +1 -0
  105. data/schemas/tlc/1.0.8/sxl_index.json +356 -0
  106. data/schemas/tlc/1.0.9/rsmp.json +2 -1
  107. data/schemas/tlc/1.0.9/sxl.yaml +1 -0
  108. data/schemas/tlc/1.0.9/sxl_index.json +356 -0
  109. data/schemas/tlc/1.1.0/rsmp.json +2 -1
  110. data/schemas/tlc/1.1.0/sxl.yaml +1 -0
  111. data/schemas/tlc/1.1.0/sxl_index.json +572 -0
  112. data/schemas/tlc/1.2.0/rsmp.json +2 -1
  113. data/schemas/tlc/1.2.0/sxl.yaml +1 -0
  114. data/schemas/tlc/1.2.0/sxl_index.json +571 -0
  115. data/schemas/tlc/1.2.1/rsmp.json +2 -1
  116. data/schemas/tlc/1.2.1/sxl.yaml +1 -0
  117. data/schemas/tlc/1.2.1/sxl_index.json +571 -0
  118. data/schemas/tlc/1.3.0/alarms/A0001.json +4 -0
  119. data/schemas/tlc/1.3.0/alarms/A0002.json +4 -0
  120. data/schemas/tlc/1.3.0/alarms/A0003.json +4 -0
  121. data/schemas/tlc/1.3.0/alarms/A0004.json +4 -0
  122. data/schemas/tlc/1.3.0/alarms/A0005.json +4 -0
  123. data/schemas/tlc/1.3.0/alarms/A0006.json +4 -0
  124. data/schemas/tlc/1.3.0/alarms/A0007.json +34 -0
  125. data/schemas/tlc/1.3.0/alarms/A0008.json +30 -0
  126. data/schemas/tlc/1.3.0/alarms/A0009.json +4 -0
  127. data/schemas/tlc/1.3.0/alarms/A0010.json +4 -0
  128. data/schemas/tlc/1.3.0/alarms/A0101.json +4 -0
  129. data/schemas/tlc/1.3.0/alarms/A0201.json +35 -0
  130. data/schemas/tlc/1.3.0/alarms/A0202.json +35 -0
  131. data/schemas/tlc/1.3.0/alarms/A0301.json +92 -0
  132. data/schemas/tlc/1.3.0/alarms/A0302.json +115 -0
  133. data/schemas/tlc/1.3.0/alarms/A0303.json +92 -0
  134. data/schemas/tlc/1.3.0/alarms/A0304.json +115 -0
  135. data/schemas/tlc/1.3.0/alarms/alarms.json +287 -0
  136. data/schemas/tlc/1.3.0/commands/M0001.json +92 -0
  137. data/schemas/tlc/1.3.0/commands/M0002.json +69 -0
  138. data/schemas/tlc/1.3.0/commands/M0003.json +69 -0
  139. data/schemas/tlc/1.3.0/commands/M0004.json +51 -0
  140. data/schemas/tlc/1.3.0/commands/M0005.json +69 -0
  141. data/schemas/tlc/1.3.0/commands/M0006.json +69 -0
  142. data/schemas/tlc/1.3.0/commands/M0007.json +51 -0
  143. data/schemas/tlc/1.3.0/commands/M0008.json +87 -0
  144. data/schemas/tlc/1.3.0/commands/M0010.json +51 -0
  145. data/schemas/tlc/1.3.0/commands/M0011.json +51 -0
  146. data/schemas/tlc/1.3.0/commands/M0012.json +51 -0
  147. data/schemas/tlc/1.3.0/commands/M0013.json +51 -0
  148. data/schemas/tlc/1.3.0/commands/M0014.json +69 -0
  149. data/schemas/tlc/1.3.0/commands/M0015.json +69 -0
  150. data/schemas/tlc/1.3.0/commands/M0016.json +51 -0
  151. data/schemas/tlc/1.3.0/commands/M0017.json +51 -0
  152. data/schemas/tlc/1.3.0/commands/M0018.json +69 -0
  153. data/schemas/tlc/1.3.0/commands/M0019.json +87 -0
  154. data/schemas/tlc/1.3.0/commands/M0020.json +87 -0
  155. data/schemas/tlc/1.3.0/commands/M0021.json +51 -0
  156. data/schemas/tlc/1.3.0/commands/M0022.json +249 -0
  157. data/schemas/tlc/1.3.0/commands/M0023.json +51 -0
  158. data/schemas/tlc/1.3.0/commands/M0024.json +33 -0
  159. data/schemas/tlc/1.3.0/commands/M0103.json +72 -0
  160. data/schemas/tlc/1.3.0/commands/M0104.json +141 -0
  161. data/schemas/tlc/1.3.0/commands/command_requests.json +8 -0
  162. data/schemas/tlc/1.3.0/commands/command_responses.json +8 -0
  163. data/schemas/tlc/1.3.0/commands/commands.json +415 -0
  164. data/schemas/tlc/1.3.0/defs/definitions.json +133 -0
  165. data/schemas/tlc/1.3.0/defs/guards.json +24 -0
  166. data/schemas/tlc/1.3.0/rsmp.json +75 -0
  167. data/schemas/tlc/1.3.0/statuses/S0001.json +109 -0
  168. data/schemas/tlc/1.3.0/statuses/S0002.json +36 -0
  169. data/schemas/tlc/1.3.0/statuses/S0003.json +36 -0
  170. data/schemas/tlc/1.3.0/statuses/S0004.json +36 -0
  171. data/schemas/tlc/1.3.0/statuses/S0005.json +72 -0
  172. data/schemas/tlc/1.3.0/statuses/S0006.json +54 -0
  173. data/schemas/tlc/1.3.0/statuses/S0007.json +73 -0
  174. data/schemas/tlc/1.3.0/statuses/S0008.json +73 -0
  175. data/schemas/tlc/1.3.0/statuses/S0009.json +73 -0
  176. data/schemas/tlc/1.3.0/statuses/S0010.json +73 -0
  177. data/schemas/tlc/1.3.0/statuses/S0011.json +73 -0
  178. data/schemas/tlc/1.3.0/statuses/S0012.json +73 -0
  179. data/schemas/tlc/1.3.0/statuses/S0013.json +54 -0
  180. data/schemas/tlc/1.3.0/statuses/S0014.json +55 -0
  181. data/schemas/tlc/1.3.0/statuses/S0015.json +55 -0
  182. data/schemas/tlc/1.3.0/statuses/S0016.json +36 -0
  183. data/schemas/tlc/1.3.0/statuses/S0017.json +36 -0
  184. data/schemas/tlc/1.3.0/statuses/S0018.json +61 -0
  185. data/schemas/tlc/1.3.0/statuses/S0019.json +36 -0
  186. data/schemas/tlc/1.3.0/statuses/S0020.json +54 -0
  187. data/schemas/tlc/1.3.0/statuses/S0021.json +37 -0
  188. data/schemas/tlc/1.3.0/statuses/S0022.json +36 -0
  189. data/schemas/tlc/1.3.0/statuses/S0023.json +37 -0
  190. data/schemas/tlc/1.3.0/statuses/S0024.json +37 -0
  191. data/schemas/tlc/1.3.0/statuses/S0025.json +162 -0
  192. data/schemas/tlc/1.3.0/statuses/S0026.json +36 -0
  193. data/schemas/tlc/1.3.0/statuses/S0027.json +36 -0
  194. data/schemas/tlc/1.3.0/statuses/S0028.json +36 -0
  195. data/schemas/tlc/1.3.0/statuses/S0029.json +36 -0
  196. data/schemas/tlc/1.3.0/statuses/S0030.json +36 -0
  197. data/schemas/tlc/1.3.0/statuses/S0031.json +36 -0
  198. data/schemas/tlc/1.3.0/statuses/S0032.json +73 -0
  199. data/schemas/tlc/1.3.0/statuses/S0033.json +77 -0
  200. data/schemas/tlc/1.3.0/statuses/S0034.json +36 -0
  201. data/schemas/tlc/1.3.0/statuses/S0035.json +49 -0
  202. data/schemas/tlc/1.3.0/statuses/S0091.json +40 -0
  203. data/schemas/tlc/1.3.0/statuses/S0092.json +40 -0
  204. data/schemas/tlc/1.3.0/statuses/S0095.json +36 -0
  205. data/schemas/tlc/1.3.0/statuses/S0096.json +126 -0
  206. data/schemas/tlc/1.3.0/statuses/S0097.json +54 -0
  207. data/schemas/tlc/1.3.0/statuses/S0098.json +72 -0
  208. data/schemas/tlc/1.3.0/statuses/S0201.json +54 -0
  209. data/schemas/tlc/1.3.0/statuses/S0202.json +54 -0
  210. data/schemas/tlc/1.3.0/statuses/S0203.json +54 -0
  211. data/schemas/tlc/1.3.0/statuses/S0204.json +198 -0
  212. data/schemas/tlc/1.3.0/statuses/S0205.json +54 -0
  213. data/schemas/tlc/1.3.0/statuses/S0206.json +54 -0
  214. data/schemas/tlc/1.3.0/statuses/S0207.json +54 -0
  215. data/schemas/tlc/1.3.0/statuses/S0208.json +198 -0
  216. data/schemas/tlc/1.3.0/statuses/statuses.json +787 -0
  217. data/schemas/tlc/1.3.0/sxl.yaml +2297 -0
  218. data/schemas/tlc/1.3.0/sxl_index.json +578 -0
  219. metadata +157 -15
  220. data/.github/copilot-instructions.md +0 -33
  221. data/.rspec +0 -1
  222. data/cucumber.yml +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7ac8dcc5eb14943b0e14c10eb9e6f4c5a42fde921d9db9d05b0a390b4019ecf6
4
- data.tar.gz: 9ef754b98f86317516078a6ce1f263ae82f5f7a697e68ef5fbf50c0976016f47
3
+ metadata.gz: a71c7f02cc5b94aa0b4d4f4b7ad87fbd0406c3b8cd1ceacfc7fa12aad6ccaba5
4
+ data.tar.gz: 7de215575f1e79a7494c629ae9211f86b31077586f348c12041590d70f859605
5
5
  SHA512:
6
- metadata.gz: bd8ca1c5aabffa57015ff7519af57349e40044681dae5765d8e5144e49fef4305ecb688bbb9e271ee14c85b80364ba8111263cab41cf73c82fe4ef4540ad4d49
7
- data.tar.gz: 3b44d60f188df7a54087c8baf3ae56592d3187d348aef3a2f01ecd156802078b59727071a6055da77680700373c0dff7364e0f2c0a0aab958c437f747a508f2e
6
+ metadata.gz: 5580aa1b51574cc1f81feb53040b44c8b540287e15f09a966c5dbb90ce16d54a67be73043a6882ae93075636163f0d7f72e181716fd95d691ade8d8e899b722e
7
+ data.tar.gz: e7aa473295a9ed35350f5ae4b04e114959f68322d1e19a6ef88ec8743b46af5b448b2e4a9dd2f9b95f531b719c5952af0e1bd73af88ebb63c896492777817eb5
@@ -1,4 +1,4 @@
1
- # This workflow runs RSpec tests
1
+ # This workflow runs Rubocop
2
2
 
3
3
  name: Rubocop
4
4
  on: [push]
@@ -1,4 +1,4 @@
1
- # This workflow runs RSpec tests
1
+ # This workflow runs Sus tests
2
2
 
3
3
  name: sus
4
4
  on: [push]
data/.gitignore CHANGED
@@ -1,5 +1,4 @@
1
1
  /.DS_Store
2
- /.rspec_status
3
2
  /ignore/
4
3
  /log/
5
4
  /.bundle/
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
@@ -5,9 +5,7 @@ source 'https://rubygems.org'
5
5
  gemspec
6
6
 
7
7
  group :development do
8
- gem 'aruba', '~> 2.3'
9
8
  gem 'bundler', '~> 4.0'
10
- gem 'cucumber', '~> 9.2'
11
9
  gem 'rake', '~> 13.2'
12
10
  gem 'rubocop'
13
11
  gem 'rubocop-rake', require: false
data/Gemfile.lock CHANGED
@@ -1,26 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rsmp (0.43.2)
5
- async (~> 2.32)
4
+ rsmp (0.45.1)
5
+ async (~> 2.39)
6
6
  colorize (~> 1.1)
7
- io-endpoint (~> 0.15)
8
- io-stream (~> 0.10)
7
+ io-endpoint (~> 0.17)
8
+ io-stream (~> 0.13)
9
9
  json_schemer (~> 2.5)
10
- logger (~> 1.6)
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.35.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
- irb (1.18.0)
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
- reline (0.6.3)
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
- stringio (3.2.0)
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.3
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 view messages exchanged
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 a recent version of Ruby intalled. 2.6.3 or later is recommended.
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
- task.sleep 1 # use task.sleep() instead of sleep() to avoid blocking
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, task.stop() to stop all sites and supervisors running inside it:
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
- task.sleep 1
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
- task.sleep 0.1
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 will be validated against the core [RSMP JSON Schema](https://github.com/rsmp-nordic/rsmp_schema).
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
- ### RSpec
170
- RSpec tests are located in spec/. The tests will start supervisor and sites to test communication, but will do so on port 13111, rather than the usual port 12111, to avoid inferference with other RMSP processes running locally.
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 intented 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.
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
- $ rspec
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]
@@ -1,6 +1,7 @@
1
1
  port: 12111
2
2
  default:
3
- sxl: tlc
3
+ sxls:
4
+ tlc: '1.2.1'
4
5
  intervals:
5
6
  timer: 0.1
6
7
  watchdog: 0.1
data/config/tlc.yaml CHANGED
@@ -2,8 +2,8 @@ site_id: RN+SI0001
2
2
  supervisors:
3
3
  - ip: 127.0.0.1
4
4
  port: 12111
5
- sxl: tlc
6
- sxl_version: '1.2.1'
5
+ sxls:
6
+ tlc: '1.2.1'
7
7
  components:
8
8
  main:
9
9
  TC:
@@ -41,8 +41,8 @@ site_id: RN+SI0001
41
41
  supervisors:
42
42
  - ip: 127.0.0.1
43
43
  port: 12111
44
- sxl: tlc
45
- sxl_version: "1.2.1"
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
- sxl: tlc
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
- sxl: tlc
67
- sxl_version: "1.2.1"
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 must include an `sxl` value; if `sxl` is missing the supervisor will raise a `RSMP::ConfigurationError` on startup.
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
- - `sxl`: string — default SXL type for default sites (e.g. `tlc`).
94
- - `sxl_version`, `core_version`: strings for version hints.
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 a site entry is present but missing the required `sxl` key.
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
- - `sxl` (string, required): the SXL type to use for this site (for example `tlc`). The supervisor will attempt to load the corresponding schemas for this SXL.
110
- - `sxl_version` (string): preferred SXL version (informational; runtime version comes from the site's Version message).
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 receiverws that waits for specific message, and are used to implement methods for waiting for RMSP responses, statuses, alarms, etc.
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
-
@@ -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 of the RSpec tests runs tests in in transient task. 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.
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
@@ -1,4 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
- require 'bundler/setup'
3
- require 'rsmp/cli'
2
+ require_relative '../lib/rsmp/cli'
4
3
  RSMP::CLI.start
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 = RSMP::Site::Options.load_file(options[:config])
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['sxl_version'] = ENV['SXL_VERSION'] if ENV['SXL_VERSION']
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.split ':'
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 = options[:type] || settings['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:, ntsoid: nil, xnid: nil, grouped: false)
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
@@ -1,7 +1,7 @@
1
1
  module RSMP
2
2
  # A proxy to a remote RSMP component.
3
3
  class ComponentProxy < ComponentBase
4
- def initialize(node:, id:, ntsoid: nil, xnid: nil, grouped: false)
4
+ def initialize(node:, id:, **attributes)
5
5
  super
6
6
  @alarms = {}
7
7
  @statuses = {}