sift-stack-py 0.17.0.dev1__tar.gz → 0.17.0.dev2__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.
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/PKG-INFO +2 -1
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/_test_results_log.py +6 -2
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/test_results.py +11 -3
- sift_stack_py-0.17.0.dev2/lib/sift_client/_internal/pyproject_config.py +84 -0
- sift_stack_py-0.17.0.dev2/lib/sift_client/_internal/util/hdf5.py +271 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/pytest_plugin.py +681 -209
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/data_imports.py +87 -14
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/sync_stubs/__init__.pyi +29 -10
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/test_results.py +2 -1
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/scripts/import_test_result_log.py +2 -1
- sift_stack_py-0.17.0.dev2/lib/sift_client/sift_types/_mixins/metadata.py +19 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/asset.py +2 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/data_import.py +54 -16
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/report.py +2 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/run.py +2 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/test_report.py +6 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/util/test_results/context_manager.py +16 -2
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_stack_py.egg-info/PKG-INFO +2 -1
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_stack_py.egg-info/SOURCES.txt +2 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_stack_py.egg-info/requires.txt +3 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/pyproject.toml +2 -1
- sift_stack_py-0.17.0.dev1/lib/sift_client/_internal/util/hdf5.py +0 -96
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/LICENSE +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/README.md +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/annotation_logs/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/annotation_logs/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/annotation_logs/v1/annotation_logs_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/annotation_logs/v1/annotation_logs_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/annotation_logs/v1/annotation_logs_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/annotation_logs/v1/annotation_logs_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/annotations/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/annotations/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/annotations/v1/annotations_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/annotations/v1/annotations_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/annotations/v1/annotations_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/annotations/v1/annotations_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/api_keys/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/api_keys/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/api_keys/v2/api_keys_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/api_keys/v2/api_keys_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/api_keys/v2/api_keys_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/api_keys/v2/api_keys_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/assets/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/assets/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/assets/v1/assets_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/assets/v1/assets_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/assets/v1/assets_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/assets/v1/assets_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/calculated_channels/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/calculated_channels/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/calculated_channels/v1/calculated_channels_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/calculated_channels/v1/calculated_channels_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/calculated_channels/v1/calculated_channels_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/calculated_channels/v1/calculated_channels_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/calculated_channels/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/calculated_channels/v2/calculated_channels_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/calculated_channels/v2/calculated_channels_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/calculated_channels/v2/calculated_channels_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/calculated_channels/v2/calculated_channels_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/campaigns/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/campaigns/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/campaigns/v1/campaigns_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/campaigns/v1/campaigns_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/campaigns/v1/campaigns_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/campaigns/v1/campaigns_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channel_schemas/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channel_schemas/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channel_schemas/v1/channel_schemas_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channel_schemas/v1/channel_schemas_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channel_schemas/v1/channel_schemas_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channel_schemas/v1/channel_schemas_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channel_schemas/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channel_schemas/v2/channel_schemas_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channel_schemas/v2/channel_schemas_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channel_schemas/v2/channel_schemas_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channel_schemas/v2/channel_schemas_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channels/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channels/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channels/v2/channels_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channels/v2/channels_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channels/v2/channels_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channels/v2/channels_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channels/v3/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channels/v3/channels_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channels/v3/channels_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channels/v3/channels_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/channels/v3/channels_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/comment/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/comment/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/comment/v1/comment_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/comment/v1/comment_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/comment/v1/comment_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/comment/v1/comment_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/calculated_channels_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/calculated_channels_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/calculated_channels_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/calculated_channels_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_bit_field_element_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_bit_field_element_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_bit_field_element_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_bit_field_element_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_config_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_config_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_config_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_config_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_data_type_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_data_type_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_data_type_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_data_type_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_enum_type_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_enum_type_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_enum_type_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/channel_enum_type_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/organization_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/organization_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/organization_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/organization_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/resource_identifier_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/resource_identifier_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/resource_identifier_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/resource_identifier_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/resource_ref_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/resource_ref_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/resource_ref_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/resource_ref_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/user_defined_functions_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/user_defined_functions_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/user_defined_functions_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/user_defined_functions_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/user_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/user_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/user_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/type/v1/user_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/v1/action_type_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/v1/action_type_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/v1/action_type_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/v1/action_type_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/v1/filter_field_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/v1/filter_field_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/v1/filter_field_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/v1/filter_field_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/v1/resource_type_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/v1/resource_type_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/v1/resource_type_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/common/v1/resource_type_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data/v1/data_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data/v1/data_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data/v1/data_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data/v1/data_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data/v2/data_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data/v2/data_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data/v2/data_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data/v2/data_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data_imports/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data_imports/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data_imports/v2/data_imports_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data_imports/v2/data_imports_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data_imports/v2/data_imports_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/data_imports/v2/data_imports_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/dlq_errors/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/dlq_errors/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/dlq_errors/v2/dlq_errors_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/dlq_errors/v2/dlq_errors_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/dlq_errors/v2/dlq_errors_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/dlq_errors/v2/dlq_errors_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/exports/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/exports/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/exports/v1/exports_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/exports/v1/exports_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/exports/v1/exports_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/exports/v1/exports_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/external_sync/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/external_sync/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/external_sync/v1/external_sync_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/external_sync/v1/external_sync_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/external_sync/v1/external_sync_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/external_sync/v1/external_sync_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingest/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingest/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingest/v1/ingest_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingest/v1/ingest_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingest/v1/ingest_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingest/v1/ingest_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingestion_configs/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingestion_configs/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingestion_configs/v1/ingestion_configs_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingestion_configs/v1/ingestion_configs_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingestion_configs/v1/ingestion_configs_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingestion_configs/v1/ingestion_configs_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingestion_configs/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingestion_configs/v2/ingestion_configs_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingestion_configs/v2/ingestion_configs_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingestion_configs/v2/ingestion_configs_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ingestion_configs/v2/ingestion_configs_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/jobs/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/jobs/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/jobs/v1/jobs_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/jobs/v1/jobs_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/jobs/v1/jobs_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/jobs/v1/jobs_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/me/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/me/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/me/v2/me_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/me/v2/me_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/me/v2/me_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/me/v2/me_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/metadata/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/metadata/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/metadata/v1/metadata_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/metadata/v1/metadata_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/metadata/v1/metadata_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/metadata/v1/metadata_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/notifications/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/notifications/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/notifications/v1/notifications_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/notifications/v1/notifications_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/notifications/v1/notifications_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/notifications/v1/notifications_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/panel_configurations/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/panel_configurations/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/panel_configurations/v1/panel_configuration_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/panel_configurations/v1/panel_configuration_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/panel_configurations/v1/panel_configuration_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/panel_configurations/v1/panel_configuration_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ping/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ping/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ping/v1/ping_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ping/v1/ping_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ping/v1/ping_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/ping/v1/ping_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/protobuf_descriptors/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/protobuf_descriptors/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/protobuf_descriptors/v2/channel_parsing_options_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/protobuf_descriptors/v2/channel_parsing_options_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/protobuf_descriptors/v2/channel_parsing_options_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/protobuf_descriptors/v2/channel_parsing_options_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/protobuf_descriptors/v2/protobuf_descriptors_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/protobuf_descriptors/v2/protobuf_descriptors_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/protobuf_descriptors/v2/protobuf_descriptors_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/protobuf_descriptors/v2/protobuf_descriptors_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/py.typed +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/remote_files/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/remote_files/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/remote_files/v1/remote_files_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/remote_files/v1/remote_files_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/remote_files/v1/remote_files_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/remote_files/v1/remote_files_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/report_templates/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/report_templates/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/report_templates/v1/report_templates_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/report_templates/v1/report_templates_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/report_templates/v1/report_templates_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/report_templates/v1/report_templates_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/reports/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/reports/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/reports/v1/reports_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/reports/v1/reports_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/reports/v1/reports_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/reports/v1/reports_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/roles/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/roles/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/roles/v2/roles_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/roles/v2/roles_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/roles/v2/roles_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/roles/v2/roles_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/rule_evaluation/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/rule_evaluation/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/rule_evaluation/v1/rule_evaluation_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/rule_evaluation/v1/rule_evaluation_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/rule_evaluation/v1/rule_evaluation_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/rule_evaluation/v1/rule_evaluation_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/rules/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/rules/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/rules/v1/rules_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/rules/v1/rules_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/rules/v1/rules_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/rules/v1/rules_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/runs/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/runs/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/runs/v2/runs_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/runs/v2/runs_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/runs/v2/runs_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/runs/v2/runs_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/saved_searches/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/saved_searches/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/saved_searches/v1/saved_searches_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/saved_searches/v1/saved_searches_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/saved_searches/v1/saved_searches_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/saved_searches/v1/saved_searches_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/tags/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/tags/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/tags/v1/tags_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/tags/v1/tags_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/tags/v1/tags_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/tags/v1/tags_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/tags/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/tags/v2/tags_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/tags/v2/tags_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/tags/v2/tags_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/tags/v2/tags_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/test_reports/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/test_reports/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/test_reports/v1/test_reports_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/test_reports/v1/test_reports_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/test_reports/v1/test_reports_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/test_reports/v1/test_reports_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/unit/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/unit/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/unit/v2/unit_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/unit/v2/unit_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/unit/v2/unit_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/unit/v2/unit_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/user_defined_functions/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/user_defined_functions/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/user_defined_functions/v1/user_defined_functions_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/user_defined_functions/v1/user_defined_functions_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/user_defined_functions/v1/user_defined_functions_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/user_defined_functions/v1/user_defined_functions_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/user_groups/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/user_groups/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/user_groups/v2/user_groups_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/user_groups/v2/user_groups_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/user_groups/v2/user_groups_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/user_groups/v2/user_groups_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/users/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/users/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/users/v2/users_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/users/v2/users_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/users/v2/users_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/users/v2/users_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/views/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/views/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/views/v1/views_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/views/v1/views_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/views/v1/views_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/views/v1/views_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/views/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/views/v2/views_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/views/v2/views_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/views/v2/views_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/views/v2/views_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/webhooks/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/webhooks/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/webhooks/v1/webhooks_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/webhooks/v1/webhooks_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/webhooks/v1/webhooks_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift/webhooks/v1/webhooks_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/gen_pyi.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/grpc_transport/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/grpc_transport/_async_interceptors/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/grpc_transport/_async_interceptors/base.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/grpc_transport/_async_interceptors/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/grpc_transport/_interceptors/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/grpc_transport/_interceptors/base.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/grpc_transport/_interceptors/context.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/grpc_transport/_interceptors/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/grpc_transport/_retry.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/grpc_transport/keepalive.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/grpc_transport/server_interceptors/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/grpc_transport/server_interceptors/server_interceptor.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/grpc_transport/transport.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/grpc_transport/transport_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/assets.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/base.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/calculated_channels.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/channels.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/data.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/data_imports.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/exports.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/ingestion.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/jobs.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/ping.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/remote_files.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/reports.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/rules.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/runs.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/tags.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/low_level_wrappers/upload.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/rest.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/sync_wrapper.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/time.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/urls.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/util/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/util/channels.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/util/executor.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/util/file.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/util/numpy_types.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/util/tdms.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/util/timestamp.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/_internal/util/util.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/client.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/config.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/errors.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/py.typed +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/_base.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/assets.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/calculated_channels.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/channels.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/exports.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/file_attachments.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/ingestion.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/jobs.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/ping.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/py.typed +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/reports.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/rules.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/runs.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/sync_stubs/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/sync_stubs/py.typed +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/resources/tags.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/scripts/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/_base.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/_mixins/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/_mixins/file_attachments.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/_mixins/simulated.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/calculated_channel.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/channel.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/export.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/file_attachment.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/ingestion.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/job.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/rule.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/sift_types/tag.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/transport/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/transport/base_connection.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/transport/grpc_transport.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/transport/rest_transport.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/util/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/util/cel_utils.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/util/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/util/test_results/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/util/test_results/bounds.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_client/util/util.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/cel.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/channel.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/convert/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/convert/json.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/convert/protobuf.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/convert/timestamp.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/metadata_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/test_util/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/test_util/channel.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/test_util/fn.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/test_util/server_interceptor.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/time.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_internal/user.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/_rest_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/asset/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/asset/_config_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/asset/_internal/shared.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/asset/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/asset/config.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/asset/service.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/calculated_channels/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/calculated_channels/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/calculated_channels/config.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/calculated_channels/service.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data/_channel.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data/_deserialize.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data/_deserialize_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data/_validate.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data/error.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data/query.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data/service.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/_config.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/_config_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/_csv_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/_hdf5_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/_parquet_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/_ros_channel.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/_rosbag_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/_status_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/_tdms_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/_utils.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/_utils_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/ch10.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/config.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/csv.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/hdf5.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/parquet.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/parquet_complex_types.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/rosbags.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/status.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/tdms.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/tempfile.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/data_import/time_format.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/error.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/file_attachment/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/file_attachment/_internal/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/file_attachment/_internal/download.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/file_attachment/_internal/upload.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/file_attachment/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/file_attachment/entity.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/file_attachment/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/file_attachment/service.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/grpc/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/grpc/_async_interceptors/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/grpc/_async_interceptors/base.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/grpc/_async_interceptors/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/grpc/_interceptors/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/grpc/_interceptors/base.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/grpc/_interceptors/context.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/grpc/_interceptors/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/grpc/_retry.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/grpc/keepalive.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/grpc/transport.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/grpc/transport_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/_internal/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/_internal/channel.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/_internal/error.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/_internal/ingest.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/_internal/ingest_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/_internal/ingestion_config.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/_internal/run.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/buffer.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/channel.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/config/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/config/_telemetry_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/config/telemetry.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/config/yaml/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/config/yaml/error.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/config/yaml/load.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/config/yaml/spec.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/config/yaml/test_load.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/flow.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/manager.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/rule/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/rule/config.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/ingestion/service.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/py.typed +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/report/_report_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/report/service.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/report_templates/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/report_templates/_config_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/report_templates/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/report_templates/config.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/report_templates/service.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/rest.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/rule/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/rule/_config_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/rule/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/rule/config.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/rule/service.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/rule_evaluation/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/rule_evaluation/service.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/tag/_internal/shared.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/yaml/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/yaml/_channel_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/yaml/_rule_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/yaml/_utils_test.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/yaml/calculated_channels.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/yaml/channel.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/yaml/report_templates.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/yaml/rule.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_py/yaml/utils.py +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_stack_py.egg-info/dependency_links.txt +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_stack_py.egg-info/entry_points.txt +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/lib/sift_stack_py.egg-info/top_level.txt +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/setup.cfg +0 -0
- {sift_stack_py-0.17.0.dev1 → sift_stack_py-0.17.0.dev2}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sift_stack_py
|
|
3
|
-
Version: 0.17.0.
|
|
3
|
+
Version: 0.17.0.dev2
|
|
4
4
|
Summary: Python client library for the Sift API
|
|
5
5
|
Maintainer-email: Sift Software Engineers <engineering@siftstack.com>
|
|
6
6
|
License: Copyright (c) 2024 Azimuth Industries Inc.
|
|
@@ -46,6 +46,7 @@ Requires-Dist: types-requests~=2.25
|
|
|
46
46
|
Requires-Dist: googleapis-common-protos>=1.60
|
|
47
47
|
Requires-Dist: protoc-gen-openapiv2>=0.0.1
|
|
48
48
|
Requires-Dist: filelock~=3.13
|
|
49
|
+
Requires-Dist: tomli~=2.0; python_version < "3.11"
|
|
49
50
|
Provides-Extra: all
|
|
50
51
|
Requires-Dist: cffi~=1.14; extra == "all"
|
|
51
52
|
Requires-Dist: h5py~=3.11; extra == "all"
|
|
@@ -143,9 +143,13 @@ class _ReplayState:
|
|
|
143
143
|
|
|
144
144
|
@dataclass
|
|
145
145
|
class ReplayResult:
|
|
146
|
-
"""Result of replaying a log file.
|
|
146
|
+
"""Result of replaying a log file.
|
|
147
147
|
|
|
148
|
-
report
|
|
148
|
+
``report`` is None on an incremental resume tick that uploaded only steps or
|
|
149
|
+
measurements; the report itself was created on an earlier tick.
|
|
150
|
+
"""
|
|
151
|
+
|
|
152
|
+
report: TestReport | None = None
|
|
149
153
|
steps: list[TestStep] = field(default_factory=list)
|
|
150
154
|
measurements: list[TestMeasurement] = field(default_factory=list)
|
|
151
155
|
|
|
@@ -1072,13 +1072,17 @@ class TestResultsLowLevelClient(LowLevelClientBase, WithGrpcClient):
|
|
|
1072
1072
|
id_map: dict[str, str],
|
|
1073
1073
|
state: _ReplayState,
|
|
1074
1074
|
) -> None:
|
|
1075
|
-
if state.report is None:
|
|
1076
|
-
raise ValueError("UpdateTestReport found before CreateTestReport")
|
|
1077
1075
|
request = UpdateTestReportRequest()
|
|
1078
1076
|
json_format.Parse(json_str, request)
|
|
1079
1077
|
request.test_report.test_report_id = self._map_id(
|
|
1080
1078
|
id_map, request.test_report.test_report_id
|
|
1081
1079
|
)
|
|
1080
|
+
# Batch/simulate replays the whole log in order, so a missing report means
|
|
1081
|
+
# the log is malformed. Incremental replay may have created the report on an
|
|
1082
|
+
# earlier tick (its real ID lives in id_map), so state.report is legitimately
|
|
1083
|
+
# None here -- the mapped ID is enough to issue the update.
|
|
1084
|
+
if simulate and state.report is None:
|
|
1085
|
+
raise ValueError("UpdateTestReport found before CreateTestReport")
|
|
1082
1086
|
state.report = await self.update_test_report(
|
|
1083
1087
|
request=request, simulate=simulate, existing=state.report
|
|
1084
1088
|
)
|
|
@@ -1203,6 +1207,7 @@ class TestResultsLowLevelClient(LowLevelClientBase, WithGrpcClient):
|
|
|
1203
1207
|
next tick.
|
|
1204
1208
|
"""
|
|
1205
1209
|
tracking = LogTracking.load(log_path)
|
|
1210
|
+
resuming = tracking.last_uploaded_line > 0
|
|
1206
1211
|
id_map = tracking.id_map
|
|
1207
1212
|
state = _ReplayState()
|
|
1208
1213
|
|
|
@@ -1221,7 +1226,10 @@ class TestResultsLowLevelClient(LowLevelClientBase, WithGrpcClient):
|
|
|
1221
1226
|
tracking.last_uploaded_line += 1
|
|
1222
1227
|
tracking.save(log_path)
|
|
1223
1228
|
|
|
1224
|
-
|
|
1229
|
+
# On a resume tick the CreateTestReport line was consumed on an earlier
|
|
1230
|
+
# tick, so state.report is expected to be None; the report already exists
|
|
1231
|
+
# on the server. Only a genuine first pass over an empty log is an error.
|
|
1232
|
+
if state.report is None and not resuming:
|
|
1225
1233
|
raise ValueError("No CreateTestReport found in log file")
|
|
1226
1234
|
|
|
1227
1235
|
return ReplayResult(
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""Loader for the ``[tool.sift]`` table in a project's ``pyproject.toml``.
|
|
2
|
+
|
|
3
|
+
The pytest plugin consumes this loader to resolve report-content config (under
|
|
4
|
+
``[tool.sift.pytest.report]``) and SDK-level fallbacks (URIs under
|
|
5
|
+
``[tool.sift]``). A malformed or missing ``pyproject.toml`` returns ``{}`` so a
|
|
6
|
+
bad config file never aborts the session — the plugin falls back to its
|
|
7
|
+
built-in defaults and surfaces a single warning.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import warnings
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import TYPE_CHECKING, Any
|
|
15
|
+
|
|
16
|
+
# ``tomllib`` landed in 3.11; ``tomli`` is the same parser packaged for older
|
|
17
|
+
# interpreters and is declared as a conditional install dep on 3.8-3.10.
|
|
18
|
+
try:
|
|
19
|
+
import tomllib # type: ignore[import-not-found,unused-ignore]
|
|
20
|
+
except ImportError: # pragma: no cover - exercised on 3.8-3.10 only
|
|
21
|
+
import tomli as tomllib # type: ignore[no-redef,import-not-found,unused-ignore]
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
import pytest
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# Bound the upward walk so a misconfigured environment can't trigger an
|
|
28
|
+
# unbounded filesystem traversal looking for a project root that isn't there.
|
|
29
|
+
_MAX_PARENT_WALK = 3
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _find_pyproject(config: pytest.Config) -> Path | None:
|
|
33
|
+
"""Locate the active project's ``pyproject.toml``.
|
|
34
|
+
|
|
35
|
+
Order:
|
|
36
|
+
1. ``config.inipath`` when it is itself a ``pyproject.toml`` (the common
|
|
37
|
+
case: project uses ``[tool.pytest.ini_options]`` so pytest loaded the
|
|
38
|
+
ini settings directly from pyproject).
|
|
39
|
+
2. ``<config.rootpath>/pyproject.toml``.
|
|
40
|
+
3. A bounded walk upward from ``rootpath`` for monorepo layouts where
|
|
41
|
+
pytest's rootdir is a subdirectory and the project pyproject lives
|
|
42
|
+
higher up.
|
|
43
|
+
"""
|
|
44
|
+
inipath = config.inipath
|
|
45
|
+
if inipath is not None and inipath.name == "pyproject.toml" and inipath.is_file():
|
|
46
|
+
return inipath
|
|
47
|
+
cur = Path(config.rootpath).resolve()
|
|
48
|
+
candidate = cur / "pyproject.toml"
|
|
49
|
+
if candidate.is_file():
|
|
50
|
+
return candidate
|
|
51
|
+
for _ in range(_MAX_PARENT_WALK):
|
|
52
|
+
cur = cur.parent
|
|
53
|
+
candidate = cur / "pyproject.toml"
|
|
54
|
+
if candidate.is_file():
|
|
55
|
+
return candidate
|
|
56
|
+
return None
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def load_tool_sift(config: pytest.Config) -> dict[str, Any]:
|
|
60
|
+
"""Return the parsed ``[tool.sift]`` table from the project's pyproject.toml.
|
|
61
|
+
|
|
62
|
+
Returns ``{}`` when no pyproject is discoverable, when the file omits the
|
|
63
|
+
``[tool.sift]`` table, or when parsing fails. A parse / IO failure emits a
|
|
64
|
+
single :class:`SiftPytestPluginWarning` so the session continues with
|
|
65
|
+
defaults rather than aborting on a malformed file.
|
|
66
|
+
"""
|
|
67
|
+
pyproject = _find_pyproject(config)
|
|
68
|
+
if pyproject is None:
|
|
69
|
+
return {}
|
|
70
|
+
try:
|
|
71
|
+
with pyproject.open("rb") as fh:
|
|
72
|
+
data = tomllib.load(fh)
|
|
73
|
+
except (OSError, tomllib.TOMLDecodeError) as exc:
|
|
74
|
+
# Deferred import: ``pytest_plugin`` imports this loader, so a
|
|
75
|
+
# top-level import here would close the cycle at module load time.
|
|
76
|
+
from sift_client.pytest_plugin import SiftPytestPluginWarning
|
|
77
|
+
|
|
78
|
+
warnings.warn(
|
|
79
|
+
f"Failed to read {pyproject} for [tool.sift]: {type(exc).__name__}: {exc}",
|
|
80
|
+
SiftPytestPluginWarning,
|
|
81
|
+
stacklevel=2,
|
|
82
|
+
)
|
|
83
|
+
return {}
|
|
84
|
+
return (data.get("tool") or {}).get("sift") or {}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
"""HDF5 schema detection.
|
|
2
|
+
|
|
3
|
+
HDF5 files have no single canonical layout, so detection is parameterized
|
|
4
|
+
by an ``Hdf5Schema``: ``ONE_D`` (per-group time dataset + sibling 1D values,
|
|
5
|
+
with an ancestor walk-up), ``TWO_D`` (``[N, 2]`` datasets where col 0 is
|
|
6
|
+
time), or ``COMPOUND`` (struct-like datasets whose first field is time).
|
|
7
|
+
Each detector walks every dataset in the file recursively; datasets that
|
|
8
|
+
don't fit the chosen schema are not included in the resulting config."""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Callable
|
|
14
|
+
|
|
15
|
+
import h5py
|
|
16
|
+
import numpy as np
|
|
17
|
+
|
|
18
|
+
from sift_client._internal.util.numpy_types import numpy_to_sift_type
|
|
19
|
+
from sift_client.sift_types.data_import import (
|
|
20
|
+
DataTypeKey,
|
|
21
|
+
Hdf5DataColumn,
|
|
22
|
+
Hdf5ImportConfig,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
# Heuristic attribute names for channel metadata, in priority order. The
|
|
26
|
+
# first non-empty value found on a dataset wins; missing attributes resolve
|
|
27
|
+
# to empty strings.
|
|
28
|
+
_NAME_ATTRS = ("Name", "name", "Title", "title", "Sensor", "sensor", "Channel", "channel")
|
|
29
|
+
_UNIT_ATTRS = ("Unit", "unit", "Units", "units")
|
|
30
|
+
_DESCRIPTION_ATTRS = ("Description", "description")
|
|
31
|
+
|
|
32
|
+
# Per-group time dataset names, case-insensitive, in priority order.
|
|
33
|
+
_TIME_DATASET_NAMES = ("time", "timestamp", "timestamps", "ts")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _read_string_attr(dataset: h5py.Dataset, candidates: tuple[str, ...]) -> str:
|
|
37
|
+
"""Return the first non-empty string attribute among `candidates`."""
|
|
38
|
+
for name in candidates:
|
|
39
|
+
if name not in dataset.attrs:
|
|
40
|
+
continue
|
|
41
|
+
value = dataset.attrs[name]
|
|
42
|
+
if isinstance(value, bytes):
|
|
43
|
+
value = value.decode("utf-8", errors="replace")
|
|
44
|
+
if isinstance(value, str) and value:
|
|
45
|
+
return value
|
|
46
|
+
# h5py returns multi-element string attrs as ndarrays; take the first.
|
|
47
|
+
if isinstance(value, np.ndarray) and value.size > 0:
|
|
48
|
+
first = value.flat[0]
|
|
49
|
+
if isinstance(first, bytes):
|
|
50
|
+
first = first.decode("utf-8", errors="replace")
|
|
51
|
+
if isinstance(first, str) and first:
|
|
52
|
+
return first
|
|
53
|
+
return ""
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _read_channel_metadata(dataset: h5py.Dataset) -> tuple[str, str, str]:
|
|
57
|
+
"""Return ``(name, units, description)`` discovered from HDF5 attributes."""
|
|
58
|
+
return (
|
|
59
|
+
_read_string_attr(dataset, _NAME_ATTRS),
|
|
60
|
+
_read_string_attr(dataset, _UNIT_ATTRS),
|
|
61
|
+
_read_string_attr(dataset, _DESCRIPTION_ATTRS),
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _is_compound(dataset: h5py.Dataset) -> bool:
|
|
66
|
+
return dataset.dtype.names is not None and len(dataset.dtype.names) > 1
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _is_1d_non_compound(dataset: h5py.Dataset) -> bool:
|
|
70
|
+
return not _is_compound(dataset) and len(dataset.shape) == 1
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _is_2d_n_by_2(dataset: h5py.Dataset) -> bool:
|
|
74
|
+
return not _is_compound(dataset) and len(dataset.shape) == 2 and dataset.shape[1] == 2
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _path_to_channel_name(path: str) -> str:
|
|
78
|
+
"""Sift renders dotted names hierarchically, so ``group1/current`` becomes
|
|
79
|
+
``group1.current``, with ``current`` shown under a ``group1`` folder."""
|
|
80
|
+
return path.replace("/", ".")
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _make_name_deduper() -> Callable[[str, str], str]:
|
|
84
|
+
"""Return a callable that resolves duplicate channel names by appending
|
|
85
|
+
the dataset's dotted path. First claim of a name wins; later claims of
|
|
86
|
+
the same name get the fallback suffix appended."""
|
|
87
|
+
used: set[str] = set()
|
|
88
|
+
|
|
89
|
+
def dedupe(base_name: str, fallback_suffix: str) -> str:
|
|
90
|
+
name = f"{base_name}.{fallback_suffix}" if base_name in used else base_name
|
|
91
|
+
used.add(name)
|
|
92
|
+
return name
|
|
93
|
+
|
|
94
|
+
return dedupe
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _collect_datasets(h5file: h5py.File) -> list[h5py.Dataset]:
|
|
98
|
+
"""Recursively walk every dataset in the file."""
|
|
99
|
+
out: list[h5py.Dataset] = []
|
|
100
|
+
|
|
101
|
+
def visit(_name: str, obj: object) -> None:
|
|
102
|
+
if isinstance(obj, h5py.Dataset):
|
|
103
|
+
out.append(obj)
|
|
104
|
+
|
|
105
|
+
h5file.visititems(visit)
|
|
106
|
+
return out
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _group_by_parent(datasets: list[h5py.Dataset]) -> dict[str, list[h5py.Dataset]]:
|
|
110
|
+
"""Group datasets by their parent group path (``""`` for root-level)."""
|
|
111
|
+
out: dict[str, list[h5py.Dataset]] = {}
|
|
112
|
+
for ds in datasets:
|
|
113
|
+
out.setdefault(ds.name.lstrip("/").rpartition("/")[0], []).append(ds)
|
|
114
|
+
return out
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _resolve_ancestor_time(group_path: str, per_group_time: dict[str, str]) -> str:
|
|
118
|
+
"""Return the closest-ancestor time dataset path for ``group_path``,
|
|
119
|
+
walking up to the root. Empty string if no ancestor has one."""
|
|
120
|
+
cursor = group_path
|
|
121
|
+
while True:
|
|
122
|
+
found = per_group_time.get(cursor)
|
|
123
|
+
if found:
|
|
124
|
+
return found
|
|
125
|
+
if cursor == "":
|
|
126
|
+
return ""
|
|
127
|
+
slash = cursor.rfind("/")
|
|
128
|
+
cursor = "" if slash < 0 else cursor[:slash]
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _build_one_d_configs(datasets: list[h5py.Dataset]) -> list[Hdf5DataColumn]:
|
|
132
|
+
"""1D non-compound schema: at each group, pick a time dataset (by name)
|
|
133
|
+
and pair every other 1D dataset in that group as a value channel.
|
|
134
|
+
Datasets that aren't 1D non-compound are not included."""
|
|
135
|
+
|
|
136
|
+
def identify_time_dataset(group: list[h5py.Dataset]) -> h5py.Dataset | None:
|
|
137
|
+
"""Pick the group's time dataset by leaf name, case-insensitive, in
|
|
138
|
+
priority order. Returns ``None`` if no candidate matches; callers
|
|
139
|
+
fall back to an ancestor group's time before giving up."""
|
|
140
|
+
for candidate in _TIME_DATASET_NAMES:
|
|
141
|
+
for ds in group:
|
|
142
|
+
if ds.name.rsplit("/", 1)[-1].lower() == candidate:
|
|
143
|
+
return ds
|
|
144
|
+
return None
|
|
145
|
+
|
|
146
|
+
columns: list[Hdf5DataColumn] = []
|
|
147
|
+
dedupe = _make_name_deduper()
|
|
148
|
+
|
|
149
|
+
one_d = [ds for ds in datasets if _is_1d_non_compound(ds)]
|
|
150
|
+
grouped = _group_by_parent(one_d)
|
|
151
|
+
|
|
152
|
+
# First pass: each group's own time dataset (if any).
|
|
153
|
+
per_group_time: dict[str, str] = {}
|
|
154
|
+
for group_path, group in grouped.items():
|
|
155
|
+
time_ds = identify_time_dataset(group)
|
|
156
|
+
if time_ds is not None:
|
|
157
|
+
per_group_time[group_path] = time_ds.name.lstrip("/")
|
|
158
|
+
|
|
159
|
+
for group_path, group in grouped.items():
|
|
160
|
+
own_time_path = per_group_time.get(group_path)
|
|
161
|
+
time_path = own_time_path or _resolve_ancestor_time(group_path, per_group_time)
|
|
162
|
+
for ds in group:
|
|
163
|
+
ds_path = ds.name.lstrip("/")
|
|
164
|
+
if own_time_path and ds_path == own_time_path:
|
|
165
|
+
continue
|
|
166
|
+
name, units, description = _read_channel_metadata(ds)
|
|
167
|
+
fallback = _path_to_channel_name(ds_path)
|
|
168
|
+
columns.append(
|
|
169
|
+
Hdf5DataColumn(
|
|
170
|
+
name=dedupe(name or fallback, fallback),
|
|
171
|
+
data_type=numpy_to_sift_type(ds.dtype),
|
|
172
|
+
units=units,
|
|
173
|
+
description=description,
|
|
174
|
+
time_dataset=time_path,
|
|
175
|
+
value_dataset=ds_path,
|
|
176
|
+
time_index=0,
|
|
177
|
+
value_index=0,
|
|
178
|
+
)
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
return columns
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def _build_two_d_configs(datasets: list[h5py.Dataset]) -> list[Hdf5DataColumn]:
|
|
185
|
+
"""2D schema: every dataset with shape ``[N, 2]`` becomes one channel
|
|
186
|
+
(col 0 = time, col 1 = value). Other shapes are not included."""
|
|
187
|
+
columns: list[Hdf5DataColumn] = []
|
|
188
|
+
dedupe = _make_name_deduper()
|
|
189
|
+
|
|
190
|
+
for ds in datasets:
|
|
191
|
+
if not _is_2d_n_by_2(ds):
|
|
192
|
+
continue
|
|
193
|
+
ds_path = ds.name.lstrip("/")
|
|
194
|
+
name, units, description = _read_channel_metadata(ds)
|
|
195
|
+
fallback = _path_to_channel_name(ds_path)
|
|
196
|
+
columns.append(
|
|
197
|
+
Hdf5DataColumn(
|
|
198
|
+
name=dedupe(name or fallback, fallback),
|
|
199
|
+
data_type=numpy_to_sift_type(ds.dtype),
|
|
200
|
+
units=units,
|
|
201
|
+
description=description,
|
|
202
|
+
time_dataset=ds_path,
|
|
203
|
+
value_dataset=ds_path,
|
|
204
|
+
time_index=0,
|
|
205
|
+
value_index=1,
|
|
206
|
+
)
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
return columns
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def _build_compound_configs(datasets: list[h5py.Dataset]) -> list[Hdf5DataColumn]:
|
|
213
|
+
"""Compound schema: every compound dataset becomes one channel per
|
|
214
|
+
non-time member. First member is time. Non-compound datasets are not included."""
|
|
215
|
+
columns: list[Hdf5DataColumn] = []
|
|
216
|
+
dedupe = _make_name_deduper()
|
|
217
|
+
|
|
218
|
+
for ds in datasets:
|
|
219
|
+
if not _is_compound(ds):
|
|
220
|
+
continue
|
|
221
|
+
field_names = ds.dtype.names
|
|
222
|
+
assert field_names is not None # guaranteed by _is_compound
|
|
223
|
+
time_field = field_names[0]
|
|
224
|
+
value_fields = field_names[1:]
|
|
225
|
+
ds_path = ds.name.lstrip("/")
|
|
226
|
+
name, units, description = _read_channel_metadata(ds)
|
|
227
|
+
dataset_name = name or _path_to_channel_name(ds_path)
|
|
228
|
+
|
|
229
|
+
for value_field in value_fields:
|
|
230
|
+
base_name = f"{dataset_name}.{value_field}" if len(value_fields) > 1 else dataset_name
|
|
231
|
+
fallback_suffix = f"{_path_to_channel_name(ds_path)}.{value_field}"
|
|
232
|
+
columns.append(
|
|
233
|
+
Hdf5DataColumn(
|
|
234
|
+
name=dedupe(base_name, fallback_suffix),
|
|
235
|
+
data_type=numpy_to_sift_type(ds.dtype[value_field]),
|
|
236
|
+
units=units,
|
|
237
|
+
description=description,
|
|
238
|
+
time_dataset=ds_path,
|
|
239
|
+
value_dataset=ds_path,
|
|
240
|
+
time_index=0,
|
|
241
|
+
value_index=0,
|
|
242
|
+
time_field=time_field,
|
|
243
|
+
value_field=value_field,
|
|
244
|
+
)
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
return columns
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
_BUILDERS: dict[DataTypeKey, Callable[[list[h5py.Dataset]], list[Hdf5DataColumn]]] = {
|
|
251
|
+
DataTypeKey.HDF5_ONE_D: _build_one_d_configs,
|
|
252
|
+
DataTypeKey.HDF5_TWO_D: _build_two_d_configs,
|
|
253
|
+
DataTypeKey.HDF5_COMPOUND: _build_compound_configs,
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def detect_hdf5_config(file_path: str | Path, data_type_key: DataTypeKey) -> Hdf5ImportConfig:
|
|
258
|
+
"""Detect an HDF5 import config under the given variant. Datasets that
|
|
259
|
+
don't fit the chosen variant are not included. ``time_format`` is always
|
|
260
|
+
left unset: HDF5 timestamps aren't self-describing, so the caller must set
|
|
261
|
+
``config.time_format`` before importing."""
|
|
262
|
+
if data_type_key not in _BUILDERS:
|
|
263
|
+
raise ValueError(
|
|
264
|
+
f"detect_hdf5_config requires an HDF5 DataTypeKey variant "
|
|
265
|
+
f"(HDF5_ONE_D, HDF5_TWO_D, or HDF5_COMPOUND); got {data_type_key}."
|
|
266
|
+
)
|
|
267
|
+
path = Path(file_path)
|
|
268
|
+
with h5py.File(path, "r") as h5file:
|
|
269
|
+
columns = _BUILDERS[data_type_key](_collect_datasets(h5file))
|
|
270
|
+
|
|
271
|
+
return Hdf5ImportConfig(asset_name="", data=columns)
|