labtasker 0.2.0__tar.gz → 0.2.1__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 (180) hide show
  1. {labtasker-0.2.0 → labtasker-0.2.1}/PKG-INFO +1 -1
  2. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/__init__.py +1 -1
  3. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/logging.py +97 -0
  4. {labtasker-0.2.0 → labtasker-0.2.1}/pyproject.toml +1 -1
  5. {labtasker-0.2.0 → labtasker-0.2.1}/.coveragerc +0 -0
  6. {labtasker-0.2.0 → labtasker-0.2.1}/.dockerignore +0 -0
  7. {labtasker-0.2.0 → labtasker-0.2.1}/.flake8 +0 -0
  8. {labtasker-0.2.0 → labtasker-0.2.1}/.gitattributes +0 -0
  9. {labtasker-0.2.0 → labtasker-0.2.1}/.gitignore +0 -0
  10. {labtasker-0.2.0 → labtasker-0.2.1}/.gitmodules +0 -0
  11. {labtasker-0.2.0 → labtasker-0.2.1}/.pre-commit-config.yaml +0 -0
  12. {labtasker-0.2.0 → labtasker-0.2.1}/.pytest.ini +0 -0
  13. {labtasker-0.2.0 → labtasker-0.2.1}/.python-version +0 -0
  14. {labtasker-0.2.0 → labtasker-0.2.1}/Dockerfile +0 -0
  15. {labtasker-0.2.0 → labtasker-0.2.1}/LICENSE +0 -0
  16. {labtasker-0.2.0 → labtasker-0.2.1}/MANIFEST.in +0 -0
  17. {labtasker-0.2.0 → labtasker-0.2.1}/PRIVACY.md +0 -0
  18. {labtasker-0.2.0 → labtasker-0.2.1}/README.md +0 -0
  19. {labtasker-0.2.0 → labtasker-0.2.1}/demo/advanced/custom_resolver/submit_job.py +0 -0
  20. {labtasker-0.2.0 → labtasker-0.2.1}/demo/advanced/custom_resolver/w.py +0 -0
  21. {labtasker-0.2.0 → labtasker-0.2.1}/demo/advanced/custom_resolver/wo.py +0 -0
  22. {labtasker-0.2.0 → labtasker-0.2.1}/demo/advanced/event_system/email_on_task_failure.py +0 -0
  23. {labtasker-0.2.0 → labtasker-0.2.1}/demo/advanced/event_system/send_email.py +0 -0
  24. {labtasker-0.2.0 → labtasker-0.2.1}/demo/advanced/event_system/sim_unstable_job.py +0 -0
  25. {labtasker-0.2.0 → labtasker-0.2.1}/demo/advanced/event_system/submit.sh +0 -0
  26. {labtasker-0.2.0 → labtasker-0.2.1}/demo/basic/bash_demo/job_main.py +0 -0
  27. {labtasker-0.2.0 → labtasker-0.2.1}/demo/basic/bash_demo/run_job.sh +0 -0
  28. {labtasker-0.2.0 → labtasker-0.2.1}/demo/basic/bash_demo/submit_job.sh +0 -0
  29. {labtasker-0.2.0 → labtasker-0.2.1}/demo/basic/python_demo/run_job.py +0 -0
  30. {labtasker-0.2.0 → labtasker-0.2.1}/demo/basic/python_demo/submit_job.py +0 -0
  31. {labtasker-0.2.0 → labtasker-0.2.1}/docker/mongodb/init.d/init-keyfile.sh +0 -0
  32. {labtasker-0.2.0 → labtasker-0.2.1}/docker/mongodb/post-init.d/init-mongo.sh +0 -0
  33. {labtasker-0.2.0 → labtasker-0.2.1}/docker-compose.yml +0 -0
  34. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/__main__.py +0 -0
  35. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/api_models.py +0 -0
  36. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/__init__.py +0 -0
  37. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/cli/__init__.py +0 -0
  38. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/cli/cli.py +0 -0
  39. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/cli/config.py +0 -0
  40. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/cli/event.py +0 -0
  41. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/cli/loop.py +0 -0
  42. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/cli/queue.py +0 -0
  43. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/cli/task.py +0 -0
  44. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/cli/worker.py +0 -0
  45. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/client_api.py +0 -0
  46. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/__init__.py +0 -0
  47. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/api.py +0 -0
  48. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/cli_utils.py +0 -0
  49. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/cmd_parser/LabCmd.g4 +0 -0
  50. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/cmd_parser/LabCmdLexer.g4 +0 -0
  51. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/cmd_parser/__init__.py +0 -0
  52. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/cmd_parser/generated/LabCmd.py +0 -0
  53. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/cmd_parser/generated/LabCmdLexer.py +0 -0
  54. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/cmd_parser/generated/LabCmdListener.py +0 -0
  55. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/cmd_parser/generated/__init__.py +0 -0
  56. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/cmd_parser/parser.py +0 -0
  57. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/config.py +0 -0
  58. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/context.py +0 -0
  59. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/events.py +0 -0
  60. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/exceptions.py +0 -0
  61. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/heartbeat.py +0 -0
  62. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/job_runner.py +0 -0
  63. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/paths.py +0 -0
  64. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/plugin_utils.py +0 -0
  65. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/query_transpiler.py +0 -0
  66. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/resolver/__init__.py +0 -0
  67. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/resolver/models.py +0 -0
  68. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/resolver/utils.py +0 -0
  69. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/utils.py +0 -0
  70. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/core/version_checker.py +0 -0
  71. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/templates/labtasker_root/.gitignore +0 -0
  72. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/templates/labtasker_root/client.toml +0 -0
  73. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/client/templates/labtasker_root/logs/.gitkeep +0 -0
  74. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/constants.py +0 -0
  75. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/filtering.py +0 -0
  76. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/security.py +0 -0
  77. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/server/__init__.py +0 -0
  78. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/server/config.py +0 -0
  79. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/server/database.py +0 -0
  80. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/server/db_utils.py +0 -0
  81. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/server/dependencies.py +0 -0
  82. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/server/endpoints.py +0 -0
  83. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/server/event_manager.py +0 -0
  84. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/server/fsm.py +0 -0
  85. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/server/logging.py +0 -0
  86. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/server/run.py +0 -0
  87. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker/utils.py +0 -0
  88. {labtasker-0.2.0 → labtasker-0.2.1}/labtasker.egg-info/SOURCES.txt +0 -0
  89. {labtasker-0.2.0 → labtasker-0.2.1}/script_tests/test_ban_datetime_now/allowed.py +0 -0
  90. {labtasker-0.2.0 → labtasker-0.2.1}/script_tests/test_ban_datetime_now/disallowed.py +0 -0
  91. {labtasker-0.2.0 → labtasker-0.2.1}/script_tests/test_ban_datetime_now/test_ban.py +0 -0
  92. {labtasker-0.2.0 → labtasker-0.2.1}/scripts/check_version.py +0 -0
  93. {labtasker-0.2.0 → labtasker-0.2.1}/scripts/datetime_now_checker.py +0 -0
  94. {labtasker-0.2.0 → labtasker-0.2.1}/server.example.env +0 -0
  95. {labtasker-0.2.0 → labtasker-0.2.1}/setup.cfg +0 -0
  96. {labtasker-0.2.0 → labtasker-0.2.1}/tests/__init__.py +0 -0
  97. {labtasker-0.2.0 → labtasker-0.2.1}/tests/conftest.py +0 -0
  98. {labtasker-0.2.0 → labtasker-0.2.1}/tests/demo_pager_iterator.py +0 -0
  99. {labtasker-0.2.0 → labtasker-0.2.1}/tests/dummy_jobs/job_1.py +0 -0
  100. {labtasker-0.2.0 → labtasker-0.2.1}/tests/fixtures/__init__.py +0 -0
  101. {labtasker-0.2.0 → labtasker-0.2.1}/tests/fixtures/database/__init__.py +0 -0
  102. {labtasker-0.2.0 → labtasker-0.2.1}/tests/fixtures/database/mock.py +0 -0
  103. {labtasker-0.2.0 → labtasker-0.2.1}/tests/fixtures/database/real.py +0 -0
  104. {labtasker-0.2.0 → labtasker-0.2.1}/tests/fixtures/logging.py +0 -0
  105. {labtasker-0.2.0 → labtasker-0.2.1}/tests/fixtures/mock_datetime_now.py +0 -0
  106. {labtasker-0.2.0 → labtasker-0.2.1}/tests/fixtures/server/__init__.py +0 -0
  107. {labtasker-0.2.0 → labtasker-0.2.1}/tests/fixtures/server/async_app.py +0 -0
  108. {labtasker-0.2.0 → labtasker-0.2.1}/tests/fixtures/server/sync_app.py +0 -0
  109. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_api_models.py +0 -0
  110. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/__init__.py +0 -0
  111. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/conftest.py +0 -0
  112. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_cli/__init__.py +0 -0
  113. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_cli/conftest.py +0 -0
  114. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_cli/test_basic.py +0 -0
  115. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_cli/test_config.py +0 -0
  116. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_cli/test_event.py +0 -0
  117. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_cli/test_loop.py +0 -0
  118. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_cli/test_queue.py +0 -0
  119. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_cli/test_task.py +0 -0
  120. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_cli/test_worker.py +0 -0
  121. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/__init__.py +0 -0
  122. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_cli_utils.py +0 -0
  123. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_event/__init__.py +0 -0
  124. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_event/test_concurrency_job_flow_event.py +0 -0
  125. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_event/test_event_listener_basic.py +0 -0
  126. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_event/test_various_actions.py +0 -0
  127. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_event/utils.py +0 -0
  128. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_heartbeat.py +0 -0
  129. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_job_runner.py +0 -0
  130. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_logging.py +0 -0
  131. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_loop_internal_error_handler.py +0 -0
  132. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_pager_iterator.py +0 -0
  133. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_parser.py +0 -0
  134. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_query_transpiler/__init__.py +0 -0
  135. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_query_transpiler/conftest.py +0 -0
  136. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_query_transpiler/test_behavior.py +0 -0
  137. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_query_transpiler/test_matching.py +0 -0
  138. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_query_transpiler/test_utils.py +0 -0
  139. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_query_transpiler/utils.py +0 -0
  140. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_resolver.py +0 -0
  141. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_runner_concurrency/__init__.py +0 -0
  142. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_runner_concurrency/run_concurrent.py +0 -0
  143. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_runner_concurrency/test_runner_concurrency_success_failure.py +0 -0
  144. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_runner_concurrency/test_runner_high_concurrency.py +0 -0
  145. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_runner_timeout/__init__.py +0 -0
  146. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_runner_timeout/conftest.py +0 -0
  147. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_runner_timeout/test_job_runner_timeout.py +0 -0
  148. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_runner_timeout/test_job_runner_with_resolver_timeout.py +0 -0
  149. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_runner_with_resolver.py +0 -0
  150. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_server_notification_and_client_version.py +0 -0
  151. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_client/test_core/test_version_checker.py +0 -0
  152. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_filtering/__init__.py +0 -0
  153. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_filtering/exception_utils.py +0 -0
  154. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_filtering/test_exception_filtering.py +0 -0
  155. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_mock_time.py +0 -0
  156. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_security.py +0 -0
  157. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/__init__.py +0 -0
  158. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/conftest.py +0 -0
  159. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_database/__init__.py +0 -0
  160. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_database/conftest.py +0 -0
  161. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_database/test_database_basic.py +0 -0
  162. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_database/test_fetch_extra_filter.py +0 -0
  163. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_database/test_query_dict_to_mongo_filter.py +0 -0
  164. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_database/test_required_field_fetching.py +0 -0
  165. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_db_utils/__init__.py +0 -0
  166. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_db_utils/test_arg_match.py +0 -0
  167. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_db_utils/test_keys_to_query_dict.py +0 -0
  168. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_db_utils/test_keys_to_query_dict_deepest.py +0 -0
  169. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_db_utils/test_keys_to_query_dict_topmost.py +0 -0
  170. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_endpoint/__init__.py +0 -0
  171. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_endpoint/test_event_basic.py +0 -0
  172. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_endpoint/test_server.py +0 -0
  173. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_endpoint/test_server_async.py +0 -0
  174. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_endpoint/test_server_async_ping.py +0 -0
  175. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_fsm.py +0 -0
  176. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_server/test_get_verified_queue_dependency.py +0 -0
  177. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_utils/__init__.py +0 -0
  178. {labtasker-0.2.0 → labtasker-0.2.1}/tests/test_utils/test_utils.py +0 -0
  179. {labtasker-0.2.0 → labtasker-0.2.1}/tests/utils.py +0 -0
  180. {labtasker-0.2.0 → labtasker-0.2.1}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: labtasker
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: A task queue system for lab experiments
5
5
  Author-email: Your Name <your.email@example.com>
6
6
  License: Apache License 2.0
@@ -1,4 +1,4 @@
1
- __version__ = "0.2.0"
1
+ __version__ = "0.2.1"
2
2
 
3
3
  from labtasker.client.client_api import *
4
4
  from labtasker.client.core.config import get_client_config
@@ -2,6 +2,7 @@ import contextlib
2
2
  import contextvars
3
3
  import io
4
4
  import os
5
+ import re
5
6
  import sys
6
7
  import threading
7
8
  import warnings
@@ -189,6 +190,100 @@ class TeeStream(io.TextIOBase):
189
190
  return getattr(self.original_stream, name)
190
191
 
191
192
 
193
+ class AnsiFilterStream(io.TextIOBase):
194
+ """Filter stream that removes ANSI escape sequences"""
195
+
196
+ def __init__(self, stream):
197
+ self.stream = stream
198
+ self.ansi_escape = re.compile(r"\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])")
199
+
200
+ def write(self, text):
201
+ cleaned = self.ansi_escape.sub("", text)
202
+ return self.stream.write(cleaned)
203
+
204
+ def flush(self):
205
+ return self.stream.flush()
206
+
207
+ # Standard file methods proxied to original stream
208
+ def close(self) -> None:
209
+ return self.stream.close()
210
+
211
+ def fileno(self) -> int:
212
+ return self.stream.fileno()
213
+
214
+ def isatty(self) -> bool:
215
+ return self.stream.isatty()
216
+
217
+ def readable(self) -> bool:
218
+ return self.stream.readable()
219
+
220
+ def read(self, size: int = -1) -> str: # type: ignore[override]
221
+ return self.stream.read(size)
222
+
223
+ def readlines(self, hint: int = -1) -> List[str]: # type: ignore[override]
224
+ return self.stream.readlines(hint)
225
+
226
+ def seek(self, offset: int, whence: int = 0) -> int:
227
+ return self.stream.seek(offset, whence)
228
+
229
+ def seekable(self) -> bool:
230
+ return self.stream.seekable()
231
+
232
+ def tell(self) -> int:
233
+ return self.stream.tell()
234
+
235
+ def truncate(self, size: Optional[int] = None) -> int:
236
+ if size is None:
237
+ return self.stream.truncate()
238
+ return self.stream.truncate(size)
239
+
240
+ def writable(self) -> bool:
241
+ return self.stream.writable()
242
+
243
+ def writelines(self, lines: Iterable[str]) -> None: # type: ignore[override]
244
+ # First write to original stream
245
+ self.stream.writelines(lines)
246
+
247
+ def readline(self, size: Optional[int] = -1) -> str: # type: ignore[override]
248
+ return self.stream.readline(size)
249
+
250
+ def __del__(self) -> None:
251
+ self.stream.close()
252
+
253
+ @property
254
+ def closed(self) -> bool: # type: ignore[override]
255
+ return self.stream.closed
256
+
257
+ def _checkClosed(self) -> None:
258
+ if self.closed:
259
+ raise ValueError("I/O operation on closed file")
260
+
261
+ # Additional TextIOBase attributes that may be needed
262
+ @property
263
+ def encoding(self) -> str: # type: ignore[override]
264
+ return getattr(self.stream, "encoding", None) # type: ignore[return-value]
265
+
266
+ @property
267
+ def errors(self) -> Optional[str]: # type: ignore[override]
268
+ return getattr(self.stream, "errors", None)
269
+
270
+ @property
271
+ def newlines(self) -> Optional[Union[str, tuple]]: # type: ignore[override]
272
+ return getattr(self.stream, "newlines", None)
273
+
274
+ @property
275
+ def buffer(self): # type: ignore[override]
276
+ return getattr(self.stream, "buffer", None)
277
+
278
+ @property
279
+ def line_buffering(self) -> bool: # type: ignore[override]
280
+ return getattr(self.stream, "line_buffering", False)
281
+
282
+ # Forward other methods/properties to wrapped stream
283
+ def __getattr__(self, name):
284
+ return getattr(self.stream, name)
285
+
286
+
192
287
  def reset_logger(reset_all: bool = False, debug: bool = False):
193
288
  """
194
289
  Reset logger configuration.
@@ -274,6 +369,8 @@ def log_to_file(
274
369
 
275
370
  # Open log file
276
371
  log_file = open(file_path, "a", encoding="utf-8")
372
+ if not log_file.isatty():
373
+ log_file = AnsiFilterStream(log_file) # type: ignore[assignment]
277
374
 
278
375
  # Add file to appropriate output streams
279
376
  stdout_token = None
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "labtasker"
7
- version = "0.2.0"
7
+ version = "0.2.1"
8
8
  description = "A task queue system for lab experiments"
9
9
  authors = [{ name = "Your Name", email = "your.email@example.com" }]
10
10
  license = { text = "Apache License 2.0" }
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
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
File without changes
File without changes
File without changes