flowcept 0.9.16__tar.gz → 0.9.17__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 (218) hide show
  1. {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/create-release-n-publish.yml +2 -2
  2. {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run-llm-tests.yml +1 -1
  3. {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run-tests-all-dbs.yml +1 -1
  4. {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run-tests-kafka.yml +1 -1
  5. {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run-tests-py313.yml +1 -1
  6. {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run-tests-simple.yml +1 -1
  7. {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run-tests.yml +1 -1
  8. {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run_examples.sh +2 -0
  9. {flowcept-0.9.16 → flowcept-0.9.17}/PKG-INFO +3 -2
  10. {flowcept-0.9.16 → flowcept-0.9.17}/README.md +1 -0
  11. {flowcept-0.9.16 → flowcept-0.9.17}/docs/index.rst +18 -0
  12. {flowcept-0.9.16 → flowcept-0.9.17}/docs/prov_query.rst +2 -2
  13. {flowcept-0.9.16 → flowcept-0.9.17}/docs/publications/README.md +33 -15
  14. {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_complex/llm_main_example.py +18 -3
  15. {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_complex/llm_test_runner.py +1 -1
  16. {flowcept-0.9.16 → flowcept-0.9.17}/pyproject.toml +1 -1
  17. {flowcept-0.9.16 → flowcept-0.9.17}/resources/sample_settings.yaml +1 -1
  18. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/interception_event_handler.py +5 -2
  19. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py +4 -3
  20. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/tensorboard/tensorboard_interceptor.py +6 -1
  21. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/version.py +1 -1
  22. {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/test_file_observer.py +11 -7
  23. {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/checks.yml +0 -0
  24. {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run-tests-in-container.yml +0 -0
  25. {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/version_bumper.py +0 -0
  26. {flowcept-0.9.16 → flowcept-0.9.17}/.gitignore +0 -0
  27. {flowcept-0.9.16 → flowcept-0.9.17}/.readthedocs.yaml +0 -0
  28. {flowcept-0.9.16 → flowcept-0.9.17}/CONTRIBUTING.md +0 -0
  29. {flowcept-0.9.16 → flowcept-0.9.17}/LICENSE +0 -0
  30. {flowcept-0.9.16 → flowcept-0.9.17}/Makefile +0 -0
  31. {flowcept-0.9.16 → flowcept-0.9.17}/deployment/Dockerfile +0 -0
  32. {flowcept-0.9.16 → flowcept-0.9.17}/deployment/compose-grafana.yml +0 -0
  33. {flowcept-0.9.16 → flowcept-0.9.17}/deployment/compose-kafka.yml +0 -0
  34. {flowcept-0.9.16 → flowcept-0.9.17}/deployment/compose-mofka.yml +0 -0
  35. {flowcept-0.9.16 → flowcept-0.9.17}/deployment/compose-mongo.yml +0 -0
  36. {flowcept-0.9.16 → flowcept-0.9.17}/deployment/compose.yml +0 -0
  37. {flowcept-0.9.16 → flowcept-0.9.17}/docs/api-reference.rst +0 -0
  38. {flowcept-0.9.16 → flowcept-0.9.17}/docs/architecture.rst +0 -0
  39. {flowcept-0.9.16 → flowcept-0.9.17}/docs/cli-reference.rst +0 -0
  40. {flowcept-0.9.16 → flowcept-0.9.17}/docs/conf.py +0 -0
  41. {flowcept-0.9.16 → flowcept-0.9.17}/docs/contributing.rst +0 -0
  42. {flowcept-0.9.16 → flowcept-0.9.17}/docs/img/PROV-AGENT.svg +0 -0
  43. {flowcept-0.9.16 → flowcept-0.9.17}/docs/img/architecture-diagram.png +0 -0
  44. {flowcept-0.9.16 → flowcept-0.9.17}/docs/img/flowcept-logo-dark.png +0 -0
  45. {flowcept-0.9.16 → flowcept-0.9.17}/docs/img/flowcept-logo.png +0 -0
  46. {flowcept-0.9.16 → flowcept-0.9.17}/docs/large_data.rst +0 -0
  47. {flowcept-0.9.16 → flowcept-0.9.17}/docs/prov_capture.rst +0 -0
  48. {flowcept-0.9.16 → flowcept-0.9.17}/docs/prov_storage.rst +0 -0
  49. {flowcept-0.9.16 → flowcept-0.9.17}/docs/quick_start.rst +0 -0
  50. {flowcept-0.9.16 → flowcept-0.9.17}/docs/schemas.rst +0 -0
  51. {flowcept-0.9.16 → flowcept-0.9.17}/docs/setup.rst +0 -0
  52. {flowcept-0.9.16 → flowcept-0.9.17}/docs/task_schema.rst +0 -0
  53. {flowcept-0.9.16 → flowcept-0.9.17}/docs/telemetry_capture.rst +0 -0
  54. {flowcept-0.9.16 → flowcept-0.9.17}/docs/workflow_schema.rst +0 -0
  55. {flowcept-0.9.16 → flowcept-0.9.17}/examples/agents/a2a/README.md +0 -0
  56. {flowcept-0.9.16 → flowcept-0.9.17}/examples/agents/a2a/agent1.py +0 -0
  57. {flowcept-0.9.16 → flowcept-0.9.17}/examples/agents/a2a/agent2.py +0 -0
  58. {flowcept-0.9.16 → flowcept-0.9.17}/examples/agents/aec_agent_context_manager.py +0 -0
  59. {flowcept-0.9.16 → flowcept-0.9.17}/examples/agents/aec_agent_mock.py +0 -0
  60. {flowcept-0.9.16 → flowcept-0.9.17}/examples/agents/aec_prompts.py +0 -0
  61. {flowcept-0.9.16 → flowcept-0.9.17}/examples/agents/opt_driver_mock.py +0 -0
  62. {flowcept-0.9.16 → flowcept-0.9.17}/examples/consumers/ping_pong_example.py +0 -0
  63. {flowcept-0.9.16 → flowcept-0.9.17}/examples/consumers/simple_consumer.py +0 -0
  64. {flowcept-0.9.16 → flowcept-0.9.17}/examples/consumers/simple_publisher.py +0 -0
  65. {flowcept-0.9.16 → flowcept-0.9.17}/examples/convergence_loop_example.py +0 -0
  66. {flowcept-0.9.16 → flowcept-0.9.17}/examples/dask_example.py +0 -0
  67. {flowcept-0.9.16 → flowcept-0.9.17}/examples/distributed_consumer_example.py +0 -0
  68. {flowcept-0.9.16 → flowcept-0.9.17}/examples/instrumented_loop_example.py +0 -0
  69. {flowcept-0.9.16 → flowcept-0.9.17}/examples/instrumented_simple_example.py +0 -0
  70. {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_complex/README.md +0 -0
  71. {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_complex/custom_provenance_id_mapping.yaml +0 -0
  72. {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_complex/llm_dataprep.py +0 -0
  73. {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_complex/llm_model.py +0 -0
  74. {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_tutorial/README.md +0 -0
  75. {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_tutorial/analysis.ipynb +0 -0
  76. {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_tutorial/llm_dataprep.py +0 -0
  77. {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_tutorial/llm_model.py +0 -0
  78. {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_tutorial/llm_train_campaign.py +0 -0
  79. {flowcept-0.9.16 → flowcept-0.9.17}/examples/mlflow_example.py +0 -0
  80. {flowcept-0.9.16 → flowcept-0.9.17}/examples/mqtt_example.py +0 -0
  81. {flowcept-0.9.16 → flowcept-0.9.17}/examples/single_layer_perceptron_example.py +0 -0
  82. {flowcept-0.9.16 → flowcept-0.9.17}/examples/start_here.py +0 -0
  83. {flowcept-0.9.16 → flowcept-0.9.17}/examples/tensorboard_example.py +0 -0
  84. {flowcept-0.9.16 → flowcept-0.9.17}/examples/unmanaged/main.py +0 -0
  85. {flowcept-0.9.16 → flowcept-0.9.17}/examples/unmanaged/simple_task.py +0 -0
  86. {flowcept-0.9.16 → flowcept-0.9.17}/notebooks/analytics.ipynb +0 -0
  87. {flowcept-0.9.16 → flowcept-0.9.17}/notebooks/dask.ipynb +0 -0
  88. {flowcept-0.9.16 → flowcept-0.9.17}/notebooks/dask_from_CLI.ipynb +0 -0
  89. {flowcept-0.9.16 → flowcept-0.9.17}/notebooks/mlflow.ipynb +0 -0
  90. {flowcept-0.9.16 → flowcept-0.9.17}/notebooks/reset_dask_nb_exec_counts.py +0 -0
  91. {flowcept-0.9.16 → flowcept-0.9.17}/notebooks/tensorboard.ipynb +0 -0
  92. {flowcept-0.9.16 → flowcept-0.9.17}/resources/mofka/bedrock_setup.sh +0 -0
  93. {flowcept-0.9.16 → flowcept-0.9.17}/resources/mofka/consumer.py +0 -0
  94. {flowcept-0.9.16 → flowcept-0.9.17}/resources/mofka/mofka-requirements.yaml +0 -0
  95. {flowcept-0.9.16 → flowcept-0.9.17}/resources/mofka/mofka_config.json +0 -0
  96. {flowcept-0.9.16 → flowcept-0.9.17}/resources/ontology/catalog-v001.xml +0 -0
  97. {flowcept-0.9.16 → flowcept-0.9.17}/resources/ontology/prov_agent.owl +0 -0
  98. {flowcept-0.9.16 → flowcept-0.9.17}/resources/simple_redis_consumer.py +0 -0
  99. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/__init__.py +0 -0
  100. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/__init__.py +0 -0
  101. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/agent_client.py +0 -0
  102. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/agents_utils.py +0 -0
  103. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/dynamic_schema_tracker.py +0 -0
  104. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/flowcept_agent.py +0 -0
  105. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/flowcept_ctx_manager.py +0 -0
  106. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/gui/__init__.py +0 -0
  107. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/gui/agent_gui.py +0 -0
  108. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/gui/audio_utils.py +0 -0
  109. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/gui/gui_utils.py +0 -0
  110. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/llms/__init__.py +0 -0
  111. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/llms/claude_gcp.py +0 -0
  112. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/llms/gemini25.py +0 -0
  113. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/prompts/__init__.py +0 -0
  114. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/prompts/general_prompts.py +0 -0
  115. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/prompts/in_memory_query_prompts.py +0 -0
  116. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/tools/__init__.py +0 -0
  117. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/tools/general_tools.py +0 -0
  118. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/tools/in_memory_queries/__init__.py +0 -0
  119. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/tools/in_memory_queries/in_memory_queries_tools.py +0 -0
  120. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/tools/in_memory_queries/pandas_agent_utils.py +0 -0
  121. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/analytics/__init__.py +0 -0
  122. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/analytics/analytics_utils.py +0 -0
  123. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/analytics/data_augmentation.py +0 -0
  124. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/analytics/plot.py +0 -0
  125. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/cli.py +0 -0
  126. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/__init__.py +0 -0
  127. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/autoflush_buffer.py +0 -0
  128. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/__init__.py +0 -0
  129. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/__init__.py +0 -0
  130. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/docdb_dao_base.py +0 -0
  131. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/lmdb_dao.py +0 -0
  132. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/mongodb_dao.py +0 -0
  133. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/keyvalue_dao.py +0 -0
  134. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/__init__.py +0 -0
  135. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_base.py +0 -0
  136. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_kafka.py +0 -0
  137. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_mofka.py +0 -0
  138. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_redis.py +0 -0
  139. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/redis_conn.py +0 -0
  140. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/__init__.py +0 -0
  141. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/base_settings_dataclasses.py +0 -0
  142. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/task_object.py +0 -0
  143. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/telemetry.py +0 -0
  144. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/workflow_object.py +0 -0
  145. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/flowcept_logger.py +0 -0
  146. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/query_utils.py +0 -0
  147. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/settings_factory.py +0 -0
  148. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/task_data_preprocess.py +0 -0
  149. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/utils.py +0 -0
  150. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/vocabulary.py +0 -0
  151. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/configs.py +0 -0
  152. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_api/__init__.py +0 -0
  153. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_api/db_api.py +0 -0
  154. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_api/flowcept_controller.py +0 -0
  155. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_api/task_query_api.py +0 -0
  156. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/__init__.py +0 -0
  157. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/app.py +0 -0
  158. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/resources/__init__.py +0 -0
  159. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/resources/query_rsrc.py +0 -0
  160. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/resources/task_messages_rsrc.py +0 -0
  161. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/__init__.py +0 -0
  162. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/__init__.py +0 -0
  163. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/base_interceptor.py +0 -0
  164. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/brokers/__init__.py +0 -0
  165. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/brokers/mqtt_interceptor.py +0 -0
  166. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/__init__.py +0 -0
  167. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/dask_dataclasses.py +0 -0
  168. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/dask_interceptor.py +0 -0
  169. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/dask_plugins.py +0 -0
  170. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/instrumentation_interceptor.py +0 -0
  171. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/interceptor_state_manager.py +0 -0
  172. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/__init__.py +0 -0
  173. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/mlflow_dao.py +0 -0
  174. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/mlflow_dataclasses.py +0 -0
  175. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/tensorboard/__init__.py +0 -0
  176. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/tensorboard/tensorboard_dataclasses.py +0 -0
  177. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/__init__.py +0 -0
  178. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/agent/__init__.py +0 -0
  179. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/agent/base_agent_context_manager.py +0 -0
  180. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/base_consumer.py +0 -0
  181. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/consumer_utils.py +0 -0
  182. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/document_inserter.py +0 -0
  183. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/telemetry_capture.py +0 -0
  184. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/instrumentation/__init__.py +0 -0
  185. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_agent_task.py +0 -0
  186. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_decorator.py +0 -0
  187. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_loop.py +0 -0
  188. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_task.py +0 -0
  189. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_torch.py +0 -0
  190. {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/instrumentation/task_capture.py +0 -0
  191. {flowcept-0.9.16 → flowcept-0.9.17}/tests/__init__.py +0 -0
  192. {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/__init__.py +0 -0
  193. {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/dask_test_utils.py +0 -0
  194. {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/test_broker.py +0 -0
  195. {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/test_dask.py +0 -0
  196. {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/test_dask_with_context_mgmt.py +0 -0
  197. {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/test_mlflow.py +0 -0
  198. {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/test_tensorboard.py +0 -0
  199. {flowcept-0.9.16 → flowcept-0.9.17}/tests/api/__init__.py +0 -0
  200. {flowcept-0.9.16 → flowcept-0.9.17}/tests/api/db_api_test.py +0 -0
  201. {flowcept-0.9.16 → flowcept-0.9.17}/tests/api/flowcept_api_test.py +0 -0
  202. {flowcept-0.9.16 → flowcept-0.9.17}/tests/api/sample_data.json +0 -0
  203. {flowcept-0.9.16 → flowcept-0.9.17}/tests/api/sample_data_with_telemetry_and_rai.json +0 -0
  204. {flowcept-0.9.16 → flowcept-0.9.17}/tests/api/task_query_api_test.py +0 -0
  205. {flowcept-0.9.16 → flowcept-0.9.17}/tests/doc_db_inserter/__init__.py +0 -0
  206. {flowcept-0.9.16 → flowcept-0.9.17}/tests/doc_db_inserter/doc_db_inserter_test.py +0 -0
  207. {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/__init__.py +0 -0
  208. {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/flowcept_explicit_tasks.py +0 -0
  209. {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/flowcept_loop_test.py +0 -0
  210. {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/flowcept_task_decorator_test.py +0 -0
  211. {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/__init__.py +0 -0
  212. {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/dl_trainer.py +0 -0
  213. {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/ml_decorator_dask_test.py +0 -0
  214. {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/ml_decorator_test.py +0 -0
  215. {flowcept-0.9.16 → flowcept-0.9.17}/tests/misc_tests/__init__.py +0 -0
  216. {flowcept-0.9.16 → flowcept-0.9.17}/tests/misc_tests/log_test.py +0 -0
  217. {flowcept-0.9.16 → flowcept-0.9.17}/tests/misc_tests/singleton_test.py +0 -0
  218. {flowcept-0.9.16 → flowcept-0.9.17}/tests/misc_tests/telemetry_test.py +0 -0
@@ -18,10 +18,10 @@ jobs:
18
18
  with:
19
19
  fetch-depth: 1
20
20
 
21
- - name: Set up Python 3.10
21
+ - name: Set up Python 3.12
22
22
  uses: actions/setup-python@v5
23
23
  with:
24
- python-version: "3.10"
24
+ python-version: "3.12"
25
25
 
26
26
  - name: Update version.py
27
27
  run: |
@@ -7,7 +7,7 @@ jobs:
7
7
  runs-on: ubuntu-latest
8
8
  strategy:
9
9
  matrix:
10
- python-version: [ "3.10", "3.11", "3.12" ]
10
+ python-version: [ "3.11", "3.12" ]
11
11
  env:
12
12
  MONGO_ENABLED: true
13
13
  LMDB_ENABLED: false
@@ -8,7 +8,7 @@ jobs:
8
8
  timeout-minutes: 40
9
9
  strategy:
10
10
  matrix:
11
- python-version: [ "3.10", "3.11", "3.12" ]
11
+ python-version: [ "3.11", "3.12" ]
12
12
  env:
13
13
  MONGO_ENABLED: true
14
14
  LMDB_ENABLED: true
@@ -12,7 +12,7 @@ jobs:
12
12
  runs-on: ubuntu-latest
13
13
  strategy:
14
14
  matrix:
15
- python-version: [ "3.10", "3.11", "3.12" ]
15
+ python-version: [ "3.11", "3.12" ]
16
16
  env:
17
17
  MONGO_ENABLED: true
18
18
  LMDB_ENABLED: false
@@ -1,4 +1,4 @@
1
- name: Tests on Py313
1
+ name: Tests on Py_gt_312
2
2
  on: [pull_request]
3
3
 
4
4
  jobs:
@@ -10,7 +10,7 @@ jobs:
10
10
  runs-on: ubuntu-latest
11
11
  strategy:
12
12
  matrix:
13
- python-version: [ "3.10", "3.11", "3.12" ]
13
+ python-version: [ "3.11", "3.12" ]
14
14
  env:
15
15
  MONGO_ENABLED: false
16
16
  LMDB_ENABLED: true
@@ -10,7 +10,7 @@ jobs:
10
10
  runs-on: ubuntu-latest
11
11
  strategy:
12
12
  matrix:
13
- python-version: [ "3.10", "3.11", "3.12" ]
13
+ python-version: [ "3.11", "3.12" ]
14
14
  env:
15
15
  MONGO_ENABLED: true
16
16
  LMDB_ENABLED: false
@@ -68,7 +68,9 @@ run_test() {
68
68
  echo "Ok, ran $test_path."
69
69
  if grep -iq "error" output.log; then
70
70
  echo "Test $test_path failed! See output.log for details."
71
+ echo "[BEGIN] Content of output.log"
71
72
  cat output.log
73
+ echo "[END] Content of output.log"
72
74
  exit 1
73
75
  fi
74
76
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowcept
3
- Version: 0.9.16
3
+ Version: 0.9.17
4
4
  Summary: Capture and query workflow provenance data using data observability
5
5
  Author: Oak Ridge National Laboratory
6
6
  License-Expression: MIT
@@ -9,7 +9,7 @@ Keywords: agentic-ai,agentic-workflows,ai,big-data,dask,data-analytics,data-inte
9
9
  Classifier: License :: OSI Approved :: MIT License
10
10
  Classifier: Operating System :: OS Independent
11
11
  Classifier: Programming Language :: Python :: 3
12
- Requires-Python: >=3.10
12
+ Requires-Python: >=3.11
13
13
  Requires-Dist: msgpack
14
14
  Requires-Dist: numpy
15
15
  Requires-Dist: omegaconf
@@ -169,6 +169,7 @@ Flowcept captures and queries workflow provenance at runtime with minimal code c
169
169
 
170
170
 
171
171
  [![Documentation](https://img.shields.io/badge/docs-readthedocs.io-green.svg)](https://flowcept.readthedocs.io/)
172
+ [![Slack](https://img.shields.io/badge/Slack-%23flowcept%40Workflows%20Community-4A154B?logo=slack)](https://workflowscommunity.slack.com/archives/C06L5GYJKQS)
172
173
  [![Build](https://github.com/ORNL/flowcept/actions/workflows/create-release-n-publish.yml/badge.svg)](https://github.com/ORNL/flowcept/actions/workflows/create-release-n-publish.yml)
173
174
  [![PyPI](https://badge.fury.io/py/flowcept.svg)](https://pypi.org/project/flowcept)
174
175
  [![Tests](https://github.com/ORNL/flowcept/actions/workflows/run-tests.yml/badge.svg)](https://github.com/ORNL/flowcept/actions/workflows/run-tests.yml)
@@ -20,6 +20,7 @@ Flowcept captures and queries workflow provenance at runtime with minimal code c
20
20
 
21
21
 
22
22
  [![Documentation](https://img.shields.io/badge/docs-readthedocs.io-green.svg)](https://flowcept.readthedocs.io/)
23
+ [![Slack](https://img.shields.io/badge/Slack-%23flowcept%40Workflows%20Community-4A154B?logo=slack)](https://workflowscommunity.slack.com/archives/C06L5GYJKQS)
23
24
  [![Build](https://github.com/ORNL/flowcept/actions/workflows/create-release-n-publish.yml/badge.svg)](https://github.com/ORNL/flowcept/actions/workflows/create-release-n-publish.yml)
24
25
  [![PyPI](https://badge.fury.io/py/flowcept.svg)](https://pypi.org/project/flowcept)
25
26
  [![Tests](https://github.com/ORNL/flowcept/actions/workflows/run-tests.yml/badge.svg)](https://github.com/ORNL/flowcept/actions/workflows/run-tests.yml)
@@ -18,6 +18,12 @@ Flowcept
18
18
  html[data-theme="auto"] .logo-light { display: none; }
19
19
  html[data-theme="auto"] .logo-dark { display: inline; }
20
20
  }
21
+
22
+ .hero { text-align: center; margin: 1.25rem 0 0.25rem; }
23
+ .hero h1 { font-size: 2rem; line-height: 1.2; margin: 0; }
24
+ .tagline { text-align: center; font-size: 1.05rem; max-width: 60rem; margin: 0.25rem auto 1.25rem; }
25
+
26
+
21
27
  </style>
22
28
 
23
29
  <p align="center">
@@ -32,6 +38,18 @@ Flowcept
32
38
  :align: center
33
39
  :width: 120px
34
40
 
41
+ .. raw:: html
42
+
43
+ <div class="hero">
44
+ <h4>Lightweight Distributed Workflow Provenance</h4>
45
+ </div>
46
+ <p class=\\"tagline\\">
47
+ Flowcept captures and queries workflow provenance at runtime with minimal code changes and low overhead.
48
+ It unifies data from diverse tools and workflows across the Edge–Cloud–HPC continuum and provides ML-aware capture,
49
+ MCP agents provenance, telemetry, extensible adapters, and flexible storage.
50
+ </p>
51
+
52
+
35
53
  .. toctree::
36
54
  :maxdepth: 2
37
55
  :caption: Contents:
@@ -142,8 +142,8 @@ Deleting a buffer file
142
142
  .. code-block:: python
143
143
 
144
144
  from flowcept import Flowcept
145
- Flowcept.delete_buffer_file() # deletes default path from settings
146
- Flowcept.delete_buffer_file(\"my_buffer.jsonl\")
145
+ Flowcept.delete_buffer_file() # deletes default path from settings
146
+ Flowcept.delete_buffer_file("my_buffer.jsonl")
147
147
 
148
148
  Notes
149
149
  ^^^^^
@@ -7,48 +7,66 @@ Bibtex is available below.
7
7
 
8
8
  **Towards Lightweight Data Integration using Multi-workflow Provenance and Data Observability**
9
9
  R. Souza, T. J. Skluzacek, S. R. Wilkinson, M. Ziatdinov, and R. Ferreira da Silva,
10
- *IEEE International Conference on e-Science*, Limassol, Cyprus, 2023.
11
- doi: [10.1109/e-Science58273.2023.10254822](https://doi.org/10.1109/e-Science58273.2023.10254822)
12
- PDF: https://arxiv.org/pdf/2308.09004.pdf
13
-
10
+ *IEEE International Conference on e-Science*, Limassol, Cyprus, 2023. <br/>
11
+ **About**: Introduces Flowcept’s lightweight runtime provenance and data observability architecture and shows minimal-intrusion capture across heterogeneous workflows. <br/>
12
+ [[doi]](https://doi.org/10.1109/e-Science58273.2023.10254822)
13
+ [[pdf]](https://arxiv.org/pdf/2308.09004.pdf)
14
14
  ---
15
15
 
16
16
  **PROV-AGENT: Unified Provenance for Tracking AI Agent Interactions in Agentic Workflows**
17
17
  R. Souza, A. Gueroudji, S. DeWitt, D. Rosendo, T. Ghosal, R. Ross, P. Balaprakash, and R. Ferreira da Silva,
18
- *IEEE International Conference on e-Science*, Chicago, USA., 2025.
19
- PDF: https://arxiv.org/pdf/2508.02866
18
+ *IEEE International Conference on e-Science*, Chicago, USA., 2025. <br/>
19
+ **About**: Defines agentic provenance and a unified provenance model and tooling to capture, link, and query AI-agent interactions within agentic workflows. </br>
20
+ [[doi]](https://doi.org/10.1109/eScience65000.2025.00093)
21
+ [[pdf]](https://arxiv.org/pdf/2508.02866)
22
+ [[html]](https://arxiv.org/html/2508.02866v3) <br/>
23
+
20
24
 
21
25
  ---
22
26
 
23
27
  **Workflow Provenance in the Computing Continuum for Responsible, Trustworthy, and Energy-Efficient AI**
24
28
  R. Souza, S. Caino-Lores, M. Coletti, T. J. Skluzacek, A. Costan, F. Suter, M. Mattoso, and R. Ferreira da Silva,
25
- *IEEE International Conference on e-Science*, Osaka, Japan, 2024.
26
- doi: [10.1109/e-Science62913.2024.10678731](https://doi.org/10.1109/e-Science62913.2024.10678731)
27
- PDF: https://hal.science/hal-04902079v1/document
29
+ *IEEE International Conference on e-Science*, Osaka, Japan, 2024. <br/>
30
+ **About**: Explains how end-to-end provenance across edge, cloud, and HPC supports responsible, trustworthy, and energy-aware AI workflows. <br/>
31
+ [[doi]](https://doi.org/10.1109/e-Science62913.2024.10678731)
32
+ [[pdf]](https://hal.science/hal-04902079v1/document) <br/>
33
+
28
34
 
29
35
  ---
30
36
 
31
37
  **LLM Agents for Interactive Workflow Provenance: Reference Architecture and Evaluation Methodology**
32
38
  R. Souza, T. Poteet, B. Etz, D. Rosendo, A. Gueroudji, W. Shin, P. Balaprakash, and R. Ferreira da Silva,
33
39
  *Workflows in Support of Large-Scale Science (WORKS) co-located with the ACM/IEEE International Conference for High Performance Computing, Networking, Storage, and Analysis (SC)*, St. Louis, USA, 2025.
34
- doi: [10.1145/3731599.3767582](https://doi.org/10.1145/3731599.3767582)
40
+ **About**: Presents a reference architecture and evaluation method for LLM agents that query and act on large-scale provenance databases. </br>
41
+ [[doi]](https://doi.org/10.1145/3731599.3767582)
42
+ [[pdf]](https://arxiv.org/pdf/2509.13978)
43
+ [[html]](https://arxiv.org/html/2509.13978)
35
44
 
36
45
 
46
+ ---
47
+
37
48
  ### Papers that used Flowcept
38
49
 
39
50
 
40
51
  **Toward a Persistent Event-Streaming System for High-Performance Computing Applications**
41
52
  M. Dorier, A. Gueroudji, V. Hayot-Sasson, H. Nguyen, S. Ockerman, R. Souza, T. Bicer, H. Pan, P. Carns, K. Chard, and others
42
- *Frontiers in High Performance Computing*, 2025.
43
- doi: [10.3389/fhpcp.2025.1638203](https://doi.org/10.3389/fhpcp.2025.1638203)
44
- PDF: https://web.cels.anl.gov/~woz/papers/Mofka_2025.pdf
53
+ *Frontiers in High Performance Computing*, 2025. <br/>
54
+ **About**: Demonstrates Flowcept generating high-volume provenance that is persistently streamed with Mofka for HPC applications. <br/>
55
+ [[doi]](https://doi.org/10.3389/fhpcp.2025.1638203)
56
+ [[pdf]](https://web.cels.anl.gov/~woz/papers/Mofka_2025.pdf)
57
+ [[html]](https://www.frontiersin.org/journals/high-performance-computing/articles/10.3389/fhpcp.2025.1638203/full)
58
+ <br/>
59
+
45
60
 
46
61
  ---
47
62
 
48
63
  **AI Agents for Enabling Autonomous Experiments at ORNL’s HPC and Manufacturing User Facilities**
49
64
  D. Rosendo, S. DeWitt, R. Souza, P. Austria, T. Ghosal, M. McDonnell, R. Miller, T. Skluzacek, J. Haley, B. Turcksin, and others
50
- *Extreme-Scale Experiment-in-the-Loop Computing (XLOOP) co-located with the ACM/IEEE International Conference for High Performance Computing, Networking, Storage, and Analysis (SC)*, 2025.
51
- PDF: https://rafaelsilva.com/files/publications/rosendo2025xloop.pdf
65
+ *Extreme-Scale Experiment-in-the-Loop Computing (XLOOP) co-located with the ACM/IEEE International Conference for High Performance Computing, Networking, Storage, and Analysis (SC)*, 2025. <br/>
66
+ **About**: Leverages Flowcept’s agentic provenance to coordinate multi-agent experiments and connect agents with HPC simulations through a shared provenance stream. <br/>
67
+ [[doi]](https://doi.org/10.1145/3731599.3767592)
68
+ [[pdf]](https://rafaelsilva.com/files/publications/rosendo2025xloop.pdf)
69
+ [[html]](https://camps.aptaracorp.com/ACM_PMS/PMS/ACM/SCWORKSHOPS25/253/0b09762d-8e84-11f0-957d-16ffd757ba29/OUT/scworkshops25-253.html)
52
70
 
53
71
  ---
54
72
 
@@ -123,6 +123,13 @@ def search_workflow(ntokens, dataset_ref, train_data_path, val_data_path, test_d
123
123
 
124
124
  def start_dask(scheduler_file=None, start_dask_cluster=False, with_flowcept=True):
125
125
  from distributed import Client
126
+ try:
127
+ # Downgrading eventual dask comm errors in the logs
128
+ import logging
129
+ logging.getLogger("distributed.worker").setLevel(logging.WARNING)
130
+ logging.getLogger("distributed.comm").setLevel(logging.WARNING)
131
+ except:
132
+ pass
126
133
 
127
134
  if start_dask_cluster:
128
135
  import subprocess
@@ -196,9 +203,17 @@ def close_dask(client, cluster, scheduler_file=None, start_dask_cluster=False, _
196
203
  print("Flowcept consumer closed.")
197
204
  else:
198
205
  print("Closing dask...")
199
- client.close()
200
- cluster.close()
201
- print("Dask closed.")
206
+ try:
207
+ client.close()
208
+ cluster.close()
209
+ print("Dask closed.")
210
+ except Exception as e:
211
+ print(f"Some exception when closing dask: {e}")
212
+ try:
213
+ import logging
214
+ logging.getLogger("distributed.worker").setLevel(logging.WARNING)
215
+ except:
216
+ pass
202
217
  if _flowcept:
203
218
  print("Now closing flowcept consumer...")
204
219
  _flowcept.stop()
@@ -67,7 +67,7 @@ def all():
67
67
  try:
68
68
  success = run_test(max_runs=3, config=config)
69
69
  if not success:
70
- write_log(str(i) + "--> " + str(config))
70
+ write_log("GOT ERROR! " + str(i) + "--> " + str(config))
71
71
  sys.exit(1)
72
72
  except Exception as e:
73
73
  write_exception(f"\n\n!!!!!!##### ERROR for combination {config}\n", e)
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
5
5
  [project]
6
6
  name = "flowcept"
7
7
  dynamic = ["version"]
8
- requires-python = ">=3.10"
8
+ requires-python = ">=3.11"
9
9
 
10
10
  authors = [{name = "Oak Ridge National Laboratory"}]
11
11
  description = "Capture and query workflow provenance data using data observability"
@@ -1,4 +1,4 @@
1
- flowcept_version: 0.9.16 # Version of the Flowcept package. This setting file is compatible with this version.
1
+ flowcept_version: 0.9.17 # Version of the Flowcept package. This setting file is compatible with this version.
2
2
 
3
3
  project:
4
4
  debug: true # Toggle debug mode. This will add a property `debug: true` to all saved data, making it easier to retrieve/delete them later.
@@ -1,16 +1,19 @@
1
1
  """Event handler module."""
2
2
 
3
+ from pathlib import Path
3
4
  from watchdog.events import FileSystemEventHandler
4
5
 
5
6
 
6
7
  class InterceptionEventHandler(FileSystemEventHandler):
7
8
  """Event handler class."""
8
9
 
9
- def __init__(self, interceptor_instance, callback_function):
10
+ def __init__(self, interceptor_instance, file_path_to_watch, callback_function):
10
11
  super().__init__()
12
+ self.file_path_to_watch = file_path_to_watch
11
13
  self.callback_function = callback_function
12
14
  self.interceptor_instance = interceptor_instance
13
15
 
14
16
  def on_modified(self, event):
15
17
  """Get on modified."""
16
- self.callback_function(self.interceptor_instance)
18
+ if Path(event.src_path).resolve() == Path(self.file_path_to_watch).resolve():
19
+ self.callback_function(self.interceptor_instance)
@@ -84,7 +84,7 @@ class MLFlowInterceptor(BaseInterceptor):
84
84
  def observe(self):
85
85
  """Observe it."""
86
86
  self.logger.debug("Observing")
87
- event_handler = InterceptionEventHandler(self, self.__class__.callback)
87
+ event_handler = InterceptionEventHandler(self, self.settings.file_path, self.__class__.callback)
88
88
  while not os.path.isfile(self.settings.file_path):
89
89
  self.logger.warning(
90
90
  f"I can't watch the file {self.settings.file_path},"
@@ -95,6 +95,7 @@ class MLFlowInterceptor(BaseInterceptor):
95
95
  sleep(self.settings.watch_interval_sec)
96
96
 
97
97
  self._observer = PollingObserver()
98
- self._observer.schedule(event_handler, self.settings.file_path, recursive=True)
98
+ watch_dir = os.path.dirname(self.settings.file_path) or "."
99
+ self._observer.schedule(event_handler, watch_dir, recursive=True)
99
100
  self._observer.start()
100
- self.logger.info(f"Watching {self.settings.file_path}")
101
+ self.logger.info(f"Watching directory {watch_dir} with file {self.settings.file_path} ")
@@ -1,6 +1,7 @@
1
1
  """Tensorboard interceptor module."""
2
2
 
3
3
  import os
4
+ from pathlib import Path
4
5
  from time import sleep
5
6
 
6
7
  from tbparse import SummaryReader
@@ -29,6 +30,8 @@ class TensorboardInterceptor(BaseInterceptor):
29
30
  def __init__(self, plugin_key="tensorboard"):
30
31
  super().__init__(plugin_key)
31
32
  self._observer: PollingObserver = None
33
+ if not Path(self.settings.file_path).is_dir():
34
+ raise Exception("Tensorboard Observer must observe directories.")
32
35
  self.state_manager = InterceptorStateManager(self.settings)
33
36
  self.state_manager.reset()
34
37
  self.log_metrics = set(self.settings.log_metrics)
@@ -108,13 +111,15 @@ class TensorboardInterceptor(BaseInterceptor):
108
111
 
109
112
  def observe(self):
110
113
  """Observe it."""
111
- event_handler = InterceptionEventHandler(self, self.__class__.callback)
114
+ self.logger.debug("Observing")
115
+ event_handler = InterceptionEventHandler(self, self.settings.file_path, self.__class__.callback)
112
116
  while not os.path.isdir(self.settings.file_path):
113
117
  self.logger.debug(f"I can't watch the file {self.settings.file_path}, as it does not exist.")
114
118
  self.logger.debug(f"\tI will sleep for {self.settings.watch_interval_sec} s to see if it appears.")
115
119
  sleep(self.settings.watch_interval_sec)
116
120
 
117
121
  self._observer = PollingObserver()
122
+
118
123
  self._observer.schedule(event_handler, self.settings.file_path, recursive=True)
119
124
  self._observer.start()
120
125
  self.logger.debug(f"Watching {self.settings.file_path}")
@@ -4,4 +4,4 @@
4
4
  # The expected format is: <Major>.<Minor>.<Patch>
5
5
  # This file is supposed to be automatically modified by the CI Bot.
6
6
  # See .github/workflows/version_bumper.py
7
- __version__ = "0.9.16"
7
+ __version__ = "0.9.17"
@@ -13,22 +13,26 @@ class TestFileObserver(unittest.TestCase):
13
13
  self.test_file_name = self.test_file.name
14
14
  self.test_file.close()
15
15
 
16
+ time.sleep(1.1)
17
+
16
18
  # Thread event to signal that the callback was called
17
19
  self.callback_called_event = threading.Event()
18
20
 
19
21
  # Define the callback function to be triggered on modification
20
- def callback(file_path):
21
- if file_path == self.test_file_name:
22
- print(f"Callback triggered for {file_path}")
22
+ def callback(event):
23
+ if not event.is_directory and event.src_path == self.test_file_name:
24
+ print(f"Callback triggered for {event.src_path}")
23
25
  self.callback_called_event.set()
24
26
 
27
+ watch_dir = os.path.dirname(self.test_file_name) or "."
28
+
25
29
  # Create an event handler and bind it to the callback
26
30
  self.event_handler = FileSystemEventHandler()
27
- self.event_handler.on_modified = lambda event: callback(event.src_path)
31
+ self.event_handler.on_modified = lambda event: callback(event)
28
32
 
29
33
  # Set up watchdog observer
30
34
  self.observer = PollingObserver()
31
- self.observer.schedule(self.event_handler, path=self.test_file_name, recursive=False)
35
+ self.observer.schedule(self.event_handler, path=watch_dir, recursive=False)
32
36
  self.observer.start()
33
37
 
34
38
  def tearDown(self):
@@ -44,10 +48,10 @@ class TestFileObserver(unittest.TestCase):
44
48
  f.flush()
45
49
  os.fsync(f.fileno()) # Ensure file system updates
46
50
 
47
- # Add a small delay to ensure the observer catches the event
51
+ # Add a delay to ensure the observer catches the event
48
52
  time.sleep(2)
49
53
 
50
- # Wait for the callback to be called (max wait 5 seconds)
54
+ # Wait for the callback to be called
51
55
  callback_triggered = self.callback_called_event.wait(timeout=10)
52
56
 
53
57
  # Assert that the callback was called
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes