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.
Files changed (607) hide show
  1. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/PKG-INFO +6 -6
  2. {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
  3. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/ingestion.py +94 -60
  4. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pyproject_config.py +1 -1
  5. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/audit_log.py +44 -49
  6. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/options.py +22 -7
  7. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/report.py +19 -39
  8. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/steps.py +25 -25
  9. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/terminal.py +8 -6
  10. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/pytest_plugin.py +71 -15
  11. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/__init__.py +9 -1
  12. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/ingestion.py +281 -19
  13. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/reports.py +12 -2
  14. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/runs.py +16 -7
  15. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/sync_stubs/__init__.pyi +26 -9
  16. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/scripts/import_test_result_log.py +1 -1
  17. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/util/test_results/__init__.py +6 -4
  18. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/util/test_results/context_manager.py +146 -21
  19. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_stack_py.egg-info/PKG-INFO +6 -6
  20. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_stack_py.egg-info/requires.txt +5 -5
  21. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/pyproject.toml +7 -7
  22. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/LICENSE +0 -0
  23. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/README.md +0 -0
  24. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/__init__.py +0 -0
  25. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotation_logs/__init__.py +0 -0
  26. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotation_logs/v1/__init__.py +0 -0
  27. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotation_logs/v1/annotation_logs_pb2.py +0 -0
  28. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotation_logs/v1/annotation_logs_pb2.pyi +0 -0
  29. {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
  30. {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
  31. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotations/__init__.py +0 -0
  32. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotations/v1/__init__.py +0 -0
  33. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotations/v1/annotations_pb2.py +0 -0
  34. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotations/v1/annotations_pb2.pyi +0 -0
  35. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotations/v1/annotations_pb2_grpc.py +0 -0
  36. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/annotations/v1/annotations_pb2_grpc.pyi +0 -0
  37. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/api_keys/__init__.py +0 -0
  38. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/api_keys/v2/__init__.py +0 -0
  39. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/api_keys/v2/api_keys_pb2.py +0 -0
  40. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/api_keys/v2/api_keys_pb2.pyi +0 -0
  41. {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
  42. {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
  43. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/assets/__init__.py +0 -0
  44. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/assets/v1/__init__.py +0 -0
  45. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/assets/v1/assets_pb2.py +0 -0
  46. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/assets/v1/assets_pb2.pyi +0 -0
  47. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/assets/v1/assets_pb2_grpc.py +0 -0
  48. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/assets/v1/assets_pb2_grpc.pyi +0 -0
  49. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/__init__.py +0 -0
  50. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v1/__init__.py +0 -0
  51. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v1/calculated_channels_pb2.py +0 -0
  52. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v1/calculated_channels_pb2.pyi +0 -0
  53. {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
  54. {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
  55. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v2/__init__.py +0 -0
  56. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v2/calculated_channels_pb2.py +0 -0
  57. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/calculated_channels/v2/calculated_channels_pb2.pyi +0 -0
  58. {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
  59. {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
  60. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/campaigns/__init__.py +0 -0
  61. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/campaigns/v1/__init__.py +0 -0
  62. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/campaigns/v1/campaigns_pb2.py +0 -0
  63. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/campaigns/v1/campaigns_pb2.pyi +0 -0
  64. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/campaigns/v1/campaigns_pb2_grpc.py +0 -0
  65. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/campaigns/v1/campaigns_pb2_grpc.pyi +0 -0
  66. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/__init__.py +0 -0
  67. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v1/__init__.py +0 -0
  68. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v1/channel_schemas_pb2.py +0 -0
  69. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v1/channel_schemas_pb2.pyi +0 -0
  70. {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
  71. {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
  72. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v2/__init__.py +0 -0
  73. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v2/channel_schemas_pb2.py +0 -0
  74. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channel_schemas/v2/channel_schemas_pb2.pyi +0 -0
  75. {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
  76. {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
  77. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/__init__.py +0 -0
  78. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v2/__init__.py +0 -0
  79. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v2/channels_pb2.py +0 -0
  80. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v2/channels_pb2.pyi +0 -0
  81. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v2/channels_pb2_grpc.py +0 -0
  82. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v2/channels_pb2_grpc.pyi +0 -0
  83. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v3/__init__.py +0 -0
  84. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v3/channels_pb2.py +0 -0
  85. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v3/channels_pb2.pyi +0 -0
  86. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v3/channels_pb2_grpc.py +0 -0
  87. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/channels/v3/channels_pb2_grpc.pyi +0 -0
  88. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/comment/__init__.py +0 -0
  89. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/comment/v1/__init__.py +0 -0
  90. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/comment/v1/comment_pb2.py +0 -0
  91. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/comment/v1/comment_pb2.pyi +0 -0
  92. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/comment/v1/comment_pb2_grpc.py +0 -0
  93. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/comment/v1/comment_pb2_grpc.pyi +0 -0
  94. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/__init__.py +0 -0
  95. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/__init__.py +0 -0
  96. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/__init__.py +0 -0
  97. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/calculated_channels_pb2.py +0 -0
  98. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/calculated_channels_pb2.pyi +0 -0
  99. {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
  100. {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
  101. {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
  102. {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
  103. {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
  104. {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
  105. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_config_pb2.py +0 -0
  106. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/channel_config_pb2.pyi +0 -0
  107. {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
  108. {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
  109. {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
  110. {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
  111. {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
  112. {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
  113. {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
  114. {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
  115. {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
  116. {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
  117. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/organization_pb2.py +0 -0
  118. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/organization_pb2.pyi +0 -0
  119. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/organization_pb2_grpc.py +0 -0
  120. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/organization_pb2_grpc.pyi +0 -0
  121. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/resource_identifier_pb2.py +0 -0
  122. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/resource_identifier_pb2.pyi +0 -0
  123. {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
  124. {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
  125. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/resource_ref_pb2.py +0 -0
  126. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/resource_ref_pb2.pyi +0 -0
  127. {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
  128. {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
  129. {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
  130. {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
  131. {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
  132. {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
  133. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/user_pb2.py +0 -0
  134. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/user_pb2.pyi +0 -0
  135. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/user_pb2_grpc.py +0 -0
  136. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/type/v1/user_pb2_grpc.pyi +0 -0
  137. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/__init__.py +0 -0
  138. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/action_type_pb2.py +0 -0
  139. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/action_type_pb2.pyi +0 -0
  140. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/action_type_pb2_grpc.py +0 -0
  141. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/action_type_pb2_grpc.pyi +0 -0
  142. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/filter_field_pb2.py +0 -0
  143. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/filter_field_pb2.pyi +0 -0
  144. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/filter_field_pb2_grpc.py +0 -0
  145. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/filter_field_pb2_grpc.pyi +0 -0
  146. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/resource_type_pb2.py +0 -0
  147. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/resource_type_pb2.pyi +0 -0
  148. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/resource_type_pb2_grpc.py +0 -0
  149. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/common/v1/resource_type_pb2_grpc.pyi +0 -0
  150. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/__init__.py +0 -0
  151. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v1/__init__.py +0 -0
  152. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v1/data_pb2.py +0 -0
  153. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v1/data_pb2.pyi +0 -0
  154. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v1/data_pb2_grpc.py +0 -0
  155. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v1/data_pb2_grpc.pyi +0 -0
  156. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v2/__init__.py +0 -0
  157. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v2/data_pb2.py +0 -0
  158. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v2/data_pb2.pyi +0 -0
  159. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v2/data_pb2_grpc.py +0 -0
  160. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data/v2/data_pb2_grpc.pyi +0 -0
  161. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data_imports/__init__.py +0 -0
  162. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data_imports/v2/__init__.py +0 -0
  163. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data_imports/v2/data_imports_pb2.py +0 -0
  164. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/data_imports/v2/data_imports_pb2.pyi +0 -0
  165. {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
  166. {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
  167. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/dlq_errors/__init__.py +0 -0
  168. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/dlq_errors/v2/__init__.py +0 -0
  169. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/dlq_errors/v2/dlq_errors_pb2.py +0 -0
  170. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/dlq_errors/v2/dlq_errors_pb2.pyi +0 -0
  171. {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
  172. {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
  173. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/exports/__init__.py +0 -0
  174. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/exports/v1/__init__.py +0 -0
  175. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/exports/v1/exports_pb2.py +0 -0
  176. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/exports/v1/exports_pb2.pyi +0 -0
  177. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/exports/v1/exports_pb2_grpc.py +0 -0
  178. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/exports/v1/exports_pb2_grpc.pyi +0 -0
  179. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/external_sync/__init__.py +0 -0
  180. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/external_sync/v1/__init__.py +0 -0
  181. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/external_sync/v1/external_sync_pb2.py +0 -0
  182. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/external_sync/v1/external_sync_pb2.pyi +0 -0
  183. {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
  184. {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
  185. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingest/__init__.py +0 -0
  186. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingest/v1/__init__.py +0 -0
  187. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingest/v1/ingest_pb2.py +0 -0
  188. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingest/v1/ingest_pb2.pyi +0 -0
  189. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingest/v1/ingest_pb2_grpc.py +0 -0
  190. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingest/v1/ingest_pb2_grpc.pyi +0 -0
  191. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/__init__.py +0 -0
  192. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v1/__init__.py +0 -0
  193. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v1/ingestion_configs_pb2.py +0 -0
  194. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v1/ingestion_configs_pb2.pyi +0 -0
  195. {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
  196. {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
  197. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v2/__init__.py +0 -0
  198. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v2/ingestion_configs_pb2.py +0 -0
  199. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ingestion_configs/v2/ingestion_configs_pb2.pyi +0 -0
  200. {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
  201. {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
  202. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/jobs/__init__.py +0 -0
  203. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/jobs/v1/__init__.py +0 -0
  204. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/jobs/v1/jobs_pb2.py +0 -0
  205. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/jobs/v1/jobs_pb2.pyi +0 -0
  206. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/jobs/v1/jobs_pb2_grpc.py +0 -0
  207. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/jobs/v1/jobs_pb2_grpc.pyi +0 -0
  208. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/me/__init__.py +0 -0
  209. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/me/v2/__init__.py +0 -0
  210. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/me/v2/me_pb2.py +0 -0
  211. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/me/v2/me_pb2.pyi +0 -0
  212. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/me/v2/me_pb2_grpc.py +0 -0
  213. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/me/v2/me_pb2_grpc.pyi +0 -0
  214. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/metadata/__init__.py +0 -0
  215. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/metadata/v1/__init__.py +0 -0
  216. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/metadata/v1/metadata_pb2.py +0 -0
  217. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/metadata/v1/metadata_pb2.pyi +0 -0
  218. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/metadata/v1/metadata_pb2_grpc.py +0 -0
  219. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/metadata/v1/metadata_pb2_grpc.pyi +0 -0
  220. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/notifications/__init__.py +0 -0
  221. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/notifications/v1/__init__.py +0 -0
  222. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/notifications/v1/notifications_pb2.py +0 -0
  223. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/notifications/v1/notifications_pb2.pyi +0 -0
  224. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/notifications/v1/notifications_pb2_grpc.py +0 -0
  225. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/notifications/v1/notifications_pb2_grpc.pyi +0 -0
  226. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/panel_configurations/__init__.py +0 -0
  227. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/panel_configurations/v1/__init__.py +0 -0
  228. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/panel_configurations/v1/panel_configuration_pb2.py +0 -0
  229. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/panel_configurations/v1/panel_configuration_pb2.pyi +0 -0
  230. {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
  231. {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
  232. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ping/__init__.py +0 -0
  233. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ping/v1/__init__.py +0 -0
  234. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ping/v1/ping_pb2.py +0 -0
  235. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ping/v1/ping_pb2.pyi +0 -0
  236. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ping/v1/ping_pb2_grpc.py +0 -0
  237. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/ping/v1/ping_pb2_grpc.pyi +0 -0
  238. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/policies/__init__.py +0 -0
  239. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/policies/v1/__init__.py +0 -0
  240. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/policies/v1/policies_pb2.py +0 -0
  241. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/policies/v1/policies_pb2.pyi +0 -0
  242. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/policies/v1/policies_pb2_grpc.py +0 -0
  243. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/policies/v1/policies_pb2_grpc.pyi +0 -0
  244. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/principal_attributes/__init__.py +0 -0
  245. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/principal_attributes/v1/__init__.py +0 -0
  246. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/principal_attributes/v1/principal_attributes_pb2.py +0 -0
  247. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/principal_attributes/v1/principal_attributes_pb2.pyi +0 -0
  248. {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
  249. {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
  250. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/protobuf_descriptors/__init__.py +0 -0
  251. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/protobuf_descriptors/v2/__init__.py +0 -0
  252. {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
  253. {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
  254. {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
  255. {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
  256. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/protobuf_descriptors/v2/protobuf_descriptors_pb2.py +0 -0
  257. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/protobuf_descriptors/v2/protobuf_descriptors_pb2.pyi +0 -0
  258. {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
  259. {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
  260. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/py.typed +0 -0
  261. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/remote_files/__init__.py +0 -0
  262. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/remote_files/v1/__init__.py +0 -0
  263. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/remote_files/v1/remote_files_pb2.py +0 -0
  264. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/remote_files/v1/remote_files_pb2.pyi +0 -0
  265. {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
  266. {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
  267. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/report_templates/__init__.py +0 -0
  268. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/report_templates/v1/__init__.py +0 -0
  269. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/report_templates/v1/report_templates_pb2.py +0 -0
  270. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/report_templates/v1/report_templates_pb2.pyi +0 -0
  271. {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
  272. {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
  273. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/reports/__init__.py +0 -0
  274. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/reports/v1/__init__.py +0 -0
  275. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/reports/v1/reports_pb2.py +0 -0
  276. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/reports/v1/reports_pb2.pyi +0 -0
  277. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/reports/v1/reports_pb2_grpc.py +0 -0
  278. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/reports/v1/reports_pb2_grpc.pyi +0 -0
  279. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/resource_attribute/__init__.py +0 -0
  280. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/resource_attribute/v1/__init__.py +0 -0
  281. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/resource_attribute/v1/resource_attribute_pb2.py +0 -0
  282. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/resource_attribute/v1/resource_attribute_pb2.pyi +0 -0
  283. {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
  284. {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
  285. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/roles/__init__.py +0 -0
  286. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/roles/v2/__init__.py +0 -0
  287. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/roles/v2/roles_pb2.py +0 -0
  288. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/roles/v2/roles_pb2.pyi +0 -0
  289. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/roles/v2/roles_pb2_grpc.py +0 -0
  290. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/roles/v2/roles_pb2_grpc.pyi +0 -0
  291. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rule_evaluation/__init__.py +0 -0
  292. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rule_evaluation/v1/__init__.py +0 -0
  293. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rule_evaluation/v1/rule_evaluation_pb2.py +0 -0
  294. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rule_evaluation/v1/rule_evaluation_pb2.pyi +0 -0
  295. {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
  296. {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
  297. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rules/__init__.py +0 -0
  298. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rules/v1/__init__.py +0 -0
  299. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rules/v1/rules_pb2.py +0 -0
  300. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rules/v1/rules_pb2.pyi +0 -0
  301. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rules/v1/rules_pb2_grpc.py +0 -0
  302. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/rules/v1/rules_pb2_grpc.pyi +0 -0
  303. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/runs/__init__.py +0 -0
  304. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/runs/v2/__init__.py +0 -0
  305. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/runs/v2/runs_pb2.py +0 -0
  306. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/runs/v2/runs_pb2.pyi +0 -0
  307. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/runs/v2/runs_pb2_grpc.py +0 -0
  308. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/runs/v2/runs_pb2_grpc.pyi +0 -0
  309. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/saved_searches/__init__.py +0 -0
  310. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/saved_searches/v1/__init__.py +0 -0
  311. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/saved_searches/v1/saved_searches_pb2.py +0 -0
  312. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/saved_searches/v1/saved_searches_pb2.pyi +0 -0
  313. {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
  314. {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
  315. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/__init__.py +0 -0
  316. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v1/__init__.py +0 -0
  317. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v1/tags_pb2.py +0 -0
  318. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v1/tags_pb2.pyi +0 -0
  319. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v1/tags_pb2_grpc.py +0 -0
  320. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v1/tags_pb2_grpc.pyi +0 -0
  321. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v2/__init__.py +0 -0
  322. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v2/tags_pb2.py +0 -0
  323. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v2/tags_pb2.pyi +0 -0
  324. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v2/tags_pb2_grpc.py +0 -0
  325. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/tags/v2/tags_pb2_grpc.pyi +0 -0
  326. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/test_reports/__init__.py +0 -0
  327. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/test_reports/v1/__init__.py +0 -0
  328. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/test_reports/v1/test_reports_pb2.py +0 -0
  329. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/test_reports/v1/test_reports_pb2.pyi +0 -0
  330. {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
  331. {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
  332. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/unit/__init__.py +0 -0
  333. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/unit/v2/__init__.py +0 -0
  334. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/unit/v2/unit_pb2.py +0 -0
  335. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/unit/v2/unit_pb2.pyi +0 -0
  336. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/unit/v2/unit_pb2_grpc.py +0 -0
  337. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/unit/v2/unit_pb2_grpc.pyi +0 -0
  338. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_defined_functions/__init__.py +0 -0
  339. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_defined_functions/v1/__init__.py +0 -0
  340. {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
  341. {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
  342. {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
  343. {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
  344. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_groups/__init__.py +0 -0
  345. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_groups/v2/__init__.py +0 -0
  346. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_groups/v2/user_groups_pb2.py +0 -0
  347. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/user_groups/v2/user_groups_pb2.pyi +0 -0
  348. {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
  349. {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
  350. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/users/__init__.py +0 -0
  351. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/users/v2/__init__.py +0 -0
  352. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/users/v2/users_pb2.py +0 -0
  353. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/users/v2/users_pb2.pyi +0 -0
  354. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/users/v2/users_pb2_grpc.py +0 -0
  355. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/users/v2/users_pb2_grpc.pyi +0 -0
  356. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/__init__.py +0 -0
  357. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v1/__init__.py +0 -0
  358. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v1/views_pb2.py +0 -0
  359. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v1/views_pb2.pyi +0 -0
  360. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v1/views_pb2_grpc.py +0 -0
  361. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v1/views_pb2_grpc.pyi +0 -0
  362. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v2/__init__.py +0 -0
  363. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v2/views_pb2.py +0 -0
  364. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v2/views_pb2.pyi +0 -0
  365. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v2/views_pb2_grpc.py +0 -0
  366. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/views/v2/views_pb2_grpc.pyi +0 -0
  367. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/webhooks/__init__.py +0 -0
  368. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/webhooks/v1/__init__.py +0 -0
  369. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/webhooks/v1/webhooks_pb2.py +0 -0
  370. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/webhooks/v1/webhooks_pb2.pyi +0 -0
  371. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/webhooks/v1/webhooks_pb2_grpc.py +0 -0
  372. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift/webhooks/v1/webhooks_pb2_grpc.pyi +0 -0
  373. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/__init__.py +0 -0
  374. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/__init__.py +0 -0
  375. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/gen_pyi.py +0 -0
  376. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/__init__.py +0 -0
  377. {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
  378. {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
  379. {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
  380. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/_interceptors/__init__.py +0 -0
  381. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/_interceptors/base.py +0 -0
  382. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/_interceptors/context.py +0 -0
  383. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/_interceptors/metadata.py +0 -0
  384. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/_retry.py +0 -0
  385. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/keepalive.py +0 -0
  386. {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
  387. {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
  388. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/transport.py +0 -0
  389. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/grpc_transport/transport_test.py +0 -0
  390. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/__init__.py +0 -0
  391. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/assets.py +0 -0
  392. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/base.py +0 -0
  393. {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
  394. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/channels.py +0 -0
  395. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/data.py +0 -0
  396. {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
  397. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/exports.py +0 -0
  398. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/jobs.py +0 -0
  399. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/ping.py +0 -0
  400. {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
  401. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/reports.py +0 -0
  402. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/rules.py +0 -0
  403. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/runs.py +0 -0
  404. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/tags.py +0 -0
  405. {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
  406. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/units.py +0 -0
  407. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/low_level_wrappers/upload.py +0 -0
  408. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/__init__.py +0 -0
  409. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/pytest_plugin/modes.py +0 -0
  410. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/rest.py +0 -0
  411. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/sync_wrapper.py +0 -0
  412. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/time.py +0 -0
  413. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/urls.py +0 -0
  414. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/__init__.py +0 -0
  415. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/channels.py +0 -0
  416. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/executor.py +0 -0
  417. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/file.py +0 -0
  418. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/hdf5.py +0 -0
  419. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/numpy_types.py +0 -0
  420. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/progress.py +0 -0
  421. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/tdms.py +0 -0
  422. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/timestamp.py +0 -0
  423. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/_internal/util/util.py +0 -0
  424. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/client.py +0 -0
  425. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/config.py +0 -0
  426. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/errors.py +0 -0
  427. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/py.typed +0 -0
  428. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/_base.py +0 -0
  429. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/assets.py +0 -0
  430. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/calculated_channels.py +0 -0
  431. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/channels.py +0 -0
  432. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/data_imports.py +0 -0
  433. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/exports.py +0 -0
  434. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/file_attachments.py +0 -0
  435. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/jobs.py +0 -0
  436. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/ping.py +0 -0
  437. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/py.typed +0 -0
  438. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/rules.py +0 -0
  439. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/sync_stubs/__init__.py +0 -0
  440. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/sync_stubs/py.typed +0 -0
  441. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/tags.py +0 -0
  442. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/resources/test_results.py +0 -0
  443. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/scripts/__init__.py +0 -0
  444. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/__init__.py +0 -0
  445. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/_base.py +0 -0
  446. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/_mixins/__init__.py +0 -0
  447. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/_mixins/file_attachments.py +0 -0
  448. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/_mixins/metadata.py +0 -0
  449. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/_mixins/simulated.py +0 -0
  450. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/asset.py +0 -0
  451. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/calculated_channel.py +0 -0
  452. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/channel.py +0 -0
  453. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/data_import.py +0 -0
  454. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/export.py +0 -0
  455. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/file_attachment.py +0 -0
  456. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/ingestion.py +0 -0
  457. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/job.py +0 -0
  458. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/report.py +0 -0
  459. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/rule.py +0 -0
  460. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/run.py +0 -0
  461. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/tag.py +0 -0
  462. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/sift_types/test_report.py +0 -0
  463. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/transport/__init__.py +0 -0
  464. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/transport/base_connection.py +0 -0
  465. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/transport/grpc_transport.py +0 -0
  466. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/transport/rest_transport.py +0 -0
  467. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/util/__init__.py +0 -0
  468. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/util/cel_utils.py +0 -0
  469. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/util/metadata.py +0 -0
  470. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/util/test_results/bounds.py +0 -0
  471. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_client/util/util.py +0 -0
  472. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/__init__.py +0 -0
  473. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/__init__.py +0 -0
  474. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/cel.py +0 -0
  475. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/channel.py +0 -0
  476. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/convert/__init__.py +0 -0
  477. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/convert/json.py +0 -0
  478. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/convert/protobuf.py +0 -0
  479. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/convert/timestamp.py +0 -0
  480. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/metadata.py +0 -0
  481. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/metadata_test.py +0 -0
  482. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/test_util/__init__.py +0 -0
  483. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/test_util/channel.py +0 -0
  484. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/test_util/fn.py +0 -0
  485. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/test_util/server_interceptor.py +0 -0
  486. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/time.py +0 -0
  487. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_internal/user.py +0 -0
  488. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/_rest_test.py +0 -0
  489. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/asset/__init__.py +0 -0
  490. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/asset/_config_test.py +0 -0
  491. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/asset/_internal/shared.py +0 -0
  492. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/asset/_service_test.py +0 -0
  493. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/asset/config.py +0 -0
  494. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/asset/service.py +0 -0
  495. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/calculated_channels/__init__.py +0 -0
  496. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/calculated_channels/_service_test.py +0 -0
  497. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/calculated_channels/config.py +0 -0
  498. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/calculated_channels/service.py +0 -0
  499. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/__init__.py +0 -0
  500. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/_channel.py +0 -0
  501. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/_deserialize.py +0 -0
  502. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/_deserialize_test.py +0 -0
  503. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/_service_test.py +0 -0
  504. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/_validate.py +0 -0
  505. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/error.py +0 -0
  506. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/query.py +0 -0
  507. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data/service.py +0 -0
  508. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/__init__.py +0 -0
  509. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_config.py +0 -0
  510. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_config_test.py +0 -0
  511. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_csv_test.py +0 -0
  512. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_hdf5_test.py +0 -0
  513. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_parquet_test.py +0 -0
  514. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_ros_channel.py +0 -0
  515. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_rosbag_test.py +0 -0
  516. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_status_test.py +0 -0
  517. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_tdms_test.py +0 -0
  518. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_utils.py +0 -0
  519. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/_utils_test.py +0 -0
  520. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/ch10.py +0 -0
  521. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/config.py +0 -0
  522. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/csv.py +0 -0
  523. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/hdf5.py +0 -0
  524. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/parquet.py +0 -0
  525. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/parquet_complex_types.py +0 -0
  526. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/rosbags.py +0 -0
  527. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/status.py +0 -0
  528. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/tdms.py +0 -0
  529. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/tempfile.py +0 -0
  530. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/data_import/time_format.py +0 -0
  531. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/error.py +0 -0
  532. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/__init__.py +0 -0
  533. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/_internal/__init__.py +0 -0
  534. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/_internal/download.py +0 -0
  535. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/_internal/upload.py +0 -0
  536. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/_service_test.py +0 -0
  537. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/entity.py +0 -0
  538. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/metadata.py +0 -0
  539. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/file_attachment/service.py +0 -0
  540. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/__init__.py +0 -0
  541. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_async_interceptors/__init__.py +0 -0
  542. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_async_interceptors/base.py +0 -0
  543. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_async_interceptors/metadata.py +0 -0
  544. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_interceptors/__init__.py +0 -0
  545. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_interceptors/base.py +0 -0
  546. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_interceptors/context.py +0 -0
  547. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_interceptors/metadata.py +0 -0
  548. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/_retry.py +0 -0
  549. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/keepalive.py +0 -0
  550. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/transport.py +0 -0
  551. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/grpc/transport_test.py +0 -0
  552. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/__init__.py +0 -0
  553. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_internal/__init__.py +0 -0
  554. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_internal/channel.py +0 -0
  555. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_internal/error.py +0 -0
  556. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_internal/ingest.py +0 -0
  557. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_internal/ingest_test.py +0 -0
  558. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_internal/ingestion_config.py +0 -0
  559. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_internal/run.py +0 -0
  560. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/_service_test.py +0 -0
  561. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/buffer.py +0 -0
  562. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/channel.py +0 -0
  563. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/__init__.py +0 -0
  564. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/_telemetry_test.py +0 -0
  565. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/telemetry.py +0 -0
  566. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/yaml/__init__.py +0 -0
  567. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/yaml/error.py +0 -0
  568. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/yaml/load.py +0 -0
  569. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/yaml/spec.py +0 -0
  570. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/config/yaml/test_load.py +0 -0
  571. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/flow.py +0 -0
  572. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/manager.py +0 -0
  573. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/rule/__init__.py +0 -0
  574. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/rule/config.py +0 -0
  575. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/ingestion/service.py +0 -0
  576. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/py.typed +0 -0
  577. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/report/_report_test.py +0 -0
  578. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/report/service.py +0 -0
  579. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/report_templates/__init__.py +0 -0
  580. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/report_templates/_config_test.py +0 -0
  581. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/report_templates/_service_test.py +0 -0
  582. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/report_templates/config.py +0 -0
  583. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/report_templates/service.py +0 -0
  584. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rest.py +0 -0
  585. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rule/__init__.py +0 -0
  586. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rule/_config_test.py +0 -0
  587. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rule/_service_test.py +0 -0
  588. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rule/config.py +0 -0
  589. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rule/service.py +0 -0
  590. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rule_evaluation/_service_test.py +0 -0
  591. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/rule_evaluation/service.py +0 -0
  592. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/tag/_internal/shared.py +0 -0
  593. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/__init__.py +0 -0
  594. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/_channel_test.py +0 -0
  595. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/_rule_test.py +0 -0
  596. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/_utils_test.py +0 -0
  597. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/calculated_channels.py +0 -0
  598. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/channel.py +0 -0
  599. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/report_templates.py +0 -0
  600. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/rule.py +0 -0
  601. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_py/yaml/utils.py +0 -0
  602. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_stack_py.egg-info/SOURCES.txt +0 -0
  603. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_stack_py.egg-info/dependency_links.txt +0 -0
  604. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_stack_py.egg-info/entry_points.txt +0 -0
  605. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/lib/sift_stack_py.egg-info/top_level.txt +0 -0
  606. {sift_stack_py-0.17.0.dev3 → sift_stack_py-0.18.0}/setup.cfg +0 -0
  607. {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.17.0.dev3
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.3.0; extra == "all"
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.3.0; extra == "dev-all"
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.3.0; extra == "docs-build"
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.3.0; extra == "sift-stream"
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.3.0; extra == "sift-stream-bindings"
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 (the hang in ENG-12003). The acquire is also
36
- bounded by ``LOG_LOCK_TIMEOUT_SECONDS``, surfacing a stuck lock as
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
- # Importing here to allow sift_stream_bindings to be an optional dependancy for non-ingestion users
266
- # TODO(nathan): Fix bindings to fix mypy issues with tracing functions
267
- from sift_stream_bindings import ( # type: ignore[attr-defined]
268
- DurationPy,
269
- SiftStreamBuilderPy,
270
- init_tracing, # type: ignore[attr-defined]
271
- init_tracing_with_file, # type: ignore[attr-defined]
272
- is_tracing_initialized, # type: ignore[attr-defined]
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):
@@ -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 the plugin falls back to its
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
- (a temp file unless ``--sift-audit-log=<path>`` pins one), with warnings also
6
- echoed to stdout. Pass ``--sift-audit-log=false`` (or set ``sift_audit_log =
7
- "false"``) to turn it off. The replay subprocess gets its own sibling file via
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 the
12
- plugin's own test suite drives nested in-process sessions doesn't accumulate
13
- handlers or leak one session's file into the next.
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 which every plugin call starts with a
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`` other handlers (e.g. pytest's log capture) see the record
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 audit_disabled(value: object) -> bool:
114
- """Whether audit logging is explicitly turned off.
113
+ def _make_session_dir(base: Path | None = None) -> Path:
114
+ """Create and return ``<base>/<random>/`` for this run's artifacts.
115
115
 
116
- Default on: only ``False`` / ``"false"`` / ``"none"`` disables. Anything
117
- else unset, ``"true"``, or a path leaves it enabled.
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 value is False:
120
- return True
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
- raw = AUDIT_LOG_OPTION.resolve(config)
202
- if audit_disabled(raw):
177
+ if not AUDIT_LOG_OPTION.resolve(config):
203
178
  return None
204
- path = explicit_audit_path(raw) or default_audit_path(session_dir=session_dir)
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 important when one process runs many sessions (the
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 the end-state validation view.
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
- Failed/errored steps are annotated with the first line of their
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
- line = f"{head}{leader} {status}"
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 flag survives because the per-run override is real.
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="Path to the JSONL log of create/update calls (path | true | false | none).",
225
- cli="--sift-log-file",
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-level audit trace of plugin behavior (path | true | false). On by "
232
- "default to a temp file, with warnings echoed to stdout; set a path to pin the "
233
- "file, or false to disable.",
234
- cli="--sift-audit-log",
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,
@@ -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=false``) the report is created
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 resolve_log_file(pytestconfig: pytest.Config | None) -> str | Path | bool | None:
381
- """Determine log_file value from CLI flag or ini key.
380
+ def log_file_enabled(pytestconfig: pytest.Config | None) -> bool:
381
+ """Whether the JSONL log of create/update calls is written.
382
382
 
383
- Three signal types arrive here:
384
-
385
- * ``None``: unset; nothing was passed on the CLI and the ini key is
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
- raw = LOG_FILE_OPTION.resolve(pytestconfig)
398
- disabled = raw is False or (isinstance(raw, str) and raw.lower() in ("false", "none"))
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=none is incompatible with --sift-offline; offline "
402
- "mode requires a log file. Pin one with --sift-log-file=<path>, or "
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
- if raw is False:
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=<temp or user path>, replay_log_file=True
462
- # --sift-offline: log_file=<temp or user path>, replay_log_file=False
463
- # --sift-disabled: log_file=False, replay_log_file=False
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 | None = False if disabled else resolve_log_file(pytestconfig)
467
- # When the log would use a default temp file and the plugin already created
468
- # a session dir, pin the JSONL inside that dir so it lands alongside the
469
- # audit log rather than having ReportContext mint a separate session dir.
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