labtasker 0.2.2__tar.gz → 0.2.3__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 (188) hide show
  1. {labtasker-0.2.2 → labtasker-0.2.3}/.gitignore +2 -0
  2. {labtasker-0.2.2 → labtasker-0.2.3}/Dockerfile +5 -2
  3. {labtasker-0.2.2 → labtasker-0.2.3}/MANIFEST.in +2 -0
  4. {labtasker-0.2.2 → labtasker-0.2.3}/PKG-INFO +13 -5
  5. {labtasker-0.2.2 → labtasker-0.2.3}/README.md +9 -2
  6. {labtasker-0.2.2 → labtasker-0.2.3}/docker-compose.yml +2 -2
  7. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/__init__.py +1 -1
  8. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/init.py +5 -2
  9. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/templates/labtasker_root/client.toml +1 -1
  10. labtasker-0.2.3/labtasker/server/cli.py +90 -0
  11. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/config.py +4 -3
  12. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/database.py +12 -7
  13. labtasker-0.2.3/labtasker/server/embedded_db.py +420 -0
  14. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker.egg-info/SOURCES.txt +3 -1
  15. {labtasker-0.2.2 → labtasker-0.2.3}/pyproject.toml +6 -4
  16. {labtasker-0.2.2 → labtasker-0.2.3}/server.example.env +1 -1
  17. {labtasker-0.2.2 → labtasker-0.2.3}/tests/conftest.py +1 -1
  18. labtasker-0.2.3/tests/fixtures/database/__init__.py +4 -0
  19. labtasker-0.2.3/tests/fixtures/database/mock.py +19 -0
  20. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_init.py +1 -1
  21. labtasker-0.2.3/tests/test_server/test_embedded_db.py +41 -0
  22. labtasker-0.2.2/labtasker/server/run.py +0 -21
  23. labtasker-0.2.2/tests/fixtures/database/__init__.py +0 -2
  24. labtasker-0.2.2/tests/fixtures/database/mock.py +0 -61
  25. {labtasker-0.2.2 → labtasker-0.2.3}/.coveragerc +0 -0
  26. {labtasker-0.2.2 → labtasker-0.2.3}/.dockerignore +0 -0
  27. {labtasker-0.2.2 → labtasker-0.2.3}/.flake8 +0 -0
  28. {labtasker-0.2.2 → labtasker-0.2.3}/.gitattributes +0 -0
  29. {labtasker-0.2.2 → labtasker-0.2.3}/.gitmodules +0 -0
  30. {labtasker-0.2.2 → labtasker-0.2.3}/.pre-commit-config.yaml +0 -0
  31. {labtasker-0.2.2 → labtasker-0.2.3}/.pytest.ini +0 -0
  32. {labtasker-0.2.2 → labtasker-0.2.3}/.python-version +0 -0
  33. {labtasker-0.2.2 → labtasker-0.2.3}/LICENSE +0 -0
  34. {labtasker-0.2.2 → labtasker-0.2.3}/PRIVACY.md +0 -0
  35. {labtasker-0.2.2 → labtasker-0.2.3}/demo/advanced/custom_resolver/submit_job.py +0 -0
  36. {labtasker-0.2.2 → labtasker-0.2.3}/demo/advanced/custom_resolver/w.py +0 -0
  37. {labtasker-0.2.2 → labtasker-0.2.3}/demo/advanced/custom_resolver/wo.py +0 -0
  38. {labtasker-0.2.2 → labtasker-0.2.3}/demo/advanced/event_system/email_on_task_failure.py +0 -0
  39. {labtasker-0.2.2 → labtasker-0.2.3}/demo/advanced/event_system/send_email.py +0 -0
  40. {labtasker-0.2.2 → labtasker-0.2.3}/demo/advanced/event_system/sim_unstable_job.py +0 -0
  41. {labtasker-0.2.2 → labtasker-0.2.3}/demo/advanced/event_system/submit.sh +0 -0
  42. {labtasker-0.2.2 → labtasker-0.2.3}/demo/basic/bash_demo/job_main.py +0 -0
  43. {labtasker-0.2.2 → labtasker-0.2.3}/demo/basic/bash_demo/run_job.sh +0 -0
  44. {labtasker-0.2.2 → labtasker-0.2.3}/demo/basic/bash_demo/submit_job.sh +0 -0
  45. {labtasker-0.2.2 → labtasker-0.2.3}/demo/basic/python_demo/run_job.py +0 -0
  46. {labtasker-0.2.2 → labtasker-0.2.3}/demo/basic/python_demo/submit_job.py +0 -0
  47. {labtasker-0.2.2 → labtasker-0.2.3}/docker/mongodb/init.d/init-keyfile.sh +0 -0
  48. {labtasker-0.2.2 → labtasker-0.2.3}/docker/mongodb/post-init.d/init-mongo.sh +0 -0
  49. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/__main__.py +0 -0
  50. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/api_models.py +0 -0
  51. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/__init__.py +0 -0
  52. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/__init__.py +0 -0
  53. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/cli.py +0 -0
  54. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/config.py +0 -0
  55. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/event.py +0 -0
  56. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/loop.py +0 -0
  57. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/queue.py +0 -0
  58. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/task.py +0 -0
  59. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/worker.py +0 -0
  60. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/client_api.py +0 -0
  61. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/__init__.py +0 -0
  62. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/api.py +0 -0
  63. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cli_utils.py +0 -0
  64. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/LabCmd.g4 +0 -0
  65. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/LabCmdLexer.g4 +0 -0
  66. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/__init__.py +0 -0
  67. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/generated/LabCmd.py +0 -0
  68. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/generated/LabCmdLexer.py +0 -0
  69. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/generated/LabCmdListener.py +0 -0
  70. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/generated/__init__.py +0 -0
  71. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/parser.py +0 -0
  72. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/config.py +0 -0
  73. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/context.py +0 -0
  74. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/events.py +0 -0
  75. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/exceptions.py +0 -0
  76. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/heartbeat.py +0 -0
  77. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/job_runner.py +0 -0
  78. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/logging.py +0 -0
  79. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/paths.py +0 -0
  80. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/plugin_utils.py +0 -0
  81. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/query_transpiler.py +0 -0
  82. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/resolver/__init__.py +0 -0
  83. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/resolver/models.py +0 -0
  84. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/resolver/utils.py +0 -0
  85. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/utils.py +0 -0
  86. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/version_checker.py +0 -0
  87. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/templates/labtasker_root/.gitignore +0 -0
  88. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/templates/labtasker_root/logs/.gitkeep +0 -0
  89. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/constants.py +0 -0
  90. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/filtering.py +0 -0
  91. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/security.py +0 -0
  92. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/__init__.py +0 -0
  93. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/db_utils.py +0 -0
  94. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/dependencies.py +0 -0
  95. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/endpoints.py +0 -0
  96. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/event_manager.py +0 -0
  97. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/fsm.py +0 -0
  98. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/logging.py +0 -0
  99. {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/utils.py +0 -0
  100. {labtasker-0.2.2 → labtasker-0.2.3}/script_tests/test_ban_datetime_now/allowed.py +0 -0
  101. {labtasker-0.2.2 → labtasker-0.2.3}/script_tests/test_ban_datetime_now/disallowed.py +0 -0
  102. {labtasker-0.2.2 → labtasker-0.2.3}/script_tests/test_ban_datetime_now/test_ban.py +0 -0
  103. {labtasker-0.2.2 → labtasker-0.2.3}/scripts/asciinema_adjust_timestamp.py +0 -0
  104. {labtasker-0.2.2 → labtasker-0.2.3}/scripts/check_version.py +0 -0
  105. {labtasker-0.2.2 → labtasker-0.2.3}/scripts/datetime_now_checker.py +0 -0
  106. {labtasker-0.2.2 → labtasker-0.2.3}/setup.cfg +0 -0
  107. {labtasker-0.2.2 → labtasker-0.2.3}/tests/__init__.py +0 -0
  108. {labtasker-0.2.2 → labtasker-0.2.3}/tests/demo_pager_iterator.py +0 -0
  109. {labtasker-0.2.2 → labtasker-0.2.3}/tests/dummy_jobs/job_1.py +0 -0
  110. {labtasker-0.2.2 → labtasker-0.2.3}/tests/fixtures/__init__.py +0 -0
  111. {labtasker-0.2.2 → labtasker-0.2.3}/tests/fixtures/database/real.py +0 -0
  112. {labtasker-0.2.2 → labtasker-0.2.3}/tests/fixtures/logging.py +0 -0
  113. {labtasker-0.2.2 → labtasker-0.2.3}/tests/fixtures/mock_datetime_now.py +0 -0
  114. {labtasker-0.2.2 → labtasker-0.2.3}/tests/fixtures/server/__init__.py +0 -0
  115. {labtasker-0.2.2 → labtasker-0.2.3}/tests/fixtures/server/async_app.py +0 -0
  116. {labtasker-0.2.2 → labtasker-0.2.3}/tests/fixtures/server/sync_app.py +0 -0
  117. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_api_models.py +0 -0
  118. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/__init__.py +0 -0
  119. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/conftest.py +0 -0
  120. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/__init__.py +0 -0
  121. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/conftest.py +0 -0
  122. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_basic.py +0 -0
  123. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_config.py +0 -0
  124. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_event.py +0 -0
  125. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_loop.py +0 -0
  126. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_queue.py +0 -0
  127. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_task.py +0 -0
  128. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_worker.py +0 -0
  129. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/__init__.py +0 -0
  130. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_cli_utils.py +0 -0
  131. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_event/__init__.py +0 -0
  132. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_event/test_concurrency_job_flow_event.py +0 -0
  133. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_event/test_event_listener_basic.py +0 -0
  134. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_event/test_various_actions.py +0 -0
  135. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_event/utils.py +0 -0
  136. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_heartbeat.py +0 -0
  137. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_job_runner.py +0 -0
  138. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_logging.py +0 -0
  139. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_loop_internal_error_handler.py +0 -0
  140. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_pager_iterator.py +0 -0
  141. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_parser.py +0 -0
  142. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_query_transpiler/__init__.py +0 -0
  143. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_query_transpiler/conftest.py +0 -0
  144. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_query_transpiler/test_behavior.py +0 -0
  145. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_query_transpiler/test_matching.py +0 -0
  146. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_query_transpiler/test_utils.py +0 -0
  147. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_query_transpiler/utils.py +0 -0
  148. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_resolver.py +0 -0
  149. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_concurrency/__init__.py +0 -0
  150. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_concurrency/run_concurrent.py +0 -0
  151. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_concurrency/test_runner_concurrency_success_failure.py +0 -0
  152. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_concurrency/test_runner_high_concurrency.py +0 -0
  153. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_timeout/__init__.py +0 -0
  154. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_timeout/conftest.py +0 -0
  155. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_timeout/test_job_runner_timeout.py +0 -0
  156. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_timeout/test_job_runner_with_resolver_timeout.py +0 -0
  157. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_with_resolver.py +0 -0
  158. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_server_notification_and_client_version.py +0 -0
  159. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_version_checker.py +0 -0
  160. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_filtering/__init__.py +0 -0
  161. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_filtering/exception_utils.py +0 -0
  162. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_filtering/test_exception_filtering.py +0 -0
  163. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_mock_time.py +0 -0
  164. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_security.py +0 -0
  165. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/__init__.py +0 -0
  166. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/conftest.py +0 -0
  167. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_database/__init__.py +0 -0
  168. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_database/conftest.py +0 -0
  169. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_database/test_database_basic.py +0 -0
  170. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_database/test_fetch_extra_filter.py +0 -0
  171. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_database/test_query_dict_to_mongo_filter.py +0 -0
  172. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_database/test_required_field_fetching.py +0 -0
  173. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_db_utils/__init__.py +0 -0
  174. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_db_utils/test_arg_match.py +0 -0
  175. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_db_utils/test_keys_to_query_dict.py +0 -0
  176. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_db_utils/test_keys_to_query_dict_deepest.py +0 -0
  177. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_db_utils/test_keys_to_query_dict_topmost.py +0 -0
  178. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_endpoint/__init__.py +0 -0
  179. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_endpoint/test_event_basic.py +0 -0
  180. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_endpoint/test_server.py +0 -0
  181. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_endpoint/test_server_async.py +0 -0
  182. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_endpoint/test_server_async_ping.py +0 -0
  183. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_fsm.py +0 -0
  184. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_get_verified_queue_dependency.py +0 -0
  185. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_utils/__init__.py +0 -0
  186. {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_utils/test_utils.py +0 -0
  187. {labtasker-0.2.2 → labtasker-0.2.3}/tests/utils.py +0 -0
  188. {labtasker-0.2.2 → labtasker-0.2.3}/tox.ini +0 -0
@@ -1,3 +1,5 @@
1
+ labtasker_db.json
2
+
1
3
  # Created by https://www.toptal.com/developers/gitignore/api/python
2
4
  # Edit at https://www.toptal.com/developers/gitignore?templates=python
3
5
 
@@ -16,7 +16,10 @@ RUN pip install --no-cache-dir "."
16
16
 
17
17
  # Health check
18
18
  HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
19
- CMD curl -f http://localhost:${API_PORT:-8080}/health || exit 1
19
+ CMD curl -f http://localhost:${API_PORT:-9321}/health || exit 1
20
+
21
+ # Set DB_MODE to external
22
+ ENV DB_MODE=${DB_MODE:-external}
20
23
 
21
24
  # Run the application
22
- CMD ["python", "-m", "labtasker.server.run"]
25
+ CMD ["labtasker-server", "serve"]
@@ -19,6 +19,8 @@ exclude coverage.xml
19
19
  exclude poetry.lock
20
20
  exclude poetry.toml
21
21
 
22
+ exclude labtasker_db.json
23
+
22
24
  prune .vscode
23
25
  prune .github
24
26
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: labtasker
3
- Version: 0.2.2
3
+ Version: 0.2.3
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
@@ -40,11 +40,11 @@ Requires-Dist: sse-starlette<3.0.0,>=2.1.3
40
40
  Requires-Dist: httpx-sse<0.5.0,>=0.4.0
41
41
  Requires-Dist: stamina<26.0.0,>=25.1.0
42
42
  Requires-Dist: noneprompt<0.2.0,>=0.1.9
43
- Requires-Dist: pytest-sugar<2.0.0,>=1.0.0
43
+ Requires-Dist: mongomock<4.4.0,>=4.3.0
44
+ Requires-Dist: jsonpickle<5.0.0,>=4.0.2
44
45
  Provides-Extra: dev
45
46
  Requires-Dist: pytest<9.0.0,>=8.0.0; extra == "dev"
46
47
  Requires-Dist: pytest-cov<7.0.0,>=5.0.0; extra == "dev"
47
- Requires-Dist: mongomock<4.4.0,>=4.3.0; extra == "dev"
48
48
  Requires-Dist: black<26.0.0,>=24.0.0; extra == "dev"
49
49
  Requires-Dist: isort<7.0.0,>=5.13.0; extra == "dev"
50
50
  Requires-Dist: mypy<2.0.0,>=1.14.0; extra == "dev"
@@ -56,6 +56,7 @@ Requires-Dist: pytest-asyncio<0.26.0,>=0.24.0; extra == "dev"
56
56
  Requires-Dist: asgi-lifespan<3.0.0,>=2.1.0; extra == "dev"
57
57
  Requires-Dist: tox<4.25.0,>=4.24.0; extra == "dev"
58
58
  Requires-Dist: pytest-dependency<0.7.0,>=0.6.0; extra == "dev"
59
+ Requires-Dist: pytest-sugar<2.0.0,>=1.0.0; extra == "dev"
59
60
  Provides-Extra: doc
60
61
  Requires-Dist: mkdocs-material<9.7.0,>=9.6.5; extra == "doc"
61
62
  Requires-Dist: mkdocs-glightbox<0.5.0,>=0.4.0; extra == "doc"
@@ -66,7 +67,7 @@ Dynamic: license-file
66
67
 
67
68
  <p align="center"><em>Make your ML experiment wrapper scripts smarter with...</em></p>
68
69
  <h1 align="center" style="font-size: 40px;"> <a href="">Labtasker</a></h1>
69
- <p align="center"><a href="https://fkcptlst.github.io/labtasker/latest/install/install/">Install</a> • <a href="https://fkcptlst.github.io/labtasker/latest/guide/basic/">Tutorial / Demo</a> • <a href="https://fkcptlst.github.io/labtasker/latest/">Documentation</a> • <a href="https://fkcptlst.github.io/labtasker/dev/faq/">FAQs</a> • <a href="https://github.com/fkcptlst/labtasker/releases">Releases</a></p>
70
+ <p align="center"><a href="https://fkcptlst.github.io/labtasker/latest/install/install/">Install</a> • <a href="https://fkcptlst.github.io/labtasker/latest/guide/basic/">Tutorial / Demo</a> • <a href="https://fkcptlst.github.io/labtasker/latest/">Documentation</a> • <a href="https://fkcptlst.github.io/labtasker/latest/faq/">FAQs</a> • <a href="https://github.com/fkcptlst/labtasker/releases">Releases</a></p>
70
71
 
71
72
  <p align="center">
72
73
  <img src="https://github.com/fkcptlst/labtasker/actions/workflows/unit-test-matrix.yml/badge.svg" alt="unit-test-matrix" />
@@ -122,9 +123,10 @@ For more detailed steps, please refer to the content in the [Tutorial / Demo](ht
122
123
 
123
124
  > [!NOTE]
124
125
  > You need a running Labtasker server to use the client tools.
126
+ > Simply use the installed Python CLI `labtasker-server serve` or use docker-compose to deploy the server.
125
127
  > See [deployment instructions](https://fkcptlst.github.io/labtasker/latest/install/deployment/).
126
128
 
127
- ### 1. Install Client Tools via PyPI
129
+ ### 1. Install via PyPI
128
130
 
129
131
  ```bash
130
132
  pip install labtasker
@@ -138,6 +140,12 @@ pip install git+https://github.com/fkcptlst/labtasker.git
138
140
 
139
141
  ## 🚀 Quick Start
140
142
 
143
+ Use the following command to launch a labtasker server in the background:
144
+
145
+ ```bash
146
+ labtasker-server serve &
147
+ ```
148
+
141
149
  Use the following command to quickly setup a labtasker queue for your project:
142
150
 
143
151
  ```bash
@@ -1,6 +1,6 @@
1
1
  <p align="center"><em>Make your ML experiment wrapper scripts smarter with...</em></p>
2
2
  <h1 align="center" style="font-size: 40px;"> <a href="">Labtasker</a></h1>
3
- <p align="center"><a href="https://fkcptlst.github.io/labtasker/latest/install/install/">Install</a> • <a href="https://fkcptlst.github.io/labtasker/latest/guide/basic/">Tutorial / Demo</a> • <a href="https://fkcptlst.github.io/labtasker/latest/">Documentation</a> • <a href="https://fkcptlst.github.io/labtasker/dev/faq/">FAQs</a> • <a href="https://github.com/fkcptlst/labtasker/releases">Releases</a></p>
3
+ <p align="center"><a href="https://fkcptlst.github.io/labtasker/latest/install/install/">Install</a> • <a href="https://fkcptlst.github.io/labtasker/latest/guide/basic/">Tutorial / Demo</a> • <a href="https://fkcptlst.github.io/labtasker/latest/">Documentation</a> • <a href="https://fkcptlst.github.io/labtasker/latest/faq/">FAQs</a> • <a href="https://github.com/fkcptlst/labtasker/releases">Releases</a></p>
4
4
 
5
5
  <p align="center">
6
6
  <img src="https://github.com/fkcptlst/labtasker/actions/workflows/unit-test-matrix.yml/badge.svg" alt="unit-test-matrix" />
@@ -56,9 +56,10 @@ For more detailed steps, please refer to the content in the [Tutorial / Demo](ht
56
56
 
57
57
  > [!NOTE]
58
58
  > You need a running Labtasker server to use the client tools.
59
+ > Simply use the installed Python CLI `labtasker-server serve` or use docker-compose to deploy the server.
59
60
  > See [deployment instructions](https://fkcptlst.github.io/labtasker/latest/install/deployment/).
60
61
 
61
- ### 1. Install Client Tools via PyPI
62
+ ### 1. Install via PyPI
62
63
 
63
64
  ```bash
64
65
  pip install labtasker
@@ -72,6 +73,12 @@ pip install git+https://github.com/fkcptlst/labtasker.git
72
73
 
73
74
  ## 🚀 Quick Start
74
75
 
76
+ Use the following command to launch a labtasker server in the background:
77
+
78
+ ```bash
79
+ labtasker-server serve &
80
+ ```
81
+
75
82
  Use the following command to quickly setup a labtasker queue for your project:
76
83
 
77
84
  ```bash
@@ -67,10 +67,10 @@ services:
67
67
  - DB_HOST=mongodb
68
68
  - DB_PORT=${DB_PORT:-27017}
69
69
  - API_HOST=${API_HOST:-0.0.0.0}
70
- - API_PORT=${API_PORT:-8080}
70
+ - API_PORT=${API_PORT:-9321}
71
71
  - PERIODIC_TASK_INTERVAL=${PERIODIC_TASK_INTERVAL:-30}
72
72
  ports:
73
- - "${API_PORT:-8080}:${API_PORT:-8080}"
73
+ - "${API_PORT:-9321}:${API_PORT:-9321}"
74
74
  depends_on:
75
75
  mongodb:
76
76
  condition: service_healthy
@@ -1,4 +1,4 @@
1
- __version__ = "0.2.2"
1
+ __version__ = "0.2.3"
2
2
 
3
3
  from labtasker.client.client_api import *
4
4
  from labtasker.client.core.config import get_client_config
@@ -83,7 +83,8 @@ def setup_endpoint_url() -> Tuple[str, bool]:
83
83
 
84
84
  # 1. Prompt
85
85
  url = InputPrompt(
86
- "URL of your Labtasker server (http://host:port or https://xxx.yyy): ",
86
+ "URL of your Labtasker server: ",
87
+ default_text="http://localhost:9321",
87
88
  validator=validator,
88
89
  ).prompt()
89
90
  url = str(HttpUrl(url))
@@ -186,7 +187,9 @@ def setup_queue(base_url, base_url_verified) -> Tuple[str, str]:
186
187
  except LabtaskerHTTPStatusError:
187
188
  pass
188
189
 
189
- yes = ConfirmPrompt(question="Would you like to create this queue?").prompt()
190
+ yes = ConfirmPrompt(
191
+ question="Would you like to create this queue?", default_choice=True
192
+ ).prompt()
190
193
  if yes:
191
194
  try:
192
195
  resp = create_queue(queue_name, password, client=client)
@@ -5,7 +5,7 @@ enable_traceback_filter = true # prettify the traceback and filter sensitive co
5
5
  version_check = true # check if current version is obsolete or new version is available (non-blocking, best effort)
6
6
 
7
7
  [endpoint]
8
- api_base_url = "http://localhost:8080/" # change this to your server url
8
+ api_base_url = "http://localhost:9321/" # change this to your server url
9
9
 
10
10
  [queue]
11
11
  queue_name = "test-queue" # change this
@@ -0,0 +1,90 @@
1
+ import os
2
+ from enum import Enum
3
+ from pathlib import Path
4
+ from typing import Optional
5
+
6
+ import typer
7
+ import uvicorn
8
+
9
+ from labtasker.filtering import install_traceback_filter
10
+ from labtasker.server.config import get_server_config, init_server_config
11
+ from labtasker.server.database import DBService, set_db_service
12
+ from labtasker.server.embedded_db import MongoClient, ServerStore
13
+ from labtasker.server.logging import log_config
14
+
15
+ install_traceback_filter()
16
+
17
+ cli = typer.Typer(context_settings={"help_option_names": ["-h", "--help"]})
18
+
19
+
20
+ class DbMode(str, Enum):
21
+ EMBEDDED = "embedded"
22
+ EXTERNAL = "external"
23
+
24
+
25
+ @cli.callback(invoke_without_command=True)
26
+ def callback(ctx: typer.Context):
27
+ if not ctx.invoked_subcommand:
28
+ print(ctx.get_help())
29
+ raise typer.Exit()
30
+
31
+
32
+ @cli.command()
33
+ def serve(
34
+ host: str = typer.Option(
35
+ "0.0.0.0", envvar="API_HOST", help="IP address of the server."
36
+ ),
37
+ port: int = typer.Option(9321, envvar="API_PORT", help="Port to listen to."),
38
+ db_mode: DbMode = typer.Option(
39
+ "embedded", case_sensitive=False, envvar="DB_MODE", help="Database mode."
40
+ ),
41
+ db_path: Path = typer.Option(
42
+ Path("labtasker_db.json"),
43
+ writable=True,
44
+ readable=True,
45
+ help="Path to the database persistence file.",
46
+ ),
47
+ env_file: Optional[Path] = typer.Option(
48
+ None,
49
+ help="Path to the server.env file to load.",
50
+ ),
51
+ ):
52
+ """Create a local server with a Python emulated MongoDB.
53
+ (It is recommended to use the docker compose instead of this.)
54
+ """
55
+ if db_mode == "embedded":
56
+ # authentication is not needed, as we are using Python emulated embedded DB
57
+ os.environ["DB_USER"] = "admin"
58
+ os.environ["DB_PASSWORD"] = "admin"
59
+
60
+ os.environ["API_HOST"] = host
61
+ os.environ["API_PORT"] = str(port)
62
+
63
+ init_server_config(env_file)
64
+ config = get_server_config()
65
+
66
+ if db_mode == "embedded":
67
+ set_db_service(
68
+ DBService(
69
+ db_name=config.db_name,
70
+ client=MongoClient(
71
+ _store=ServerStore(persistence_path=str(db_path)),
72
+ ),
73
+ )
74
+ )
75
+ else:
76
+ set_db_service(DBService(db_name=config.db_name, uri=config.mongodb_uri))
77
+
78
+ # import after set_db_service
79
+ from labtasker.server.endpoints import app
80
+
81
+ uvicorn.run(app, host=config.api_host, port=config.api_port, log_config=log_config)
82
+
83
+
84
+ def main():
85
+ # Use this to invoke command to prevent typer overriding exception hook
86
+ return typer.main.get_command(cli).main()
87
+
88
+
89
+ if __name__ == "__main__":
90
+ main()
@@ -1,4 +1,5 @@
1
- from typing import Optional
1
+ from pathlib import Path
2
+ from typing import Optional, Union
2
3
 
3
4
  from pydantic import field_validator
4
5
  from pydantic_settings import BaseSettings, SettingsConfigDict
@@ -14,7 +15,7 @@ class ServerConfig(BaseSettings):
14
15
 
15
16
  # API settings
16
17
  api_host: str = "0.0.0.0"
17
- api_port: int = 8080
18
+ api_port: int = 9321
18
19
 
19
20
  # Other settings
20
21
  periodic_task_interval: float = 30.0
@@ -48,7 +49,7 @@ class ServerConfig(BaseSettings):
48
49
  _config: Optional[ServerConfig] = None
49
50
 
50
51
 
51
- def init_server_config(env_file: Optional[str] = None):
52
+ def init_server_config(env_file: Optional[Union[Path, str]] = None):
52
53
  global _config
53
54
  if _config is not None:
54
55
  raise RuntimeError("ServerConfig already initialized.")
@@ -16,7 +16,6 @@ from starlette.status import (
16
16
 
17
17
  from labtasker.constants import Priority
18
18
  from labtasker.security import hash_password
19
- from labtasker.server.config import get_server_config
20
19
  from labtasker.server.db_utils import (
21
20
  arg_match,
22
21
  keys_to_query_dict,
@@ -114,9 +113,11 @@ class DBService:
114
113
 
115
114
  def erase(self):
116
115
  """Erase all data"""
117
- self._queues.delete_many({})
118
- self._tasks.delete_many({})
119
- self._workers.delete_many({})
116
+ for col_name in self._db.list_collection_names():
117
+ collection = self._db[col_name]
118
+ collection.drop()
119
+
120
+ self._setup_collections()
120
121
 
121
122
  @property
122
123
  def projection(self):
@@ -1145,7 +1146,11 @@ _db_service = None
1145
1146
  def get_db() -> DBService:
1146
1147
  """Get database service instance."""
1147
1148
  global _db_service
1148
- config = get_server_config()
1149
1149
  if not _db_service:
1150
- _db_service = DBService(db_name=config.db_name, uri=config.mongodb_uri)
1151
- return _db_service
1150
+ raise RuntimeError("Database service not initialized.")
1151
+ return _db_service # type: ignore
1152
+
1153
+
1154
+ def set_db_service(db_service: DBService):
1155
+ global _db_service
1156
+ _db_service = db_service