sift-stack-py 0.17.0.dev3__tar.gz → 0.18.0__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.dev3 → sift_stack_py-0.18.0}/PKG-INFO +6 -6
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/_test_results_log.py +2 -2
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/ingestion.py +94 -60
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pyproject_config.py +1 -1
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/audit_log.py +44 -49
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/options.py +22 -7
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/report.py +19 -39
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/steps.py +25 -25
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/terminal.py +8 -6
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/pytest_plugin.py +71 -15
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/__init__.py +9 -1
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/ingestion.py +281 -19
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/reports.py +12 -2
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/runs.py +16 -7
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/sync_stubs/__init__.pyi +26 -9
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/scripts/import_test_result_log.py +1 -1
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/util/test_results/__init__.py +6 -4
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/util/test_results/context_manager.py +146 -21
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_stack_py.egg-info/PKG-INFO +6 -6
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_stack_py.egg-info/requires.txt +5 -5
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/pyproject.toml +7 -7
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/LICENSE +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/README.md +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotation_logs/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotation_logs/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotation_logs/v1/annotation_logs_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotation_logs/v1/annotation_logs_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotation_logs/v1/annotation_logs_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotation_logs/v1/annotation_logs_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotations/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotations/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotations/v1/annotations_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotations/v1/annotations_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotations/v1/annotations_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotations/v1/annotations_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/api_keys/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/api_keys/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/api_keys/v2/api_keys_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/api_keys/v2/api_keys_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/api_keys/v2/api_keys_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/api_keys/v2/api_keys_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/assets/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/assets/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/assets/v1/assets_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/assets/v1/assets_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/assets/v1/assets_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/assets/v1/assets_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v1/calculated_channels_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v1/calculated_channels_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v1/calculated_channels_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v1/calculated_channels_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v2/calculated_channels_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v2/calculated_channels_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v2/calculated_channels_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v2/calculated_channels_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/campaigns/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/campaigns/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/campaigns/v1/campaigns_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/campaigns/v1/campaigns_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/campaigns/v1/campaigns_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/campaigns/v1/campaigns_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v1/channel_schemas_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v1/channel_schemas_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v1/channel_schemas_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v1/channel_schemas_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v2/channel_schemas_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v2/channel_schemas_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v2/channel_schemas_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v2/channel_schemas_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v2/channels_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v2/channels_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v2/channels_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v2/channels_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v3/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v3/channels_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v3/channels_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v3/channels_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v3/channels_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/comment/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/comment/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/comment/v1/comment_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/comment/v1/comment_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/comment/v1/comment_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/comment/v1/comment_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/calculated_channels_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/calculated_channels_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/calculated_channels_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/calculated_channels_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_bit_field_element_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_bit_field_element_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_bit_field_element_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_bit_field_element_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_config_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_config_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_config_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_config_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_data_type_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_data_type_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_data_type_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_data_type_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_enum_type_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_enum_type_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_enum_type_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_enum_type_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/organization_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/organization_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/organization_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/organization_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/resource_identifier_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/resource_identifier_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/resource_identifier_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/resource_identifier_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/resource_ref_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/resource_ref_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/resource_ref_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/resource_ref_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/user_defined_functions_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/user_defined_functions_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/user_defined_functions_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/user_defined_functions_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/user_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/user_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/user_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/user_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/action_type_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/action_type_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/action_type_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/action_type_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/filter_field_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/filter_field_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/filter_field_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/filter_field_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/resource_type_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/resource_type_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/resource_type_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/resource_type_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v1/data_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v1/data_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v1/data_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v1/data_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v2/data_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v2/data_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v2/data_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v2/data_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data_imports/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data_imports/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data_imports/v2/data_imports_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data_imports/v2/data_imports_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data_imports/v2/data_imports_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data_imports/v2/data_imports_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/dlq_errors/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/dlq_errors/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/dlq_errors/v2/dlq_errors_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/dlq_errors/v2/dlq_errors_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/dlq_errors/v2/dlq_errors_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/dlq_errors/v2/dlq_errors_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/exports/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/exports/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/exports/v1/exports_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/exports/v1/exports_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/exports/v1/exports_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/exports/v1/exports_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/external_sync/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/external_sync/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/external_sync/v1/external_sync_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/external_sync/v1/external_sync_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/external_sync/v1/external_sync_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/external_sync/v1/external_sync_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingest/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingest/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingest/v1/ingest_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingest/v1/ingest_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingest/v1/ingest_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingest/v1/ingest_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v1/ingestion_configs_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v1/ingestion_configs_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v1/ingestion_configs_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v1/ingestion_configs_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v2/ingestion_configs_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v2/ingestion_configs_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v2/ingestion_configs_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v2/ingestion_configs_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/jobs/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/jobs/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/jobs/v1/jobs_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/jobs/v1/jobs_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/jobs/v1/jobs_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/jobs/v1/jobs_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/me/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/me/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/me/v2/me_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/me/v2/me_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/me/v2/me_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/me/v2/me_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/metadata/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/metadata/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/metadata/v1/metadata_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/metadata/v1/metadata_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/metadata/v1/metadata_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/metadata/v1/metadata_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/notifications/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/notifications/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/notifications/v1/notifications_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/notifications/v1/notifications_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/notifications/v1/notifications_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/notifications/v1/notifications_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/panel_configurations/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/panel_configurations/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/panel_configurations/v1/panel_configuration_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/panel_configurations/v1/panel_configuration_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/panel_configurations/v1/panel_configuration_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/panel_configurations/v1/panel_configuration_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ping/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ping/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ping/v1/ping_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ping/v1/ping_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ping/v1/ping_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ping/v1/ping_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/policies/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/policies/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/policies/v1/policies_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/policies/v1/policies_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/policies/v1/policies_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/policies/v1/policies_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/principal_attributes/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/principal_attributes/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/principal_attributes/v1/principal_attributes_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/principal_attributes/v1/principal_attributes_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/principal_attributes/v1/principal_attributes_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/principal_attributes/v1/principal_attributes_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/protobuf_descriptors/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/protobuf_descriptors/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/protobuf_descriptors/v2/channel_parsing_options_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/protobuf_descriptors/v2/channel_parsing_options_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/protobuf_descriptors/v2/channel_parsing_options_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/protobuf_descriptors/v2/channel_parsing_options_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/protobuf_descriptors/v2/protobuf_descriptors_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/protobuf_descriptors/v2/protobuf_descriptors_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/protobuf_descriptors/v2/protobuf_descriptors_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/protobuf_descriptors/v2/protobuf_descriptors_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/py.typed +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/remote_files/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/remote_files/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/remote_files/v1/remote_files_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/remote_files/v1/remote_files_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/remote_files/v1/remote_files_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/remote_files/v1/remote_files_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/report_templates/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/report_templates/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/report_templates/v1/report_templates_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/report_templates/v1/report_templates_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/report_templates/v1/report_templates_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/report_templates/v1/report_templates_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/reports/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/reports/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/reports/v1/reports_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/reports/v1/reports_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/reports/v1/reports_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/reports/v1/reports_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/resource_attribute/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/resource_attribute/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/resource_attribute/v1/resource_attribute_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/resource_attribute/v1/resource_attribute_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/resource_attribute/v1/resource_attribute_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/resource_attribute/v1/resource_attribute_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/roles/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/roles/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/roles/v2/roles_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/roles/v2/roles_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/roles/v2/roles_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/roles/v2/roles_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rule_evaluation/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rule_evaluation/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rule_evaluation/v1/rule_evaluation_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rule_evaluation/v1/rule_evaluation_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rule_evaluation/v1/rule_evaluation_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rule_evaluation/v1/rule_evaluation_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rules/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rules/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rules/v1/rules_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rules/v1/rules_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rules/v1/rules_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rules/v1/rules_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/runs/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/runs/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/runs/v2/runs_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/runs/v2/runs_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/runs/v2/runs_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/runs/v2/runs_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/saved_searches/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/saved_searches/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/saved_searches/v1/saved_searches_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/saved_searches/v1/saved_searches_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/saved_searches/v1/saved_searches_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/saved_searches/v1/saved_searches_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v1/tags_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v1/tags_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v1/tags_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v1/tags_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v2/tags_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v2/tags_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v2/tags_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v2/tags_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/test_reports/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/test_reports/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/test_reports/v1/test_reports_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/test_reports/v1/test_reports_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/test_reports/v1/test_reports_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/test_reports/v1/test_reports_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/unit/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/unit/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/unit/v2/unit_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/unit/v2/unit_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/unit/v2/unit_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/unit/v2/unit_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_defined_functions/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_defined_functions/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_defined_functions/v1/user_defined_functions_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_defined_functions/v1/user_defined_functions_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_defined_functions/v1/user_defined_functions_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_defined_functions/v1/user_defined_functions_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_groups/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_groups/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_groups/v2/user_groups_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_groups/v2/user_groups_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_groups/v2/user_groups_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_groups/v2/user_groups_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/users/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/users/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/users/v2/users_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/users/v2/users_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/users/v2/users_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/users/v2/users_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v1/views_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v1/views_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v1/views_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v1/views_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v2/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v2/views_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v2/views_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v2/views_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v2/views_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/webhooks/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/webhooks/v1/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/webhooks/v1/webhooks_pb2.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/webhooks/v1/webhooks_pb2.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/webhooks/v1/webhooks_pb2_grpc.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/webhooks/v1/webhooks_pb2_grpc.pyi +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/gen_pyi.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/_async_interceptors/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/_async_interceptors/base.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/_async_interceptors/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/_interceptors/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/_interceptors/base.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/_interceptors/context.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/_interceptors/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/_retry.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/keepalive.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/server_interceptors/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/server_interceptors/server_interceptor.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/transport.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/transport_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/assets.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/base.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/calculated_channels.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/channels.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/data.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/data_imports.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/exports.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/jobs.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/ping.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/remote_files.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/reports.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/rules.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/runs.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/tags.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/test_results.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/units.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/upload.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/modes.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/rest.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/sync_wrapper.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/time.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/urls.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/channels.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/executor.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/file.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/hdf5.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/numpy_types.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/progress.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/tdms.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/timestamp.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/util.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/client.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/config.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/errors.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/py.typed +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/_base.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/assets.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/calculated_channels.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/channels.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/data_imports.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/exports.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/file_attachments.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/jobs.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/ping.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/py.typed +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/rules.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/sync_stubs/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/sync_stubs/py.typed +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/tags.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/test_results.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/scripts/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/_base.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/_mixins/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/_mixins/file_attachments.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/_mixins/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/_mixins/simulated.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/asset.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/calculated_channel.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/channel.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/data_import.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/export.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/file_attachment.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/ingestion.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/job.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/report.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/rule.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/run.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/tag.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/test_report.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/transport/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/transport/base_connection.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/transport/grpc_transport.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/transport/rest_transport.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/util/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/util/cel_utils.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/util/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/util/test_results/bounds.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/util/util.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/cel.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/channel.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/convert/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/convert/json.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/convert/protobuf.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/convert/timestamp.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/metadata_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/test_util/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/test_util/channel.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/test_util/fn.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/test_util/server_interceptor.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/time.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/user.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_rest_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/asset/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/asset/_config_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/asset/_internal/shared.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/asset/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/asset/config.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/asset/service.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/calculated_channels/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/calculated_channels/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/calculated_channels/config.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/calculated_channels/service.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/_channel.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/_deserialize.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/_deserialize_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/_validate.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/error.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/query.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/service.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_config.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_config_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_csv_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_hdf5_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_parquet_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_ros_channel.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_rosbag_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_status_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_tdms_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_utils.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_utils_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/ch10.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/config.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/csv.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/hdf5.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/parquet.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/parquet_complex_types.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/rosbags.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/status.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/tdms.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/tempfile.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/time_format.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/error.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/_internal/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/_internal/download.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/_internal/upload.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/entity.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/service.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_async_interceptors/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_async_interceptors/base.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_async_interceptors/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_interceptors/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_interceptors/base.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_interceptors/context.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_interceptors/metadata.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_retry.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/keepalive.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/transport.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/transport_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_internal/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_internal/channel.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_internal/error.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_internal/ingest.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_internal/ingest_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_internal/ingestion_config.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_internal/run.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/buffer.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/channel.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/_telemetry_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/telemetry.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/yaml/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/yaml/error.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/yaml/load.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/yaml/spec.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/yaml/test_load.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/flow.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/manager.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/rule/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/rule/config.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/service.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/py.typed +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/report/_report_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/report/service.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/report_templates/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/report_templates/_config_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/report_templates/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/report_templates/config.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/report_templates/service.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rest.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rule/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rule/_config_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rule/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rule/config.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rule/service.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rule_evaluation/_service_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rule_evaluation/service.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/tag/_internal/shared.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/__init__.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/_channel_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/_rule_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/_utils_test.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/calculated_channels.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/channel.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/report_templates.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/rule.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/utils.py +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_stack_py.egg-info/SOURCES.txt +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_stack_py.egg-info/dependency_links.txt +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_stack_py.egg-info/entry_points.txt +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_stack_py.egg-info/top_level.txt +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/setup.cfg +0 -0
- {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sift_stack_py
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.18.0
|
|
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.
|
|
@@ -55,7 +55,7 @@ Requires-Dist: polars~=1.8; extra == "all"
|
|
|
55
55
|
Requires-Dist: pyOpenSSL<24.0.0; extra == "all"
|
|
56
56
|
Requires-Dist: pyarrow>=17.0.0; extra == "all"
|
|
57
57
|
Requires-Dist: rosbags~=0.0; python_full_version >= "3.8.2" and extra == "all"
|
|
58
|
-
Requires-Dist: sift-stream-bindings==0.
|
|
58
|
+
Requires-Dist: sift-stream-bindings==0.4.1; extra == "all"
|
|
59
59
|
Requires-Dist: types-pyOpenSSL<24.0.0; extra == "all"
|
|
60
60
|
Provides-Extra: build
|
|
61
61
|
Requires-Dist: build==1.2.1; extra == "build"
|
|
@@ -94,7 +94,7 @@ Requires-Dist: pytest-randomly==3.15.0; extra == "dev-all"
|
|
|
94
94
|
Requires-Dist: pytest==8.2.2; extra == "dev-all"
|
|
95
95
|
Requires-Dist: rosbags~=0.0; python_full_version >= "3.8.2" and extra == "dev-all"
|
|
96
96
|
Requires-Dist: ruff~=0.12.10; extra == "dev-all"
|
|
97
|
-
Requires-Dist: sift-stream-bindings==0.
|
|
97
|
+
Requires-Dist: sift-stream-bindings==0.4.1; extra == "dev-all"
|
|
98
98
|
Requires-Dist: tomlkit~=0.13.3; extra == "dev-all"
|
|
99
99
|
Requires-Dist: types-pyOpenSSL<24.0.0; extra == "dev-all"
|
|
100
100
|
Provides-Extra: development
|
|
@@ -146,7 +146,7 @@ Requires-Dist: pytest-randomly==3.15.0; extra == "docs-build"
|
|
|
146
146
|
Requires-Dist: pytest==8.2.2; extra == "docs-build"
|
|
147
147
|
Requires-Dist: rosbags~=0.0; python_full_version >= "3.8.2" and extra == "docs-build"
|
|
148
148
|
Requires-Dist: ruff~=0.12.10; extra == "docs-build"
|
|
149
|
-
Requires-Dist: sift-stream-bindings==0.
|
|
149
|
+
Requires-Dist: sift-stream-bindings==0.4.1; extra == "docs-build"
|
|
150
150
|
Requires-Dist: tomlkit~=0.13.3; extra == "docs-build"
|
|
151
151
|
Requires-Dist: types-pyOpenSSL<24.0.0; extra == "docs-build"
|
|
152
152
|
Provides-Extra: file-imports
|
|
@@ -164,9 +164,9 @@ Requires-Dist: types-pyOpenSSL<24.0.0; extra == "openssl"
|
|
|
164
164
|
Provides-Extra: rosbags
|
|
165
165
|
Requires-Dist: rosbags~=0.0; python_full_version >= "3.8.2" and extra == "rosbags"
|
|
166
166
|
Provides-Extra: sift-stream
|
|
167
|
-
Requires-Dist: sift-stream-bindings==0.
|
|
167
|
+
Requires-Dist: sift-stream-bindings==0.4.1; extra == "sift-stream"
|
|
168
168
|
Provides-Extra: sift-stream-bindings
|
|
169
|
-
Requires-Dist: sift-stream-bindings==0.
|
|
169
|
+
Requires-Dist: sift-stream-bindings==0.4.1; extra == "sift-stream-bindings"
|
|
170
170
|
Provides-Extra: tdms
|
|
171
171
|
Requires-Dist: npTDMS~=1.9; extra == "tdms"
|
|
172
172
|
|
|
@@ -32,8 +32,8 @@ versa), which is acceptable because writes are tiny and we only have one reader.
|
|
|
32
32
|
|
|
33
33
|
Waiting for the lock is cooperative: ``AsyncFileLock`` retries a non-blocking
|
|
34
34
|
acquire and sleeps on the event loop between attempts, so a contended or stale
|
|
35
|
-
lock never blocks the loop thread
|
|
36
|
-
bounded by ``LOG_LOCK_TIMEOUT_SECONDS``,
|
|
35
|
+
lock never blocks the loop thread. The acquire is also
|
|
36
|
+
bounded by ``LOG_LOCK_TIMEOUT_SECONDS``, so a stuck lock surfaces as
|
|
37
37
|
``TimeoutError`` instead of waiting forever. The file read/write under the lock
|
|
38
38
|
runs inline on the loop; it is a tiny local-file operation, the same class of
|
|
39
39
|
brief synchronous work async methods do throughout this client.
|
|
@@ -236,6 +236,86 @@ class IngestionLowLevelClient(LowLevelClientBase, WithGrpcClient):
|
|
|
236
236
|
return _hash_flows(asset_name=asset_name, flows=flows)
|
|
237
237
|
|
|
238
238
|
|
|
239
|
+
async def _build_sift_stream_instance(
|
|
240
|
+
api_key: str,
|
|
241
|
+
grpc_uri: str,
|
|
242
|
+
ingestion_config_form: IngestionConfigFormPy,
|
|
243
|
+
run_form: RunFormPy | None = None,
|
|
244
|
+
run_id: str | None = None,
|
|
245
|
+
asset_tags: list[str] | None = None,
|
|
246
|
+
asset_metadata: list[MetadataPy] | None = None,
|
|
247
|
+
streaming_mode: StreamingMode = ..., # type: ignore[assignment]
|
|
248
|
+
retry_policy: RetryPolicyPy | None = None,
|
|
249
|
+
disk_backup_policy: DiskBackupPolicyPy | None = None,
|
|
250
|
+
checkpoint_interval_seconds: int | None = None,
|
|
251
|
+
enable_tls: bool = True,
|
|
252
|
+
tracing_config: TracingConfig | None = None,
|
|
253
|
+
) -> SiftStreamPy:
|
|
254
|
+
"""Build a raw `SiftStreamPy` without wrapping it in a client.
|
|
255
|
+
|
|
256
|
+
Shared by both `IngestionConfigStreamingLowLevelClient` and the auto-register path.
|
|
257
|
+
"""
|
|
258
|
+
# Importing here to allow sift_stream_bindings to be an optional dependency for non-ingestion users
|
|
259
|
+
# TODO(nathan): Fix bindings to fix mypy issues with tracing functions
|
|
260
|
+
from sift_stream_bindings import ( # type: ignore[attr-defined]
|
|
261
|
+
DurationPy,
|
|
262
|
+
SiftStreamBuilderPy,
|
|
263
|
+
init_tracing, # type: ignore[attr-defined]
|
|
264
|
+
init_tracing_with_file, # type: ignore[attr-defined]
|
|
265
|
+
is_tracing_initialized, # type: ignore[attr-defined]
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
from sift_client.resources.ingestion import StreamingMode, TracingConfig
|
|
269
|
+
|
|
270
|
+
_default_max_log_files = 7
|
|
271
|
+
_default_logfile_prefix = "sift_stream_bindings.log"
|
|
272
|
+
|
|
273
|
+
if streaming_mode is ...: # type: ignore[comparison-overlap]
|
|
274
|
+
streaming_mode = StreamingMode.LIVE_WITH_BACKUPS
|
|
275
|
+
|
|
276
|
+
if not is_tracing_initialized():
|
|
277
|
+
if tracing_config is None:
|
|
278
|
+
tracing_config = TracingConfig.with_file()
|
|
279
|
+
|
|
280
|
+
if tracing_config.log_dir is not None:
|
|
281
|
+
init_tracing_with_file(
|
|
282
|
+
tracing_config.level,
|
|
283
|
+
tracing_config.log_dir,
|
|
284
|
+
tracing_config.filename_prefix or _default_logfile_prefix,
|
|
285
|
+
tracing_config.max_log_files or _default_max_log_files,
|
|
286
|
+
)
|
|
287
|
+
else:
|
|
288
|
+
init_tracing(tracing_config.level)
|
|
289
|
+
|
|
290
|
+
sift_builder = SiftStreamBuilderPy(uri=grpc_uri, apikey=api_key)
|
|
291
|
+
sift_builder.enable_tls = enable_tls
|
|
292
|
+
|
|
293
|
+
config_builder = sift_builder.ingestion_config(ingestion_config_form)
|
|
294
|
+
config_builder.run = run_form
|
|
295
|
+
config_builder.run_id = run_id
|
|
296
|
+
config_builder.asset_tags = asset_tags
|
|
297
|
+
config_builder.metadata = asset_metadata
|
|
298
|
+
|
|
299
|
+
if streaming_mode == StreamingMode.LIVE_ONLY:
|
|
300
|
+
return await config_builder.live_only().build()
|
|
301
|
+
|
|
302
|
+
elif streaming_mode == StreamingMode.FILE_BACKUP:
|
|
303
|
+
fb_builder = config_builder.file_backup()
|
|
304
|
+
if disk_backup_policy is not None:
|
|
305
|
+
fb_builder.disk_backup_policy = disk_backup_policy
|
|
306
|
+
return await fb_builder.build()
|
|
307
|
+
|
|
308
|
+
else: # LIVE_WITH_BACKUPS (default)
|
|
309
|
+
lwb_builder = config_builder.live_with_backups()
|
|
310
|
+
if retry_policy is not None:
|
|
311
|
+
lwb_builder.retry_policy = retry_policy
|
|
312
|
+
if disk_backup_policy is not None:
|
|
313
|
+
lwb_builder.disk_backup_policy = disk_backup_policy
|
|
314
|
+
if checkpoint_interval_seconds is not None:
|
|
315
|
+
lwb_builder.checkpoint_interval = DurationPy(secs=checkpoint_interval_seconds, nanos=0)
|
|
316
|
+
return await lwb_builder.build()
|
|
317
|
+
|
|
318
|
+
|
|
239
319
|
class IngestionConfigStreamingLowLevelClient(LowLevelClientBase):
|
|
240
320
|
DEFAULT_MAX_LOG_FILES = 7 # Equal to 1 week of logs
|
|
241
321
|
DEFAULT_LOGFILE_PREFIX = "sift_stream_bindings.log"
|
|
@@ -262,67 +342,21 @@ class IngestionConfigStreamingLowLevelClient(LowLevelClientBase):
|
|
|
262
342
|
enable_tls: bool = True,
|
|
263
343
|
tracing_config: TracingConfig | None = None,
|
|
264
344
|
) -> IngestionConfigStreamingLowLevelClient:
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
345
|
+
sift_stream_instance = await _build_sift_stream_instance(
|
|
346
|
+
api_key=api_key,
|
|
347
|
+
grpc_uri=grpc_uri,
|
|
348
|
+
ingestion_config_form=ingestion_config_form,
|
|
349
|
+
run_form=run_form,
|
|
350
|
+
run_id=run_id,
|
|
351
|
+
asset_tags=asset_tags,
|
|
352
|
+
asset_metadata=asset_metadata,
|
|
353
|
+
streaming_mode=streaming_mode,
|
|
354
|
+
retry_policy=retry_policy,
|
|
355
|
+
disk_backup_policy=disk_backup_policy,
|
|
356
|
+
checkpoint_interval_seconds=checkpoint_interval_seconds,
|
|
357
|
+
enable_tls=enable_tls,
|
|
358
|
+
tracing_config=tracing_config,
|
|
273
359
|
)
|
|
274
|
-
|
|
275
|
-
from sift_client.resources.ingestion import StreamingMode, TracingConfig
|
|
276
|
-
|
|
277
|
-
if streaming_mode is ...: # type: ignore[comparison-overlap]
|
|
278
|
-
streaming_mode = StreamingMode.LIVE_WITH_BACKUPS
|
|
279
|
-
|
|
280
|
-
if not is_tracing_initialized():
|
|
281
|
-
if tracing_config is None:
|
|
282
|
-
tracing_config = TracingConfig.with_file()
|
|
283
|
-
|
|
284
|
-
if tracing_config.log_dir is not None:
|
|
285
|
-
# Use file logging
|
|
286
|
-
init_tracing_with_file(
|
|
287
|
-
tracing_config.level,
|
|
288
|
-
tracing_config.log_dir,
|
|
289
|
-
tracing_config.filename_prefix or cls.DEFAULT_LOGFILE_PREFIX,
|
|
290
|
-
tracing_config.max_log_files or cls.DEFAULT_MAX_LOG_FILES,
|
|
291
|
-
)
|
|
292
|
-
else:
|
|
293
|
-
# Use stdout/stderr only
|
|
294
|
-
init_tracing(tracing_config.level)
|
|
295
|
-
|
|
296
|
-
sift_builder = SiftStreamBuilderPy(uri=grpc_uri, apikey=api_key)
|
|
297
|
-
sift_builder.enable_tls = enable_tls
|
|
298
|
-
|
|
299
|
-
config_builder = sift_builder.ingestion_config(ingestion_config_form)
|
|
300
|
-
config_builder.run = run_form
|
|
301
|
-
config_builder.run_id = run_id
|
|
302
|
-
config_builder.asset_tags = asset_tags
|
|
303
|
-
config_builder.metadata = asset_metadata
|
|
304
|
-
|
|
305
|
-
if streaming_mode == StreamingMode.LIVE_ONLY:
|
|
306
|
-
sift_stream_instance = await config_builder.live_only().build()
|
|
307
|
-
|
|
308
|
-
elif streaming_mode == StreamingMode.FILE_BACKUP:
|
|
309
|
-
fb_builder = config_builder.file_backup()
|
|
310
|
-
if disk_backup_policy is not None:
|
|
311
|
-
fb_builder.disk_backup_policy = disk_backup_policy
|
|
312
|
-
sift_stream_instance = await fb_builder.build()
|
|
313
|
-
|
|
314
|
-
else: # LIVE_WITH_BACKUPS (default)
|
|
315
|
-
lwb_builder = config_builder.live_with_backups()
|
|
316
|
-
if retry_policy is not None:
|
|
317
|
-
lwb_builder.retry_policy = retry_policy
|
|
318
|
-
if disk_backup_policy is not None:
|
|
319
|
-
lwb_builder.disk_backup_policy = disk_backup_policy
|
|
320
|
-
if checkpoint_interval_seconds is not None:
|
|
321
|
-
lwb_builder.checkpoint_interval = DurationPy(
|
|
322
|
-
secs=checkpoint_interval_seconds, nanos=0
|
|
323
|
-
)
|
|
324
|
-
sift_stream_instance = await lwb_builder.build()
|
|
325
|
-
|
|
326
360
|
return cls(sift_stream_instance)
|
|
327
361
|
|
|
328
362
|
async def send(self, flow: FlowPy):
|
{sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pyproject_config.py
RENAMED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
The pytest plugin consumes this loader to resolve report-content config (under
|
|
4
4
|
``[tool.sift.pytest.report]``) and SDK-level fallbacks (URIs under
|
|
5
5
|
``[tool.sift]``). A malformed or missing ``pyproject.toml`` returns ``{}`` so a
|
|
6
|
-
bad config file never aborts the session
|
|
6
|
+
bad config file never aborts the session. The plugin falls back to its
|
|
7
7
|
built-in defaults and surfaces a single warning.
|
|
8
8
|
"""
|
|
9
9
|
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
On by default: every session attaches two handlers to the ``sift_client`` root
|
|
4
4
|
logger so plugin-behavior modules AND high-value SDK call sites land in one file
|
|
5
|
-
(
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
(in the run's ``--sift-output-dir``, or a temp dir), with warnings also echoed
|
|
6
|
+
to stdout. Pass ``--no-sift-audit-log`` (or set ``sift_audit_log = false``) to
|
|
7
|
+
turn it off. The replay subprocess gets its own sibling file via
|
|
8
8
|
``replay_audit_path``.
|
|
9
9
|
|
|
10
10
|
Handlers are removed at session end (``pytest_unconfigure`` ->
|
|
11
|
-
``detach_audit_handlers``) so a process that runs many pytest sessions
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
``detach_audit_handlers``) so a process that runs many pytest sessions does not
|
|
12
|
+
accumulate handlers or leak one session's file into the next. This matters
|
|
13
|
+
because the plugin's own test suite drives nested in-process sessions.
|
|
14
14
|
|
|
15
15
|
TODO: levels are fixed (DEBUG file / WARNING stdout) and output is plain text.
|
|
16
16
|
A configurable level, JSON lines, or rotation are follow-ups gated on real need.
|
|
@@ -29,7 +29,7 @@ if TYPE_CHECKING:
|
|
|
29
29
|
|
|
30
30
|
ROOT_LOGGER = "sift_client"
|
|
31
31
|
# Columnar line for easy parsing: fixed-width timestamp, level, and namespace
|
|
32
|
-
# columns, then the message
|
|
32
|
+
# columns, then the message. Every plugin call starts the message with a
|
|
33
33
|
# left-justified ``EVENT_WIDTH`` event token followed by space-separated
|
|
34
34
|
# key=value fields (incl. the full test ``path=``). Fields never contain spaces
|
|
35
35
|
# (lists are ``/``-joined, free text is quoted), so the line tokenizes cleanly
|
|
@@ -95,7 +95,7 @@ class ColumnFormatter(logging.Formatter):
|
|
|
95
95
|
|
|
96
96
|
Adds a ``namespace`` field (the logger name with the redundant
|
|
97
97
|
``sift_client.`` prefix trimmed) as its own aligned column, without mutating
|
|
98
|
-
``record.name
|
|
98
|
+
``record.name``, so other handlers (e.g. pytest's log capture) see the record
|
|
99
99
|
unchanged.
|
|
100
100
|
"""
|
|
101
101
|
|
|
@@ -110,41 +110,17 @@ def replay_audit_path(main_path: Path) -> Path:
|
|
|
110
110
|
return main_path.with_suffix(".replay" + main_path.suffix)
|
|
111
111
|
|
|
112
112
|
|
|
113
|
-
def
|
|
114
|
-
"""
|
|
113
|
+
def _make_session_dir(base: Path | None = None) -> Path:
|
|
114
|
+
"""Create and return ``<base>/<random>/`` for this run's artifacts.
|
|
115
115
|
|
|
116
|
-
|
|
117
|
-
|
|
116
|
+
``base`` is the ``--sift-output-dir`` directory when set, else
|
|
117
|
+
``<tmpdir>/sift_test_results``. Each run gets its own random subfolder (from
|
|
118
|
+
``tempfile.mkdtemp``) so repeated or concurrent runs never collide, and all
|
|
119
|
+
of a run's artifacts (JSONL log, tracking sidecar, audit log, replay audit
|
|
120
|
+
log) land inside it together.
|
|
118
121
|
"""
|
|
119
|
-
if
|
|
120
|
-
|
|
121
|
-
return isinstance(value, str) and value.strip().lower() in ("false", "none")
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
def explicit_audit_path(value: object) -> Path | None:
|
|
125
|
-
"""The file path the user pinned, or ``None`` to use a temp default.
|
|
126
|
-
|
|
127
|
-
``"true"`` / ``"1"`` / unset all mean "enabled, no specific path", so the
|
|
128
|
-
caller falls back to :func:`default_audit_path`.
|
|
129
|
-
"""
|
|
130
|
-
if not isinstance(value, str):
|
|
131
|
-
return None
|
|
132
|
-
text = value.strip()
|
|
133
|
-
if text.lower() in ("", "true", "1", "false", "none"):
|
|
134
|
-
return None
|
|
135
|
-
return Path(text)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
def _make_session_dir() -> Path:
|
|
139
|
-
"""Create and return ``<tmpdir>/sift_test_results/<random>/``.
|
|
140
|
-
|
|
141
|
-
All per-session temp artifacts (JSONL log, tracking sidecar, audit log,
|
|
142
|
-
replay audit log) land inside this directory so they're easy to locate and
|
|
143
|
-
clean up together. The random component comes from ``tempfile.mkdtemp`` —
|
|
144
|
-
the same OS-backed source used by ``NamedTemporaryFile``.
|
|
145
|
-
"""
|
|
146
|
-
parent = Path(tempfile.gettempdir()) / "sift_test_results"
|
|
147
|
-
parent.mkdir(exist_ok=True)
|
|
122
|
+
parent = base if base is not None else Path(tempfile.gettempdir()) / "sift_test_results"
|
|
123
|
+
parent.mkdir(parents=True, exist_ok=True)
|
|
148
124
|
return Path(tempfile.mkdtemp(dir=parent, prefix=""))
|
|
149
125
|
|
|
150
126
|
|
|
@@ -198,10 +174,9 @@ def configure_audit_logging(
|
|
|
198
174
|
"""
|
|
199
175
|
from sift_client._internal.pytest_plugin.options import AUDIT_LOG_OPTION
|
|
200
176
|
|
|
201
|
-
|
|
202
|
-
if audit_disabled(raw):
|
|
177
|
+
if not AUDIT_LOG_OPTION.resolve(config):
|
|
203
178
|
return None
|
|
204
|
-
path =
|
|
179
|
+
path = default_audit_path(session_dir=session_dir)
|
|
205
180
|
attach_file_handler(path)
|
|
206
181
|
logger = logging.getLogger(ROOT_LOGGER)
|
|
207
182
|
if not any(
|
|
@@ -226,7 +201,7 @@ def detach_audit_handlers(*, root: str = ROOT_LOGGER) -> None:
|
|
|
226
201
|
"""Remove and close the audit handlers; reset the logger level.
|
|
227
202
|
|
|
228
203
|
Called from ``pytest_unconfigure`` so handlers don't outlive the session
|
|
229
|
-
that created them
|
|
204
|
+
that created them. This matters when one process runs many sessions (the
|
|
230
205
|
plugin's own test suite drives nested in-process pytester runs).
|
|
231
206
|
"""
|
|
232
207
|
logger = logging.getLogger(root)
|
|
@@ -239,15 +214,34 @@ def detach_audit_handlers(*, root: str = ROOT_LOGGER) -> None:
|
|
|
239
214
|
|
|
240
215
|
# Width the status column is right-aligned to in the rendered tree.
|
|
241
216
|
_TREE_WIDTH = 64
|
|
217
|
+
# Width the status column is left-justified to, so the ``[start -> end]`` window
|
|
218
|
+
# starts at the same column on every line. ``IN_PROGRESS`` (11) is the longest
|
|
219
|
+
# status; a never-closed step that overflows just shifts its own window.
|
|
220
|
+
_STATUS_WIDTH = 11
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def _fmt_clock(dt: Any) -> str:
|
|
224
|
+
"""Wall-clock ``HH:MM:SS.mmm`` (UTC) for a step time, or a dashed placeholder.
|
|
225
|
+
|
|
226
|
+
Millisecond precision is enough to read execution order off the tree; the
|
|
227
|
+
full timestamp lives in the JSONL. ``None`` (a step that never stamped a
|
|
228
|
+
time) renders as ``--:--:--.---`` so the column still aligns.
|
|
229
|
+
"""
|
|
230
|
+
if dt is None:
|
|
231
|
+
return "--:--:--.---"
|
|
232
|
+
return dt.strftime("%H:%M:%S.") + f"{dt.microsecond // 1000:03d}"
|
|
242
233
|
|
|
243
234
|
|
|
244
235
|
def render_report_tree(created_steps: list[Any], *, mode: str) -> str:
|
|
245
|
-
"""Render the final step tree with statuses
|
|
236
|
+
"""Render the final step tree with statuses, the end-state validation view.
|
|
246
237
|
|
|
247
238
|
Reconstructs the parent/child structure from each step's dotted numeric
|
|
248
239
|
``step_path`` (``"1"`` -> ``"1.1"`` -> ``"1.1.2"``), preserving creation
|
|
249
|
-
order, and renders an ASCII tree with a dotted leader to the final status
|
|
250
|
-
|
|
240
|
+
order, and renders an ASCII tree with a dotted leader to the final status,
|
|
241
|
+
then each node's ``[start -> end]`` execution window (UTC, ms precision).
|
|
242
|
+
Because nodes render in creation order, not chronological order, a parent's
|
|
243
|
+
window can start before a sibling that ran earlier — the times make that
|
|
244
|
+
visible. Failed/errored steps are annotated with the first line of their
|
|
251
245
|
``error_info`` when present, so a reader sees what went wrong inline.
|
|
252
246
|
"""
|
|
253
247
|
header = f"Sift report tree ({mode} mode):"
|
|
@@ -277,7 +271,8 @@ def render_report_tree(created_steps: list[Any], *, mode: str) -> str:
|
|
|
277
271
|
head = f"{prefix}{connector}{step.name} "
|
|
278
272
|
child_prefix = prefix + (" " if is_last else "| ")
|
|
279
273
|
leader = "." * max(3, _TREE_WIDTH - len(head))
|
|
280
|
-
|
|
274
|
+
window = f"[{_fmt_clock(getattr(step, 'start_time', None))} -> {_fmt_clock(getattr(step, 'end_time', None))}]"
|
|
275
|
+
line = f"{head}{leader} {status:<{_STATUS_WIDTH}} {window}"
|
|
281
276
|
error = getattr(step, "error_info", None)
|
|
282
277
|
if status in ("FAILED", "ERROR") and error is not None and error.error_message:
|
|
283
278
|
line += f" <- {error.error_message.strip().splitlines()[0]}"
|
|
@@ -217,22 +217,36 @@ def _walk_toml(data: dict[str, Any], path: tuple[str, ...]) -> Any:
|
|
|
217
217
|
# loads .env for local dev; CI sets the same names from its secret store).
|
|
218
218
|
# ---------------------------------------------------------------------------
|
|
219
219
|
|
|
220
|
-
# Pytest behavior. The CLI
|
|
220
|
+
# Pytest behavior. The CLI flags survive because the per-run override is real.
|
|
221
|
+
OUTPUT_DIR_OPTION = Option(
|
|
222
|
+
name="output_dir",
|
|
223
|
+
category=CAT_BEHAVIOR,
|
|
224
|
+
help="Directory for this run's artifacts (JSONL log, audit trace). Each run gets "
|
|
225
|
+
"its own random subfolder. Defaults to a temp directory.",
|
|
226
|
+
cli="--sift-output-dir",
|
|
227
|
+
ini="sift_output_dir",
|
|
228
|
+
)
|
|
221
229
|
LOG_FILE_OPTION = Option(
|
|
222
230
|
name="log_file",
|
|
223
231
|
category=CAT_BEHAVIOR,
|
|
224
|
-
help="
|
|
225
|
-
|
|
232
|
+
help="Write the JSONL log of create/update calls. On by default; "
|
|
233
|
+
"--no-sift-log-file disables it (incompatible with --sift-offline).",
|
|
234
|
+
cli="--no-sift-log-file",
|
|
235
|
+
cli_action="store_false",
|
|
226
236
|
ini="sift_log_file",
|
|
237
|
+
ini_type="bool",
|
|
238
|
+
ini_default=True,
|
|
227
239
|
)
|
|
228
240
|
AUDIT_LOG_OPTION = Option(
|
|
229
241
|
name="audit_log",
|
|
230
242
|
category=CAT_BEHAVIOR,
|
|
231
|
-
help="DEBUG
|
|
232
|
-
"
|
|
233
|
-
"
|
|
234
|
-
|
|
243
|
+
help="Write the DEBUG audit trace of plugin behavior, with warnings echoed to "
|
|
244
|
+
"stdout. On by default; --no-sift-audit-log disables it.",
|
|
245
|
+
cli="--no-sift-audit-log",
|
|
246
|
+
cli_action="store_false",
|
|
235
247
|
ini="sift_audit_log",
|
|
248
|
+
ini_type="bool",
|
|
249
|
+
ini_default=True,
|
|
236
250
|
)
|
|
237
251
|
GIT_METADATA_OPTION = Option(
|
|
238
252
|
name="git_metadata",
|
|
@@ -406,6 +420,7 @@ METADATA_OPTION = Option(
|
|
|
406
420
|
)
|
|
407
421
|
|
|
408
422
|
PLUGIN_OPTIONS: tuple[Option, ...] = (
|
|
423
|
+
OUTPUT_DIR_OPTION,
|
|
409
424
|
LOG_FILE_OPTION,
|
|
410
425
|
AUDIT_LOG_OPTION,
|
|
411
426
|
GIT_METADATA_OPTION,
|
{sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/report.py
RENAMED
|
@@ -55,7 +55,7 @@ logger = logging.getLogger(__name__)
|
|
|
55
55
|
def resolve_real_report_id(context: Any) -> str | None:
|
|
56
56
|
"""Resolve the real server-side report id for the online footer link.
|
|
57
57
|
|
|
58
|
-
In synchronous online mode (``--sift-log-file
|
|
58
|
+
In synchronous online mode (``--no-sift-log-file``) the report is created
|
|
59
59
|
directly against the API, so ``report.id_`` is already the real id. In the
|
|
60
60
|
default incremental mode the report is created through the simulate path
|
|
61
61
|
(a client-side UUID) and the background worker maps it to the real id on
|
|
@@ -377,41 +377,20 @@ def format_template(
|
|
|
377
377
|
return fallback
|
|
378
378
|
|
|
379
379
|
|
|
380
|
-
def
|
|
381
|
-
"""
|
|
380
|
+
def log_file_enabled(pytestconfig: pytest.Config | None) -> bool:
|
|
381
|
+
"""Whether the JSONL log of create/update calls is written.
|
|
382
382
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
absent. Treat as the default "use a temp file."
|
|
387
|
-
* Python ``False``: an explicit disable, typically set in a conftest via
|
|
388
|
-
``config.option.sift_log_file = False``. Return ``None`` so
|
|
389
|
-
the rest of the pipeline knows to skip logging entirely.
|
|
390
|
-
* A string (from CLI or ini): interpret ``"true"`` / ``"1"`` as the temp
|
|
391
|
-
file default, ``"false"`` / ``"none"`` as disable, anything else as a
|
|
392
|
-
file path.
|
|
393
|
-
|
|
394
|
-
Rejects ``--sift-log-file=none`` combined with ``--sift-offline`` since
|
|
395
|
-
offline mode needs the log file as its sole sink.
|
|
383
|
+
On by default; ``--no-sift-log-file`` disables it. Offline mode routes every
|
|
384
|
+
create/update call through the log as its only sink, so disabling the log
|
|
385
|
+
while offline is a usage error.
|
|
396
386
|
"""
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
if disabled and is_offline(pytestconfig):
|
|
387
|
+
enabled = bool(LOG_FILE_OPTION.resolve(pytestconfig))
|
|
388
|
+
if not enabled and is_offline(pytestconfig):
|
|
400
389
|
raise pytest.UsageError(
|
|
401
|
-
"--sift-log-file
|
|
402
|
-
"
|
|
403
|
-
"drop --sift-log-file=none to use a temp file."
|
|
390
|
+
"--no-sift-log-file is incompatible with --sift-offline; offline mode "
|
|
391
|
+
"requires the JSONL log as its only sink. Drop one of the two flags."
|
|
404
392
|
)
|
|
405
|
-
|
|
406
|
-
return None
|
|
407
|
-
if not raw:
|
|
408
|
-
return True
|
|
409
|
-
lower = str(raw).lower()
|
|
410
|
-
if lower in ("true", "1"):
|
|
411
|
-
return True
|
|
412
|
-
if lower in ("false", "none"):
|
|
413
|
-
return None
|
|
414
|
-
return Path(raw)
|
|
393
|
+
return enabled
|
|
415
394
|
|
|
416
395
|
|
|
417
396
|
def report_context_impl(
|
|
@@ -458,15 +437,16 @@ def report_context_impl(
|
|
|
458
437
|
"pytest_command": command,
|
|
459
438
|
}
|
|
460
439
|
# Mode → ReportContext flags:
|
|
461
|
-
# online (default): log_file=<
|
|
462
|
-
# --sift-offline: log_file=<
|
|
463
|
-
# --sift-disabled:
|
|
440
|
+
# online (default): log_file=<path in session dir>, replay_log_file=True
|
|
441
|
+
# --sift-offline: log_file=<path in session dir>, replay_log_file=False
|
|
442
|
+
# --sift-disabled / --no-sift-log-file: log_file=False, replay_log_file=False
|
|
464
443
|
disabled = sift_client._simulate
|
|
465
444
|
offline = False if disabled else is_offline(pytestconfig)
|
|
466
|
-
log_file: str | Path | bool
|
|
467
|
-
#
|
|
468
|
-
#
|
|
469
|
-
#
|
|
445
|
+
log_file: str | Path | bool = False if disabled else log_file_enabled(pytestconfig)
|
|
446
|
+
# Place the JSONL inside the run's session dir so it lands alongside the
|
|
447
|
+
# audit log. pytest_configure created the dir whenever the log is enabled; if
|
|
448
|
+
# one isn't present (e.g. ReportContext used outside pytest), log_file stays
|
|
449
|
+
# True and ReportContext mints its own dir.
|
|
470
450
|
if log_file is True and pytestconfig is not None:
|
|
471
451
|
from sift_client.pytest_plugin import SIFT_SESSION_DIR_STASH_KEY
|
|
472
452
|
|