labtasker 0.2.0__tar.gz → 0.2.2__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/.gitattributes +217 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/.pre-commit-config.yaml +1 -7
- labtasker-0.2.2/PKG-INFO +156 -0
- labtasker-0.2.2/README.md +90 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/__init__.py +4 -3
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/api_models.py +49 -1
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/cli/__init__.py +2 -1
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/cli/cli.py +7 -4
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/cli/config.py +1 -3
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/cli/event.py +18 -5
- labtasker-0.2.2/labtasker/client/cli/init.py +284 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/cli/loop.py +14 -10
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/cli/queue.py +55 -23
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/cli/task.py +90 -26
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/cli/worker.py +17 -10
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/client_api.py +3 -1
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/api.py +41 -18
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/cli_utils.py +124 -25
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/config.py +5 -4
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/events.py +45 -23
- labtasker-0.2.2/labtasker/client/core/exceptions.py +77 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/job_runner.py +93 -12
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/logging.py +97 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/paths.py +5 -2
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/utils.py +17 -6
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/version_checker.py +7 -5
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/server/database.py +21 -4
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/server/endpoints.py +6 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker.egg-info/SOURCES.txt +3 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/pyproject.toml +4 -1
- labtasker-0.2.2/scripts/asciinema_adjust_timestamp.py +38 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/conftest.py +6 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/conftest.py +19 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_cli/test_event.py +8 -9
- labtasker-0.2.2/tests/test_client/test_cli/test_init.py +250 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_cli/test_task.py +172 -5
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_heartbeat.py +3 -1
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_runner_timeout/conftest.py +11 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_filtering/exception_utils.py +2 -0
- labtasker-0.2.0/.gitattributes +0 -1
- labtasker-0.2.0/PKG-INFO +0 -101
- labtasker-0.2.0/README.md +0 -39
- labtasker-0.2.0/labtasker/client/core/exceptions.py +0 -73
- {labtasker-0.2.0 → labtasker-0.2.2}/.coveragerc +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/.dockerignore +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/.flake8 +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/.gitignore +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/.gitmodules +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/.pytest.ini +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/.python-version +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/Dockerfile +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/LICENSE +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/MANIFEST.in +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/PRIVACY.md +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/demo/advanced/custom_resolver/submit_job.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/demo/advanced/custom_resolver/w.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/demo/advanced/custom_resolver/wo.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/demo/advanced/event_system/email_on_task_failure.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/demo/advanced/event_system/send_email.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/demo/advanced/event_system/sim_unstable_job.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/demo/advanced/event_system/submit.sh +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/demo/basic/bash_demo/job_main.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/demo/basic/bash_demo/run_job.sh +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/demo/basic/bash_demo/submit_job.sh +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/demo/basic/python_demo/run_job.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/demo/basic/python_demo/submit_job.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/docker/mongodb/init.d/init-keyfile.sh +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/docker/mongodb/post-init.d/init-mongo.sh +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/docker-compose.yml +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/__main__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/cmd_parser/LabCmd.g4 +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/cmd_parser/LabCmdLexer.g4 +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/cmd_parser/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/cmd_parser/generated/LabCmd.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/cmd_parser/generated/LabCmdLexer.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/cmd_parser/generated/LabCmdListener.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/cmd_parser/generated/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/cmd_parser/parser.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/context.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/heartbeat.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/plugin_utils.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/query_transpiler.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/resolver/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/resolver/models.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/core/resolver/utils.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/templates/labtasker_root/.gitignore +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/templates/labtasker_root/client.toml +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/client/templates/labtasker_root/logs/.gitkeep +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/constants.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/filtering.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/security.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/server/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/server/config.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/server/db_utils.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/server/dependencies.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/server/event_manager.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/server/fsm.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/server/logging.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/server/run.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/labtasker/utils.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/script_tests/test_ban_datetime_now/allowed.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/script_tests/test_ban_datetime_now/disallowed.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/script_tests/test_ban_datetime_now/test_ban.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/scripts/check_version.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/scripts/datetime_now_checker.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/server.example.env +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/setup.cfg +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/demo_pager_iterator.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/dummy_jobs/job_1.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/fixtures/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/fixtures/database/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/fixtures/database/mock.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/fixtures/database/real.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/fixtures/logging.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/fixtures/mock_datetime_now.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/fixtures/server/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/fixtures/server/async_app.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/fixtures/server/sync_app.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_api_models.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_cli/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_cli/conftest.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_cli/test_basic.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_cli/test_config.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_cli/test_loop.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_cli/test_queue.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_cli/test_worker.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_cli_utils.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_event/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_event/test_concurrency_job_flow_event.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_event/test_event_listener_basic.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_event/test_various_actions.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_event/utils.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_job_runner.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_logging.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_loop_internal_error_handler.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_pager_iterator.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_parser.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_query_transpiler/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_query_transpiler/conftest.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_query_transpiler/test_behavior.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_query_transpiler/test_matching.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_query_transpiler/test_utils.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_query_transpiler/utils.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_resolver.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_runner_concurrency/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_runner_concurrency/run_concurrent.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_runner_concurrency/test_runner_concurrency_success_failure.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_runner_concurrency/test_runner_high_concurrency.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_runner_timeout/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_runner_timeout/test_job_runner_timeout.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_runner_timeout/test_job_runner_with_resolver_timeout.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_runner_with_resolver.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_server_notification_and_client_version.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_client/test_core/test_version_checker.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_filtering/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_filtering/test_exception_filtering.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_mock_time.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_security.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/conftest.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_database/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_database/conftest.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_database/test_database_basic.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_database/test_fetch_extra_filter.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_database/test_query_dict_to_mongo_filter.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_database/test_required_field_fetching.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_db_utils/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_db_utils/test_arg_match.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_db_utils/test_keys_to_query_dict.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_db_utils/test_keys_to_query_dict_deepest.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_db_utils/test_keys_to_query_dict_topmost.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_endpoint/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_endpoint/test_event_basic.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_endpoint/test_server.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_endpoint/test_server_async.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_endpoint/test_server_async_ping.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_fsm.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_server/test_get_verified_queue_dependency.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_utils/__init__.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/test_utils/test_utils.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tests/utils.py +0 -0
- {labtasker-0.2.0 → labtasker-0.2.2}/tox.ini +0 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
## GITATTRIBUTES FOR WEB PROJECTS
|
|
2
|
+
#
|
|
3
|
+
# These settings are for any web project.
|
|
4
|
+
#
|
|
5
|
+
# Details per file setting:
|
|
6
|
+
# text These files should be normalized (i.e. convert CRLF to LF).
|
|
7
|
+
# binary These files are binary and should be left untouched.
|
|
8
|
+
#
|
|
9
|
+
# Note that binary is a macro for -text -diff.
|
|
10
|
+
######################################################################
|
|
11
|
+
|
|
12
|
+
# Auto detect
|
|
13
|
+
## Handle line endings automatically for files detected as
|
|
14
|
+
## text and leave all files detected as binary untouched.
|
|
15
|
+
## This will handle all files NOT defined below.
|
|
16
|
+
* text=auto
|
|
17
|
+
|
|
18
|
+
# Source code
|
|
19
|
+
*.bash text eol=lf
|
|
20
|
+
*.bat text eol=crlf
|
|
21
|
+
*.cmd text eol=crlf
|
|
22
|
+
*.coffee text
|
|
23
|
+
*.css text diff=css
|
|
24
|
+
*.htm text diff=html
|
|
25
|
+
*.html text diff=html
|
|
26
|
+
*.inc text
|
|
27
|
+
*.ini text
|
|
28
|
+
*.js text
|
|
29
|
+
*.mjs text
|
|
30
|
+
*.cjs text
|
|
31
|
+
*.json text
|
|
32
|
+
*.jsx text
|
|
33
|
+
*.less text
|
|
34
|
+
*.ls text
|
|
35
|
+
*.map text -diff
|
|
36
|
+
*.od text
|
|
37
|
+
*.onlydata text
|
|
38
|
+
*.php text diff=php
|
|
39
|
+
*.pl text
|
|
40
|
+
*.ps1 text eol=crlf
|
|
41
|
+
*.py text diff=python
|
|
42
|
+
*.rb text diff=ruby
|
|
43
|
+
*.sass text
|
|
44
|
+
*.scm text
|
|
45
|
+
*.scss text diff=css
|
|
46
|
+
*.sh text eol=lf
|
|
47
|
+
.husky/* text eol=lf
|
|
48
|
+
*.sql text
|
|
49
|
+
*.styl text
|
|
50
|
+
*.tag text
|
|
51
|
+
*.ts text
|
|
52
|
+
*.tsx text
|
|
53
|
+
*.xml text
|
|
54
|
+
*.xhtml text diff=html
|
|
55
|
+
|
|
56
|
+
# Docker
|
|
57
|
+
Dockerfile text
|
|
58
|
+
|
|
59
|
+
# Documentation
|
|
60
|
+
*.ipynb text eol=lf
|
|
61
|
+
*.markdown text diff=markdown
|
|
62
|
+
*.md text diff=markdown
|
|
63
|
+
*.mdwn text diff=markdown
|
|
64
|
+
*.mdown text diff=markdown
|
|
65
|
+
*.mkd text diff=markdown
|
|
66
|
+
*.mkdn text diff=markdown
|
|
67
|
+
*.mdtxt text
|
|
68
|
+
*.mdtext text
|
|
69
|
+
*.txt text
|
|
70
|
+
AUTHORS text
|
|
71
|
+
CHANGELOG text
|
|
72
|
+
CHANGES text
|
|
73
|
+
CONTRIBUTING text
|
|
74
|
+
COPYING text
|
|
75
|
+
copyright text
|
|
76
|
+
*COPYRIGHT* text
|
|
77
|
+
INSTALL text
|
|
78
|
+
license text
|
|
79
|
+
LICENSE text
|
|
80
|
+
NEWS text
|
|
81
|
+
readme text
|
|
82
|
+
*README* text
|
|
83
|
+
TODO text
|
|
84
|
+
|
|
85
|
+
# Templates
|
|
86
|
+
*.dot text
|
|
87
|
+
*.ejs text
|
|
88
|
+
*.erb text
|
|
89
|
+
*.haml text
|
|
90
|
+
*.handlebars text
|
|
91
|
+
*.hbs text
|
|
92
|
+
*.hbt text
|
|
93
|
+
*.jade text
|
|
94
|
+
*.latte text
|
|
95
|
+
*.mustache text
|
|
96
|
+
*.njk text
|
|
97
|
+
*.phtml text
|
|
98
|
+
*.svelte text
|
|
99
|
+
*.tmpl text
|
|
100
|
+
*.tpl text
|
|
101
|
+
*.twig text
|
|
102
|
+
*.vue text
|
|
103
|
+
|
|
104
|
+
# Configs
|
|
105
|
+
*.cnf text
|
|
106
|
+
*.conf text
|
|
107
|
+
*.config text
|
|
108
|
+
.editorconfig text
|
|
109
|
+
.env text
|
|
110
|
+
.gitattributes text
|
|
111
|
+
.gitconfig text
|
|
112
|
+
.htaccess text
|
|
113
|
+
*.lock text -diff
|
|
114
|
+
package.json text eol=lf
|
|
115
|
+
package-lock.json text eol=lf -diff
|
|
116
|
+
pnpm-lock.yaml text eol=lf -diff
|
|
117
|
+
.prettierrc text
|
|
118
|
+
yarn.lock text -diff
|
|
119
|
+
*.toml text
|
|
120
|
+
*.yaml text
|
|
121
|
+
*.yml text
|
|
122
|
+
browserslist text
|
|
123
|
+
Makefile text
|
|
124
|
+
makefile text
|
|
125
|
+
# Fixes syntax highlighting on GitHub to allow comments
|
|
126
|
+
tsconfig.json linguist-language=JSON-with-Comments
|
|
127
|
+
|
|
128
|
+
# Heroku
|
|
129
|
+
Procfile text
|
|
130
|
+
|
|
131
|
+
# Graphics
|
|
132
|
+
*.ai binary
|
|
133
|
+
*.bmp binary
|
|
134
|
+
*.eps binary
|
|
135
|
+
*.gif binary
|
|
136
|
+
*.gifv binary
|
|
137
|
+
*.ico binary
|
|
138
|
+
*.jng binary
|
|
139
|
+
*.jp2 binary
|
|
140
|
+
*.jpg binary
|
|
141
|
+
*.jpeg binary
|
|
142
|
+
*.jpx binary
|
|
143
|
+
*.jxr binary
|
|
144
|
+
*.pdf binary
|
|
145
|
+
*.png binary
|
|
146
|
+
*.psb binary
|
|
147
|
+
*.psd binary
|
|
148
|
+
# SVG treated as an asset (binary) by default.
|
|
149
|
+
*.svg text
|
|
150
|
+
# If you want to treat it as binary,
|
|
151
|
+
# use the following line instead.
|
|
152
|
+
# *.svg binary
|
|
153
|
+
*.svgz binary
|
|
154
|
+
*.tif binary
|
|
155
|
+
*.tiff binary
|
|
156
|
+
*.wbmp binary
|
|
157
|
+
*.webp binary
|
|
158
|
+
|
|
159
|
+
# Audio
|
|
160
|
+
*.kar binary
|
|
161
|
+
*.m4a binary
|
|
162
|
+
*.mid binary
|
|
163
|
+
*.midi binary
|
|
164
|
+
*.mp3 binary
|
|
165
|
+
*.ogg binary
|
|
166
|
+
*.ra binary
|
|
167
|
+
|
|
168
|
+
# Video
|
|
169
|
+
*.3gpp binary
|
|
170
|
+
*.3gp binary
|
|
171
|
+
*.as binary
|
|
172
|
+
*.asf binary
|
|
173
|
+
*.asx binary
|
|
174
|
+
*.avi binary
|
|
175
|
+
*.fla binary
|
|
176
|
+
*.flv binary
|
|
177
|
+
*.m4v binary
|
|
178
|
+
*.mng binary
|
|
179
|
+
*.mov binary
|
|
180
|
+
*.mp4 binary
|
|
181
|
+
*.mpeg binary
|
|
182
|
+
*.mpg binary
|
|
183
|
+
*.ogv binary
|
|
184
|
+
*.swc binary
|
|
185
|
+
*.swf binary
|
|
186
|
+
*.webm binary
|
|
187
|
+
|
|
188
|
+
# Archives
|
|
189
|
+
*.7z binary
|
|
190
|
+
*.gz binary
|
|
191
|
+
*.jar binary
|
|
192
|
+
*.rar binary
|
|
193
|
+
*.tar binary
|
|
194
|
+
*.zip binary
|
|
195
|
+
|
|
196
|
+
# Fonts
|
|
197
|
+
*.ttf binary
|
|
198
|
+
*.eot binary
|
|
199
|
+
*.otf binary
|
|
200
|
+
*.woff binary
|
|
201
|
+
*.woff2 binary
|
|
202
|
+
|
|
203
|
+
# Executables
|
|
204
|
+
*.exe binary
|
|
205
|
+
*.pyc binary
|
|
206
|
+
# Prevents massive diffs caused by vendored, minified files
|
|
207
|
+
**/.yarn/releases/** binary
|
|
208
|
+
**/.yarn/plugins/** binary
|
|
209
|
+
|
|
210
|
+
# RC files (like .babelrc or .eslintrc)
|
|
211
|
+
*.*rc text
|
|
212
|
+
|
|
213
|
+
# Ignore files (like .npmignore or .gitignore)
|
|
214
|
+
*.*ignore text
|
|
215
|
+
|
|
216
|
+
# Prevents massive diffs from built files
|
|
217
|
+
dist/* binary
|
|
@@ -7,7 +7,7 @@ repos:
|
|
|
7
7
|
- id: check-yaml
|
|
8
8
|
exclude: ^docs/mkdocs.yml
|
|
9
9
|
- id: check-added-large-files
|
|
10
|
-
exclude: ^docs/docs/assets/
|
|
10
|
+
exclude: ^docs/docs/assets/|^assets/
|
|
11
11
|
- id: mixed-line-ending
|
|
12
12
|
args: [ --fix=lf ]
|
|
13
13
|
|
|
@@ -20,9 +20,3 @@ repos:
|
|
|
20
20
|
rev: 5.13.2
|
|
21
21
|
hooks:
|
|
22
22
|
- id: isort
|
|
23
|
-
|
|
24
|
-
- repo: https://github.com/pycqa/flake8
|
|
25
|
-
rev: 6.0.0
|
|
26
|
-
hooks:
|
|
27
|
-
- id: flake8
|
|
28
|
-
exclude: ^labtasker/client/core/cmd_parser/generated/
|
labtasker-0.2.2/PKG-INFO
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: labtasker
|
|
3
|
+
Version: 0.2.2
|
|
4
|
+
Summary: A task queue system for lab experiments
|
|
5
|
+
Author-email: Your Name <your.email@example.com>
|
|
6
|
+
License: Apache License 2.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/fkcptlst/labtasker
|
|
8
|
+
Project-URL: Documentation, https://fkcptlst.github.io/labtasker
|
|
9
|
+
Project-URL: Repository, https://github.com/fkcptlst/labtasker.git
|
|
10
|
+
Classifier: Intended Audience :: Science/Research
|
|
11
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
12
|
+
Classifier: Operating System :: OS Independent
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Requires-Python: <4.0,>=3.8.1
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: python-dotenv<2.0.0,>=1.0.1
|
|
24
|
+
Requires-Dist: pymongo<5.0.0,>=4.0.0
|
|
25
|
+
Requires-Dist: fastapi<0.116.0,>=0.115.0
|
|
26
|
+
Requires-Dist: uvicorn[standard]<0.35.0,>=0.15.0
|
|
27
|
+
Requires-Dist: click<9.0.0,>=8.1.0
|
|
28
|
+
Requires-Dist: passlib<2.0.0,>=1.7.0
|
|
29
|
+
Requires-Dist: antlr4-python3-runtime<5.0.0,>=4.13.0
|
|
30
|
+
Requires-Dist: pydantic-settings<3.0.0,>=2.8.0
|
|
31
|
+
Requires-Dist: httpx[socks]<0.29.0,>=0.28.0
|
|
32
|
+
Requires-Dist: typer<0.16.0,>=0.15.0
|
|
33
|
+
Requires-Dist: loguru<0.8.0,>=0.7.0
|
|
34
|
+
Requires-Dist: ruamel-yaml<0.19.0,>=0.18.10
|
|
35
|
+
Requires-Dist: pyyaml<7.0.0,>=6.0.0
|
|
36
|
+
Requires-Dist: tomlkit<0.14.0,>=0.13.2
|
|
37
|
+
Requires-Dist: importlib-metadata<9.0.0,>=8.5.0
|
|
38
|
+
Requires-Dist: packaging<25.0,>=24.2
|
|
39
|
+
Requires-Dist: sse-starlette<3.0.0,>=2.1.3
|
|
40
|
+
Requires-Dist: httpx-sse<0.5.0,>=0.4.0
|
|
41
|
+
Requires-Dist: stamina<26.0.0,>=25.1.0
|
|
42
|
+
Requires-Dist: noneprompt<0.2.0,>=0.1.9
|
|
43
|
+
Requires-Dist: pytest-sugar<2.0.0,>=1.0.0
|
|
44
|
+
Provides-Extra: dev
|
|
45
|
+
Requires-Dist: pytest<9.0.0,>=8.0.0; extra == "dev"
|
|
46
|
+
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
|
+
Requires-Dist: black<26.0.0,>=24.0.0; extra == "dev"
|
|
49
|
+
Requires-Dist: isort<7.0.0,>=5.13.0; extra == "dev"
|
|
50
|
+
Requires-Dist: mypy<2.0.0,>=1.14.0; extra == "dev"
|
|
51
|
+
Requires-Dist: flake8<8.0.0,>=7.0.0; extra == "dev"
|
|
52
|
+
Requires-Dist: pre-commit<5.0.0,>=3.0.0; extra == "dev"
|
|
53
|
+
Requires-Dist: freezegun<2.0.0,>=1.5.0; extra == "dev"
|
|
54
|
+
Requires-Dist: pytest-docker<4.0.0,>=3.0.0; extra == "dev"
|
|
55
|
+
Requires-Dist: pytest-asyncio<0.26.0,>=0.24.0; extra == "dev"
|
|
56
|
+
Requires-Dist: asgi-lifespan<3.0.0,>=2.1.0; extra == "dev"
|
|
57
|
+
Requires-Dist: tox<4.25.0,>=4.24.0; extra == "dev"
|
|
58
|
+
Requires-Dist: pytest-dependency<0.7.0,>=0.6.0; extra == "dev"
|
|
59
|
+
Provides-Extra: doc
|
|
60
|
+
Requires-Dist: mkdocs-material<9.7.0,>=9.6.5; extra == "doc"
|
|
61
|
+
Requires-Dist: mkdocs-glightbox<0.5.0,>=0.4.0; extra == "doc"
|
|
62
|
+
Requires-Dist: mike<2.2.0,>=2.1.3; extra == "doc"
|
|
63
|
+
Provides-Extra: plugins
|
|
64
|
+
Requires-Dist: labtasker-plugin-task-count; extra == "plugins"
|
|
65
|
+
Dynamic: license-file
|
|
66
|
+
|
|
67
|
+
<p align="center"><em>Make your ML experiment wrapper scripts smarter with...</em></p>
|
|
68
|
+
<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
|
+
|
|
71
|
+
<p align="center">
|
|
72
|
+
<img src="https://github.com/fkcptlst/labtasker/actions/workflows/unit-test-matrix.yml/badge.svg" alt="unit-test-matrix" />
|
|
73
|
+
<a href="https://codecov.io/gh/fkcptlst/labtasker"><img src="https://codecov.io/gh/fkcptlst/labtasker/graph/badge.svg?token=KQFBV3QRPY" alt="codecov" /></a>
|
|
74
|
+
<img src="https://img.shields.io/badge/Python-3.8%20|%203.9%20|%203.10%20|%203.11%20|%203.12%20|%203.13-blue" alt="Python version" />
|
|
75
|
+
<a href="https://pypi.org/project/labtasker/"><img src="https://img.shields.io/pypi/v/labtasker" alt="PyPI" /></a>
|
|
76
|
+
</p>
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
**<span style="font-size: 20px;"> 🌟 Labtasker makes ML experiment wrapper scripts smarter with task prioritization,
|
|
80
|
+
failure handling, halfway resume and more: just change 1 line of code.</span>**
|
|
81
|
+
|
|
82
|
+
If you like our project, please give us a star ⭐ on GitHub for latest update.
|
|
83
|
+
|
|
84
|
+
## ✨ When and Where to Use
|
|
85
|
+
|
|
86
|
+
**TLDR**: Replace `for` loops in your experiment *wrapper script* with labtasker to enable features like experiment
|
|
87
|
+
parallelization, dynamic task prioritization, failure handling, halfway resume, and more.
|
|
88
|
+
|
|
89
|
+

|
|
90
|
+
|
|
91
|
+
🐳 For detailed examples and concepts, check out the [documentation](https://fkcptlst.github.io/labtasker/).
|
|
92
|
+
|
|
93
|
+
## 🧪️ A Quick Demo
|
|
94
|
+
|
|
95
|
+
This demo shows how to easily submit task arguments and run jobs in parallel.
|
|
96
|
+
|
|
97
|
+
It also features an event listener to monitor task execution in real-time and automate workflows,
|
|
98
|
+
such as sending emails on task failure.
|
|
99
|
+
|
|
100
|
+

|
|
101
|
+
|
|
102
|
+
For more detailed steps, please refer to the content in the [Tutorial / Demo](https://fkcptlst.github.io/labtasker/latest/guide/basic/).
|
|
103
|
+
|
|
104
|
+
## ⚡️ Features
|
|
105
|
+
|
|
106
|
+
- ⚙️ Easy configuration and setup.
|
|
107
|
+
- 🧩 Versatile and minimalistic design.
|
|
108
|
+
- 🔄 Supports both CLI and Python API for task scheduling.
|
|
109
|
+
- 🔌 Customizable plugin system.
|
|
110
|
+
|
|
111
|
+
## 🔮 Supercharge Your ML Experiments with Labtasker
|
|
112
|
+
|
|
113
|
+
- ⚡️ **Effortless Parallelization:** Distribute tasks across multiple GPU workers with just a few lines of code.
|
|
114
|
+
- 🛡️ **Intelligent Failure Management:** Automatically capture exceptions, retry failed tasks, and maintain detailed error logs.
|
|
115
|
+
- 🔄 **Seamless Recovery:** Resume failed experiments with a single command - no more scavenging through logs or directories.
|
|
116
|
+
- 🎯 **Real-time Prioritization:** Changed your mind about experiment settings? Instantly cancel, add, or reschedule tasks without disrupting existing ones.
|
|
117
|
+
- 🤖 **Workflow Automation:** Set up smart event triggers for email notifications or task workflow based on FSM transition events.
|
|
118
|
+
- 📊 **Streamlined Logging:** All stdout/stderr automatically organized in `.labtasker/logs` - zero configuration required.
|
|
119
|
+
- 🧩 **Extensible Plugin System:** Create custom command combinations or leverage community plugins to extend functionality.
|
|
120
|
+
|
|
121
|
+
## 🛠️ Installation
|
|
122
|
+
|
|
123
|
+
> [!NOTE]
|
|
124
|
+
> You need a running Labtasker server to use the client tools.
|
|
125
|
+
> See [deployment instructions](https://fkcptlst.github.io/labtasker/latest/install/deployment/).
|
|
126
|
+
|
|
127
|
+
### 1. Install Client Tools via PyPI
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
pip install labtasker
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 2. Install the Latest Version from GitHub
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
pip install git+https://github.com/fkcptlst/labtasker.git
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## 🚀 Quick Start
|
|
140
|
+
|
|
141
|
+
Use the following command to quickly setup a labtasker queue for your project:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
labtasker init
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Then, use `labtasker submit` to submit tasks and use `labtasker loop` to run tasks across any number of workers.
|
|
148
|
+
|
|
149
|
+
## 📚 Documentation
|
|
150
|
+
|
|
151
|
+
For detailed information on demo, tutorial, deployment, usage, please refer to
|
|
152
|
+
the [documentation](https://fkcptlst.github.io/labtasker/).
|
|
153
|
+
|
|
154
|
+
## 🔒 License
|
|
155
|
+
|
|
156
|
+
See [LICENSE](LICENSE) for details.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
<p align="center"><em>Make your ML experiment wrapper scripts smarter with...</em></p>
|
|
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>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<img src="https://github.com/fkcptlst/labtasker/actions/workflows/unit-test-matrix.yml/badge.svg" alt="unit-test-matrix" />
|
|
7
|
+
<a href="https://codecov.io/gh/fkcptlst/labtasker"><img src="https://codecov.io/gh/fkcptlst/labtasker/graph/badge.svg?token=KQFBV3QRPY" alt="codecov" /></a>
|
|
8
|
+
<img src="https://img.shields.io/badge/Python-3.8%20|%203.9%20|%203.10%20|%203.11%20|%203.12%20|%203.13-blue" alt="Python version" />
|
|
9
|
+
<a href="https://pypi.org/project/labtasker/"><img src="https://img.shields.io/pypi/v/labtasker" alt="PyPI" /></a>
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
**<span style="font-size: 20px;"> 🌟 Labtasker makes ML experiment wrapper scripts smarter with task prioritization,
|
|
14
|
+
failure handling, halfway resume and more: just change 1 line of code.</span>**
|
|
15
|
+
|
|
16
|
+
If you like our project, please give us a star ⭐ on GitHub for latest update.
|
|
17
|
+
|
|
18
|
+
## ✨ When and Where to Use
|
|
19
|
+
|
|
20
|
+
**TLDR**: Replace `for` loops in your experiment *wrapper script* with labtasker to enable features like experiment
|
|
21
|
+
parallelization, dynamic task prioritization, failure handling, halfway resume, and more.
|
|
22
|
+
|
|
23
|
+

|
|
24
|
+
|
|
25
|
+
🐳 For detailed examples and concepts, check out the [documentation](https://fkcptlst.github.io/labtasker/).
|
|
26
|
+
|
|
27
|
+
## 🧪️ A Quick Demo
|
|
28
|
+
|
|
29
|
+
This demo shows how to easily submit task arguments and run jobs in parallel.
|
|
30
|
+
|
|
31
|
+
It also features an event listener to monitor task execution in real-time and automate workflows,
|
|
32
|
+
such as sending emails on task failure.
|
|
33
|
+
|
|
34
|
+

|
|
35
|
+
|
|
36
|
+
For more detailed steps, please refer to the content in the [Tutorial / Demo](https://fkcptlst.github.io/labtasker/latest/guide/basic/).
|
|
37
|
+
|
|
38
|
+
## ⚡️ Features
|
|
39
|
+
|
|
40
|
+
- ⚙️ Easy configuration and setup.
|
|
41
|
+
- 🧩 Versatile and minimalistic design.
|
|
42
|
+
- 🔄 Supports both CLI and Python API for task scheduling.
|
|
43
|
+
- 🔌 Customizable plugin system.
|
|
44
|
+
|
|
45
|
+
## 🔮 Supercharge Your ML Experiments with Labtasker
|
|
46
|
+
|
|
47
|
+
- ⚡️ **Effortless Parallelization:** Distribute tasks across multiple GPU workers with just a few lines of code.
|
|
48
|
+
- 🛡️ **Intelligent Failure Management:** Automatically capture exceptions, retry failed tasks, and maintain detailed error logs.
|
|
49
|
+
- 🔄 **Seamless Recovery:** Resume failed experiments with a single command - no more scavenging through logs or directories.
|
|
50
|
+
- 🎯 **Real-time Prioritization:** Changed your mind about experiment settings? Instantly cancel, add, or reschedule tasks without disrupting existing ones.
|
|
51
|
+
- 🤖 **Workflow Automation:** Set up smart event triggers for email notifications or task workflow based on FSM transition events.
|
|
52
|
+
- 📊 **Streamlined Logging:** All stdout/stderr automatically organized in `.labtasker/logs` - zero configuration required.
|
|
53
|
+
- 🧩 **Extensible Plugin System:** Create custom command combinations or leverage community plugins to extend functionality.
|
|
54
|
+
|
|
55
|
+
## 🛠️ Installation
|
|
56
|
+
|
|
57
|
+
> [!NOTE]
|
|
58
|
+
> You need a running Labtasker server to use the client tools.
|
|
59
|
+
> See [deployment instructions](https://fkcptlst.github.io/labtasker/latest/install/deployment/).
|
|
60
|
+
|
|
61
|
+
### 1. Install Client Tools via PyPI
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
pip install labtasker
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 2. Install the Latest Version from GitHub
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
pip install git+https://github.com/fkcptlst/labtasker.git
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## 🚀 Quick Start
|
|
74
|
+
|
|
75
|
+
Use the following command to quickly setup a labtasker queue for your project:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
labtasker init
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Then, use `labtasker submit` to submit tasks and use `labtasker loop` to run tasks across any number of workers.
|
|
82
|
+
|
|
83
|
+
## 📚 Documentation
|
|
84
|
+
|
|
85
|
+
For detailed information on demo, tutorial, deployment, usage, please refer to
|
|
86
|
+
the [documentation](https://fkcptlst.github.io/labtasker/).
|
|
87
|
+
|
|
88
|
+
## 🔒 License
|
|
89
|
+
|
|
90
|
+
See [LICENSE](LICENSE) for details.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
__version__ = "0.2.
|
|
1
|
+
__version__ = "0.2.2"
|
|
2
2
|
|
|
3
3
|
from labtasker.client.client_api import *
|
|
4
4
|
from labtasker.client.core.config import get_client_config
|
|
@@ -7,10 +7,11 @@ from labtasker.client.core.paths import get_labtasker_client_config_path
|
|
|
7
7
|
from labtasker.client.core.version_checker import check_pypi_status
|
|
8
8
|
from labtasker.filtering import install_traceback_filter, set_traceback_filter_hook
|
|
9
9
|
|
|
10
|
-
install_traceback_filter()
|
|
11
10
|
check_pypi_status()
|
|
12
11
|
|
|
13
12
|
# by default, traceback filter is enabled.
|
|
14
13
|
# you may disable it via client config
|
|
15
14
|
if get_labtasker_client_config_path().exists():
|
|
16
|
-
|
|
15
|
+
if get_client_config().enable_traceback_filter:
|
|
16
|
+
install_traceback_filter()
|
|
17
|
+
set_traceback_filter_hook(enabled=True)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from datetime import datetime
|
|
2
|
-
from typing import Any, Dict, List, Literal, Optional, Union
|
|
2
|
+
from typing import Any, Dict, List, Literal, Optional, Tuple, Union
|
|
3
3
|
|
|
4
4
|
from packaging.version import Version
|
|
5
5
|
from pydantic import BaseModel, ConfigDict, Field, SecretStr, field_validator
|
|
@@ -209,7 +209,32 @@ class TaskLsRequest(BaseRequestModel):
|
|
|
209
209
|
limit: int = Field(100, ge=0, le=1000)
|
|
210
210
|
task_id: Optional[str] = None
|
|
211
211
|
task_name: Optional[str] = None
|
|
212
|
+
status: Optional[str] = Field(
|
|
213
|
+
None, pattern=r"^(pending|running|success|failed|cancelled)$"
|
|
214
|
+
)
|
|
212
215
|
extra_filter: Optional[Dict[str, Any]] = None
|
|
216
|
+
sort: Optional[List[Tuple[str, int]]] = None # validate that int must be -1/1
|
|
217
|
+
|
|
218
|
+
@field_validator("sort")
|
|
219
|
+
def validate_sort(cls, value):
|
|
220
|
+
if value is not None:
|
|
221
|
+
if not isinstance(value, list):
|
|
222
|
+
raise ValueError("Sort must be a list of tuples.")
|
|
223
|
+
for item in value:
|
|
224
|
+
if not isinstance(item, tuple) or len(item) != 2:
|
|
225
|
+
raise ValueError(
|
|
226
|
+
f"Invalid sort format: {item}. Expected (field, order)."
|
|
227
|
+
)
|
|
228
|
+
field, order = item
|
|
229
|
+
if not isinstance(field, str):
|
|
230
|
+
raise ValueError(
|
|
231
|
+
f"Sort field must be a string, got {type(field).__name__}."
|
|
232
|
+
)
|
|
233
|
+
if order not in (-1, 1):
|
|
234
|
+
raise ValueError(
|
|
235
|
+
f"Sort order must be 1 (ascending) or -1 (descending), got {order}."
|
|
236
|
+
)
|
|
237
|
+
return value
|
|
213
238
|
|
|
214
239
|
|
|
215
240
|
class TaskLsResponse(BaseResponseModel):
|
|
@@ -246,7 +271,30 @@ class WorkerLsRequest(BaseRequestModel):
|
|
|
246
271
|
limit: int = Field(100, ge=0, le=1000)
|
|
247
272
|
worker_id: Optional[str] = None
|
|
248
273
|
worker_name: Optional[str] = None
|
|
274
|
+
status: Optional[str] = Field(None, pattern=r"^(active|suspended|crashed)$")
|
|
249
275
|
extra_filter: Optional[Dict[str, Any]] = None
|
|
276
|
+
sort: Optional[List[Tuple[str, int]]] = None # validate that int must be -1/1
|
|
277
|
+
|
|
278
|
+
@field_validator("sort")
|
|
279
|
+
def validate_sort(cls, value):
|
|
280
|
+
if value is not None:
|
|
281
|
+
if not isinstance(value, list):
|
|
282
|
+
raise ValueError("Sort must be a list of tuples.")
|
|
283
|
+
for item in value:
|
|
284
|
+
if not isinstance(item, tuple) or len(item) != 2:
|
|
285
|
+
raise ValueError(
|
|
286
|
+
f"Invalid sort format: {item}. Expected (field, order)."
|
|
287
|
+
)
|
|
288
|
+
field, order = item
|
|
289
|
+
if not isinstance(field, str):
|
|
290
|
+
raise ValueError(
|
|
291
|
+
f"Sort field must be a string, got {type(field).__name__}."
|
|
292
|
+
)
|
|
293
|
+
if order not in (-1, 1):
|
|
294
|
+
raise ValueError(
|
|
295
|
+
f"Sort order must be 1 (ascending) or -1 (descending), got {order}."
|
|
296
|
+
)
|
|
297
|
+
return value
|
|
250
298
|
|
|
251
299
|
|
|
252
300
|
class Worker(BaseApiModel, MetadataKeyValidateMixin):
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import labtasker.client.cli.config
|
|
2
2
|
import labtasker.client.cli.event as event
|
|
3
|
+
import labtasker.client.cli.init
|
|
3
4
|
import labtasker.client.cli.loop
|
|
4
5
|
import labtasker.client.cli.queue as queue
|
|
5
6
|
import labtasker.client.cli.task as task
|
|
@@ -21,5 +22,5 @@ else:
|
|
|
21
22
|
stderr_console.print(
|
|
22
23
|
f"[bold orange1]Warning:[/bold orange1] config file not found at {get_labtasker_client_config_path()}. "
|
|
23
24
|
f"[orange1]Skipped plugin loading.[/orange1] "
|
|
24
|
-
|
|
25
|
+
"If you are running [dodger_blue1]`labtasker init`[/dodger_blue1] or [dodger_blue1]`labtasker config`[/dodger_blue1], ignore this warning."
|
|
25
26
|
)
|
|
@@ -4,13 +4,13 @@ Implements top level cli (mainly callbacks and setup)
|
|
|
4
4
|
|
|
5
5
|
from typing import Optional
|
|
6
6
|
|
|
7
|
-
import httpx
|
|
8
7
|
import typer
|
|
9
8
|
from typing_extensions import Annotated
|
|
10
9
|
|
|
11
10
|
from labtasker import __version__
|
|
12
11
|
from labtasker.client.core.api import health_check
|
|
13
12
|
from labtasker.client.core.config import requires_client_config
|
|
13
|
+
from labtasker.client.core.exceptions import LabtaskerNetworkError
|
|
14
14
|
from labtasker.client.core.logging import stderr_console, stdout_console
|
|
15
15
|
from labtasker.client.core.version_checker import check_pypi_status
|
|
16
16
|
|
|
@@ -49,9 +49,12 @@ def help_(ctx: typer.Context):
|
|
|
49
49
|
@app.command()
|
|
50
50
|
@requires_client_config
|
|
51
51
|
def health():
|
|
52
|
-
"""Check server
|
|
52
|
+
"""Check server status and connectivity."""
|
|
53
53
|
try:
|
|
54
54
|
stdout_console.print(health_check())
|
|
55
|
-
except
|
|
56
|
-
stderr_console.print(
|
|
55
|
+
except LabtaskerNetworkError as e:
|
|
56
|
+
stderr_console.print(
|
|
57
|
+
"[bold red]Error:[/bold red] Server connection is not healthy.\n"
|
|
58
|
+
f"Detail: {e}"
|
|
59
|
+
)
|
|
57
60
|
raise typer.Exit(-1)
|
|
@@ -28,9 +28,7 @@ def config(
|
|
|
28
28
|
None, help="Editor to use for editing the configuration file."
|
|
29
29
|
),
|
|
30
30
|
):
|
|
31
|
-
"""
|
|
32
|
-
Configure the local client. Opens the configuration file for editing using the specified or system-configured editor.
|
|
33
|
-
"""
|
|
31
|
+
"""Edit local client configuration."""
|
|
34
32
|
# 0. Check if Labtasker root exists, if not, initialize it
|
|
35
33
|
if not get_labtasker_root().exists():
|
|
36
34
|
typer.confirm(
|