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.
- {labtasker-0.2.2 → labtasker-0.2.3}/.gitignore +2 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/Dockerfile +5 -2
- {labtasker-0.2.2 → labtasker-0.2.3}/MANIFEST.in +2 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/PKG-INFO +13 -5
- {labtasker-0.2.2 → labtasker-0.2.3}/README.md +9 -2
- {labtasker-0.2.2 → labtasker-0.2.3}/docker-compose.yml +2 -2
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/__init__.py +1 -1
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/init.py +5 -2
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/templates/labtasker_root/client.toml +1 -1
- labtasker-0.2.3/labtasker/server/cli.py +90 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/config.py +4 -3
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/database.py +12 -7
- labtasker-0.2.3/labtasker/server/embedded_db.py +420 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker.egg-info/SOURCES.txt +3 -1
- {labtasker-0.2.2 → labtasker-0.2.3}/pyproject.toml +6 -4
- {labtasker-0.2.2 → labtasker-0.2.3}/server.example.env +1 -1
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/conftest.py +1 -1
- labtasker-0.2.3/tests/fixtures/database/__init__.py +4 -0
- labtasker-0.2.3/tests/fixtures/database/mock.py +19 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_init.py +1 -1
- labtasker-0.2.3/tests/test_server/test_embedded_db.py +41 -0
- labtasker-0.2.2/labtasker/server/run.py +0 -21
- labtasker-0.2.2/tests/fixtures/database/__init__.py +0 -2
- labtasker-0.2.2/tests/fixtures/database/mock.py +0 -61
- {labtasker-0.2.2 → labtasker-0.2.3}/.coveragerc +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/.dockerignore +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/.flake8 +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/.gitattributes +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/.gitmodules +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/.pre-commit-config.yaml +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/.pytest.ini +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/.python-version +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/LICENSE +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/PRIVACY.md +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/demo/advanced/custom_resolver/submit_job.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/demo/advanced/custom_resolver/w.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/demo/advanced/custom_resolver/wo.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/demo/advanced/event_system/email_on_task_failure.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/demo/advanced/event_system/send_email.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/demo/advanced/event_system/sim_unstable_job.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/demo/advanced/event_system/submit.sh +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/demo/basic/bash_demo/job_main.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/demo/basic/bash_demo/run_job.sh +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/demo/basic/bash_demo/submit_job.sh +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/demo/basic/python_demo/run_job.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/demo/basic/python_demo/submit_job.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/docker/mongodb/init.d/init-keyfile.sh +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/docker/mongodb/post-init.d/init-mongo.sh +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/__main__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/api_models.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/cli.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/config.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/event.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/loop.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/queue.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/task.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/cli/worker.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/client_api.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/api.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cli_utils.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/LabCmd.g4 +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/LabCmdLexer.g4 +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/generated/LabCmd.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/generated/LabCmdLexer.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/generated/LabCmdListener.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/generated/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/cmd_parser/parser.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/config.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/context.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/events.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/exceptions.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/heartbeat.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/job_runner.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/logging.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/paths.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/plugin_utils.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/query_transpiler.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/resolver/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/resolver/models.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/resolver/utils.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/utils.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/core/version_checker.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/templates/labtasker_root/.gitignore +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/client/templates/labtasker_root/logs/.gitkeep +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/constants.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/filtering.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/security.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/db_utils.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/dependencies.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/endpoints.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/event_manager.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/fsm.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/server/logging.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/labtasker/utils.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/script_tests/test_ban_datetime_now/allowed.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/script_tests/test_ban_datetime_now/disallowed.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/script_tests/test_ban_datetime_now/test_ban.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/scripts/asciinema_adjust_timestamp.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/scripts/check_version.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/scripts/datetime_now_checker.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/setup.cfg +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/demo_pager_iterator.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/dummy_jobs/job_1.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/fixtures/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/fixtures/database/real.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/fixtures/logging.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/fixtures/mock_datetime_now.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/fixtures/server/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/fixtures/server/async_app.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/fixtures/server/sync_app.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_api_models.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/conftest.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/conftest.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_basic.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_config.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_event.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_loop.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_queue.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_task.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_cli/test_worker.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_cli_utils.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_event/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_event/test_concurrency_job_flow_event.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_event/test_event_listener_basic.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_event/test_various_actions.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_event/utils.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_heartbeat.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_job_runner.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_logging.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_loop_internal_error_handler.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_pager_iterator.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_parser.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_query_transpiler/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_query_transpiler/conftest.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_query_transpiler/test_behavior.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_query_transpiler/test_matching.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_query_transpiler/test_utils.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_query_transpiler/utils.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_resolver.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_concurrency/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_concurrency/run_concurrent.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_concurrency/test_runner_concurrency_success_failure.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_concurrency/test_runner_high_concurrency.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_timeout/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_timeout/conftest.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_timeout/test_job_runner_timeout.py +0 -0
- {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
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_runner_with_resolver.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_server_notification_and_client_version.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_client/test_core/test_version_checker.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_filtering/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_filtering/exception_utils.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_filtering/test_exception_filtering.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_mock_time.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_security.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/conftest.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_database/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_database/conftest.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_database/test_database_basic.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_database/test_fetch_extra_filter.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_database/test_query_dict_to_mongo_filter.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_database/test_required_field_fetching.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_db_utils/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_db_utils/test_arg_match.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_db_utils/test_keys_to_query_dict.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_db_utils/test_keys_to_query_dict_deepest.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_db_utils/test_keys_to_query_dict_topmost.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_endpoint/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_endpoint/test_event_basic.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_endpoint/test_server.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_endpoint/test_server_async.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_endpoint/test_server_async_ping.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_fsm.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_server/test_get_verified_queue_dependency.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_utils/__init__.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/test_utils/test_utils.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tests/utils.py +0 -0
- {labtasker-0.2.2 → labtasker-0.2.3}/tox.ini +0 -0
|
@@ -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:-
|
|
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 ["
|
|
25
|
+
CMD ["labtasker-server", "serve"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: labtasker
|
|
3
|
-
Version: 0.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:
|
|
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/
|
|
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
|
|
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/
|
|
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
|
|
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:-
|
|
70
|
+
- API_PORT=${API_PORT:-9321}
|
|
71
71
|
- PERIODIC_TASK_INTERVAL=${PERIODIC_TASK_INTERVAL:-30}
|
|
72
72
|
ports:
|
|
73
|
-
- "${API_PORT:-
|
|
73
|
+
- "${API_PORT:-9321}:${API_PORT:-9321}"
|
|
74
74
|
depends_on:
|
|
75
75
|
mongodb:
|
|
76
76
|
condition: service_healthy
|
|
@@ -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
|
|
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(
|
|
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:
|
|
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
|
|
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 =
|
|
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.
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
|
|
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
|