fprime-gds 4.0.1__tar.gz → 4.0.2a2__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.
Files changed (334) hide show
  1. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/PKG-INFO +1 -1
  2. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/pyproject.toml +1 -0
  3. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/decoders/ch_decoder.py +1 -1
  4. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/decoders/event_decoder.py +1 -1
  5. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/decoders/pkt_decoder.py +1 -1
  6. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/distributor/distributor.py +1 -1
  7. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/cmd_encoder.py +1 -1
  8. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/encoder.py +1 -1
  9. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/seq_writer.py +1 -1
  10. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/gds_cli/base_commands.py +1 -1
  11. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/gds_cli/channels.py +1 -1
  12. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/gds_cli/command_send.py +1 -1
  13. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/gds_cli/events.py +1 -1
  14. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/handlers.py +56 -0
  15. {fprime_gds-4.0.1/src/fprime_gds/common/pipeline → fprime_gds-4.0.2a2/src/fprime_gds/common/models}/dictionaries.py +1 -0
  16. fprime_gds-4.0.2a2/src/fprime_gds/common/pipeline/publishing.py +111 -0
  17. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/pipeline/standard.py +9 -22
  18. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/testing_fw/api.py +86 -23
  19. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/utils/config_manager.py +1 -1
  20. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/apps.py +59 -14
  21. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/cli.py +34 -5
  22. fprime_gds-4.0.2a2/src/fprime_gds/executables/dictionary_merge.py +206 -0
  23. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/fprime_cli.py +1 -1
  24. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/run_deployment.py +19 -6
  25. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds.egg-info/PKG-INFO +1 -1
  26. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds.egg-info/SOURCES.txt +3 -3
  27. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds.egg-info/entry_points.txt +1 -0
  28. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/distributor/test_distributor.py +1 -1
  29. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/encoders/test_ch_encoder.py +2 -0
  30. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/encoders/test_event_encoder.py +2 -0
  31. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/encoders/test_pkt_encoder.py +2 -0
  32. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/testing_fw/api_unit_test.py +10 -2
  33. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/test_run_deployment.py +3 -1
  34. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/test_plugins.py +58 -21
  35. fprime_gds-4.0.1/src/fprime_gds/common/models/common/channel_telemetry.py +0 -174
  36. fprime_gds-4.0.1/src/fprime_gds/common/models/common/event.py +0 -121
  37. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  38. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/actions/codeql/security-pack.yml +0 -0
  39. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/actions/spelling/excludes.txt +0 -0
  40. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/actions/spelling/expect.txt +0 -0
  41. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/actions/spelling/patterns.txt +0 -0
  42. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/pull_request_template.md +0 -0
  43. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/resources/RefTopologyAppDictionary.xml +0 -0
  44. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/workflows/codeql-security-scan.yml +0 -0
  45. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/workflows/fprime-gds-tests.yml +0 -0
  46. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/workflows/gds-cli-tests.yml +0 -0
  47. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/workflows/publish.yml +0 -0
  48. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/workflows/spelling.yml +0 -0
  49. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.gitignore +0 -0
  50. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/Doxyfile +0 -0
  51. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/LICENSE.txt +0 -0
  52. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/NOTICE.txt +0 -0
  53. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/README.md +0 -0
  54. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/configs/__init__.py +0 -0
  55. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/docs/README.md +0 -0
  56. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/docs/_static/css/rtd_width.css +0 -0
  57. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/docs/conf.py +0 -0
  58. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/docs/gendoc.bash +0 -0
  59. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/docs/index.rst +0 -0
  60. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/examples/simple_sequence.bin +0 -0
  61. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/examples/simple_sequence.seq +0 -0
  62. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/setup.cfg +0 -0
  63. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/setup.py +0 -0
  64. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fastentrypoints.py +0 -0
  65. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/__init__.py +0 -0
  66. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/__init__.py +0 -0
  67. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/__init__.py +0 -0
  68. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/adapters/__init__.py +0 -0
  69. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/adapters/base.py +0 -0
  70. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/adapters/ip.py +0 -0
  71. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/adapters/uart.py +0 -0
  72. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/ccsds/__init__.py +0 -0
  73. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/ccsds/apid.py +0 -0
  74. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/ccsds/chain.py +0 -0
  75. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/ccsds/space_data_link.py +0 -0
  76. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/ccsds/space_packet.py +0 -0
  77. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/checksum.py +0 -0
  78. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/framing.py +0 -0
  79. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/ground.py +0 -0
  80. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/updown.py +0 -0
  81. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/controllers/__init__.py +0 -0
  82. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/__init__.py +0 -0
  83. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/ch_data.py +0 -0
  84. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/cmd_data.py +0 -0
  85. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/event_data.py +0 -0
  86. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/exceptions.py +0 -0
  87. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/file_data.py +0 -0
  88. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/pkt_data.py +0 -0
  89. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/sys_data.py +0 -0
  90. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/decoders/__init__.py +0 -0
  91. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/decoders/decoder.py +0 -0
  92. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/decoders/file_decoder.py +0 -0
  93. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/distributor/__init__.py +0 -0
  94. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/__init__.py +0 -0
  95. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/ch_encoder.py +0 -0
  96. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/event_encoder.py +0 -0
  97. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/file_encoder.py +0 -0
  98. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/pkt_encoder.py +0 -0
  99. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/files/File Decoder Documentation.txt +0 -0
  100. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/files/__init__.py +0 -0
  101. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/files/downlinker.py +0 -0
  102. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/files/helpers.py +0 -0
  103. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/files/uplinker.py +0 -0
  104. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/README.md +0 -0
  105. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/SPEC.md +0 -0
  106. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/__init__.py +0 -0
  107. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/bytecode/__init__.py +0 -0
  108. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/bytecode/directives.py +0 -0
  109. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/codegen.py +0 -0
  110. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/grammar.lark +0 -0
  111. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/main.py +0 -0
  112. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/parser.py +0 -0
  113. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/gds_cli/__init__.py +0 -0
  114. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/gds_cli/filtering_utils.py +0 -0
  115. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/gds_cli/test_api_utils.py +0 -0
  116. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/history/__init__.py +0 -0
  117. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/history/chrono.py +0 -0
  118. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/history/history.py +0 -0
  119. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/history/ram.py +0 -0
  120. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/history/test.py +0 -0
  121. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/__init__.py +0 -0
  122. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/ch_json_loader.py +0 -0
  123. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/ch_xml_loader.py +0 -0
  124. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/cmd_json_loader.py +0 -0
  125. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/cmd_xml_loader.py +0 -0
  126. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/dict_loader.py +0 -0
  127. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/event_json_loader.py +0 -0
  128. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/event_xml_loader.py +0 -0
  129. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/fw_type_json_loader.py +0 -0
  130. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/json_loader.py +0 -0
  131. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/pkt_json_loader.py +0 -0
  132. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/pkt_xml_loader.py +0 -0
  133. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/prm_json_loader.py +0 -0
  134. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/xml_loader.py +0 -0
  135. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/logger/__init__.py +0 -0
  136. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/logger/data_logger.py +0 -0
  137. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/logger/test_logger.py +0 -0
  138. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/models/__init__.py +0 -0
  139. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/models/common/__init__.py +0 -0
  140. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/models/common/command.py +0 -0
  141. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/parsers/__init__.py +0 -0
  142. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/parsers/seq_file_parser.py +0 -0
  143. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/pipeline/__init__.py +0 -0
  144. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/pipeline/encoding.py +0 -0
  145. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/pipeline/files.py +0 -0
  146. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/pipeline/histories.py +0 -0
  147. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/pipeline/router.py +0 -0
  148. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/templates/__init__.py +0 -0
  149. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/templates/ch_template.py +0 -0
  150. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/templates/cmd_template.py +0 -0
  151. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/templates/data_template.py +0 -0
  152. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/templates/event_template.py +0 -0
  153. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/templates/pkt_template.py +0 -0
  154. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/templates/prm_template.py +0 -0
  155. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/testing_fw/__init__.py +0 -0
  156. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/testing_fw/predicates.py +0 -0
  157. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/testing_fw/pytest_integration.py +0 -0
  158. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/tools/README.md +0 -0
  159. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/tools/__init__.py +0 -0
  160. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/tools/params.py +0 -0
  161. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/tools/seqgen.py +0 -0
  162. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/transport.py +0 -0
  163. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/utils/__init__.py +0 -0
  164. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/utils/data_desc_type.py +0 -0
  165. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/utils/event_severity.py +0 -0
  166. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/utils/string_util.py +0 -0
  167. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/zmq_transport.py +0 -0
  168. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/__init__.py +0 -0
  169. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/comm.py +0 -0
  170. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/data_product_writer.py +0 -0
  171. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/tcpserver.py +0 -0
  172. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/utils.py +0 -0
  173. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/__init__.py +0 -0
  174. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/app.py +0 -0
  175. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/channels.py +0 -0
  176. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/commands.py +0 -0
  177. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/components.py +0 -0
  178. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/default_settings.py +0 -0
  179. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/errors.py +0 -0
  180. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/events.py +0 -0
  181. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/json.py +0 -0
  182. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/logs.py +0 -0
  183. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/requirements.txt +0 -0
  184. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/resource.py +0 -0
  185. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/sequence.py +0 -0
  186. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/.idea/.gitignore +0 -0
  187. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/.idea/misc.xml +0 -0
  188. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/.idea/modules.xml +0 -0
  189. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/.idea/static.iml +0 -0
  190. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/.idea/vcs.xml +0 -0
  191. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/advanced-settings/addon-templates.js +0 -0
  192. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/advanced-settings/addon.js +0 -0
  193. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/channel-render/addon.js +0 -0
  194. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/channel-render/channel-render-template.js +0 -0
  195. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/channel-render/channel-render.js +0 -0
  196. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/addon-templates.js +0 -0
  197. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/addon.js +0 -0
  198. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/config.js +0 -0
  199. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-streaming.js +0 -0
  200. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-zoom.js +0 -0
  201. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/flat.js +0 -0
  202. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/sibling.js +0 -0
  203. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/vendor/chart.js +0 -0
  204. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/vendor/chartjs-adapter-luxon.min.js +0 -0
  205. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/vendor/hammer.min.js +0 -0
  206. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/addon.js +0 -0
  207. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/argument-templates.js +0 -0
  208. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/arguments.js +0 -0
  209. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/command-history-template.js +0 -0
  210. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/command-history.js +0 -0
  211. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/command-input-template.js +0 -0
  212. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/command-input.js +0 -0
  213. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/command-string-template.js +0 -0
  214. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/command-string.js +0 -0
  215. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/dictionary/addon-templates.js +0 -0
  216. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/dictionary/addon.js +0 -0
  217. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/enabled.js +0 -0
  218. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/image-display/addon.js +0 -0
  219. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/image-display/dashboard.xml +0 -0
  220. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/README.md +0 -0
  221. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/addon-templates.js +0 -0
  222. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/addon.js +0 -0
  223. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/autocomplete.js +0 -0
  224. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/lint.js +0 -0
  225. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/third/code-mirror.es.js +0 -0
  226. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/.gitignore +0 -0
  227. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/index.js +0 -0
  228. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/language.grammer +0 -0
  229. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/package.json +0 -0
  230. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/rollup.config.js +0 -0
  231. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/css/fprime.css +0 -0
  232. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/css/fpstyle.css +0 -0
  233. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/favicon.ico +0 -0
  234. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/img/error.svg +0 -0
  235. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/img/logo.svg +0 -0
  236. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/img/success.svg +0 -0
  237. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/index.html +0 -0
  238. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/config.js +0 -0
  239. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/datastore.js +0 -0
  240. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/gds.js +0 -0
  241. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/json.js +0 -0
  242. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/loader.js +0 -0
  243. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/performance.js +0 -0
  244. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/settings.js +0 -0
  245. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/uploader.js +0 -0
  246. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/validate.js +0 -0
  247. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/channel.js +0 -0
  248. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/dashboard-box.js +0 -0
  249. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/dashboard-row.js +0 -0
  250. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/dashboard.js +0 -0
  251. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/downlink.js +0 -0
  252. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/event.js +0 -0
  253. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/fp-row.js +0 -0
  254. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/fptable.js +0 -0
  255. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/log.js +0 -0
  256. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/tabetc.js +0 -0
  257. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/uplink.js +0 -0
  258. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/utils.js +0 -0
  259. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/css/all.min.css +0 -0
  260. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/css/bootstrap.min.css +0 -0
  261. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/css/vue-select.css +0 -0
  262. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/js/luxon.min.js +0 -0
  263. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/js/sorttable.js +0 -0
  264. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/js/v-runtime-template.js +0 -0
  265. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/js/vue-select.js +0 -0
  266. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/js/vue.min.js +0 -0
  267. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.eot +0 -0
  268. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.svg +0 -0
  269. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.ttf +0 -0
  270. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff +0 -0
  271. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff2 +0 -0
  272. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.eot +0 -0
  273. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.svg +0 -0
  274. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.ttf +0 -0
  275. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff +0 -0
  276. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff2 +0 -0
  277. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.eot +0 -0
  278. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.svg +0 -0
  279. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.ttf +0 -0
  280. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff +0 -0
  281. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff2 +0 -0
  282. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/stats.py +0 -0
  283. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/updown.py +0 -0
  284. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/plugin/__init__.py +0 -0
  285. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/plugin/definitions.py +0 -0
  286. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/plugin/system.py +0 -0
  287. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/version.py +0 -0
  288. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds.egg-info/dependency_links.txt +0 -0
  289. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds.egg-info/requires.txt +0 -0
  290. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds.egg-info/top_level.txt +0 -0
  291. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/communication/ccsds/test_space_data_link.py +0 -0
  292. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/communication/ccsds/test_space_packet.py +0 -0
  293. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/data_types/test_cmd_data.py +0 -0
  294. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/fpy/disabled_test_compiler.py +0 -0
  295. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/gds_cli/filtering_utils_test.py +0 -0
  296. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/gds_cli/utils_test.py +0 -0
  297. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/history/chronohistory_unit_test.py +0 -0
  298. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/history/testhistory_unit_test.py +0 -0
  299. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/loaders/resources/RefTopologyDictionary.json +0 -0
  300. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/loaders/test_json_loader.py +0 -0
  301. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/testing_fw/UnitTestDictionary.xml +0 -0
  302. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/testing_fw/logs/.gitignore +0 -0
  303. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/testing_fw/predicate_unit_test.py +0 -0
  304. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/expected/simple_expected.bin +0 -0
  305. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/expected/simple_paramdb.dat +0 -0
  306. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/input/simple_bad_paramdb.json +0 -0
  307. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/input/simple_bad_sequence.seq +0 -0
  308. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/input/simple_paramdb.json +0 -0
  309. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/input/simple_sequence.seq +0 -0
  310. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/resources/simple_dictionary.json +0 -0
  311. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/resources/simple_dictionary.xml +0 -0
  312. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/seqgen_unit_test.py +0 -0
  313. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/test_paramdb_gen.py +0 -0
  314. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/utils/test_string_util.py +0 -0
  315. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/.gitignore +0 -0
  316. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/dictionary.json +0 -0
  317. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeBool.bin +0 -0
  318. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeComplex.bin +0 -0
  319. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeDataArray.bin +0 -0
  320. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeEnum.bin +0 -0
  321. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeF32.bin +0 -0
  322. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeF64.bin +0 -0
  323. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeFppArray.bin +0 -0
  324. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeI16.bin +0 -0
  325. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeI32.bin +0 -0
  326. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeI64.bin +0 -0
  327. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeI8.bin +0 -0
  328. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeU32.bin +0 -0
  329. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeU32Array.bin +0 -0
  330. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeU8Array.bin +0 -0
  331. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/test_data_product_writer.py +0 -0
  332. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/test_utils.py +0 -0
  333. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/sample/dictionary.xml +0 -0
  334. {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/gui/GUI_Test_Procedure.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fprime-gds
3
- Version: 4.0.1
3
+ Version: 4.0.2a2
4
4
  Summary: F Prime Flight Software Ground Data System layer
5
5
  Author-email: Michael Starch <Michael.D.Starch@jpl.nasa.gov>, Thomas Boyer-Chammard <Thomas.Boyer.Chammard@jpl.nasa.gov>
6
6
  License:
@@ -67,6 +67,7 @@ fprime-dp-write = "fprime_gds.executables.data_product_writer:main"
67
67
  fprime-gds = "fprime_gds.executables.run_deployment:main"
68
68
  fprime-prm-write = "fprime_gds.common.tools.params:main"
69
69
  fprime-fpyc = "fprime_gds.common.fpy.main:main"
70
+ fprime-merge-dictionary = "fprime_gds.executables.dictionary_merge:main"
70
71
 
71
72
  # For Pytest fixtures
72
73
  [project.entry-points."pytest11"]
@@ -41,7 +41,7 @@ class ChDecoder(Decoder):
41
41
 
42
42
  if config is None:
43
43
  # Retrieve singleton for the configs
44
- config = config_manager.ConfigManager().get_instance()
44
+ config = config_manager.ConfigManager.get_instance()
45
45
 
46
46
  self.__dict = ch_dict
47
47
  self.id_obj = config.get_type("FwChanIdType")
@@ -43,7 +43,7 @@ class EventDecoder(decoder.Decoder):
43
43
 
44
44
  if config is None:
45
45
  # Retrieve defaults for the configs
46
- config = config_manager.ConfigManager().get_instance()
46
+ config = config_manager.ConfigManager.get_instance()
47
47
 
48
48
  self.__dict = event_dict
49
49
  self.id_obj = config.get_type("FwEventIdType")
@@ -41,7 +41,7 @@ class PktDecoder(ChDecoder):
41
41
  An initialized PktDecoder object
42
42
  """
43
43
  if config is None:
44
- config = config_manager.ConfigManager().get_instance()
44
+ config = config_manager.ConfigManager.get_instance()
45
45
  super().__init__(ch_dict, config)
46
46
 
47
47
  self.__dict = pkt_name_dict
@@ -45,7 +45,7 @@ class Distributor(DataHandler):
45
45
  """
46
46
  if config is None:
47
47
  # Retrieve singleton for the configs, or defaults if singleton unused
48
- config = config_manager.ConfigManager().get_instance()
48
+ config = config_manager.ConfigManager.get_instance()
49
49
 
50
50
  self.__decoders = {key.name: [] for key in list(data_desc_type.DataDescType)}
51
51
 
@@ -68,7 +68,7 @@ class CmdEncoder(encoder.Encoder):
68
68
  """
69
69
 
70
70
  if config is None:
71
- config = config_manager.ConfigManager().get_instance()
71
+ config = config_manager.ConfigManager.get_instance()
72
72
  super().__init__(config)
73
73
 
74
74
  self.len_obj = self.config.get_type("msg_len")
@@ -49,7 +49,7 @@ class Encoder(
49
49
  super().__init__()
50
50
  if config is None:
51
51
  # Retrieve defaults for the configs
52
- config = ConfigManager()
52
+ config = ConfigManager.get_instance()
53
53
  self.config = config
54
54
 
55
55
  def data_callback(self, data, sender=None):
@@ -24,7 +24,7 @@ class SeqBinaryWriter:
24
24
  Constructor
25
25
  """
26
26
  if config is None:
27
- config = config_manager.ConfigManager().get_instance()
27
+ config = config_manager.ConfigManager.get_instance()
28
28
 
29
29
  self.__fd = None
30
30
  self.__timebase = timebase
@@ -10,7 +10,7 @@ from typing import Iterable
10
10
 
11
11
  import fprime_gds.common.gds_cli.filtering_utils as filtering_utils
12
12
  import fprime_gds.common.gds_cli.test_api_utils as test_api_utils
13
- from fprime_gds.common.pipeline.dictionaries import Dictionaries
13
+ from fprime_gds.common.models.dictionaries import Dictionaries
14
14
  from fprime_gds.common.testing_fw import predicates
15
15
  from fprime_gds.common.testing_fw.api import IntegrationTestAPI
16
16
  from fprime_gds.executables.cli import StandardPipelineParser
@@ -7,7 +7,7 @@ from typing import Iterable
7
7
  import fprime_gds.common.gds_cli.test_api_utils as test_api_utils
8
8
  from fprime_gds.common.data_types.ch_data import ChData
9
9
  from fprime_gds.common.gds_cli.base_commands import QueryHistoryCommand
10
- from fprime_gds.common.pipeline.dictionaries import Dictionaries
10
+ from fprime_gds.common.models.dictionaries import Dictionaries
11
11
  from fprime_gds.common.testing_fw import predicates
12
12
  from fprime_gds.common.testing_fw.api import IntegrationTestAPI
13
13
 
@@ -9,7 +9,7 @@ from fprime.common.models.serialize.type_exceptions import NotInitializedExcepti
9
9
 
10
10
  import fprime_gds.common.gds_cli.test_api_utils as test_api_utils
11
11
  from fprime_gds.common.gds_cli.base_commands import BaseCommand
12
- from fprime_gds.common.pipeline.dictionaries import Dictionaries
12
+ from fprime_gds.common.models.dictionaries import Dictionaries
13
13
  from fprime_gds.common.templates.cmd_template import CmdTemplate
14
14
  from fprime_gds.common.testing_fw import predicates
15
15
  from fprime_gds.common.testing_fw.api import IntegrationTestAPI
@@ -7,7 +7,7 @@ from typing import Iterable
7
7
  import fprime_gds.common.gds_cli.test_api_utils as test_api_utils
8
8
  from fprime_gds.common.data_types.event_data import EventData
9
9
  from fprime_gds.common.gds_cli.base_commands import QueryHistoryCommand
10
- from fprime_gds.common.pipeline.dictionaries import Dictionaries
10
+ from fprime_gds.common.models.dictionaries import Dictionaries
11
11
  from fprime_gds.common.testing_fw import predicates
12
12
  from fprime_gds.common.testing_fw.api import IntegrationTestAPI
13
13
 
@@ -37,6 +37,13 @@ class DataHandlerPlugin(DataHandler, abc.ABC):
37
37
  data types it handles (whereas DataHandler leaves that up to the registration call). Users shall concretely subclass
38
38
  this class with their own data handling functionality.
39
39
  """
40
+ def __init__(self, **kwargs):
41
+ """ Initialize """
42
+ self.publisher = None
43
+
44
+ def set_publisher(self, publisher):
45
+ """ Set publishing pipeline """
46
+ self.publisher = publisher
40
47
 
41
48
  @abc.abstractmethod
42
49
  def get_handled_descriptors() -> List[str]:
@@ -113,3 +120,52 @@ class HandlerRegistrar(abc.ABC):
113
120
  """
114
121
  for registrant in self._registrants:
115
122
  registrant.data_callback(data, sender)
123
+
124
+
125
+ class MappedRegistrar(abc.ABC):
126
+ """ Class to register a mapping """
127
+
128
+ def __init__(self):
129
+ """ Initialize an empty registrant list """
130
+ super().__init__()
131
+ self._registrants = {}
132
+
133
+ def register(self, id, registrant):
134
+ """
135
+ Register a registrant with this registrar associated with the ID. Will be stored and called back when asked to
136
+ send data to all the handlers registered at the id
137
+
138
+ :param id: id to register to
139
+ :param registrant: handler to register
140
+ """
141
+ self._registrants[id] = self._registrants.get(id, HandlerRegistrar())
142
+ self._registrants[id].register(registrant)
143
+
144
+ def deregister(self, id, registrant):
145
+ """
146
+ Remove a registrant from the registrar such that it will not be called back later. Note: ignores invalid
147
+ removals by trapping the error, as the desired effect is already satisfied.
148
+
149
+ :param id: id to register to
150
+ :param registrant: registrant to remove
151
+ :return: True if found, False if not. May safely be ignored.
152
+ """
153
+ try:
154
+ self._registrants[id].deregister(registrant)
155
+ return True
156
+ except (ValueError, KeyError):
157
+ return False
158
+
159
+ def send_to_all(self, id, data, sender=None):
160
+ """
161
+ Sends the given data to all registrants at id.
162
+
163
+ :param id: id to send to
164
+ :param data: data to send back to registrants
165
+ :param sender: (optional) sender to pass to data_callback
166
+ """
167
+ try:
168
+ self._registrants[id].send_to_all(data, sender)
169
+ except KeyError:
170
+ print("KeyERROR")
171
+ pass
@@ -57,6 +57,7 @@ class Dictionaries:
57
57
 
58
58
  :param dictionary: dictionary path used for loading dictionaries
59
59
  :param packet_spec: specification for packets, or None, for packetized telemetry
60
+ :param packet_set_name: name of packet set in case multiple are available
60
61
  """
61
62
  if Path(dictionary).is_file() and ".json" in Path(dictionary).suffixes:
62
63
  # Events
@@ -0,0 +1,111 @@
1
+ """
2
+ publishing.py:
3
+
4
+ This file contains a basic publishing pipeline. It reads and writes data bound for the GDS.
5
+
6
+ :author: lestarch
7
+ """
8
+
9
+
10
+ from typing import Type
11
+
12
+ from fprime_gds.common.data_types.ch_data import ChData
13
+ from fprime_gds.common.data_types.event_data import EventData
14
+ from fprime_gds.common.encoders.ch_encoder import ChEncoder
15
+ from fprime_gds.common.encoders.event_encoder import EventEncoder
16
+ from fprime_gds.common.transport import RoutingTag, ThreadedTCPSocketClient
17
+ from fprime_gds.common.utils.config_manager import ConfigManager
18
+
19
+ from fprime_gds.common.handlers import DataHandler, MappedRegistrar
20
+ from ..models import dictionaries
21
+
22
+
23
+ class PublishingPipeline(DataHandler, MappedRegistrar):
24
+ """ Pipeline for publishing
25
+
26
+ This pipeline sets up the following process:
27
+
28
+ Data -> Encoder -> Client -> <wire>
29
+ """
30
+ DEFAULT_ENCODERS = {
31
+ "FW_PACKET_LOG": EventEncoder,
32
+ "FW_PACKET_TELEM": ChEncoder
33
+ }
34
+
35
+ def __init__(self):
36
+ """
37
+ Set core variables to None or their composition handlers.
38
+ """
39
+ super().__init__()
40
+ self.client_socket = None
41
+
42
+ self._dictionaries = dictionaries.Dictionaries()
43
+ self._transport_type = ThreadedTCPSocketClient
44
+
45
+ def setup(self, dictionaries):
46
+ """ Set up the publishing pipeline """
47
+ self._dictionaries = dictionaries
48
+ self.client_socket = self.__transport_type()
49
+ config = ConfigManager.get_instance()
50
+
51
+ for id, encoder_class in self.DEFAULT_ENCODERS.items():
52
+ encoder_instance = encoder_class(config=config)
53
+ encoder_instance.register(self.client_socket)
54
+ self.register(id, encoder_instance)
55
+
56
+ def data_callback(self, data, sender=None):
57
+ """ Publish data """
58
+ if isinstance(data, ChData):
59
+ self.send_to_all("FW_PACKET_TELEM", data)
60
+ elif isinstance(data, EventData):
61
+ self.send_to_all("FW_PACKET_LOG", data)
62
+ return super().data_callback(data, sender)
63
+
64
+ def publish_channel(self, name, value, time):
65
+ """ Publish channel value using name, time, and value
66
+
67
+ Looks up the channel template in the dictionary and constructs a new channel object given the time and value.
68
+ This ChData object is then sent into the outgoing "publish" pipeline.
69
+
70
+ """
71
+ template = self._dictionaries.channel_name[name]
72
+ copied_value_object = template.get_type_obj()(value)
73
+ copied_value_object.val = value
74
+ object = ChData(copied_value_object, time, template)
75
+ return self.data_callback(object, self)
76
+
77
+ @property
78
+ def transport_implementation(self):
79
+ """Get implementation type for transport"""
80
+ return self.__transport_type
81
+
82
+ @transport_implementation.setter
83
+ def transport_implementation(self, transport_type: Type[None]):
84
+ """Set the implementation type for transport"""
85
+ assert (
86
+ self.client_socket is None
87
+ ), "Cannot setup transport implementation type after setup"
88
+ self.__transport_type = transport_type
89
+
90
+
91
+ def connect(
92
+ self, connection_uri, incoming_tag=RoutingTag.GUI, outgoing_tag=RoutingTag.GUI
93
+ ):
94
+ """Connects to the middleware layer
95
+
96
+ Connect to the middleware layer. This connection needs to identify if the object is a a FSW or GUI client. The
97
+ default connection acts as a GUI client sending back to the GUI.
98
+
99
+ Args:
100
+ connection_uri: URI of the connection to make
101
+ incoming_tag: this pipeline will act as supplied tag (GUI, FSW). Default: GUI
102
+ outgoing_tag: this pipeline will produce data for supplied tag (FSW, GUI). Default: FSW
103
+ """
104
+ self.client_socket.connect(connection_uri, incoming_tag, outgoing_tag)
105
+
106
+ def disconnect(self):
107
+ """ Disconnect from the client socket """
108
+ if self.client_socket is not None:
109
+ self.client_socket.disconnect()
110
+
111
+
@@ -23,7 +23,7 @@ from fprime_gds.common.transport import RoutingTag, ThreadedTCPSocketClient
23
23
  from fprime_gds.common.utils.config_manager import ConfigManager
24
24
 
25
25
  # Local imports for the sake of composition
26
- from . import dictionaries, encoding, files, histories
26
+ from . import encoding, files, histories
27
27
 
28
28
 
29
29
  class StandardPipeline:
@@ -49,7 +49,7 @@ class StandardPipeline:
49
49
  self.up_store = None
50
50
  self.down_store = None
51
51
 
52
- self.__dictionaries = dictionaries.Dictionaries()
52
+ self.__dictionaries = None
53
53
  self.__coders = encoding.EncodingDecoding()
54
54
  self.__histories = histories.Histories()
55
55
  self.__filing = files.Filing()
@@ -58,25 +58,23 @@ class StandardPipeline:
58
58
  def setup(
59
59
  self,
60
60
  config: ConfigManager,
61
- dictionary,
61
+ dictionaries,
62
62
  file_store,
63
63
  logging_prefix=None,
64
- packet_spec=None,
65
- packet_set_name=None,
64
+ data_logging_enabled=True
66
65
  ):
67
66
  """
68
67
  Setup the standard pipeline for moving data from the middleware layer through the GDS layers using the standard
69
68
  patterns. This allows just registering the consumers, and invoking 'setup' all other of the GDS support layer.
70
69
 
71
70
  :param config: config object used when constructing the pipeline.
72
- :param dictionary: dictionary path. Used to setup loading of dictionaries.
71
+ :param dictionaries: dictionary path. Used to setup loading of dictionaries.
73
72
  :param file_store: uplink/downlink storage directory
74
73
  :param logging_prefix: logging prefix. Defaults to not logging at all.
75
74
  :param packet_spec: location of packetized telemetry XML specification.
76
75
  """
77
- assert (
78
- dictionary is not None and Path(dictionary).is_file()
79
- ), f"Dictionary {dictionary} does not exist"
76
+ self.distributor = fprime_gds.common.distributor.distributor.Distributor(config)
77
+ self.client_socket = self.__transport_type()
80
78
  # File storage configuration for uplink and downlink
81
79
  self.up_store = Path(file_store) / "fprime-uplink"
82
80
  self.down_store = Path(file_store) / "fprime-downlink"
@@ -87,18 +85,7 @@ class StandardPipeline:
87
85
  raise PermissionError(
88
86
  f"{file_store} is not writable. Fix permissions or change storage directory with --file-storage-directory."
89
87
  )
90
- self.dictionary_path = Path(dictionary)
91
- # Loads the distributor and client socket
92
- self.distributor = fprime_gds.common.distributor.distributor.Distributor(config)
93
- self.client_socket = self.__transport_type()
94
- # Setup dictionaries encoders and decoders
95
- self.dictionaries.load_dictionaries(
96
- self.dictionary_path, packet_spec, packet_set_name
97
- )
98
- # Update config to use Fw types defined in the JSON dictionary
99
- if self.dictionaries.fw_type_name:
100
- for fw_type_name, fw_type in self.dictionaries.fw_type_name.items():
101
- config.set("types", fw_type_name, fw_type)
88
+ self.__dictionaries = dictionaries
102
89
  self.coders.setup_coders(
103
90
  self.dictionaries, self.distributor, self.client_socket, config
104
91
  )
@@ -113,7 +100,7 @@ class StandardPipeline:
113
100
  # Register distributor to client socket
114
101
  self.client_socket.register(self.distributor)
115
102
  # Final setup step is to make a logging directory, and register in the logger
116
- if logging_prefix:
103
+ if logging_prefix and data_logging_enabled:
117
104
  self.setup_logging(logging_prefix)
118
105
 
119
106
  @property
@@ -7,6 +7,7 @@ telemetry and dictionaries.
7
7
 
8
8
  :author: koran
9
9
  """
10
+
10
11
  import signal
11
12
  import time
12
13
  from pathlib import Path
@@ -71,11 +72,12 @@ class IntegrationTestAPI(DataHandler):
71
72
  # Copy dictionaries and binary file to output directory
72
73
  if logpath is not None:
73
74
  base_dir = Path(self.pipeline.dictionary_path).parents[1]
74
- for subdir in ['bin', 'dict']:
75
+ for subdir in ["bin", "dict"]:
75
76
  dir_path = base_dir / subdir
76
77
  if dir_path.is_dir():
77
- shutil.copytree(dir_path, Path(logpath) / subdir,
78
- dirs_exist_ok=True)
78
+ shutil.copytree(
79
+ dir_path, Path(logpath) / subdir, dirs_exist_ok=True
80
+ )
79
81
 
80
82
  # A predicate used as a filter to choose which events to log automatically
81
83
  self.event_log_filter = self.get_event_pred()
@@ -84,7 +86,7 @@ class IntegrationTestAPI(DataHandler):
84
86
  self.last_evr = None
85
87
 
86
88
  def setup(self):
87
- """ Set up the API, assumes pipeline is now setup """
89
+ """Set up the API, assumes pipeline is now setup"""
88
90
  self.pipeline.coders.register_event_consumer(self)
89
91
 
90
92
  def teardown(self):
@@ -162,10 +164,10 @@ class IntegrationTestAPI(DataHandler):
162
164
  fail_color = TestLogger.ORANGE
163
165
 
164
166
  if value:
165
- ast_msg = f'{ast_msg} succeeded: {msg}'
167
+ ast_msg = f"{ast_msg} succeeded: {msg}"
166
168
  self.__log(ast_msg, TestLogger.GREEN)
167
169
  else:
168
- ast_msg = f'{ast_msg} failed: {msg}'
170
+ ast_msg = f"{ast_msg} failed: {msg}"
169
171
  self.__log(ast_msg, fail_color)
170
172
 
171
173
  if not expect:
@@ -209,7 +211,7 @@ class IntegrationTestAPI(DataHandler):
209
211
  self.event_history.clear()
210
212
  self.telemetry_history.clear()
211
213
  msg = "Clearing Test Histories"
212
-
214
+
213
215
  self.__log(msg, TestLogger.WHITE)
214
216
  self.command_history.clear()
215
217
 
@@ -239,9 +241,9 @@ class IntegrationTestAPI(DataHandler):
239
241
  dictionary = str(self.pipeline.dictionary_path)
240
242
 
241
243
  try:
242
- with open(dictionary, 'r') as file:
244
+ with open(dictionary, "r") as file:
243
245
  data = json.load(file)
244
- return data['metadata'].get("deploymentName")
246
+ return data["metadata"].get("deploymentName")
245
247
  except FileNotFoundError:
246
248
  msg = f"Error: File not found at path: {dictionary}"
247
249
  self.__log(msg, TestLogger.YELLOW)
@@ -273,7 +275,7 @@ class IntegrationTestAPI(DataHandler):
273
275
  count, channels=channels, history=history, start=start, timeout=timeout
274
276
  )
275
277
  if not result:
276
- msg = f'Failed to detect any data flow for {timeout} s.'
278
+ msg = f"Failed to detect any data flow for {timeout} s."
277
279
  self.__log(msg, TestLogger.RED)
278
280
  assert False, msg
279
281
  self.remove_telemetry_subhistory(history)
@@ -300,7 +302,7 @@ class IntegrationTestAPI(DataHandler):
300
302
  config_file = self.get_config_file_path()
301
303
 
302
304
  try:
303
- with open(config_file, 'r') as file:
305
+ with open(config_file, "r") as file:
304
306
  result = json.load(file)
305
307
  return result
306
308
  except FileNotFoundError:
@@ -351,7 +353,7 @@ class IntegrationTestAPI(DataHandler):
351
353
  if data:
352
354
  try:
353
355
  filepath = data["Svc.PrmDb.filename"]
354
- if filepath.startswith('/'):
356
+ if filepath.startswith("/"):
355
357
  return filepath
356
358
  else:
357
359
  msg = f"Error: {filepath} did not start with a forward slash"
@@ -549,7 +551,15 @@ class IntegrationTestAPI(DataHandler):
549
551
  return self.await_event_sequence(events, start=start, timeout=timeout)
550
552
  return self.await_event(events, start=start, timeout=timeout)
551
553
 
552
- def send_and_assert_command(self, command, args=[], max_delay=None, timeout=5, events=None, commander="cmdDisp"):
554
+ def send_and_assert_command(
555
+ self,
556
+ command,
557
+ args=[],
558
+ max_delay=None,
559
+ timeout=5,
560
+ events=None,
561
+ commander="cmdDisp",
562
+ ):
553
563
  """
554
564
  This helper will send a command and verify that the command was dispatched and completed
555
565
  within the F' deployment. This helper can retroactively check that the delay between
@@ -566,7 +576,9 @@ class IntegrationTestAPI(DataHandler):
566
576
  returns a list of the EventData objects found by the search
567
577
  """
568
578
  cmd_id = self.translate_command_name(command)
569
- dispatch = [self.get_event_pred(f"{commander}.OpCodeDispatched", [cmd_id, None])]
579
+ dispatch = [
580
+ self.get_event_pred(f"{commander}.OpCodeDispatched", [cmd_id, None])
581
+ ]
570
582
  complete = [self.get_event_pred(f"{commander}.OpCodeCompleted", [cmd_id])]
571
583
  events = dispatch + (events if events else []) + complete
572
584
  results = self.send_and_assert_event(command, args, events, timeout=timeout)
@@ -576,7 +588,6 @@ class IntegrationTestAPI(DataHandler):
576
588
  assert delay < max_delay, msg
577
589
  return results
578
590
 
579
-
580
591
  ######################################################################################
581
592
  # Command Asserts
582
593
  ######################################################################################
@@ -652,14 +663,18 @@ class IntegrationTestAPI(DataHandler):
652
663
  """
653
664
  if isinstance(channel, str):
654
665
  ch_dict = self.pipeline.dictionaries.channel_name
655
- matching = [ch_dict[name].get_id() for name in ch_dict.keys() if name.endswith(f".{channel}")]
666
+ matching = [
667
+ ch_dict[name].get_id()
668
+ for name in ch_dict.keys()
669
+ if name.endswith(f".{channel}")
670
+ ]
656
671
  if channel in ch_dict:
657
672
  return ch_dict[channel].get_id()
658
673
  if force_component or not matching:
659
674
  msg = f"The telemetry mnemonic, {channel}, wasn't in the dictionary"
660
675
  raise KeyError(msg)
661
676
  return matching
662
-
677
+
663
678
  ch_dict = self.pipeline.dictionaries.channel_id
664
679
  if channel in ch_dict:
665
680
  return channel
@@ -689,7 +704,11 @@ class IntegrationTestAPI(DataHandler):
689
704
 
690
705
  if not predicates.is_predicate(channel) and channel is not None:
691
706
  channel = self.translate_telemetry_name(channel, force_component=False)
692
- channel = predicates.is_a_member_of(channel) if isinstance(channel, list) else predicates.equal_to(channel)
707
+ channel = (
708
+ predicates.is_a_member_of(channel)
709
+ if isinstance(channel, list)
710
+ else predicates.equal_to(channel)
711
+ )
693
712
 
694
713
  if not predicates.is_predicate(value) and value is not None:
695
714
  value = predicates.equal_to(value)
@@ -873,7 +892,11 @@ class IntegrationTestAPI(DataHandler):
873
892
  """
874
893
  if isinstance(event, str):
875
894
  event_dict = self.pipeline.dictionaries.event_name
876
- matching = [event_dict[name].get_id() for name in event_dict.keys() if name.endswith(f".{event}")]
895
+ matching = [
896
+ event_dict[name].get_id()
897
+ for name in event_dict.keys()
898
+ if name.endswith(f".{event}")
899
+ ]
877
900
  if event in event_dict:
878
901
  return event_dict[event].get_id()
879
902
  if force_component or not matching:
@@ -910,7 +933,11 @@ class IntegrationTestAPI(DataHandler):
910
933
 
911
934
  if not predicates.is_predicate(event) and event is not None:
912
935
  event = self.translate_event_name(event, force_component=False)
913
- event = predicates.is_a_member_of(event) if isinstance(event, list) else predicates.equal_to(event)
936
+ event = (
937
+ predicates.is_a_member_of(event)
938
+ if isinstance(event, list)
939
+ else predicates.equal_to(event)
940
+ )
914
941
 
915
942
  if not predicates.is_predicate(args) and args is not None:
916
943
  args = predicates.args_predicate(args)
@@ -1097,6 +1124,38 @@ class IntegrationTestAPI(DataHandler):
1097
1124
  self.__assert_pred("Event count", count_pred, len(results), msg)
1098
1125
  return results
1099
1126
 
1127
+ ######################################################################################
1128
+ # File Uplink functions
1129
+ ######################################################################################
1130
+
1131
+ def uplink_file_and_await_completion(self, file_path, destination=None, timeout=10):
1132
+ """
1133
+ This function will upload a file and wait for its completion, awaiting for the
1134
+ FileReceived event.
1135
+
1136
+ Args:
1137
+ file_path: the path to the file to upload
1138
+ destination: the destination path for the uploaded file
1139
+ timeout: the maximum time to wait for the event
1140
+ """
1141
+ self.uplink_file(file_path, destination)
1142
+ self.await_event("FileReceived", timeout=timeout)
1143
+
1144
+ def uplink_file(self, file_path, destination=None):
1145
+ """
1146
+ This function will upload a file to the specified location.
1147
+
1148
+ Note: this will simply put the file on the outgoing queue. No guarantee
1149
+ is made on when the file will be delivered. To wait for the completion of
1150
+ the file uplink, use uplink_file_and_await_completion()
1151
+
1152
+ Args:
1153
+ file_path: the path to the file to upload
1154
+ """
1155
+ uplink_file = Path(self.pipeline.up_store) / Path(file_path).name
1156
+ shutil.copy2(file_path, uplink_file)
1157
+ self.pipeline.files.uplinker.enqueue(str(uplink_file), destination)
1158
+
1100
1159
  ######################################################################################
1101
1160
  # History Searches
1102
1161
  ######################################################################################
@@ -1207,11 +1266,13 @@ class IntegrationTestAPI(DataHandler):
1207
1266
  return searcher.get_return_value()
1208
1267
  time.sleep(0.1)
1209
1268
  except self.TimeoutException:
1210
- self.__log(f'{name} timed out and ended unsuccessfully.', TestLogger.YELLOW)
1269
+ self.__log(
1270
+ f"{name} timed out and ended unsuccessfully.", TestLogger.YELLOW
1271
+ )
1211
1272
  finally:
1212
1273
  signal.alarm(0)
1213
1274
  else:
1214
- self.__log(f'{name} ended unsuccessfully.', TestLogger.YELLOW)
1275
+ self.__log(f"{name} ended unsuccessfully.", TestLogger.YELLOW)
1215
1276
  return searcher.get_return_value()
1216
1277
 
1217
1278
  def find_history_item(self, search_pred, history, start=None, timeout=0):
@@ -1365,7 +1426,9 @@ class IntegrationTestAPI(DataHandler):
1365
1426
  self.log(f"Count search counted another item: {item}")
1366
1427
  self.ret_val.append(item)
1367
1428
  if self.count_pred(len(self.ret_val)):
1368
- msg = f"Count search found a correct amount: {len(self.ret_val)}"
1429
+ msg = (
1430
+ f"Count search found a correct amount: {len(self.ret_val)}"
1431
+ )
1369
1432
  self.log(msg, TestLogger.YELLOW)
1370
1433
  return True
1371
1434
  return False
@@ -40,7 +40,7 @@ class ConfigBadTypeException(Exception):
40
40
  config_name (string): Name of the config containing the bad type
41
41
  type_str (string): Bad type string that caused the error
42
42
  """
43
- print(f"Invalid type string {type_str} read in configuration {config_name}")
43
+ super().__init__(f"Invalid type string {type_str} read in configuration {config_name}")
44
44
 
45
45
 
46
46
  class ConfigManager(configparser.ConfigParser):