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.
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/PKG-INFO +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/pyproject.toml +1 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/decoders/ch_decoder.py +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/decoders/event_decoder.py +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/decoders/pkt_decoder.py +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/distributor/distributor.py +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/cmd_encoder.py +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/encoder.py +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/seq_writer.py +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/gds_cli/base_commands.py +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/gds_cli/channels.py +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/gds_cli/command_send.py +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/gds_cli/events.py +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/handlers.py +56 -0
- {fprime_gds-4.0.1/src/fprime_gds/common/pipeline → fprime_gds-4.0.2a2/src/fprime_gds/common/models}/dictionaries.py +1 -0
- fprime_gds-4.0.2a2/src/fprime_gds/common/pipeline/publishing.py +111 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/pipeline/standard.py +9 -22
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/testing_fw/api.py +86 -23
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/utils/config_manager.py +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/apps.py +59 -14
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/cli.py +34 -5
- fprime_gds-4.0.2a2/src/fprime_gds/executables/dictionary_merge.py +206 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/fprime_cli.py +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/run_deployment.py +19 -6
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds.egg-info/PKG-INFO +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds.egg-info/SOURCES.txt +3 -3
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds.egg-info/entry_points.txt +1 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/distributor/test_distributor.py +1 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/encoders/test_ch_encoder.py +2 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/encoders/test_event_encoder.py +2 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/encoders/test_pkt_encoder.py +2 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/testing_fw/api_unit_test.py +10 -2
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/test_run_deployment.py +3 -1
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/test_plugins.py +58 -21
- fprime_gds-4.0.1/src/fprime_gds/common/models/common/channel_telemetry.py +0 -174
- fprime_gds-4.0.1/src/fprime_gds/common/models/common/event.py +0 -121
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/actions/codeql/security-pack.yml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/actions/spelling/excludes.txt +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/actions/spelling/expect.txt +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/actions/spelling/patterns.txt +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/pull_request_template.md +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/resources/RefTopologyAppDictionary.xml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/workflows/codeql-security-scan.yml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/workflows/fprime-gds-tests.yml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/workflows/gds-cli-tests.yml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/workflows/publish.yml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.github/workflows/spelling.yml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/.gitignore +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/Doxyfile +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/LICENSE.txt +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/NOTICE.txt +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/README.md +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/configs/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/docs/README.md +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/docs/_static/css/rtd_width.css +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/docs/conf.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/docs/gendoc.bash +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/docs/index.rst +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/examples/simple_sequence.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/examples/simple_sequence.seq +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/setup.cfg +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/setup.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fastentrypoints.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/adapters/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/adapters/base.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/adapters/ip.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/adapters/uart.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/ccsds/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/ccsds/apid.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/ccsds/chain.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/ccsds/space_data_link.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/ccsds/space_packet.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/checksum.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/framing.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/ground.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/communication/updown.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/controllers/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/ch_data.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/cmd_data.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/event_data.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/exceptions.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/file_data.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/pkt_data.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/data_types/sys_data.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/decoders/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/decoders/decoder.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/decoders/file_decoder.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/distributor/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/ch_encoder.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/event_encoder.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/file_encoder.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/encoders/pkt_encoder.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/files/File Decoder Documentation.txt +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/files/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/files/downlinker.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/files/helpers.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/files/uplinker.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/README.md +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/SPEC.md +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/bytecode/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/bytecode/directives.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/codegen.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/grammar.lark +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/main.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/fpy/parser.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/gds_cli/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/gds_cli/filtering_utils.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/gds_cli/test_api_utils.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/history/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/history/chrono.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/history/history.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/history/ram.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/history/test.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/ch_json_loader.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/ch_xml_loader.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/cmd_json_loader.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/cmd_xml_loader.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/dict_loader.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/event_json_loader.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/event_xml_loader.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/fw_type_json_loader.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/json_loader.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/pkt_json_loader.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/pkt_xml_loader.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/prm_json_loader.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/loaders/xml_loader.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/logger/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/logger/data_logger.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/logger/test_logger.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/models/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/models/common/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/models/common/command.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/parsers/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/parsers/seq_file_parser.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/pipeline/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/pipeline/encoding.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/pipeline/files.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/pipeline/histories.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/pipeline/router.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/templates/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/templates/ch_template.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/templates/cmd_template.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/templates/data_template.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/templates/event_template.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/templates/pkt_template.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/templates/prm_template.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/testing_fw/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/testing_fw/predicates.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/testing_fw/pytest_integration.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/tools/README.md +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/tools/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/tools/params.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/tools/seqgen.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/transport.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/utils/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/utils/data_desc_type.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/utils/event_severity.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/utils/string_util.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/common/zmq_transport.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/comm.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/data_product_writer.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/tcpserver.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/executables/utils.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/app.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/channels.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/commands.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/components.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/default_settings.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/errors.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/events.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/json.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/logs.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/requirements.txt +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/resource.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/sequence.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/.idea/.gitignore +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/.idea/misc.xml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/.idea/modules.xml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/.idea/static.iml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/.idea/vcs.xml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/advanced-settings/addon-templates.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/advanced-settings/addon.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/channel-render/addon.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/channel-render/channel-render-template.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/channel-render/channel-render.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/addon-templates.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/addon.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/config.js +0 -0
- {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
- {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
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/flat.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/sibling.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/vendor/chart.js +0 -0
- {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
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/chart-display/vendor/hammer.min.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/addon.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/argument-templates.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/arguments.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/command-history-template.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/command-history.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/command-input-template.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/command-input.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/command-string-template.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/commanding/command-string.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/dictionary/addon-templates.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/dictionary/addon.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/enabled.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/image-display/addon.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/image-display/dashboard.xml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/README.md +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/addon-templates.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/addon.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/autocomplete.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/lint.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/third/code-mirror.es.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/.gitignore +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/index.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/language.grammer +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/package.json +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/rollup.config.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/css/fprime.css +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/css/fpstyle.css +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/favicon.ico +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/img/error.svg +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/img/logo.svg +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/img/success.svg +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/index.html +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/config.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/datastore.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/gds.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/json.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/loader.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/performance.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/settings.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/uploader.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/validate.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/channel.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/dashboard-box.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/dashboard-row.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/dashboard.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/downlink.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/event.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/fp-row.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/fptable.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/log.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/tabetc.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/uplink.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/js/vue-support/utils.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/css/all.min.css +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/css/bootstrap.min.css +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/css/vue-select.css +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/js/luxon.min.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/js/sorttable.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/js/v-runtime-template.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/js/vue-select.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/js/vue.min.js +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.eot +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.svg +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.ttf +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff2 +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.eot +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.svg +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.ttf +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff2 +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.eot +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.svg +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.ttf +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff2 +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/stats.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/flask/updown.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/plugin/__init__.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/plugin/definitions.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/plugin/system.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds/version.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds.egg-info/dependency_links.txt +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds.egg-info/requires.txt +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/src/fprime_gds.egg-info/top_level.txt +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/communication/ccsds/test_space_data_link.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/communication/ccsds/test_space_packet.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/data_types/test_cmd_data.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/fpy/disabled_test_compiler.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/gds_cli/filtering_utils_test.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/gds_cli/utils_test.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/history/chronohistory_unit_test.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/history/testhistory_unit_test.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/loaders/resources/RefTopologyDictionary.json +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/loaders/test_json_loader.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/testing_fw/UnitTestDictionary.xml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/testing_fw/logs/.gitignore +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/testing_fw/predicate_unit_test.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/expected/simple_expected.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/expected/simple_paramdb.dat +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/input/simple_bad_paramdb.json +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/input/simple_bad_sequence.seq +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/input/simple_paramdb.json +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/input/simple_sequence.seq +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/resources/simple_dictionary.json +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/resources/simple_dictionary.xml +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/seqgen_unit_test.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/tools/test_paramdb_gen.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/common/utils/test_string_util.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/.gitignore +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/dictionary.json +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeBool.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeComplex.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeDataArray.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeEnum.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeF32.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeF64.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeFppArray.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeI16.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeI32.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeI64.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeI8.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeU32.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeU32Array.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/dp_writer_data/makeU8Array.bin +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/test_data_product_writer.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/executables/test_utils.py +0 -0
- {fprime_gds-4.0.1 → fprime_gds-4.0.2a2}/test/fprime_gds/sample/dictionary.xml +0 -0
- {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.
|
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
|
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
|
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
|
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
|
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
|
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")
|
@@ -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.
|
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.
|
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.
|
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.
|
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
|
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 =
|
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
|
-
|
61
|
+
dictionaries,
|
62
62
|
file_store,
|
63
63
|
logging_prefix=None,
|
64
|
-
|
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
|
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
|
-
|
78
|
-
|
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.
|
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 [
|
75
|
+
for subdir in ["bin", "dict"]:
|
75
76
|
dir_path = base_dir / subdir
|
76
77
|
if dir_path.is_dir():
|
77
|
-
shutil.copytree(
|
78
|
-
|
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
|
-
"""
|
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
|
167
|
+
ast_msg = f"{ast_msg} succeeded: {msg}"
|
166
168
|
self.__log(ast_msg, TestLogger.GREEN)
|
167
169
|
else:
|
168
|
-
ast_msg = f
|
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,
|
244
|
+
with open(dictionary, "r") as file:
|
243
245
|
data = json.load(file)
|
244
|
-
return data[
|
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
|
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,
|
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(
|
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 = [
|
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 = [
|
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 =
|
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 = [
|
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 =
|
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(
|
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
|
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 =
|
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
|
-
|
43
|
+
super().__init__(f"Invalid type string {type_str} read in configuration {config_name}")
|
44
44
|
|
45
45
|
|
46
46
|
class ConfigManager(configparser.ConfigParser):
|