From 9aa2da72b5fd97ae714bd2e2c003df6cbbbafc27 Mon Sep 17 00:00:00 2001 From: Tom Kasper Date: Sun, 30 Aug 2026 20:44:00 +0200 Subject: [PATCH] Initial version --- planning/mcp-server-plan.md | 441 +++ pyproject.toml | 41 + src/mcp_server/__init__.py | 3 + src/mcp_server/__main__.py | 19 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 274 bytes .../__pycache__/allocate.cpython-313.pyc | Bin 0 -> 1478 bytes .../__pycache__/annotate.cpython-313.pyc | Bin 0 -> 1094 bytes .../__pycache__/config.cpython-313.pyc | Bin 0 -> 2441 bytes .../__pycache__/elabftw.cpython-313.pyc | Bin 0 -> 5548 bytes .../__pycache__/errors.cpython-313.pyc | Bin 0 -> 3510 bytes .../__pycache__/journal.cpython-313.pyc | Bin 0 -> 4341 bytes .../__pycache__/models.cpython-313.pyc | Bin 0 -> 9230 bytes .../__pycache__/resolve.cpython-313.pyc | Bin 0 -> 2507 bytes .../__pycache__/rest.cpython-313.pyc | Bin 0 -> 1378 bytes .../__pycache__/schemas.cpython-313.pyc | Bin 0 -> 2570 bytes .../__pycache__/templates.cpython-313.pyc | Bin 0 -> 1965 bytes .../__pycache__/tools.cpython-313.pyc | Bin 0 -> 5196 bytes src/mcp_server/allocate.py | 27 + src/mcp_server/annotate.py | 21 + src/mcp_server/config.py | 35 + src/mcp_server/elabftw.py | 98 + src/mcp_server/errors.py | 60 + src/mcp_server/journal.py | 81 + src/mcp_server/models.py | 179 + src/mcp_server/resolve.py | 35 + src/mcp_server/rest.py | 30 + src/mcp_server/schemas.py | 48 + src/mcp_server/server.py | 25 + src/mcp_server/templates.py | 27 + src/mcp_server/tools.py | 142 + src/mcp_server/workflows/__init__.py | 1 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 236 bytes .../__pycache__/inventory.cpython-313.pyc | Bin 0 -> 1997 bytes .../__pycache__/protocol.cpython-313.pyc | Bin 0 -> 2856 bytes .../__pycache__/setup.cpython-313.pyc | Bin 0 -> 2002 bytes src/mcp_server/workflows/inventory.py | 37 + src/mcp_server/workflows/protocol.py | 63 + src/mcp_server/workflows/setup.py | 32 + .../conftest.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 7145 bytes tests/__pycache__/conftest.cpython-313.pyc | Bin 0 -> 6998 bytes tests/__pycache__/fakes.cpython-313.pyc | Bin 0 -> 27772 bytes ...test_allocate.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 29526 bytes .../__pycache__/test_allocate.cpython-313.pyc | Bin 0 -> 10129 bytes ...test_annotate.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 25466 bytes .../__pycache__/test_annotate.cpython-313.pyc | Bin 0 -> 9531 bytes .../test_config.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 12818 bytes tests/__pycache__/test_config.cpython-313.pyc | Bin 0 -> 3044 bytes ...abftw_adapter.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 18596 bytes .../test_elabftw_adapter.cpython-313.pyc | Bin 0 -> 8905 bytes .../test_errors.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 18813 bytes tests/__pycache__/test_errors.cpython-313.pyc | Bin 0 -> 3621 bytes .../test_journal.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 27033 bytes .../__pycache__/test_journal.cpython-313.pyc | Bin 0 -> 10964 bytes .../test_models.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 11795 bytes tests/__pycache__/test_models.cpython-313.pyc | Bin 0 -> 3583 bytes .../test_resolve.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 15132 bytes .../__pycache__/test_resolve.cpython-313.pyc | Bin 0 -> 7415 bytes ...test_rest_api.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 32630 bytes .../__pycache__/test_rest_api.cpython-313.pyc | Bin 0 -> 9530 bytes .../test_safety.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 16261 bytes tests/__pycache__/test_safety.cpython-313.pyc | Bin 0 -> 6372 bytes ...est_templates.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 23269 bytes .../test_templates.cpython-313.pyc | Bin 0 -> 9252 bytes ...est_tools_mcp.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 25465 bytes .../test_tools_mcp.cpython-313.pyc | Bin 0 -> 9497 bytes ...ows_inventory.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 15293 bytes .../test_workflows_inventory.cpython-313.pyc | Bin 0 -> 6917 bytes ...lows_protocol.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 64814 bytes .../test_workflows_protocol.cpython-313.pyc | Bin 0 -> 22300 bytes ...rkflows_setup.cpython-313-pytest-9.1.1.pyc | Bin 0 -> 23148 bytes .../test_workflows_setup.cpython-313.pyc | Bin 0 -> 9191 bytes tests/conftest.py | 164 + tests/fakes.py | 505 +++ tests/test_allocate.py | 176 + tests/test_annotate.py | 159 + tests/test_config.py | 50 + tests/test_elabftw_adapter.py | 138 + tests/test_errors.py | 64 + tests/test_journal.py | 135 + tests/test_models.py | 72 + tests/test_resolve.py | 89 + tests/test_rest_api.py | 184 ++ tests/test_safety.py | 97 + tests/test_templates.py | 132 + tests/test_tools_mcp.py | 169 + tests/test_workflows_inventory.py | 92 + tests/test_workflows_protocol.py | 338 ++ tests/test_workflows_setup.py | 135 + uv.lock | 1563 +++++++++ vendor/elabapi-python/PKG-INFO | 19 + vendor/elabapi-python/README.md | 417 +++ .../elabapi_python.egg-info/PKG-INFO | 19 + .../elabapi_python.egg-info/SOURCES.txt | 348 ++ .../dependency_links.txt | 1 + .../elabapi_python.egg-info/requires.txt | 4 + .../elabapi_python.egg-info/top_level.txt | 2 + .../elabapi-python/elabapi_python/__init__.py | 188 ++ .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 13749 bytes .../__pycache__/api_client.cpython-313.pyc | Bin 0 -> 24514 bytes .../__pycache__/configuration.cpython-313.pyc | Bin 0 -> 9240 bytes .../__pycache__/rest.cpython-313.pyc | Bin 0 -> 10907 bytes .../elabapi_python/api/__init__.py | 46 + .../api/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 3253 bytes .../__pycache__/api_keys_api.cpython-313.pyc | Bin 0 -> 9573 bytes .../__pycache__/branding_api.cpython-313.pyc | Bin 0 -> 8491 bytes .../__pycache__/comments_api.cpython-313.pyc | Bin 0 -> 18616 bytes .../__pycache__/compounds_api.cpython-313.pyc | Bin 0 -> 13271 bytes .../__pycache__/config_api.cpython-313.pyc | Bin 0 -> 8804 bytes .../containers_api.cpython-313.pyc | Bin 0 -> 19647 bytes .../custom_fields_keys_api.cpython-313.pyc | Bin 0 -> 4635 bytes .../__pycache__/d_space_api.cpython-313.pyc | Bin 0 -> 10290 bytes .../__pycache__/events_api.cpython-313.pyc | Bin 0 -> 15417 bytes .../experiments_api.cpython-313.pyc | Bin 0 -> 24356 bytes ...experiments_categories_api.cpython-313.pyc | Bin 0 -> 16945 bytes .../experiments_status_api.cpython-313.pyc | Bin 0 -> 16890 bytes .../experiments_templates_api.cpython-313.pyc | Bin 0 -> 23257 bytes .../__pycache__/exports_api.cpython-313.pyc | Bin 0 -> 12122 bytes .../favorite_tags_api.cpython-313.pyc | Bin 0 -> 9394 bytes .../api/__pycache__/idps_api.cpython-313.pyc | Bin 0 -> 38002 bytes .../idps_sources_api.cpython-313.pyc | Bin 0 -> 15214 bytes .../__pycache__/import_api.cpython-313.pyc | Bin 0 -> 7296 bytes .../api/__pycache__/info_api.cpython-313.pyc | Bin 0 -> 4717 bytes .../__pycache__/instance_api.cpython-313.pyc | Bin 0 -> 4440 bytes .../api/__pycache__/items_api.cpython-313.pyc | Bin 0 -> 23776 bytes ...s__resources_templates_api.cpython-313.pyc | Bin 0 -> 22856 bytes .../links_to_compounds_api.cpython-313.pyc | Bin 0 -> 12341 bytes .../links_to_experiments_api.cpython-313.pyc | Bin 0 -> 12460 bytes .../links_to_items_api.cpython-313.pyc | Bin 0 -> 12167 bytes .../notifications_api.cpython-313.pyc | Bin 0 -> 13834 bytes .../__pycache__/reports_api.cpython-313.pyc | Bin 0 -> 5336 bytes .../resources_categories_api.cpython-313.pyc | Bin 0 -> 16922 bytes .../resources_status_api.cpython-313.pyc | Bin 0 -> 16795 bytes .../__pycache__/revisions_api.cpython-313.pyc | Bin 0 -> 12033 bytes .../api/__pycache__/steps_api.cpython-313.pyc | Bin 0 -> 14744 bytes .../storage_units_api.cpython-313.pyc | Bin 0 -> 18139 bytes .../api/__pycache__/tags_api.cpython-313.pyc | Bin 0 -> 17643 bytes .../__pycache__/team_tags_api.cpython-313.pyc | Bin 0 -> 16328 bytes .../teamgroups_api.cpython-313.pyc | Bin 0 -> 16636 bytes .../api/__pycache__/teams_api.cpython-313.pyc | Bin 0 -> 12225 bytes .../__pycache__/todolist_api.cpython-313.pyc | Bin 0 -> 14912 bytes .../unfinished_steps_api.cpython-313.pyc | Bin 0 -> 4314 bytes .../__pycache__/uploads_api.cpython-313.pyc | Bin 0 -> 23422 bytes .../user_uploads_api.cpython-313.pyc | Bin 0 -> 4387 bytes .../api/__pycache__/users_api.cpython-313.pyc | Bin 0 -> 13813 bytes .../elabapi_python/api/api_keys_api.py | 310 ++ .../elabapi_python/api/branding_api.py | 247 ++ .../elabapi_python/api/comments_api.py | 580 ++++ .../elabapi_python/api/compounds_api.py | 409 +++ .../elabapi_python/api/config_api.py | 296 ++ .../elabapi_python/api/containers_api.py | 596 ++++ .../api/custom_fields_keys_api.py | 126 + .../elabapi_python/api/d_space_api.py | 320 ++ .../elabapi_python/api/events_api.py | 510 +++ .../elabapi_python/api/experiments_api.py | 686 ++++ .../api/experiments_categories_api.py | 538 +++ .../api/experiments_status_api.py | 538 +++ .../api/experiments_templates_api.py | 662 ++++ .../elabapi_python/api/exports_api.py | 399 +++ .../elabapi_python/api/favorite_tags_api.py | 304 ++ .../elabapi_python/api/idps_api.py | 1296 ++++++++ .../elabapi_python/api/idps_sources_api.py | 500 +++ .../elabapi_python/api/import_api.py | 231 ++ .../elabapi_python/api/info_api.py | 128 + .../elabapi_python/api/instance_api.py | 130 + .../elabapi_python/api/items_api.py | 686 ++++ .../items_types__resources_templates_api.py | 662 ++++ .../api/links_to_compounds_api.py | 362 +++ .../api/links_to_experiments_api.py | 362 +++ .../elabapi_python/api/links_to_items_api.py | 362 +++ .../elabapi_python/api/notifications_api.py | 431 +++ .../elabapi_python/api/reports_api.py | 136 + .../api/resources_categories_api.py | 538 +++ .../api/resources_status_api.py | 538 +++ .../elabapi_python/api/revisions_api.py | 360 ++ .../elabapi_python/api/steps_api.py | 471 +++ .../elabapi_python/api/storage_units_api.py | 516 +++ .../elabapi_python/api/tags_api.py | 572 ++++ .../elabapi_python/api/team_tags_api.py | 538 +++ .../elabapi_python/api/teamgroups_api.py | 538 +++ .../elabapi_python/api/teams_api.py | 405 +++ .../elabapi_python/api/todolist_api.py | 498 +++ .../api/unfinished_steps_api.py | 122 + .../elabapi_python/api/uploads_api.py | 717 ++++ .../elabapi_python/api/user_uploads_api.py | 126 + .../elabapi_python/api/users_api.py | 429 +++ .../elabapi_python/api_client.py | 632 ++++ .../elabapi_python/configuration.py | 254 ++ .../elabapi_python/models/__init__.py | 142 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 10230 bytes ...ity_editable_metadatamerge.cpython-313.pyc | Bin 0 -> 4181 bytes .../any_ofuploads_subid_body1.cpython-313.pyc | Bin 0 -> 3661 bytes .../models/__pycache__/apikey.cpython-313.pyc | Bin 0 -> 8761 bytes .../__pycache__/apikeys_body.cpython-313.pyc | Bin 0 -> 5169 bytes .../branding_id_body.cpython-313.pyc | Bin 0 -> 5631 bytes .../__pycache__/changelog.cpython-313.pyc | Bin 0 -> 7609 bytes .../__pycache__/comment.cpython-313.pyc | Bin 0 -> 10203 bytes .../__pycache__/compound.cpython-313.pyc | Bin 0 -> 52413 bytes .../compound_create_request.cpython-313.pyc | Bin 0 -> 20142 bytes ...compound_duplicate_request.cpython-313.pyc | Bin 0 -> 6689 bytes .../compounds_body.cpython-313.pyc | Bin 0 -> 3567 bytes ...compounds_links_subid_body.cpython-313.pyc | Bin 0 -> 4779 bytes .../models/__pycache__/config.cpython-313.pyc | Bin 0 -> 85733 bytes .../__pycache__/container.cpython-313.pyc | Bin 0 -> 10867 bytes .../containers_subid_body.cpython-313.pyc | Bin 0 -> 5713 bytes .../containers_subid_body1.cpython-313.pyc | Bin 0 -> 6492 bytes .../__pycache__/dspace_body.cpython-313.pyc | Bin 0 -> 5457 bytes .../__pycache__/dspace_body1.cpython-313.pyc | Bin 0 -> 6329 bytes .../__pycache__/dspace_entity.cpython-313.pyc | Bin 0 -> 5251 bytes .../dspace_metadata.cpython-313.pyc | Bin 0 -> 5127 bytes .../dspace_metadata1.cpython-313.pyc | Bin 0 -> 5147 bytes .../models/__pycache__/entity.cpython-313.pyc | Bin 0 -> 35339 bytes .../entity_and_item_editable.cpython-313.pyc | Bin 0 -> 16483 bytes .../entity_duplicate.cpython-313.pyc | Bin 0 -> 6398 bytes .../entity_editable.cpython-313.pyc | Bin 0 -> 21629 bytes .../entity_template.cpython-313.pyc | Bin 0 -> 37168 bytes .../entity_template_editable.cpython-313.pyc | Bin 0 -> 6240 bytes .../models/__pycache__/error.cpython-313.pyc | Bin 0 -> 5785 bytes .../models/__pycache__/event.cpython-313.pyc | Bin 0 -> 21294 bytes .../__pycache__/event_id_body.cpython-313.pyc | Bin 0 -> 3548 bytes .../__pycache__/eventid_delta.cpython-313.pyc | Bin 0 -> 6366 bytes .../events_id_body.cpython-313.pyc | Bin 0 -> 5937 bytes .../exclusive_edit_mode.cpython-313.pyc | Bin 0 -> 7205 bytes .../__pycache__/experiment.cpython-313.pyc | Bin 0 -> 3950 bytes ...periments_links_subid_body.cpython-313.pyc | Bin 0 -> 4883 bytes ...eriments_templates_id_body.cpython-313.pyc | Bin 0 -> 3701 bytes .../models/__pycache__/export.cpython-313.pyc | Bin 0 -> 16509 bytes .../__pycache__/exports_body.cpython-313.pyc | Bin 0 -> 10526 bytes .../extra_fields_keys.cpython-313.pyc | Bin 0 -> 5128 bytes .../__pycache__/favtags_body.cpython-313.pyc | Bin 0 -> 4287 bytes .../models/__pycache__/id.cpython-313.pyc | Bin 0 -> 3456 bytes .../models/__pycache__/id1.cpython-313.pyc | Bin 0 -> 3466 bytes .../models/__pycache__/id2.cpython-313.pyc | Bin 0 -> 3466 bytes .../models/__pycache__/id3.cpython-313.pyc | Bin 0 -> 3466 bytes .../models/__pycache__/id4.cpython-313.pyc | Bin 0 -> 3466 bytes .../__pycache__/id_certs_body.cpython-313.pyc | Bin 0 -> 5506 bytes .../id_comments_body.cpython-313.pyc | Bin 0 -> 4407 bytes .../id_endpoints_body.cpython-313.pyc | Bin 0 -> 6361 bytes ...xperiments_categories_body.cpython-313.pyc | Bin 0 -> 5397 bytes ...id_experiments_status_body.cpython-313.pyc | Bin 0 -> 5313 bytes .../id_items_status_body.cpython-313.pyc | Bin 0 -> 5193 bytes ..._resources_categories_body.cpython-313.pyc | Bin 0 -> 5357 bytes .../__pycache__/id_steps_body.cpython-313.pyc | Bin 0 -> 4339 bytes .../__pycache__/id_tags_body.cpython-313.pyc | Bin 0 -> 4263 bytes .../__pycache__/id_tags_body1.cpython-313.pyc | Bin 0 -> 3548 bytes .../id_teamgroups_body.cpython-313.pyc | Bin 0 -> 4372 bytes .../id_uploads_body.cpython-313.pyc | Bin 0 -> 5219 bytes .../models/__pycache__/idp.cpython-313.pyc | Bin 0 -> 12215 bytes .../__pycache__/idp_cert.cpython-313.pyc | Bin 0 -> 10376 bytes .../__pycache__/idp_endpoint.cpython-313.pyc | Bin 0 -> 9557 bytes .../__pycache__/idp_source.cpython-313.pyc | Bin 0 -> 7820 bytes .../__pycache__/idps_body.cpython-313.pyc | Bin 0 -> 10026 bytes .../__pycache__/idps_id_body.cpython-313.pyc | Bin 0 -> 4541 bytes .../idps_sources_body.cpython-313.pyc | Bin 0 -> 4474 bytes .../idps_sources_id_body.cpython-313.pyc | Bin 0 -> 5006 bytes .../__pycache__/import_body.cpython-313.pyc | Bin 0 -> 9815 bytes .../inline_response200.cpython-313.pyc | Bin 0 -> 3609 bytes .../inline_response2001.cpython-313.pyc | Bin 0 -> 3619 bytes .../inline_response20010.cpython-313.pyc | Bin 0 -> 5829 bytes ...e_response2001_experiments.cpython-313.pyc | Bin 0 -> 5369 bytes .../inline_response2001_items.cpython-313.pyc | Bin 0 -> 5249 bytes .../inline_response2001_users.cpython-313.pyc | Bin 0 -> 5249 bytes .../inline_response2002.cpython-313.pyc | Bin 0 -> 7285 bytes .../inline_response2003.cpython-313.pyc | Bin 0 -> 5809 bytes .../inline_response2004.cpython-313.pyc | Bin 0 -> 4538 bytes ...ponse2004_query_parameters.cpython-313.pyc | Bin 0 -> 5395 bytes .../inline_response2005.cpython-313.pyc | Bin 0 -> 5689 bytes .../inline_response2006.cpython-313.pyc | Bin 0 -> 10875 bytes .../inline_response2007.cpython-313.pyc | Bin 0 -> 7938 bytes .../inline_response2008.cpython-313.pyc | Bin 0 -> 6597 bytes .../inline_response2009.cpython-313.pyc | Bin 0 -> 3619 bytes ...line_response2009_embedded.cpython-313.pyc | Bin 0 -> 4597 bytes ...ponse2009_embedded_entries.cpython-313.pyc | Bin 0 -> 6568 bytes .../__pycache__/instance_body.cpython-313.pyc | Bin 0 -> 3557 bytes .../models/__pycache__/item.cpython-313.pyc | Bin 0 -> 15184 bytes .../__pycache__/item_editable.cpython-313.pyc | Bin 0 -> 15379 bytes .../items_links_subid_body.cpython-313.pyc | Bin 0 -> 4793 bytes .../items_types_id_body.cpython-313.pyc | Bin 0 -> 3601 bytes .../models/__pycache__/link.cpython-313.pyc | Bin 0 -> 12166 bytes .../__pycache__/metadata.cpython-313.pyc | Bin 0 -> 5219 bytes .../metadata_elabftw.cpython-313.pyc | Bin 0 -> 4644 bytes ...labftw_extra_fields_groups.cpython-313.pyc | Bin 0 -> 5309 bytes .../metadata_extra_fields.cpython-313.pyc | Bin 0 -> 6988 bytes .../__pycache__/notification.cpython-313.pyc | Bin 0 -> 9123 bytes .../notifications_subid_body.cpython-313.pyc | Bin 0 -> 4823 bytes .../__pycache__/patch_action.cpython-313.pyc | Bin 0 -> 6796 bytes .../__pycache__/revision.cpython-313.pyc | Bin 0 -> 8282 bytes .../revisions_subid_body.cpython-313.pyc | Bin 0 -> 4754 bytes .../__pycache__/statuslike.cpython-313.pyc | Bin 0 -> 5534 bytes .../models/__pycache__/step.cpython-313.pyc | Bin 0 -> 9884 bytes .../steps_subid_body.cpython-313.pyc | Bin 0 -> 7053 bytes .../__pycache__/storage_unit.cpython-313.pyc | Bin 0 -> 7523 bytes .../storage_units_body.cpython-313.pyc | Bin 0 -> 5378 bytes .../storage_units_id_body.cpython-313.pyc | Bin 0 -> 5438 bytes .../models/__pycache__/tag.cpython-313.pyc | Bin 0 -> 6716 bytes .../tags_subid_body.cpython-313.pyc | Bin 0 -> 5256 bytes .../tags_subid_body1.cpython-313.pyc | Bin 0 -> 4606 bytes .../models/__pycache__/team.cpython-313.pyc | Bin 0 -> 12618 bytes .../__pycache__/teamgroup.cpython-313.pyc | Bin 0 -> 5548 bytes .../teamgroup_users.cpython-313.pyc | Bin 0 -> 5032 bytes .../teamgroups_subid_body.cpython-313.pyc | Bin 0 -> 3630 bytes .../__pycache__/teams_body.cpython-313.pyc | Bin 0 -> 4270 bytes .../__pycache__/teams_id_body.cpython-313.pyc | Bin 0 -> 3548 bytes .../__pycache__/todoitem.cpython-313.pyc | Bin 0 -> 6910 bytes .../__pycache__/todolist_body.cpython-313.pyc | Bin 0 -> 4337 bytes .../todolist_id_body.cpython-313.pyc | Bin 0 -> 4380 bytes .../unfinished_step.cpython-313.pyc | Bin 0 -> 5658 bytes .../unfinished_steps.cpython-313.pyc | Bin 0 -> 5131 bytes .../models/__pycache__/upload.cpython-313.pyc | Bin 0 -> 13363 bytes .../uploads_subid_body.cpython-313.pyc | Bin 0 -> 5281 bytes .../uploads_subid_body1.cpython-313.pyc | Bin 0 -> 6926 bytes .../models/__pycache__/users.cpython-313.pyc | Bin 0 -> 8850 bytes .../__pycache__/users_body.cpython-313.pyc | Bin 0 -> 9474 bytes .../__pycache__/users_full.cpython-313.pyc | Bin 0 -> 16265 bytes .../users_full_teams.cpython-313.pyc | Bin 0 -> 7099 bytes .../__pycache__/users_id_body.cpython-313.pyc | Bin 0 -> 3548 bytes .../all_ofentity_editable_metadatamerge.py | 90 + .../models/any_ofuploads_subid_body1.py | 84 + .../elabapi_python/models/apikey.py | 292 ++ .../elabapi_python/models/apikeys_body.py | 140 + .../elabapi_python/models/branding_id_body.py | 147 + .../elabapi_python/models/changelog.py | 224 ++ .../elabapi_python/models/comment.py | 344 ++ .../elabapi_python/models/compound.py | 1848 +++++++++++ .../models/compound_create_request.py | 614 ++++ .../models/compound_duplicate_request.py | 173 + .../elabapi_python/models/compounds_body.py | 84 + .../models/compounds_links_subid_body.py | 118 + .../elabapi_python/models/config.py | 2890 +++++++++++++++++ .../elabapi_python/models/container.py | 342 ++ .../models/containers_subid_body.py | 147 + .../models/containers_subid_body1.py | 168 + .../elabapi_python/models/dspace_body.py | 142 + .../elabapi_python/models/dspace_body1.py | 169 + .../elabapi_python/models/dspace_entity.py | 142 + .../elabapi_python/models/dspace_metadata.py | 138 + .../elabapi_python/models/dspace_metadata1.py | 138 + .../elabapi_python/models/entity.py | 1222 +++++++ .../models/entity_and_item_editable.py | 450 +++ .../elabapi_python/models/entity_duplicate.py | 168 + .../elabapi_python/models/entity_editable.py | 628 ++++ .../elabapi_python/models/entity_template.py | 1222 +++++++ .../models/entity_template_editable.py | 146 + .../elabapi_python/models/error.py | 165 + .../elabapi_python/models/event.py | 726 +++++ .../elabapi_python/models/event_id_body.py | 84 + .../elabapi_python/models/eventid_delta.py | 188 ++ .../elabapi_python/models/events_id_body.py | 168 + .../models/exclusive_edit_mode.py | 196 ++ .../elabapi_python/models/experiment.py | 90 + .../models/experiments_links_subid_body.py | 118 + .../models/experiments_templates_id_body.py | 84 + .../elabapi_python/models/export.py | 578 ++++ .../elabapi_python/models/exports_body.py | 315 ++ .../models/extra_fields_keys.py | 136 + .../elabapi_python/models/favtags_body.py | 112 + .../elabapi_python/models/id.py | 84 + .../elabapi_python/models/id1.py | 84 + .../elabapi_python/models/id2.py | 84 + .../elabapi_python/models/id3.py | 84 + .../elabapi_python/models/id4.py | 84 + .../elabapi_python/models/id_certs_body.py | 147 + .../elabapi_python/models/id_comments_body.py | 111 + .../models/id_endpoints_body.py | 175 + .../models/id_experiments_categories_body.py | 140 + .../models/id_experiments_status_body.py | 140 + .../models/id_items_status_body.py | 140 + .../models/id_resources_categories_body.py | 140 + .../elabapi_python/models/id_steps_body.py | 112 + .../elabapi_python/models/id_tags_body.py | 112 + .../elabapi_python/models/id_tags_body1.py | 84 + .../models/id_teamgroups_body.py | 112 + .../elabapi_python/models/id_uploads_body.py | 141 + .../elabapi_python/models/idp.py | 426 +++ .../elabapi_python/models/idp_cert.py | 312 ++ .../elabapi_python/models/idp_endpoint.py | 290 ++ .../elabapi_python/models/idp_source.py | 240 ++ .../elabapi_python/models/idps_body.py | 311 ++ .../elabapi_python/models/idps_id_body.py | 117 + .../models/idps_sources_body.py | 113 + .../models/idps_sources_id_body.py | 119 + .../elabapi_python/models/import_body.py | 272 ++ .../models/inline_response200.py | 84 + .../models/inline_response2001.py | 84 + .../models/inline_response20010.py | 162 + .../models/inline_response2001_experiments.py | 136 + .../models/inline_response2001_items.py | 136 + .../models/inline_response2001_users.py | 136 + .../models/inline_response2002.py | 196 ++ .../models/inline_response2003.py | 162 + .../models/inline_response2004.py | 110 + .../inline_response2004_query_parameters.py | 136 + .../models/inline_response2005.py | 162 + .../models/inline_response2006.py | 344 ++ .../models/inline_response2007.py | 240 ++ .../models/inline_response2008.py | 188 ++ .../models/inline_response2009.py | 84 + .../models/inline_response2009_embedded.py | 110 + .../inline_response2009_embedded_entries.py | 169 + .../elabapi_python/models/instance_body.py | 84 + .../elabapi_python/models/item.py | 450 +++ .../elabapi_python/models/item_editable.py | 444 +++ .../models/items_links_subid_body.py | 118 + .../models/items_types_id_body.py | 84 + .../elabapi_python/models/link.py | 422 +++ .../elabapi_python/models/metadata.py | 138 + .../elabapi_python/models/metadata_elabftw.py | 112 + .../metadata_elabftw_extra_fields_groups.py | 136 + .../models/metadata_extra_fields.py | 194 ++ .../elabapi_python/models/notification.py | 292 ++ .../models/notifications_subid_body.py | 118 + .../elabapi_python/models/patch_action.py | 179 + .../elabapi_python/models/revision.py | 266 ++ .../models/revisions_subid_body.py | 118 + .../elabapi_python/models/statuslike.py | 162 + .../elabapi_python/models/step.py | 326 ++ .../elabapi_python/models/steps_subid_body.py | 203 ++ .../elabapi_python/models/storage_unit.py | 224 ++ .../models/storage_units_body.py | 141 + .../models/storage_units_id_body.py | 140 + .../elabapi_python/models/tag.py | 214 ++ .../elabapi_python/models/tags_subid_body.py | 144 + .../elabapi_python/models/tags_subid_body1.py | 117 + .../elabapi_python/models/team.py | 410 +++ .../elabapi_python/models/teamgroup.py | 162 + .../elabapi_python/models/teamgroup_users.py | 136 + .../models/teamgroups_subid_body.py | 84 + .../elabapi_python/models/teams_body.py | 112 + .../elabapi_python/models/teams_id_body.py | 84 + .../elabapi_python/models/todoitem.py | 214 ++ .../elabapi_python/models/todolist_body.py | 112 + .../elabapi_python/models/todolist_id_body.py | 111 + .../elabapi_python/models/unfinished_step.py | 162 + .../elabapi_python/models/unfinished_steps.py | 136 + .../elabapi_python/models/upload.py | 474 +++ .../models/uploads_subid_body.py | 141 + .../models/uploads_subid_body1.py | 200 ++ .../elabapi_python/models/users.py | 294 ++ .../elabapi_python/models/users_body.py | 289 ++ .../elabapi_python/models/users_full.py | 482 +++ .../elabapi_python/models/users_full_teams.py | 214 ++ .../elabapi_python/models/users_id_body.py | 84 + vendor/elabapi-python/elabapi_python/rest.py | 317 ++ vendor/elabapi-python/setup.cfg | 4 + vendor/elabapi-python/setup.py | 39 + vendor/elabapi-python/test/__init__.py | 1 + ...est_all_ofentity_editable_metadatamerge.py | 39 + .../test/test_any_ofuploads_subid_body1.py | 39 + .../elabapi-python/test/test_api_keys_api.py | 54 + vendor/elabapi-python/test/test_apikey.py | 39 + .../elabapi-python/test/test_apikeys_body.py | 39 + .../elabapi-python/test/test_branding_api.py | 47 + .../test/test_branding_id_body.py | 39 + vendor/elabapi-python/test/test_changelog.py | 39 + vendor/elabapi-python/test/test_comment.py | 39 + .../elabapi-python/test/test_comments_api.py | 68 + vendor/elabapi-python/test/test_compound.py | 39 + .../test/test_compound_create_request.py | 39 + .../test/test_compound_duplicate_request.py | 39 + .../elabapi-python/test/test_compounds_api.py | 61 + .../test/test_compounds_body.py | 39 + .../test/test_compounds_links_subid_body.py | 39 + vendor/elabapi-python/test/test_config.py | 39 + vendor/elabapi-python/test/test_config_api.py | 54 + vendor/elabapi-python/test/test_container.py | 39 + .../test/test_containers_api.py | 68 + .../test/test_containers_subid_body.py | 39 + .../test/test_containers_subid_body1.py | 39 + .../test/test_custom_fields_keys_api.py | 40 + .../elabapi-python/test/test_d_space_api.py | 54 + .../elabapi-python/test/test_dspace_body.py | 39 + .../elabapi-python/test/test_dspace_body1.py | 39 + .../elabapi-python/test/test_dspace_entity.py | 39 + .../test/test_dspace_metadata.py | 39 + .../test/test_dspace_metadata1.py | 39 + vendor/elabapi-python/test/test_entity.py | 39 + .../test/test_entity_and_item_editable.py | 39 + .../test/test_entity_duplicate.py | 39 + .../test/test_entity_editable.py | 39 + .../test/test_entity_template.py | 39 + .../test/test_entity_template_editable.py | 39 + vendor/elabapi-python/test/test_error.py | 39 + vendor/elabapi-python/test/test_event.py | 39 + .../elabapi-python/test/test_event_id_body.py | 39 + .../elabapi-python/test/test_eventid_delta.py | 39 + vendor/elabapi-python/test/test_events_api.py | 68 + .../test/test_events_id_body.py | 39 + .../test/test_exclusive_edit_mode.py | 39 + vendor/elabapi-python/test/test_experiment.py | 39 + .../test/test_experiments_api.py | 75 + .../test/test_experiments_categories_api.py | 68 + .../test/test_experiments_links_subid_body.py | 39 + .../test/test_experiments_status_api.py | 68 + .../test/test_experiments_templates_api.py | 75 + .../test_experiments_templates_id_body.py | 39 + vendor/elabapi-python/test/test_export.py | 39 + .../elabapi-python/test/test_exports_api.py | 61 + .../elabapi-python/test/test_exports_body.py | 39 + .../test/test_extra_fields_keys.py | 39 + .../test/test_favorite_tags_api.py | 54 + .../elabapi-python/test/test_favtags_body.py | 39 + vendor/elabapi-python/test/test_id.py | 39 + vendor/elabapi-python/test/test_id1.py | 39 + vendor/elabapi-python/test/test_id2.py | 39 + vendor/elabapi-python/test/test_id3.py | 39 + vendor/elabapi-python/test/test_id4.py | 39 + .../elabapi-python/test/test_id_certs_body.py | 39 + .../test/test_id_comments_body.py | 39 + .../test/test_id_endpoints_body.py | 39 + .../test_id_experiments_categories_body.py | 39 + .../test/test_id_experiments_status_body.py | 39 + .../test/test_id_items_status_body.py | 39 + .../test/test_id_resources_categories_body.py | 39 + .../elabapi-python/test/test_id_steps_body.py | 39 + .../elabapi-python/test/test_id_tags_body.py | 39 + .../elabapi-python/test/test_id_tags_body1.py | 39 + .../test/test_id_teamgroups_body.py | 39 + .../test/test_id_uploads_body.py | 39 + vendor/elabapi-python/test/test_idp.py | 39 + vendor/elabapi-python/test/test_idp_cert.py | 39 + .../elabapi-python/test/test_idp_endpoint.py | 39 + vendor/elabapi-python/test/test_idp_source.py | 39 + vendor/elabapi-python/test/test_idps_api.py | 124 + vendor/elabapi-python/test/test_idps_body.py | 39 + .../elabapi-python/test/test_idps_id_body.py | 39 + .../test/test_idps_sources_api.py | 68 + .../test/test_idps_sources_body.py | 39 + .../test/test_idps_sources_id_body.py | 39 + vendor/elabapi-python/test/test_import_api.py | 47 + .../elabapi-python/test/test_import_body.py | 39 + vendor/elabapi-python/test/test_info_api.py | 40 + .../test/test_inline_response200.py | 39 + .../test/test_inline_response2001.py | 39 + .../test/test_inline_response20010.py | 39 + .../test_inline_response2001_experiments.py | 39 + .../test/test_inline_response2001_items.py | 39 + .../test/test_inline_response2001_users.py | 39 + .../test/test_inline_response2002.py | 39 + .../test/test_inline_response2003.py | 39 + .../test/test_inline_response2004.py | 39 + ...st_inline_response2004_query_parameters.py | 39 + .../test/test_inline_response2005.py | 39 + .../test/test_inline_response2006.py | 39 + .../test/test_inline_response2007.py | 39 + .../test/test_inline_response2008.py | 39 + .../test/test_inline_response2009.py | 39 + .../test/test_inline_response2009_embedded.py | 39 + ...st_inline_response2009_embedded_entries.py | 39 + .../elabapi-python/test/test_instance_api.py | 40 + .../elabapi-python/test/test_instance_body.py | 39 + vendor/elabapi-python/test/test_item.py | 39 + .../elabapi-python/test/test_item_editable.py | 39 + vendor/elabapi-python/test/test_items_api.py | 75 + .../test/test_items_links_subid_body.py | 39 + ...st_items_types__resources_templates_api.py | 75 + .../test/test_items_types_id_body.py | 39 + vendor/elabapi-python/test/test_link.py | 39 + .../test/test_links_to_compounds_api.py | 54 + .../test/test_links_to_experiments_api.py | 54 + .../test/test_links_to_items_api.py | 54 + vendor/elabapi-python/test/test_metadata.py | 39 + .../test/test_metadata_elabftw.py | 39 + ...st_metadata_elabftw_extra_fields_groups.py | 39 + .../test/test_metadata_extra_fields.py | 39 + .../elabapi-python/test/test_notification.py | 39 + .../test/test_notifications_api.py | 61 + .../test/test_notifications_subid_body.py | 39 + .../elabapi-python/test/test_patch_action.py | 39 + .../elabapi-python/test/test_reports_api.py | 40 + .../test/test_resources_categories_api.py | 68 + .../test/test_resources_status_api.py | 68 + vendor/elabapi-python/test/test_revision.py | 39 + .../elabapi-python/test/test_revisions_api.py | 54 + .../test/test_revisions_subid_body.py | 39 + vendor/elabapi-python/test/test_statuslike.py | 39 + vendor/elabapi-python/test/test_step.py | 39 + vendor/elabapi-python/test/test_steps_api.py | 61 + .../test/test_steps_subid_body.py | 39 + .../elabapi-python/test/test_storage_unit.py | 39 + .../test/test_storage_units_api.py | 68 + .../test/test_storage_units_body.py | 39 + .../test/test_storage_units_id_body.py | 39 + vendor/elabapi-python/test/test_tag.py | 39 + vendor/elabapi-python/test/test_tags_api.py | 68 + .../test/test_tags_subid_body.py | 39 + .../test/test_tags_subid_body1.py | 39 + vendor/elabapi-python/test/test_team.py | 39 + .../elabapi-python/test/test_team_tags_api.py | 68 + vendor/elabapi-python/test/test_teamgroup.py | 39 + .../test/test_teamgroup_users.py | 39 + .../test/test_teamgroups_api.py | 68 + .../test/test_teamgroups_subid_body.py | 39 + vendor/elabapi-python/test/test_teams_api.py | 61 + vendor/elabapi-python/test/test_teams_body.py | 39 + .../elabapi-python/test/test_teams_id_body.py | 39 + vendor/elabapi-python/test/test_todoitem.py | 39 + .../elabapi-python/test/test_todolist_api.py | 68 + .../elabapi-python/test/test_todolist_body.py | 39 + .../test/test_todolist_id_body.py | 39 + .../test/test_unfinished_step.py | 39 + .../test/test_unfinished_steps.py | 39 + .../test/test_unfinished_steps_api.py | 40 + vendor/elabapi-python/test/test_upload.py | 39 + .../elabapi-python/test/test_uploads_api.py | 75 + .../test/test_uploads_subid_body.py | 39 + .../test/test_uploads_subid_body1.py | 39 + .../test/test_user_uploads_api.py | 40 + vendor/elabapi-python/test/test_users.py | 39 + vendor/elabapi-python/test/test_users_api.py | 61 + vendor/elabapi-python/test/test_users_body.py | 39 + vendor/elabapi-python/test/test_users_full.py | 39 + .../test/test_users_full_teams.py | 39 + .../elabapi-python/test/test_users_id_body.py | 39 + 612 files changed, 64514 insertions(+) create mode 100644 planning/mcp-server-plan.md create mode 100644 pyproject.toml create mode 100644 src/mcp_server/__init__.py create mode 100644 src/mcp_server/__main__.py create mode 100644 src/mcp_server/__pycache__/__init__.cpython-313.pyc create mode 100644 src/mcp_server/__pycache__/allocate.cpython-313.pyc create mode 100644 src/mcp_server/__pycache__/annotate.cpython-313.pyc create mode 100644 src/mcp_server/__pycache__/config.cpython-313.pyc create mode 100644 src/mcp_server/__pycache__/elabftw.cpython-313.pyc create mode 100644 src/mcp_server/__pycache__/errors.cpython-313.pyc create mode 100644 src/mcp_server/__pycache__/journal.cpython-313.pyc create mode 100644 src/mcp_server/__pycache__/models.cpython-313.pyc create mode 100644 src/mcp_server/__pycache__/resolve.cpython-313.pyc create mode 100644 src/mcp_server/__pycache__/rest.cpython-313.pyc create mode 100644 src/mcp_server/__pycache__/schemas.cpython-313.pyc create mode 100644 src/mcp_server/__pycache__/templates.cpython-313.pyc create mode 100644 src/mcp_server/__pycache__/tools.cpython-313.pyc create mode 100644 src/mcp_server/allocate.py create mode 100644 src/mcp_server/annotate.py create mode 100644 src/mcp_server/config.py create mode 100644 src/mcp_server/elabftw.py create mode 100644 src/mcp_server/errors.py create mode 100644 src/mcp_server/journal.py create mode 100644 src/mcp_server/models.py create mode 100644 src/mcp_server/resolve.py create mode 100644 src/mcp_server/rest.py create mode 100644 src/mcp_server/schemas.py create mode 100644 src/mcp_server/server.py create mode 100644 src/mcp_server/templates.py create mode 100644 src/mcp_server/tools.py create mode 100644 src/mcp_server/workflows/__init__.py create mode 100644 src/mcp_server/workflows/__pycache__/__init__.cpython-313.pyc create mode 100644 src/mcp_server/workflows/__pycache__/inventory.cpython-313.pyc create mode 100644 src/mcp_server/workflows/__pycache__/protocol.cpython-313.pyc create mode 100644 src/mcp_server/workflows/__pycache__/setup.cpython-313.pyc create mode 100644 src/mcp_server/workflows/inventory.py create mode 100644 src/mcp_server/workflows/protocol.py create mode 100644 src/mcp_server/workflows/setup.py create mode 100644 tests/__pycache__/conftest.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/conftest.cpython-313.pyc create mode 100644 tests/__pycache__/fakes.cpython-313.pyc create mode 100644 tests/__pycache__/test_allocate.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_allocate.cpython-313.pyc create mode 100644 tests/__pycache__/test_annotate.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_annotate.cpython-313.pyc create mode 100644 tests/__pycache__/test_config.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_config.cpython-313.pyc create mode 100644 tests/__pycache__/test_elabftw_adapter.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_elabftw_adapter.cpython-313.pyc create mode 100644 tests/__pycache__/test_errors.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_errors.cpython-313.pyc create mode 100644 tests/__pycache__/test_journal.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_journal.cpython-313.pyc create mode 100644 tests/__pycache__/test_models.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_models.cpython-313.pyc create mode 100644 tests/__pycache__/test_resolve.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_resolve.cpython-313.pyc create mode 100644 tests/__pycache__/test_rest_api.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_rest_api.cpython-313.pyc create mode 100644 tests/__pycache__/test_safety.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_safety.cpython-313.pyc create mode 100644 tests/__pycache__/test_templates.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_templates.cpython-313.pyc create mode 100644 tests/__pycache__/test_tools_mcp.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_tools_mcp.cpython-313.pyc create mode 100644 tests/__pycache__/test_workflows_inventory.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_workflows_inventory.cpython-313.pyc create mode 100644 tests/__pycache__/test_workflows_protocol.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_workflows_protocol.cpython-313.pyc create mode 100644 tests/__pycache__/test_workflows_setup.cpython-313-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_workflows_setup.cpython-313.pyc create mode 100644 tests/conftest.py create mode 100644 tests/fakes.py create mode 100644 tests/test_allocate.py create mode 100644 tests/test_annotate.py create mode 100644 tests/test_config.py create mode 100644 tests/test_elabftw_adapter.py create mode 100644 tests/test_errors.py create mode 100644 tests/test_journal.py create mode 100644 tests/test_models.py create mode 100644 tests/test_resolve.py create mode 100644 tests/test_rest_api.py create mode 100644 tests/test_safety.py create mode 100644 tests/test_templates.py create mode 100644 tests/test_tools_mcp.py create mode 100644 tests/test_workflows_inventory.py create mode 100644 tests/test_workflows_protocol.py create mode 100644 tests/test_workflows_setup.py create mode 100644 uv.lock create mode 100644 vendor/elabapi-python/PKG-INFO create mode 100644 vendor/elabapi-python/README.md create mode 100644 vendor/elabapi-python/elabapi_python.egg-info/PKG-INFO create mode 100644 vendor/elabapi-python/elabapi_python.egg-info/SOURCES.txt create mode 100644 vendor/elabapi-python/elabapi_python.egg-info/dependency_links.txt create mode 100644 vendor/elabapi-python/elabapi_python.egg-info/requires.txt create mode 100644 vendor/elabapi-python/elabapi_python.egg-info/top_level.txt create mode 100644 vendor/elabapi-python/elabapi_python/__init__.py create mode 100644 vendor/elabapi-python/elabapi_python/__pycache__/__init__.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/__pycache__/api_client.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/__pycache__/configuration.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/__pycache__/rest.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__init__.py create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/__init__.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/api_keys_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/branding_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/comments_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/compounds_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/config_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/containers_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/custom_fields_keys_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/d_space_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/events_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/experiments_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/experiments_categories_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/experiments_status_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/experiments_templates_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/exports_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/favorite_tags_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/idps_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/idps_sources_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/import_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/info_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/instance_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/items_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/items_types__resources_templates_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/links_to_compounds_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/links_to_experiments_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/links_to_items_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/notifications_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/reports_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/resources_categories_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/resources_status_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/revisions_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/steps_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/storage_units_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/tags_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/team_tags_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/teamgroups_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/teams_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/todolist_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/unfinished_steps_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/uploads_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/user_uploads_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/__pycache__/users_api.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/api/api_keys_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/branding_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/comments_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/compounds_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/config_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/containers_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/custom_fields_keys_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/d_space_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/events_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/experiments_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/experiments_categories_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/experiments_status_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/experiments_templates_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/exports_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/favorite_tags_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/idps_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/idps_sources_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/import_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/info_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/instance_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/items_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/items_types__resources_templates_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/links_to_compounds_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/links_to_experiments_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/links_to_items_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/notifications_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/reports_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/resources_categories_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/resources_status_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/revisions_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/steps_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/storage_units_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/tags_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/team_tags_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/teamgroups_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/teams_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/todolist_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/unfinished_steps_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/uploads_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/user_uploads_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api/users_api.py create mode 100644 vendor/elabapi-python/elabapi_python/api_client.py create mode 100644 vendor/elabapi-python/elabapi_python/configuration.py create mode 100644 vendor/elabapi-python/elabapi_python/models/__init__.py create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/__init__.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/all_ofentity_editable_metadatamerge.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/any_ofuploads_subid_body1.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/apikey.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/apikeys_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/branding_id_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/changelog.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/comment.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/compound.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/compound_create_request.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/compound_duplicate_request.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/compounds_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/compounds_links_subid_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/config.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/container.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/containers_subid_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/containers_subid_body1.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/dspace_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/dspace_body1.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/dspace_entity.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/dspace_metadata.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/dspace_metadata1.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/entity.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/entity_and_item_editable.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/entity_duplicate.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/entity_editable.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/entity_template.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/entity_template_editable.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/error.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/event.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/event_id_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/eventid_delta.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/events_id_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/exclusive_edit_mode.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/experiment.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/experiments_links_subid_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/experiments_templates_id_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/export.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/exports_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/extra_fields_keys.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/favtags_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id1.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id2.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id3.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id4.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id_certs_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id_comments_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id_endpoints_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id_experiments_categories_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id_experiments_status_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id_items_status_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id_resources_categories_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id_steps_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id_tags_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id_tags_body1.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id_teamgroups_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/id_uploads_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/idp.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/idp_cert.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/idp_endpoint.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/idp_source.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/idps_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/idps_id_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/idps_sources_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/idps_sources_id_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/import_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response200.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2001.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response20010.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2001_experiments.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2001_items.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2001_users.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2002.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2003.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2004.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2004_query_parameters.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2005.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2006.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2007.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2008.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2009.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2009_embedded.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2009_embedded_entries.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/instance_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/item.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/item_editable.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/items_links_subid_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/items_types_id_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/link.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/metadata.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/metadata_elabftw.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/metadata_elabftw_extra_fields_groups.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/metadata_extra_fields.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/notification.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/notifications_subid_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/patch_action.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/revision.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/revisions_subid_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/statuslike.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/step.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/steps_subid_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/storage_unit.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/storage_units_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/storage_units_id_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/tag.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/tags_subid_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/tags_subid_body1.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/team.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/teamgroup.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/teamgroup_users.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/teamgroups_subid_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/teams_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/teams_id_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/todoitem.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/todolist_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/todolist_id_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/unfinished_step.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/unfinished_steps.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/upload.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/uploads_subid_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/uploads_subid_body1.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/users.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/users_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/users_full.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/users_full_teams.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/__pycache__/users_id_body.cpython-313.pyc create mode 100644 vendor/elabapi-python/elabapi_python/models/all_ofentity_editable_metadatamerge.py create mode 100644 vendor/elabapi-python/elabapi_python/models/any_ofuploads_subid_body1.py create mode 100644 vendor/elabapi-python/elabapi_python/models/apikey.py create mode 100644 vendor/elabapi-python/elabapi_python/models/apikeys_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/branding_id_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/changelog.py create mode 100644 vendor/elabapi-python/elabapi_python/models/comment.py create mode 100644 vendor/elabapi-python/elabapi_python/models/compound.py create mode 100644 vendor/elabapi-python/elabapi_python/models/compound_create_request.py create mode 100644 vendor/elabapi-python/elabapi_python/models/compound_duplicate_request.py create mode 100644 vendor/elabapi-python/elabapi_python/models/compounds_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/compounds_links_subid_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/config.py create mode 100644 vendor/elabapi-python/elabapi_python/models/container.py create mode 100644 vendor/elabapi-python/elabapi_python/models/containers_subid_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/containers_subid_body1.py create mode 100644 vendor/elabapi-python/elabapi_python/models/dspace_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/dspace_body1.py create mode 100644 vendor/elabapi-python/elabapi_python/models/dspace_entity.py create mode 100644 vendor/elabapi-python/elabapi_python/models/dspace_metadata.py create mode 100644 vendor/elabapi-python/elabapi_python/models/dspace_metadata1.py create mode 100644 vendor/elabapi-python/elabapi_python/models/entity.py create mode 100644 vendor/elabapi-python/elabapi_python/models/entity_and_item_editable.py create mode 100644 vendor/elabapi-python/elabapi_python/models/entity_duplicate.py create mode 100644 vendor/elabapi-python/elabapi_python/models/entity_editable.py create mode 100644 vendor/elabapi-python/elabapi_python/models/entity_template.py create mode 100644 vendor/elabapi-python/elabapi_python/models/entity_template_editable.py create mode 100644 vendor/elabapi-python/elabapi_python/models/error.py create mode 100644 vendor/elabapi-python/elabapi_python/models/event.py create mode 100644 vendor/elabapi-python/elabapi_python/models/event_id_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/eventid_delta.py create mode 100644 vendor/elabapi-python/elabapi_python/models/events_id_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/exclusive_edit_mode.py create mode 100644 vendor/elabapi-python/elabapi_python/models/experiment.py create mode 100644 vendor/elabapi-python/elabapi_python/models/experiments_links_subid_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/experiments_templates_id_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/export.py create mode 100644 vendor/elabapi-python/elabapi_python/models/exports_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/extra_fields_keys.py create mode 100644 vendor/elabapi-python/elabapi_python/models/favtags_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id1.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id2.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id3.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id4.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id_certs_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id_comments_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id_endpoints_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id_experiments_categories_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id_experiments_status_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id_items_status_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id_resources_categories_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id_steps_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id_tags_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id_tags_body1.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id_teamgroups_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/id_uploads_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/idp.py create mode 100644 vendor/elabapi-python/elabapi_python/models/idp_cert.py create mode 100644 vendor/elabapi-python/elabapi_python/models/idp_endpoint.py create mode 100644 vendor/elabapi-python/elabapi_python/models/idp_source.py create mode 100644 vendor/elabapi-python/elabapi_python/models/idps_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/idps_id_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/idps_sources_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/idps_sources_id_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/import_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response200.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2001.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response20010.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2001_experiments.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2001_items.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2001_users.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2002.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2003.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2004.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2004_query_parameters.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2005.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2006.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2007.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2008.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2009.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2009_embedded.py create mode 100644 vendor/elabapi-python/elabapi_python/models/inline_response2009_embedded_entries.py create mode 100644 vendor/elabapi-python/elabapi_python/models/instance_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/item.py create mode 100644 vendor/elabapi-python/elabapi_python/models/item_editable.py create mode 100644 vendor/elabapi-python/elabapi_python/models/items_links_subid_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/items_types_id_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/link.py create mode 100644 vendor/elabapi-python/elabapi_python/models/metadata.py create mode 100644 vendor/elabapi-python/elabapi_python/models/metadata_elabftw.py create mode 100644 vendor/elabapi-python/elabapi_python/models/metadata_elabftw_extra_fields_groups.py create mode 100644 vendor/elabapi-python/elabapi_python/models/metadata_extra_fields.py create mode 100644 vendor/elabapi-python/elabapi_python/models/notification.py create mode 100644 vendor/elabapi-python/elabapi_python/models/notifications_subid_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/patch_action.py create mode 100644 vendor/elabapi-python/elabapi_python/models/revision.py create mode 100644 vendor/elabapi-python/elabapi_python/models/revisions_subid_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/statuslike.py create mode 100644 vendor/elabapi-python/elabapi_python/models/step.py create mode 100644 vendor/elabapi-python/elabapi_python/models/steps_subid_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/storage_unit.py create mode 100644 vendor/elabapi-python/elabapi_python/models/storage_units_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/storage_units_id_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/tag.py create mode 100644 vendor/elabapi-python/elabapi_python/models/tags_subid_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/tags_subid_body1.py create mode 100644 vendor/elabapi-python/elabapi_python/models/team.py create mode 100644 vendor/elabapi-python/elabapi_python/models/teamgroup.py create mode 100644 vendor/elabapi-python/elabapi_python/models/teamgroup_users.py create mode 100644 vendor/elabapi-python/elabapi_python/models/teamgroups_subid_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/teams_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/teams_id_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/todoitem.py create mode 100644 vendor/elabapi-python/elabapi_python/models/todolist_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/todolist_id_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/unfinished_step.py create mode 100644 vendor/elabapi-python/elabapi_python/models/unfinished_steps.py create mode 100644 vendor/elabapi-python/elabapi_python/models/upload.py create mode 100644 vendor/elabapi-python/elabapi_python/models/uploads_subid_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/uploads_subid_body1.py create mode 100644 vendor/elabapi-python/elabapi_python/models/users.py create mode 100644 vendor/elabapi-python/elabapi_python/models/users_body.py create mode 100644 vendor/elabapi-python/elabapi_python/models/users_full.py create mode 100644 vendor/elabapi-python/elabapi_python/models/users_full_teams.py create mode 100644 vendor/elabapi-python/elabapi_python/models/users_id_body.py create mode 100644 vendor/elabapi-python/elabapi_python/rest.py create mode 100644 vendor/elabapi-python/setup.cfg create mode 100644 vendor/elabapi-python/setup.py create mode 100644 vendor/elabapi-python/test/__init__.py create mode 100644 vendor/elabapi-python/test/test_all_ofentity_editable_metadatamerge.py create mode 100644 vendor/elabapi-python/test/test_any_ofuploads_subid_body1.py create mode 100644 vendor/elabapi-python/test/test_api_keys_api.py create mode 100644 vendor/elabapi-python/test/test_apikey.py create mode 100644 vendor/elabapi-python/test/test_apikeys_body.py create mode 100644 vendor/elabapi-python/test/test_branding_api.py create mode 100644 vendor/elabapi-python/test/test_branding_id_body.py create mode 100644 vendor/elabapi-python/test/test_changelog.py create mode 100644 vendor/elabapi-python/test/test_comment.py create mode 100644 vendor/elabapi-python/test/test_comments_api.py create mode 100644 vendor/elabapi-python/test/test_compound.py create mode 100644 vendor/elabapi-python/test/test_compound_create_request.py create mode 100644 vendor/elabapi-python/test/test_compound_duplicate_request.py create mode 100644 vendor/elabapi-python/test/test_compounds_api.py create mode 100644 vendor/elabapi-python/test/test_compounds_body.py create mode 100644 vendor/elabapi-python/test/test_compounds_links_subid_body.py create mode 100644 vendor/elabapi-python/test/test_config.py create mode 100644 vendor/elabapi-python/test/test_config_api.py create mode 100644 vendor/elabapi-python/test/test_container.py create mode 100644 vendor/elabapi-python/test/test_containers_api.py create mode 100644 vendor/elabapi-python/test/test_containers_subid_body.py create mode 100644 vendor/elabapi-python/test/test_containers_subid_body1.py create mode 100644 vendor/elabapi-python/test/test_custom_fields_keys_api.py create mode 100644 vendor/elabapi-python/test/test_d_space_api.py create mode 100644 vendor/elabapi-python/test/test_dspace_body.py create mode 100644 vendor/elabapi-python/test/test_dspace_body1.py create mode 100644 vendor/elabapi-python/test/test_dspace_entity.py create mode 100644 vendor/elabapi-python/test/test_dspace_metadata.py create mode 100644 vendor/elabapi-python/test/test_dspace_metadata1.py create mode 100644 vendor/elabapi-python/test/test_entity.py create mode 100644 vendor/elabapi-python/test/test_entity_and_item_editable.py create mode 100644 vendor/elabapi-python/test/test_entity_duplicate.py create mode 100644 vendor/elabapi-python/test/test_entity_editable.py create mode 100644 vendor/elabapi-python/test/test_entity_template.py create mode 100644 vendor/elabapi-python/test/test_entity_template_editable.py create mode 100644 vendor/elabapi-python/test/test_error.py create mode 100644 vendor/elabapi-python/test/test_event.py create mode 100644 vendor/elabapi-python/test/test_event_id_body.py create mode 100644 vendor/elabapi-python/test/test_eventid_delta.py create mode 100644 vendor/elabapi-python/test/test_events_api.py create mode 100644 vendor/elabapi-python/test/test_events_id_body.py create mode 100644 vendor/elabapi-python/test/test_exclusive_edit_mode.py create mode 100644 vendor/elabapi-python/test/test_experiment.py create mode 100644 vendor/elabapi-python/test/test_experiments_api.py create mode 100644 vendor/elabapi-python/test/test_experiments_categories_api.py create mode 100644 vendor/elabapi-python/test/test_experiments_links_subid_body.py create mode 100644 vendor/elabapi-python/test/test_experiments_status_api.py create mode 100644 vendor/elabapi-python/test/test_experiments_templates_api.py create mode 100644 vendor/elabapi-python/test/test_experiments_templates_id_body.py create mode 100644 vendor/elabapi-python/test/test_export.py create mode 100644 vendor/elabapi-python/test/test_exports_api.py create mode 100644 vendor/elabapi-python/test/test_exports_body.py create mode 100644 vendor/elabapi-python/test/test_extra_fields_keys.py create mode 100644 vendor/elabapi-python/test/test_favorite_tags_api.py create mode 100644 vendor/elabapi-python/test/test_favtags_body.py create mode 100644 vendor/elabapi-python/test/test_id.py create mode 100644 vendor/elabapi-python/test/test_id1.py create mode 100644 vendor/elabapi-python/test/test_id2.py create mode 100644 vendor/elabapi-python/test/test_id3.py create mode 100644 vendor/elabapi-python/test/test_id4.py create mode 100644 vendor/elabapi-python/test/test_id_certs_body.py create mode 100644 vendor/elabapi-python/test/test_id_comments_body.py create mode 100644 vendor/elabapi-python/test/test_id_endpoints_body.py create mode 100644 vendor/elabapi-python/test/test_id_experiments_categories_body.py create mode 100644 vendor/elabapi-python/test/test_id_experiments_status_body.py create mode 100644 vendor/elabapi-python/test/test_id_items_status_body.py create mode 100644 vendor/elabapi-python/test/test_id_resources_categories_body.py create mode 100644 vendor/elabapi-python/test/test_id_steps_body.py create mode 100644 vendor/elabapi-python/test/test_id_tags_body.py create mode 100644 vendor/elabapi-python/test/test_id_tags_body1.py create mode 100644 vendor/elabapi-python/test/test_id_teamgroups_body.py create mode 100644 vendor/elabapi-python/test/test_id_uploads_body.py create mode 100644 vendor/elabapi-python/test/test_idp.py create mode 100644 vendor/elabapi-python/test/test_idp_cert.py create mode 100644 vendor/elabapi-python/test/test_idp_endpoint.py create mode 100644 vendor/elabapi-python/test/test_idp_source.py create mode 100644 vendor/elabapi-python/test/test_idps_api.py create mode 100644 vendor/elabapi-python/test/test_idps_body.py create mode 100644 vendor/elabapi-python/test/test_idps_id_body.py create mode 100644 vendor/elabapi-python/test/test_idps_sources_api.py create mode 100644 vendor/elabapi-python/test/test_idps_sources_body.py create mode 100644 vendor/elabapi-python/test/test_idps_sources_id_body.py create mode 100644 vendor/elabapi-python/test/test_import_api.py create mode 100644 vendor/elabapi-python/test/test_import_body.py create mode 100644 vendor/elabapi-python/test/test_info_api.py create mode 100644 vendor/elabapi-python/test/test_inline_response200.py create mode 100644 vendor/elabapi-python/test/test_inline_response2001.py create mode 100644 vendor/elabapi-python/test/test_inline_response20010.py create mode 100644 vendor/elabapi-python/test/test_inline_response2001_experiments.py create mode 100644 vendor/elabapi-python/test/test_inline_response2001_items.py create mode 100644 vendor/elabapi-python/test/test_inline_response2001_users.py create mode 100644 vendor/elabapi-python/test/test_inline_response2002.py create mode 100644 vendor/elabapi-python/test/test_inline_response2003.py create mode 100644 vendor/elabapi-python/test/test_inline_response2004.py create mode 100644 vendor/elabapi-python/test/test_inline_response2004_query_parameters.py create mode 100644 vendor/elabapi-python/test/test_inline_response2005.py create mode 100644 vendor/elabapi-python/test/test_inline_response2006.py create mode 100644 vendor/elabapi-python/test/test_inline_response2007.py create mode 100644 vendor/elabapi-python/test/test_inline_response2008.py create mode 100644 vendor/elabapi-python/test/test_inline_response2009.py create mode 100644 vendor/elabapi-python/test/test_inline_response2009_embedded.py create mode 100644 vendor/elabapi-python/test/test_inline_response2009_embedded_entries.py create mode 100644 vendor/elabapi-python/test/test_instance_api.py create mode 100644 vendor/elabapi-python/test/test_instance_body.py create mode 100644 vendor/elabapi-python/test/test_item.py create mode 100644 vendor/elabapi-python/test/test_item_editable.py create mode 100644 vendor/elabapi-python/test/test_items_api.py create mode 100644 vendor/elabapi-python/test/test_items_links_subid_body.py create mode 100644 vendor/elabapi-python/test/test_items_types__resources_templates_api.py create mode 100644 vendor/elabapi-python/test/test_items_types_id_body.py create mode 100644 vendor/elabapi-python/test/test_link.py create mode 100644 vendor/elabapi-python/test/test_links_to_compounds_api.py create mode 100644 vendor/elabapi-python/test/test_links_to_experiments_api.py create mode 100644 vendor/elabapi-python/test/test_links_to_items_api.py create mode 100644 vendor/elabapi-python/test/test_metadata.py create mode 100644 vendor/elabapi-python/test/test_metadata_elabftw.py create mode 100644 vendor/elabapi-python/test/test_metadata_elabftw_extra_fields_groups.py create mode 100644 vendor/elabapi-python/test/test_metadata_extra_fields.py create mode 100644 vendor/elabapi-python/test/test_notification.py create mode 100644 vendor/elabapi-python/test/test_notifications_api.py create mode 100644 vendor/elabapi-python/test/test_notifications_subid_body.py create mode 100644 vendor/elabapi-python/test/test_patch_action.py create mode 100644 vendor/elabapi-python/test/test_reports_api.py create mode 100644 vendor/elabapi-python/test/test_resources_categories_api.py create mode 100644 vendor/elabapi-python/test/test_resources_status_api.py create mode 100644 vendor/elabapi-python/test/test_revision.py create mode 100644 vendor/elabapi-python/test/test_revisions_api.py create mode 100644 vendor/elabapi-python/test/test_revisions_subid_body.py create mode 100644 vendor/elabapi-python/test/test_statuslike.py create mode 100644 vendor/elabapi-python/test/test_step.py create mode 100644 vendor/elabapi-python/test/test_steps_api.py create mode 100644 vendor/elabapi-python/test/test_steps_subid_body.py create mode 100644 vendor/elabapi-python/test/test_storage_unit.py create mode 100644 vendor/elabapi-python/test/test_storage_units_api.py create mode 100644 vendor/elabapi-python/test/test_storage_units_body.py create mode 100644 vendor/elabapi-python/test/test_storage_units_id_body.py create mode 100644 vendor/elabapi-python/test/test_tag.py create mode 100644 vendor/elabapi-python/test/test_tags_api.py create mode 100644 vendor/elabapi-python/test/test_tags_subid_body.py create mode 100644 vendor/elabapi-python/test/test_tags_subid_body1.py create mode 100644 vendor/elabapi-python/test/test_team.py create mode 100644 vendor/elabapi-python/test/test_team_tags_api.py create mode 100644 vendor/elabapi-python/test/test_teamgroup.py create mode 100644 vendor/elabapi-python/test/test_teamgroup_users.py create mode 100644 vendor/elabapi-python/test/test_teamgroups_api.py create mode 100644 vendor/elabapi-python/test/test_teamgroups_subid_body.py create mode 100644 vendor/elabapi-python/test/test_teams_api.py create mode 100644 vendor/elabapi-python/test/test_teams_body.py create mode 100644 vendor/elabapi-python/test/test_teams_id_body.py create mode 100644 vendor/elabapi-python/test/test_todoitem.py create mode 100644 vendor/elabapi-python/test/test_todolist_api.py create mode 100644 vendor/elabapi-python/test/test_todolist_body.py create mode 100644 vendor/elabapi-python/test/test_todolist_id_body.py create mode 100644 vendor/elabapi-python/test/test_unfinished_step.py create mode 100644 vendor/elabapi-python/test/test_unfinished_steps.py create mode 100644 vendor/elabapi-python/test/test_unfinished_steps_api.py create mode 100644 vendor/elabapi-python/test/test_upload.py create mode 100644 vendor/elabapi-python/test/test_uploads_api.py create mode 100644 vendor/elabapi-python/test/test_uploads_subid_body.py create mode 100644 vendor/elabapi-python/test/test_uploads_subid_body1.py create mode 100644 vendor/elabapi-python/test/test_user_uploads_api.py create mode 100644 vendor/elabapi-python/test/test_users.py create mode 100644 vendor/elabapi-python/test/test_users_api.py create mode 100644 vendor/elabapi-python/test/test_users_body.py create mode 100644 vendor/elabapi-python/test/test_users_full.py create mode 100644 vendor/elabapi-python/test/test_users_full_teams.py create mode 100644 vendor/elabapi-python/test/test_users_id_body.py diff --git a/planning/mcp-server-plan.md b/planning/mcp-server-plan.md new file mode 100644 index 0000000..8956a67 --- /dev/null +++ b/planning/mcp-server-plan.md @@ -0,0 +1,441 @@ +# LabVoice MCP Server — Implementation Plan + +Status: **draft for review** (nothing below is built yet; `src/` is empty and +`vendor/elabapi-python` holds the vendored official `elabapi_python` client) + +## 1. Goal + +An MCP server exposing the eLabFTW REST API v2 as a small set of **aggregate tools** +designed for small/low-power models and voice-driven wetlab use. + +Design decisions already made: + +1. **Consumables live in the protocol template** — machine-readable JSON at the end of + the step text, hidden from the client UI in an HTML comment. +2. **Direct execution** — no preview/confirmation round. The point is hands-free + voice operation. +3. **Portable** — templates reference stable *semantic resource keys*, never eLabFTW + numeric IDs. The server installs on top of any existing eLabFTW instance with only + template edits (plus optional resource markers). +4. **Reads are dual-purpose** — the same read tools are exposed both as MCP tools and + over a plain read-only REST API. REST lets the mobile app render state without + spending model tokens; MCP lets the LLM fetch detail on demand. The edge LLM + receives only a **minimal handoff context** from the app (experiment id, user id, + current step id, device id, location id — on-device compute means a tight token + budget), so it pulls anything beyond the ids via the read tools. +5. **Templates are first-class** — new experiments are created from a template, chosen + interactively via a template-listing/search tool (short descriptions, semantic + ranking). + +## 2. Architecture + +```text + mobile app ──REST: reads for the UI (no LLM)──┐ + │ │ + │ voice + minimal handoff │ + │ context (ids only) │ + ▼ │ + small LLM ──MCP: reads on demand, aggregates──┤ + (stdio / streamable HTTP) │ + ▼ + ┌──────────────────────────────┐ + │ mcp_server │ + │ ├── tools.py │ small tool surface, compact results + │ ├── rest.py │ read-only REST mirror of the reads + │ ├── templates.py │ template search index + creation + │ ├── workflows/ │ aggregate operations (the point) + │ │ ├── protocol.py │ step completion saga + │ │ └── inventory.py │ allocation, unit handling + │ ├── resolve.py │ resource_key → item id mapping + │ ├── annotate.py │ annotation parse/validate + │ ├── elabftw.py │ async adapter over vendored elabapi_python + │ └── journal.py │ SQLite operation journal (sagas) + └──────────────────────────────┘ + │ HTTPS, Authorization: + ▼ + eLabFTW REST API v2 + (client: vendor/elabapi-python) +``` + +Layers, top to bottom: **MCP tools / REST routes → workflow services → +elabapi_python adapter → eLabFTW**. The read tools are single implementations behind +two transports: `tools.py` (MCP, for the LLM) and `rest.py` (REST, for the app UI). +No generic `PATCH/POST/DELETE` passthrough tools — aggregate tools only, so a small +model cannot pick an unsafe raw mutation. + +## 3. Module layout (`src/mcp_server/`) + +```text +src/mcp_server/ + __init__.py + __main__.py # entry point: stdio (default) or streamable-http + config.py # env-driven settings (pydantic-settings) + models.py # tool input/output schemas, compact result types + errors.py # typed errors → voice-friendly messages + elabftw.py # async adapter over the vendored elabapi_python client: + # Configuration/ApiClient setup, error normalization, + # sync calls wrapped with asyncio.to_thread + schemas.py # pydantic models for the eLabFTW entities we use + annotate.py # labvoice:v1 annotation parser + validator + resolve.py # resource key resolution (mapping store + markers) + allocate.py # container selection, unit whitelist/conversion + templates.py # experiment templates: description extraction, semantic + # ranking (embedding cache in SQLite), creation flow + journal.py # SQLite saga journal (idempotency + compensation) + workflows/ + __init__.py + protocol.py # complete_next/complete/observation workflows + inventory.py # adjust_inventory, stock reads + setup.py # scan_instance, map_resource, validate_templates + tools.py # MCP tool registration (one function per tool) + rest.py # FastAPI: read-only REST mirror of the read tools + # (state rendering for the app UI; bearer-token protected) + server.py # FastMCP assembly, lifespan; mounts rest.py in http mode +vendor/elabapi-python/ # official generated client (package elabapi_python, + # sync urllib3) — vendored, not edited; imported as-is +``` + +Dependencies to add: `mcp` (official Python SDK), `pydantic-settings`, +`aiosqlite` (journal), `fastapi` + `uvicorn` (REST fast path), `fastembed` +(optional — semantic template ranking, unset ⇒ lexical fallback). The REST client +itself comes from the vendored `elabapi_python` package +(`elabapi_python.Configuration` with `host = ELABFTW_URL + /api/v2`, api-key auth +header); because it is synchronous, the adapter runs calls via `asyncio.to_thread`. +Python 3.12 (already pinned). + +## 4. Protocol annotation format (portable) + +Appended at the end of a template step body: + +```html + +``` + +Field rules: + +| field | required | notes | +|-----------------|----------|----------------------------------------------------| +| `resource_key` | yes | slug; stable across instances — never an item id | +| `quantity` | yes | positive number consumed per execution | +| `unit` | yes | must be in the unit whitelist | +| `allocation` | no | `fifo` (default), `nearest_expiry`, `specific` | +| `container_id` | no | only with `allocation: "specific"`; local hint, ignored if it does not match the resolved resource | +| `optional` | no | `true` → skip (with a warning) if stock is missing | + +Parser rules (`annotate.py`): + +- Recognize only ``; take the **last** valid block. +- Malformed JSON or schema violations ⇒ `annotation_error`, surfaced by + `validate_protocol_template` and blocking step completion (never silently ignored). +- `quantity` may also be `null` with `"prompt_quantity": true` for steps where the + used amount varies — completion then **requires** the caller to supply quantities + (voice: “how much did you use?”), otherwise it fails with a clarification request. +- Visible step text is never modified by the server. + +Unit whitelist (extensible in config): `μL, mL, L, mg, g, kg, μg`, `ea` (each). +Conversions only within the same dimension and only tested pairs (e.g. `mL↔L`, +`mg↔g↔kg↔μg`); anything else ⇒ clarification, never a guess. + +## 5. Resource resolution (`resolve.py`) + +`resource_key` → eLabFTW `items` id, resolved in this order: + +1. **Local mapping store** (SQLite table): `resource_key → item_id`, written during + setup. Authoritative at execution time. +2. **Resource marker** — hidden comment in the resource body: + ``, auto-discovered by scanning. +3. **Configured matchers** at setup time only (CAS extra field, `custom_id`). +4. **Exact title match** — setup-time suggestion only, requires admin approval; + never applied silently during execution. + +Ambiguous or missing mapping ⇒ execution stops with a voice-friendly clarification +listing candidate resources. No fuzzy matching at runtime, ever. + +### Installation on an existing instance (setup workflow) + +- `scan_instance` — walk `GET /items` (paginated), inventory containers, detect + markers, propose matches from title/CAS/custom_id. +- `map_resource` — bind `resource_key → item_id` (idempotent, upsert). +- `export_mapping` / `import_mapping` — JSON mapping file for porting between + instances; import proposes but still requires approval of ambiguous matches. + +Mapping file example: + +```json +{ + "ethanol_absolute": {"cas": "64-17-5", "title": "Absolute Ethanol", "unit": "mL"} +} +``` + +## 6. MCP tool surface + +Ten tools total. The read tools are dual-purpose: the mobile app calls them via the +REST mirror (§8) to render state with zero model tokens, while the edge LLM — which +receives only a minimal handoff context of ids from the app — calls the same reads +over MCP when it needs detail (e.g. `get_next_protocol_step` for the full step body +and stock preview). + +Reads (safe, any API key): + +| tool | purpose | +|-------------------------|--------------------------------------------------------| +| `find_experiments` | search by title/text/tag/custom id, compact results | +| `get_experiment_context`| metadata + unfinished steps + linked resources + recent comments, all compact | +| `get_next_protocol_step`| next unfinished step: text, parsed consumables, stock preview | +| `list_experiment_templates` | list/search templates: id, title, short description, tags (semantic ranking, §9) | +| `validate_protocol_template` | check annotations + mappings of a template/experiment | + +Aggregates (mutating): + +| tool | purpose | +|-----------------------------|-------------------------------------------------------------------------| +| `complete_next_protocol_step` | the headline tool — see §7 | +| `complete_protocol_step` | same, with explicit step id (for “redo step 3” voice commands) | +| `record_protocol_observation` | add a comment (+ optional step body edit) without completing anything | +| `create_experiment_from_template` | start a new experiment from a template (interactive flow, §9) | +| `adjust_inventory` | restock / correct a container, voice: “add 500 mL to …” | + +Setup (admin, mutating only the local mapping store): + +| tool | purpose | +|---------------|---------------------------------------------| +| `scan_instance`, `map_resource`, `export_mapping`, `import_mapping` | §5 onboarding | + +Result shapes are deliberately small: every tool returns compact JSON (ids, titles, +quantities, statuses) — never a raw eLabFTW entity dump. Tool descriptions are one or +two short sentences (small-model friendly). Mutating tools return exactly what +changed, for text-to-speech readback: + +```json +{ + "ok": true, + "experiment_id": 123, + "step": {"id": 9, "body": "Add ethanol", "finished": true}, + "consumed": [{"resource_key": "ethanol_absolute", "container_id": 12, + "amount": "2.0 mL", "remaining": "48.0 mL"}], + "comment_id": 77, + "next_step": {"id": 10, "body": "Incubate 30 min"} +} +``` + +## 7. `complete_next_protocol_step` workflow (direct execution) + +Input: `{experiment_id, comment?, quantities?}` — nothing else. + +1. `GET /experiments/{id}` + steps; select lowest-`ordering` unfinished step. + None left ⇒ explicit `protocol_complete` result. +2. Parse annotation (§4). No annotation ⇒ complete step + comment, skip inventory. +3. Resolve every `resource_key` (§5). Unresolvable ⇒ clarification result, no mutation. +4. `GET /{entity_type}/{id}/containers` per resource; filter by unit compatibility; + apply allocation policy (`fifo` = lowest container id with stock, + `nearest_expiry` needs an expiry extra field, configured). +5. Validate stock: total available ≥ required (unit-converted). Insufficient ⇒ + clarification listing what is short; `optional` consumables are skipped with a warning. +6. Execute as a journaled saga (§10), in this order: + 1. decrement each container (`PATCH .../containers/{subid}` `qty_stored`), + 2. finish the step (`PATCH .../steps/{subid}` `{"action":"finish"}`), + 3. post the comment (`POST .../comments`). +7. Re-read the step to verify; return compact confirmation + next step. + +The model makes **one tool call**; all sequencing is server-side. + +## 8. Read-only REST API (app fast path) + +The read tools are single implementations behind two transports: `rest.py` exposes +them as REST endpoints so the mobile app renders state without spending LLM tokens, +while `tools.py` keeps them available over MCP for the LLM and standalone clients. +Mutations are **not** exposed over REST — they exist only as MCP tools, so every +mutation is journaled (§10). + +- Auth: static bearer token (`LABVOICE_REST_TOKEN`) — the app is a trusted client; + per-device tokens are an open question (§15). +- Same compact result shapes and typed errors as the MCP tools + (`{"error": "clarification", "message": ...}`). + +| endpoint | purpose | +|---------------------------------------|---------------------------------------------------------------| +| `GET /api/experiments?q=&limit=` | `find_experiments` | +| `GET /api/experiments/{id}/state` | full app state: title, unfinished steps, linked resources, next step + parsed consumables + stock preview | +| `GET /api/experiments/{id}/next-step` | just the next step (the hot path for voice) | +| `GET /api/templates?q=&limit=` | `list_experiment_templates` (§9) | + +The `state` response is what the app renders (title, steps, stock, etc.). What the +app forwards to the LLM is deliberately **minimal** — a handoff context of ids only, +since LLM compute is on-device at the edge and the token budget is tight: + +```json +{"experiment_id": 123, "user_id": 2, "step_id": 9, + "device_id": "bench-7", "location_id": "lab-2"} +``` + +When the model needs more than the ids — full step body, parsed consumables, stock, +comments — it calls the corresponding MCP read tool (same services that back the +endpoints above). REST serves the UI; MCP serves the model; one implementation of +each read. + +## 9. Experiment templates: semantic search & creation + +Voice flow ("start a new experiment for the PCR cleanup"): + +1. `list_experiment_templates(query?, limit?)` — templates as + `{id, title, short_description, tags}`, ranked by semantic similarity when a + query is given (best match first). +2. The LLM reads the short descriptions back; the user picks one interactively. +3. `create_experiment_from_template(template_id, title?)` — `POST /experiments` + with the template id; returns `{experiment_id, title, first_step}`. eLabFTW + copies the template steps, so `labvoice:v1` annotations come along and the + step-completion workflow (§7) applies immediately. + +Short description: first paragraph of the template description, truncated +(`LABVOICE_TEMPLATE_DESC_LIMIT`, default 200 chars). It doubles as readback text +for the LLM and as part of the search corpus. + +Semantic ranking (`templates.py`): + +- Corpus per template: title + tags + full description. +- Preferred backend: local tiny embedding model (`fastembed`, ONNX, CPU, ~30 MB, + `LABVOICE_EMBED_MODEL`); template vectors computed at scan time (or lazily on + first use) and cached in the SQLite database as `template_id → vector`, + refreshed when templates change. +- Fallback (no model configured): lexical scoring — weighted token overlap, + title > tags > description. Same interface, just dumber ranking. +- Only templates visible to the current API key are ever returned; no fuzzy + matching on ids. + +Creation notes: + +- A single `POST /experiments` — no multi-step saga; still journaled for audit + (§10). +- `title` optional — eLabFTW applies the template's default title format when + omitted. +- A created-but-unwanted experiment is archived via eLabFTW itself; this server + never deletes. + +## 10. Saga journal & failure handling (`journal.py`) + +eLabFTW has no cross-entity transactions, so every mutating workflow runs as a +journaled saga in SQLite (`LABVOICE_DB_PATH`, default `~/.labvoice/journal.sqlite`): + +- Each execution gets an `operation_id`; journal rows record planned actions, their + status, and eLabFTW responses. +- Sub-actions are idempotent (re-read before write; finishing an already-finished + step is a no-op; decrement uses read-modify-write with a re-read check). +- On failure of step 6.2 or 6.3: **compensate** — restore decremented quantities + (PATCH back), then: + - success ⇒ return `reverted` result explaining what happened; + - compensation fails ⇒ mark `partial_failure` in the journal **and** post an audit + comment on the experiment describing exactly what is inconsistent; result tells + the user which container to check. +- Journal is also the audit log (who/when/what) and powers a future reconciliation tool. + +## 11. Configuration & deployment + +Env vars (all via `config.py`): + +```text +ELABFTW_URL # https://eln.example.org (adapter sets host to this + /api/v2) +ELABFTW_API_KEY # read-only works for read tools; writes need can_write +ELABFTW_TIMEOUT=10 # per-request timeout seconds +ELABFTW_RETRIES=2 +LABVOICE_DB_PATH=~/.labvoice/journal.sqlite +LABVOICE_REST_TOKEN=... # bearer token for the read-only REST API (§8) +LABVOICE_TEMPLATE_DESC_LIMIT=200 +LABVOICE_EMBED_MODEL=... # optional; unset ⇒ lexical template ranking +LABVOICE_UNIT_WHITELIST=... # optional override +LABVOICE_EXPIRY_FIELD=... # extra-field name for nearest_expiry allocation +``` + +- Transports: **stdio** (default; local/phone use) and **streamable-http** + (`--transport http`, for a shared Raspberry-Pi-class deployment). In http mode a + single uvicorn process serves both the MCP app and the read-only REST API + (`rest.py`) — one deployment for app + LLM. `stateless_http` mode; no session + affinity needed. +- Health check = `GET /info` through the client (auth + reachability in one call). +- Packaging: uv project, console script `labvoice`; single Dockerfile (optional). + +## 12. eLabFTW endpoints used + +```text +GET /info +GET /experiments (search: q, tags, limit/offset) +GET /experiments/{id} +POST /experiments {"template": , "title"?} (§9 creation) +GET /{entity_type}/{id}/steps +PATCH /{entity_type}/{id}/steps/{subid} {"action": "finish"} +GET /{entity_type}/{id}/comments +POST /{entity_type}/{id}/comments +GET /items (scan/search) +GET /items/{id} +GET /{entity_type}/{id}/containers +PATCH /{entity_type}/{id}/containers/{subid} {"qty_stored": ...} +GET /storage_units?hierarchy=true (location names for readback) +GET /experiments_templates (list/search templates, §9) +GET /experiments_templates/{id} +``` + +`entity_type` ∈ {`experiments`, `items`} only — templates are read, never mutated, by +this server (template editing happens in eLabFTW itself). The adapter (`elabftw.py`) +normalizes all client errors into typed errors (`auth_error`, `permission_error`, +`not_found`, `api_error`) with voice-friendly messages; never leaks the API key into +results or logs. + +## 13. Testing & verification + +- **Unit** (pytest, mocked `elabapi_python` API instances): annotation parser (valid/malformed/ + last-block/prompt_quantity), resolver precedence + ambiguity, allocator (fifo, + splitting across containers, unit conversion, insufficient stock), journal + (idempotency, compensation, partial_failure), error normalization, template + ranking (golden queries for semantic + lexical fallback, description truncation), + creation from template (steps + annotations copied). +- **REST API**: FastAPI TestClient — bearer auth enforced, `state`/`next-step` + responses (snapshot tests). +- **MCP-level**: tool schema lint (small input schemas), `tools/list` snapshot test, + golden results for the headline workflow. +- **Integration** (optional, manual): disposable eLabFTW docker instance; script + creates experiment + template with annotations, maps resources, runs the saga, + asserts final state via the API. +- **Safety checks as tests**: read-only key must fail cleanly on every mutating tool; + immutable step → explicit error; double execution of same operation_id is idempotent. + +## 14. Build order (PR-sized milestones) + +1. `config.py`, `errors.py`, `models.py`, elabftw adapter over `elabapi_python` + schemas (read paths only) +2. `annotate.py` parser + `validate_protocol_template` tool +3. `resolve.py` mapping store + `scan_instance` / `map_resource` tools +4. read tools: `find_experiments`, `get_experiment_context`, `get_next_protocol_step` +5. `rest.py`: read-only REST mirror over the same services (bearer auth) +6. `journal.py` saga engine +7. `workflows/protocol.py`: `complete_protocol_step` → `complete_next_protocol_step` + → `record_protocol_observation` +8. `templates.py`: `list_experiment_templates` (search index) + + `create_experiment_from_template` +9. `adjust_inventory` +10. MCP server assembly (stdio + http, REST mount), entry point, README, Dockerfile +11. integration script + docs (annotation authoring guide for template editors) + +Milestones 1–5 are read-only and independently testable; the first mutating code +lands in milestone 7 on top of the journal (6). + +## 15. Open questions (need your input before/at build time) + +1. **Step selection** — strictly lowest `ordering` among unfinished steps, or should + `complete_protocol_step` also accept a step *number* spoken by the user (“done + with step three”)? (Plan assumes yes: accept id or 1-based position.) +2. **`nearest_expiry`** — is an expiry extra field available in your resources, or is + `fifo` + `specific` enough for v1? (Plan: ship `fifo`/`specific` first.) +3. **Journal location on phone/mobile** — default `~/.labvoice/journal.sqlite` okay, + or should the SQLite file live next to the config for easy backup? +4. **MCP SDK line** — plan targets the current stable `mcp` SDK (v2 line). Pin major + version at build time. +5. **Template search backend** — ship lexical ranking first and add `fastembed` + embeddings only if ranking disappoints, or embed from day one? (Plan: lexical + first, same interface for both.) +6. **REST auth** — one shared bearer token per deployment enough, or per-device + tokens for app installs? diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..174545b --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,41 @@ +[project] +name = "labvoice" +version = "0.0.1" +description = "Voice-driven eLabFTW assistant: MCP server + read-only REST fast path" +requires-python = ">=3.12" +dependencies = [ + "mcp>=1.0", + "pydantic>=2.7", + "pydantic-settings>=2.2", + "aiosqlite>=0.20", + "fastapi>=0.111", + "uvicorn>=0.30", +] + +[project.optional-dependencies] +embeddings = ["fastembed>=0.3"] + +[dependency-groups] +dev = [ + "pytest>=8.0", + "pytest-asyncio>=0.24", + # deps of the vendored elabapi_python client, imported (not installed) by tests + "six>=1.16", + "urllib3>=2.0", + "certifi>=2024.0", +] + +[project.scripts] +labvoice = "mcp_server.__main__:main" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["src/mcp_server"] + +[tool.pytest.ini_options] +testpaths = ["tests"] +asyncio_mode = "auto" +asyncio_default_fixture_loop_scope = "function" diff --git a/src/mcp_server/__init__.py b/src/mcp_server/__init__.py new file mode 100644 index 0000000..6821aba --- /dev/null +++ b/src/mcp_server/__init__.py @@ -0,0 +1,3 @@ +"""LabVoice MCP server: aggregate eLabFTW tools for voice-driven wetlab use.""" + +__version__ = "0.0.1" diff --git a/src/mcp_server/__main__.py b/src/mcp_server/__main__.py new file mode 100644 index 0000000..dfcd44a --- /dev/null +++ b/src/mcp_server/__main__.py @@ -0,0 +1,19 @@ +"""Entry point: stdio (default) or streamable-http.""" + +import argparse + + +def main(argv: list[str] | None = None) -> None: + """Console script entry point; parses --transport and hands off to server.run.""" + parser = argparse.ArgumentParser(prog="labvoice") + parser.add_argument( + "--transport", + choices=("stdio", "streamable-http"), + default="stdio", + ) + args = parser.parse_args(argv) + raise NotImplementedError + + +if __name__ == "__main__": + main() diff --git a/src/mcp_server/__pycache__/__init__.cpython-313.pyc b/src/mcp_server/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b643bf47c0a9ace6f39426b9c56d41521b662e94 GIT binary patch literal 274 zcmXw!%}T>S5XX00O2ry)-uK#r*?N`gMGyqPprXfNyO}PlNjA)G6YR}r5Ff&W4`fb) zFCgRv-1zZ7%>3trA2VH&Y_q7hqvv}Q^JicDi~pH!Cz=jFeSq;0G=}X<6tBe$SBrwzL5t ktsdL0dEv5kj>j~Pu>Lcj#PBuboWHZHkKMhe35{as8<)~hk^lez literal 0 HcmV?d00001 diff --git a/src/mcp_server/__pycache__/allocate.cpython-313.pyc b/src/mcp_server/__pycache__/allocate.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c9bc579b9b42ba65f465c3add7c43e917f6544c GIT binary patch literal 1478 zcmaJ>&2Jk;6rc63zrT_=HJ>pfR0OVyEzum1C`b{cA|Z;9CKaeytk&ysyvcfJ`)1tK zJ@w3~2vrI<#EBk|IC9``K#91ZIaLA)aa-XEuDn^>4O}|XzK?lt-pB9F?5tWX5nTVg z`_<7GHX*+mWw~k#VfHNw56NqU5g^QBnUAd93}kj~uy-ABC}B2ad%0eoIh&a*`t}Me z`#N%F_VV}@dd1BgE51mM94N6;uguE0TS+bD%>t{YmI|w}ddFfby=u=fao8$)uAx_> zmtpJ3Yj5Upw}5ur*f%Tek~w*lf!blM-MshK`yx_a5OJWAhul|zh^QA0=p+ghJsAax zhk;aGUqp8}NVInT#5kmF>y@oA6uxIpd@RDipX$cbU>7D`d%DS#@Q>St38F@R{%KEV z#(Ub@Td0Sq9%>8OF@D_Z=;jC8H@0r>9k@65cMjZ7KHNFj-rHdZI%i6Ay#?><9B?&( z$j_L%7Ry3z(#*_69+J-%+k|kdZQZ+Z027YQ@rd??8l}BTDn}l0>d`?k=8@?%#lfSB zOT`ED0s+eJA|$f&$kL5{p?1b`$ngj|Z375sXP}Dtz@(O@C`$G9?l@B2fv3FgiGX7n zdp_^-(CZJ?iF-!`s7dgRpy z4?@Z%Jh2ymq#_EZ9azO2Z5y6L2G1Mv0upJGQ%a$MT<7O-DtHOC6s}7sKoiM++tL+& zHx6Lx4g($zbP1j3msIKk@Y|CB_&_^pZ@D?3DfBJTY2QLh^wB&*G=rk9_XXB=quM)uPqOf z!`;LSz2VJ218=$~6ZOEYN%iiV=?ZP)g-Pb^>o>1&zWKh_A0ICeTxUz~_dccw`5}M& zTj?a}dzc&%ivY1SEA?D^mVy)|mJYgQfMKP#(^dv|wwxto-mr2v$({k31W%pgd4*>a zJhz>e7hrus;rTb&(pcxN@6=no;j)F+1L}k!7mjG~kTxBN7|?sP<@gQH5gaOKl3q!R zuWtYs+~t1tyu359c)MJtL%lkBxx5_bBf*+>oqLCI2ADX2u;yyAO|oRJMvC6G73%`+ec#f4(jqCV4bS2|{!!+z9sTxK$S&5mf>N*yx-*9_dIjiR&| zn2A!X(mafBu(tvnSJ)Tw*@_X2VfQ@leh$Ms^0P2=YRvR8Cznv+>4vmIiJ$~fhK$Id zE_*!m_K=TQ2~0@=I4uMupTV<1PGUTvoF3v1*ASL|z!e$BFLi`$guyPu)2s#jjJ-7<-wNcI#O05&WF!C*G&RZ<+QA7(NW()7gd3 YTVH0YLkAC4{qg*X-hK2()+;~$0*0L)^#A|> literal 0 HcmV?d00001 diff --git a/src/mcp_server/__pycache__/config.cpython-313.pyc b/src/mcp_server/__pycache__/config.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90726324e57c27726d7b386714df9753338925c8 GIT binary patch literal 2441 zcmaJ@%TF6e7@u9QAG~a^4F(fb^GIV8V<#mjG@_(x(y9VNT2?5Jnyi-fU^c9Go!PYs zsH#vet<(!u6qQ^mdL!pvddMG;ULsRhf{autRa;fusGLi0{bubokE$KXgGvPt|`&H9)Djijbw>h!g|ca zmZj=BGZrtbWo6w`l@W)PNFA_y363^tq$nw}vW$TcK9a5F1W#MvlT9qvuhXD&x@PE0 zYVNwKSW4Zi{ng0O$FU4Eh;Wc4FLK0n7G(s;ffrq(@HS7}qMLX!5WVO*2Ume=vMH}k z`ABo71!PS&)l6D5Z9ug!D&q$$tz%%HEfUE1LDFXH`AK`mEBZ&gpyd+-Hm{v@*mpbX z8o^^4L7NvMA=`7ft`R<_(aCt3PO&S~1>DFbo+SwN?mkiPh^^rTe$NShw-_ZoIe(&; z`kcBQG=YJ2A%*o4^{6@BAQ+1515#R2HB8<3p+#hhXbaZl#U*Q1DiVzb96~Or(h6S7 zfe~0k?;c4kHII#=b-)Avh)b|VRBWzCKTD^;Udd1uoW5@qi7sm?^MR&Xn6^6tDZ3~Y zpzE_V)L;>8T9Rd~VEy1ZvwWr@v2ebi$rhHf*i5bfh_h1O$YQM+fr~Gm z%_Q?P$(iJfXSrlPm&_$sa!D-HNaIFPS1oCE86whD)1sXX0e)Ce$r_XgYgy`nj3D}y zQtv;QM#uvnHWSs`usuefG-M(dMe}Hm)#TKgbC7zBFY*qmLdcmVhcko{uGte#nZr@| zRCU+}Q4Ac)CI~FO_pUWMz5svx|Pn#mYiNS$ckBzq2&&KY5*{alFlmy$;70D zNm{XIIaOGrO%pk+L%qo)9d;0#I@y@igk~tRW=^IWx>0a!o`vlIZJ=^^;ive`?TdTj z-CgnSo|t)bXY=E4Zhd|0n>(9#K=QZg1I^F7$GC4JV;tp@2^V!+#e#-OHwYlB0-*9K zJU}MamP}U180lvc|H(jT=m2MTsc&Ns=z-u_V!EiH&4YW9L>$dQg6$QB8*vrE-2A}~>iZDF=`v5mb5 zcDo7SA5mX{7zIqMHNsFt5^PH|L8l~{%!wk&7Jz-RXkq5;6z#I z-2%fC`|)I1=-C?G4nMh45t6UmZHGMPzQ=95x0RjI?d9(RRmAA33wiuC(V?e)9N$uy zaNL$v;o5jDOFKa}WeR*6i_NWXC;nn{>*>Sezen!0HBnRYmTFODp; zht@_@Eehu7R0FARqK3*zat)+xO#??myAwYfmRP{^h5y5quq9 ZKzs|-kL%i8hN5v@P&B^fFUGKg{s+SjT|WQ- literal 0 HcmV?d00001 diff --git a/src/mcp_server/__pycache__/elabftw.cpython-313.pyc b/src/mcp_server/__pycache__/elabftw.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9ff0e39849a8a437c1a3365b9947183d6719c61 GIT binary patch literal 5548 zcmbVQ&2JmW6`$qzQX=(feb}-zq9ogNT(XVj1a;!nvZAz>9oNk$ZQ2Uhtd>h^ZIVmR zF6~N20HX!kS;2Uc>2zu*#v%6eUB2&dHYB)Rd z=DqiOUo*plR4Pf}`S+DS-uWy=$UpJLeUXAdG z=tpiuS7SUz$$E%Iqp*Uc)cYC)~pI;ZA+XzWd$ z-q))Ilj{Ylm(>lmW+=5Sd(*5^t!(I3o1PP^>bzVwHZESEyk4dE4V9`mY?wLQRP0Tz ztA%XtDT>QVPW+|;0@N~gEp1b;s1|e+Ot)>LTC%bsr%(S?P3J}h_*+gCs4JG{>gu-r z-pfHOj7C@|TmnOcn8d>@v>st$7Fmq2=t*)X!lNv_9(yOEGF25pdM*a zyI9ZlGn^)}G3R+pOJb-CPfe33eKJfORL>w1=b%Em(I( z$eL_v<|0|_!8gXJpg+~3p9Suj^(hfcNj4{DPkX+9y$6>Nn-_F5fN%lg>6;KXwiPKEE4l+9|&*~mX}pdjO%utS8r)v z)(i32hZG_QgV20J-Wx27VQfldSGu(;abyE28L{+oQM_2Vh*IaZe5GpV3#zT=ADH~E zRZ}%Rk2L~RQ0|)syjfh!SG1a9=^UzwKbfm-ISEBEs)ns7&RB=mIe#2e+=475kI4Q6 z{e9{HxmSGf%k#;w?D>);#O#6DJR@Siu>4g=}O%Ap|D_N)mDez5v;RH768`JBEIq|pjxe$jN4n=kY_$aCu545c z+liUQBKVF^Bh3sp6q{LST2??t$Fss^pcGbUE3Cp8macMblWuI$dv%>}__$^ncDX8T!W`P^=A#rNz{7&wPMGTXFd4|8vG^2> zIH`b>Vib-<@c)g1?Xkn)^AC-}2OhAH3v2-uaAVtrkwz~DlAWne2%WRSPp5!|t8pLf zS+%li>!7a_wGF$hYnW*Mb3C`b2IRMY%piILH7wyb4Z_#fsamDM3@viALRIRE_TYtG zcv;}Z&qHIO9xY!Dxt!W@&UE5DLXd&=2Q5z}Iy}_}`2q>0*jqK-k-Zmi*|)~NJuO`J zu#Mjb!fAQS)@zoFZP&wwNzT7}1e=U566DT!C#Kc}?o%8$5Z7&Sq{a}#)bgKW`D**h z?WMKlAJKd-jq?w!`UV6YeV9=-OsmXgnkhmNv^Fz-Bt~3Uwczkepo4|FfWN%t>T}l! zT+U=CthOnEsRir>>_6Mf{+d}42Q$|N{AE@ znSB%Fbd*_l69s8qH&GaW3pHz%))xrnx!$2%wN<04bI+n(f>~?=n(5PZ+XRAHypy%r zFo_xOn$bz#gQ{rRc#+a@yY!!91;+ML@8S|jZ>unYFsL%QT+S~r-X0zlm>Zx6zX{FZ zJ$wufACSWyZslHG6@}fI@63npRJW09P<-&jkp|B0tKeCJrgIs#bK17EO*PyTXPF2RU(W;dqg1KeP>t3e>^)@ag0z#ZQ4r z5Q9%A;k9)PJAQs+ITx^kP1{l+K*UMG-PlpIpYN?156KcD>D&#{Le&=G;qdI7{RM&u z+=8y~pJTaYoAy?|OQz$Aqa)M%aohEEJzR_0=iY~vfwj3fC#PX7JC7F!^fX)?l8RC> z3-vPg`xT7PvNtoJC`E%?b{SH;YAOoHgyX~5p!J+SFNUwf$(^Gsov>wdCxX^;!ba70 zhCGUu*6$E}4ws+B<^rxru84eC!*h<$kHO)AUqq5uktFS>io0QQv0uD_Gya0>U<{72 z&auWhsbxRkZW`6Q{5pevx+&vO zk_?VC`>@wfhDMuWQJN&vAC~sgXB+U5&wVw3(_HGf) zN1~biQ`1fHefIp$+Ml;Y|A{=fCubUR=Bp@BH2VeFf=l-DC66S9!e$%rku%SG((PYe z4p>e#)qIH-hkY60f`U;|+cfCUBFo@H)^8OOo_A lQv8yf{E|%not$}+8vWwLOO4cpN6D{aKa-@)GlH$)^gmadH~;_u literal 0 HcmV?d00001 diff --git a/src/mcp_server/__pycache__/errors.cpython-313.pyc b/src/mcp_server/__pycache__/errors.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb4d72590513a6cedaa26c3ac65c3b5acb52d0c5 GIT binary patch literal 3510 zcmb_e-D?|15a0Wd?j%|MioX-vXFG0kP+KXDDNSP&)gP_$A&0D00(E*Q(%C&nU)?(; zO(7sCv_ zM}2_$m*ocP7wM6=s>abmq2}HElb&YTA=8 z&{|z^73#40Trr#StoNu;n^aE0;2~KiOaRx3RA3SnnM@_-qcZbTA5*BGsZ?PBsRz6ol0=c|ntmKQiv>QkktU6yZ z2YAxi<_o7XNoK8BDGs`wR?aT2z!Xe#4BN@4Zag7zy~R}xBbUsYhT#ScBb!ebGdONB zjIWBxOl_sjFjg#PI~gly=JK#CM-xk*y1~oyS1!dUjV;FAKzwn@SXfNN=UgdzIpzkV zaX_L=xE7wh7`+l(h|PM_&RCo#7GN5ik1rW?X>s;~+iieOplQlTIu5h07ah|!4Au(% zsGxh@Gm&i0iKLTGGIA@=ZrFun%8ZzqU} zV%Ld}lV$k|zha!HK^R<*Wrd0-0HG3-2}ZAnUyYv8YhFjWg{ja+Td)c+<|wG95r+bZ0MxGuXs zy9iN=fn?<@2TpAamig|mDBEUcWgBq=h5>%wq9H(XOUWo9yl@kC%cpf3>gyK$Nm7wo9{`vXZTU} zLAEq^SAQmtJ)e%gB$99Nv9yKVQ|W2?=O7>cntqMQDBZR=lq^p{Dd&QF(fF=4gtYy)b-=cy_s+4 zJU(1KH1)eLH*(*cnX}BaXUZV#aj+>}$fY5{bKGsp`-mYyVU;itZpt5_;my!+-56Xy zG-JZ?yt9B=+cRPWWFKrqH*#r6_A&y4jUho{c9Ri9o1vk)5x9P6MySz(<>^0;dt-Kf zYdkgX*`E5JK^aI;SW`Sr-yF^-==yB3d*B9k4Nvy_gnZm>H_z{+loma$nxR?Q?x5*EGQvZ z&AfO)@3KiC%~j(Zf=F=Hra<1*642;oXtXr9)k4Pg^5DqJkm?(M-qE$?gMLdTojvQR z2mKpMn;j!t0fd62qia3=Ah?B$@K><)br?pk2oNt2ahDx|C;))1@;@p{Pps(`N%0Zs z-K38|-oZDC7aM=n$xpD1Z;5o?^`wuj1ua5u# literal 0 HcmV?d00001 diff --git a/src/mcp_server/__pycache__/journal.cpython-313.pyc b/src/mcp_server/__pycache__/journal.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2211a0b4433fc682f12958ac1c3a12a24a6d242 GIT binary patch literal 4341 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 literal 0 HcmV?d00001 diff --git a/src/mcp_server/__pycache__/resolve.cpython-313.pyc b/src/mcp_server/__pycache__/resolve.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d35fe2cc5d4333113b834fa4ee7d7134a7f4d89e GIT binary patch literal 2507 zcmbVO&2Jk;6rc4vwv)z5+O#DNqMh^u#VEvw76p-jRN4xWiWIsWimuUa;Lv0L1bTzLR04YFEy9&5ZoD_Uo5T$Q)Rp{Z=FQjp{ocp8 zU$2ia{Q7TyckTNj#(t+k@s;yV|2%f?FoywiET?qQS}s9}Q{TR5FPEWg`sIs5%N3|B zSE0(;6g$qGp=st+-Y8|KKy9tss3n(i1VY6L_`vmamcwa-Qy*wh@MHEvdoQabuU zcF=`L!$vxuk3NLB8!IpLGvhK@$p`(PuycpC7+8q8Ooo${G7p}JOvA*a%+ zICiUwnyS&%a?NmS1c_v*uNnP5qaSWnarNk#iZf!gbsP=1M$O8Sv(M{I076phZpN=5;aO-AHS$Do*WAMQI5!|@rm=~~j z(GeiMP~H;8(g7PO(TMeK4BA@_1z&b9t)Tgk_*kDr9$qJ(1286T(uM-UKTtln;FSRg zX_?B@3na`1OlG_mYej*fEkm)$yXF}wULt&*vT6}0ipLSwhzQF9$8>^t-3v2Fjl2xJ zM#!=fnn#l~cl-;q!38q|(12=0;~*8($m<9!s3Wf1iGw7h{;2DImUv-4Gw!-=2}*}D z5>f2BK&1qz^rtpDAhj_iV2XxiiU*)~5e$>`EP=WBl$j2suYqy`W=YJE@{sE)jYZLS zJ*`2mCR!-h-DGfpmQclmS|R9dQa_-$&9+L`(9GSbErv}mcuLJyr8IQBcVdfSbMM4c zYPM>oZ&deB-v8p^TbFj}Co{b=&4bT(X6}C6n|pX_VV5H4oxW%H-uyAz(e)1Y{ClT+ zS2vGl$DDs~?BUW!&*<9Bb~1aVF`QOiH;8?twW2rZKZ;=>-M{m~&HHiGmTQLB0X;fI zgbECehE>DF0@1O}PFh>a{Pqqk;RI!`qQbakTbA`JyYiSFe#~Bd#1@}brmf?DG8AU> E-&MVh2><{9 literal 0 HcmV?d00001 diff --git a/src/mcp_server/__pycache__/rest.cpython-313.pyc b/src/mcp_server/__pycache__/rest.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f48aac2ba4da1434a8d842175d5ce283e238f9cd GIT binary patch literal 1378 zcmb7D&2Jk;6rcU@N1V8JND&CN=^#|-BE@@XiYlP3f-%K*aiXkM39z(U?~a{qc6XLH zCZ)a_f;lgY!z9_!75BE_dFn-4-N@)RFeh+xOng{NC@qH?LMJ1lN`8 z-`x4qAmkVI^LUk)%KTeY9*~Q~AwV3>(Ysnl2fbr}LCHYBv<&msi1Hd;vr~WqRl3SW zUK%nF7;H&?$P$_Ym&}(euo{1=j4VB?_CMZhxy=t-&2GDQGc$IQsikG54?H1v_S&eH z9VTU%jD=;+HgC52)b`TQX7^GCVayUKZhUs_^(c%(d2M##zx?*+Veo}5q$k{XHYyKpDxXW zFwN3t`#VCgc!=yMqLx|aOkqY`V4hD&Wl50o5Hoy-#uJ1e@3Bb{b7AImJ6tNvYl98_{I;5Szde4qSUIscP+evUfH3VE%2&q2ytx4kGt zSPN1X9fK{UI>sA&VIm~Gwe#NX-FCC(st$DfyWLi=0cxx)4c2j6WC&FSU=5Lnqp6$U z02^p}2|uVQQC9)xVVDG2DP}@=W9I8e(f z2t6SoQMkFPBIVd?{+ucjB6H}ahsw7~cJF;})+R>UG(_r1ynXX~GxOg2z2_Oag+i9V zIQi<=2a_5hf8t~?^uE&l1C*!4BAi%?rGBeys9fF9xK<=nf&dgHws> zfTk++4Amu?2GkfrQxeSpnjJ#Z63qdcA3_a@762U?LNgK_1@zJonw97npqGcxoJ7X~ zofty%jY;#JpRRwmS9AQxtrnX>jd@|Q9`Itc&5CT(*}8N8hav-GpofgzO&f6WQB=Uw0cTZZ)c+buegO=@vnGN-Bgaz^G~|T&qxEQMI%i3fC>l zQw`lriNdPqY}KRPRdl=8Nx?3mJDwNpnu^fblZZRdN!d&b!?t~=$!uF>Z5v|W@lem( z_M;ug>sv-`yYBKZ@?4+!fo*e)M&xCtHY5W9i%HuKBL@huohah&)=tDiSc(17g+C&` zEH(Y8RC6Myv>Wh;Vautq5{sj>9|tbXLS8L3t1UZZ{4wLDu)58fPPp9K;~2jbsDybC zhven>+;3~YkAHfw$;SrfbDSxF;^LDsp|E*8O_W!C+;?WmD%loS-LO zKrw>i5(>FWdc2HNJX{LIL+tuPBB&9^gvN6*^}C#O7r}BqrVmMlR&-1K2rQKpXc}rz z(X_1S*r1|MT8z6*=%)_GBviL1bSSdN;?SQPNudkP^&w-{nV4GmMDC-piYM{#+qP%q_7`mWa zL2d7jFzT-FhTE)G7Dm8pP&vOLGct2YW#Y4Vz#NMAP@pF~D)9KnI8SQ8572-DorkCl zN|h}fte;L!@83PDy`a;lGxMNT+bhQpPUw8h6s}HYstA_XGi7OT&rnkrBmJ(t9W-T2 z$|A_x$+DU0H)NTV&?n%Uqrk&L;5<&~a4n7*Ey*#z^>1plAN_sSYb^QGkaca^OPdo38(`BfA56 zFN^G>Xb@#oZ!yDlK^%;MGRup)8I0<5q@zm`8>e03K#PQ7&IveMR>&j+9q;0zvRN;~}TK)eG zxCSQqc*YN!d^+$Jm6w?O4a>fljU^eDPGtu1*?8><<5v7mf6Z^f6koY;7sTJ1q9`xP z&A-TEFQq6;?e!jkPtQ=4OnV9SOwUl2(PxDofln_B0&%HRrHDFwdLxRGZ~utv^KyN= a*;aey#0ygu;v^)P}`g?ChF?5J41ZAxF}zvJkBRln#SPMzIh;%>)DiCQ+D-(qJ+{q)nE35puM1j>H@Z znsM+P3UgKnMRfVX(;9;HE{=C0_8B}yF4XNnqbm`lsBILVvz~1`^Y=gMF5KTM;_N>TIy@M&oeKJ2dL#8eKb!i# z@ZxuC-`*Se&pjm99z&7lL|N3UMUxkz8T-i0nd7Oo=*Lkj*hq*llaKr#jJkxT#{!UF z8LE_!gro#*jUW#hFonx$8Lq+-ZqSoa=TY=BmSz3S*8XJA|H2l2Wy=q9Q�~h9U|6 E5C4e_3;+NC literal 0 HcmV?d00001 diff --git a/src/mcp_server/__pycache__/tools.cpython-313.pyc b/src/mcp_server/__pycache__/tools.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51b92372ffa8fd3e25cb67f8352031426a3e7991 GIT binary patch literal 5196 zcmbVQ&2JmW6;l5&Dp^@=;Y zGxO%n?|sf&?F|oS66V zgX(CH*GzBCZ0{|jXO{EYT)27$n$IuCHAa0gtI>*MSf9~{u*VB>bPhezL_E+0sORN4 z(~b|0KSQNzCnVJ|eN-RQ$Mr+{gnmSy(x>&K`iwrS&*@A*wp5sUoo350J*;!v4bNSALcU&(`H6G(b~)#du3)~wJ+67Y^?{`ECsqVEJbwNb zxL8eYd*S#Mfi;fU4wvPx7_F9NZ=AP1OlMZHjyCg0 zuCBRU+>nxlq*={0?C`yKjRP5QM2t(nFd9}pByTywTlJG4wK;gIp0VNj$%fUmJU=D4 z*A}*!AVI?mVXb_Edv5~GyuuLVzYeDqg~wh`tjEf+k1HBCgt^IhPjHv5Z8OjE8oWZ{ zRde3QRE+#KJrwhY`wMDT-Hc&8x(=q2>J{!81bC6PZ9uTxO>BR!heJg3FtR?O7%hhP{R0D+dCU=54pQKNNQ0ZU4W(7gshpRE~gCl(`>_=_Vsb@ja6w=W} zyg$MH-?PgH=Nb*iL_UKkb#4loG6E-CWI<>lm2*bkBqL0QQ_FEZIUIsu$n});O{38W z#Z1VM5(_{e%4ni=6NJ|^#UCa3+V{BWDUiQT>n5oQq$U5QWI;(Jx(*~^`y9wu!rcI# z@@T^{tx%eUbw{wTZvRQ}x)aEE`m5W2W`U(iI%E$wa#J;sX%QR;1S3euqfz4MNwz=s zmO%9`Znu{h3xodp9HzT)u3m?y5lG5y3#XVP!^~&|f~-09ZN}@CSC$d!v}OJytt0ZF ziETQfH@?SQB;PaULjH6_z3-V$|Bw`~fV_%(z+Ab=b73++DUYh>2)v(Zo`DQv!1-c|K| zRVdGHI>lwDm#XFc-r^()#=cg@L zl#&Tyjjn^?UVaY+57gg3$igy%OiW6r1asL~yKwE7jCOIUB9k=+&N!*@cd_9olWv((7KsDS(ls#FTQHCs6tBlZMK~1nxchLf>Drqh5dQ1Nkk4PaTe0nVbUON4-xVdbVzrvo%(Kp#c^fjd8~m*J6_%3S+=mFEZXyMY z>{K_2fo@947rR8(%_ynt!|e2<(S(T$9E6GT%S?a@qpBd5oe>AB9yr2zfd zM1Xv_w6lEY!wB@qp&jk+iJcE0mDuj`qtZ(~5herhlOcSmSH%g2Ma`!jdzyQjZQ?7s1ZJuv3&u6#MRd-03k1gnnUcOR_WzxCIp z$kNF}9d%0nW;*I@N1c=JXy-fXct;)SsHKiNieGo8I3K@V*h%h~cTewZepcL5itx_k Q1TS!_UG*t>m5l%Y07caojQ{`u literal 0 HcmV?d00001 diff --git a/src/mcp_server/allocate.py b/src/mcp_server/allocate.py new file mode 100644 index 0000000..2d42384 --- /dev/null +++ b/src/mcp_server/allocate.py @@ -0,0 +1,27 @@ +"""Container selection and unit whitelist/conversion.""" + +from mcp_server.models import AllocationPolicy, ContainerAllocation, ContainerStock + +DEFAULT_UNIT_WHITELIST: tuple[str, ...] = ("μL", "mL", "L", "μg", "mg", "g", "kg", "ea") + + +def are_compatible(unit_a: str, unit_b: str) -> bool: + """True when both units share a dimension and a tested conversion exists.""" + raise NotImplementedError + + +def convert(quantity: float, from_unit: str, to_unit: str) -> float: + """Convert within the same dimension across tested pairs only.""" + raise NotImplementedError + + +def choose_containers( + containers: list[ContainerStock], + required: float, + unit: str, + policy: AllocationPolicy, + *, + expiry_field: str | None = None, +) -> list[ContainerAllocation]: + """Apply the allocation policy (fifo/nearest_expiry/specific), splitting across containers.""" + raise NotImplementedError diff --git a/src/mcp_server/annotate.py b/src/mcp_server/annotate.py new file mode 100644 index 0000000..f57a3d1 --- /dev/null +++ b/src/mcp_server/annotate.py @@ -0,0 +1,21 @@ +"""labvoice:v1 annotation parser + validator.""" + +from mcp_server.models import ProtocolAnnotation + +ANNOTATION_PREFIX = "" + + +def extract_annotation_block(step_body: str) -> str | None: + """Return the raw last labvoice:v1 comment block, or None when absent.""" + raise NotImplementedError + + +def parse_annotation(step_body: str) -> ProtocolAnnotation | None: + """Parse the last valid labvoice:v1 block; None when no annotation present.""" + raise NotImplementedError + + +def validate_annotation(step_body: str) -> list[str]: + """Return schema violations for the annotation in the step body.""" + raise NotImplementedError diff --git a/src/mcp_server/config.py b/src/mcp_server/config.py new file mode 100644 index 0000000..a89481b --- /dev/null +++ b/src/mcp_server/config.py @@ -0,0 +1,35 @@ +"""Env-driven settings (pydantic-settings).""" + +from functools import lru_cache +from pathlib import Path + +from pydantic_settings import BaseSettings, SettingsConfigDict + + +class Settings(BaseSettings): + model_config = SettingsConfigDict(env_file=".env", extra="ignore") + + elabftw_url: str = "" + elabftw_api_key: str = "" + elabftw_timeout: float = 10.0 + elabftw_retries: int = 2 + + labvoice_db_path: Path = Path("~/.labvoice/journal.sqlite") + labvoice_rest_token: str | None = None + labvoice_template_desc_limit: int = 200 + labvoice_embed_model: str | None = None + labvoice_unit_whitelist: str = "μL,mL,L,μg,mg,g,kg,ea" + labvoice_expiry_field: str | None = None + + @property + def unit_whitelist(self) -> tuple[str, ...]: + return tuple(u.strip() for u in self.labvoice_unit_whitelist.split(",") if u.strip()) + + @property + def api_base_url(self) -> str: + return f"{self.elabftw_url.rstrip('/')}/api/v2" + + +@lru_cache +def get_settings() -> Settings: + return Settings() diff --git a/src/mcp_server/elabftw.py b/src/mcp_server/elabftw.py new file mode 100644 index 0000000..2f27126 --- /dev/null +++ b/src/mcp_server/elabftw.py @@ -0,0 +1,98 @@ +"""Async adapter over the vendored elabapi_python client (sync urllib3, run via asyncio.to_thread).""" + +from typing import Literal + +from mcp_server import schemas +from mcp_server.config import Settings + +EntityType = Literal["experiments", "items"] + + +class ElabftwClient: + def __init__(self, settings: Settings) -> None: + self.settings = settings + + async def get_info(self) -> schemas.ElabftwInfo: + """GET /info — auth + reachability health check.""" + raise NotImplementedError + + async def search_experiments( + self, + *, + q: str | None = None, + tags: list[str] | None = None, + limit: int = 15, + offset: int = 0, + ) -> list[schemas.ElabftwExperiment]: + """GET /experiments — search by query/tags with pagination.""" + raise NotImplementedError + + async def get_experiment(self, experiment_id: int) -> schemas.ElabftwExperiment: + """GET /experiments/{id}.""" + raise NotImplementedError + + async def create_experiment( + self, template_id: int, title: str | None = None + ) -> schemas.ElabftwExperiment: + """POST /experiments — create an experiment from a template.""" + raise NotImplementedError + + async def get_steps( + self, entity_type: EntityType, entity_id: int + ) -> list[schemas.ElabftwStep]: + """GET /{entity_type}/{id}/steps.""" + raise NotImplementedError + + async def finish_step( + self, entity_type: EntityType, entity_id: int, step_id: int + ) -> schemas.ElabftwStep: + """PATCH /{entity_type}/{id}/steps/{subid} {"action": "finish"}.""" + raise NotImplementedError + + async def list_comments( + self, entity_type: EntityType, entity_id: int + ) -> list[schemas.ElabftwComment]: + """GET /{entity_type}/{id}/comments.""" + raise NotImplementedError + + async def post_comment( + self, entity_type: EntityType, entity_id: int, body: str + ) -> schemas.ElabftwComment: + """POST /{entity_type}/{id}/comments.""" + raise NotImplementedError + + async def search_items( + self, *, q: str | None = None, limit: int = 15, offset: int = 0 + ) -> list[schemas.ElabftwItem]: + """GET /items — scan/search resources.""" + raise NotImplementedError + + async def get_item(self, item_id: int) -> schemas.ElabftwItem: + """GET /items/{id}.""" + raise NotImplementedError + + async def get_containers( + self, entity_type: EntityType, entity_id: int + ) -> list[schemas.ContainerLink]: + """GET /{entity_type}/{id}/containers.""" + raise NotImplementedError + + async def set_container_quantity( + self, entity_type: EntityType, entity_id: int, subitem_id: int, qty_stored: float + ) -> None: + """PATCH /{entity_type}/{id}/containers/{subid} {"qty_stored": ...}.""" + raise NotImplementedError + + async def list_storage_units(self) -> list[schemas.StorageUnit]: + """GET /storage_units?hierarchy=true — location names for readback.""" + raise NotImplementedError + + async def list_templates( + self, *, q: str | None = None, limit: int = 25, offset: int = 0 + ) -> list[schemas.ElabftwTemplate]: + """GET /experiments_templates — list/search templates.""" + raise NotImplementedError + + async def get_template(self, template_id: int) -> schemas.ElabftwTemplate: + """GET /experiments_templates/{id}.""" + raise NotImplementedError diff --git a/src/mcp_server/errors.py b/src/mcp_server/errors.py new file mode 100644 index 0000000..7d1f734 --- /dev/null +++ b/src/mcp_server/errors.py @@ -0,0 +1,60 @@ +"""Typed errors mapped to voice-friendly messages.""" + +from enum import StrEnum + + +class ErrorKind(StrEnum): + AUTH = "auth_error" + PERMISSION = "permission_error" + NOT_FOUND = "not_found" + API = "api_error" + ANNOTATION = "annotation_error" + CLARIFICATION = "clarification" + INSUFFICIENT_STOCK = "insufficient_stock" + + +class LabVoiceError(Exception): + kind: ErrorKind = ErrorKind.API + + def __init__(self, message: str, *, detail: str | None = None) -> None: + super().__init__(message) + self.message = message + self.detail = detail + + +class AuthError(LabVoiceError): + kind = ErrorKind.AUTH + + +class PermissionDeniedError(LabVoiceError): + kind = ErrorKind.PERMISSION + + +class NotFoundError(LabVoiceError): + kind = ErrorKind.NOT_FOUND + + +class ApiError(LabVoiceError): + kind = ErrorKind.API + + +class AnnotationError(LabVoiceError): + kind = ErrorKind.ANNOTATION + + +class ClarificationNeededError(LabVoiceError): + kind = ErrorKind.CLARIFICATION + + def __init__( + self, + message: str, + *, + options: list[str] | None = None, + detail: str | None = None, + ) -> None: + super().__init__(message, detail=detail) + self.options = options or [] + + +class InsufficientStockError(LabVoiceError): + kind = ErrorKind.INSUFFICIENT_STOCK diff --git a/src/mcp_server/journal.py b/src/mcp_server/journal.py new file mode 100644 index 0000000..fabc98b --- /dev/null +++ b/src/mcp_server/journal.py @@ -0,0 +1,81 @@ +"""SQLite saga journal: idempotency, compensation, audit log.""" + +from enum import StrEnum +from pathlib import Path +from typing import Any + +from pydantic import BaseModel, Field + + +class OperationStatus(StrEnum): + PLANNED = "planned" + RUNNING = "running" + COMPLETED = "completed" + FAILED = "failed" + COMPENSATED = "compensated" + PARTIAL_FAILURE = "partial_failure" + + +class ActionStatus(StrEnum): + PLANNED = "planned" + DONE = "done" + FAILED = "failed" + COMPENSATED = "compensated" + + +class ActionRecord(BaseModel): + id: int + operation_id: str + action: str + status: ActionStatus = ActionStatus.PLANNED + payload: dict[str, Any] = Field(default_factory=dict) + response: dict[str, Any] | None = None + + +class OperationRecord(BaseModel): + operation_id: str + kind: str + status: OperationStatus = OperationStatus.PLANNED + actions: list[ActionRecord] = Field(default_factory=list) + + +class SagaJournal: + def __init__(self, db_path: Path) -> None: + self.db_path = db_path + + async def connect(self) -> None: + """Open/initialize the SQLite journal.""" + raise NotImplementedError + + async def close(self) -> None: + raise NotImplementedError + + async def begin_operation( + self, kind: str, operation_id: str | None = None + ) -> OperationRecord: + """Start a journaled operation; an existing completed operation_id means idempotent replay.""" + raise NotImplementedError + + async def record_action( + self, operation_id: str, action: str, payload: dict[str, Any] + ) -> ActionRecord: + raise NotImplementedError + + async def mark_action( + self, + operation_id: str, + action_id: int, + status: ActionStatus, + response: dict[str, Any] | None = None, + ) -> ActionRecord: + raise NotImplementedError + + async def finish_operation(self, operation_id: str, status: OperationStatus) -> None: + raise NotImplementedError + + async def get_operation(self, operation_id: str) -> OperationRecord: + raise NotImplementedError + + async def has_completed(self, operation_id: str) -> bool: + """True when this operation_id already ran to completion (idempotency check).""" + raise NotImplementedError diff --git a/src/mcp_server/models.py b/src/mcp_server/models.py new file mode 100644 index 0000000..f14f3a9 --- /dev/null +++ b/src/mcp_server/models.py @@ -0,0 +1,179 @@ +"""Tool input/output schemas and compact result types.""" + +from enum import StrEnum +from typing import Literal + +from pydantic import BaseModel, Field + + +class AllocationPolicy(StrEnum): + FIFO = "fifo" + NEAREST_EXPIRY = "nearest_expiry" + SPECIFIC = "specific" + + +class Consumable(BaseModel): + resource_key: str + quantity: float | None = None + unit: str + allocation: AllocationPolicy = AllocationPolicy.FIFO + container_id: int | None = None + optional: bool = False + + +class ProtocolAnnotation(BaseModel): + consumables: list[Consumable] = Field(default_factory=list) + prompt_quantity: bool = False + + +class StepInfo(BaseModel): + id: int + position: int | None = None + body: str + finished: bool = False + + +class ContainerStock(BaseModel): + container_id: int + amount: str + available: float + unit: str + + +class NextStep(BaseModel): + experiment_id: int + step: StepInfo + consumables: list[Consumable] = Field(default_factory=list) + stock: list[ContainerStock] = Field(default_factory=list) + + +class ItemSummary(BaseModel): + id: int + title: str + resource_key: str | None = None + + +class CommentInfo(BaseModel): + id: int + body: str + created_at: str | None = None + + +class ExperimentSummary(BaseModel): + id: int + title: str + status: str | None = None + + +class ExperimentContext(BaseModel): + experiment_id: int + title: str + status: str | None = None + unfinished_steps: list[StepInfo] = Field(default_factory=list) + linked_resources: list[ItemSummary] = Field(default_factory=list) + recent_comments: list[CommentInfo] = Field(default_factory=list) + + +class AppState(BaseModel): + experiment_id: int + title: str + next_step: NextStep | None = None + unfinished_steps: list[int] = Field(default_factory=list) + + +class HandoffContext(BaseModel): + """Minimal id-only context the app forwards to the edge LLM.""" + + experiment_id: int + user_id: int + step_id: int | None = None + device_id: str | None = None + location_id: str | None = None + + +class TemplateSummary(BaseModel): + id: int + title: str + short_description: str + tags: list[str] = Field(default_factory=list) + + +class CreateExperimentResult(BaseModel): + ok: bool = True + experiment_id: int + title: str + first_step: StepInfo | None = None + + +class ConsumedRecord(BaseModel): + resource_key: str + container_id: int + amount: str + remaining: str + + +class CompleteStepResult(BaseModel): + ok: bool = True + status: Literal["completed", "protocol_complete", "reverted", "partial_failure"] = "completed" + experiment_id: int + step: StepInfo + consumed: list[ConsumedRecord] = Field(default_factory=list) + comment_id: int | None = None + next_step: StepInfo | None = None + + +class ObservationResult(BaseModel): + ok: bool = True + experiment_id: int + comment_id: int | None = None + step: StepInfo | None = None + + +class InventoryResult(BaseModel): + ok: bool = True + container_id: int + resource_key: str | None = None + amount: str + remaining: str + + +class ContainerAllocation(BaseModel): + container_id: int + take: float + unit: str + remaining: str + + +class MappingEntry(BaseModel): + resource_key: str + item_id: int + title: str | None = None + unit: str | None = None + + +class MappingProposal(BaseModel): + resource_key: str + item_id: int + title: str | None = None + reason: str | None = None + score: float | None = None + + +class ScanResult(BaseModel): + containers_seen: int = 0 + markers_found: int = 0 + proposals: list[MappingProposal] = Field(default_factory=list) + + +class ValidationIssue(BaseModel): + severity: Literal["error", "warning"] + message: str + step_id: int | None = None + resource_key: str | None = None + + +class ValidationReport(BaseModel): + entity_type: str + entity_id: int + ok: bool + issues: list[ValidationIssue] = Field(default_factory=list) diff --git a/src/mcp_server/resolve.py b/src/mcp_server/resolve.py new file mode 100644 index 0000000..f5a1db3 --- /dev/null +++ b/src/mcp_server/resolve.py @@ -0,0 +1,35 @@ +"""resource_key → item id resolution (mapping store, markers, setup-time matchers).""" + +from typing import Any + +from mcp_server.config import Settings +from mcp_server.models import MappingEntry, MappingProposal + + +class ResourceResolver: + def __init__(self, settings: Settings) -> None: + self.settings = settings + + async def resolve(self, resource_key: str) -> int: + """Resolve a resource_key to an items id; ambiguity/absence raises ClarificationNeededError.""" + raise NotImplementedError + + async def find_candidates(self, resource_key: str) -> list[MappingProposal]: + """Candidate resources for an unmapped key (markers, CAS, exact title).""" + raise NotImplementedError + + async def upsert_mapping(self, resource_key: str, item_id: int) -> MappingEntry: + """Bind resource_key → item_id (idempotent upsert into the local store).""" + raise NotImplementedError + + async def list_mappings(self) -> list[MappingEntry]: + """All bindings in the local mapping store.""" + raise NotImplementedError + + async def export_mapping(self) -> dict[str, Any]: + """Serialize the mapping store to the portable JSON structure.""" + raise NotImplementedError + + async def import_mapping(self, data: dict[str, Any]) -> list[MappingProposal]: + """Import a mapping file; propose matches, ambiguous ones need approval.""" + raise NotImplementedError diff --git a/src/mcp_server/rest.py b/src/mcp_server/rest.py new file mode 100644 index 0000000..4de2b03 --- /dev/null +++ b/src/mcp_server/rest.py @@ -0,0 +1,30 @@ +"""Read-only REST mirror of the read tools for the mobile app (bearer-token protected).""" + +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from fastapi import FastAPI + + from mcp_server.config import Settings + +ENDPOINTS: tuple[str, ...] = ( + "GET /api/experiments?q=&limit=", + "GET /api/experiments/{id}/state", + "GET /api/experiments/{id}/next-step", + "GET /api/templates?q=&limit=", +) + + +def create_rest_app(settings: "Settings") -> "FastAPI": + """Assemble the FastAPI app exposing the read endpoints; mutations never appear here.""" + raise NotImplementedError + + +def verify_token(token: str) -> None: + """Validate the bearer token against LABVOICE_REST_TOKEN.""" + raise NotImplementedError + + +def error_payload(kind: str, message: str) -> dict[str, Any]: + """Compact typed-error JSON body shared with the MCP results.""" + raise NotImplementedError diff --git a/src/mcp_server/schemas.py b/src/mcp_server/schemas.py new file mode 100644 index 0000000..4578506 --- /dev/null +++ b/src/mcp_server/schemas.py @@ -0,0 +1,48 @@ +"""Pydantic models for the eLabFTW entities we consume.""" + +from pydantic import BaseModel, ConfigDict + + +class ElabftwEntity(BaseModel): + model_config = ConfigDict(extra="allow") + + +class ElabftwInfo(ElabftwEntity): + pass + + +class ElabftwExperiment(ElabftwEntity): + id: int + title: str + + +class ElabftwItem(ElabftwEntity): + id: int + title: str + + +class ElabftwStep(ElabftwEntity): + id: int + body: str + finished: bool = False + ordering: int | None = None + + +class ElabftwComment(ElabftwEntity): + id: int + + +class ElabftwTemplate(ElabftwEntity): + id: int + title: str + + +class ContainerLink(ElabftwEntity): + id: int + qty_stored: float | None = None + unit: str | None = None + + +class StorageUnit(ElabftwEntity): + id: int + label: str | None = None diff --git a/src/mcp_server/server.py b/src/mcp_server/server.py new file mode 100644 index 0000000..15c0fee --- /dev/null +++ b/src/mcp_server/server.py @@ -0,0 +1,25 @@ +"""FastMCP assembly, lifespan and service wiring.""" + +from typing import TYPE_CHECKING, Any, Literal + +from mcp_server.config import Settings, get_settings + +if TYPE_CHECKING: + from mcp.server.fastmcp import FastMCP + +Transport = Literal["stdio", "streamable-http"] + + +def build_services(settings: Settings) -> dict[str, Any]: + """Wire adapter, resolver, journal, workflows and template service into one container.""" + raise NotImplementedError + + +async def create_mcp_server(settings: Settings | None = None) -> "FastMCP": + """Assemble the FastMCP server with all tools registered and a lifespan managing services.""" + raise NotImplementedError + + +def run(transport: Transport = "stdio") -> None: + """Run the server: stdio (default) or streamable-http (mounted with the REST app).""" + raise NotImplementedError diff --git a/src/mcp_server/templates.py b/src/mcp_server/templates.py new file mode 100644 index 0000000..435d8f8 --- /dev/null +++ b/src/mcp_server/templates.py @@ -0,0 +1,27 @@ +"""Experiment templates: description extraction, semantic ranking, creation flow.""" + +from mcp_server.config import Settings +from mcp_server.elabftw import ElabftwClient +from mcp_server.models import CreateExperimentResult, TemplateSummary + + +class TemplateService: + def __init__(self, client: ElabftwClient, settings: Settings) -> None: + self.client = client + self.settings = settings + + async def list_templates( + self, query: str | None = None, limit: int = 10 + ) -> list[TemplateSummary]: + """List/search templates (id, title, short description, tags); semantic ranking when queried.""" + raise NotImplementedError + + async def build_search_index(self) -> None: + """(Re)build the template search corpus/vector cache in SQLite.""" + raise NotImplementedError + + async def create_experiment_from_template( + self, template_id: int, title: str | None = None + ) -> CreateExperimentResult: + """Create an experiment from a template; steps + annotations are copied by eLabFTW.""" + raise NotImplementedError diff --git a/src/mcp_server/tools.py b/src/mcp_server/tools.py new file mode 100644 index 0000000..facaf6b --- /dev/null +++ b/src/mcp_server/tools.py @@ -0,0 +1,142 @@ +"""MCP tool registration: one thin async function per tool, compact results.""" + +from typing import Any + +from mcp_server.models import ( + CompleteStepResult, + CreateExperimentResult, + ExperimentContext, + ExperimentSummary, + InventoryResult, + MappingEntry, + NextStep, + ObservationResult, + ScanResult, + TemplateSummary, + ValidationReport, +) + + +async def find_experiments( + query: str | None = None, + tags: list[str] | None = None, + limit: int = 15, +) -> list[ExperimentSummary]: + """Search experiments by title/text/tag/custom id.""" + raise NotImplementedError + + +async def get_experiment_context(experiment_id: int) -> ExperimentContext: + """Metadata, unfinished steps, linked resources and recent comments, compact.""" + raise NotImplementedError + + +async def get_next_protocol_step(experiment_id: int) -> NextStep | None: + """Next unfinished step: text, parsed consumables, stock preview.""" + raise NotImplementedError + + +async def list_experiment_templates( + query: str | None = None, + limit: int = 10, +) -> list[TemplateSummary]: + """List/search experiment templates with a short description (semantic ranking).""" + raise NotImplementedError + + +async def validate_protocol_template( + entity_type: str, + entity_id: int, +) -> ValidationReport: + """Check labvoice annotations + resource mappings of a template/experiment.""" + raise NotImplementedError + + +async def complete_next_protocol_step( + experiment_id: int, + comment: str | None = None, + quantities: dict[str, float] | None = None, +) -> CompleteStepResult: + """Allocate + decrement stock, finish the next step and post the comment in one call.""" + raise NotImplementedError + + +async def complete_protocol_step( + experiment_id: int, + step_id: int, + comment: str | None = None, + quantities: dict[str, float] | None = None, +) -> CompleteStepResult: + """Complete an explicit step (for “redo step 3” voice commands).""" + raise NotImplementedError + + +async def record_protocol_observation( + experiment_id: int, + comment: str, + step_id: int | None = None, +) -> ObservationResult: + """Add a comment (+ optional step body edit) without completing anything.""" + raise NotImplementedError + + +async def create_experiment_from_template( + template_id: int, + title: str | None = None, +) -> CreateExperimentResult: + """Start a new experiment from a template (interactive template pick happens first).""" + raise NotImplementedError + + +async def adjust_inventory( + amount: float, + unit: str, + container_id: int | None = None, + resource_key: str | None = None, + note: str | None = None, +) -> InventoryResult: + """Restock/correct a container (voice: “add 500 mL to …”).""" + raise NotImplementedError + + +async def scan_instance() -> ScanResult: + """Inventory containers, detect resource markers, propose resource matches.""" + raise NotImplementedError + + +async def map_resource(resource_key: str, item_id: int) -> MappingEntry: + """Bind a semantic resource_key to an eLabFTW items id.""" + raise NotImplementedError + + +async def export_mapping() -> dict[str, Any]: + """Export the resource_key → item_id mapping store as portable JSON.""" + raise NotImplementedError + + +async def import_mapping(data: dict[str, Any]) -> dict[str, Any]: + """Import a mapping file; ambiguous matches are proposals requiring approval.""" + raise NotImplementedError + + +TOOL_FUNCTIONS: tuple[Any, ...] = ( + find_experiments, + get_experiment_context, + get_next_protocol_step, + list_experiment_templates, + validate_protocol_template, + complete_next_protocol_step, + complete_protocol_step, + record_protocol_observation, + create_experiment_from_template, + adjust_inventory, + scan_instance, + map_resource, + export_mapping, + import_mapping, +) + + +def register_tools(mcp: Any) -> None: + """Register every tool function on the FastMCP instance.""" + raise NotImplementedError diff --git a/src/mcp_server/workflows/__init__.py b/src/mcp_server/workflows/__init__.py new file mode 100644 index 0000000..d1a74bb --- /dev/null +++ b/src/mcp_server/workflows/__init__.py @@ -0,0 +1 @@ +"""Aggregate workflow services (the point of the server).""" diff --git a/src/mcp_server/workflows/__pycache__/__init__.cpython-313.pyc b/src/mcp_server/workflows/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c496d0e71c98e557a659796d1a036464530847c GIT binary patch literal 236 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 literal 0 HcmV?d00001 diff --git a/src/mcp_server/workflows/inventory.py b/src/mcp_server/workflows/inventory.py new file mode 100644 index 0000000..9be65d2 --- /dev/null +++ b/src/mcp_server/workflows/inventory.py @@ -0,0 +1,37 @@ +"""adjust_inventory and stock reads.""" + +from mcp_server.config import Settings +from mcp_server.elabftw import ElabftwClient +from mcp_server.journal import SagaJournal +from mcp_server.models import ContainerStock, InventoryResult +from mcp_server.resolve import ResourceResolver + + +class InventoryWorkflow: + def __init__( + self, + client: ElabftwClient, + resolver: ResourceResolver, + journal: SagaJournal, + settings: Settings, + ) -> None: + self.client = client + self.resolver = resolver + self.journal = journal + self.settings = settings + + async def stock_for_resource(self, resource_key: str) -> list[ContainerStock]: + """Containers holding the resolved resource with compatible units and current stock.""" + raise NotImplementedError + + async def adjust_inventory( + self, + *, + amount: float, + unit: str, + resource_key: str | None = None, + container_id: int | None = None, + note: str | None = None, + ) -> InventoryResult: + """Restock/correct a container (voice: “add 500 mL to …”); journaled.""" + raise NotImplementedError diff --git a/src/mcp_server/workflows/protocol.py b/src/mcp_server/workflows/protocol.py new file mode 100644 index 0000000..1917283 --- /dev/null +++ b/src/mcp_server/workflows/protocol.py @@ -0,0 +1,63 @@ +"""complete_next/complete/observation workflows (step completion saga).""" + +from typing import Mapping + +from mcp_server.config import Settings +from mcp_server.elabftw import ElabftwClient +from mcp_server.journal import SagaJournal +from mcp_server.models import ( + CompleteStepResult, + NextStep, + ObservationResult, +) +from mcp_server.resolve import ResourceResolver + + +class ProtocolWorkflow: + def __init__( + self, + client: ElabftwClient, + resolver: ResourceResolver, + journal: SagaJournal, + settings: Settings, + ) -> None: + self.client = client + self.resolver = resolver + self.journal = journal + self.settings = settings + + async def get_next_step(self, experiment_id: int) -> NextStep | None: + """Next unfinished step: text, parsed consumables, stock preview; None when protocol complete.""" + raise NotImplementedError + + async def complete_next_step( + self, + experiment_id: int, + *, + comment: str | None = None, + quantities: Mapping[str, float] | None = None, + ) -> CompleteStepResult: + """Headline workflow: allocate + decrement stock, finish step, post comment, journaled saga.""" + raise NotImplementedError + + async def complete_step( + self, + experiment_id: int, + step_id: int, + *, + comment: str | None = None, + quantities: Mapping[str, float] | None = None, + ) -> CompleteStepResult: + """Same saga with an explicit step id (for “redo step 3” voice commands).""" + raise NotImplementedError + + async def record_observation( + self, + experiment_id: int, + comment: str, + *, + step_id: int | None = None, + body: str | None = None, + ) -> ObservationResult: + """Add a comment (+ optional step body edit) without completing anything.""" + raise NotImplementedError diff --git a/src/mcp_server/workflows/setup.py b/src/mcp_server/workflows/setup.py new file mode 100644 index 0000000..c67d6ef --- /dev/null +++ b/src/mcp_server/workflows/setup.py @@ -0,0 +1,32 @@ +"""Instance onboarding: scan, mapping, template validation.""" + +from mcp_server.config import Settings +from mcp_server.elabftw import ElabftwClient +from mcp_server.models import MappingEntry, ScanResult, ValidationReport +from mcp_server.resolve import ResourceResolver + + +class SetupWorkflow: + def __init__( + self, + client: ElabftwClient, + resolver: ResourceResolver, + settings: Settings, + ) -> None: + self.client = client + self.resolver = resolver + self.settings = settings + + async def scan_instance(self) -> ScanResult: + """Walk /items, inventory containers, detect markers, propose resource matches.""" + raise NotImplementedError + + async def map_resource(self, resource_key: str, item_id: int) -> MappingEntry: + """Bind resource_key → item_id (idempotent, upsert into the mapping store).""" + raise NotImplementedError + + async def validate_protocol_template( + self, entity_type: str, entity_id: int + ) -> ValidationReport: + """Check annotations + mappings of a template/experiment; blocking issues are errors.""" + raise NotImplementedError diff --git a/tests/__pycache__/conftest.cpython-313-pytest-9.1.1.pyc b/tests/__pycache__/conftest.cpython-313-pytest-9.1.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c036680322c38a59c9856f19c69425e6bd3bcede GIT binary patch literal 7145 zcmb7IO>i4WcJ3JrfWZ$zkm5fja!AoKVT*ud(e{$!DyAeVB1l473~9?{Wx*jZAV&gc zke&f4s&b&CRBYEC_Ag3wi;t_y9$eYW9;3=0HaDV}Dq<(gs$@5*ly79X`Pp0E>zToi zBxW~Lg~pri*RQ+Z&)4tGNn2Z(!1J?z_~C

L%pZ_~JbQhu}`$^AYlt$b=G^llcWM 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 UtFH{y(Wu*xHt1yhjAHQczZc@%O#lD@ literal 0 HcmV?d00001 diff --git a/tests/__pycache__/conftest.cpython-313.pyc b/tests/__pycache__/conftest.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8df5db4be19c605df07da8eff942878881fd8ce9 GIT binary patch literal 6998 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 b2MWF|`25kz%0L|qdHtyWR>sdL7RUbvaE7F7 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/fakes.cpython-313.pyc b/tests/__pycache__/fakes.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44fa8648681c614d2c14a57e035b375a1e4e57b2 GIT binary patch literal 27772 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 K=qaFlnErpAy!?d# literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_allocate.cpython-313.pyc b/tests/__pycache__/test_allocate.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d469870f345e8d45031cb629546b56290938f769 GIT binary patch literal 10129 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 Nxauvy5>zRF{SOr6y^;U` literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_annotate.cpython-313-pytest-9.1.1.pyc b/tests/__pycache__/test_annotate.cpython-313-pytest-9.1.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53beb48d2c8cd88463aa0290def2578506c95d78 GIT binary patch literal 25466 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 {g=bN!WINw|U`lfvU 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_annotate.cpython-313.pyc b/tests/__pycache__/test_annotate.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..458d99845a281a8abaa5ac48adaf59240830dc0c GIT binary patch literal 9531 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_config.cpython-313-pytest-9.1.1.pyc b/tests/__pycache__/test_config.cpython-313-pytest-9.1.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c873f2d252ba61a093376268a8c02afcb34d6bdf GIT binary patch literal 12818 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 O;+x{*j(~WE4fp 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_errors.cpython-313-pytest-9.1.1.pyc b/tests/__pycache__/test_errors.cpython-313-pytest-9.1.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..489cb0d44ebaa1155a1fcb44bea0502c1491a8ae GIT binary patch literal 18813 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_errors.cpython-313.pyc b/tests/__pycache__/test_errors.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08170d9dfb639e7fad033f23b41cd9eeade1a84d GIT binary patch literal 3621 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 Ue{`;L1>bVN&Bb?0SD~i=2Y*!tO#lD@ literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_journal.cpython-313.pyc b/tests/__pycache__/test_journal.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72aaafb36d5a434aaef72017c93b113b9ef295dc GIT binary patch literal 10964 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_models.cpython-313-pytest-9.1.1.pyc b/tests/__pycache__/test_models.cpython-313-pytest-9.1.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08b14a716f304b893cf9137c969e970df8f2aab0 GIT binary patch literal 11795 zcmeGiOKjZ6mE5KF$JO6g{jr!o0-QqGknAMo7re=OmT4i@=rf`^>+!5`v(^ME8-y=9|H1IPUZ+F^K#@O zPa^al9TlvI#EmwPnB=y^NgP_D7ZamNlB9LQ#nh-s#L+ZKk2aFV(I(O~+Dw{9TS&`j zD`^FqhP@nVlVbqeLSP6OOC6Uj7|#$iCSW?m~;+2Wk^ z`TWOH&YUf(Ia?x{RVvt$bww>|mUO6CPz~u1KOZ

3QpjWb1Z8gZt|x)c{;a+_F`> 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 YyPl5n9qZ{dpIScv*had6@1b4&2OBlJEC2ui literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_models.cpython-313.pyc b/tests/__pycache__/test_models.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11cd32d67582d25474c1bf749198a1ea3a8541a7 GIT binary patch literal 3583 zcmbVPO>7)j9e?w&pX0B!-I9bj8Jl%BlcpO2gm#^T)=iTpn_yB;0+k{djd$KU(~f60 zZ)QtY2=I||NhMmz5*Ob{E|dcjJ#Yw|5T{)Sh1u{$s#%t;=2)(pXZfneG#HaQK-iF(203hIK#rJMkfUY}W0tz}mx+;H;A1qpY5Rd^*-K&IH6yy*9sMeo zSFYSs_z);2XtEl$-k~j??JA(f)u!)87Yr~Dn85RP4`qhu=jw$^7rw)@K?6auJw8+e zG;Pr8xM<>PO-9~RoZH$ ztyM(Vp^kQFeRe}DwbfEvD~Yz5jt0MDZS@$)ZCIA$s#h1#{ zjTQpK)68}uDll|Ef#N+PZW4nR+gG1GG5R*GfjOmE z6ntaZDw`!b&U#LT29X#j<`Q z+b4`{r?2OCtOTnfDB;&YpcQ@PL1DIQKhqs;dVTT1fd9;PwAs7QZD{4TTJC7&XRRs) z>j+@rmIJ`Vv9coX1&pcgTpFU`F0k}@SZd)h;_Krl=-rdK>^fXs3Y-=KhS8E| z>#pyHH>tz3jUa?v6Zim=DqILmk?64@%?N<7)p8;F_wccrezE{N3B%Eh!>@t>sI-aq zZ>{~fqrJHL`ldE|=j?lD*UoQf(`|LStxb1ZAUL&E3{lSlg~t;>{TV8dyrl_p5rTu? zpI+qa#s>o)#qUhw?;QJc5&=)5daNAy58E{*?d%UV_X7<|S|8nK*0=RDu zi2!D0hZn#~MVhseHlAhlUCOX?v|+QzwIRUSuGeJr@sHq8%mBfqCH4Zm4TTTW+YQRx z73xQjZg@JT3Jlf2v(V=O1#t|ZH#iqzWrtDdC=fk}Ds%AacZhN~>c)o@5fx$uau%o~ z5wYA58zSb`;GFCX%rD~_-vhBq{xNR;Ed3~ZVDrG#=EVL-h5c)9uA7~L@mWUA!sF@jpKm*4FVE@GO{&|Ch7KA3hcK=p=3H>%-OdRGMo{JYmpVE>=;R95b0Tzj*x!+|@3Waq$P)$gu z(M?>(!ZUWM8}Pm4Oza|TcMhKLH4v-h-y;X_e*I&qGcvdO#-=uossT3ER%hDU417P- z4tDTYY^%k#RunDIQW#^BXDrJJYL+G39O8P*!G9xa!q<6WrPi?E#t>l2G4T`>HVzJ` z3IRfFte8S#i$$g>7?ofMA}fk`FC1T3pSTR0#&O7`;6kE@$(hFN7vQ*m2%hK#tUXf004Jp#}*3giY-#P@f L?V*%Z65IS2L0Bws literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_resolve.cpython-313-pytest-9.1.1.pyc b/tests/__pycache__/test_resolve.cpython-313-pytest-9.1.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67daf28d11c270c3091366045caf45a489486165 GIT binary patch literal 15132 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%0Ddne9prryD5 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_rest_api.cpython-313.pyc b/tests/__pycache__/test_rest_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b4adaa406b08189d534ae6fa255aee7c89addd0 GIT binary patch literal 9530 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 TeYo38cdXUB=#cUcVDEneduu#z literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_safety.cpython-313.pyc b/tests/__pycache__/test_safety.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bd067b39765a151cb1a00f9eb265cecdc8126b7 GIT binary patch literal 6372 zcmc&&TTolcneKDZkI>H*nIZF2t zGq5kjd5EX>VLaJ!nW>~Qr1CIKRUSw(mG#zcRm{{r>_Z+T%e&H?B2|-Q^WZmZvXyex zKJ4E|(h)F}E7_{8ZBVP#{r`Ra|L_00H$5IFf)x7AKfL>|9)$ite^isBQrLU}g$GDN z7)gx8-e53eezTZ`Z|(+noyWXL+xQ!{>jDedr;Sid1_A=$VUbg%#g|_tSlbWGdzqAMP#%Z>rCA$t%lAKiZc`<%RiO&#GCZeto zorp&>X;~G&{OsiEjHepUDMK_PNkHD_@0Jml41QT5}r zHJMUV!Gnro)mBzzxT<4QWjiQL!v|8}qQTC- z@r)jB2WJTKtd>=EgU_ld-EhY>RhLsLOfr?|uo2o(Jg=4F7CA6Q(Dm;BXQ;fS-5|bbw(Z z$f&ED5y5mjF{~4TWdt&^9={Wt%BIqZ7*z&CCWa6<&EHfvIOxb=;)JS+G#LTY<-2Jf zBj%jKnR&wra@Pd;i}4XAU)-h8pX?;63%<xIcVQ)tz5*vQwKbjiv+$|+ry1MJXQ4J-yjaKnfT4LU?rNE8AKj!3gRv{RciVT5drzm_ozoX9sqH0(H$i@3< zle5;d!4NFcIwn=~Bz%z8_(6+eDGWHR;0#WwIz9yr6wS!5AX`KwU#RFiocA4G9?tuY zE?)mS+*b@=coM!)@C`t|;(OThQO}a^)0R(K3jQPc@P)i@pw!k~Z0mc{)>jDhL%z&B zy!G*|d|O{W(7z#|ro9g*KbkBCkLH6%p9VYsWaC55-v>MIGo@hD!^sDe_n8eFs`q|4 z{=xYDlMnko>RWp2)5%XJ3+~R}1rI*AAl%O?YYe23{J0{+F99 z)DwEtKR!6@YJoCZ(hW}Ny~HBrm{9(*=`1HM*`22mzmZATN9bd;%L zIM^79Q1{!BqU?kf8=@=~uuvOG>~?&YSk<;AKJXGJvAvbCR6*h+R+Oj>BH3EdHXWfG zRdpJz2xZOE9u=kl8=}IFk$?bJwZO>Dl(+_Rwkhz1s4YUFe@Bw)s=Z2%H&6mhL~=&$ zukze)K@SPAM9K9R$N_SMAbQp#$$grw`o6;Kw)au)>}}||rs3JDG0j38Ts31_efA1W zVXR6G&u$@wlo0;@`#;#m|9}os;zz{yQu-ZHHfbUjXB9%^X(c>9YWRtcvvEBOJ{F@s z4AjD4#BIP$5C1fLHUTp##uTNn1lFiB6JTKF6op_fG1Vi0Aa4Vhfvu--GtJV;f6jra z0$noD=;siVrxkEg9e>UmZ1{x1Oc9FsqF8p}x^vSCP^%2SU|cuDA|<~uN`7Oo&X~C< zh>a%ch3c3|dSg}6Yck33xwICS)8sT3W-*rY&0BWNx#{-jr0Wj=m;>8)j9g)Ih; z<$}kc>g6U6B6nN%!X&GE;z*I0g0Y523|5;loIpTlQ-lChSg5mj`9gP@kpt}%3D9j- z2S!e^@wh^ncliV?VM^c^_S6*2xhs@G>vsURIvj@CvAJdwy^K0oP1;@8ZZ)KCtdNuq+fj?TaH{ zH|{Gow&xq$SNNZ)kH+)ip+e(u(KEa_QmXeaURn1wFE!;3_O9v$-?_!>CAas(s~=p= z2gbj6`_Zk(-_DIip7u(Gz<9wuzIeH0_vP*TO8&j~?CUQ7{WD8vm$OAzSKifCa(MHO z)@A!=uAjJ8E)~R+tI;Ro*-~9_DfnsYC#^r+SEze!<=CU(uUr4A^`G|@I!88ayiEXn zcQ@R7E!QxRb6niC(;CFOuP}ddBlrHLWWm+8(o}GD=Xh!L((0L9eL#u_vsYn#Q5F0`OV7zuX@y>4wJeS+CaCVb37dE0 z3jHz5z*FKgaEX_Ja)fasbY@;gO~y2e&%p2h8&Ji4bSSz%_&j7=K@?wv3ge>bwDOdO zb-?)Q{Xb@2|4B^MVwL-UnKSJIn$&sm5Y2{Zc8PZCiKk_pN~YrG<#oY95pPD--UHNf z%))yB02ncB6rZt)T^J%U!Z&C}p$cE7*-gkggc?K{p7QR)C7bBkDLhJr-lQ3I1484F z2}Tt(>iVk|hUvwLPJsLrGKxW8^S&bAlIL5ByqM?3r~IK^u&Cr{Tk$?>%(b82ONo`^JNP#xMkcd^*Q*%3-Nocgic+Xu z9Q|)$p~PZG&9|TQzr8y6qtLQ%d1Pg%xTia}ryHtX)?ffrYoO072_-4Rb6GXiOR$xg5KBS&{~? zT<)l=K?MFA+LuXXco|QV8a&{)%mJp-@Tf-pqKp)fm#NF~zh-anG;~1cPnIF0SWybK znrx-?P0VOIQf%tXH+B9;)A0|S_xMuiU@>$oA3C;j>5C()`Y$^Rq4P!G`FldCq4A;P zBS*gZ_P>N4H~rh5-1x1h{cjhVZx&hDFiRxbC$e;kM)NOKUi4q z{34zYoy~jC-s9K32Ui0B?(NDsx^mvG7cLa)`pS3yC82LpcL(6qrI!&$+h>F4!^d_Kc31rUwiHn{On@=h99wx@9+Qa z{^zWNY1rft+ps}PFPfZ;u+c&rTff^{WSa8~P|cq-t<)C|zFuJZp0kb2I78+8H_YOT Q<1XgJ=3WOA#u(=MKhe&p8UO$Q literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_templates.cpython-313-pytest-9.1.1.pyc b/tests/__pycache__/test_templates.cpython-313-pytest-9.1.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aeadc77d21e1c133a5ce732935b75ba86605fc5f GIT binary patch literal 23269 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_templates.cpython-313.pyc b/tests/__pycache__/test_templates.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ec0a9aa1fd804ffcb1608706d38eb9b8864fd4e GIT binary patch literal 9252 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_tools_mcp.cpython-313-pytest-9.1.1.pyc b/tests/__pycache__/test_tools_mcp.cpython-313-pytest-9.1.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d383cbd276e83145f4d896a1050b9345a42007e5 GIT binary patch literal 25465 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_workflows_inventory.cpython-313-pytest-9.1.1.pyc b/tests/__pycache__/test_workflows_inventory.cpython-313-pytest-9.1.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5558768fc2bf6210a7ae73ebc28f5b82f8c219a GIT binary patch literal 15293 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_workflows_inventory.cpython-313.pyc b/tests/__pycache__/test_workflows_inventory.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b557bcec1468d765e5d4454077177b3ad76f5fac GIT binary patch literal 6917 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 b;k2;f6NOWpDx6Mm+PUfT31bBQxq|)!L-Tmb literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_workflows_protocol.cpython-313-pytest-9.1.1.pyc b/tests/__pycache__/test_workflows_protocol.cpython-313-pytest-9.1.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ec54a08a6a3d9031f441f21728b33ab2556b90d GIT binary patch literal 64814 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

@Ghb3TqfoME8H>;My<_1>xA&-ty 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 &;W!-$&gg--N-qi> zD`cHAQPDRsf(|bz9Tn9KeRAayf9Kn8e;Xd@KRdfWxw65$lBH%h@3k{kV=9_s#u#6 zn-XGEN|Y0#{JH31*^KUltJ~*bW=WtN${bL{P7%hu1}w~KB=aIDMX`v06|*u#f!Cq64PHn z2Y%Lmu1K3wqB|kFmxD}`_Ptn>#LuK%hPca+b|J%E82cuq-Rllg64+=`72Sh1FZB)f z@_)|{9uhzGNvJ-lB!zim_fox^hb)Q?2sBJR+W$YO#}=PdzGD2EizrItR~7#AxR^DL zL719x(JwM}Drd}#KH#tjccdh;wG{wcJBKY~&a>u64a7|@SK1CR1QTS<3W7btQ*DC! zSPRIVu**oDVOytFF-A|jcHPA=PTK&z5XQ_B1Spxwd_Nk`0**jnUAJScm{=I{G$r^3DLtIs&C6 zep-jxiqkdd5Leo4B=^f`dE&4_79lf7+@E8Bw4?AFa~6Mn;@$$8#R<0Zx$b;kB}b9z zk9|S`iU5gX*dVT8p-v#SFt3>Q%taXA=Sr}nlSc)_r16seESGaR3dRT^Ju(+2e++I< zScT`q+=(!rj^n3ahxpo9q0e#YOx@9>bkq=!8q!hrJ&t|G_*PPq4Y&=GoB>AqgIu4l z9iZ^FiJx|$R^Dp=16Gys5-ns#O3N6%eMupcK!thuq)#QKBqg`m!zZt*q!b?_Y++?d z2V53L0nGDmXI9X9`$+aYWcpsJ%ka4);Twuv;5P4<5%u9lWI@hGaC)b95u>iX2{CdO z0HL&nc9jI}#Qb@Rc_Tj)BMChai$=8w9{W9dl!l|D|Jl|)-iMbTcPCxv zQV!TLcCd8X_uWaU(-1oisgq1of!l|hbkyfzl$;oR>7dU|Ign=YV=rn&0Re3`vq1lj zN=DC7OP6xNpog0vZeS%F_*giVhuc#o+$%ZkB6m#Y{On&g+>^P9TtIl0FBj-dJffV?Zs8K=$mydHPX(Umf69IH7o6kYxP8y6MSkD28j*kL zS&fbFezrs8`=8ZV`7!?4HUZVToxJVY(F*ZIN C5}#WD literal 0 HcmV?d00001 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..f1a22da --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,164 @@ +"""Shared fixtures for the LabVoice MCP server test suite. + +Conventions pinned by this suite (adjust here if the implementation diverges): + +1. Workflows and services receive their collaborators via constructor + arguments (``client``, ``resolver``, ``journal``, ``settings``) exactly as + declared in the scaffolds — tests inject ``FakeElabftwClient`` / + ``StubResolver`` and a real ``SagaJournal`` against a temp SQLite file. +2. ``SagaJournal`` has an explicit ``connect()``/``close()`` lifecycle. +3. The REST app and MCP tools resolve their read services through + ``mcp_server.server.build_services(settings)`` (the wiring container from + the scaffold); tests monkeypatch that factory. The service container is a + dict with the keys implied by the scaffold's build_services comment: + ``client``, ``resolver``, ``journal``, ``protocol``, ``inventory``, + ``setup``, ``templates``. +4. MCP-level tests drive the real ``FastMCP`` server (from ``mcp`` 2.1.x) + in-process via ``mcp.client.Client``. +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +import pytest + +# Make the vendored elabapi_python client importable for tests (it is vendored, +# not installed). Its deps (six, urllib3, certifi) come from the dev group. +_VENDOR = Path(__file__).resolve().parent.parent / "vendor" / "elabapi-python" +if str(_VENDOR) not in sys.path: + sys.path.insert(0, str(_VENDOR)) + +from mcp_server.config import Settings +from mcp_server.journal import SagaJournal +from mcp_server.resolve import ResourceResolver +from mcp_server.templates import TemplateService +from mcp_server.workflows.inventory import InventoryWorkflow +from mcp_server.workflows.protocol import ProtocolWorkflow +from mcp_server.workflows.setup import SetupWorkflow + +from fakes import ( + FakeElabftwClient, + StubResolver, + make_experiment, + make_item, +) + + +@pytest.fixture +def settings(tmp_path, monkeypatch) -> Settings: + """Isolated settings: temp DB, no env/.env interference, distinctive API key.""" + for var in ( + "ELABFTW_URL", + "ELABFTW_API_KEY", + "LABVOICE_DB_PATH", + "LABVOICE_REST_TOKEN", + "LABVOICE_TEMPLATE_DESC_LIMIT", + "LABVOICE_EMBED_MODEL", + "LABVOICE_UNIT_WHITELIST", + "LABVOICE_EXPIRY_FIELD", + ): + monkeypatch.delenv(var, raising=False) + return Settings( + _env_file=None, + elabftw_url="https://eln.example.org", + elabftw_api_key="labvoice-secret-key-do-not-leak", + elabftw_timeout=5.0, + elabftw_retries=0, + labvoice_db_path=tmp_path / "journal.sqlite", + ) + + +@pytest.fixture +def client() -> FakeElabftwClient: + """Standard scenario: experiment 123 (steps 9, 10) and ethanol item 12.""" + return FakeElabftwClient(experiments=[make_experiment()], items=[make_item()]) + + +@pytest.fixture +def resolver_stub() -> StubResolver: + """ethanol_absolute → item 12; other keys raise clarification.""" + return StubResolver(mappings={"ethanol_absolute": 12}) + + +@pytest.fixture +async def journal(settings) -> SagaJournal: + journal = SagaJournal(settings.labvoice_db_path) + await journal.connect() + yield journal + await journal.close() + + +@pytest.fixture +def protocol(client, resolver_stub, journal, settings) -> ProtocolWorkflow: + return ProtocolWorkflow( + client=client, resolver=resolver_stub, journal=journal, settings=settings + ) + + +@pytest.fixture +def inventory(client, resolver_stub, journal, settings) -> InventoryWorkflow: + return InventoryWorkflow( + client=client, resolver=resolver_stub, journal=journal, settings=settings + ) + + +@pytest.fixture +def setup(client, resolver_stub, settings) -> SetupWorkflow: + return SetupWorkflow(client=client, resolver=resolver_stub, settings=settings) + + +@pytest.fixture +def templates_service(client, settings) -> TemplateService: + return TemplateService(client=client, settings=settings) + + +@pytest.fixture +async def real_resolver(settings): + """Real ResourceResolver over a temp DB — resolver/mapping-store tests only.""" + resolver = ResourceResolver(settings) + if hasattr(resolver, "connect"): + await resolver.connect() + yield resolver + if hasattr(resolver, "close"): + await resolver.close() + + +@pytest.fixture +def service_container(client, resolver_stub, journal, settings, templates_service) -> dict: + """Fake ``build_services`` container (keys per scaffold comment).""" + return { + "client": client, + "resolver": resolver_stub, + "journal": journal, + "protocol": ProtocolWorkflow( + client=client, resolver=resolver_stub, journal=journal, settings=settings + ), + "inventory": InventoryWorkflow( + client=client, resolver=resolver_stub, journal=journal, settings=settings + ), + "setup": SetupWorkflow(client=client, resolver=resolver_stub, settings=settings), + "templates": templates_service, + } + + +@pytest.fixture +def patch_build_services(monkeypatch, service_container): + """Intercept ``build_services`` wherever a transport layer imports it.""" + + def _patch(): + import mcp_server.rest as rest_module + import mcp_server.server as server_module + import mcp_server.tools as tools_module + + for module in (server_module, rest_module, tools_module): + monkeypatch.setattr( + module, + "build_services", + lambda _settings, _container=service_container: _container, + raising=False, + ) + return service_container + + return _patch diff --git a/tests/fakes.py b/tests/fakes.py new file mode 100644 index 0000000..f2b9162 --- /dev/null +++ b/tests/fakes.py @@ -0,0 +1,505 @@ +"""Test doubles shared across the suite. + +Three fakes live here, each at a different seam: + +* :class:`FakeElabftwClient` duck-types the ``ElabftwClient`` adapter interface. + It is a stateful in-memory eLabFTW instance used by workflow/service tests, + so saga behaviour can be asserted against real state changes. +* :class:`StubResolver` duck-types ``ResourceResolver`` with a plain dict of + mappings, keeping workflow tests independent of the SQLite mapping store. +* :func:`stub_elabapi` installs fake ``elabapi_python`` API classes into the + ``mcp_server.elabftw`` module namespace. Convention under test: the adapter + resolves vendored API classes as module globals of ``mcp_server.elabftw`` + (``from elabapi_python import ExperimentsApi`` ...) and instantiates them + with an api_client. If the implementation wires this differently, only the + injection point in these stubs needs to move. + +Scenario builders (``make_experiment``, ``make_item`` ...) produce the standard +fixtures referenced throughout the tests. +""" + +from __future__ import annotations + +from dataclasses import dataclass, field + +from mcp_server.errors import ClarificationNeededError, NotFoundError, PermissionDeniedError +from mcp_server.models import ( + AllocationPolicy, + MappingEntry, + MappingProposal, +) +from mcp_server.schemas import ( + ContainerLink, + ElabftwComment, + ElabftwExperiment, + ElabftwInfo, + ElabftwItem, + ElabftwStep, + ElabftwTemplate, + StorageUnit, +) + + +# --------------------------------------------------------------------------- +# Annotation snippets (the labvoice:v1 format from planning §4) +# --------------------------------------------------------------------------- + +ANNOTATION_ETHANOL_FIFO = ( + "" +) + + +# --------------------------------------------------------------------------- +# Fake eLabFTW state (adapter-level) +# --------------------------------------------------------------------------- + + +@dataclass +class FakeStep: + id: int + body: str + finished: bool = False + ordering: int | None = None + + +@dataclass +class FakeComment: + id: int + body: str + created_at: str | None = None + + +@dataclass +class FakeContainer: + sub_id: int + qty_stored: float + unit: str + + +@dataclass +class FakeItem: + id: int + title: str + body: str = "" + extra_fields: dict = field(default_factory=dict) + containers: list[FakeContainer] = field(default_factory=list) + + +@dataclass +class FakeExperiment: + id: int + title: str + status: str = "running" + steps: list[FakeStep] = field(default_factory=list) + comments: list[FakeComment] = field(default_factory=list) + linked_items: list[int] = field(default_factory=list) + + +@dataclass +class FakeTemplate: + id: int + title: str + description: str = "" + tags: list[str] = field(default_factory=list) + steps: list[FakeStep] = field(default_factory=list) + + +def make_template(**overrides) -> FakeTemplate: + """Standard template: two plain steps, description with two paragraphs.""" + tpl = FakeTemplate( + id=7, + title="PCR cleanup", + description="Purify an amplicon after PCR.\n\nLonger protocol notes follow here.", + tags=["dna", "cleanup"], + steps=[ + FakeStep(id=41, body="Add binding buffer", ordering=1), + FakeStep(id=42, body="Elute", ordering=2), + ], + ) + for key, value in overrides.items(): + setattr(tpl, key, value) + return tpl + + +def make_experiment(**overrides) -> FakeExperiment: + """Standard experiment: step 9 (annotated) and step 10 (plain), both unfinished.""" + exp = FakeExperiment( + id=123, + title="Plasmid prep", + steps=[ + FakeStep( + id=9, + body=f"Add ethanol to the tube\n{ANNOTATION_ETHANOL_FIFO}", + ordering=1, + ), + FakeStep(id=10, body="Incubate 30 min", ordering=2), + ], + linked_items=[12], + ) + for key, value in overrides.items(): + setattr(exp, key, value) + return exp + + +def make_item(**overrides) -> FakeItem: + """Standard resource: ethanol with the marker comment and two containers.""" + item = FakeItem( + id=12, + title="Absolute Ethanol", + body="

Absolutely ethanol.

\n", + containers=[ + FakeContainer(sub_id=31, qty_stored=50.0, unit="mL"), + FakeContainer(sub_id=32, qty_stored=10.0, unit="mL"), + ], + ) + for key, value in overrides.items(): + setattr(item, key, value) + return item + + +class FakeElabftwClient: + """In-memory stand-in for the async eLabFTW adapter. + + Mirrors the ``ElabftwClient`` method surface. All mutations are recorded + in ``self.calls`` as ``(method_name, kwargs)`` tuples so tests can assert + exactly what changed (and that nothing changed when a workflow must abort). + ``read_only=True`` makes every mutating method raise + ``PermissionDeniedError`` like a canwrite=false API key would. + """ + + def __init__( + self, + *, + experiments: list[FakeExperiment] | None = None, + items: list[FakeItem] | None = None, + templates: list[FakeTemplate] | None = None, + storage_units: list[StorageUnit] | None = None, + read_only: bool = False, + ) -> None: + self.experiments = {e.id: e for e in (experiments or [])} + self.items = {i.id: i for i in (items or [])} + self.templates = {t.id: t for t in (templates or [])} + self.storage_units = storage_units or [ + StorageUnit(id=1, label="Bench fridge / Shelf 2") + ] + self.read_only = read_only + self.calls: list[tuple[str, dict]] = [] + self._next_comment_id = 500 + self._next_experiment_id = 1000 + + # -- call recording ---------------------------------------------------- + + def _record(self, method: str, **kwargs) -> None: + self.calls.append((method, kwargs)) + + def calls_of(self, method: str) -> list[dict]: + return [kwargs for name, kwargs in self.calls if name == method] + + def _deny_if_read_only(self) -> None: + if self.read_only: + raise PermissionDeniedError( + "The API key cannot modify eLabFTW; ask an admin for a writable key." + ) + + # -- reads --------------------------------------------------------------- + + async def get_info(self) -> ElabftwInfo: + self._record("get_info") + return ElabftwInfo(elabftw_version="5.0.0", api_version="2") + + async def search_experiments(self, *, q=None, tags=None, limit=15, offset=0): + self._record("search_experiments", q=q, tags=tags, limit=limit, offset=offset) + hits = list(self.experiments.values()) + if q: + hits = [e for e in hits if q.lower() in e.title.lower()] + if tags: + hits = [e for e in hits if any(t in tags for t in getattr(e, "tags", []))] + return [ + ElabftwExperiment(id=e.id, title=e.title, status=e.status) + for e in hits[offset : offset + limit] + ] + + async def get_experiment(self, experiment_id: int) -> ElabftwExperiment: + self._record("get_experiment", experiment_id=experiment_id) + exp = self._entity("experiments", experiment_id) + return ElabftwExperiment(id=exp.id, title=exp.title, status=exp.status) + + async def create_experiment(self, template_id: int, title=None): + self._record("create_experiment", template_id=template_id, title=title) + self._deny_if_read_only() + if template_id not in self.templates: + raise NotFoundError(f"Template {template_id} not found.") + tpl = self.templates[template_id] + new_id = self._next_experiment_id + self._next_experiment_id += 1 + exp = FakeExperiment( + id=new_id, + title=title or tpl.title, + steps=[ + FakeStep(id=s.id, body=s.body, ordering=s.ordering) for s in tpl.steps + ], + ) + self.experiments[new_id] = exp + return ElabftwExperiment(id=exp.id, title=exp.title, status=exp.status) + + async def get_steps(self, entity_type, entity_id): + self._record("get_steps", entity_type=entity_type, entity_id=entity_id) + steps = self._entity(entity_type, entity_id).steps + return [ + ElabftwStep(id=s.id, body=s.body, finished=s.finished, ordering=s.ordering) + for s in steps + ] + + async def finish_step(self, entity_type, entity_id, step_id): + self._record( + "finish_step", entity_type=entity_type, entity_id=entity_id, step_id=step_id + ) + self._deny_if_read_only() + for step in self._entity(entity_type, entity_id).steps: + if step.id == step_id: + if step.finished: + return ElabftwStep( + id=step.id, body=step.body, finished=True, ordering=step.ordering + ) + step.finished = True + return ElabftwStep( + id=step.id, body=step.body, finished=True, ordering=step.ordering + ) + raise NotFoundError(f"Step {step_id} not found on {entity_type} {entity_id}.") + + async def list_comments(self, entity_type, entity_id): + self._record("list_comments", entity_type=entity_type, entity_id=entity_id) + return [ + ElabftwComment(id=c.id, body=c.body, created_at=c.created_at) + for c in self._entity(entity_type, entity_id).comments + ] + + async def post_comment(self, entity_type, entity_id, body): + self._record( + "post_comment", entity_type=entity_type, entity_id=entity_id, body=body + ) + self._deny_if_read_only() + comment = FakeComment(id=self._next_comment_id, body=body) + self._next_comment_id += 1 + self._entity(entity_type, entity_id).comments.append(comment) + return ElabftwComment(id=comment.id, body=comment.body, created_at=None) + + async def search_items(self, *, q=None, limit=15, offset=0): + self._record("search_items", q=q, limit=limit, offset=offset) + hits = list(self.items.values()) + if q: + hits = [i for i in hits if q.lower() in i.title.lower()] + return [self._item_model(i) for i in hits[offset : offset + limit]] + + async def get_item(self, item_id: int) -> ElabftwItem: + self._record("get_item", item_id=item_id) + return self._item_model(self._entity("items", item_id)) + + async def get_containers(self, entity_type, entity_id): + self._record("get_containers", entity_type=entity_type, entity_id=entity_id) + item = self._entity("items", entity_id) + return [ + ContainerLink(id=c.sub_id, qty_stored=c.qty_stored, unit=c.unit) + for c in item.containers + ] + + async def set_container_quantity(self, entity_type, entity_id, subitem_id, qty_stored): + self._record( + "set_container_quantity", + entity_type=entity_type, + entity_id=entity_id, + subitem_id=subitem_id, + qty_stored=qty_stored, + ) + self._deny_if_read_only() + for container in self._entity("items", entity_id).containers: + if container.sub_id == subitem_id: + container.qty_stored = qty_stored + return + raise NotFoundError(f"Container {subitem_id} not found on item {entity_id}.") + + async def list_storage_units(self): + self._record("list_storage_units") + return list(self.storage_units) + + async def list_templates(self, *, q=None, limit=25, offset=0): + self._record("list_templates", q=q, limit=limit, offset=offset) + hits = list(self.templates.values()) + if q: + hits = [t for t in hits if q.lower() in t.title.lower()] + return [ + ElabftwTemplate(id=t.id, title=t.title, description=t.description, tags=t.tags) + for t in hits[offset : offset + limit] + ] + + async def get_template(self, template_id: int) -> ElabftwTemplate: + self._record("get_template", template_id=template_id) + if template_id not in self.templates: + raise NotFoundError(f"Template {template_id} not found.") + t = self.templates[template_id] + return ElabftwTemplate(id=t.id, title=t.title, description=t.description, tags=t.tags) + + # -- helpers ------------------------------------------------------------- + + def _entity(self, entity_type, entity_id): + if entity_type == "experiments": + if entity_id not in self.experiments: + raise NotFoundError(f"Experiment {entity_id} not found.") + return self.experiments[entity_id] + if entity_id not in self.items: + raise NotFoundError(f"Item {entity_id} not found.") + return self.items[entity_id] + + def _item_model(self, item: FakeItem) -> ElabftwItem: + return ElabftwItem( + id=item.id, + title=item.title, + body=item.body, + **{"extra_fields": item.extra_fields} if item.extra_fields else {}, + ) + + +# --------------------------------------------------------------------------- +# Stub resolver (resolver-level) +# --------------------------------------------------------------------------- + + +class StubResolver: + """Dict-backed ``ResourceResolver`` stand-in for workflow tests.""" + + def __init__( + self, + mappings: dict[str, int] | None = None, + *, + fail_on: set[str] | None = None, + options_by_key: dict[str, list[str]] | None = None, + ) -> None: + self.mappings = dict(mappings or {}) + self.fail_on = fail_on or set() + self.options_by_key = options_by_key or {} + self.resolved: list[str] = [] + + async def resolve(self, resource_key: str) -> int: + self.resolved.append(resource_key) + if resource_key in self.fail_on or resource_key not in self.mappings: + raise ClarificationNeededError( + f"I don't know which resource '{resource_key}' refers to.", + options=self.options_by_key.get(resource_key, []), + ) + return self.mappings[resource_key] + + async def find_candidates(self, resource_key: str) -> list[MappingProposal]: + return [ + MappingProposal(resource_key=resource_key, item_id=item_id) + for item_id in sorted(self.mappings.values()) + ] + + async def upsert_mapping(self, resource_key: str, item_id: int) -> MappingEntry: + self.mappings[resource_key] = item_id + return MappingEntry(resource_key=resource_key, item_id=item_id) + + async def list_mappings(self) -> list[MappingEntry]: + return [ + MappingEntry(resource_key=k, item_id=v) + for k, v in sorted(self.mappings.items()) + ] + + +# --------------------------------------------------------------------------- +# elabapi_python stubs (client construction seam, adapter tests only) +# --------------------------------------------------------------------------- + + +class StubElabapi: + """Fake vendored elabapi_python client hub. + + Each generated ``*Api`` class is replaced by a thin proxy that forwards + every method call to :meth:`handle`, which consults routes registered by + the test. Unrouted calls fail loudly, so adapter tests only ever pass + against the endpoints they explicitly define. + """ + + API_CLASSES = ( + "InfoApi", + "InstanceApi", + "ExperimentsApi", + "ExperimentsTemplatesApi", + "StepsApi", + "CommentsApi", + "ItemsApi", + "ContainersApi", + "StorageUnitsApi", + "LinksToItemsApi", + "UnfinishedStepsApi", + "TodolistApi", + ) + + def __init__(self) -> None: + self.routes: dict[tuple[str, str], object] = {} + self.calls: list[tuple[str, str, dict]] = [] + self.thread_ids: list[tuple[str, int]] = [] + + def route(self, api: str, method: str, handler) -> None: + self.routes[(api, method)] = handler + + async def handle(self, api: str, method: str, args: tuple, kwargs: dict): + self.calls.append((api, method, kwargs)) + self.thread_ids.append((f"{api}.{method}", __import__("threading").get_ident())) + if (api, method) not in self.routes and (api, "*") not in self.routes: + raise AssertionError(f"Unexpected elabapi call: {api}.{method}{args}{kwargs}") + handler = self.routes.get((api, method)) or self.routes[(api, "*")] + return handler(*args, **kwargs) + + +def make_stub_elabapi_cls(hub: StubElabapi, api_name: str): + class _ApiProxy: + def __init__(self, api_client=None, *args, **kwargs): + self.api_client = api_client + + def __getattr__(self, method: str): + async def _call(*args, **kwargs): + return await hub.handle(api_name, method, args, kwargs) + + _call.__name__ = method + return _call + + _ApiProxy.__name__ = f"Stub{api_name}" + return _ApiProxy + + +def stub_elabapi(monkeypatch, hub: StubElabapi) -> StubElabapi: + """Patch elabapi API classes (and Configuration/ApiClient) into mcp_server.elabftw.""" + import elabapi_python.rest as elabapi_rest + import mcp_server.elabftw as elabftw_module + + for api_name in hub.API_CLASSES: + monkeypatch.setattr( + elabftw_module, + api_name, + make_stub_elabapi_cls(hub, api_name), + raising=False, + ) + + class _StubConfiguration: + def __init__(self, host=None, api_key=None, username=None, password=None, **kw): + self.host = host + self.api_key = api_key + self.username = username + self.password = password + + class _StubApiClient: + def __init__(self, configuration=None, **kw): + self.configuration = configuration + + def set_default_header(self, name, value): + pass + + monkeypatch.setattr(elabftw_module, "Configuration", _StubConfiguration, raising=False) + monkeypatch.setattr(elabftw_module, "ApiClient", _StubApiClient, raising=False) + monkeypatch.setattr( + elabftw_module, "ApiException", elabapi_rest.ApiException, raising=False + ) + return hub diff --git a/tests/test_allocate.py b/tests/test_allocate.py new file mode 100644 index 0000000..417a805 --- /dev/null +++ b/tests/test_allocate.py @@ -0,0 +1,176 @@ +"""allocate.py — unit whitelist/conversion + allocation policies (plan §4, §7). + +Tested conversion pairs per the plan: mL↔L and the mass chain μg↔mg↔g↔kg; +anything outside the whitelist or across dimensions must be a clarification, +never a guess. +""" + +import pytest + +from mcp_server.allocate import are_compatible, choose_containers, convert +from mcp_server.errors import ClarificationNeededError, InsufficientStockError +from mcp_server.models import AllocationPolicy, ContainerStock + + +def stock(cid: int, available: float, unit: str = "mL") -> ContainerStock: + return ContainerStock(container_id=cid, amount=f"{available} {unit}", available=available, unit=unit) + + +# --- unit compatibility ----------------------------------------------------- + + +@pytest.mark.parametrize( + ("a", "b"), + [("mL", "L"), ("L", "mL"), ("mg", "g"), ("g", "kg"), ("μg", "mg"), ("ea", "ea")], +) +def test_compatible_within_dimension(a, b): + assert are_compatible(a, b) + + +@pytest.mark.parametrize( + ("a", "b"), + [("mL", "mg"), ("L", "ea"), ("ea", "mL"), ("g", "μL")], +) +def test_incompatible_across_dimensions(a, b): + assert not are_compatible(a, b) + + +@pytest.mark.parametrize("unit", ["fl-oz", "cups", "", "mmol"]) +def test_unknown_units_are_never_compatible(unit): + assert not are_compatible(unit, "mL") + assert not are_compatible("mL", unit) + + +# --- conversion ------------------------------------------------------------- + + +def test_volume_conversions(): + assert convert(1.0, "L", "mL") == pytest.approx(1000.0) + assert convert(500.0, "mL", "L") == pytest.approx(0.5) + + +def test_mass_conversions(): + assert convert(1.0, "g", "mg") == pytest.approx(1000.0) + assert convert(1.0, "kg", "g") == pytest.approx(1000.0) + assert convert(1000.0, "mg", "g") == pytest.approx(1.0) + assert convert(1000.0, "μg", "mg") == pytest.approx(1.0) + + +def test_count_is_identity(): + assert convert(3.0, "ea", "ea") == 3.0 + + +def test_cross_dimension_conversion_is_a_clarification(): + with pytest.raises(ClarificationNeededError): + convert(1.0, "mL", "mg") + + +def test_unknown_unit_conversion_is_a_clarification(): + with pytest.raises(ClarificationNeededError): + convert(1.0, "fl-oz", "mL") + + +# --- fifo allocation -------------------------------------------------------- + + +def test_fifo_takes_from_lowest_container_id_with_stock(): + allocations = choose_containers( + [stock(45, 5.0), stock(31, 50.0)], required=2.0, unit="mL", policy=AllocationPolicy.FIFO + ) + assert len(allocations) == 1 + assert allocations[0].container_id == 31 + assert allocations[0].take == pytest.approx(2.0) + assert allocations[0].remaining == "48.0 mL" + + +def test_fifo_splits_across_containers_when_first_is_short(): + allocations = choose_containers( + [stock(31, 1.5), stock(32, 10.0)], required=2.0, unit="mL", policy=AllocationPolicy.FIFO + ) + assert [a.container_id for a in allocations] == [31, 32] + assert allocations[0].take == pytest.approx(1.5) + assert allocations[1].take == pytest.approx(0.5) + assert allocations[1].remaining == "9.5 mL" + + +def test_fifo_skips_empty_containers(): + allocations = choose_containers( + [stock(31, 0.0), stock(32, 10.0)], required=2.0, unit="mL", policy=AllocationPolicy.FIFO + ) + assert [a.container_id for a in allocations] == [32] + + +def test_fifo_exact_fit_leaves_container_empty(): + allocations = choose_containers( + [stock(31, 2.0)], required=2.0, unit="mL", policy=AllocationPolicy.FIFO + ) + assert allocations[0].remaining == "0.0 mL" + + +def test_insufficient_stock_raises_with_shortfall(): + with pytest.raises(InsufficientStockError) as excinfo: + choose_containers( + [stock(31, 1.0), stock(32, 0.5)], required=2.0, unit="mL", policy=AllocationPolicy.FIFO + ) + message = str(excinfo.value) + assert "0.5" in message # 1.5 available vs 2.0 required → 0.5 short + + +def test_insufficient_stock_with_no_containers_at_all(): + with pytest.raises(InsufficientStockError): + choose_containers([], required=2.0, unit="mL", policy=AllocationPolicy.FIFO) + + +# --- unit conversion during allocation -------------------------------------- + + +def test_allocation_converts_between_compatible_units(): + """Required 0.5 L against a container stocked in mL.""" + allocations = choose_containers( + [stock(31, 1000.0, "mL")], required=0.5, unit="L", policy=AllocationPolicy.FIFO + ) + assert allocations[0].take == pytest.approx(500.0) + assert allocations[0].remaining == "500.0 mL" + + +def test_allocation_rejects_incompatible_container_units(): + containers = [stock(31, 10.0, "mg")] + with pytest.raises(ClarificationNeededError): + choose_containers(containers, required=2.0, unit="mL", policy=AllocationPolicy.FIFO) + + +# --- specific allocation ---------------------------------------------------- + + +def test_specific_takes_only_from_the_listed_container(): + """The caller pre-filters to the hinted container (consumable.container_id).""" + allocations = choose_containers( + [stock(32, 10.0)], required=2.0, unit="mL", policy=AllocationPolicy.SPECIFIC + ) + assert [a.container_id for a in allocations] == [32] + + +def test_specific_with_unavailable_container_is_a_clarification(): + with pytest.raises(ClarificationNeededError): + choose_containers([], required=2.0, unit="mL", policy=AllocationPolicy.SPECIFIC) + + +# --- nearest expiry (deferred per plan §15.2, kept as executable spec) ------ + + +@pytest.mark.xfail(reason="nearest_expiry deferred per plan §15.2; expiry_field config pending") +def test_nearest_expiry_picks_soonest_expiry_first(): + soon = ContainerStock.model_construct( + container_id=44, amount="5 mL", available=5.0, unit="mL", expires="2026-01-01" + ) + later = ContainerStock.model_construct( + container_id=31, amount="5 mL", available=5.0, unit="mL", expires="2027-01-01" + ) + allocations = choose_containers( + [later, soon], + required=2.0, + unit="mL", + policy=AllocationPolicy.NEAREST_EXPIRY, + expiry_field="Expiry date", + ) + assert allocations[0].container_id == 44 diff --git a/tests/test_annotate.py b/tests/test_annotate.py new file mode 100644 index 0000000..f0423a4 --- /dev/null +++ b/tests/test_annotate.py @@ -0,0 +1,159 @@ +"""annotate.py — labvoice:v1 parser rules (plan §4, §13).""" + +import json + +import pytest + +from mcp_server.annotate import extract_annotation_block, parse_annotation, validate_annotation +from mcp_server.errors import AnnotationError +from mcp_server.models import AllocationPolicy + + +def valid_block(consumables: list[dict], **extra) -> str: + payload = {"consumables": consumables, **extra} + return f"" + + +ETHANOL = { + "resource_key": "ethanol_absolute", + "quantity": 2.0, + "unit": "mL", + "allocation": "fifo", +} + + +# --- extraction ------------------------------------------------------------- + + +def test_extract_returns_block_when_present(): + body = f"Add ethanol to the tube\n{valid_block([ETHANOL])}" + block = extract_annotation_block(body) + assert block is not None + assert "labvoice:v1" in block + assert "ethanol_absolute" in block + + +def test_extract_returns_none_when_no_annotation(): + assert extract_annotation_block("Just a normal step.") is None + assert extract_annotation_block("") is None + + +def test_extract_ignores_other_html_comments(): + body = "Step text\n\nmore text" + assert extract_annotation_block(body) is None + + +def test_extract_takes_the_last_valid_block(): + first = valid_block([{**ETHANOL, "quantity": 1.0}]) + second = valid_block([{**ETHANOL, "quantity": 2.0}]) + body = f"Step text\n{first}\n{second}" + block = extract_annotation_block(body) + assert json.loads(block.split("labvoice:v1")[1].rsplit("-->")[0])["consumables"][0][ + "quantity" + ] == 2.0 + + +def test_extract_tolerates_multiline_and_whitespace(): + body = "text\n" + assert extract_annotation_block(body) is not None + + +# --- parsing ---------------------------------------------------------------- + + +def test_parse_valid_annotation(): + body = f"Add ethanol\n{valid_block([ETHANOL])}" + annotation = parse_annotation(body) + assert annotation is not None + assert len(annotation.consumables) == 1 + consumable = annotation.consumables[0] + assert consumable.resource_key == "ethanol_absolute" + assert consumable.quantity == 2.0 + assert consumable.unit == "mL" + assert consumable.allocation is AllocationPolicy.FIFO + assert annotation.prompt_quantity is False + + +def test_parse_returns_none_without_annotation(): + assert parse_annotation("Plain step body.") is None + + +def test_parse_defaults_allocation_to_fifo(): + body = f"x\n{valid_block([{k: ETHANOL[k] for k in ('resource_key', 'quantity', 'unit')}])}" + annotation = parse_annotation(body) + assert annotation.consumables[0].allocation is AllocationPolicy.FIFO + + +def test_parse_prompt_quantity_annotation(): + body = f"x\n{valid_block([{'resource_key': 'buffer', 'quantity': None, 'unit': 'mL'}], prompt_quantity=True)}" + annotation = parse_annotation(body) + assert annotation.prompt_quantity is True + assert annotation.consumables[0].quantity is None + + +def test_parse_malformed_json_raises_annotation_error(): + body = "text\n" + with pytest.raises(AnnotationError): + parse_annotation(body) + + +def test_parse_schema_violation_missing_required_field(): + body = f"x\n{valid_block([{'resource_key': 'ethanol_absolute', 'unit': 'mL'}])}" + with pytest.raises(AnnotationError): + parse_annotation(body) + + +def test_parse_schema_violation_unknown_allocation(): + body = f"x\n{valid_block([{**ETHANOL, 'allocation': 'magical'}])}" + with pytest.raises(AnnotationError): + parse_annotation(body) + + +def test_parse_schema_violation_negative_quantity(): + body = f"x\n{valid_block([{**ETHANOL, 'quantity': -2.0}])}" + with pytest.raises(AnnotationError): + parse_annotation(body) + + +def test_parse_schema_violation_null_quantity_requires_prompt_quantity(): + body = f"x\n{valid_block([{'resource_key': 'buffer', 'quantity': None, 'unit': 'mL'}])}" + with pytest.raises(AnnotationError): + parse_annotation(body) + + +def test_parse_schema_violation_container_id_outside_specific(): + body = f"x\n{valid_block([{**ETHANOL, 'container_id': 31}])}" + with pytest.raises(AnnotationError): + parse_annotation(body) + + +def test_parse_allows_container_id_with_specific_allocation(): + body = f"x\n{valid_block([{**ETHANOL, 'allocation': 'specific', 'container_id': 31}])}" + annotation = parse_annotation(body) + assert annotation.consumables[0].container_id == 31 + + +# --- validation ------------------------------------------------------------- + + +def test_validate_clean_annotation_returns_no_violations(): + body = f"Add ethanol\n{valid_block([ETHANOL])}" + assert validate_annotation(body) == [] + + +def test_validate_body_without_annotation_has_nothing_to_check(): + assert validate_annotation("No annotations here.") == [] + + +def test_validate_malformed_annotation_reports_violation(): + body = "text\n" + issues = validate_annotation(body) + assert issues, "malformed annotation must be reported, never silently ignored" + assert any("json" in issue.lower() or "parse" in issue.lower() for issue in issues) + + +def test_validate_missing_required_field_is_reported(): + body = f"x\n{valid_block([{'resource_key': 'ethanol_absolute'}])}" + issues = validate_annotation(body) + assert issues + assert any("unit" in issue.lower() or "quantity" in issue.lower() for issue in issues) diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 0000000..f521d49 --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,50 @@ +"""config.py — env-driven settings (plan §11).""" + +from pathlib import Path + +from mcp_server.config import Settings, get_settings + + +def test_defaults(): + settings = Settings(_env_file=None) + assert settings.elabftw_timeout == 10.0 + assert settings.elabftw_retries == 2 + assert settings.labvoice_db_path == Path("~/.labvoice/journal.sqlite") + assert settings.labvoice_template_desc_limit == 200 + assert settings.labvoice_rest_token is None + assert settings.labvoice_embed_model is None + + +def test_default_unit_whitelist_matches_plan(): + settings = Settings(_env_file=None) + assert "μL" in settings.unit_whitelist + assert "mL" in settings.unit_whitelist + assert "ea" in settings.unit_whitelist + + +def test_unit_whitelist_parsing_ignores_blanks_and_spaces(): + settings = Settings(_env_file=None, labvoice_unit_whitelist=" mL , L , , ea ") + assert settings.unit_whitelist == ("mL", "L", "ea") + + +def test_api_base_url_strips_trailing_slash(): + settings = Settings(_env_file=None, elabftw_url="https://eln.example.org/") + assert settings.api_base_url == "https://eln.example.org/api/v2" + + +def test_env_overrides(monkeypatch): + monkeypatch.setenv("ELABFTW_URL", "https://eln2.example.org") + monkeypatch.setenv("ELABFTW_TIMEOUT", "3.5") + monkeypatch.setenv("LABVOICE_DB_PATH", "/tmp/other.sqlite") + settings = Settings(_env_file=None) + assert settings.elabftw_url == "https://eln2.example.org" + assert settings.elabftw_timeout == 3.5 + assert settings.labvoice_db_path == Path("/tmp/other.sqlite") + + +def test_get_settings_is_cached(monkeypatch): + monkeypatch.setenv("ELABFTW_URL", "https://a.example.org") + first = get_settings() + monkeypatch.setenv("ELABFTW_URL", "https://b.example.org") + assert get_settings() is first + get_settings.cache_clear() diff --git a/tests/test_elabftw_adapter.py b/tests/test_elabftw_adapter.py new file mode 100644 index 0000000..dee31bb --- /dev/null +++ b/tests/test_elabftw_adapter.py @@ -0,0 +1,138 @@ +"""elabftw.py — async adapter over vendored elabapi_python (plan §3, §12). + +Error normalization: ApiException status → typed error; network failures → +api_error; the API key must never leak into messages. Sync client calls run +off the event loop. + +Convention under test: the adapter resolves vendored API classes as module +globals of ``mcp_server.elabftw`` and instantiates them with an api_client; +tests stub those globals (see tests/fakes.stub_elabapi). Routes use the +``"*"`` wildcard method so the suite doesn't pin the generated method names. +""" + +import threading + +import pytest +from elabapi_python.rest import ApiException + +from fakes import StubElabapi, stub_elabapi +from mcp_server.errors import ApiError, AuthError, NotFoundError, PermissionDeniedError +from mcp_server.elabftw import ElabftwClient + + +@pytest.fixture +def hub() -> StubElabapi: + return StubElabapi() + + +@pytest.fixture +def adapter(settings, hub, monkeypatch) -> ElabftwClient: + stub_elabapi(monkeypatch, hub) + return ElabftwClient(settings) + + +INFO_PAYLOAD = {"elabftw_version": "5.0.0", "api": "2"} +EXPERIMENT_PAYLOAD = {"id": 123, "title": "Plasmid prep"} + + +async def test_get_info_returns_schema(adapter, hub): + hub.route("InfoApi", "*", lambda **kw: INFO_PAYLOAD) + info = await adapter.get_info() + assert info.elabftw_version == "5.0.0" + + +async def test_get_experiment_maps_payload(adapter, hub): + hub.route("ExperimentsApi", "*", lambda **kw: EXPERIMENT_PAYLOAD) + experiment = await adapter.get_experiment(123) + assert experiment.id == 123 + assert experiment.title == "Plasmid prep" + + +@pytest.mark.parametrize( + ("status", "expected"), + [(401, AuthError), (403, PermissionDeniedError), (404, NotFoundError), (500, ApiError)], +) +async def test_http_status_normalization(adapter, hub, status, expected): + def boom(**kw): + raise ApiException(status=status, reason="boom") + + hub.route("ExperimentsApi", "*", boom) + with pytest.raises(expected): + await adapter.get_experiment(123) + + +async def test_network_failure_becomes_api_error(adapter, hub): + def boom(**kw): + raise OSError("connection refused") + + hub.route("ExperimentsApi", "*", boom) + with pytest.raises(ApiError): + await adapter.get_experiment(123) + + +@pytest.mark.parametrize("status", [401, 403, 404, 500]) +async def test_api_key_never_leaks_into_error_messages(settings, hub, monkeypatch, status): + stub_elabapi(monkeypatch, hub) + + def boom(**kw): + raise ApiException( + status=status, reason="boom", body="key=labvoice-secret-key-do-not-leak" + ) + + hub.route("ExperimentsApi", "*", boom) + client = ElabftwClient(settings) + with pytest.raises(Exception) as excinfo: + await client.get_experiment(123) + assert "labvoice-secret-key-do-not-leak" not in str(excinfo.value) + assert "labvoice-secret-key-do-not-leak" not in repr(excinfo.value) + + +async def test_sync_calls_run_off_the_event_loop(adapter, hub): + main_thread = threading.get_ident() + + def whoami(**kw): + assert threading.get_ident() != main_thread + return EXPERIMENT_PAYLOAD + + hub.route("ExperimentsApi", "*", whoami) + await adapter.get_experiment(123) + + +async def test_steps_endpoint_returns_steps_schema(adapter, hub): + hub.route( + "StepsApi", + "*", + lambda **kw: [{"id": 9, "body": "Add ethanol", "finished": False, "ordering": 1}], + ) + steps = await adapter.get_steps("experiments", 123) + assert steps[0].id == 9 + + +async def test_containers_endpoint_returns_container_links(adapter, hub): + hub.route( + "ContainersApi", + "*", + lambda **kw: [{"id": 31, "qty_stored": 50.0, "unit": "mL"}], + ) + containers = await adapter.get_containers("items", 12) + assert containers[0].id == 31 + assert containers[0].qty_stored == 50.0 + + +async def test_search_normalizes_pagination(adapter, hub): + seen = {} + + def capture(**kwargs): + seen.update(kwargs) + return [EXPERIMENT_PAYLOAD] + + hub.route("ExperimentsApi", "*", capture) + results = await adapter.search_experiments(q="plasmid", limit=5, offset=10) + assert results[0].id == 123 + assert seen, "search must reach the client" + assert "q" in str(seen) or "query" in str(seen) + + +async def test_client_keeps_settings(settings): + client = ElabftwClient(settings) + assert client.settings is settings diff --git a/tests/test_errors.py b/tests/test_errors.py new file mode 100644 index 0000000..c5c3aa7 --- /dev/null +++ b/tests/test_errors.py @@ -0,0 +1,64 @@ +"""errors.py — typed errors with voice-friendly messages (plan §12).""" + +from mcp_server.errors import ( + AnnotationError, + ApiError, + AuthError, + ClarificationNeededError, + ErrorKind, + InsufficientStockError, + LabVoiceError, + NotFoundError, + PermissionDeniedError, +) + + +def test_every_error_kind_maps_to_its_class(): + assert AuthError.kind is ErrorKind.AUTH + assert PermissionDeniedError.kind is ErrorKind.PERMISSION + assert NotFoundError.kind is ErrorKind.NOT_FOUND + assert ApiError.kind is ErrorKind.API + assert AnnotationError.kind is ErrorKind.ANNOTATION + assert ClarificationNeededError.kind is ErrorKind.CLARIFICATION + assert InsufficientStockError.kind is ErrorKind.INSUFFICIENT_STOCK + assert LabVoiceError.kind is ErrorKind.API + + +def test_kind_values_are_the_wire_strings(): + assert ErrorKind.AUTH == "auth_error" + assert ErrorKind.PERMISSION == "permission_error" + assert ErrorKind.NOT_FOUND == "not_found" + assert ErrorKind.CLARIFICATION == "clarification" + assert ErrorKind.INSUFFICIENT_STOCK == "insufficient_stock" + + +def test_message_and_detail_are_preserved(): + err = NotFoundError("Experiment 123 not found.", detail="GET /experiments/123") + assert str(err) == "Experiment 123 not found." + assert err.message == "Experiment 123 not found." + assert err.detail == "GET /experiments/123" + + +def test_all_labvoice_errors_share_the_base(): + for cls in ( + AuthError, + PermissionDeniedError, + NotFoundError, + ApiError, + AnnotationError, + ClarificationNeededError, + InsufficientStockError, + ): + assert issubclass(cls, LabVoiceError) + + +def test_clarification_options_default_empty_and_are_preserved(): + err = ClarificationNeededError("Which ethanol?") + assert err.options == [] + err = ClarificationNeededError("Which ethanol?", options=["Absolute Ethanol", "96%"]) + assert err.options == ["Absolute Ethanol", "96%"] + + +def test_error_messages_are_voice_friendly_strings(): + err = PermissionDeniedError("This API key is read-only; I can't finish the step.") + assert isinstance(err.message, str) and err.message diff --git a/tests/test_journal.py b/tests/test_journal.py new file mode 100644 index 0000000..7db439a --- /dev/null +++ b/tests/test_journal.py @@ -0,0 +1,135 @@ +"""journal.py — SQLite saga journal: idempotency, statuses, durability (plan §10).""" + +import pytest + +from mcp_server.journal import ActionStatus, OperationStatus, SagaJournal + + +@pytest.fixture +async def fresh_journal(tmp_path): + journal = SagaJournal(tmp_path / "saga.sqlite") + await journal.connect() + yield journal + await journal.close() + + +async def test_connect_is_idempotent_safe_for_new_db(fresh_journal): + record = await fresh_journal.begin_operation("complete_step", "op-1") + assert record.status is OperationStatus.PLANNED + assert record.kind == "complete_step" + assert record.actions == [] + + +async def test_begin_generates_operation_id_when_none_given(fresh_journal): + record = await fresh_journal.begin_operation("complete_step") + assert record.operation_id + + +async def test_record_and_mark_actions(fresh_journal): + await fresh_journal.begin_operation("complete_step", "op-1") + action = await fresh_journal.record_action( + "op-1", "decrement_container", {"item_id": 12, "subitem_id": 31, "qty_stored": 48.0} + ) + assert action.status is ActionStatus.PLANNED + assert action.payload["subitem_id"] == 31 + + marked = await fresh_journal.mark_action( + "op-1", action.id, ActionStatus.DONE, response={"ok": True} + ) + assert marked.status is ActionStatus.DONE + assert marked.response == {"ok": True} + + +async def test_get_operation_returns_actions_in_order(fresh_journal): + await fresh_journal.begin_operation("complete_step", "op-1") + first = await fresh_journal.record_action("op-1", "decrement_container", {"subitem_id": 31}) + second = await fresh_journal.record_action("op-1", "finish_step", {"step_id": 9}) + third = await fresh_journal.record_action("op-1", "post_comment", {"body": "done"}) + + record = await fresh_journal.get_operation("op-1") + assert [a.id for a in record.actions] == [first.id, second.id, third.id] + assert [a.action for a in record.actions] == [ + "decrement_container", + "finish_step", + "post_comment", + ] + + +async def test_has_completed_only_after_finish(fresh_journal): + await fresh_journal.begin_operation("complete_step", "op-1") + action = await fresh_journal.record_action("op-1", "decrement_container", {}) + await fresh_journal.mark_action("op-1", action.id, ActionStatus.DONE) + assert await fresh_journal.has_completed("op-1") is False + + await fresh_journal.finish_operation("op-1", OperationStatus.COMPLETED) + assert await fresh_journal.has_completed("op-1") is True + + +async def test_begin_with_completed_operation_id_is_idempotent_replay(fresh_journal): + """Plan §13: double execution of the same operation_id is idempotent.""" + await fresh_journal.begin_operation("complete_step", "op-1") + await fresh_journal.record_action("op-1", "decrement_container", {"subitem_id": 31}) + await fresh_journal.finish_operation("op-1", OperationStatus.COMPLETED) + + replayed = await fresh_journal.begin_operation("complete_step", "op-1") + assert replayed.status is OperationStatus.COMPLETED + assert len(replayed.actions) == 1 + record = await fresh_journal.get_operation("op-1") + assert len(record.actions) == 1, "replay must not append new actions" + + +async def test_begin_with_inprogress_operation_id_resumes_it(fresh_journal): + await fresh_journal.begin_operation("complete_step", "op-1") + await fresh_journal.record_action("op-1", "decrement_container", {"subitem_id": 31}) + + resumed = await fresh_journal.begin_operation("complete_step", "op-1") + assert resumed.status is OperationStatus.PLANNED + assert len(resumed.actions) == 1 + + +async def test_failed_and_compensated_statuses_persist(fresh_journal): + await fresh_journal.begin_operation("complete_step", "op-1") + action = await fresh_journal.record_action("op-1", "finish_step", {"step_id": 9}) + await fresh_journal.mark_action("op-1", action.id, ActionStatus.FAILED) + await fresh_journal.finish_operation("op-1", OperationStatus.COMPENSATED) + + record = await fresh_journal.get_operation("op-1") + assert record.status is OperationStatus.COMPENSATED + assert record.actions[0].status is ActionStatus.FAILED + assert await fresh_journal.has_completed("op-1") is False + + +async def test_partial_failure_status_roundtrip(fresh_journal): + """Plan §10: compensation failure ⇒ partial_failure in the journal.""" + await fresh_journal.begin_operation("complete_step", "op-1") + await fresh_journal.finish_operation("op-1", OperationStatus.PARTIAL_FAILURE) + record = await fresh_journal.get_operation("op-1") + assert record.status is OperationStatus.PARTIAL_FAILURE + + +async def test_journal_persists_across_reconnect(tmp_path): + """The journal doubles as the audit log — it must survive restarts.""" + path = tmp_path / "saga.sqlite" + journal = SagaJournal(path) + await journal.connect() + await journal.begin_operation("complete_step", "op-1") + action = await journal.record_action("op-1", "decrement_container", {"subitem_id": 31}) + await journal.mark_action("op-1", action.id, ActionStatus.DONE, response={"qty": 48.0}) + await journal.finish_operation("op-1", OperationStatus.COMPLETED) + await journal.close() + + reopened = SagaJournal(path) + await reopened.connect() + try: + record = await reopened.get_operation("op-1") + assert record.kind == "complete_step" + assert record.status is OperationStatus.COMPLETED + assert record.actions[0].response == {"qty": 48.0} + assert await reopened.has_completed("op-1") is True + finally: + await reopened.close() + + +async def test_get_operation_of_unknown_id_raises(fresh_journal): + with pytest.raises(Exception): + await fresh_journal.get_operation("nope") diff --git a/tests/test_models.py b/tests/test_models.py new file mode 100644 index 0000000..ff5293e --- /dev/null +++ b/tests/test_models.py @@ -0,0 +1,72 @@ +"""models.py — compact result shapes (plan §6: ids, titles, quantities, statuses).""" + +import pytest +from pydantic import ValidationError + +from mcp_server.models import ( + AllocationPolicy, + CompleteStepResult, + Consumable, + HandoffContext, + NextStep, + ProtocolAnnotation, + StepInfo, +) + + +def test_consumable_defaults_to_fifo_and_required(): + consumable = Consumable(resource_key="ethanol_absolute", quantity=2.0, unit="mL") + assert consumable.allocation is AllocationPolicy.FIFO + assert consumable.optional is False + assert consumable.container_id is None + + +def test_consumable_quantity_may_be_null_for_prompted_steps(): + consumable = Consumable(resource_key="x", quantity=None, unit="mL") + assert consumable.quantity is None + + +def test_consumable_rejects_missing_required_fields(): + with pytest.raises(ValidationError): + Consumable(resource_key="x") # quantity and unit missing + + +def test_annotation_defaults(): + annotation = ProtocolAnnotation() + assert annotation.consumables == [] + assert annotation.prompt_quantity is False + + +def test_step_info_defaults_unfinished(): + step = StepInfo(id=9, body="Add ethanol") + assert step.finished is False + assert step.position is None + + +def test_complete_step_result_status_is_restricted(): + for status in ("completed", "protocol_complete", "reverted", "partial_failure"): + CompleteStepResult( + experiment_id=123, + status=status, + step=StepInfo(id=9, body="b"), + ) + with pytest.raises(ValidationError): + CompleteStepResult( + experiment_id=123, + status="exploded", + step=StepInfo(id=9, body="b"), + ) + + +def test_next_step_carries_consumables_and_stock(): + next_step = NextStep(experiment_id=123, step=StepInfo(id=9, body="Add ethanol")) + assert next_step.consumables == [] + assert next_step.stock == [] + + +def test_handoff_context_is_id_only_and_rest_optional(): + """Plan §8: the app forwards only ids; device/location are optional extras.""" + handoff = HandoffContext(experiment_id=123, user_id=2) + assert handoff.step_id is None + assert handoff.device_id is None + assert handoff.location_id is None diff --git a/tests/test_resolve.py b/tests/test_resolve.py new file mode 100644 index 0000000..e681b22 --- /dev/null +++ b/tests/test_resolve.py @@ -0,0 +1,89 @@ +"""resolve.py — resource_key → item id precedence and ambiguity (plan §5). + +Precedence: local mapping store (authoritative at execution) → resource marker +→ (setup-time-only matchers/title, never silently applied at runtime). +Ambiguous or missing ⇒ ClarificationNeededError listing candidates. +""" + +import pytest + +from fakes import make_item +from mcp_server.errors import ClarificationNeededError + + +async def test_resolve_via_marker_when_store_is_empty(client, real_resolver): + """Marker comment in the resource body is discovered without any mapping.""" + assert await real_resolver.resolve("ethanol_absolute") == 12 + + +async def test_mapping_store_is_authoritative_over_marker(client, real_resolver): + await real_resolver.upsert_mapping("ethanol_absolute", 12) + # Even if another item also carries the marker, the store binding wins. + client.items[13] = make_item(id=13, title="Ethanol bottle (old)", body="") + assert await real_resolver.resolve("ethanol_absolute") == 12 + + +async def test_resolve_unknown_key_raises_clarification(client, real_resolver): + with pytest.raises(ClarificationNeededError) as excinfo: + await real_resolver.resolve("sodium_azide") + assert "sodium_azide" in str(excinfo.value) + + +async def test_resolve_ambiguous_marker_raises_clarification_with_candidates(client, real_resolver): + client.items[13] = make_item(id=13, title="Ethanol bottle 2", body="") + with pytest.raises(ClarificationNeededError) as excinfo: + await real_resolver.resolve("ethanol_absolute") + assert excinfo.value.options, "clarification must list candidate resources" + + +async def test_upsert_mapping_is_idempotent(client, real_resolver): + await real_resolver.upsert_mapping("ethanol_absolute", 12) + await real_resolver.upsert_mapping("ethanol_absolute", 12) + mappings = await real_resolver.list_mappings() + assert [m.item_id for m in mappings if m.resource_key == "ethanol_absolute"] == [12] + + +async def test_upsert_mapping_updates_existing_binding(client, real_resolver): + await real_resolver.upsert_mapping("ethanol_absolute", 12) + await real_resolver.upsert_mapping("ethanol_absolute", 99) + assert await real_resolver.resolve("ethanol_absolute") == 99 + + +async def test_list_mappings_empty_store(real_resolver): + assert await real_resolver.list_mappings() == [] + + +async def test_export_mapping_produces_portable_json(client, real_resolver): + await real_resolver.upsert_mapping("ethanol_absolute", 12) + data = await real_resolver.export_mapping() + assert "ethanol_absolute" in data + entry = data["ethanol_absolute"] + assert entry.get("title") in (None, "Absolute Ethanol") + + +async def test_import_mapping_returns_proposals(client, real_resolver): + data = {"ethanol_absolute": {"cas": "64-17-5", "title": "Absolute Ethanol", "unit": "mL"}} + proposals = await real_resolver.import_mapping(data) + assert proposals + assert proposals[0].resource_key == "ethanol_absolute" + + +async def test_find_candidates_finds_marker_match(client, real_resolver): + proposals = await real_resolver.find_candidates("ethanol_absolute") + assert any(p.item_id == 12 for p in proposals) + + +async def test_find_candidates_finds_exact_title_match(client, real_resolver): + """Exact title match is a setup-time suggestion only — proposals carry scores.""" + client.items[14] = make_item(id=14, title="sodium_azide", body="") + proposals = await real_resolver.find_candidates("sodium_azide") + assert any(p.item_id == 14 for p in proposals) + proposal = next(p for p in proposals if p.item_id == 14) + assert proposal.score is not None + + +async def test_exact_title_never_applies_silently_at_runtime(client, real_resolver): + """An exact title match alone must not create a runtime binding (plan §5.4).""" + client.items[14] = make_item(id=14, title="sodium_azide", body="") + with pytest.raises(ClarificationNeededError): + await real_resolver.resolve("sodium_azide") diff --git a/tests/test_rest_api.py b/tests/test_rest_api.py new file mode 100644 index 0000000..a106c8a --- /dev/null +++ b/tests/test_rest_api.py @@ -0,0 +1,184 @@ +"""rest.py — read-only REST mirror for the mobile app (plan §8, §13). + +Bearer-token protected, mutations never exposed, same compact shapes and typed +errors as the MCP tools. Tests use Starlette's TestClient (ASGI, no network). + +Convention under test: the app resolves its read services via +``mcp_server.server.build_services`` — monkeypatched here (see conftest). +""" + +import pytest +from fastapi import FastAPI +from starlette.testclient import TestClient + +from mcp_server.errors import LabVoiceError + +TOKEN = "app-bearer-token-123" +AUTH = {"Authorization": f"Bearer {TOKEN}"} + + +@pytest.fixture +def rest_settings(settings): + settings.labvoice_rest_token = TOKEN + return settings + + +@pytest.fixture +def rest_app(rest_settings, patch_build_services) -> FastAPI: + patch_build_services() + from mcp_server.rest import create_rest_app + + return create_rest_app(rest_settings) + + +@pytest.fixture +def api(rest_app) -> TestClient: + return TestClient(rest_app) + + +# --- auth -------------------------------------------------------------------- + + +def test_missing_token_is_rejected(api): + assert api.get("/api/experiments").status_code == 401 + assert api.get("/api/experiments/123/state").status_code == 401 + assert api.get("/api/experiments/123/next-step").status_code == 401 + assert api.get("/api/templates").status_code == 401 + + +def test_wrong_token_is_rejected(api): + response = api.get("/api/experiments", headers={"Authorization": "Bearer nope"}) + assert response.status_code == 401 + + +def test_correct_token_passes(api): + response = api.get("/api/experiments", headers=AUTH) + assert response.status_code == 200 + + +def test_rest_app_requires_token_configured(settings, patch_build_services): + patch_build_services() + from mcp_server.rest import create_rest_app + + settings.labvoice_rest_token = None + with pytest.raises(Exception) as excinfo: + create_rest_app(settings) + assert not isinstance(excinfo.value, NotImplementedError) + + +# --- endpoints ---------------------------------------------------------------- + + +def test_find_experiments_returns_compact_summaries(api): + response = api.get("/api/experiments", params={"q": "plasmid"}, headers=AUTH) + assert response.status_code == 200 + payload = response.json() + assert isinstance(payload, list) and payload + summary = payload[0] + assert summary["id"] == 123 + assert summary["title"] == "Plasmid prep" + + +def test_next_step_is_the_hot_path(api): + """Plan §8: GET /api/experiments/{id}/next-step returns the parsed step + stock.""" + response = api.get("/api/experiments/123/next-step", headers=AUTH) + assert response.status_code == 200 + payload = response.json() + assert payload["experiment_id"] == 123 + assert payload["step"]["id"] == 9 + assert payload["step"]["finished"] is False + assert payload["consumables"][0]["resource_key"] == "ethanol_absolute" + assert payload["consumables"][0]["quantity"] == 2.0 + assert payload["stock"][0]["container_id"] == 31 + assert payload["stock"][0]["available"] == 50.0 + + +def test_next_step_null_when_protocol_complete(api, client): + for step in client.experiments[123].steps: + step.finished = True + response = api.get("/api/experiments/123/next-step", headers=AUTH) + assert response.status_code == 200 + assert response.json() is None + + +def test_state_snapshot_shape(api): + """Plan §8: `state` is what the app renders: title, steps, stock, next step.""" + response = api.get("/api/experiments/123/state", headers=AUTH) + assert response.status_code == 200 + state = response.json() + assert state["experiment_id"] == 123 + assert state["title"] == "Plasmid prep" + assert state["unfinished_steps"] == [9, 10] + next_step = state["next_step"] + assert set(next_step) == {"experiment_id", "step", "consumables", "stock"} + assert next_step["step"]["id"] == 9 + assert len(next_step["consumables"]) == 1 + assert {c["container_id"] for c in next_step["stock"]} == {31, 32} + + +def test_state_of_unknown_experiment_is_typed_error(api): + response = api.get("/api/experiments/9999/state", headers=AUTH) + assert response.status_code == 404 + payload = response.json() + assert payload["error"] == "not_found" + assert "message" in payload + + +def test_templates_endpoint_lists_summaries(api, client): + from fakes import make_template + + client.templates[7] = make_template() + response = api.get("/api/templates", headers=AUTH) + assert response.status_code == 200 + templates = response.json() + summary = templates[0] + assert summary["id"] == 7 + assert summary["title"] == "PCR cleanup" + assert "short_description" in summary + assert summary["tags"] == ["dna", "cleanup"] + + +def test_templates_search_ranks(api, client): + from fakes import make_template + + client.templates[7] = make_template() + response = api.get("/api/templates", params={"q": "pcr"}, headers=AUTH) + assert response.status_code == 200 + assert response.json()[0]["id"] == 7 + + +# --- mutations are never exposed ---------------------------------------------- + + +def test_no_mutation_routes_exist(rest_app): + """Plan §8: mutations exist only as MCP tools so every mutation is journaled.""" + paths = rest_app.openapi().get("paths", {}) + assert paths, "REST app must document its endpoints" + for path, operations in paths.items(): + for method in operations: + assert method.lower() == "get", f"{method.upper()} {path} must not exist" + + +# --- unit-level helpers -------------------------------------------------------- + + +def test_error_payload_shape(): + from mcp_server.rest import error_payload + + assert error_payload("clarification", "Which ethanol?") == { + "error": "clarification", + "message": "Which ethanol?", + } + + +def test_verify_token_accepts_configured_token(rest_settings): + from mcp_server.rest import verify_token + + assert verify_token(TOKEN) is None + + +def test_verify_token_rejects_wrong_token(rest_settings): + from mcp_server.rest import verify_token + + with pytest.raises(LabVoiceError): + verify_token("wrong") diff --git a/tests/test_safety.py b/tests/test_safety.py new file mode 100644 index 0000000..02c74df --- /dev/null +++ b/tests/test_safety.py @@ -0,0 +1,97 @@ +"""Safety checks as tests (plan §13). + +* a read-only API key must fail cleanly on every mutating tool +* failed workflows leave no partial state (no comment, no finished step) +* the API key never appears in any tool result +""" + +import json + +import pytest +from mcp.client import Client + +from fakes import make_template +from mcp_server.tools import register_tools + +TOKEN_SAFE_MESSAGE = "labvoice-secret-key-do-not-leak" + +MUTATING_TOOLS = { + "complete_next_protocol_step": {"experiment_id": 123}, + "complete_protocol_step": {"experiment_id": 123, "step_id": 9}, + "record_protocol_observation": {"experiment_id": 123, "comment": "note"}, + "create_experiment_from_template": {"template_id": 7}, + "adjust_inventory": {"amount": 5.0, "unit": "mL", "container_id": 31}, +} + + +@pytest.fixture +async def mcp_client(patch_build_services, client): + from mcp.server.fastmcp import FastMCP + + patch_build_services() + client.templates[7] = make_template() + mcp = FastMCP("labvoice-safety") + register_tools(mcp) + async with Client(mcp, raise_exceptions=False) as c: + yield c + + +def _state_fingerprint(client): + experiment = client.experiments[123] + return { + "steps": [(s.id, s.finished) for s in experiment.steps], + "comments": [c.body for c in experiment.comments], + "containers": [ + (i.id, c.sub_id, c.qty_stored) + for i in client.items.values() + for c in i.containers + ], + } + + +@pytest.mark.parametrize("tool", sorted(MUTATING_TOOLS)) +async def test_read_only_key_fails_cleanly_on_every_mutating_tool( + mcp_client, client, tool +): + """Plan §13: read-only key ⇒ every mutation fails with a clear message.""" + client.read_only = True + before = _state_fingerprint(client) + + result = await mcp_client.call_tool(tool, MUTATING_TOOLS[tool]) + payload = None + structured = getattr(result, "structured_content", None) + texts = " ".join(getattr(b, "text", "") for b in getattr(result, "content", [])) + if structured is not None: + payload = structured + assert getattr(result, "is_error", False) or ( + payload is not None and payload.get("ok") is False + ) or "permission" in texts.lower() or "read-only" in texts.lower(), ( + f"{tool} must not silently succeed with a read-only key" + ) + + assert _state_fingerprint(client) == before, f"{tool} must not mutate anything" + + +async def test_aborted_workflow_leaves_no_partial_state(mcp_client, client, resolver_stub): + """Unresolvable resource ⇒ no finished step, no comment, no stock change.""" + resolver_stub.mappings.clear() + before = _state_fingerprint(client) + + result = await mcp_client.call_tool( + "complete_next_protocol_step", {"experiment_id": 123} + ) + texts = " ".join(getattr(b, "text", "") for b in getattr(result, "content", [])) + assert result.is_error or "clarification" in texts.lower() or "not know" in texts.lower() + + assert _state_fingerprint(client) == before + + +async def test_error_results_never_contain_the_api_key(mcp_client, client, resolver_stub): + client.read_only = True + resolver_stub.mappings.clear() + for tool, args in MUTATING_TOOLS.items(): + result = await mcp_client.call_tool(tool, dict(args)) + texts = " ".join(getattr(b, "text", "") for b in getattr(result, "content", [])) + structured = getattr(result, "structured_content", None) + blob = texts + json.dumps(structured, default=str) + assert TOKEN_SAFE_MESSAGE not in blob diff --git a/tests/test_templates.py b/tests/test_templates.py new file mode 100644 index 0000000..fafd2a8 --- /dev/null +++ b/tests/test_templates.py @@ -0,0 +1,132 @@ +"""templates.py — template search/ranking and creation flow (plan §9, §13).""" + +import pytest + +from fakes import FakeElabftwClient, FakeTemplate, make_template +from mcp_server.errors import NotFoundError + +def ranking_client() -> FakeElabftwClient: + return FakeElabftwClient( + templates=[ + FakeTemplate(id=1, title="Cell culture", description="Maintain adherent lines."), + FakeTemplate( + id=2, + title="Protein extraction", + description="Lyse cells; collect supernatant in pcr tubes.", + ), + FakeTemplate(id=3, title="Ethanol precipitation", description="Precipitate DNA.", tags=["pcr"]), + FakeTemplate(id=4, title="PCR cleanup", description="Purify an amplicon."), + ] + ) + + +# --- short description ------------------------------------------------------ + + +async def test_short_description_is_first_paragraph(templates_service, client): + client.templates[7] = make_template() + result = await templates_service.list_templates() + assert result[0].short_description == "Purify an amplicon after PCR." + + +async def test_short_description_truncated_to_limit(templates_service, settings, client): + settings.labvoice_template_desc_limit = 20 + client.templates[7] = make_template( + description="P" * 100 + "\n\nSecond paragraph that must not appear." + ) + result = await templates_service.list_templates() + summary = result[0] + assert len(summary.short_description) <= 20 + assert "Second paragraph" not in summary.short_description + + +async def test_short_description_empty_when_no_description(templates_service, client): + client.templates[7] = make_template(description="") + result = await templates_service.list_templates() + assert result[0].short_description == "" + + +async def test_summary_carries_id_title_tags(templates_service, client): + client.templates[7] = make_template() + result = await templates_service.list_templates() + summary = result[0] + assert summary.id == 7 + assert summary.title == "PCR cleanup" + assert summary.tags == ["dna", "cleanup"] + + +# --- ranking ---------------------------------------------------------------- + + +async def test_no_query_preserves_listing_order(templates_service, client): + client.templates.update({t.id: t for t in ranking_client().templates.values()}) + result = await templates_service.list_templates() + assert [t.id for t in result] == [1, 2, 3, 4] + + +async def test_title_match_ranks_above_tag_and_description_match(templates_service, client): + client.templates.update({t.id: t for t in ranking_client().templates.values()}) + result = await templates_service.list_templates(query="pcr") + ids = [t.id for t in result] + assert ids.index(4) < ids.index(3) < ids.index(2), ( + "expected title(4) > tags(3) > description(2) per plan §9 weights" + ) + + +async def test_non_matching_templates_rank_below_matches(templates_service, client): + client.templates.update({t.id: t for t in ranking_client().templates.values()}) + result = await templates_service.list_templates(query="pcr") + assert result[-1].id == 1 + + +async def test_limit_is_respected(templates_service, client): + client.templates.update({t.id: t for t in ranking_client().templates.values()}) + result = await templates_service.list_templates(query="pcr", limit=2) + assert len(result) == 2 + assert result[0].id == 4 + + +# --- creation ---------------------------------------------------------------- + + +async def test_create_from_template_returns_experiment_and_first_step(templates_service, client): + client.templates[7] = make_template() + result = await templates_service.create_experiment_from_template(7) + assert result.ok is True + assert result.experiment_id == 1000 + assert result.title == "PCR cleanup" + assert result.first_step is not None + assert result.first_step.id == 41 + assert result.first_step.finished is False + + +async def test_create_with_explicit_title(templates_service, client): + client.templates[7] = make_template() + result = await templates_service.create_experiment_from_template(7, title="My amplicon run") + assert result.title == "My amplicon run" + + +async def test_created_experiment_copies_template_steps_and_annotations( + templates_service, client +): + """eLabFTW copies template steps — annotations must come along (plan §9).""" + from fakes import ANNOTATION_ETHANOL_FIFO, FakeStep + + client.templates[7] = make_template( + steps=[FakeStep(id=41, body=f"Add ethanol\n{ANNOTATION_ETHANOL_FIFO}", ordering=1)] + ) + result = await templates_service.create_experiment_from_template(7) + created = client.experiments[result.experiment_id] + assert "labvoice:v1" in created.steps[0].body + + +async def test_create_from_unknown_template_fails_cleanly(templates_service, client): + with pytest.raises((NotFoundError, KeyError)): + await templates_service.create_experiment_from_template(9999) + + +async def test_search_index_build_is_optional(templates_service, client): + """Lexical fallback works without an explicitly built index (plan §9 fallback).""" + client.templates.update({t.id: t for t in ranking_client().templates.values()}) + result = await templates_service.list_templates(query="pcr") + assert result[0].id == 4 diff --git a/tests/test_tools_mcp.py b/tests/test_tools_mcp.py new file mode 100644 index 0000000..2615aa1 --- /dev/null +++ b/tests/test_tools_mcp.py @@ -0,0 +1,169 @@ +"""tools.py + MCP surface — small-model-friendly tool schemas (plan §6, §13). + +Checks the tool *surface* (names, short descriptions, small input schemas) +over the real FastMCP server using the in-process client, plus a golden +result for the headline workflow. + +Note: the plan's "ten tools" are the reads + aggregates; the scaffold adds +four admin/setup tools (scan/map/export/import), so the registered surface +is fourteen functions. +""" + +import json + +import pytest +from mcp.client import Client + +from mcp_server.tools import TOOL_FUNCTIONS, register_tools + +EXPECTED_TOOLS = { + "find_experiments", + "get_experiment_context", + "get_next_protocol_step", + "list_experiment_templates", + "validate_protocol_template", + "complete_next_protocol_step", + "complete_protocol_step", + "record_protocol_observation", + "create_experiment_from_template", + "adjust_inventory", + "scan_instance", + "map_resource", + "export_mapping", + "import_mapping", +} + + +def result_json(call_result): + """Extract the JSON payload from a CallToolResult (structured or text).""" + structured = getattr(call_result, "structured_content", None) + if structured is not None: + return structured + for block in call_result.content: + text = getattr(block, "text", None) + if text: + return json.loads(text) + raise AssertionError(f"No usable content in tool result: {call_result!r}") + + +@pytest.fixture +async def mcp_server(patch_build_services): + from mcp.server.fastmcp import FastMCP + + patch_build_services() + mcp = FastMCP("labvoice-test") + register_tools(mcp) + return mcp + + +@pytest.fixture +async def mcp_client(mcp_server): + async with Client(mcp_server, raise_exceptions=True) as client: + yield client + + +# --- tool surface ------------------------------------------------------------ + + +async def test_all_tools_registered_and_listed(mcp_client): + tools = await mcp_client.list_tools() + names = {t.name for t in tools} + assert names == EXPECTED_TOOLS + assert len(TOOL_FUNCTIONS) == len(EXPECTED_TOOLS) + + +async def test_every_tool_has_a_short_description(mcp_client): + """Plan §6: tool descriptions are one or two short sentences.""" + for tool in await mcp_client.list_tools(): + assert tool.description, f"{tool.name} needs a description" + assert len(tool.description) <= 300, f"{tool.name} description too long for a small model" + + +async def test_input_schemas_are_small(mcp_client): + """Plan §13 lint: small input schemas — no kitchen-sink parameter lists.""" + for tool in await mcp_client.list_tools(): + properties = tool.inputSchema.get("properties", {}) + assert len(properties) <= 5, f"{tool.name} takes {len(properties)} parameters" + assert tool.inputSchema.get("type") == "object" + + +async def test_input_schemas_match_function_signatures(mcp_client): + import inspect + + for tool in await mcp_client.list_tools(): + fn = next(f for f in TOOL_FUNCTIONS if f.__name__ == tool.name) + params = inspect.signature(fn).parameters + properties = tool.inputSchema.get("properties", {}) + assert set(properties) == set(params), f"{tool.name}: schema/args mismatch" + required = set(tool.inputSchema.get("required", [])) + expected_required = { + name for name, p in params.items() if p.default is inspect.Parameter.empty + } + assert required == expected_required, f"{tool.name}: required set mismatch" + + +async def test_mutating_tools_are_clearly_named(mcp_client): + """A small model must not confuse reads with mutations (plan §2).""" + mutating = { + "complete_next_protocol_step", + "complete_protocol_step", + "record_protocol_observation", + "create_experiment_from_template", + "adjust_inventory", + "map_resource", + "scan_instance", + "import_mapping", + } + tools = {t.name: t for t in await mcp_client.list_tools()} + for name in mutating: + assert name in tools + + +# --- golden workflow result over the MCP transport ----------------------------- + + +async def test_headline_workflow_golden_result_over_mcp(mcp_client, client): + """Plan §13: golden result for complete_next_protocol_step (§7).""" + call_result = await mcp_client.call_tool( + "complete_next_protocol_step", + {"experiment_id": 123, "comment": "Done at the bench"}, + ) + payload = result_json(call_result) + + assert payload["ok"] is True + assert payload["status"] == "completed" + assert payload["experiment_id"] == 123 + assert payload["step"]["id"] == 9 + assert payload["step"]["finished"] is True + assert payload["consumed"][0]["resource_key"] == "ethanol_absolute" + assert payload["consumed"][0]["container_id"] == 31 + assert payload["consumed"][0]["amount"] == "2.0 mL" + assert payload["consumed"][0]["remaining"] == "48.0 mL" + assert payload["next_step"]["id"] == 10 + # stock really moved in eLabFTW + assert client.items[12].containers[0].qty_stored == 48.0 + + +async def test_read_tool_over_mcp_returns_compact_json(mcp_client): + call_result = await mcp_client.call_tool("get_next_protocol_step", {"experiment_id": 123}) + payload = result_json(call_result) + assert payload["step"]["id"] == 9 + assert payload["consumables"][0]["resource_key"] == "ethanol_absolute" + + +async def test_clarification_over_mcp_is_a_typed_error(mcp_client, resolver_stub): + resolver_stub.mappings.clear() + call_result = await mcp_client.call_tool( + "complete_next_protocol_step", {"experiment_id": 123} + ) + payload = result_json(call_result) + # Either the transport surfaces the error or the payload carries it — + # both are acceptable, but it must be the clarification kind either way. + if getattr(call_result, "is_error", False): + text = " ".join(getattr(b, "text", "") for b in call_result.content) + assert "clarification" in text or "ethanol" in text + else: + assert payload.get("error") == "clarification" or payload.get("status") in ( + "clarification", + "reverted", + ) diff --git a/tests/test_workflows_inventory.py b/tests/test_workflows_inventory.py new file mode 100644 index 0000000..c129371 --- /dev/null +++ b/tests/test_workflows_inventory.py @@ -0,0 +1,92 @@ +"""workflows/inventory.py — stock reads + adjust_inventory (plan §6, §10).""" + +import pytest + +from mcp_server.errors import ClarificationNeededError, NotFoundError + + +# --- stock reads ------------------------------------------------------------ + + +async def test_stock_for_resource_lists_containers(inventory): + stock = await inventory.stock_for_resource("ethanol_absolute") + assert [s.container_id for s in stock] == [31, 32] + assert stock[0].available == 50.0 + assert stock[0].unit == "mL" + assert stock[0].amount == "50.0 mL" + + +async def test_stock_for_unknown_resource_raises_clarification(inventory, resolver_stub): + resolver_stub.mappings.clear() + with pytest.raises(ClarificationNeededError): + await inventory.stock_for_resource("unobtainium") + + +# --- adjust_inventory ------------------------------------------------------- + + +async def test_adjust_adds_to_container_by_id(inventory, client): + result = await inventory.adjust_inventory(amount=500.0, unit="mL", container_id=31) + assert result.ok is True + assert result.container_id == 31 + assert result.amount == "500.0 mL" + assert result.remaining == "550.0 mL" + assert client.items[12].containers[0].qty_stored == 550.0 + + +async def test_adjust_supports_correction_negative_delta(inventory, client): + await inventory.adjust_inventory(amount=-2.0, unit="mL", container_id=31) + assert client.items[12].containers[0].qty_stored == 48.0 + + +async def test_adjust_by_resource_key_uses_allocable_container(inventory, client): + result = await inventory.adjust_inventory( + amount=100.0, unit="mL", resource_key="ethanol_absolute" + ) + assert result.resource_key == "ethanol_absolute" + assert result.container_id == 31 + assert result.remaining == "150.0 mL" + + +async def test_adjust_converts_units(inventory, client): + """“Add half a litre” against an mL-stocked container.""" + await inventory.adjust_inventory(amount=0.5, unit="L", container_id=31) + assert client.items[12].containers[0].qty_stored == 550.0 + + +async def test_adjust_rejects_non_whitelisted_unit(inventory): + with pytest.raises(ClarificationNeededError): + await inventory.adjust_inventory(amount=1.0, unit="fl-oz", container_id=31) + + +async def test_adjust_rejects_cross_dimension_unit(inventory): + with pytest.raises(ClarificationNeededError): + await inventory.adjust_inventory(amount=5.0, unit="g", container_id=31) + + +async def test_adjust_unknown_container_fails_cleanly(inventory): + with pytest.raises(NotFoundError): + await inventory.adjust_inventory(amount=1.0, unit="mL", container_id=9999) + + +async def test_adjust_requires_container_or_resource(inventory): + with pytest.raises(ClarificationNeededError): + await inventory.adjust_inventory(amount=1.0, unit="mL") + + +async def test_adjust_is_journaled(inventory, journal): + await inventory.adjust_inventory(amount=500.0, unit="mL", container_id=31) + assert journal.db_path.exists() + + +async def test_adjust_failure_does_not_silently_lose_data(inventory, client, monkeypatch): + """If the write fails, the workflow surfaces the error (journaled saga).""" + from mcp_server.errors import ApiError + + async def fail_write(entity_type, entity_id, subitem_id, qty_stored): + raise ApiError("write refused") + + monkeypatch.setattr(inventory.client, "set_container_quantity", fail_write) + with pytest.raises(ApiError): + await inventory.adjust_inventory(amount=500.0, unit="mL", container_id=31) + assert client.items[12].containers[0].qty_stored == 50.0 diff --git a/tests/test_workflows_protocol.py b/tests/test_workflows_protocol.py new file mode 100644 index 0000000..b89ba80 --- /dev/null +++ b/tests/test_workflows_protocol.py @@ -0,0 +1,338 @@ +"""workflows/protocol.py — the step-completion saga (plan §7, §10). + +Golden path: select next step → parse annotation → resolve keys → allocate → +validate stock → decrement containers → finish step → post comment → verify. +Failure semantics: clarifications abort before any mutation; journal failures +compensate (reverted) or escalate (partial_failure + audit comment). +""" + +import pytest + +from fakes import ANNOTATION_ETHANOL_FIFO, FakeContainer, FakeStep +from mcp_server.errors import ( + ApiError, + ClarificationNeededError, + InsufficientStockError, + NotFoundError, + PermissionDeniedError, +) + + +# --- get_next_step ---------------------------------------------------------- + + +async def test_next_step_is_lowest_ordering_unfinished(protocol): + next_step = await protocol.get_next_step(123) + assert next_step is not None + assert next_step.experiment_id == 123 + assert next_step.step.id == 9 + assert next_step.step.body.startswith("Add ethanol") + + +async def test_next_step_includes_parsed_consumables(protocol): + next_step = await protocol.get_next_step(123) + assert len(next_step.consumables) == 1 + assert next_step.consumables[0].resource_key == "ethanol_absolute" + assert next_step.consumables[0].quantity == 2.0 + + +async def test_next_step_includes_stock_preview(protocol): + next_step = await protocol.get_next_step(123) + assert [s.container_id for s in next_step.stock] == [31, 32] + assert next_step.stock[0].available == 50.0 + assert next_step.stock[0].unit == "mL" + + +async def test_next_step_none_when_protocol_complete(protocol, client): + for step in client.experiments[123].steps: + step.finished = True + assert await protocol.get_next_step(123) is None + + +async def test_next_step_skips_finished_steps(protocol, client): + client.experiments[123].steps[0].finished = True + next_step = await protocol.get_next_step(123) + assert next_step.step.id == 10 + + +async def test_next_step_unknown_experiment_fails_cleanly(protocol): + with pytest.raises(NotFoundError): + await protocol.get_next_step(9999) + + +# --- complete_next_step: golden path ---------------------------------------- + + +async def test_golden_path_completes_step_and_consumes_stock(protocol, client): + result = await protocol.complete_next_step(123, comment="Done at the bench") + + assert result.ok is True + assert result.status == "completed" + assert result.experiment_id == 123 + assert result.step.id == 9 + assert result.step.finished is True + assert result.next_step is not None + assert result.next_step.id == 10 + + # stock decremented (fifo: container 31 first) + assert client.items[12].containers[0].qty_stored == 48.0 + assert client.items[12].containers[1].qty_stored == 10.0 + + # compact consumed record with TTS-ready amounts (plan §6) + assert len(result.consumed) == 1 + consumed = result.consumed[0] + assert consumed.resource_key == "ethanol_absolute" + assert consumed.container_id == 31 + assert consumed.amount == "2.0 mL" + assert consumed.remaining == "48.0 mL" + + # comment posted + assert result.comment_id is not None + comments = client.experiments[123].comments + assert any("Done at the bench" in c.body for c in comments) + + +async def test_step_is_marked_finished_in_elabftw(protocol, client): + await protocol.complete_next_step(123) + assert client.experiments[123].steps[0].finished is True + + +async def test_saga_journals_a_completed_operation(protocol, journal): + await protocol.complete_next_step(123) + # The journal must have recorded a completed operation for this run; the + # audit trail lives in the SQLite file (plan §10). + assert journal.db_path.exists() + assert journal.db_path.stat().st_size > 0 + + +# --- step selection variants ------------------------------------------------ + + +async def test_complete_with_explicit_step_id(protocol, client): + result = await protocol.complete_step(123, 10, comment="redo") + assert result.step.id == 10 + assert result.step.finished is True + assert client.experiments[123].steps[1].finished is True + + +async def test_complete_next_skips_finished_steps(protocol, client): + client.experiments[123].steps[0].finished = True + result = await protocol.complete_next_step(123) + assert result.step.id == 10 + + +# --- no-annotation steps ---------------------------------------------------- + + +async def test_step_without_annotation_completes_and_posts_comment(protocol, client): + """Plan §7.2: no annotation ⇒ complete step + comment, skip inventory.""" + client.experiments[123].steps[0].body = "Plain step, no annotation" + result = await protocol.complete_next_step(123, comment="ok") + assert result.status == "completed" + assert result.consumed == [] + assert result.comment_id is not None + assert client.calls_of("set_container_quantity") == [] + + +# --- clarification before mutation ------------------------------------------ + + +async def test_unresolvable_resource_key_aborts_without_mutation(protocol, client, resolver_stub): + resolver_stub.mappings.clear() + client.experiments[123].steps[0] = FakeStep( + id=9, body=f"Add mystery reagent\n{ANNOTATION_ETHANOL_FIFO}", ordering=1 + ) + with pytest.raises(ClarificationNeededError): + await protocol.complete_next_step(123) + + assert client.calls_of("set_container_quantity") == [] + assert client.calls_of("finish_step") == [] + assert client.calls_of("post_comment") == [] + assert client.experiments[123].steps[0].finished is False + + +async def test_insufficient_stock_aborts_without_mutation(protocol, client): + client.items[12].containers = [FakeContainer(sub_id=31, qty_stored=1.0, unit="mL")] + with pytest.raises(InsufficientStockError) as excinfo: + await protocol.complete_next_step(123) + assert "1.0" in str(excinfo.value) + assert client.calls_of("set_container_quantity") == [] + assert client.calls_of("finish_step") == [] + + +# --- optional consumables --------------------------------------------------- + + +async def test_optional_consumable_missing_stock_is_skipped_with_warning(protocol, client): + """Plan §7.5: optional consumables are skipped with a warning, step completes.""" + annotated = ( + "" + ) + client.experiments[123].steps[0] = FakeStep(id=9, body=f"Mix\n{annotated}", ordering=1) + + result = await protocol.complete_next_step(123) + assert result.status == "completed" + assert [c.resource_key for c in result.consumed] == ["ethanol_absolute"] + + +# --- prompt_quantity -------------------------------------------------------- + + +def _prompt_annotation_body() -> str: + return ( + "" + ) + + +async def test_prompt_quantity_without_quantities_asks_for_clarification(protocol, client): + client.experiments[123].steps[0] = FakeStep( + id=9, body=f"How much did you use?\n{_prompt_annotation_body()}", ordering=1 + ) + with pytest.raises(ClarificationNeededError) as excinfo: + await protocol.complete_next_step(123) + assert excinfo.value.options, "clarification should name the resources needing amounts" + assert client.calls_of("set_container_quantity") == [] + + +async def test_prompt_quantity_with_supplied_quantities_completes(protocol, client): + client.experiments[123].steps[0] = FakeStep( + id=9, body=f"How much did you use?\n{_prompt_annotation_body()}", ordering=1 + ) + result = await protocol.complete_next_step(123, quantities={"ethanol_absolute": 5.0}) + assert result.status == "completed" + assert result.consumed[0].amount == "5.0 mL" + assert client.items[12].containers[0].qty_stored == 45.0 + + +# --- allocation behaviour in the saga --------------------------------------- + + +async def test_fifo_split_across_containers(protocol, client): + client.items[12].containers[0].qty_stored = 1.0 + result = await protocol.complete_next_step(123) + assert [(c.container_id, c.amount) for c in result.consumed] == [ + (31, "1.0 mL"), + (32, "1.0 mL"), + ] + assert client.items[12].containers[0].qty_stored == 0.0 + assert client.items[12].containers[1].qty_stored == 9.0 + + +async def test_specific_allocation_uses_the_hinted_container(protocol, client): + annotated = ( + "" + ) + client.experiments[123].steps[0] = FakeStep(id=9, body=f"x\n{annotated}", ordering=1) + result = await protocol.complete_next_step(123) + assert result.consumed[0].container_id == 32 + assert client.items[12].containers[1].qty_stored == 8.0 + + +async def test_unit_conversion_between_compatible_units(protocol, client): + """Required 0.02 L (= 20 mL) against mL-stocked containers.""" + annotated = ( + "" + ) + client.experiments[123].steps[0] = FakeStep(id=9, body=f"x\n{annotated}", ordering=1) + result = await protocol.complete_next_step(123) + assert client.items[12].containers[0].qty_stored == 30.0 + assert result.consumed[0].amount == "20.0 mL" + + +# --- failure & compensation (plan §10) --------------------------------------- + + +async def test_failure_during_finish_step_returns_reverted_and_restores_stock( + protocol, client, monkeypatch +): + """Plan §10: compensate by restoring decremented quantities, then `reverted`.""" + + async def fail_finish(entity_type, entity_id, step_id): + raise ApiError("eLabFTW is unhappy.") + + monkeypatch.setattr(protocol.client, "finish_step", fail_finish) + + result = await protocol.complete_next_step(123) + + assert result.status == "reverted" + assert client.items[12].containers[0].qty_stored == 50.0 + assert client.experiments[123].steps[0].finished is False + assert client.calls_of("post_comment") == [] + + +async def test_comment_failure_after_finish_compensates_stock(protocol, client, monkeypatch): + async def fail_comment(entity_type, entity_id, body): + raise ApiError("comment refused.") + + monkeypatch.setattr(protocol.client, "post_comment", fail_comment) + + result = await protocol.complete_next_step(123) + assert result.status == "reverted" + assert client.items[12].containers[0].qty_stored == 50.0 + + +async def test_failed_compensation_marks_partial_failure_and_posts_audit_comment( + protocol, client, monkeypatch +): + async def fail_finish(entity_type, entity_id, step_id): + raise ApiError("eLabFTW is unhappy.") + + async def fail_restore(entity_type, entity_id, subitem_id, qty_stored): + raise ApiError("restore also failed.") + + monkeypatch.setattr(protocol.client, "finish_step", fail_finish) + monkeypatch.setattr(protocol.client, "set_container_quantity", fail_restore) + + result = await protocol.complete_next_step(123) + + assert result is not None, "workflow must report partial_failure, not raise" + assert result.status == "partial_failure" + comments = client.experiments[123].comments + assert any("31" in c.body or "ethanol" in c.body.lower() for c in comments), ( + "partial_failure must post an audit comment naming the inconsistent container" + ) + + +# --- protocol_complete edge case (plan §7.1) --------------------------------- + + +async def test_complete_next_with_no_steps_left_returns_protocol_complete(protocol, client): + for step in client.experiments[123].steps: + step.finished = True + result = await protocol.complete_next_step(123) + assert result.status == "protocol_complete" + assert result.consumed == [] + assert client.calls_of("set_container_quantity") == [] + assert client.calls_of("post_comment") == [] + + +# --- guard rails ------------------------------------------------------------- + + +async def test_completing_an_already_finished_explicit_step_errors(protocol, client): + """Plan §13 safety: immutable (already finished) step ⇒ explicit error.""" + client.experiments[123].steps[0].finished = True + with pytest.raises(Exception) as excinfo: + await protocol.complete_step(123, 9) + assert not isinstance(excinfo.value, NotImplementedError), "scaffold not implemented yet" + + +async def test_read_only_key_surfaces_permission_error(protocol, client): + client.read_only = True + with pytest.raises(PermissionDeniedError): + await protocol.complete_next_step(123) diff --git a/tests/test_workflows_setup.py b/tests/test_workflows_setup.py new file mode 100644 index 0000000..c98b35b --- /dev/null +++ b/tests/test_workflows_setup.py @@ -0,0 +1,135 @@ +"""workflows/setup.py — scan_instance, map_resource, validate_protocol_template (plan §5).""" + +import pytest + +from fakes import FakeItem, make_item + + +# --- scan_instance ---------------------------------------------------------- + + +async def test_scan_counts_containers_and_markers(setup, client): + client.items[13] = make_item(id=13, title="Water bottle", body="plain", containers=[]) + result = await setup.scan_instance() + assert result.containers_seen == 2 # containers on item 12 + assert result.markers_found == 1 # marker on item 12 + + +async def test_scan_proposes_marker_matches(setup, client): + result = await setup.scan_instance() + proposal = next(p for p in result.proposals if p.resource_key == "ethanol_absolute") + assert proposal.item_id == 12 + assert proposal.reason is not None + + +async def test_scan_proposes_exact_title_match_as_suggestion(setup, client): + """Exact title matches are setup-time suggestions with scores (plan §5.4).""" + client.items[14] = FakeItem(id=14, title="sodium_azide", body="") + result = await setup.scan_instance() + proposal = next((p for p in result.proposals if p.item_id == 14), None) + assert proposal is not None + assert proposal.resource_key == "sodium_azide" + + +# --- map_resource ----------------------------------------------------------- + + +async def test_map_resource_binds_key(setup, client, resolver_stub): + entry = await setup.map_resource("ethanol_absolute", 12) + assert entry.resource_key == "ethanol_absolute" + assert entry.item_id == 12 + assert resolver_stub.mappings["ethanol_absolute"] == 12 + + +async def test_map_resource_is_idempotent_upsert(setup, resolver_stub): + await setup.map_resource("ethanol_absolute", 12) + await setup.map_resource("ethanol_absolute", 12) + assert resolver_stub.mappings["ethanol_absolute"] == 12 + entries = await resolver_stub.list_mappings() + assert len([e for e in entries if e.resource_key == "ethanol_absolute"]) == 1 + + +async def test_map_resource_rebinding_updates(setup, resolver_stub): + await setup.map_resource("ethanol_absolute", 12) + await setup.map_resource("ethanol_absolute", 13) + assert resolver_stub.mappings["ethanol_absolute"] == 13 + + +# --- validate_protocol_template --------------------------------------------- + + +def _annotated_template_client(): + from fakes import FakeElabftwClient, FakeStep, make_experiment, make_item, make_template + + annotated_step = FakeStep( + id=41, + body=( + "Add ethanol\n" + "" + ), + ordering=1, + ) + broken_step = FakeStep( + id=42, body="Broken\n", ordering=2 + ) + templates = [ + make_template( + id=7, + steps=[annotated_step, broken_step], + ) + ] + return FakeElabftwClient( + templates=templates, experiments=[make_experiment()], items=[make_item()] + ) + + +async def test_validate_flags_unmapped_resource_key(setup, client, resolver_stub): + """Annotation ok, but the mapping store lacks the key → blocking error.""" + client.templates[7] = _annotated_template_client().templates[7] + resolver_stub.mappings.clear() + report = await setup.validate_protocol_template("experiments_templates", 7) + assert report.ok is False + errors = [i for i in report.issues if i.severity == "error"] + assert any(i.resource_key == "ethanol_absolute" for i in errors) + + +async def test_validate_ok_when_annotation_and_mapping_are_fine(setup, client, resolver_stub): + client.templates[7] = _annotated_template_client().templates[7] + report = await setup.validate_protocol_template("experiments_templates", 7) + assert report.ok is False # the broken json step must block + # fix the broken step, then expect a clean report + client.templates[7].steps[1].body = "Clean step without annotation" + report = await setup.validate_protocol_template("experiments_templates", 7) + assert report.ok is True + assert report.issues == [] + + +async def test_validate_reports_annotation_error_with_step_id(setup, client): + client.templates[7] = _annotated_template_client().templates[7] + report = await setup.validate_protocol_template("experiments_templates", 7) + issues = [i for i in report.issues if i.step_id == 42] + assert issues and issues[0].severity == "error" + + +async def test_validate_entity_type_is_mirrored_in_report(setup, client): + client.templates[7] = _annotated_template_client().templates[7] + report = await setup.validate_protocol_template("experiments_templates", 7) + assert report.entity_type == "experiments_templates" + assert report.entity_id == 7 + + +async def test_validate_experiment_steps_too(setup, client, resolver_stub): + """validate works on live experiments, not only templates.""" + resolver_stub.mappings.clear() + report = await setup.validate_protocol_template("experiments", 123) + assert report.entity_type == "experiments" + assert report.ok is False + + +async def test_validate_unknown_entity_fails_cleanly(setup): + with pytest.raises(Exception) as excinfo: + await setup.validate_protocol_template("experiments", 9999) + assert not isinstance(excinfo.value, NotImplementedError) diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..a5c6183 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1563 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version == '3.13.*'", + "python_full_version < '3.13'", +] + +[[package]] +name = "aiosqlite" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/8a/64761f4005f17809769d23e518d915db74e6310474e733e3593cfc854ef1/aiosqlite-0.22.1.tar.gz", hash = "sha256:043e0bd78d32888c0a9ca90fc788b38796843360c855a7262a532813133a0650", size = 14821, upload-time = "2025-12-23T19:25:43.997Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/b7/e3bf5133d697a08128598c8d0abc5e16377b51465a33756de24fa7dee953/aiosqlite-0.22.1-py3-none-any.whl", hash = "sha256:21c002eb13823fad740196c5a2e9d8e62f6243bd9e7e4a1f87fb5e44ecb4fceb", size = 17405, upload-time = "2025-12-23T19:25:42.139Z" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/8e/38aa427ed5402449e226975b649c5dc73ccadfefeb95e6aecb8f8ea4b6b6/annotated_doc-0.0.5.tar.gz", hash = "sha256:c7e58ce09192557605d8bbd92836d7e1d520ac9580096042c0bfd197efacf1bb", size = 10758, upload-time = "2026-07-28T13:50:58.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/30/e900b21425a860e195f32e37657aa1f7c7f2b1bfb26f03ca209b90933c06/annotated_doc-0.0.5-py3-none-any.whl", hash = "sha256:117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101", size = 5302, upload-time = "2026-07-28T13:50:57.239Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/56/a8120250d128bed162cd73c76d45f6ef9991f3e068f62a8ee060afa3104a/annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7", size = 15893, upload-time = "2026-07-23T20:16:13.995Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", size = 13427, upload-time = "2026-07-23T20:16:12.938Z" }, +] + +[[package]] +name = "anyio" +version = "4.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" }, +] + +[[package]] +name = "attrs" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "cffi" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/69/43965eccfdead3b9220015fd1320e117be8c6ed01a62ffab76eeb752f5d5/cffi-2.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0", size = 184821, upload-time = "2026-08-03T21:19:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/54/7d/16e5a096677b5e313ca80cd5e5170efa3ea44624a82bb111925522da64b1/cffi-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf", size = 184719, upload-time = "2026-08-03T21:19:46.129Z" }, + { url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" }, + { url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/717f1526b9957b34456313c31645c5b82b8fb5c3fe9e4752999be7128bfc/cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50", size = 210249, upload-time = "2026-08-03T21:19:49.543Z" }, + { url = "https://files.pythonhosted.org/packages/64/b3/f8aa4f3e34986c7e4ec45072d1b1b9dd295b6b18007b45518d79726dd725/cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e", size = 208775, upload-time = "2026-08-03T21:19:50.918Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" }, + { url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" }, + { url = "https://files.pythonhosted.org/packages/80/fb/0bb75b7039588c074b37ae99f40d9bfddf990ecb2fbc346ebccd2e56b9be/cffi-2.1.1-cp312-cp312-win32.whl", hash = "sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e", size = 175292, upload-time = "2026-08-03T21:19:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/d9/79/615cc094e2fb508cade7de88d3b4f6c4ec2bab695c97bce9153dc65aadf5/cffi-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a", size = 185919, upload-time = "2026-08-03T21:19:56.89Z" }, + { url = "https://files.pythonhosted.org/packages/70/c6/d0ea84713fe46b243a436a18fcd47d639732747e21635c8a27191b06dc30/cffi-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80", size = 180093, upload-time = "2026-08-03T21:19:58.155Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/035513d4117049066b4779dc3b7c0c0fdad175fa13731c9f4003f1cd1478/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e", size = 194248, upload-time = "2026-08-03T21:19:59.399Z" }, + { url = "https://files.pythonhosted.org/packages/76/af/2aeb4dbb5fc41a04161ae9ff1518de7cec08e164f44a8ce6a4cf7fd2cd1d/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c", size = 196908, upload-time = "2026-08-03T21:20:00.746Z" }, + { url = "https://files.pythonhosted.org/packages/a7/46/2e5fdde8555706dd98139a910ca11be02809f3f605ce956f655d0214e100/cffi-2.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:9d2055050ea716bd38b7f7f1579c275386646b4894c155a3e2f3cd62ed41b7c6", size = 184805, upload-time = "2026-08-03T21:20:02.02Z" }, + { url = "https://files.pythonhosted.org/packages/55/41/4c7042f317b9217502988f0873af87e16ad606dc20f84e546e3e6ce9764c/cffi-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19ee6127ee34de7d83ce3d371ebc5ed91addbdcc39f9ab15ce4eb35a4e534971", size = 184764, upload-time = "2026-08-03T21:20:03.141Z" }, + { url = "https://files.pythonhosted.org/packages/43/1f/1c3d90d91811c8f86ced9ed637956c54bfe5b79ca98fe976d7f8c8979f6b/cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c", size = 214722, upload-time = "2026-08-03T21:20:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/3b5ce4c3b2192d250f04908f2bfd91ef34552ec8f7716a5d4abdb8d67bb2/cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125", size = 222369, upload-time = "2026-08-03T21:20:05.544Z" }, + { url = "https://files.pythonhosted.org/packages/02/10/4b3c75dde3d9663c9e02ba05c2668b954f671d4bbe346413ca8c696b295a/cffi-2.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264", size = 210175, upload-time = "2026-08-03T21:20:06.75Z" }, + { url = "https://files.pythonhosted.org/packages/df/62/14f74b9543e605d17701dc797b815958b8bb70b7624ce1b832ddad48ed6c/cffi-2.1.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3", size = 208670, upload-time = "2026-08-03T21:20:08.04Z" }, + { url = "https://files.pythonhosted.org/packages/95/95/86342356ff5953b3fb06f7ef7c5bee212d45e770abc7218d451b9148313c/cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2", size = 221824, upload-time = "2026-08-03T21:20:09.274Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ff/7b3429ff53aafe931ed8a5fc69f481bbef7ba6de87ddcbb63d08f483f613/cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b", size = 225148, upload-time = "2026-08-03T21:20:10.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/34/a95870b9221e09cf4f2ce3178b1a210abdfe63a1bd357da940418d7b8d15/cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7", size = 223564, upload-time = "2026-08-03T21:20:12.165Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/839b50531021a647fb5e929f72cf97bc1ff702b5472166164b5b6e76b851/cffi-2.1.1-cp313-cp313-win32.whl", hash = "sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac", size = 175263, upload-time = "2026-08-03T21:20:13.559Z" }, + { url = "https://files.pythonhosted.org/packages/60/a6/8b149b2c3f2e11aaa1618ef64500b45f50f22c57a977a4dff1aff1f91042/cffi-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d", size = 185688, upload-time = "2026-08-03T21:20:14.69Z" }, + { url = "https://files.pythonhosted.org/packages/01/9a/11f687cb39d6a3504060d5242f04f48c735afb4d3d533958a20594890cb2/cffi-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973", size = 180078, upload-time = "2026-08-03T21:20:15.917Z" }, + { url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/d9/99/c4b0c17cacdc9c3b8f280026286a9826d6a208c0f047591a3c3ce99b91fd/cffi-2.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54", size = 184964, upload-time = "2026-08-03T21:20:19.708Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a9/9db617d05d7367c1ad0ab00b3aa6e6f9281edd689b4ee9ea0e5a84e89c97/cffi-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72", size = 184962, upload-time = "2026-08-03T21:20:20.833Z" }, + { url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" }, + { url = "https://files.pythonhosted.org/packages/80/10/c5c0cbf0a657aecf59ef511409734230bf556f05a0d6c9eed7aa5c0a0166/cffi-2.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062", size = 209985, upload-time = "2026-08-03T21:20:23.401Z" }, + { url = "https://files.pythonhosted.org/packages/d5/6c/bfa0b87b03b9238148beca990292843c9396ba069b54496596594173de7b/cffi-2.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03", size = 208530, upload-time = "2026-08-03T21:20:24.628Z" }, + { url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" }, + { url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e9/d0061c364cde06ee43168a0d076ac1da512cbc380d44767b844ba34fe2b6/cffi-2.1.1-cp314-cp314-win32.whl", hash = "sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c", size = 177682, upload-time = "2026-08-03T21:20:44.288Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1c3e01e3ba14c39f6d10bfbac52753b7e22259e38088e5cfe1d704918690/cffi-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48", size = 187949, upload-time = "2026-08-03T21:20:45.623Z" }, + { url = "https://files.pythonhosted.org/packages/87/5b/da4e39efe18eeb89cf580ea9cfc66b6a7c3eadb808fc0cc1d3a295cb5a5d/cffi-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836", size = 182947, upload-time = "2026-08-03T21:20:46.955Z" }, + { url = "https://files.pythonhosted.org/packages/23/59/40338bf421c5accea1d45158170c87006ef1cd371b05c077e76476949728/cffi-2.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3", size = 188504, upload-time = "2026-08-03T21:20:29.495Z" }, + { url = "https://files.pythonhosted.org/packages/7d/47/5ecf1023850036e674c77ec4de86182d309ae344e39e7cba984b7df5d647/cffi-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2", size = 188259, upload-time = "2026-08-03T21:20:31.291Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/4d/45/ba4c93527bc38616a8bd36488acb69a2212d60486794f0c1f318949bbb76/cffi-2.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc", size = 211538, upload-time = "2026-08-03T21:20:33.808Z" }, + { url = "https://files.pythonhosted.org/packages/80/e9/b6ef565e452acb932fb0cb5443f44a78efbd1233e566f02b5a83855e9115/cffi-2.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29", size = 210688, upload-time = "2026-08-03T21:20:34.974Z" }, + { url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" }, + { url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d2/3b7176cb570a1d3e27faf67b72f591af508036e0d8b2be2ef9af9e8c84bb/cffi-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4", size = 182868, upload-time = "2026-08-03T21:20:40.388Z" }, + { url = "https://files.pythonhosted.org/packages/56/78/31f00c1bcd97c9bbf55f1bfdf5bc809a5de8887473e90bb9960dca825e80/cffi-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e", size = 194104, upload-time = "2026-08-03T21:20:41.725Z" }, + { url = "https://files.pythonhosted.org/packages/7b/1b/58496f2ed0a35de575250c02a43ab3cc2c04d494a88fed31c1cabc0fd176/cffi-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5", size = 186402, upload-time = "2026-08-03T21:20:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8f/9ebe220eab48a093d1a5a5e339ab0dc7316eef3bb04d63c42f0251b61f50/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d", size = 194043, upload-time = "2026-08-03T21:20:48.179Z" }, + { url = "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b", size = 196737, upload-time = "2026-08-03T21:20:49.457Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8a/af668013284634733f02d683458a0728739c7d6ddb5e14cb0c20832266fe/cffi-2.1.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4", size = 184933, upload-time = "2026-08-03T21:20:50.639Z" }, + { url = "https://files.pythonhosted.org/packages/0c/75/2f5207ff6d1a613133b23a5203cc0c2a628313b5eb3974d7956ae3c57950/cffi-2.1.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2ae64be792b8966f2c69538199728b290e34726562896df1e5dc8ffd8d8188e8", size = 185002, upload-time = "2026-08-03T21:20:52.173Z" }, + { url = "https://files.pythonhosted.org/packages/e2/31/9e1313b0a6e30e91b3b3d3fff51ae99c857c07738e3afcce1f7334e1b7ab/cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6", size = 222271, upload-time = "2026-08-03T21:20:53.462Z" }, + { url = "https://files.pythonhosted.org/packages/50/e3/f6234a833e6e08c7007003074723c406559eecf9b48dfc97471e5a8eb7a0/cffi-2.1.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80", size = 209919, upload-time = "2026-08-03T21:20:54.783Z" }, + { url = "https://files.pythonhosted.org/packages/0d/fc/5f74e293fced6edb51af3a46c4ccf6c23c9943774ecb375ddbd522c76add/cffi-2.1.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779", size = 208529, upload-time = "2026-08-03T21:20:56.066Z" }, + { url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399", size = 221630, upload-time = "2026-08-03T21:20:57.336Z" }, + { url = "https://files.pythonhosted.org/packages/a4/18/fa7f1f6857d5eb88a4ca99ffcbfb7c387a287ccc154c64a73e86314745d7/cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688", size = 225134, upload-time = "2026-08-03T21:20:58.675Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9f/e8e3dfa04a1b4c241f8c91faacad872b4d4efd051d49764ad4e2fd4b9fea/cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7", size = 223197, upload-time = "2026-08-03T21:20:59.968Z" }, + { url = "https://files.pythonhosted.org/packages/f8/7e/8debeb04f1ab9fe2a6963964cd6f1aaf7192627b83926586a6a4e089c9fa/cffi-2.1.1-cp315-cp315-win32.whl", hash = "sha256:4f42141fc14250de6dde5ee7ea4432be017252d91f19c5ad043c084cea629cac", size = 177683, upload-time = "2026-08-03T21:21:14.901Z" }, + { url = "https://files.pythonhosted.org/packages/e0/31/5158704cc474ab65c1647932e88be78dc0873f47130e253be38bcaf13d01/cffi-2.1.1-cp315-cp315-win_amd64.whl", hash = "sha256:e6e8cff14d6fb0be70a09c0bdc58096f501952d04624ebf867e0e56da2df8960", size = 187897, upload-time = "2026-08-03T21:21:16.108Z" }, + { url = "https://files.pythonhosted.org/packages/cc/4b/b3a2da8570c704ffc0f9762cdc3ec0f02c8573798e0b5cf7f11c82bbb70f/cffi-2.1.1-cp315-cp315-win_arm64.whl", hash = "sha256:27350daa11d4f10c540e6e89dada4c54feb7256ad03e9a4dc075ebad7ba360d1", size = 182935, upload-time = "2026-08-03T21:21:17.271Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ef/5443574510a1207e6f6bc38ba6e1f1de36cb48fef07b2728bb896a21f430/cffi-2.1.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c26608d2222fb1e94487e4a387d85f13eb55d5ed725cb25a0c589ac4ee60e7bc", size = 188464, upload-time = "2026-08-03T21:21:01.163Z" }, + { url = "https://files.pythonhosted.org/packages/7e/ae/a56fa8c4686ad50e148fcbc8d3ae0d03915ff5c30d795058988c24118cef/cffi-2.1.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:4be96343e422f2dfcd12ab5c9f5aebe03f82f737c6bffeca6830b3875cb44aab", size = 188262, upload-time = "2026-08-03T21:21:02.382Z" }, + { url = "https://files.pythonhosted.org/packages/53/b2/6187f46f2912276a3ae284076109cc5c8680482f11f766ccf26db4a86427/cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e", size = 223779, upload-time = "2026-08-03T21:21:03.553Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f6/c3ad28bd19f77047a03084424fbd4cbe997303267c14423737324be0385d/cffi-2.1.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358", size = 211520, upload-time = "2026-08-03T21:21:04.863Z" }, + { url = "https://files.pythonhosted.org/packages/a0/cd/ccac9013a5bd9fd764de118674ab9c805b5ca10c19270d90ee273f8b2240/cffi-2.1.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231", size = 210673, upload-time = "2026-08-03T21:21:06.223Z" }, + { url = "https://files.pythonhosted.org/packages/52/86/2976131c639aead931c5bee5aba67e4b09fbeb8018b6f282f70803f923a7/cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6", size = 223835, upload-time = "2026-08-03T21:21:07.539Z" }, + { url = "https://files.pythonhosted.org/packages/ac/0c/33a7aeab2f9c76918c52e084beb39c570db3588133412929e8ec06fab90b/cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94", size = 226705, upload-time = "2026-08-03T21:21:08.774Z" }, + { url = "https://files.pythonhosted.org/packages/e3/26/2cde30fdde421130bfc18f70395731a6e6b2053c6a1978a5258ff04e72fa/cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5", size = 225539, upload-time = "2026-08-03T21:21:09.911Z" }, + { url = "https://files.pythonhosted.org/packages/6d/cd/a361394c94b2129d604bb846f624a8e88255a3ee33129c434a00d715e64f/cffi-2.1.1-cp315-cp315t-win32.whl", hash = "sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66", size = 182707, upload-time = "2026-08-03T21:21:11.226Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b5/ba2b299993c26577d529b6ae29841f9e15b9fcf004d65f423f4fcf94ade9/cffi-2.1.1-cp315-cp315t-win_amd64.whl", hash = "sha256:d9c275eaacd24aa73f94ffd6de08fc3f932424d8b6c376f4bed7cde376fe7bc3", size = 193772, upload-time = "2026-08-03T21:21:12.39Z" }, + { url = "https://files.pythonhosted.org/packages/aa/29/35e016098c814cd93de9cd320c66b5bfba14dc6ecedd3cb518fa7c408c69/cffi-2.1.1-cp315-cp315t-win_arm64.whl", hash = "sha256:d18e5ac0f2f03f4f518d3e23db0f0cad7faa1da8620e9c09461d443bbf6e6692", size = 186360, upload-time = "2026-08-03T21:21:13.636Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/3f/143b048436775b0f76ac3eec145c019e8173ccc2885c8f20319b996d5e83/charset_normalizer-3.5.1.tar.gz", hash = "sha256:6117b84ea48435e5356dc737f5121485c30920ba43375fa7b434fd753df0eac3", size = 171764, upload-time = "2026-08-15T08:20:44.807Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/27/78873dc8b6a56357517b74b6bb9568b80450e7bb4f6ef7e3fa9d22aa0bd7/charset_normalizer-3.5.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5b6d1386bf0096d26d3a863dc0a487a5b4eb9aa93cf5ba69683d29dde6b9d60f", size = 344456, upload-time = "2026-08-15T08:17:10.072Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4c/be49ada26b1f0232d57aa89bbebf997a5cc2332a5616b6eca26ff680044d/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4582c27e8c889d64811987b5967fbd3ae0c823fe1fd933b543d55ac20bb475fa", size = 238530, upload-time = "2026-08-15T08:17:11.563Z" }, + { url = "https://files.pythonhosted.org/packages/76/84/6f1290fa07ae6978d3960caa3eb1b8019bf9284ab7c2297b00c099ef4250/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1d1c7a53a6c2103925cdd6d7229f8c567379f211c869793df679f2e9f738c369", size = 230200, upload-time = "2026-08-15T08:17:12.919Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a0/47b18adeed31c8f16ba9700f32c1b18594cfa09f47eb672a488c273c22bf/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e6621fb2a4988d6e53eedc455e5903e2679f3967b8acb3d639f1b63c14a2e893", size = 262222, upload-time = "2026-08-15T08:17:14.571Z" }, + { url = "https://files.pythonhosted.org/packages/38/fe/341861ac118dae06f3ec0eb487488af52128f2ef2faf0b11003944d22259/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7c0c10730342b0c9b35dd1d619beb8214e520bd96a1f870f452680b238aab3e0", size = 258951, upload-time = "2026-08-15T08:17:16.158Z" }, + { url = "https://files.pythonhosted.org/packages/6f/89/bb5108dc6c3651dca963f2b0a3ba19bbcb370c94e1b6d3e0e844a58e6dca/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9af956078716df40d985fb0dfeb2c2120c5ca92ba4ff4b388acfd01cdc14d08", size = 248801, upload-time = "2026-08-15T08:17:17.683Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ba/ef83ae3aca816393decfa3530976f38a79812d707b80b580ac33b83f9877/charset_normalizer-3.5.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9f8405c2c758532c74fed975dbee57be1f31a6e865c031870c79a6ed3212ada", size = 244070, upload-time = "2026-08-15T08:17:19.191Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0b/c5292a2462d69b7378ea89793bbb5b2b6fcf6f7dd6d1667f9619094ad553/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:96fef3e886d6a9874b14f27fc193fbdc69d5d8035783d86aa4e1cea594e695f9", size = 240110, upload-time = "2026-08-15T08:17:20.547Z" }, + { url = "https://files.pythonhosted.org/packages/46/22/111e5be3b740d5c2a5bfcedb3d237b6591e5c2e82ae9d6ffcb121fe0909c/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5d8531a6569d025f68e2321e7638fb7978f23db58e5f69f56913837aae03816e", size = 232836, upload-time = "2026-08-15T08:17:21.895Z" }, + { url = "https://files.pythonhosted.org/packages/f9/d2/d2aad6fe0dbb44b194bf3becb60f5a0ac48446ade999a47fe7bb41eb09a7/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:aae2ee51122d3ae968a3837d97dc24a0aeebb0dea23694422cd172bd30017cd6", size = 262712, upload-time = "2026-08-15T08:17:23.727Z" }, + { url = "https://files.pythonhosted.org/packages/35/5a/337e4663a5eae6de99db940ee8066d4145caafb61327db62deda15313cce/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7235dc28fc6dd9d832ac7c7bce95367dedb85929f17368a0c2bee1e080b9acbf", size = 242977, upload-time = "2026-08-15T08:17:25.157Z" }, + { url = "https://files.pythonhosted.org/packages/ca/85/f82f8a92e31c7519410e2e1afdc630f28ec47490ce2c09a11c1a43cbb459/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4abdc5f9ad448c1ecbfae2974b820535d6bc6e7eef63babbab3d81cf46968c71", size = 260207, upload-time = "2026-08-15T08:17:26.602Z" }, + { url = "https://files.pythonhosted.org/packages/b7/52/643d11ffd60e9ac2fd1fb87e167a19285b9eefeff4a40e63c87cbfbeab36/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba501e667c17d8411f98e67a022d9604ef179aff0e459b7e292c796837c13573", size = 250562, upload-time = "2026-08-15T08:17:27.971Z" }, + { url = "https://files.pythonhosted.org/packages/62/16/46556278c2168d12df9da7fede5dc6fc70e60301b26a82bbeec238c9cfe3/charset_normalizer-3.5.1-cp312-cp312-win32.whl", hash = "sha256:cfa1c0cc3a8f9f53f1243a5a99ac36fd003880199383b37672e86ddda9cb07e2", size = 178507, upload-time = "2026-08-15T08:17:29.277Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7a/4c6c298171e6b3e745633180ff59350fc0ca0db1ffd28df1e369e0579f71/charset_normalizer-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:3617ac3cfd8b9888f145ad89dd6e692285834b0201c6074a5eeaad3fd4d668c2", size = 200551, upload-time = "2026-08-15T08:17:30.668Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d7/eb95a042f0dd22e304b0b6472b154f3546a1a039a9ee89ccb2a7f61591fc/charset_normalizer-3.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:88e85ab89cb822c1e635f51d6d32e488f94e002e70e2f492bdb8b945543f345a", size = 180700, upload-time = "2026-08-15T08:17:32.028Z" }, + { url = "https://files.pythonhosted.org/packages/bc/61/2cb6ad133dbbb449fa2d37ccae973232f4827e799af258d15e589a3d1e9e/charset_normalizer-3.5.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:4f298bdadb8f0b9e5672877f647d1be9373ef5320c9e2f049795e26cad28b6a9", size = 211584, upload-time = "2026-08-15T08:17:33.597Z" }, + { url = "https://files.pythonhosted.org/packages/18/57/a305c968be1ca13f3dd1b32f445877e97addf55d80b65c7cb35fac82b777/charset_normalizer-3.5.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:88ca277405c2d3b71c4e1c2ee0e7966e807bcba86a69d11e19ba199d18ae4491", size = 223359, upload-time = "2026-08-15T08:17:35.022Z" }, + { url = "https://files.pythonhosted.org/packages/09/0a/d3646670292ce8d8f8cc11ac067d44885e697a5591f57a9221128da5e7b3/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9362dd90aa7dab48c0054a21187791ccf05473f7dba5d92b8033ae62164675e7", size = 194464, upload-time = "2026-08-15T08:17:36.452Z" }, + { url = "https://files.pythonhosted.org/packages/de/93/d51ec556e01042fed6f993ea859311bc7917b466684182fbbceb6ca24762/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:977cdbd483a9cff38179bea4fd754289a6f2195c7abd414aba85410b3e66cc5e", size = 197676, upload-time = "2026-08-15T08:17:37.819Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a0/562247944386f7d4ef94467e84876600cc1e0f1b93239aaa9213d2bc3cbd/charset_normalizer-3.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e90251c0c7bdd54a100a0dce3c07b7e637278c93af29dbf78ebb89a58c4bac7d", size = 340473, upload-time = "2026-08-15T08:17:39.303Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/1d994be1b93d41e9502b8b0460eaa88a1dd8df335df415db87d6c3e91ab2/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94d78ecec2605a8d0398b0f365d5f12a63248438516f5dac536a5eff7337df4a", size = 240156, upload-time = "2026-08-15T08:17:40.66Z" }, + { url = "https://files.pythonhosted.org/packages/09/53/27923ce5cc6cbccb832037b27dca98882d9c53e9b69e866bbbef4aae7fc8/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d59b75732e9b6f27388e10c14b0259cc5f2e48c78627d185e6a177b58ad3cffe", size = 228246, upload-time = "2026-08-15T08:17:42.003Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/5a97e84d63af1d55c07439cb80e56d99a8efb4295700eb4e18c0d1615d2c/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0d929fc574b4d6fd9e7c0f5c2ede8716a41911923aa7fa5fce38e0818aa4a1ac", size = 263660, upload-time = "2026-08-15T08:17:43.627Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c2/071575791dcc88316c0a9a65ce38897a82e4cfe4a325f0f7fe1b1ac47bcf/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:394fea06235c8543390050ed5f529187074b029fb027213f6c46ac11ab5d950e", size = 260354, upload-time = "2026-08-15T08:17:45.094Z" }, + { url = "https://files.pythonhosted.org/packages/fb/af/63240b0c0248c075c2535a1f1bd992821d8251b9f173abc13329661d09e4/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62b55f6722735a6c472f88361cde6640608773d9443cebdbb51abf436a1fcdd3", size = 250638, upload-time = "2026-08-15T08:17:46.496Z" }, + { url = "https://files.pythonhosted.org/packages/4d/66/70dfad64f15be09c15ccfee81330a7e515895dbe296dd23114e9a231268a/charset_normalizer-3.5.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa48b1b63d639f9483e0633e092f5851e2348c352f1f9bb6c8182f87884ef876", size = 244583, upload-time = "2026-08-15T08:17:47.963Z" }, + { url = "https://files.pythonhosted.org/packages/c0/24/ef36367d38b9ddd4bccbf72888c342e8de1f5ae506fa0b2dcf970e2732a1/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c71fb0d56c920c269cd3e2e3fe7c610e3f1fdb21a6ce60efa6430ff63676cea6", size = 242038, upload-time = "2026-08-15T08:17:49.481Z" }, + { url = "https://files.pythonhosted.org/packages/db/ab/55e683ba0fff2e43adafc10daa3001eac90fdaa419a97227d5a7067eedde/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:485a0d363cafefcd2538a73c7c838daa2035f09b2c9f9b5e3133f80c6aeb84c2", size = 233677, upload-time = "2026-08-15T08:17:50.845Z" }, + { url = "https://files.pythonhosted.org/packages/bd/67/0f40eaf8d1b6e7cf15e82382a2965efaca787fc1c2794b7021d37aaf5036/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0ea61a470e070686aa30892fed79e297d2c8d0ab46b8bcdf027d38c51da591", size = 264491, upload-time = "2026-08-15T08:17:52.61Z" }, + { url = "https://files.pythonhosted.org/packages/5c/64/12b4c2a11ee8df4fcc518c78b0d93e3a92bd3d5253d1617ce74ff0e8c7ef/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:90b7481fb62fbe172c558bc6fd1c4c98d82004a54a7551f20e11ac9bf0b8708c", size = 245196, upload-time = "2026-08-15T08:17:54.023Z" }, + { url = "https://files.pythonhosted.org/packages/37/2e/651d910af6d0fba325eee1cda37ec5443462ed25360e666c144166eb6091/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:35fe081843b35aad20ffeccec3eeffbe637b15d14f3fb22cc1b59cd8ec17e93c", size = 261660, upload-time = "2026-08-15T08:17:55.491Z" }, + { url = "https://files.pythonhosted.org/packages/90/c6/b09e05e6db7f64338e0dc067c79577b1138da86c1e38369096851d96be88/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd0350afdc3aabd5576f60ea109228bd5538139713c7b094c5cd27c73a98bc6f", size = 252618, upload-time = "2026-08-15T08:17:57.025Z" }, + { url = "https://files.pythonhosted.org/packages/76/4e/362d4f9fdcdf5556fb2aa3ce7d4a58ebce03ed1ff03aa1d9aca8d02f13f3/charset_normalizer-3.5.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:9d9a0dc7cbe9bec24c3f767c9122c41fe5a1bc43f47cd099d00d393e09769de4", size = 140362, upload-time = "2026-08-15T08:17:58.425Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d4/703be739b26acce318bd29eb3b25b7209e1b1f527f9eae3d1f1f01fdde2b/charset_normalizer-3.5.1-cp313-cp313-win32.whl", hash = "sha256:d63600d620ad0064c3a748b950ac5ea38a80190e5498532efefa4b7b3f1da1f3", size = 177755, upload-time = "2026-08-15T08:18:00.037Z" }, + { url = "https://files.pythonhosted.org/packages/8a/33/56d97ade41c8db611e727168c52ae46c9224c362ec28d4b65d7e9869e8da/charset_normalizer-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:aea996a6aba25260827c9ea511d1addfde2da9eb686ac961838509086188b7e6", size = 199295, upload-time = "2026-08-15T08:18:01.506Z" }, + { url = "https://files.pythonhosted.org/packages/5b/75/5b20dd1e6573a01a08158fe104104fa2c8abf941745596954185726cd46c/charset_normalizer-3.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:fd0a274c0e5f9a21565cd9d3dd749b61f96b7aa1e20a93aa1ba4029518f2e5c0", size = 179856, upload-time = "2026-08-15T08:18:02.929Z" }, + { url = "https://files.pythonhosted.org/packages/29/cd/2b812ce5e888f1ce69a5350281e58aab07ae64a958ecae8912f30865718e/charset_normalizer-3.5.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:774d157f112367ff4abd29019f38f023c24e00e56edc7829c20e358a5a913ad8", size = 212318, upload-time = "2026-08-15T08:18:04.403Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4a/a6ee107430768a5334e6d63f31f148a04a1a491ef161a1ac9415a73f2fa8/charset_normalizer-3.5.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:26422d45fd13551cf564c58932f7d72b4f58b93b0fcf18c35ba6be12b46bb102", size = 224897, upload-time = "2026-08-15T08:18:05.997Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d9/35ae3f64f29d0179c35c3baefe575904df2913dde519129c7f75995a2b1d/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:09a7bba9f739468c8e78c36a75c33768e53cb1959fc638f510454c14683f00d5", size = 194848, upload-time = "2026-08-15T08:18:07.397Z" }, + { url = "https://files.pythonhosted.org/packages/74/76/f2fc7380f056cc273a53af37f50d08ad54b2c59f61078f31432edcf1c2bd/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4c9548dc78002099910abaebc0a72ac58b7d30931869e0351c09b507dff4ece3", size = 198163, upload-time = "2026-08-15T08:18:08.989Z" }, + { url = "https://files.pythonhosted.org/packages/e9/40/095ce62fa078483cccc1fa2b36e6bc9580b85422a20ee9f925341c50e44f/charset_normalizer-3.5.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c428c6c31eb5f4277d7f8eccaf767fbd548ddd5ce3c8b4f4cbbfab3d96b5904c", size = 341823, upload-time = "2026-08-15T08:18:10.458Z" }, + { url = "https://files.pythonhosted.org/packages/f1/5a/0e58b1c04a1596e0256f407274a92d5fb2ee21324409d1fab1da48a65b5b/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f06b7eae9dbe77fe1d644ca244dad508de8d302870a43f3c559b521270938a0", size = 242458, upload-time = "2026-08-15T08:18:11.989Z" }, + { url = "https://files.pythonhosted.org/packages/22/95/b4618ce912e6db0b1aae89ba788e38e8a7eba0f3025cc66e8c0699f977b2/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b7430cf5728e68f6c462254009a6ef4086e1bea43cf2f57aa9c55fb4f50ff96", size = 226717, upload-time = "2026-08-15T08:18:13.401Z" }, + { url = "https://files.pythonhosted.org/packages/8a/76/c681192bbda3d55356db5dadd64381d5202b37c6b598fcda5282e88b5d3d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab743e9bc90c1f73552ec33e10e3331315acd2c397b36065b591b0181de533cc", size = 266111, upload-time = "2026-08-15T08:18:14.961Z" }, + { url = "https://files.pythonhosted.org/packages/88/be/55127bfca72c0cff6c022488d140d7c5b04c771e3b72e9bdb4836d54979d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6f7deae3feb4edfa2efaf7c574fe88cbf055038a6abdb40188e4fff66d5699f", size = 263128, upload-time = "2026-08-15T08:18:16.515Z" }, + { url = "https://files.pythonhosted.org/packages/e0/91/39c3af510b0aa32bbda03374259200f28430febfd1bf5e511fe765282ce5/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15f024313246a4ed976c60f440bb8d257815513a681d212ff74fd46f7d715a90", size = 251240, upload-time = "2026-08-15T08:18:18.127Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a5/cbe418bbc6ecdfc3e05a0116002897c4b403a5e838d697e64c78e9f0190d/charset_normalizer-3.5.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:823f82903d189af463d7df250ef1f7f696f3cee08cc8d91deb565e8d425f6506", size = 245282, upload-time = "2026-08-15T08:18:19.625Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a4/689bb42e8e7cd492f3cb64907c6bc00ad247ec9a3628cd3f8eed126e8ae1/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:01e93745f7f219b703b60ba7afead36cfc4242782be5af484673fc500df12da5", size = 244597, upload-time = "2026-08-15T08:18:21.121Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ce/9962938e179cf9f699d3f1e7b3114b5d7642dee6a893745229f9dd04f274/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:329fc3ccb63ad22d867d84c2adea759a64079a37ba4a343433b02c7a2816871e", size = 231376, upload-time = "2026-08-15T08:18:22.57Z" }, + { url = "https://files.pythonhosted.org/packages/85/54/46000450ada53bd9eac5429a2c8c54cd2d9b39c0c255f229aea9af0948a5/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:bb57753e36e4855b8ca375069482250a6246372331a3e4f3407eaebb007443f5", size = 266715, upload-time = "2026-08-15T08:18:24.235Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/618749d70f792b44252a777bf89bfb86823b9bbc1ea13fe8ce759b07f38a/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fce8cbd4997efeb450bd298b54f755dcdff18d496f7a5ddbb4867c6d7c88fdc3", size = 245848, upload-time = "2026-08-15T08:18:25.726Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3f/ffb64458527c7668031d5eb095d978de561958dc9f5b53f8e488a533e603/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6c9cdde8becb25a7fde49924511aa2644d6f8081cc8df8e9452724303348d8e3", size = 264521, upload-time = "2026-08-15T08:18:27.193Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ab/74a55fd803916a35ac461daf002708191aac19b546b80dc8cabfedc63d98/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9ac4444d8d4fd4c4bd08bf451ed3167aa9e7ec6cdb41b648794f1d1103652e36", size = 253054, upload-time = "2026-08-15T08:18:28.568Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2a/6a9034b7d3c60b17499afb482df5878bf9fa20b50cc3887d5ef017a833db/charset_normalizer-3.5.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f03ac127268b43ef4fe9e6ab6794a6794b49485a0cc0c1db79876d2f33f75bc7", size = 140580, upload-time = "2026-08-15T08:18:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/f3/46/1d362e1a00d035d66b9869e1281eee115907f7e390a16a07824ab5737360/charset_normalizer-3.5.1-cp314-cp314-win32.whl", hash = "sha256:1f5883d77fd409a261abb5dc8ccbe335720d798b1de4abb3b1d47ccbbc76b53b", size = 180325, upload-time = "2026-08-15T08:18:31.877Z" }, + { url = "https://files.pythonhosted.org/packages/7a/7c/4938c329b6a9d446f6a59aa2092ff7118f274209b5ed0e26893d1d30a63c/charset_normalizer-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:c658c50ac0c98cd755a2dd50b7977d3bca7df401dcc47fbdfa87db53ef7d4e8b", size = 204175, upload-time = "2026-08-15T08:18:33.466Z" }, + { url = "https://files.pythonhosted.org/packages/ac/33/eeb384dbd8dec570661354592f4f2e1b2fcc92585624d146a000caf53841/charset_normalizer-3.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:4bea7f8ebe90bbd7f0e4a2de42ca6924ba23e3e76418c408ff82f1d46fabd687", size = 184123, upload-time = "2026-08-15T08:18:34.913Z" }, + { url = "https://files.pythonhosted.org/packages/1c/6c/c73fa9d5a85f6ab05395de61c5f6984e0a9ff40bb5ff888d46dff02526c6/charset_normalizer-3.5.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:fbc597639158fd7c14d55e808718848319540f51b0e6746e3eefa59723a4a348", size = 381682, upload-time = "2026-08-15T08:18:36.349Z" }, + { url = "https://files.pythonhosted.org/packages/30/c7/63565f860921457feba93bae6c86fb7746deb4cffeed2f375cb845318146/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71c909f353863b2b89c83de2ebed71ea6d0df8a6ef65a128193c5e650766bef", size = 240826, upload-time = "2026-08-15T08:18:37.887Z" }, + { url = "https://files.pythonhosted.org/packages/06/ae/7ae8807410dfa33f8e6f1715740adeaafa8a816cc4cb33508f54b1f7c896/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7ac76cf9afd34929d76eb7fcb63be476a4853d8a96f0dcf2d0db68a0cbdf9885", size = 227861, upload-time = "2026-08-15T08:18:39.315Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a3/887c1642f0da26000b0e0652d91071113c0e72cea33952e225cf589f49a9/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a3a370082ce34d0612f421e15fe011c53bb1feff21a26d06ad4fb244dab5a375", size = 260758, upload-time = "2026-08-15T08:18:40.88Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/e6f5b9a3d0e55b0ef7505cd3765cdd48f22db89994c947b316f52f801fd8/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:256dd4d85d9e4dc595e2bc983c980e73f62ddeb3165c58b4c3dfe78c5c8548c1", size = 259950, upload-time = "2026-08-15T08:18:42.351Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ee/e4e10a94d51cd1ee638aa7e00b65399e6b2a4e8376ab6d2eac9f95586671/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58d4aa13a59c969dbfdf9e6a9560e242cbfd9e8a8f50c2747714df1a423adf65", size = 249329, upload-time = "2026-08-15T08:18:43.914Z" }, + { url = "https://files.pythonhosted.org/packages/c4/25/d5f4198819e6059735a84e8d0bfb72dc33976da67b97adcd3fb5a5e07ec6/charset_normalizer-3.5.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0c6dfb5ca6723eeed15aa8e564a014d69fcb8812f94eef11fe3631e0508199f5", size = 243137, upload-time = "2026-08-15T08:18:45.368Z" }, + { url = "https://files.pythonhosted.org/packages/a5/e9/e925ca7569cf9fb9701fd82503fee73eea5268fdb856bdd64947092d3daa/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c010f5581d9c612804cc59fcf7b524b707fbcb72828551237ab545bb5c7034af", size = 242820, upload-time = "2026-08-15T08:18:46.842Z" }, + { url = "https://files.pythonhosted.org/packages/34/17/672c251a888ed2aebcdd2fe830ad0104e25ff83c43f5c4f9c15e9fc6853c/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:52ec005752a56ae79547a05c0139ca2501a0c866390b6115008456b9f0e7cde1", size = 230504, upload-time = "2026-08-15T08:18:48.353Z" }, + { url = "https://files.pythonhosted.org/packages/3f/fc/f6a85abebd42ce4da2f1db0aa56cc6a0df1995e318b3875d14401b8381d1/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2bced4061f000f7187254a02ad3433ae17eaf991747ceea2f478422590a5bba9", size = 263087, upload-time = "2026-08-15T08:18:49.859Z" }, + { url = "https://files.pythonhosted.org/packages/98/66/7c42677e739ba66746b297e2046918d793078094dc239e1e72768cffccc6/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9eea3ab2597a5e65fe65296e2d6a84570845a6b55532d90333d740d48bbc850a", size = 243269, upload-time = "2026-08-15T08:18:51.601Z" }, + { url = "https://files.pythonhosted.org/packages/de/d8/a50b79237f417af10f8c2a501ce8d1ca87829a22e69117891ca4ba20a69e/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:496846868fea80e479324862fa877f02411f2fd0f83b79ccee2607aa68b2a032", size = 258766, upload-time = "2026-08-15T08:18:53.23Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1d/0fc91aeaeb3c83b748f532399ce67cf84604b48297405d740000f7a9e786/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:85d5855daafc240cc045c026d7a15fd198a09b0fc8ff6f5ecbb5297b509cb11e", size = 250814, upload-time = "2026-08-15T08:18:54.768Z" }, + { url = "https://files.pythonhosted.org/packages/ae/10/3d8c777cf9024615295aa1b808324ad5b4a77855869c00824bad74ffaf8a/charset_normalizer-3.5.1-cp314-cp314t-win32.whl", hash = "sha256:58d3e12c88e0950bca850ae1f7c256055c097639c2edb9eb123af9807d8b15e4", size = 191074, upload-time = "2026-08-15T08:18:56.305Z" }, + { url = "https://files.pythonhosted.org/packages/4d/81/ae557d3c44d1a1d688696d60563413a0866a91b7ebc50f20df838be3d8c8/charset_normalizer-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:acaf604462bf330b0d07e7a07c1d6e4adac79e5fb13e9c5140590542cafacc00", size = 216476, upload-time = "2026-08-15T08:18:57.889Z" }, + { url = "https://files.pythonhosted.org/packages/27/e9/61c01fb8b804692569c036b3fc50495814502dcf13a60649c6055390b02c/charset_normalizer-3.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:fdb8a068947befafba9952162645dc2fecaeb400e64584829ed5e9b2fbe21a7f", size = 194115, upload-time = "2026-08-15T08:18:59.418Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4e/8544831ef59d8f27ce92c80871380fdacc8076a8a56ed62f82e54f991333/charset_normalizer-3.5.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9085f87b0e38a2b92b8923059b4e8789fe40d9279712d15dcc670048d77079af", size = 342048, upload-time = "2026-08-15T08:19:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a6/e3b46852424246065355644f4fb6dbccc0239a42a2eee27ecfc8957f0bcd/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2679de311c7946dde5d3b6f44941844133ff5c7cb86099c0061ab1e8901c20a8", size = 242997, upload-time = "2026-08-15T08:19:02.492Z" }, + { url = "https://files.pythonhosted.org/packages/03/3b/0cc9a26777334ab2f2e3089b948bbf4e4fe72ea70b897715ef6415043ec8/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:baf3775a2635e5a11fbd5e4e64ee69c7e86875d224a5c72aca4c141064589a90", size = 237014, upload-time = "2026-08-15T08:19:03.943Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c2/027335f0aa337a2a2e121bac1ad88c4f02ba6053ea0926802784f3db11af/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ac8c94b6539074e0f40899301273ac8402b9b3e01c7b7ba269ff30340aaaf20", size = 266174, upload-time = "2026-08-15T08:19:05.598Z" }, + { url = "https://files.pythonhosted.org/packages/86/d3/e367787febe4e74769dec0f406f2c3c8d1b955fce5aee1fd0f94e8367a45/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fe532b3c966d1fb794e0698e4589d0444017ae77fc0b31edea13c0e35bcc449", size = 263361, upload-time = "2026-08-15T08:19:07.251Z" }, + { url = "https://files.pythonhosted.org/packages/af/3d/391b193eb9f3e84b02f9314088c386debdc0debee843535aaea2e2c6715d/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c84bec0ab5ae0c64bfe73a7d2adcb5ce73b467523fc27fd6a28ab2aa6cbe35a", size = 252143, upload-time = "2026-08-15T08:19:08.816Z" }, + { url = "https://files.pythonhosted.org/packages/2e/57/de221f1745a90d418199761967e2776bfe2c275a1194220985e8c1d37833/charset_normalizer-3.5.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:854066be00447fa8de2ccbbe893e2ffc4b123ef16d897af794c1e18bd4a714b0", size = 252086, upload-time = "2026-08-15T08:19:10.255Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e3/d119f86a01f9331e8186175f24873b1d74a7ee9e2e4b4d68f9947dae5afd/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:21b82d8082f6f5e7f456ef0bd16323d08de1266efbfeb476e64b2a91d1471a4e", size = 245231, upload-time = "2026-08-15T08:19:11.807Z" }, + { url = "https://files.pythonhosted.org/packages/26/de/d8e48c135ae480879539cdb179c8d3b50c7879497d75dd899b5763b69cee/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:838648accb3a7fd9803fd45c87bce8509648eb0c11bc34e216141300977244f2", size = 241546, upload-time = "2026-08-15T08:19:13.416Z" }, + { url = "https://files.pythonhosted.org/packages/67/c4/217755fd1abc50d326c252922cd642002758095a81ff45010337b8b3ef65/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:195ce897c6153c0700078142cf8efe3e6454ca4cf4357499e4078dfd83396626", size = 267033, upload-time = "2026-08-15T08:19:14.981Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d7/34d8e404e358d2adcc5a228c2134643af00104c8fb0bf525f3688d756f05/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:978eab16f55b4ab2c2a745be9a0a840bf8f09a7f227d9c76eb30214d078865a5", size = 252045, upload-time = "2026-08-15T08:19:16.618Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fa/40414471acf0aa0692ca77305aa00e434fcd8288f0941c93c30e9a5f8f2f/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:cc0329df4caaceb950d2f580b5ac716a377f7059624a0bafaeaf8a218c6ed774", size = 264866, upload-time = "2026-08-15T08:19:18.101Z" }, + { url = "https://files.pythonhosted.org/packages/32/90/fcc850bae791abd2e0c041847f13e270aa08692a79f3e00de6d2dce1cb50/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:687c9ca3035544b113bea2055e180af96fb63c0c476e22a9180f51925186e7b7", size = 253932, upload-time = "2026-08-15T08:19:19.734Z" }, + { url = "https://files.pythonhosted.org/packages/af/af/53afe99068b3c10b4cbae592a52ef72a7c92c0188440e83ee3a078fd8f75/charset_normalizer-3.5.1-cp315-cp315-win32.whl", hash = "sha256:706bfd38730a5ac7a365793269a00f4e988178cec121391f4248d84ad8c972e9", size = 180320, upload-time = "2026-08-15T08:19:21.37Z" }, + { url = "https://files.pythonhosted.org/packages/c9/bc/f46a132041b29e4a8779ed712d3df1bf112e94ca8de58b66d7ec2c0cf8b9/charset_normalizer-3.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:92caef967d287a407085d61176fce4012b1dd62daed4eb6d5ceb26d3d2538712", size = 204174, upload-time = "2026-08-15T08:19:23.088Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5d/9ed554480eda8e447b673648628fdc29574d23dbad01fe11837adedd1cae/charset_normalizer-3.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:5fc45d653ea8c9a20479167e11d4a0f8cb2fa3470737ab6f9c827532313187b7", size = 184126, upload-time = "2026-08-15T08:19:24.471Z" }, + { url = "https://files.pythonhosted.org/packages/3b/32/9b8929bf384061ee1fe5d9c27c6f9776d3d824039ad4e14c88ec00c7808e/charset_normalizer-3.5.1-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:59171c6e45bf07d0d5cab3b0bf81d945035530f6873398b3b531c31184d46663", size = 381441, upload-time = "2026-08-15T08:19:26.038Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/e9aa7923d3ddac652c99a1c5f7be494e737e151566a44abe018daf757f2c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9dbdd9205662134957cf0c324f639bdc5031c0ca056e2369e238db75187c0f11", size = 241742, upload-time = "2026-08-15T08:19:27.532Z" }, + { url = "https://files.pythonhosted.org/packages/28/53/a2d249ebddf47b889a100c0bdcb61a2f9dbb8bc24ef325cc062e4f476877/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4b018dc5a0eee4676e38fe84a47a427816c590b93b55d9025274ec4d6ffc2dc", size = 235298, upload-time = "2026-08-15T08:19:29.274Z" }, + { url = "https://files.pythonhosted.org/packages/7d/07/469f78af590f7d5cd48e20d8dbfa3d66deeff9ba37768c04d886b5afd45c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced3fdd71aaa83ce593746c2edb42b7a59cb4c19c8b5c407781c72e493aae55a", size = 262500, upload-time = "2026-08-15T08:19:30.955Z" }, + { url = "https://files.pythonhosted.org/packages/55/66/3bb56a47f7dcba014055b1a1d33c6f08bbe9c1e74dba154cfa25f90ae885/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:19a3dd5aa73cef1c99687c4fc57db016a9c17104ae1185da88ba566a5d3bebe4", size = 258888, upload-time = "2026-08-15T08:19:32.458Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c1/2adc2800903fb013210349313b710a5376856578d9e33e6b9a1d8b36714a/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc5d36d96478aa9c60654bd932525bf32964c62a7281eafdf16d85003a8d6004", size = 250243, upload-time = "2026-08-15T08:19:33.94Z" }, + { url = "https://files.pythonhosted.org/packages/95/b5/a18d0dd1157ab655cc2cb14a545f4a4784bbad70ab3502412e36097502d9/charset_normalizer-3.5.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:04368edf83514385ffc3e1cfd4546e595f4f1272dd23ba437a93a9cc3741d47b", size = 249871, upload-time = "2026-08-15T08:19:35.413Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c3/525f508cd1e58d0450ac55ed40ac75bc3a97482c59def5278456a5fbf03c/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:9b5db6052055d34d41230fb78d7c439c23dc536a9896f6cb039e8dd92cfc1263", size = 243580, upload-time = "2026-08-15T08:19:36.886Z" }, + { url = "https://files.pythonhosted.org/packages/7c/c1/49a91fe7e97c8140094ca5c64161ab623a70d9f636bf834eace14048acb5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:252d099029bcbea642f2a06c4ed5046bdf8b5a8150b64afa5e027e88b106e5ee", size = 239807, upload-time = "2026-08-15T08:19:38.392Z" }, + { url = "https://files.pythonhosted.org/packages/d3/58/56a48c296601274c4689b864a8e2dfb209b81dfcb39472753ce95eea662b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:6199d5606e2bbf2b096cf64d03f8b6790c91081d5ac866b8e7bb6422738cc60c", size = 264083, upload-time = "2026-08-15T08:19:39.856Z" }, + { url = "https://files.pythonhosted.org/packages/10/4c/dc48409274a1817ff349711d26c62aa0c597df865d4d69ef79160c859193/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:77efcff2b23071c349402ac1066667a3d011f62398d81408c9b88ad991747c9e", size = 250317, upload-time = "2026-08-15T08:19:41.53Z" }, + { url = "https://files.pythonhosted.org/packages/81/58/d325912115caec62d6bdd77bbab5e0b7da5d234a9f20affdffcbcb530d0b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:a5cbd90ecf0fc62e64726917ad083b73001f0563657a87ec3c0b504e277dc90d", size = 258173, upload-time = "2026-08-15T08:19:43.07Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/b13b1ccae2c8ec63980d13be1890eb73f8aeabbfce02a24aabc0908788f5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:4d26f14f041e83dd8edfd61f4cd4fa7285d31798b5bf1f28e70c367ba6c41d61", size = 251960, upload-time = "2026-08-15T08:19:44.587Z" }, + { url = "https://files.pythonhosted.org/packages/1e/25/ed3f9919c5aef8cc818be1f972f565f7610d7b2076b8ebb98839516ffc3c/charset_normalizer-3.5.1-cp315-cp315t-win32.whl", hash = "sha256:ac13b004224fb341e1e25a1ed5e19d32f57cdb2a403e01f003b46f051a550f6f", size = 191186, upload-time = "2026-08-15T08:19:46.293Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/43c2b3e9d8267092b913eb8b0603f0f71993c395632886bd37a7223f96cf/charset_normalizer-3.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:35aea775dc2bd5f54cd84a1cd2696cc3207c479cb9cf0bd346f0d343e4300ddb", size = 215947, upload-time = "2026-08-15T08:19:47.853Z" }, + { url = "https://files.pythonhosted.org/packages/a8/76/9aad3e9c8865e5e0efa9a7f6f81c37a67635a985145ecd44528a81e088ee/charset_normalizer-3.5.1-cp315-cp315t-win_arm64.whl", hash = "sha256:fb78f6e7fcd8ad785d28cd577168bc1aaee827b25bb8755638f694794ea98f0a", size = 193909, upload-time = "2026-08-15T08:19:49.383Z" }, + { url = "https://files.pythonhosted.org/packages/5b/97/fb4e82231aba271ffd775a1b4993b0defc4e3059f286ae41d9433409fe85/charset_normalizer-3.5.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2", size = 331467, upload-time = "2026-08-15T08:19:50.959Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2f/fe3f187327aac18e2d54e9d2b08e15d27bf9b642d9e51c219f130fc34d1a/charset_normalizer-3.5.1-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99", size = 253057, upload-time = "2026-08-15T08:19:52.654Z" }, + { url = "https://files.pythonhosted.org/packages/d7/c7/9e48cee5c161fe24da823b61bf381921d77cb994a0a4de148e95018c1984/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2", size = 240930, upload-time = "2026-08-15T08:19:54.163Z" }, + { url = "https://files.pythonhosted.org/packages/49/e0/716601f3cc69be7b198951150c75ead1ece33c3c8036ff6ffa46029659a0/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:343fb4f2821043bd87095f7b08a1a181febc8e36ac64212143bbfd0a0e1bc235", size = 230822, upload-time = "2026-08-15T08:19:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/d3/05/71bfc5caa0abcc45aea1f6a4d50ac68e59605ddc7666fe8494f4cd229665/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ae4a097991662cd4fff0ddc74e0fe7874f82e00042fa0ea00855645ed0c79598", size = 260037, upload-time = "2026-08-15T08:19:57.312Z" }, + { url = "https://files.pythonhosted.org/packages/c3/92/de7e32ed05341e7a9c4c877c318418197b7f2d66a3b68d561bf2ac57ca3e/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b599739b93b2cbeded49645ae3c8d1405c29ddfbceac1545c87a3f9580a9e96", size = 255097, upload-time = "2026-08-15T08:19:59.056Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7b/ade0a122600319dfa0b1000ab0f9731c94a817904cf3c5de408c73a4ede7/charset_normalizer-3.5.1-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b39b69b347e5e47a3b5b8cfc005c68c1ba347474e3960236c4944a8ecd174962", size = 250166, upload-time = "2026-08-15T08:20:00.612Z" }, + { url = "https://files.pythonhosted.org/packages/75/9c/019fbb9f4834491a160951349b1a3714439376f66e5f7cf18b4f18f0c7aa/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a2028475ba855475b8b4d3cfeb4994269c967aea8b9892dfba907f4263a863a3", size = 241821, upload-time = "2026-08-15T08:20:02.321Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b8/11d4840bfc99330cc7fbcc2681ee5a044553a6e77655508d8f9b2bff7b34/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:36047af20e17097c3bb9476c2b7655f2f7aa51322c0ba58c07695bedf755a950", size = 232529, upload-time = "2026-08-15T08:20:04.008Z" }, + { url = "https://files.pythonhosted.org/packages/18/96/2b3a21492d9f65171ac75d872f5018260013d00bfa0ff70ec9f179148cbd/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4c4fb141a727957c93edfe5c32a26ceb6b5f6461d67146e2d39f51e16170bea8", size = 260348, upload-time = "2026-08-15T08:20:05.877Z" }, + { url = "https://files.pythonhosted.org/packages/d6/aa/a69a2028e8bd052476c245460ab19d7de595de084dd968f2d75cd50c3e25/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:2f293479cce755c75f1697e87c409b7ae4c555c7dfecb6e988ad13abba943031", size = 247234, upload-time = "2026-08-15T08:20:07.487Z" }, + { url = "https://files.pythonhosted.org/packages/35/8a/3d130aeabcaf3d2466af76b7b141c08d9e89c9016ab4b7cdd0f7dc2d1c62/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:3588e376b3ea2eea84976f67273d679f229e24c66dce7b82ae45aef04ff6e072", size = 256917, upload-time = "2026-08-15T08:20:09.142Z" }, + { url = "https://files.pythonhosted.org/packages/80/c2/a7379b840292d0c1ab9fbd17d1f3967aa81794dc95bc74be8999d7fedcf7/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e199fb99720074809a7720f1c0b4d919eea8b87e88713e0f8f602f7bef543d9d", size = 254846, upload-time = "2026-08-15T08:20:10.727Z" }, + { url = "https://files.pythonhosted.org/packages/01/65/d43b714731bb2f40d4053dfa00ecfc1c5a301f8e3316c5db3a09af59fe94/charset_normalizer-3.5.1-cp37-abi3-win32.whl", hash = "sha256:dd732602a7009217f658d5863d12d79d373a4de0eebc111094bcdd3bb8e0a6cc", size = 174216, upload-time = "2026-08-15T08:20:12.334Z" }, + { url = "https://files.pythonhosted.org/packages/35/4f/b911ed898b26a09789eba9c9200c999aff6c61b4bafaf4838e56d1a1e1a3/charset_normalizer-3.5.1-cp37-abi3-win_amd64.whl", hash = "sha256:70055ff39b97c99e7ae40ea3e393fb62aa2e44dbd9b29f8d14f42fb0025c3959", size = 199764, upload-time = "2026-08-15T08:20:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a7/920baf467bfd9bf689f3b318340f37aee4572a71f162bd8db51da55ba4fa/charset_normalizer-3.5.1-cp37-abi3-win_arm64.whl", hash = "sha256:87e4f41d375c0b9be2fb5251aee4b8a689169e134535aed81bf085c3b647451e", size = 287318, upload-time = "2026-08-15T08:20:15.551Z" }, + { url = "https://files.pythonhosted.org/packages/cc/61/d01fc49b8dea277640b55a9e15960dbca9fdc8c9fde18e572d39c59f4019/charset_normalizer-3.5.1-py3-none-any.whl", hash = "sha256:6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6", size = 68658, upload-time = "2026-08-15T08:20:43.306Z" }, +] + +[[package]] +name = "click" +version = "8.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/0e/7fa0ef50764b67090eca4114772a2abf8b6148198475e54c660b97caeee6/click-8.5.0.tar.gz", hash = "sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34", size = 382235, upload-time = "2026-08-26T13:33:14.56Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", hash = "sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360", size = 125251, upload-time = "2026-08-26T13:33:12.928Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "cryptography" +version = "50.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/ad/5d6702db60b1e40b41ef513b6967ff5848f307d50f8449baf1634f5908f1/cryptography-50.0.1.tar.gz", hash = "sha256:5dd9bda1c12b4162f6ff568eeb5e0ff956c28d14406e875cfe8a63a2d414ff20", size = 880381, upload-time = "2026-08-25T19:45:45.499Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/19/797e2aaac9df6a66f1550f49979dc1b1e39ecd2077501c30efa81e8d5d67/cryptography-50.0.1-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:b8f852c65863251b9e3a1b8c150ce21e59b522dbb6a7d4bc80e680d38388e986", size = 4010153, upload-time = "2026-08-25T19:44:03.155Z" }, + { url = "https://files.pythonhosted.org/packages/90/34/9ce9a62ed9dc82ca9fd6a34445b6904af56e5f38b3eae2ed32e49c36053d/cryptography-50.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e279950892dc102c6b4e52af03ae5ea92fac572a1ddab78ca73a997f62b69f", size = 4723133, upload-time = "2026-08-25T19:44:05.461Z" }, + { url = "https://files.pythonhosted.org/packages/57/26/e6d4fc8512a51a5f9ee7bfdbfb853bce1197087df40c9ad993ad370b846f/cryptography-50.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ff838d62ec1bfce4f9ba7fa16f4a7b554cd8d0c299e6be37502161a660c84eef", size = 4712478, upload-time = "2026-08-25T19:44:07.375Z" }, + { url = "https://files.pythonhosted.org/packages/e6/de/d3cdc2815697aae84126cbd6a030ca7b6b452e28a88b501b836bd3aa7a86/cryptography-50.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e74591e283fe6eb956416c929eb58262a719fe0311fd9054c62c3350ed8760d8", size = 4730726, upload-time = "2026-08-25T19:44:09.294Z" }, + { url = "https://files.pythonhosted.org/packages/55/32/38c0d344b98c06d34b5df8946565a9c0d6dbf32c8e0730a7f05f0a3c6cab/cryptography-50.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5fe002589592ed749ce77fe0695fcbd3500dd61d7d6db5858a7544c612fa8e45", size = 5353524, upload-time = "2026-08-25T19:44:11.96Z" }, + { url = "https://files.pythonhosted.org/packages/e1/1b/82f0f0d8858d4432be1af790477edf62aef90324041aa07c57e57bef1af7/cryptography-50.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:51593d180cf6d179bde5c5d065bed81386b1f381656ae7d042b7ffc87a9895ad", size = 4746720, upload-time = "2026-08-25T19:44:14.051Z" }, + { url = "https://files.pythonhosted.org/packages/29/ba/042ca458b8c64348c768284b5d23e69b92ed53d057ab779fee628564676d/cryptography-50.0.1-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:359e62deae718bce96170e223fdcb6357e4fbd3bb7a3a75f4430763532560e49", size = 4361866, upload-time = "2026-08-25T19:44:16.167Z" }, + { url = "https://files.pythonhosted.org/packages/39/3b/e96c1ef71edef71057c7e3c3d982ce8fda554e0c52d0cc19c18845cde3eb/cryptography-50.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e2ca8fd1b6b4b82a1c4cb02841d0837e3c12336c2e24b520ab8ab3b969733d8f", size = 4730028, upload-time = "2026-08-25T19:44:18.085Z" }, + { url = "https://files.pythonhosted.org/packages/e3/38/45abd72ef63f2e7d0754a6cacf97bd8b69512ace7f6130d24c39ece65da2/cryptography-50.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:76de83fbd91ac49c0feaaa983d0748fd7a53176afac5fb3bf7478d244f0eb527", size = 5308405, upload-time = "2026-08-25T19:44:20.197Z" }, + { url = "https://files.pythonhosted.org/packages/85/66/6ccca4722987ddedaa7fc9c3f4708af7431f5535666c174350830888c6b7/cryptography-50.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:51afcfceb15597cf2635068e4ac9a56b2abde622edde17f37d85fd7b5306497a", size = 4746230, upload-time = "2026-08-25T19:44:22.376Z" }, + { url = "https://files.pythonhosted.org/packages/13/0e/b1f92e013228111413f2e6743948b80bc24dfd3c1b87ba98ceea16f5df89/cryptography-50.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:be224a65493ec5b74a158ff22a5522ce4a5ca1e543c647a3a4730d4a09e5f959", size = 4862596, upload-time = "2026-08-25T19:44:24.472Z" }, + { url = "https://files.pythonhosted.org/packages/7e/22/c3654cccc856e9d682817b04ac3ee79731cb09ca6f95996a95c904de2883/cryptography-50.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9ebcdd5519be9b652a46f507817a74591774fc3d6923ac364e4dfa64e36b291b", size = 5014082, upload-time = "2026-08-25T19:44:26.709Z" }, + { url = "https://files.pythonhosted.org/packages/42/8b/cb12b1b60c91b074ca6bf0fdd59aa8f10d8bc5f73af8faece86ef0421b37/cryptography-50.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:aed8db4f6d71c51efb89530e12d9464e7bf2923d46c3205dc794a2a93f8c0648", size = 3842826, upload-time = "2026-08-25T19:44:28.784Z" }, + { url = "https://files.pythonhosted.org/packages/5b/f0/424cb557d99aa86ac55da5e2add02e2882e44047b6264f93ade1b975a993/cryptography-50.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:30a125032e5642a21ff816e021152bd4e7e94f03eff3f4b7fca41cd22bc3110f", size = 3973525, upload-time = "2026-08-25T19:44:30.7Z" }, + { url = "https://files.pythonhosted.org/packages/4d/72/3a2711d967977ab5fc80b782837c7e8d1ac7445e764c20c381a265c57ef3/cryptography-50.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a0b1a59e3a089064a0ec309e9428c8e3ae4e161419d20ac33600767e83fc658a", size = 4708817, upload-time = "2026-08-25T19:44:32.773Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f2/bb1f56e10815b789df0b409a69fa4992ff3d3fef9c72747f4a6b26fed38e/cryptography-50.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8921d58f426793c5f1b47f0b59575780de9a095214958d0eb37d909593db8367", size = 4697300, upload-time = "2026-08-25T19:44:35.144Z" }, + { url = "https://files.pythonhosted.org/packages/08/bd/ed5396be499ffcf8807a585bfe38b71a1fbdd1c342b4f9b6d0ef5162a946/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a8f40ea47330e71b594a7e246898f93177c259490c63183dbaf9e571d71ed9a5", size = 4716039, upload-time = "2026-08-25T19:44:37.192Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6e/1cf405c5c8e8df7545378048e954792f00b7f2367af8863ce8b8f3e10607/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:a255449073358275b64b67d3f595f268bbef70e72b6edb65e0c70c735bf739c9", size = 5332388, upload-time = "2026-08-25T19:44:39.16Z" }, + { url = "https://files.pythonhosted.org/packages/47/92/b4317e8c32c4f47b062f5398bd79106b220a124546f42be83bf32b761e2a/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:8df2de9102026855887e4587084f6eabd80ed0f345b8ad8a7ac27ab9bf4723e0", size = 4730293, upload-time = "2026-08-25T19:44:41.298Z" }, + { url = "https://files.pythonhosted.org/packages/39/0d/a1e7633e2c744d0f2983320a27e924ef2264c79c56e1a58d5fb0a1cfd413/cryptography-50.0.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:ac02b07824d4d1001bd4367599f839c19cb171924c796e52c23508ac14c2c0cc", size = 4346031, upload-time = "2026-08-25T19:44:43.245Z" }, + { url = "https://files.pythonhosted.org/packages/88/dd/b215616f9bab3fc18510c78a4e5c9f362d77838503c363dc747c7d4f5c6f/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:cbf74a81765ee67413503ca6e26dcc4f6f5a519822436cc0a1b97aab6c1b8a17", size = 4715344, upload-time = "2026-08-25T19:44:45.291Z" }, + { url = "https://files.pythonhosted.org/packages/b1/1b/ec3ebd31741d0e963612c4fe43caa39341b9b1e031e469820e42e4c83918/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:16c5ecd954b3330ebfb6605eca4fd952da8bef376551d5cc264534e3770a9ee6", size = 5287201, upload-time = "2026-08-25T19:44:47.297Z" }, + { url = "https://files.pythonhosted.org/packages/1a/01/0127d11a762b31a9ee0221894f540318761783f3fdc4bc5d057698caebd5/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:79bf008d1f9af6071c797ad133e39915dfee7614f18f18f4db9072eb715064a3", size = 4730023, upload-time = "2026-08-25T19:44:49.435Z" }, + { url = "https://files.pythonhosted.org/packages/9e/b9/e7425ebfb599241a0c1d7000f1b466c3062da66c19d9525031315dff7213/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:330fbb252391c596f1ae42c5754449dc924e6ad012dca8efe0d703f9f2d12ec6", size = 4847362, upload-time = "2026-08-25T19:44:51.94Z" }, + { url = "https://files.pythonhosted.org/packages/2d/fd/60d0ddf4defa12e482c9d5e0f554384d6e8ab25341fd15f060028fd92e6a/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:42be3bb70596b3abe4ac097b75be223e8b3ab614a0e5de068e3dcc54d71d6149", size = 4999247, upload-time = "2026-08-25T19:44:53.876Z" }, + { url = "https://files.pythonhosted.org/packages/4d/56/bc4f2b209e766c93372cfcd59b781a0b2b59700f62a969580415b699c2b2/cryptography-50.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f74455bb086a85d5e81246412602aaa97ed095e504cd40dd261ef50be42205bf", size = 3825806, upload-time = "2026-08-25T19:44:56.209Z" }, + { url = "https://files.pythonhosted.org/packages/84/a9/ee16a903f13755e914d1eecc482fe64d1f10761c3960e5d8fa6837377aff/cryptography-50.0.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ca83d00d9e69cd5eb63f2e69c3a5a59e0cecae5ae14c6ae0b35830fe3b37bad0", size = 4035307, upload-time = "2026-08-25T19:44:58.305Z" }, + { url = "https://files.pythonhosted.org/packages/5e/a5/9ec7e81e8526c0d7a387d73386b2daed3f39e10d81a85930bd1b6bfba65c/cryptography-50.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:05ba322c4da95b262a212c345af888ef2c37c88c0509756ea00a0e6d68850f23", size = 4751900, upload-time = "2026-08-25T19:45:00.401Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3c/0e77bd5ffcf078e9dd27d3074aad6c030d9b10d0bf69329d573c927a188c/cryptography-50.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e22dfed744bd4002e909464cb23d2f0b05c6f3113a79ef2e9864a53db737c733", size = 4738357, upload-time = "2026-08-25T19:45:02.786Z" }, + { url = "https://files.pythonhosted.org/packages/27/3a/3c5f80daa4dcd47323c7af8a2fcb90de27a33564d4fcac69846c0972691a/cryptography-50.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4c4188f7c0cf655be5c06342b817ed0f9595b69ffa2b12026e5353eed29dea88", size = 4758474, upload-time = "2026-08-25T19:45:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/6e/2b/214cf0cf93db9628c3c20c896b229f327f6fb1b20e4b3743d8ad3f00af8b/cryptography-50.0.1-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2ebbfb0f1fed745e91796e3e1080a1440423fdae8ece1b995a1d80883a409054", size = 5375862, upload-time = "2026-08-25T19:45:07.163Z" }, + { url = "https://files.pythonhosted.org/packages/d6/51/3f9701867a46b6c1740c9b52fc4d3bed6cbdcfedcc9b6e64305c07f39cff/cryptography-50.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:407fe2b6db00939c05c0e945e9914238f2f0a430974839429dafc82b1ee6bee5", size = 4772942, upload-time = "2026-08-25T19:45:09.396Z" }, + { url = "https://files.pythonhosted.org/packages/0d/5c/13ea642e08e2544d0f5396122055f4820cfacb3203562197b5967125ea97/cryptography-50.0.1-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:2b34d76a652ea2b6faf777c35df230c5637842cd904e04f16230c3f9f03e4361", size = 4383347, upload-time = "2026-08-25T19:45:11.659Z" }, + { url = "https://files.pythonhosted.org/packages/84/d5/7d1fe1cb93f91c428093ff234e128c89ba8ea61a6f26aab406081f9b996e/cryptography-50.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:01f41478cf33fc605a6a089cd56d28b45c6c0b45a1928b61797f2621a04bac71", size = 4758050, upload-time = "2026-08-25T19:45:13.745Z" }, + { url = "https://files.pythonhosted.org/packages/dd/04/557fc5ead96a829e0bc812a3b9dc4a52a2f27e4f7f5950da7ff27653a805/cryptography-50.0.1-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:fc3ed7ebd2a8c96f5b166de0ab9b624996bef3b07bbeb19364dfb78222c22c80", size = 5332955, upload-time = "2026-08-25T19:45:16.193Z" }, + { url = "https://files.pythonhosted.org/packages/8c/eb/5d7124083e8d8cda8f5b348f544b71ad6f707ad63193758ef4d8e569da02/cryptography-50.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9dde0a357190eb3b1da1bb9ab750e9c85cba82ca5977aa0836cbb94e92611239", size = 4772694, upload-time = "2026-08-25T19:45:18.315Z" }, + { url = "https://files.pythonhosted.org/packages/63/8e/f1f955e0921dd2b6d22eae7e8d24a4c4b638d10735ffbf6a71f99eb0fcb8/cryptography-50.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd3718b960d0b5dd213cdf03f3bcb7000e69dda0de8b956061947ff6bcff5558", size = 4888413, upload-time = "2026-08-25T19:45:20.4Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ab/89e2b798d2c3925f82e2bb72d5979f3d2f6da2dd22ef4a8cd8b70d920039/cryptography-50.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2a93d05e34d5f67fba6f891fe85d929999baa7195e853923ea6d7576c9e68c5e", size = 5044355, upload-time = "2026-08-25T19:45:22.353Z" }, + { url = "https://files.pythonhosted.org/packages/99/89/87ef49ffe383ef4e147d27b7bf2088fb0b54ea409dd87b5a89442e5828a5/cryptography-50.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:55d16b1ef3ee0958d893a977b19777887e546c9954ea81b200c3301a864013f2", size = 3875429, upload-time = "2026-08-25T19:45:24.418Z" }, +] + +[[package]] +name = "fastapi" +version = "0.141.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/02/91e3416a8fdd715abb903a952a6bec7cdd8d14eed55d415fc8595524c319/fastapi-0.141.1.tar.gz", hash = "sha256:e8822fc40db1e1858054d7a949a888695bc9bdce70139178e33bd2871a453ca1", size = 425799, upload-time = "2026-07-29T17:18:05.568Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/03/10388a42375ee7e4ac9b94eb2c5c569c8b5795e377e701c9ac3ad63de890/fastapi-0.141.1-py3-none-any.whl", hash = "sha256:bfb91aa2d334c61cb35ba9a116fc123b3d3df31640b801cf57a7a78ec3f603b3", size = 131954, upload-time = "2026-07-29T17:18:04.364Z" }, +] + +[[package]] +name = "fastembed" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, + { name = "loguru" }, + { name = "mmh3" }, + { name = "numpy" }, + { name = "onnxruntime" }, + { name = "pillow" }, + { name = "py-rust-stemmers" }, + { name = "requests" }, + { name = "tokenizers" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/25/58865e36b6e8a9a0d0ff905b5601aa30db97956327c0df42ec4ed6accc21/fastembed-0.8.0.tar.gz", hash = "sha256:75966edfa8b006ee78514c726bd7f6a50721dadc89305279052be9db72fd53e8", size = 75115, upload-time = "2026-03-23T16:34:41.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/e8/26b7d78bb8972498c467ca34cb12ee2e60d26ba5eae6d8443189a1af37a5/fastembed-0.8.0-py3-none-any.whl", hash = "sha256:40bee672657574a1009e35ec50030a55f2b426842cb011845379817641bbbbd0", size = 116572, upload-time = "2026-03-23T16:34:40.69Z" }, +] + +[[package]] +name = "filelock" +version = "3.32.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/30/03b03951873a1a0ffc7e8ca0e10c15597b59e8d0e39260704cd2ea087bc4/filelock-3.32.4.tar.gz", hash = "sha256:2bde2e4cf732e0153406d8a7bc80620ecf5e621fe0d25e41143c4e3b4733ff30", size = 222126, upload-time = "2026-08-23T17:37:55.363Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/a4/9b63d595d748e3aff8812b65eacc1a2c4bd90b7c2012e08e72373b4835eb/filelock-3.32.4-py3-none-any.whl", hash = "sha256:22e58ca3b1ae3b98993b762d7338367ae64fe50252bf78d59da3bfebcdf1cedd", size = 99864, upload-time = "2026-08-23T17:37:53.913Z" }, +] + +[[package]] +name = "flatbuffers" +version = "25.12.19" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl", hash = "sha256:7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4", size = 26661, upload-time = "2025-12-19T23:16:13.622Z" }, +] + +[[package]] +name = "fsspec" +version = "2026.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/78/f34251dadb8f3921264a1d9b8946f5e542014ee2614b285261b4e40e6775/fsspec-2026.7.0.tar.gz", hash = "sha256:c803c40f4cf860b49dea58ee3e1c33cb9c790520e233537e1340049f89b82a88", size = 317040, upload-time = "2026-07-28T16:34:51.052Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/3c/6a2bf344106328fd04963664a60b9bb6496fc25df8e962fcdc1367285fb9/fsspec-2026.7.0-py3-none-any.whl", hash = "sha256:b57ddbafedfaef7018c1ecab32aa200a9d7ca26b77965f64e48b70061249d279", size = 206583, upload-time = "2026-07-28T16:34:49.538Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "hf-xet" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/ab/522a2ab67f27971a9d48ca666d4fca85ef7d5282d142e31fd087e27b1bbe/hf_xet-1.6.0.tar.gz", hash = "sha256:2e58454a340b3556dfa4972d5451aff4fba8dd42a236600ba1a1d2b1514f0fef", size = 920527, upload-time = "2026-08-03T22:33:13.243Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/62/3c062f593bd92ef4e77a0ef39541e3d82a0a1d3947c8a777a02a13a27828/hf_xet-1.6.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:70cbb9c896901600128cb9b6f06e132954fbede1db30f31f7c6c63f84cb7c31d", size = 4074584, upload-time = "2026-08-03T22:32:47.364Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1e/c0ad437dd267a8e435bef594acf781bbc3874ff0b6435b4962d03ecf7cc4/hf_xet-1.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:23379c2f9ec8696d952b16414a2bae72cad86a52df869b050698ba60f538c675", size = 3867381, upload-time = "2026-08-03T22:32:49.049Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ee/7c0d7b6ab336167531b1c30af2af003f054af4c749becbd7209ae33a77c3/hf_xet-1.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f2f7278c05c22fd60cb436cda1269649b3e81db65ecdc8496e5e164aa4143e7b", size = 4453982, upload-time = "2026-08-03T22:32:50.568Z" }, + { url = "https://files.pythonhosted.org/packages/63/06/ad8eab1c9525246650cbaa821caa3cdbaca734ab1a5b8c91bea09cbd8d69/hf_xet-1.6.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:948f15d3a9545cfe5932f6bd8b440f6ae630aee108f14b7bd6c561f7c2dcc522", size = 4249445, upload-time = "2026-08-03T22:32:52.391Z" }, + { url = "https://files.pythonhosted.org/packages/d8/26/1eee8aedb0dafc1ab9717dc9ac602cde33361b232dc06803f1f6ed18b58c/hf_xet-1.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5153e6bb103ad49d6ea9f1b2e230db5a2ea32551ad09a706d2f61d7c7c80d80e", size = 4451099, upload-time = "2026-08-03T22:32:54.114Z" }, + { url = "https://files.pythonhosted.org/packages/67/57/0b88af1f194ab6c9c650547d9cc06bfeaab836ae4dcdb331676bfb8be95a/hf_xet-1.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:35cec30d75c6f9eb9c16a77cef68e85a103b72e24d4b473714ec9ff06428bab9", size = 4664712, upload-time = "2026-08-03T22:32:55.547Z" }, + { url = "https://files.pythonhosted.org/packages/53/a0/26b717a9d1840e8abf48dcec64b5ed8fbe472671d38ad28d30e147132b33/hf_xet-1.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5789835d7c6bc9436962853192082374297fb72d7eff7e7762ec25ceb7e25338", size = 4025906, upload-time = "2026-08-03T22:32:57.391Z" }, + { url = "https://files.pythonhosted.org/packages/49/f6/4a9966633c6fef83af997e2cff68ec1963676d412bdfd096df2a93b8e185/hf_xet-1.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:75765820ce4700db3750c94acc8fe27c5fae4c9ec000a0dbac3ca082acf97765", size = 3849221, upload-time = "2026-08-03T22:32:59.123Z" }, + { url = "https://files.pythonhosted.org/packages/a2/50/7afa2c9c787405864fc47a0d1bbc02c62e9101947ed43c1f43899fc7d91d/hf_xet-1.6.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:633dc0cd71d32da58ab8c03ad38e2fac452c15c2b0a2866ebf6ededfe0a5061d", size = 4071729, upload-time = "2026-08-03T22:33:00.721Z" }, + { url = "https://files.pythonhosted.org/packages/4b/69/55b8dcf636142ae660fec1869fcac14c4da2e8412e14d6eee1523be77e9f/hf_xet-1.6.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:f0906082d9932ae0c0057fa194041c22b4e2cdb46b2592ef3b91f020d62a081a", size = 3876287, upload-time = "2026-08-03T22:33:02.251Z" }, + { url = "https://files.pythonhosted.org/packages/67/4e/a28359bf1c1ecf11eba22123168c138698f7cb576ac678f5a2e16cd5da08/hf_xet-1.6.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d62671bb130879cef0ee4c9ebe47a14af6c66ec53e6d84dc15936e5ffdfac82f", size = 4464663, upload-time = "2026-08-03T22:33:03.802Z" }, + { url = "https://files.pythonhosted.org/packages/9a/69/1f0cbc2fb22ae6082d094f743d1b8945a3f36f6089cb95f42b7ee348cda7/hf_xet-1.6.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0e6e21fa3cdfcdcd76748564bf593870a5e013f47d97cf10aed63aa222cff5b7", size = 4262538, upload-time = "2026-08-03T22:33:05.287Z" }, + { url = "https://files.pythonhosted.org/packages/d1/3a/4f4f2301ade26e404462d3336fa11f7958d914cabbabdd6e03c3c5d5658c/hf_xet-1.6.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4fc74352a17015bd0ee90038bc9efe38db894cde45f268b6712b04fce8cd0acb", size = 4460520, upload-time = "2026-08-03T22:33:06.81Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5f/311725e2a905534dfee2dcb5b08414f249147f1f12252bfc2bd24caa075c/hf_xet-1.6.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4f71cba6129110c3374a33f919001ff130488fc23553698e34cc1c2a1198c", size = 4675937, upload-time = "2026-08-03T22:33:08.616Z" }, + { url = "https://files.pythonhosted.org/packages/98/b7/8c59a66d15205024662f1d66968136f13893f96df1ddc5087e2e281fc95f/hf_xet-1.6.0-cp38-abi3-win_amd64.whl", hash = "sha256:fb4fadde1b2b70bf4c0c14a6dccbe7194b1c28947fefd5bbe3fed9d940676c3b", size = 4033128, upload-time = "2026-08-03T22:33:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/73/63/ca511b6f802f28cf3489b280fe77475bcca8de85e81a6299d7916b5b5555/hf_xet-1.6.0-cp38-abi3-win_arm64.whl", hash = "sha256:3dc3e35441ba395006af5aaacc40ef2e603c51ef46c3530b9156185f00935ea3", size = 3859359, upload-time = "2026-08-03T22:33:11.725Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpcore2" +version = "2.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "h11" }, + { name = "truststore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/ad/f4f0e57345f1870f3e8cb624e058d7eca6e5a27d33bcc3311d9b618734cd/httpcore2-2.12.0.tar.gz", hash = "sha256:9293522bba0aa7c4c8e9e3f040c16575bd8868e155a77fa30c7a9085a5eae648", size = 67548, upload-time = "2026-08-18T13:22:08.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/74/d370e55600d9bcfa0d9794b0166126d49291a3d2b20c268fc98c453a4948/httpcore2-2.12.0-py3-none-any.whl", hash = "sha256:7e04258ce01013d7d615e5b910a3b27fac937d7a95038227e79652b4ba3b4ceb", size = 83074, upload-time = "2026-08-18T13:22:05.854Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "httpx2" +version = "2.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio", marker = "sys_platform != 'emscripten'" }, + { name = "httpcore2", marker = "sys_platform != 'emscripten'" }, + { name = "httpx2-jsfetch", marker = "sys_platform == 'emscripten'" }, + { name = "idna" }, + { name = "truststore", marker = "sys_platform != 'emscripten'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7f/f8/579a8b51e42e38ee32647df9f08aa25643ae788e275cc625b199829c4671/httpx2-2.12.0.tar.gz", hash = "sha256:7631fe9887a8a2275f4a2540e053aa670fcc50742864a9ae7c66e609fdcf12cf", size = 100040, upload-time = "2026-08-18T13:22:09.086Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/95/411ba65569158e862368917aaf56597f3e5fa3b91b0502919638465a08f3/httpx2-2.12.0-py3-none-any.whl", hash = "sha256:cc8b6eecb8661c146b8f89a60e97456ee086e91a784ed31ac450c3a9e613dd36", size = 95427, upload-time = "2026-08-18T13:22:06.834Z" }, +] + +[[package]] +name = "httpx2-jsfetch" +version = "1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/0e5636363151a2a1795e0a77617168b9ca438e1748ec05fc9b5687f93d64/httpx2_jsfetch-1.0.tar.gz", hash = "sha256:70a0e3eabfef7cce5ad9c629f7d01ca05e418f586646f4ddf14782e4c1454c60", size = 6872, upload-time = "2026-08-07T00:13:07.492Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/43/832f631d32e4f1211caa2ba368317739fe71f0b8530e4c9d15dc454bac2a/httpx2_jsfetch-1.0-py3-none-any.whl", hash = "sha256:cb916b707601e69a07721aabc8f3f6659be3a6893bc1ff5c6f9e02241df2da32", size = 6382, upload-time = "2026-08-07T00:13:06.567Z" }, +] + +[[package]] +name = "huggingface-hub" +version = "1.29.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "filelock" }, + { name = "fsspec" }, + { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "httpx" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/35/42316e8f6908b6d21bc8df017cc6efba94fb5edbf99b64e28dd142325e20/huggingface_hub-1.29.0.tar.gz", hash = "sha256:6ebb385a581435325cf6d5c5b233d5d4bc91175834d99fd65dae14379b36e9ad", size = 963121, upload-time = "2026-08-27T12:18:37.432Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/a5/47c2ea9b228ccbcba8467e9a64823146e8ebbad29855e591d8f5eedcc9c7/huggingface_hub-1.29.0-py3-none-any.whl", hash = "sha256:b00f7782afc14db4bc6572763810a635bdfbab8623d957bfb553bd18e03852cd", size = 795768, upload-time = "2026-08-27T12:18:35.431Z" }, +] + +[[package]] +name = "idna" +version = "3.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/f7/abb373e5757eaec4b922b92f97ec8d6d7e057cf06778247604fbc4e7c3f3/idna-3.19.tar.gz", hash = "sha256:5e0811a4383b21dc5838069f801c4fb62113b7447663d2530d2bd6e77b49bf15", size = 215237, upload-time = "2026-08-18T05:14:24.27Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/b0/0e52c878c53f245edd3a11020f20979b3f490f245af532c7cae3027754b5/idna-3.19-py3-none-any.whl", hash = "sha256:815e7be7a7806d54abb586dc943addc79e8b2ee16915059658cbeff4b1b43bf4", size = 68550, upload-time = "2026-08-18T05:14:22.343Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "labvoice" +version = "0.0.1" +source = { editable = "." } +dependencies = [ + { name = "aiosqlite" }, + { name = "fastapi" }, + { name = "mcp" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "uvicorn" }, +] + +[package.optional-dependencies] +embeddings = [ + { name = "fastembed" }, +] + +[package.dev-dependencies] +dev = [ + { name = "certifi" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "six" }, + { name = "urllib3" }, +] + +[package.metadata] +requires-dist = [ + { name = "aiosqlite", specifier = ">=0.20" }, + { name = "fastapi", specifier = ">=0.111" }, + { name = "fastembed", marker = "extra == 'embeddings'", specifier = ">=0.3" }, + { name = "mcp", specifier = ">=1.0" }, + { name = "pydantic", specifier = ">=2.7" }, + { name = "pydantic-settings", specifier = ">=2.2" }, + { name = "uvicorn", specifier = ">=0.30" }, +] +provides-extras = ["embeddings"] + +[package.metadata.requires-dev] +dev = [ + { name = "certifi", specifier = ">=2024.0" }, + { name = "pytest", specifier = ">=8.0" }, + { name = "pytest-asyncio", specifier = ">=0.24" }, + { name = "six", specifier = ">=1.16" }, + { name = "urllib3", specifier = ">=2.0" }, +] + +[[package]] +name = "loguru" +version = "0.7.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "win32-setctime", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload-time = "2024-12-06T11:20:56.608Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload-time = "2024-12-06T11:20:54.538Z" }, +] + +[[package]] +name = "mcp" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "httpx2" }, + { name = "jsonschema" }, + { name = "mcp-types" }, + { name = "opentelemetry-api" }, + { name = "pydantic" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "python-multipart" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "sse-starlette" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, + { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d4/6e/21fb8e5d579dbe21d96ea4d5034200d46d8bdf2261053b5bd041f3c2f612/mcp-2.1.1.tar.gz", hash = "sha256:50b7ba1ebbe117008ea7bdd288234043e69c20b403d6851d19661e6d431a75ef", size = 3984589, upload-time = "2026-08-25T16:14:02.376Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/af/8644cc5fa26a59afd2df2e98eeb19e72926887fa4b7441aba4ff661140db/mcp-2.1.1-py3-none-any.whl", hash = "sha256:1c6c31c5d6471c58db76af3af8af67f46d11d01f0a59077d0a308cbdb3d3e915", size = 357912, upload-time = "2026-08-25T16:13:59.024Z" }, +] + +[[package]] +name = "mcp-types" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/dd/1c4417dc0b722c23a1669032d5f044e41170fe5d4773b488a50fcce98c32/mcp_types-2.1.1.tar.gz", hash = "sha256:77dcbe48fba73cca71a673f2646a5f037a017b7a0a07ac89cec1113028890eda", size = 66674, upload-time = "2026-08-25T16:14:03.861Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/d0/242e63c510f4a17381f55b1549a3f94f5687a0595984febd2b6f87a687a0/mcp_types-2.1.1-py3-none-any.whl", hash = "sha256:26f9f7f03f2a5730717a5b98e2ab7eb640ac352d05a00cdc725c311864778295", size = 69656, upload-time = "2026-08-25T16:14:00.667Z" }, +] + +[[package]] +name = "mmh3" +version = "5.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/69/d00269fee7a3102fcc0f04f0a312e41c6b237762bdcad4c19426f18e697c/mmh3-5.3.0.tar.gz", hash = "sha256:95832419b87b882bec9dcd7d041d74887ba7745b3659c14be1ae1db5cfa35cad", size = 33607, upload-time = "2026-08-26T04:58:20.042Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/97/28c3905a7e27e100ef50322798659e0af514eff600aabffbab00e3cd27ad/mmh3-5.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5e7373e6834e4bdf2c24dbb1a0c6dd834bb5a189efb65723ebb58a8f3e76204b", size = 55484, upload-time = "2026-08-26T04:56:12.197Z" }, + { url = "https://files.pythonhosted.org/packages/44/13/629beb4d3e92ffcf1486c81cbb0605d9e6685b2721eb6753946a9d217359/mmh3-5.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:430ed4de594d0084d9b7956b05075a9054d290a3a0d7b370553a9096a4fd429f", size = 40091, upload-time = "2026-08-26T04:56:13.289Z" }, + { url = "https://files.pythonhosted.org/packages/c7/64/0a5832cd45207c507ee83bb7286dfeccf51c438aa8b6217f44f286f354f4/mmh3-5.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bee76669a5b588cd806aa619ea9eb8f0c8a00e6991001d830e07cc69258962a9", size = 39694, upload-time = "2026-08-26T04:56:14.244Z" }, + { url = "https://files.pythonhosted.org/packages/13/ac/e9a157fbeebf44da5e39e49ef3901cbd68651d966658b58303074f349422/mmh3-5.3.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c6fbc4e3017fb99e639abdb58a6a31e14bcbd270562805a0b80a102f8a4f3024", size = 97220, upload-time = "2026-08-26T04:56:15.312Z" }, + { url = "https://files.pythonhosted.org/packages/af/a6/5012e363699c598166fb955f7267975284dd51eadc0383771a1a593d4ac2/mmh3-5.3.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:98db40c6ef8bbeb028e0424736a6bef3b1d8d0a02399236eb00db0dd0b7ca957", size = 103238, upload-time = "2026-08-26T04:56:16.425Z" }, + { url = "https://files.pythonhosted.org/packages/47/53/5710edf5edd969bbc42985577ddc73758a1c90a1613ffc4356087b5e330f/mmh3-5.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fa216ac716e7c99e4dc4b039c6219a31cd381cc0588ca45cf66f36011613f3ed", size = 106138, upload-time = "2026-08-26T04:56:17.54Z" }, + { url = "https://files.pythonhosted.org/packages/c5/dc/e7737d142ecb5847aad04fc92d63bd455587f5dc33ebbfddeb7936f98713/mmh3-5.3.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ef9fe783b932927da8070f5b2913ce412e42c80bf17fd523042325ee3a44f756", size = 112973, upload-time = "2026-08-26T04:56:18.644Z" }, + { url = "https://files.pythonhosted.org/packages/cd/04/34e1242a23e14c78a39dd76ffdf860e76d01c917e4103b9729c27efc22f7/mmh3-5.3.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1d5de36640293374673ec6813b7a23d8a9621bbd87f079c6ec4c5e8585cb1f64", size = 120621, upload-time = "2026-08-26T04:56:19.837Z" }, + { url = "https://files.pythonhosted.org/packages/f3/6b/665f1bd97666095f8a92b4191e22c21038c3e5f6bccad2a09218962e0541/mmh3-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0a6bd95c410ec9500d9515a4fe522e24452f71df38de47395f99aebc085a5d5a", size = 99020, upload-time = "2026-08-26T04:56:21.07Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a8/0ce084753cc8a82f8cbadcb6723f2e17c341b17683eafc49729a55db4930/mmh3-5.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f0c7a36ccb66bfc8fcfa7a9722614b959231e325f0e08862c6ea70a7283a6520", size = 98497, upload-time = "2026-08-26T04:56:22.252Z" }, + { url = "https://files.pythonhosted.org/packages/01/1e/501564ca0687e4138c01c12d5b1bc049511753f5a5db2538ad662bf16d97/mmh3-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:767c6c0cf3f67c3e4e246ae7e1cc9ce7755f174f994aa3111c8357f16a587161", size = 106369, upload-time = "2026-08-26T04:56:23.375Z" }, + { url = "https://files.pythonhosted.org/packages/f7/af/7e072e63c10f81b0d4f2abff29363029144c62006baa1fbe437302d24f05/mmh3-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:408d37be08e12a154b482dcb300781d3dd154abab8e002ab32ecde6aa6a325bc", size = 109882, upload-time = "2026-08-26T04:56:24.495Z" }, + { url = "https://files.pythonhosted.org/packages/a6/89/90e3f0f59eb13b362cb0c091a1ce43b94325fae8c6c20a991dc9ee6bd0b7/mmh3-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2b77b3e6a9d817822407b32c514205b44ceeb8ab197bee09de19e5f1e04ce18", size = 97421, upload-time = "2026-08-26T04:56:25.675Z" }, + { url = "https://files.pythonhosted.org/packages/f4/be/eaa4b95e3fdb2617ec1c1502ab15f5941408c02a3c80a5df63ab4c412abd/mmh3-5.3.0-cp312-cp312-win32.whl", hash = "sha256:d4cc2cb5f117da6460c14c65cbc0d1cf0976af3e56de6cd627cc36019f323e15", size = 40467, upload-time = "2026-08-26T04:56:26.804Z" }, + { url = "https://files.pythonhosted.org/packages/39/86/695592b763d2c0a5739ff50e62be102a1790bd5817a5f7f9ed2ffcbe198f/mmh3-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad5e6b56000d4b1b82a380c664982371939dc8f728fcbb73d017edc035247dcb", size = 41864, upload-time = "2026-08-26T04:56:27.779Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ea/b534107b184454994865f5c1695df2f666672f16636b814da182b3ab0f6f/mmh3-5.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:4b660543eee66d5f07408fc1cdd0d017416f0f5cd1725def314cca3f67b0cac5", size = 39206, upload-time = "2026-08-26T04:56:28.789Z" }, + { url = "https://files.pythonhosted.org/packages/8b/fa/e07f6b9e2fba550fe539b6c66ee7fc28e44f5bd445a7203ae4c169d4aa72/mmh3-5.3.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:6576400e7a748ec5c7ea72f38d626939876dd1756f4a0ccf552b8646dcf6f3e9", size = 41040, upload-time = "2026-08-26T04:56:29.766Z" }, + { url = "https://files.pythonhosted.org/packages/62/9c/cb0f23e71bddcc519331c9787ec029e0d2fef64ed1bc490ad84b00a43950/mmh3-5.3.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:2b4cd2fcf1b517872530d9ef1a2de2ef9b86e5a0f8927539ea0b68337618244e", size = 42153, upload-time = "2026-08-26T04:56:30.954Z" }, + { url = "https://files.pythonhosted.org/packages/27/1c/99f2ff480922046a496c2e53728a13a467b68f01a0f48370577c0825a763/mmh3-5.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:f401a82d80c53d88605b82a80623edd95d922732d2c513c1c5f8e4b5e10c2913", size = 38796, upload-time = "2026-08-26T04:56:32.207Z" }, + { url = "https://files.pythonhosted.org/packages/ad/05/e137452583b33a56d053ad48643a7c56e4cf466efc8a145da6a736913ae3/mmh3-5.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:86238bb78ff65c9fc1e6b371b78f271e23c5d61898222c201122209dc8eadc76", size = 39474, upload-time = "2026-08-26T04:56:33.196Z" }, + { url = "https://files.pythonhosted.org/packages/74/e8/a9031fe6ed0eb06ab1c98eb76182eb01dc484dc46873a8e5ef3097d9bdf4/mmh3-5.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:222ea0a485e23bdcb29e28d15b8b01ebe34e8720bad4b5f92b645ed86e3fc715", size = 39983, upload-time = "2026-08-26T04:56:34.195Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ae/11459b39af5341de2a048998a717f57b3a1c4e6a9edf8fe09e314b2c263c/mmh3-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d95ee6696aa5b7283f4a27b67eb7db1c4fb5bb7a9117205d29ebaaa7f6294d7b", size = 55464, upload-time = "2026-08-26T04:56:35.23Z" }, + { url = "https://files.pythonhosted.org/packages/49/b7/841b580415a614a3ad836db1cb8d57c425bbeb717c80263a9d979b1a4eac/mmh3-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e2f439ffd4fd7d64b77f6a287d4605700bad26fe12bb1b63b4ee45211344e2fc", size = 40084, upload-time = "2026-08-26T04:56:36.44Z" }, + { url = "https://files.pythonhosted.org/packages/02/f6/f5cb0e2f7bb7df876847dab63ee984c3f6173569d5b892edc04bc797c1b7/mmh3-5.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f9cb34c661454f73432112a81ac522ebe69500feeb8d77f744f6bd3e8b2f2ba", size = 39693, upload-time = "2026-08-26T04:56:37.428Z" }, + { url = "https://files.pythonhosted.org/packages/b5/61/9506d0b30d7388846cc3b884ec63b8d67f3ad2d521e61775315111e70ec3/mmh3-5.3.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b6b7397804e9299bd0c01ea426245fa3d730d3e9c31f583f51aa87bed399c481", size = 97247, upload-time = "2026-08-26T04:56:38.439Z" }, + { url = "https://files.pythonhosted.org/packages/da/6f/c6a4acf4715fede1e0acb17d6080ebe9b88290d113bbf9513a8728c65b4d/mmh3-5.3.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4a19b00097fcc8e3008bb006cd6bfaf0544e9fa2abc4cc77fbad57971a37dcc0", size = 103256, upload-time = "2026-08-26T04:56:39.52Z" }, + { url = "https://files.pythonhosted.org/packages/a3/2a/f4fe4ebf2e44f49953ed1ee6b90d329d6843ebb949e60e881dbfde84e17d/mmh3-5.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83d93abf6a68d54b4e2c4c041ffcffeb94b1c9ab3171443fda3f5f19024be517", size = 106172, upload-time = "2026-08-26T04:56:40.67Z" }, + { url = "https://files.pythonhosted.org/packages/1b/61/23168dc6fa92e1d9b57905b89c694a521a00570f0fe325bc3f6422fe6119/mmh3-5.3.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:598350a6adefb5799c800fd00bbeacbc115ee560e2fd7b35f703608c1037a2ed", size = 113020, upload-time = "2026-08-26T04:56:42.035Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f6/68dbb5461727bb14fbca2342a7bba4521400d679d64e00dd98a992eb0be4/mmh3-5.3.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c0772d6bba19a5601d24b3c6ce6627484fd5a3fd1d402913e1578b1447d51a0", size = 120648, upload-time = "2026-08-26T04:56:43.339Z" }, + { url = "https://files.pythonhosted.org/packages/92/18/a879ce4c26e8c1741b575e6c854b2323fd7e116000965c8904428e66fba6/mmh3-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00105934e7d52f80b4364282918c37e2cc3cf9868ef4052016cbc39d8711c3f4", size = 99034, upload-time = "2026-08-26T04:56:44.771Z" }, + { url = "https://files.pythonhosted.org/packages/1b/28/b0548d78133f8e79bb16d6487f2df504ff4e16ea1330954f26be83b645ca/mmh3-5.3.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:99a5b0a908beb01b0e134b7b085d0ea6bfb7ed28ba3ed0737365aa2ce9bda0e4", size = 98587, upload-time = "2026-08-26T04:56:46.089Z" }, + { url = "https://files.pythonhosted.org/packages/97/10/abfa952c6a443d07efb286b53b439d4418f7cfbac49fca8974cd78c17427/mmh3-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:da4ad7a0d4c589069c46101dcb55ee304616293bcf614f4c445b3ecc961fa836", size = 106407, upload-time = "2026-08-26T04:56:47.16Z" }, + { url = "https://files.pythonhosted.org/packages/a6/61/3b974a1cfe683c6cb01d2d3f2d5eddfca7e0a175d976d2307269143f4e0e/mmh3-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:8962a67c314f1da82957aee5b940698aaffff13e41b3298baa59d30cbddb23e2", size = 109922, upload-time = "2026-08-26T04:56:48.451Z" }, + { url = "https://files.pythonhosted.org/packages/0e/d2/ac7e18d6fcee3b26e06b3d33ecab4459b7aa6aff9859b13eb13e353a69ab/mmh3-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f61f2850b318c043961662f6cdd08e69b05f1d25d0e321782a3995d39f811548", size = 97456, upload-time = "2026-08-26T04:56:49.559Z" }, + { url = "https://files.pythonhosted.org/packages/ee/80/7911629b930d46ef8cb3165bce44f021d31361a2d7c56e35efe7b0d90493/mmh3-5.3.0-cp313-cp313-win32.whl", hash = "sha256:d7eec1b09bde3a9b6e2102717a587b9c9a96c360a1ef478b5668414619cac606", size = 40458, upload-time = "2026-08-26T04:56:50.785Z" }, + { url = "https://files.pythonhosted.org/packages/45/c7/138d77c740f9d33ceffa968786fe23abe24ce442c210772b5b7cb6e0c198/mmh3-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:b1829bfe98d1f6e7bd79646b78e73dcef92c5aa32aaa622b9e07bf39df98c9b5", size = 41879, upload-time = "2026-08-26T04:56:51.785Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e1/4312e5c18c8ef4060c9b50f1a645c9af7c3b79fad012c18fbe64a1b17103/mmh3-5.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:3fb0d4918b7d827ac804069849fde03d516628cbbf7bffe0b957ba6f1440cca6", size = 39203, upload-time = "2026-08-26T04:56:52.746Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5d/838c2260e490baa075d86900ea5179cc99a3f85b6b4377b0d3671ebc3c7e/mmh3-5.3.0-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:60d00bbddaec09e8d3259a0d8805e16b96b2709f14d9c486e29568ffe6f55993", size = 41038, upload-time = "2026-08-26T04:56:53.798Z" }, + { url = "https://files.pythonhosted.org/packages/88/83/a2ff105cd6bc7f18c19c9e5e288fa741821788834d5ddd637b5f33d879ee/mmh3-5.3.0-cp314-cp314-android_24_x86_64.whl", hash = "sha256:811f0ef99cc178becef108563505b9e5aa69a406028136874edf6513d3568f8b", size = 42168, upload-time = "2026-08-26T04:56:54.871Z" }, + { url = "https://files.pythonhosted.org/packages/d6/d9/c61e52eddb1e02a25367ef1121a14b69696f17067e3395411e0a86d69ce5/mmh3-5.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9a1841be8752f46cbf58a4825f3789ea66ed9c1190be5d81327509cf757b6f5a", size = 38810, upload-time = "2026-08-26T04:56:55.878Z" }, + { url = "https://files.pythonhosted.org/packages/7f/e3/2a1bfa294ef9df2f48d298e26d1bb05b44ae5ccfab3531a66fcf16eee361/mmh3-5.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:24eb191910181f4f41ffa2f323d63ebe725ddb0ac461baaa2274658cbe6b4c7e", size = 39489, upload-time = "2026-08-26T04:56:56.978Z" }, + { url = "https://files.pythonhosted.org/packages/60/b8/5dc5a1c593655b8ded88a88c27532d59ba7c94dac1c51665dddf6457cfca/mmh3-5.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a404419c65611d015eb03b204d3558635d97fcef149d0e8ed0ef818f7262f76b", size = 39999, upload-time = "2026-08-26T04:56:58.137Z" }, + { url = "https://files.pythonhosted.org/packages/f6/ed/cf1a8e5d5d2a74918891cd790e22779d11e3ceb0bcabacfac7d47be2ccc3/mmh3-5.3.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:b77364386164808efb1d7ea1305b14bb04fc6907aab242df3f6c04f5f0c1b371", size = 55493, upload-time = "2026-08-26T04:56:59.335Z" }, + { url = "https://files.pythonhosted.org/packages/6e/5c/4da4d6af3f10635f6042ccfb5cc54ac90a53da9a14fdf1f9168892109b49/mmh3-5.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e0c195d2a2cf60c5f32928415d44d430129899b4c215d710f93179a056cf560b", size = 40158, upload-time = "2026-08-26T04:57:00.475Z" }, + { url = "https://files.pythonhosted.org/packages/d8/bf/e4be8e728d94387c673510b11120d003f929858169017ab87b852ab5ac6e/mmh3-5.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bc6018e95814fd64ea8357c6e9e5608b97b1f33962c76cff60efd52f76b18a40", size = 39699, upload-time = "2026-08-26T04:57:01.561Z" }, + { url = "https://files.pythonhosted.org/packages/34/64/cbf9923093f18f16a655ed5405f8992498c542321b0cbfe92c650c778dce/mmh3-5.3.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:302e5b527b36a875abb611911142e92abac7580faec51318440149ab13b8e936", size = 97245, upload-time = "2026-08-26T04:57:02.641Z" }, + { url = "https://files.pythonhosted.org/packages/cb/74/71b8f3d20b201511cbf3a3d52f7aebf5b62f8a60d8ac1a258f093e447e09/mmh3-5.3.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0a301b316198758aabbfa3ee565e221b757645d9f94b8a9d2889bfefabbb77dd", size = 103246, upload-time = "2026-08-26T04:57:03.826Z" }, + { url = "https://files.pythonhosted.org/packages/81/87/95bb64aa64057349257c487a87c7590ca205d61cacd4248875c8ad5f0530/mmh3-5.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a78928eb29e96e8386eebc6c4271648e3918502a24296da7020607d74d33e622", size = 106195, upload-time = "2026-08-26T04:57:05.019Z" }, + { url = "https://files.pythonhosted.org/packages/78/36/4d87428276987949476258c116a092e2110b1cd33268236282c2a71be074/mmh3-5.3.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e7adbd0f38ead7310e1e7428f254d450857645efc761c937a7d71100cce7a3a4", size = 113066, upload-time = "2026-08-26T04:57:06.365Z" }, + { url = "https://files.pythonhosted.org/packages/dc/e2/d2edf34aff2af42afa6abcadb158096dd015234065811323208b63508c03/mmh3-5.3.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:422defa81ff5c114213033cb1ce45f3904427ec9dbfa0442a0f4656191f75f5b", size = 120634, upload-time = "2026-08-26T04:57:07.52Z" }, + { url = "https://files.pythonhosted.org/packages/13/53/904a9e87364a0b472ebc3662a6c2e705b8051a726058cb7776a6c2a0966f/mmh3-5.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:76601efc7bfe44014d7bf7d6ba9c75bbb0b426c93ce0f9216cd9ec5d384c224b", size = 99075, upload-time = "2026-08-26T04:57:08.7Z" }, + { url = "https://files.pythonhosted.org/packages/51/4c/4ee963b65c9581f429d39b1242d2579c4f74648c848c364634bb24e9a7ec/mmh3-5.3.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a5ada8e81fecfca0d934520be81117e5fdccbce7ae43612ae8aeb6c40dfd69ff", size = 98598, upload-time = "2026-08-26T04:57:09.885Z" }, + { url = "https://files.pythonhosted.org/packages/79/0a/0077b5ddb6e13c6cda29eb1b31c5cd12d3456cb625e9161e5f35cb0ed787/mmh3-5.3.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b93c17989d23a08104acc7e1912250b2eec4d24da9983d3c5f8ca9cda8d62a02", size = 106429, upload-time = "2026-08-26T04:57:11.163Z" }, + { url = "https://files.pythonhosted.org/packages/e7/86/f07f14f4dd7c5738d0008e7311b47bb84c3a8ab55c753ba1dadc93a959c5/mmh3-5.3.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:762a03f0726850677f7f1e34a105d9121b4e11a0c20c28c56fc4b33a809c0e64", size = 109903, upload-time = "2026-08-26T04:57:12.371Z" }, + { url = "https://files.pythonhosted.org/packages/cd/7f/356303be62b1053f57a506ac33b2f536a8665dc14a69c6a8468e9f5fb6d0/mmh3-5.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6f60209149e1011b4a3f3119ad2404b06507fe077755bdfcd4ea0090f64cb399", size = 97448, upload-time = "2026-08-26T04:57:13.552Z" }, + { url = "https://files.pythonhosted.org/packages/f2/57/c131c0c246714bd6483c52360fd4bbcea86ec007b1e653de3dbdf5bebb79/mmh3-5.3.0-cp314-cp314-win32.whl", hash = "sha256:1b51409765cbec88396b7a47d87220f9a34112c74a8d0db3ca2551941f023c74", size = 41008, upload-time = "2026-08-26T04:57:14.626Z" }, + { url = "https://files.pythonhosted.org/packages/c7/f3/571defe22c618c25ba6724c7029fd2ee9977936910aef4f46398f5ec2bb6/mmh3-5.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:2585bef3623efaceb1cf4734c27bbba81b9bcb4ea5b8bf53823ca75b388933c9", size = 42437, upload-time = "2026-08-26T04:57:15.637Z" }, + { url = "https://files.pythonhosted.org/packages/34/ac/974345d0709558e4bd2f8d16c46fe480058d1ac4109e90cd5f2a2525bdb4/mmh3-5.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:c1fe81cd71d35fd2770dc206a4bd818bd73b515810314e1573b9db8c9a0284db", size = 39723, upload-time = "2026-08-26T04:57:16.625Z" }, + { url = "https://files.pythonhosted.org/packages/1a/fd/70b15f5f0038c8fe2cd2a30ca83404e1282af7643ba400214deff3a19498/mmh3-5.3.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:397b26f58cb062233abe36b6cdcb99f08204f529d2384e0f3ed07901dca6a2c0", size = 57172, upload-time = "2026-08-26T04:57:17.841Z" }, + { url = "https://files.pythonhosted.org/packages/dd/8f/cf76d541a79d95254888834d0e848bab14b4f98a44e18942c26ce75bbc83/mmh3-5.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:fe9b3b53b0688e9e5d7358e934e87c2da5ed34d997d0ef1ec403024ea760215b", size = 40953, upload-time = "2026-08-26T04:57:18.938Z" }, + { url = "https://files.pythonhosted.org/packages/fd/74/39ca2c868a1f921db0962067e8fd8f5c31a3a4b2d0ea6bb279e8e0948cd8/mmh3-5.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:045b44b299a658f02dfb43db4037437c66290f6d00984992030648b8ffc230d0", size = 40473, upload-time = "2026-08-26T04:57:19.969Z" }, + { url = "https://files.pythonhosted.org/packages/26/0b/4427f0134223b4061146bd6131db2c3b882fcaa08068e0f0d8c1f944a3f7/mmh3-5.3.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:060888503ab547f4700e93d13f45ee0d7633f5196028529c1e98c27d5b31520d", size = 109601, upload-time = "2026-08-26T04:57:20.967Z" }, + { url = "https://files.pythonhosted.org/packages/74/f9/6ab1a4d663f0c2fea4e7aeb0bfd6be70897981cf4a71f8339b2510d89ea6/mmh3-5.3.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:816db9f5ca3da2ecc9c74481c5b0474cc4368cb94e77f40bff8493abeeac81f0", size = 117370, upload-time = "2026-08-26T04:57:22.161Z" }, + { url = "https://files.pythonhosted.org/packages/cb/ee/b559b1155998448b641ff73d03e1f1141f6390f63ace9df4e42a12120cb9/mmh3-5.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27706a3a4700d34718bd1eaf89719a13bbaa269606048dd00173997562c19c92", size = 120366, upload-time = "2026-08-26T04:57:23.362Z" }, + { url = "https://files.pythonhosted.org/packages/84/7e/79821c37f93fe15ca6710764c651276c6de63e376004dad7b63bc1ddbf2f/mmh3-5.3.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2d028a0e523d0c3e478544fc8350c024a0e0d73b549dd6013af4119a87589de2", size = 125940, upload-time = "2026-08-26T04:57:24.638Z" }, + { url = "https://files.pythonhosted.org/packages/77/3d/a109fc9bf5263d14989d7aaa4a51e4f21ef3563b9413ad9c05041c4d8403/mmh3-5.3.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:10508e24e01f6b52c91577e22c4466d703c2c696d34fac1a9048e0da837a1a1c", size = 135162, upload-time = "2026-08-26T04:57:25.817Z" }, + { url = "https://files.pythonhosted.org/packages/f9/fe/fa430565444bbc68fef9fea7944ee976265bd0b39ac698cf170e266766e7/mmh3-5.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:23bafb94a90f3ce2044b8a7a36c6c98ac6830ac8df1b3c0b65faa27a1bcbc49e", size = 109984, upload-time = "2026-08-26T04:57:26.982Z" }, + { url = "https://files.pythonhosted.org/packages/d4/6f/a9810ece96d857dc05bda61341e48cbf65bca9c8b24b368724e0e150d2d4/mmh3-5.3.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:2bc13752e7d80c7ea09d09368b78fca0d52f461c5c16abee5e4f78218f3d346a", size = 111111, upload-time = "2026-08-26T04:57:28.164Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e7/c17260aba7a7f111d211e382dfaa14891691ab171e0172f7d251498fd60b/mmh3-5.3.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e87e2c89016a83a6d7b8ff4e688ee6da843c5bf46bd1dcbdd36b181639575350", size = 116837, upload-time = "2026-08-26T04:57:29.336Z" }, + { url = "https://files.pythonhosted.org/packages/91/98/bb8f8ded55483672343d6b087e0fc74cd76bc9d1dc1c18c32aa468efd096/mmh3-5.3.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:93203131f4da1824dec6ffad11ff8afa03f0690f0075efa901ad7517a261a359", size = 122993, upload-time = "2026-08-26T04:57:30.542Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a7/e45b0a053c79c1567f64989d4f3bb6f44510d2da7c6a38b8f82eee94162b/mmh3-5.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d1cda1816c79bf9f7b0f7ced1b48bda64c8157a8532e1318727b4157062a5a67", size = 110150, upload-time = "2026-08-26T04:57:31.745Z" }, + { url = "https://files.pythonhosted.org/packages/16/0e/bacbff120a5218cbf33cbfb562d1435e10ff43bf20345d1125f4086ef842/mmh3-5.3.0-cp314-cp314t-win32.whl", hash = "sha256:a0eee1c2cafed49facb1fd300f684401ba5bd557d6d7dfa9bd0c13c5b0904f0c", size = 41461, upload-time = "2026-08-26T04:57:32.92Z" }, + { url = "https://files.pythonhosted.org/packages/1b/c8/263a2f5af994a2c661fde9483b0e98e737b04831895bfdefc85fd81ed65d/mmh3-5.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:55347832dc6d49731283717087551839fa46a7997929403c96599b1bc93124f1", size = 43405, upload-time = "2026-08-26T04:57:33.983Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8b/221f238eb4259f42d72d154ce4c4383c65bdedd7d8823ed9e7a564978a76/mmh3-5.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:50958a182c7e189fa1408d9a28d9a37afbb3d72107cf8c6fb69b07b13506c246", size = 40286, upload-time = "2026-08-26T04:57:35.101Z" }, + { url = "https://files.pythonhosted.org/packages/7a/2e/7c57e51d1276594e2c790707d2d36cd497fd96127eb6fc311274cb8c887f/mmh3-5.3.0-cp315-cp315-android_24_arm64_v8a.whl", hash = "sha256:88a79efc9949837126358be48d3a73628b615d0f9e4a81b2f819cf324b6fedd2", size = 41041, upload-time = "2026-08-26T04:57:36.309Z" }, + { url = "https://files.pythonhosted.org/packages/60/9c/e31280eba39ffcea51e1b895acfe743f5acb5a59162cfac6009360900068/mmh3-5.3.0-cp315-cp315-android_24_x86_64.whl", hash = "sha256:0e23bb59643dd36cfc1b5b6f32ca494dcb798f46281f2fa4561d34e7de777a24", size = 42168, upload-time = "2026-08-26T04:57:37.433Z" }, + { url = "https://files.pythonhosted.org/packages/43/62/228fbfe338dfb3fd410fba5f07765cd0180792d4be62581b717dc6160d11/mmh3-5.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:e5133cc123cbbb69b585bb0b0166bf03c035787892a8b365238dd060ce02f8b1", size = 38834, upload-time = "2026-08-26T04:57:38.573Z" }, + { url = "https://files.pythonhosted.org/packages/d7/6c/bba95309795fc92947b5e2ba86b1bff97ffcd8fc56d59c40073a33cc1259/mmh3-5.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:0619b41fc524c0e1bda7b29e47a9cdb4746be3ebd9413798f82c024894283d47", size = 39543, upload-time = "2026-08-26T04:57:39.597Z" }, + { url = "https://files.pythonhosted.org/packages/3b/3d/bb4b474e5387bc4654cf945734edbdaaf9184dff507df09b624b9389208c/mmh3-5.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:c1fc62fc688e884fb6300a536297a09c089c43f9eb8228790bafa66c28e28900", size = 39997, upload-time = "2026-08-26T04:57:40.637Z" }, + { url = "https://files.pythonhosted.org/packages/8f/ba/88da42a2c9b0d3c7ce030c4c2895cdb01ed64df52c811e08e7358c16eb84/mmh3-5.3.0-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9438a4436d33b4c71b57f20cb982f791703c868f8c497c998ec33de3b9c4ce0b", size = 55547, upload-time = "2026-08-26T04:57:41.693Z" }, + { url = "https://files.pythonhosted.org/packages/2a/96/f4c4c46ef01757e10f4b89886bc49f0fdec904ecc2da9b3844fd5a331d7b/mmh3-5.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:453571409c955837178bedab51d5514aeda9ee4854dcde9e9134765f22da4380", size = 40156, upload-time = "2026-08-26T04:57:42.942Z" }, + { url = "https://files.pythonhosted.org/packages/2a/01/98f2f2ab0ab87eb608841ab277f94a75772661a2b20ce3a9c1bea38f809b/mmh3-5.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:d54b2f5dcd78b99893d0f6f265749886ae4d316fc54ab352444e581972555210", size = 39757, upload-time = "2026-08-26T04:57:43.973Z" }, + { url = "https://files.pythonhosted.org/packages/af/0b/e7db2ea82300479c32e30c26082b88eda5744a49d41d8aa5a0fb60d6b206/mmh3-5.3.0-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c541249b3b9b5a023a9b6c9cc29e16777926e513c97fad3e2c44956e30d5fc7d", size = 98594, upload-time = "2026-08-26T04:57:45.029Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c9/046535bc0362a83b28630f68e4dbfdb2a5b5e56a6463b226a023a96ad593/mmh3-5.3.0-cp315-cp315-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1232c5667aaa2f1f77096d94dc0019ceb7ace106e9066b66d28773c4226364b0", size = 104104, upload-time = "2026-08-26T04:57:46.34Z" }, + { url = "https://files.pythonhosted.org/packages/e3/72/84dc86824533d3302dc497c8f2c7bfa5e0bcdbf340f378a3c63d05155096/mmh3-5.3.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28de4e0a140f86bea109a6d91de9f1e9a94c9d88e6ec9d4d3c78924e4f8c0a42", size = 106562, upload-time = "2026-08-26T04:57:47.503Z" }, + { url = "https://files.pythonhosted.org/packages/88/a3/085c3e201b23430974dfee96df108daecb7142745deffec71e569dfad0bf/mmh3-5.3.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d1a9424ee53ac4600568f02683254237a3400af2f683060e7217f744d0833885", size = 113269, upload-time = "2026-08-26T04:57:48.613Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/5427b7b5c8ab602a1845550d02da15acece374fe71da602e3b0f37d171b8/mmh3-5.3.0-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:90ac257fd93bcd915672262b5f93f606400c1cc29e869bb2ff806038e7234a94", size = 121343, upload-time = "2026-08-26T04:57:49.866Z" }, + { url = "https://files.pythonhosted.org/packages/ba/76/59c41858157a8138e3e0f8a95cb014bbf8105598e3ebc7b53a2254561844/mmh3-5.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:9063635665d5e62601d1f089526155ad2aba3c85e2050e439c774919447155aa", size = 99563, upload-time = "2026-08-26T04:57:51.069Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b0/411e361db86ded7b9db1db994cd9bd8fc1c50911a6d7a959c1e101214ed2/mmh3-5.3.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:def4d23969c4e944a9b01ad3187893edda1cf185d5913224420a72d1959245ff", size = 99563, upload-time = "2026-08-26T04:57:52.282Z" }, + { url = "https://files.pythonhosted.org/packages/e2/16/1f8a1d767c741653100496f2e62866cc857ee14a147628538b83b9cb223d/mmh3-5.3.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:48ae6e629a63cdadc29264a66edbaac9f18dd77feed973880c65393820867426", size = 106573, upload-time = "2026-08-26T04:57:53.514Z" }, + { url = "https://files.pythonhosted.org/packages/41/ae/ea3879a4da99713b278639d9e55176e45a67464df7809c41d5a0bed9ada1/mmh3-5.3.0-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:4785dec2f768b74c0735c9f0441b2392111a1467c463cae737bad30ac976b524", size = 110225, upload-time = "2026-08-26T04:57:54.707Z" }, + { url = "https://files.pythonhosted.org/packages/30/73/1bc3907f97cf636316414e56b929d990c0754baffd607b560d0d52e71fdf/mmh3-5.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:61104a5fc2923d5670f30e3ecbcb12ed70f49a17dfd757b32bc965eb90b53988", size = 98196, upload-time = "2026-08-26T04:57:55.91Z" }, + { url = "https://files.pythonhosted.org/packages/48/7a/726967f0adb26918095a0162f55a65ffdb10e7fa4909d251b9b725f7d361/mmh3-5.3.0-cp315-cp315-win32.whl", hash = "sha256:a4fa195374868fc65fe0ddefacf080c191f7405b36c8ee4ff7ce6c749b52dff9", size = 41010, upload-time = "2026-08-26T04:57:57.145Z" }, + { url = "https://files.pythonhosted.org/packages/6f/f7/efd515b3b5665ecc5cf5113cc5c012dc8028404ace5865ab774af22f5d7a/mmh3-5.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:8d58d74be01b0eb74a14cfe768495c57f3a7a7c573a9db3c984b5f2c759a0fe5", size = 42427, upload-time = "2026-08-26T04:57:58.258Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f0/995893261597dbf57446862928c94b7bf3ab44f409b166d2d1404b226f06/mmh3-5.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:ae30d67c5f41be6c70d28557c0a3285787dccbde46a3c84a97d01996cbf43e7c", size = 39729, upload-time = "2026-08-26T04:57:59.341Z" }, + { url = "https://files.pythonhosted.org/packages/1e/61/a77fbc2aeb88c15300f3b179b9afb0c3f6395997371232929eb750b6103a/mmh3-5.3.0-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:db98041fc5d22f1cf66b38a361cf07a15321c0f2956b6134b007733de8befe2a", size = 57216, upload-time = "2026-08-26T04:58:00.474Z" }, + { url = "https://files.pythonhosted.org/packages/15/a2/07458f4eb072d684528e2e0aee011edb473842c26cd1d69cb09c197406e9/mmh3-5.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:70cd0d092d872b17cf1cd66c394a0537c291c97a539bd884fd0c2bdbf989cccb", size = 40961, upload-time = "2026-08-26T04:58:01.582Z" }, + { url = "https://files.pythonhosted.org/packages/f7/84/cf430e12828032c459994c09ce8a9f0da6069a02b76359ab229266a41a8c/mmh3-5.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:22cf74b87b11fbe732ce6e23699d59b53208114232515975ce486d1e6b5248f8", size = 40506, upload-time = "2026-08-26T04:58:02.641Z" }, + { url = "https://files.pythonhosted.org/packages/ab/c5/00a0589cad767d51b8f431cbcd3295e385bfe4d6b1fea844dd8e8dae612f/mmh3-5.3.0-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6ff08246d6c6dcdd6306a7d806eb75867cea6238eeb88778fc9c577d8e9fe2d9", size = 108294, upload-time = "2026-08-26T04:58:03.722Z" }, + { url = "https://files.pythonhosted.org/packages/c4/9f/730e34be444a2924cf3bfa4ac4b015b656eead79e735683efecce5a69c34/mmh3-5.3.0-cp315-cp315t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:44ca9d01e9761208de5ab845ce86096d3e730b35acc0f90cedaf58d3dfa4e325", size = 114249, upload-time = "2026-08-26T04:58:04.939Z" }, + { url = "https://files.pythonhosted.org/packages/fa/d3/771008dfe72651a95e0b91c141f5938ae346585a3d26296d51d58c7c038c/mmh3-5.3.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2c36e6d747dcf42f5afc49b107c65c7e2be5dd8e80209244bc50c6bf2bfb81c", size = 117182, upload-time = "2026-08-26T04:58:06.164Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ac/95b7c8b851fb97a6974ea955f3dbe30bf7e3692ba982043f8011b0e39ffd/mmh3-5.3.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:002414b951d980072a90dc25e84fe41570e399503c9db46a45edf61c7f0bd3bf", size = 122413, upload-time = "2026-08-26T04:58:07.689Z" }, + { url = "https://files.pythonhosted.org/packages/79/af/99ddc49b1993da421fd25cec9f46f558a624cc9f2e76695d999a03231197/mmh3-5.3.0-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bfc16e0bca99ecc91d4c9fdc708c432fac2eba3797e78577f4d280031456f37", size = 130998, upload-time = "2026-08-26T04:58:08.981Z" }, + { url = "https://files.pythonhosted.org/packages/14/15/b9c7f0f6d6453a75eee6b455ee87f8839381bfdfba5ae43a2110911693e9/mmh3-5.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:166e3c09c56e980bfef1ee4fe4eded81d544615359eb92fb7ccda8c96f5d9538", size = 107781, upload-time = "2026-08-26T04:58:10.301Z" }, + { url = "https://files.pythonhosted.org/packages/89/b0/cd2a527717e3171ef9bb50f5391bc0fb8c5c9a5df90293132bd56a8783e9/mmh3-5.3.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:844f16c472352afa499d3a2ff0316cc812204bda42540af4768ac80a98b56277", size = 108860, upload-time = "2026-08-26T04:58:11.527Z" }, + { url = "https://files.pythonhosted.org/packages/74/8c/09e6e3e74386a73d533903f6e99e0fde75077af3dace436d460ae0e653f3/mmh3-5.3.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:1e2cc33121171b1e4657146bfdaf77eb135787465f298d9f5ed04c14771c35d2", size = 114303, upload-time = "2026-08-26T04:58:12.795Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b0/d0996aa44f675f3dee627c2f90bf1c071f2424c203c5cfbe4270632bacfb/mmh3-5.3.0-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:af550cb399a702b1f277c375461fcd9533f46b435bba1e7847b4b729c6a316aa", size = 119889, upload-time = "2026-08-26T04:58:14.044Z" }, + { url = "https://files.pythonhosted.org/packages/29/9c/9cfe3e09689cbe4e381e09560be44824a143583938392bc3e48b35478dd0/mmh3-5.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:ecd0172b50350cae19e8dbb07789e11234099de8ea44db0a981467a98c165170", size = 107518, upload-time = "2026-08-26T04:58:15.364Z" }, + { url = "https://files.pythonhosted.org/packages/f5/be/57df5ff90b968bcce8d173df2a69f668702d0940f0d66696f259f904a373/mmh3-5.3.0-cp315-cp315t-win32.whl", hash = "sha256:9e03132ea81849b5732122d3d2f39e46a327a461eb3d678f1e74747c9b7ef154", size = 41667, upload-time = "2026-08-26T04:58:16.579Z" }, + { url = "https://files.pythonhosted.org/packages/03/73/5f5d7a5c0bad6ae5568e3232d8b7bcee9639da0de45f8e664342f22bf682/mmh3-5.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:1617be1ce93f97513bbf23cafa28a6ab1d20b0928de760054a4c603a89bdab7c", size = 43152, upload-time = "2026-08-26T04:58:17.706Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0a/033fef3d7a486aa369ec11cdf0455bbae6640df13491f6e7d35fd90aa000/mmh3-5.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:a8389010a2721e568fbe40ba94e7d8f931beabd59b95af2b2ab8238fd40a6b3e", size = 40275, upload-time = "2026-08-26T04:58:18.883Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/80/db0b4559e57ec36362bedbb05530a87fafbcb6067708c946967a41d449e7/numpy-2.5.2.tar.gz", hash = "sha256:d482d171c406ae88c5b19cad3b6a1c4c5209f886ab74bc44c2c865c23f52d860", size = 20773161, upload-time = "2026-08-09T13:48:27.962Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/72/dccb0aaf40972777283303919f613964227266d0c13adebb79ac124f1c3e/numpy-2.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:14e373cfc6387177e8409dac3c7159be8eb05cd77096cd7c950268b86f62831c", size = 16891693, upload-time = "2026-08-09T13:44:51.702Z" }, + { url = "https://files.pythonhosted.org/packages/60/2e/b5aee50a1f74ac815cf8331812cb8251e29024025de462e0c047641c614c/numpy-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4bbd96c833ecc8cc069ce518078fc8c60cb9cbfb0fea5b7a803ad65035596d03", size = 11903109, upload-time = "2026-08-09T13:44:55.501Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f4/29e78102a80601cf034d4e9767022cffeca2c3b4c926e1754572ca95593d/numpy-2.5.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:6e8172ddfcf5cf74b811d372b570b83c60bd2de87a6fbfbebdadb4a9bd9c6cbb", size = 5350202, upload-time = "2026-08-09T13:44:58.401Z" }, + { url = "https://files.pythonhosted.org/packages/11/4b/dcd3b7eadaf4035d2c7a4289d232523a6964f602598ef7674e4bd7291f93/numpy-2.5.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f188481f1669e26f62b701e8205d19e460fa4a9b52a1414ba382330e4a3414", size = 6687736, upload-time = "2026-08-09T13:45:00.813Z" }, + { url = "https://files.pythonhosted.org/packages/e5/21/4947e0e9d6c9fc2e2ff15b8949049ee44f63adb9cacc729ab8793f97e712/numpy-2.5.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ee9c4eeb8454b3660a8b53493563c3e121c2fc94fbd72b848ef814ed7b676a9", size = 15612696, upload-time = "2026-08-09T13:45:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5f/62d28cf019460c7f1394105b4d49d9911a9c444cb77ab0bd95a204c5a6de/numpy-2.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3cdec01fa790a186d430433fdd4d4ffb70eed6f0eeb4bf05c8dbe2dce0a9bcb8", size = 16722264, upload-time = "2026-08-09T13:45:07.714Z" }, + { url = "https://files.pythonhosted.org/packages/14/25/3f0be4c1b9fdf5dd5e708a6806978564d7c46a055c000496309ff2a2f8af/numpy-2.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7999d4ddb0c4025018373fd787510d46e04c769467af22869707b3c1cfd459ab", size = 16974396, upload-time = "2026-08-09T13:45:11.316Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/6262cbdeeb45da9d971e40715f579d791603ba8ec0b5e2db1ac55454421d/numpy-2.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1f017dc0875c9209d219f97feceb7d54c2661bb243deb4114478e1295808af7", size = 18476044, upload-time = "2026-08-09T13:45:14.869Z" }, + { url = "https://files.pythonhosted.org/packages/36/33/29208b8b075bde62d26a81d14b358c42b0f69b6cabd98d4ff97f37f22b05/numpy-2.5.2-cp312-cp312-win32.whl", hash = "sha256:d6a48072864e3324e194a8fbb3c657bcc5b5c869dbc64c9537b1d5c862572c0a", size = 6072817, upload-time = "2026-08-09T13:45:17.867Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/87fea2769fe1c47c1b5b01d8310772c9d1a85d485de7cf386ef7a3332b02/numpy-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:28ac63476ec7651484215ee7fa15a1f78b57c14621f01e392afe17b9a1390ce4", size = 12464674, upload-time = "2026-08-09T13:45:20.734Z" }, + { url = "https://files.pythonhosted.org/packages/14/52/032b97e00461ab0809bbe4c588b035620e5a14b8cdee47ecddefc7b17d33/numpy-2.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:27650bb0e7140fa3d37b9923b4803645e0b125d190f326eecfd3f4dad8e8ade1", size = 10397131, upload-time = "2026-08-09T13:45:23.73Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/6b24738a0ef4557d189b150046cd07823c50e4273e8aebd651222e24306f/numpy-2.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8e4cb9a754c8a0c62eaa88273a5fba3391f4a610d1dee893c0755da31c083f15", size = 16886595, upload-time = "2026-08-09T13:45:27.323Z" }, + { url = "https://files.pythonhosted.org/packages/65/60/f2d208d366f263f39c6e69ed309290717aab41078b6d04c9be2a84fa2a07/numpy-2.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:52c808f96484f5571a5cc863775ce50247c17dfb3b0361f8ed6b4b0456f80080", size = 11896845, upload-time = "2026-08-09T13:45:31.638Z" }, + { url = "https://files.pythonhosted.org/packages/3c/79/81e0bf24f4d020a2b1d5cd297a9f60c3f24eeb116f9bba5870443f7b6a4a/numpy-2.5.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:29d81e97f668489cba8ebfd796b9bdd453525d35dd9e162e2daec94bf3fc7740", size = 5343880, upload-time = "2026-08-09T13:45:34.373Z" }, + { url = "https://files.pythonhosted.org/packages/ba/cc/e3141cf06d1a8a2c7e107543fe1269c1d1af760d4d683c0794a4ee1127c2/numpy-2.5.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afb3f0632d6b2e3ba04dbce8d1e48d321b369138b73830b5ca371a0e8d479d56", size = 6682264, upload-time = "2026-08-09T13:45:36.7Z" }, + { url = "https://files.pythonhosted.org/packages/29/f1/2a64a307d92c5d98f5255a4014eb43bb6103ee477087b61ecae44a3aa9b9/numpy-2.5.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0aadf13b60048d501e05fa699efaf7734e2494f3498a4c2a5521d822640324f3", size = 15609566, upload-time = "2026-08-09T13:45:39.518Z" }, + { url = "https://files.pythonhosted.org/packages/7b/44/59a1eb68e773c4098d107ef34a0dbdeca501d72ffcfbff9a7707343921ce/numpy-2.5.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29b86ff8a6cc556b47ec6b64b194815cc80e6bf5eedcc6cddfd65318cb0b4eee", size = 16709995, upload-time = "2026-08-09T13:45:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/8a/4c/3e54d4ddbc359a1295f8b633e8106bcd4d7d4a206e82df051bdfb3058755/numpy-2.5.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6950c4b7dd562453090548ba7f5da7e59f57f85663f15d5dcc60e249192f7e59", size = 16972511, upload-time = "2026-08-09T13:45:47.094Z" }, + { url = "https://files.pythonhosted.org/packages/f2/9f/02e371638ebf19b66d46231e4be52999e87f32d1961b113bc45656608b22/numpy-2.5.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9727f472d2f3888053b8a75ab0cb94745a9de224bb5846dbadc0092101bc71d", size = 18465609, upload-time = "2026-08-09T13:45:50.808Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ae/ad6645abc7a3510fe48e8ea1ab4598166f500057ef4ebf38bfad4f1577de/numpy-2.5.2-cp313-cp313-win32.whl", hash = "sha256:4f9744f9fbdcea0bc552e8f19e1f141f811a3f9bc2be2cc6e86d982cab23e3f4", size = 6070204, upload-time = "2026-08-09T13:45:54.111Z" }, + { url = "https://files.pythonhosted.org/packages/15/20/f3489f86d81ea460b2bcdceaed094142ca6579f6be0ec527b781d39afe68/numpy-2.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:85aaccb24182c25df891ad0ec333585967e115269d5f1b17f2c9ae005bc96657", size = 12460532, upload-time = "2026-08-09T13:45:57.167Z" }, + { url = "https://files.pythonhosted.org/packages/d5/21/35b31dde1b283b79de828b80f876afd8c94e28fe1e9c375f89e261cc4c0d/numpy-2.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:bd68ece1553d2023c09a4226d9e41c586ad2d20594d1a456186c33513d2cb3f2", size = 10396725, upload-time = "2026-08-09T13:46:00.478Z" }, + { url = "https://files.pythonhosted.org/packages/ac/f8/c3b222bf075b50afd8e949a07a15c4b312a4a84bd8102a332bcd953cbbb4/numpy-2.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d787cf769c3baeb5f6235e778edb52c08dfa923789b5958f28e6450f96107cb1", size = 16885180, upload-time = "2026-08-09T13:46:03.939Z" }, + { url = "https://files.pythonhosted.org/packages/17/e1/2c1d4b1987795a92b5bbf7c24fe249ab96aa2573ab0d7604802c189d7b86/numpy-2.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:24b9dc2e3d84aa58523798805194e23e736f3f6ce2d1a5b92583ae734e6dbda8", size = 11907878, upload-time = "2026-08-09T13:46:07.045Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ee/d08226fc858044355983a6e5b94f08ff6f3969e0a2b160a4a89f0ddb3445/numpy-2.5.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:9e9413326d726c2545bfa65d2c0876871e8d8386e77f992c1d426e180bbd4323", size = 5354922, upload-time = "2026-08-09T13:46:10.04Z" }, + { url = "https://files.pythonhosted.org/packages/94/f0/6d3d933056440ebbc5e6bad92065fc6c26a48a84a36b1208580e94eea76c/numpy-2.5.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:60e902ac295855348a5ca2ea4c89108989a9f5fddfad3dfc0a8f36b10358567e", size = 6679168, upload-time = "2026-08-09T13:46:12.275Z" }, + { url = "https://files.pythonhosted.org/packages/c4/3b/ecd49dd90033cceb2704d88ca905d4d7d89b0e8c739608754ffd325fa820/numpy-2.5.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50e500dc868e9313530ce12ba470fe50ff3afe3d62993ed6eff652dacd555b65", size = 15624501, upload-time = "2026-08-09T13:46:15.322Z" }, + { url = "https://files.pythonhosted.org/packages/c7/99/461bd36dbdfac6c1c53efa370bd55a83227542d0d118f1677dbf1a3dacd5/numpy-2.5.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318b9a4c845dbea06708a29c84ee429cc3065048db34cdb799047643492050ee", size = 16713701, upload-time = "2026-08-09T13:46:18.949Z" }, + { url = "https://files.pythonhosted.org/packages/f9/9c/2b251df9e8a5d647b62b0cbc1b90a91850c1cf4859ecb532fd0b4eacff6c/numpy-2.5.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:34c319e2963be042673fb46570501b2f06c41924e17e3563d58646b4380dfb68", size = 16986065, upload-time = "2026-08-09T13:46:23.006Z" }, + { url = "https://files.pythonhosted.org/packages/8f/25/20de43f53ff1390534a124475055a19f01fe10c920a0fd11b8e18d6d6052/numpy-2.5.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f06571a052127dc1b4e8b83029b4d1b20daa2b64a31cdd181fc6bc774e9000eb", size = 18470031, upload-time = "2026-08-09T13:46:27.102Z" }, + { url = "https://files.pythonhosted.org/packages/56/5e/0c577ca308d6da5eb79b546ba10bbe5b60148192194e2da060913b1de4f1/numpy-2.5.2-cp314-cp314-win32.whl", hash = "sha256:2cc779226e476d1e1f08c74068c419e60f41a9e0e069c92f6671d31d5c985e98", size = 6121028, upload-time = "2026-08-09T13:46:30.046Z" }, + { url = "https://files.pythonhosted.org/packages/15/5c/7bcbd5b11f94199073320410cddcbb80cee62415bfeb540874b265c2d922/numpy-2.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:7587f53dfbd5edc0f7b87c6217b4c6d2d1f2ef9c3da70bc1315e7db5f8d7ec9d", size = 12597627, upload-time = "2026-08-09T13:46:32.886Z" }, + { url = "https://files.pythonhosted.org/packages/87/bc/4d0b06fba0da90ccc75af62823cb9dcedb6c9ea0cffa058cb2c9ee773a77/numpy-2.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:3e4c367352d3747784248a227fbec218e193b56f7e6692e3b64fc805478ecfdf", size = 10680414, upload-time = "2026-08-09T13:46:36.036Z" }, + { url = "https://files.pythonhosted.org/packages/cd/17/f429aac9dc08833a0d0f188eba38c532a751b1a1f2ca6018a37b455cb321/numpy-2.5.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b879fb674276e331513fb136b78dbc6bd3c848309e0d841cfd63be3896c4cfc1", size = 12026967, upload-time = "2026-08-09T13:46:39.084Z" }, + { url = "https://files.pythonhosted.org/packages/ca/9f/d0849de96a2a4ceaa16662f18ee13eaa9c0aa418269fdc8c4857c56b11da/numpy-2.5.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:fd0d703772bba096843785bd38371e31bb4a0c1151497ad5739d182114a73f7f", size = 5473874, upload-time = "2026-08-09T13:46:42.075Z" }, + { url = "https://files.pythonhosted.org/packages/89/3c/8df216d4a4a5422a3de045301cf7df8ea47286d76f5cb7160b0128ac26b7/numpy-2.5.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:3a2f061cebd9e3d23bdcfaaded5e2293a4c6a5b60fa42df85d410a725ce621bf", size = 6789276, upload-time = "2026-08-09T13:46:44.387Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3a/20d7e9891c4ddfadd6ff8d95bf4b29f353d8e1770553de2099880551dfb9/numpy-2.5.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6df895598c0edcb41030126c89e0f353b07d93238116143b7405e937359736c4", size = 15659154, upload-time = "2026-08-09T13:46:47.538Z" }, + { url = "https://files.pythonhosted.org/packages/aa/d6/f3aa3d2688bf501b858835c6bd087ae9b51a56ae6fca8e2b0990abd177af/numpy-2.5.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ab3d4a901f844ea836c3e80bf463c6a27d7f3c14e8e292fcf28d348b25b9bce", size = 16748909, upload-time = "2026-08-09T13:46:51.442Z" }, + { url = "https://files.pythonhosted.org/packages/7d/8f/1c5cae8d2baf86ab802ae97a00be55bc7e21ebc11b12bbc33376c5f05342/numpy-2.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:cebc2d6dbb605a7703d59751dea4bd6b0ab127a5a4338a6f432df1936fef8b26", size = 17027685, upload-time = "2026-08-09T13:46:55.095Z" }, + { url = "https://files.pythonhosted.org/packages/5c/27/71d3467404aedc1c24ce79610f91b52b0b0f466c43a701aa56fc75c145ab/numpy-2.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eaca7ff36f0f52e2111ec71f169d8fd3e889e7ddc0d2592e0d703fd8d3ce8fac", size = 18501181, upload-time = "2026-08-09T13:46:59.09Z" }, + { url = "https://files.pythonhosted.org/packages/14/2f/42921d27c40aea7e077f4a423ae509fd9220b028cd787bafefd8ab2b3a5f/numpy-2.5.2-cp314-cp314t-win32.whl", hash = "sha256:ddf47472af2e4280d79bac82304f5e80150211f1b9e614b760061d5fdfbb6eba", size = 6271085, upload-time = "2026-08-09T13:47:01.903Z" }, + { url = "https://files.pythonhosted.org/packages/75/e6/bad5f5d56de9b1971bac959963dda276d35c40f1854475005434bbe08692/numpy-2.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:44ef9675d908e65f9953063837c3277730f3f4437615a4cdab67b366cabaf884", size = 12787971, upload-time = "2026-08-09T13:47:04.963Z" }, + { url = "https://files.pythonhosted.org/packages/df/05/f608795cb34391acd67e38d94a3c36abd8d8576293a3a80727d7595c372c/numpy-2.5.2-cp314-cp314t-win_arm64.whl", hash = "sha256:eaa088384c46f519dacb93b7ec483a6d6b19a4a2085ae4f25ab9b1c43d387d1e", size = 10750306, upload-time = "2026-08-09T13:47:07.976Z" }, + { url = "https://files.pythonhosted.org/packages/33/c6/28de0191c5f82b7d42a0a51390ba98587048aa93a39fafb05bdbe6e8d00c/numpy-2.5.2-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:078f9b027b478c9379b9677babbf0f8b8f1ecfada27636d7b9a93990c638739f", size = 16885274, upload-time = "2026-08-09T13:47:11.439Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d1/973ca116000d244897e468ea1aff30b589e5022e3c8744b71706fe33bd57/numpy-2.5.2-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:50a68f4bacd8a2b33d8da3d2269d0d78500f86ea582e4786dc10f5ef2c2c6842", size = 11907846, upload-time = "2026-08-09T13:47:15.128Z" }, + { url = "https://files.pythonhosted.org/packages/78/d9/8c4b3937ef204cb2fd88d389ccd0f265a2ffb11f35a01d2064cf46714bd6/numpy-2.5.2-cp315-cp315-macosx_14_0_arm64.whl", hash = "sha256:e79aba74ffaf5f78a050d777c184cddf8fdffabab38acf5f3ef1fecbc17895d6", size = 5354892, upload-time = "2026-08-09T13:47:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/b6ee65ea2999fdb7023935e108e6fb776ee4082aa15f159acfa857e578c8/numpy-2.5.2-cp315-cp315-macosx_14_0_x86_64.whl", hash = "sha256:9a0731745a72a184490a582fb4af2533512bd071ace67785b5fdffc0ae58dce8", size = 6679309, upload-time = "2026-08-09T13:47:20.456Z" }, + { url = "https://files.pythonhosted.org/packages/43/f3/acb18d8b137a393c8e7803a8c994c9e64bde3930692a69d826993113a159/numpy-2.5.2-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ec954036759bcee3aa484f8603bd9c14f3e776293b85578b8734c2d72777c69", size = 15625850, upload-time = "2026-08-09T13:47:24.365Z" }, + { url = "https://files.pythonhosted.org/packages/a9/bf/a8e9bb0db815a0e265b5744ebedd3af0bd5faad8604e5b50a1cd012f3c91/numpy-2.5.2-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc649493697006bc90614a5f0bbc8cb3cb1866715c474e473694968d7e6b99ab", size = 16713664, upload-time = "2026-08-09T13:47:27.965Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c3/6e913736b3dd6582344af32418b5fb9dab34282e8a8174ae1d54ceb0fc13/numpy-2.5.2-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:cf7de32f486e4ac9e2d93b810f9e9ac72a728dd46a32a0bb403222f27f653514", size = 16986749, upload-time = "2026-08-09T13:47:31.541Z" }, + { url = "https://files.pythonhosted.org/packages/80/09/7d3b23eff5c7428ef6c01e6f7052bb60d504c4d33e317b36b8959c24ad97/numpy-2.5.2-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:2ffa7bacab3e2ee1b19ed31766bb60bb380b68c23f051e199c5cc598afd68710", size = 18470495, upload-time = "2026-08-09T13:47:35.364Z" }, + { url = "https://files.pythonhosted.org/packages/a5/a4/68a321d825374f6eb677ffe8ef8c6b9a328304e6fd2e39d9530822776607/numpy-2.5.2-cp315-cp315-win32.whl", hash = "sha256:6b588cc8f902d6bff201c19fd00c43ab8545671e3554d014e12e14139e5e8617", size = 6120696, upload-time = "2026-08-09T13:47:38.561Z" }, + { url = "https://files.pythonhosted.org/packages/c8/23/deafbb1700f79fae9cd1e91220f133d124cc267de1b584da3fbf6db2f6cd/numpy-2.5.2-cp315-cp315-win_amd64.whl", hash = "sha256:07d4e89f3a9ab0a9ba24264ccdb642b3dd951b2281e8883a5481a4aa79cc31a7", size = 12597324, upload-time = "2026-08-09T13:47:41.401Z" }, + { url = "https://files.pythonhosted.org/packages/33/cd/3272ba105e3bbbdaeb11357eda31e7a6825ffe159e8171665660299a948f/numpy-2.5.2-cp315-cp315-win_arm64.whl", hash = "sha256:a610dc7e3c52edd39c2bc2375ff9c3fd59cb3ad00e4472d36f83bc1457145788", size = 10680466, upload-time = "2026-08-09T13:47:44.873Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0e/58370637b1bb70a5c9ce2b43f4b521ccb224e36ccb76a6596b17ae4b447c/numpy-2.5.2-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:40f4d451aed46a8046a1aae41c4e55fb3612273df9c502480135e1501576a34b", size = 16993947, upload-time = "2026-08-09T13:47:48.97Z" }, + { url = "https://files.pythonhosted.org/packages/10/93/2abcb807712b289d6d60fe4cf30532f98974a8396d885650f3ba5a13026e/numpy-2.5.2-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:c081cbe16ba1ab53078e5ff29013621e33c509eedab055775d956427712c236e", size = 12025331, upload-time = "2026-08-09T13:47:52.646Z" }, + { url = "https://files.pythonhosted.org/packages/8b/3a/2898e003a5fbaf87e76c039b4ee1f5eb390471b4ffe74887c1f34c4e791e/numpy-2.5.2-cp315-cp315t-macosx_14_0_arm64.whl", hash = "sha256:0090ccdd57ec2703e9b49d0bf554767370581c1dd0a6b2bb2b2d9def317d042a", size = 5472336, upload-time = "2026-08-09T13:47:55.403Z" }, + { url = "https://files.pythonhosted.org/packages/61/a5/23f69d07c544597b29758b31b55c27dc9d541012a2c1496189fef702aec2/numpy-2.5.2-cp315-cp315t-macosx_14_0_x86_64.whl", hash = "sha256:6a9bb119fb8dd21ba30b3f0e555b7e2b081bd9883af21ec9c1c633d161cda3a8", size = 6788387, upload-time = "2026-08-09T13:47:58.192Z" }, + { url = "https://files.pythonhosted.org/packages/15/ea/c0dbdbcf22f43782510a3e492dd3da73c6112b69cac8929d16d127536fc4/numpy-2.5.2-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a839318485284a6fb31be4f8f2c91c8f2cb22f4543c4a8903f12b0671ffe07cc", size = 15667096, upload-time = "2026-08-09T13:48:01.562Z" }, + { url = "https://files.pythonhosted.org/packages/fc/5e/29c73c31748cdb0f7566642125ba17fd5b56780cddf891b085dab27e4466/numpy-2.5.2-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba0a474801b8dc67b66bf465548abc90e82b44d2611b5770f33008dcabffe8ec", size = 16751730, upload-time = "2026-08-09T13:48:05.706Z" }, + { url = "https://files.pythonhosted.org/packages/47/95/02501e8454796bb58dadf7a99d3181e0b464bf264e1003039572f9779fac/numpy-2.5.2-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:0a4035ae1129ff8777f08bfbd44f1e5d8e9c049ce0c2dd78fc0d92c13e7251c0", size = 17038686, upload-time = "2026-08-09T13:48:09.627Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b5/53a681d91b5c82687067d8ea5035e02d917b5509d6f334cb06484a954714/numpy-2.5.2-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:77843ca236b777e67f8d6b3660ea116e499612703a0ecd7093f316201eb9d8e2", size = 18507727, upload-time = "2026-08-09T13:48:13.744Z" }, + { url = "https://files.pythonhosted.org/packages/42/06/6e11443f7b64ee376c860506091103bf68f92d2cab9e8d96d4501babf07c/numpy-2.5.2-cp315-cp315t-win32.whl", hash = "sha256:7354826bc6f8f69402e9b7fe28d15fcd34feebd74f856f111585c5b0c9fb0251", size = 6269775, upload-time = "2026-08-09T13:48:17.543Z" }, + { url = "https://files.pythonhosted.org/packages/f1/18/195d6b86cd72dbbc501edfa778005fa6b87afd34c153e46028cd3a0938f4/numpy-2.5.2-cp315-cp315t-win_amd64.whl", hash = "sha256:e5651f3f87add730ee6608d915009e19c911fba0cb000c7e3ea994b7d768eb12", size = 12782559, upload-time = "2026-08-09T13:48:21.023Z" }, + { url = "https://files.pythonhosted.org/packages/b4/07/458c344f0f0c178f4481dad5cca790626ffe4c34eabf9467069d06ee4999/numpy-2.5.2-cp315-cp315t-win_arm64.whl", hash = "sha256:5f8e00be2ec6f45f4e8a41a527f68d44a7d96fee92a650e4d8b1326f77f61e6e", size = 10748103, upload-time = "2026-08-09T13:48:24.21Z" }, +] + +[[package]] +name = "onnxruntime" +version = "1.29.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flatbuffers" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "protobuf" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/80/381c1e9efed9cc32d00aa7cab0547dc84116cec906c3ffe3613686d6963a/onnxruntime-1.29.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3a3814c041251d6a77fdf513fb282056538ee826d2f1178a0df3c549d3fff6ba", size = 21430049, upload-time = "2026-08-17T22:53:48.286Z" }, + { url = "https://files.pythonhosted.org/packages/30/12/4be0e345d38fe707a701ca07e8f63c05b152a2e6285d1e43a7faf63fedd2/onnxruntime-1.29.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d2fb19e848f7c33ed8d3182b52504aaa11c5e8da438bbb47296f85b133cbcf6b", size = 20816870, upload-time = "2026-08-17T22:53:51.169Z" }, + { url = "https://files.pythonhosted.org/packages/96/eb/e6968f5e41aac3125f2ff5708855f09cb0b70d85ed3115b625b0b58305ba/onnxruntime-1.29.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2b80d8c7ec2cc7438e4da3760b88c24568cba72c9ace96d668800a6c79419acb", size = 23136745, upload-time = "2026-08-17T22:53:53.92Z" }, + { url = "https://files.pythonhosted.org/packages/b4/80/5b28f1f1111210fc4a336ddbc6950f468ebf9a6a265420568f4f43fa33ce/onnxruntime-1.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:4acf2b4948b7ede87221ca6332344b8facdc8059d6ac751a7d367d04532b02dd", size = 14001407, upload-time = "2026-08-17T22:53:56.486Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d6/6883f89ea4b044e6e8447ebfaf9bcecdf457b7d80a683635e130b25498e0/onnxruntime-1.29.0-cp312-cp312-win_arm64.whl", hash = "sha256:dc61a79cb39afd66ab3f01fd2c23591a7f01de89c1668e1fb6315067fc279164", size = 13746981, upload-time = "2026-08-17T22:53:58.977Z" }, + { url = "https://files.pythonhosted.org/packages/41/f8/d375facf60edaf41f5732f9f689c98a800fcc52df5cf6ddfb406703eb5a1/onnxruntime-1.29.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:be0f8ed688cfb1d4d5765a137193b7bfab0c8ea214eed99260b380bb525a3a7f", size = 21429708, upload-time = "2026-08-17T22:54:01.44Z" }, + { url = "https://files.pythonhosted.org/packages/c9/17/b9ad04051a8c4f504852ce0e8e10f9a6b2f1a331eedcdcc503df776dd0ea/onnxruntime-1.29.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:d67673c5367727860922c5262d724472f1b5539fb7ccf4c81a638f9b71719803", size = 20816263, upload-time = "2026-08-17T22:54:04.088Z" }, + { url = "https://files.pythonhosted.org/packages/83/2c/d8eb945d2a372149df9705a8d5c8d7c6c46c987c5446dbcea9e1ea7f6556/onnxruntime-1.29.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e2128f31f449e922c62dbe5d8b6b7b079f0bcaf2d56a102fa203cb6e5bb5ab19", size = 23136817, upload-time = "2026-08-17T22:54:06.714Z" }, + { url = "https://files.pythonhosted.org/packages/e1/3b/66b424c63fa92dfaa48d1719efaae66fc8c256b9426a832eda51d8dfe1e9/onnxruntime-1.29.0-cp313-cp313-win_amd64.whl", hash = "sha256:2945e1f82f81f27e88decea88c7861f45baea23818950d467bf3909aa303119e", size = 14001310, upload-time = "2026-08-17T22:54:09.13Z" }, + { url = "https://files.pythonhosted.org/packages/83/22/d6a700e3a6322fa3d56fbe7cee9ffc53f35e77ffcd6b7e97f4b7722a27ab/onnxruntime-1.29.0-cp313-cp313-win_arm64.whl", hash = "sha256:4b940b0d777590c7e20bf298f5c16af1ea6ad1b400a1c822a6be192f64f4d954", size = 13747112, upload-time = "2026-08-17T22:54:11.608Z" }, + { url = "https://files.pythonhosted.org/packages/4a/89/c4af146de3d60a32c89fea48d5d34bfd044faaf8957270043a03bd1b462b/onnxruntime-1.29.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:533f8370ce124304e5cb08ab961836cf755631e3dd77adc5f3bbdab70c2b7d99", size = 20826136, upload-time = "2026-08-17T22:54:14.315Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f2/e6bbacd11dfe8d070613261a758795ea128b9fc9bea391a2a7da2e4c7a08/onnxruntime-1.29.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:c1ad3f437153fe77f9d01a08fbaac0beb030e09b8a80ace1603bcf69b6c95481", size = 23138951, upload-time = "2026-08-17T22:54:17.154Z" }, + { url = "https://files.pythonhosted.org/packages/ff/a3/718e1b83096a1bc7b0fc8014c23d4cf795559fe666961cfac4fc038a4871/onnxruntime-1.29.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e74b278af1d949876f5d91d1268fd6c680e79f2bac194967394eaba9fdf69e7e", size = 21431104, upload-time = "2026-08-17T22:54:20.118Z" }, + { url = "https://files.pythonhosted.org/packages/4e/17/c75e78ddc1fe69b6ebaef7fe88ac83f29bfe10955e3a0d2436d93473c91c/onnxruntime-1.29.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:939e5d65f332e6d399774b2bd0d3559fd8fa629c1e77833db29d968d2384f23d", size = 20818488, upload-time = "2026-08-17T22:54:23.147Z" }, + { url = "https://files.pythonhosted.org/packages/65/54/9f197c578d3d3d7bea16971e233e5483981228eec73748585cf7b5933403/onnxruntime-1.29.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:6c0c37b92f67ed68dd36221ce0403e1d9bd4f7efce724439978a2597848530e5", size = 23136994, upload-time = "2026-08-17T22:54:26.321Z" }, + { url = "https://files.pythonhosted.org/packages/24/53/4616a55d2495679cfd0195f968feb3d74fe30e26467d168ee243ac97c089/onnxruntime-1.29.0-cp314-cp314-win_amd64.whl", hash = "sha256:4a3129ae56e70d2618ff773920166916310370a7e3cacb60b9e0e8910092725f", size = 14350643, upload-time = "2026-08-17T22:54:28.794Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0f/c338cb5500a522c7e671a3bb1276f4562404fbecce8a0e274565aa968484/onnxruntime-1.29.0-cp314-cp314-win_arm64.whl", hash = "sha256:e417ef8628dcce310d2d53023e750ea298ec14d4341ae6dc3a572bfd9bc7fa97", size = 14124294, upload-time = "2026-08-17T22:54:31.015Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e7/61064289a9a1301b25c1f0f574fe98aba31c2d388db3c1dbec664f78621f/onnxruntime-1.29.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:11264bb58f7b7cf6af835ab10d36838d73680580820fd6f51d90124a1ca8f449", size = 20826174, upload-time = "2026-08-17T22:54:34.283Z" }, + { url = "https://files.pythonhosted.org/packages/60/21/d0c04b561b46e9bff89b5f500fb7415b8ca0669f7902204f76ab06bb0c7e/onnxruntime-1.29.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1ea91cef3b971506e51ae9c37c16d027774ec64994a524ec1bdfb027d68a9832", size = 23138547, upload-time = "2026-08-17T22:54:37.491Z" }, +] + +[[package]] +name = "opentelemetry-api" +version = "1.44.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ee/8b/aa9e2d8b8dfa7c946f7dec5d1f8f6ba8eca062f43509a06bdb5ce93d26c0/opentelemetry_api-1.44.0.tar.gz", hash = "sha256:67647e5e9566edcf421166fdf022b3537f818635daa852b289e34604dc6fb33a", size = 72406, upload-time = "2026-07-16T15:25:32.678Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/6f/a04e900f465ff3221ccc395522503e2d10e79fa21f2723c8e177aae1e0d1/opentelemetry_api-1.44.0-py3-none-any.whl", hash = "sha256:94b98c893a91b88657eaac1e3ba89618cdb85be6918196705354f34728b2cdef", size = 60018, upload-time = "2026-07-16T15:25:11.657Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pillow" +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, + { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, + { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ac/31fb64e1e7efb5a4b50cd3d92049ba89ac6e4d8d3bb6a74e15048ca3353e/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89", size = 4161684, upload-time = "2026-07-01T11:54:25.934Z" }, + { url = "https://files.pythonhosted.org/packages/87/b4/9805e23d2b4d77842b468513841fda254ee42f0289d25088340e4ff46e2d/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace", size = 4255487, upload-time = "2026-07-01T11:54:27.935Z" }, + { url = "https://files.pythonhosted.org/packages/df/39/ecf519435a200c693fe053a6ee4d835b41cf963a4dfc2551c4e637cb2a71/pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec", size = 3696433, upload-time = "2026-07-01T11:54:29.813Z" }, + { url = "https://files.pythonhosted.org/packages/42/92/2fc3ffad878ae8dd5469ec1bc8eb83b71f48e13efdf68f02709003982a32/pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66", size = 5345889, upload-time = "2026-07-01T11:54:31.97Z" }, + { url = "https://files.pythonhosted.org/packages/10/76/8803c13605b763d33d156c4678fc77f8443389c0c51c8aef707bb02015f4/pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35", size = 4780109, upload-time = "2026-07-01T11:54:34.026Z" }, + { url = "https://files.pythonhosted.org/packages/1f/01/e18aff37cb0b4aac47ac90f016d347a49aca667ef97f190b06ac2aabc928/pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65", size = 6263736, upload-time = "2026-07-01T11:54:36.131Z" }, + { url = "https://files.pythonhosted.org/packages/f7/62/de5bdd77d935331f4f802edc11e4d82950f642caad6cb2f949837b8560e2/pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3", size = 6937129, upload-time = "2026-07-01T11:54:38.216Z" }, + { url = "https://files.pythonhosted.org/packages/70/4d/105627a13300c5e0df1d174230b32fd1273062c96f7745fd552b945d1e1d/pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a", size = 6339562, upload-time = "2026-07-01T11:54:40.354Z" }, + { url = "https://files.pythonhosted.org/packages/6b/1d/f13de01a553988ab895ba1c722e06cf3144d4f57656fd5b81b6d881f1179/pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e", size = 7049439, upload-time = "2026-07-01T11:54:42.489Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f9/066794cca041b969964f779ee5fa66a9498bbf34248ac39c5d7954e4198f/pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f", size = 6473287, upload-time = "2026-07-01T11:54:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9b/7a58e61d62be561da3a356fe2384d4059a6345fc130e23ef1c36a5b81d24/pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8", size = 7239691, upload-time = "2026-07-01T11:54:47.141Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b0/c4ed4f0ef8f8fa5ee8351537db6650bb8189f7e118842978dd6589065692/pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b", size = 2568185, upload-time = "2026-07-01T11:54:49.137Z" }, + { url = "https://files.pythonhosted.org/packages/dc/01/001f65b68192f0228cc1dbbc8d2530ab5d58b61037ba0587f946fea607cd/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330", size = 4161736, upload-time = "2026-07-01T11:54:51.156Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d2/0219746d0fd16fc8a84498e79452375be3797d3ce4044596ce565164b84f/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217", size = 4255435, upload-time = "2026-07-01T11:54:53.414Z" }, + { url = "https://files.pythonhosted.org/packages/c8/02/8d0bc62ef0302318c46ff2a512822d2610e81c7aa46c9b3abe6cbaca5ad0/pillow-12.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930", size = 3696262, upload-time = "2026-07-01T11:54:55.739Z" }, + { url = "https://files.pythonhosted.org/packages/85/e2/73c77d218410b14f5f2d565e8a998d5317b7b9c75368d29985139f7a46f0/pillow-12.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8", size = 5350344, upload-time = "2026-07-01T11:54:57.657Z" }, + { url = "https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0", size = 4780131, upload-time = "2026-07-01T11:54:59.713Z" }, + { url = "https://files.pythonhosted.org/packages/b1/9d/8b2c807dbef61a5197c047afe99823787eb66f63daf9fb2432f91d6f0462/pillow-12.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321", size = 6263757, upload-time = "2026-07-01T11:55:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b", size = 6936962, upload-time = "2026-07-01T11:55:03.93Z" }, + { url = "https://files.pythonhosted.org/packages/18/7e/e483414b35800b86b6f08dbbc7803fb5cd52c4d6f897f47d53ea2c7e6f65/pillow-12.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198", size = 6339171, upload-time = "2026-07-01T11:55:05.989Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f4/68c491844841ede6bed70189546b3ee9731cf9f2cbad396faff5e1ccba45/pillow-12.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130", size = 7048116, upload-time = "2026-07-01T11:55:08.131Z" }, + { url = "https://files.pythonhosted.org/packages/a3/34/77f3f793fed8efc7d243f21b33c5a3f0d1c97ee70346d3db855587e155ff/pillow-12.3.0-cp314-cp314-win32.whl", hash = "sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a", size = 6467209, upload-time = "2026-07-01T11:55:10.408Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e0/492879f69d94f91f60fc8cd05ba03650e9520afebb2fb7aa12777d7c7f38/pillow-12.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d", size = 7237707, upload-time = "2026-07-01T11:55:12.745Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ac/6b11f2875f1c2ac040d84e1bbf9cf22a88038f901ca1037898b280b38365/pillow-12.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838", size = 2565995, upload-time = "2026-07-01T11:55:14.736Z" }, + { url = "https://files.pythonhosted.org/packages/52/69/c2208e56af9bfc1913afb24020297a691eb1d4ef688474c8a04913f65e04/pillow-12.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e", size = 5352503, upload-time = "2026-07-01T11:55:17.076Z" }, + { url = "https://files.pythonhosted.org/packages/07/70/e5686d753e898a45d778ff1718dba8516ead6ab6b95d85fc8c4b70650cf2/pillow-12.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17", size = 4782956, upload-time = "2026-07-01T11:55:19.448Z" }, + { url = "https://files.pythonhosted.org/packages/d5/37/25c6692f06927ee973ff18c8d9ee98ad0b4d84ee67a09610c2dd1447958e/pillow-12.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385", size = 6322855, upload-time = "2026-07-01T11:55:21.613Z" }, + { url = "https://files.pythonhosted.org/packages/cc/91/420637fcb8f1bc11029e403b4538e6694744428d8246118e45719f944556/pillow-12.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c", size = 6989642, upload-time = "2026-07-01T11:55:24.006Z" }, + { url = "https://files.pythonhosted.org/packages/10/08/b94d7811281ccf0d143a1cf768d1c49e1e54af63e7b708ab2ee3eb87face/pillow-12.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d", size = 6391281, upload-time = "2026-07-01T11:55:26.252Z" }, + { url = "https://files.pythonhosted.org/packages/d2/87/24233f785f55474dc02ce3e739c5528a77e3a862e9333d1dd7a25cc31f70/pillow-12.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931", size = 7096716, upload-time = "2026-07-01T11:55:28.318Z" }, + { url = "https://files.pythonhosted.org/packages/23/26/fcb2f6e37175b04f53570b59937867e2b80ee1685e744023153028fc14f9/pillow-12.3.0-cp314-cp314t-win32.whl", hash = "sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7", size = 6474125, upload-time = "2026-07-01T11:55:30.956Z" }, + { url = "https://files.pythonhosted.org/packages/90/de/3634abee5f1c9e13c56787b7d5517b0ba8d6de51700b95578cf338349c9f/pillow-12.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c", size = 7242939, upload-time = "2026-07-01T11:55:34.044Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2a/fd13f8eb24de5714a6eb444a3d67e2842c6c576e159a43793adf23051351/pillow-12.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45", size = 2567506, upload-time = "2026-07-01T11:55:35.988Z" }, + { url = "https://files.pythonhosted.org/packages/5d/dc/8fdce34ec725a33c81c6ba122b904d6b9024e50ea9ac7bede62fab54506c/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139", size = 4162063, upload-time = "2026-07-01T11:55:37.941Z" }, + { url = "https://files.pythonhosted.org/packages/76/66/2044b9a63d3b84ff048228dfcb7cd9bf0df983e8470971bf7d4c57b693de/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402", size = 4255549, upload-time = "2026-07-01T11:55:40.022Z" }, + { url = "https://files.pythonhosted.org/packages/52/7e/1f67e6f4ece6b582ee4b539decbcc9f848dc245a93ed8cd7338bafef72f1/pillow-12.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c", size = 3696331, upload-time = "2026-07-01T11:55:41.98Z" }, + { url = "https://files.pythonhosted.org/packages/12/40/d306fc2c8e4d45d7f175c77edca7063be7b86fe7fe6e68f4353bf71d808c/pillow-12.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f", size = 5350370, upload-time = "2026-07-01T11:55:44.028Z" }, + { url = "https://files.pythonhosted.org/packages/dd/44/668fb1437e8ce420f62d6106eb66e44a5971602a4d794615bdf79315d82d/pillow-12.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701", size = 4780147, upload-time = "2026-07-01T11:55:46.073Z" }, + { url = "https://files.pythonhosted.org/packages/0c/08/93fa2e70e30a2d81547e481b6ee2bb9522117221fb1e0ce4b5df70967677/pillow-12.3.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace", size = 6273659, upload-time = "2026-07-01T11:55:48.264Z" }, + { url = "https://files.pythonhosted.org/packages/f8/6d/043e96ff814fc31a33077e4cba86082167db520c93632afdf2042febbb0c/pillow-12.3.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4", size = 6947439, upload-time = "2026-07-01T11:55:50.503Z" }, + { url = "https://files.pythonhosted.org/packages/af/92/ba71d2ee2ac0edf3fa33bd9d5ee9ee080da70b1766f3ca3934f9938ddac9/pillow-12.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39", size = 6353577, upload-time = "2026-07-01T11:55:52.697Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ce/e63064e2122923ff687c8ad792d0d736a7b3920a56a46982e81a7fdd25d6/pillow-12.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71", size = 7060394, upload-time = "2026-07-01T11:55:55.149Z" }, + { url = "https://files.pythonhosted.org/packages/54/76/a09cc3ccc8d773a7283d34c38bec1708f9e3cc932093cbc4c5e71ac4060b/pillow-12.3.0-cp315-cp315-win32.whl", hash = "sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827", size = 6467375, upload-time = "2026-07-01T11:55:57.769Z" }, + { url = "https://files.pythonhosted.org/packages/3e/03/1846c49ba3b1d5550392a4bbd06d6fb4578e1cd91a803198b5c90f5f7d53/pillow-12.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5", size = 7237048, upload-time = "2026-07-01T11:55:59.975Z" }, + { url = "https://files.pythonhosted.org/packages/fb/bb/89f35dcc79610423f9f195504d7def7f0d1416a711541b42867e25fe3412/pillow-12.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658", size = 2566006, upload-time = "2026-07-01T11:56:02.143Z" }, + { url = "https://files.pythonhosted.org/packages/30/88/707027ba09942dfa2c28759b5c222d769290a41c6d20ea60ec250801941f/pillow-12.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf", size = 5352509, upload-time = "2026-07-01T11:56:04.2Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6d/00352fa25332c2569cd387851f568cc5a4b75a9adbfb37ac4fbce4c02eec/pillow-12.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64", size = 4783167, upload-time = "2026-07-01T11:56:06.631Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/9e049dfa21af7c22427275720e2490267ba8138120add5c4c574deb69782/pillow-12.3.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e", size = 6329237, upload-time = "2026-07-01T11:56:08.868Z" }, + { url = "https://files.pythonhosted.org/packages/36/16/cf6eeaae8d0fce8dd390a33437cf68c5d5bd73834a2bc6e2f14efda0ab45/pillow-12.3.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777", size = 6997047, upload-time = "2026-07-01T11:56:11.379Z" }, + { url = "https://files.pythonhosted.org/packages/1e/69/dbf769bdd55f48bf5733cac28edc6364ffaa072ec9ba336266e4fe66be55/pillow-12.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1", size = 6400440, upload-time = "2026-07-01T11:56:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e1/ffc9cfc2eea0d178da8018e18e959301ad9d6bc9f3edb7181e748a474b97/pillow-12.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9", size = 7105895, upload-time = "2026-07-01T11:56:16.575Z" }, + { url = "https://files.pythonhosted.org/packages/18/f0/a5595c1e8c3ae44b9828cb2f0fa8155e5095ef04d6327b8f61cf44a3df85/pillow-12.3.0-cp315-cp315t-win32.whl", hash = "sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8", size = 6474384, upload-time = "2026-07-01T11:56:18.855Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/62bcd9f844984c5938d3b05264a61d797a29d3e0812341a8204af70bbdee/pillow-12.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418", size = 7243537, upload-time = "2026-07-01T11:56:21.214Z" }, + { url = "https://files.pythonhosted.org/packages/3d/68/1f3066acedf37673694a7141381d8f811ae97f30d34413d236abe7d489f1/pillow-12.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59", size = 2567491, upload-time = "2026-07-01T11:56:23.506Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "protobuf" +version = "7.36.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/e7/0553e21d25ca4d9f573135775348a372c3ec34a93a71d5f297c3bac38341/protobuf-7.36.0.tar.gz", hash = "sha256:e8e09cb0d794c6687926fa558a8a6e72aa10edb997d5ca61da0765f12a3e00ea", size = 510034, upload-time = "2026-08-20T16:34:01.071Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/ae/58e3ca96cb2e118cc546b677359b3c6659f79a140935c08dec94c7998585/protobuf-7.36.0-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:9103532dffd80c6fab7e50c65a31007680a06eb57537d437bb1b35812c138a37", size = 453256, upload-time = "2026-08-20T16:33:53.945Z" }, + { url = "https://files.pythonhosted.org/packages/f0/15/5162230af4912697f0fe406f6800f80760945babcff0e2c2fe6c84ef2d5d/protobuf-7.36.0-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:bf94a5917c71058262de683669bc0a797a7669d3de71f0b36d058e3194f47b44", size = 341436, upload-time = "2026-08-20T16:33:55.134Z" }, + { url = "https://files.pythonhosted.org/packages/d7/09/1670b2bfc9a45e807e520c3e9be36524db9ccc7dc05ea17af7681cabdc61/protobuf-7.36.0-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:3297e60abdff301e5f74393d87f6cc59dacab5f024a89548a6e8de1d26576b16", size = 354440, upload-time = "2026-08-20T16:33:56.077Z" }, + { url = "https://files.pythonhosted.org/packages/c7/f8/bd5804695ba400e423c33fd4d9f58c28d86633d5ba1945c36ff3967d98cb/protobuf-7.36.0-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:70f5ec8eb0da81a44360c0dc0beac99a0d78071d21956a7076bae8bd2051841b", size = 340439, upload-time = "2026-08-20T16:33:56.992Z" }, + { url = "https://files.pythonhosted.org/packages/ef/9f/acd02338235a3e7d03168c4303478347b7624fc8189ff4e7f0d2654bbe86/protobuf-7.36.0-cp310-abi3-win32.whl", hash = "sha256:7326fd717bdc419162a735938d89d4032332bcc3408804012b24ff3a37086071", size = 440216, upload-time = "2026-08-20T16:33:57.99Z" }, + { url = "https://files.pythonhosted.org/packages/0e/4e/12cb93270967a2affff5b3f720694700d4d87712a67afd05c8cb3f6fa52c/protobuf-7.36.0-cp310-abi3-win_amd64.whl", hash = "sha256:1781cc1de61249b750848029bca452c0a8b7e990080316b9bbc2518b2117b488", size = 453731, upload-time = "2026-08-20T16:33:58.951Z" }, + { url = "https://files.pythonhosted.org/packages/01/c3/629999e78d46c1115c11886d51c6bd68c17ce4a944f1ea3e153a91316a33/protobuf-7.36.0-py3-none-any.whl", hash = "sha256:53374d53fc29a67f7dbbf0ade47d7526a0f0137bf0f9c90e48d8a60790ef748c", size = 177024, upload-time = "2026-08-20T16:34:00.053Z" }, +] + +[[package]] +name = "py-rust-stemmers" +version = "0.1.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/c1/9763f9fb1cd73f9c317a83feeed6e0d4af320c6bbddab47b4a94f3a47d0c/py_rust_stemmers-0.1.8.tar.gz", hash = "sha256:6b0f6f48bc54d607aed802de872fcd5a71bae969a6760976dc78ce55e8eaf3da", size = 9732, upload-time = "2026-05-22T11:00:24.358Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/6a/39080bc8f4a441a35378c0faeeb834fb27974997f40d51342574e70f9662/py_rust_stemmers-0.1.8-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6a9a4b8733d0b307bd0879ab7e321aa8a0bfd054a75a5cb23c647df5ca7d17c3", size = 290230, upload-time = "2026-05-22T10:59:44.551Z" }, + { url = "https://files.pythonhosted.org/packages/73/15/ae60b9010924adac465f418822d9c514690aba6846edd67b6e2b5c227745/py_rust_stemmers-0.1.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:51d0042d2a92ef0f7048bfc06b6c2a02306af31ea47f09d24b34e4b7e63c4e80", size = 275449, upload-time = "2026-05-22T10:59:45.547Z" }, + { url = "https://files.pythonhosted.org/packages/ec/7c/94be8b932179823d66e0d2be03a94706132a7d16a640d5e5710de1cb1b8f/py_rust_stemmers-0.1.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89d3d34094b9b6078a8ea6fe1c7044e5fd32f14e76c94818c5008f49ae075f08", size = 316676, upload-time = "2026-05-22T10:59:46.522Z" }, + { url = "https://files.pythonhosted.org/packages/f3/a4/8bd5c9f31207136830457d819e3f98bb21c54c0cdc40d6f1845ce4efdf7c/py_rust_stemmers-0.1.8-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:40c86be90cee4a709ad84fde4db7f11ca44d65630a56b77ec86fe84c23adfc09", size = 319458, upload-time = "2026-05-22T10:59:47.914Z" }, + { url = "https://files.pythonhosted.org/packages/f9/95/95da2b353b164a3a2b8a1c799866a58060693be4f1dc21065663dc67dc17/py_rust_stemmers-0.1.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:515884bcfb47b10335146648f276930d0c1201ae5e8b7b400fb46d8ea05c0ec2", size = 323541, upload-time = "2026-05-22T10:59:48.894Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ce/f34403b68808519dfa3220e1d94a40f26d5025f27e28893e2388ab9cfde5/py_rust_stemmers-0.1.8-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:fa42f5f8feb694aaaa869eedf477fcaf66f67a192cd64d94302d06920c33864a", size = 323873, upload-time = "2026-05-22T10:59:49.872Z" }, + { url = "https://files.pythonhosted.org/packages/57/01/fb8527f6474d576975415405c985a97260e0403829e062103d334230b7d2/py_rust_stemmers-0.1.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2e86ad68fe297a6652f0f0390625ea81858b6f27862fd4c5ee1214bf5af29b9d", size = 494761, upload-time = "2026-05-22T10:59:51.021Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ac/73816237dbec20a7299abf901e2f7b6061d238754e033b48e423603f5336/py_rust_stemmers-0.1.8-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:4b90fc81411943b114e8eb4988a876ba3b12bd2d20741559803eddc4131575dc", size = 596141, upload-time = "2026-05-22T10:59:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/52/0a/dd48debf386a206ee1c6ad75a0827eac89428441291c90d98bc3803fccf1/py_rust_stemmers-0.1.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:56cc2c2df742fa6529285b7d204720f34b7da789ed78eb578442f93c6de97d89", size = 541633, upload-time = "2026-05-22T10:59:53.18Z" }, + { url = "https://files.pythonhosted.org/packages/92/ca/ebb707ab280636b8f46d040ccb051d1a9ddbc1f1ca2d90cdba626872f405/py_rust_stemmers-0.1.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd967eea2f808a1e73aa71ecccef0f4925a4cca4eb02ced94057afe3303153ef", size = 212134, upload-time = "2026-05-22T10:59:54.245Z" }, + { url = "https://files.pythonhosted.org/packages/c2/98/f078f3930311e7b6154ccdf9166c4e30a416c7d199e136b5f09265d58a35/py_rust_stemmers-0.1.8-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5bd15b89203ecd886960e237124d1aa6e55498d76418c36c967d3b12168d43dc", size = 290427, upload-time = "2026-05-22T10:59:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/c9/46/21d784a3f1db6a23051ffd5826d8ee667d26a64587c1cfbda0443ed87fff/py_rust_stemmers-0.1.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6c92733b020534470ca5a0d7fe8b85c85622ff383d4f37fec75a1c677aa84921", size = 275628, upload-time = "2026-05-22T10:59:56.687Z" }, + { url = "https://files.pythonhosted.org/packages/57/d5/701c73a4f6a7fecfd96a6588f0cafe98d6b0acde93adf8a2e45535f3d1d5/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ab605a86c950ba7e8ab1392cf91296c0bec3084babb897a4aecf90a10c82395", size = 316656, upload-time = "2026-05-22T10:59:57.67Z" }, + { url = "https://files.pythonhosted.org/packages/9d/0d/c58fe98153cfdb6abf4dfb6ac335c923000d4af4e736080c3a3045b7aea7/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:21ed8055cec1f78d666afad8ffd7a51775ba419d2c615b8a1df7b32ca7f33e2b", size = 319377, upload-time = "2026-05-22T10:59:58.664Z" }, + { url = "https://files.pythonhosted.org/packages/5c/d7/e60d04849e90aa3ad457211cc4999c30401f433341f9a5588c12b81f9877/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae773e1d01e9aa328d175f461475d0cd7074a82bfcc71de6dc5765e51f1cc9f7", size = 323719, upload-time = "2026-05-22T10:59:59.845Z" }, + { url = "https://files.pythonhosted.org/packages/6a/48/c0e4fb955db784cc354e0756354602f7043ff4c10fcbd9d901a2f8fe3239/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5cc8fab9d0f1b274a26935a632362b8278f03e81b65e8b8644d5ca3f62a5a1a4", size = 324110, upload-time = "2026-05-22T11:00:01.26Z" }, + { url = "https://files.pythonhosted.org/packages/48/eb/981b26baff37cf7a26ee206763cc4d2fb3e1db8f0f86ec030074431fae05/py_rust_stemmers-0.1.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:35570098da02eb439afcd7270a12bf850bbe874b85cb912e0fb2d87a6e703920", size = 494645, upload-time = "2026-05-22T11:00:02.737Z" }, + { url = "https://files.pythonhosted.org/packages/6d/af/f16e805b7aefc2257b192b83a89300c8360b0fdffd3dfefa92dee4ec9b15/py_rust_stemmers-0.1.8-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:0a68745d4b3c7f5abc778ca967e8711df6154873abcfe4e62a6631fa2363cc32", size = 596124, upload-time = "2026-05-22T11:00:04.499Z" }, + { url = "https://files.pythonhosted.org/packages/76/8c/e7a2c940ba00e0792ae346aed5e755d51d37cf6d6853f6b141e5380e285d/py_rust_stemmers-0.1.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7cc0cc0b8eb45d2158c28ea43e2f338c110aad63052ad3bd00bc7446a595e12f", size = 541771, upload-time = "2026-05-22T11:00:06.081Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a0/dd7c5fc6ade6d2a2a49e49937f06f2d488511454e8ab1b313d277ee8c3b1/py_rust_stemmers-0.1.8-cp313-cp313-win_amd64.whl", hash = "sha256:15af4e12e1288de2e5241eec375afc6ad6be4c125a28ca010599d9f92db23f01", size = 212438, upload-time = "2026-05-22T11:00:07.244Z" }, + { url = "https://files.pythonhosted.org/packages/b0/7e/f4346adfd44acbd7eaedcbd7d21b7f40ec9712e6c699e71fddad8dae6f8d/py_rust_stemmers-0.1.8-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:526b58958c6ffa36c4a805326cfb624ecbd665d16ba435027dbed0bcbcaa09d2", size = 290379, upload-time = "2026-05-22T11:00:08.192Z" }, + { url = "https://files.pythonhosted.org/packages/c2/d8/988fc3f5dc0dbbd4bf5909f50ff953ab55ee8b5f79a835d00e57847d3123/py_rust_stemmers-0.1.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2b607f0b270951fb66479baf4b68716cc63a981585cbd898b0b6b5c359efde7e", size = 275458, upload-time = "2026-05-22T11:00:09.522Z" }, + { url = "https://files.pythonhosted.org/packages/f4/94/e04c8b6a8364bca1b368785cef143755dd2d1ffe74df8f8b47b075bb1043/py_rust_stemmers-0.1.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0327b151ab8a338fb54fdac114ba34394327fc1e2c4c425ad1caf2013e5de3", size = 314711, upload-time = "2026-05-22T11:00:10.878Z" }, + { url = "https://files.pythonhosted.org/packages/4f/cb/f59f9a80caa099cb6625a46c9a8e6e7e80bb3ed284f17e80245c8240a66e/py_rust_stemmers-0.1.8-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dadd0e369703817fc7026987b3093f461f9f58d8dde74e689d546184bc8f3451", size = 319370, upload-time = "2026-05-22T11:00:11.961Z" }, + { url = "https://files.pythonhosted.org/packages/06/59/8211cd0f56e53f7770debd9a78de37985fb5662ae66e3b7b380f4c79888b/py_rust_stemmers-0.1.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:245e2c61c52e073341893a9682cd1396b61047154548aee30bb1af3d8ed4b4cc", size = 321373, upload-time = "2026-05-22T11:00:13.213Z" }, + { url = "https://files.pythonhosted.org/packages/10/72/fe33e614c114264d1ba54d39da4b5a4abeb6aedd0d26e5a8fd0637d6ddba/py_rust_stemmers-0.1.8-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:451ee1c02a3f5cf1e161b46ba9032cdda4ba10a8b03ff9ee61c1d34d42a0bc81", size = 321707, upload-time = "2026-05-22T11:00:14.177Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/3cd18902fe2fa54557d3fe9132552256372d381c7aca71346163055d78b1/py_rust_stemmers-0.1.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d396dd25c473c1bc4248c79cd223f4b36356b55a124652f015c6a001547f81ac", size = 492457, upload-time = "2026-05-22T11:00:15.245Z" }, + { url = "https://files.pythonhosted.org/packages/90/d7/32c6d3995e7036b73683389de2771f4dbbf40de192b7efe73c2528ee1eb5/py_rust_stemmers-0.1.8-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:479c77c32d8be692f3cfcde7e19273f02ac81d6f45c6aef49887ef95cab7abbb", size = 596085, upload-time = "2026-05-22T11:00:16.404Z" }, + { url = "https://files.pythonhosted.org/packages/00/8c/e68fa5d862ea6a27fced3535c25ea4eaa26ba1ce00dfef5841924c74b167/py_rust_stemmers-0.1.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c786235275c5c2abb7f206b8236aee3ca0bc53c7497daf7fb7b01d3491469547", size = 539747, upload-time = "2026-05-22T11:00:17.414Z" }, + { url = "https://files.pythonhosted.org/packages/44/48/aa584cf3772e01231641c95dc1aa73327a7d986c562639d78d0013733acf/py_rust_stemmers-0.1.8-cp314-cp314-win_amd64.whl", hash = "sha256:931d13570962b093417e5443a9d1bd63d73fa239ebb81e5b1d346663571403e4", size = 209636, upload-time = "2026-05-22T11:00:18.662Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydantic" +version = "2.13.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/ef/fc4f868f4e2cee79f863883abffceff107875f569b848507319842d2a681/pydantic-2.13.5.tar.gz", hash = "sha256:51a9c5f7b2f8e636f04c6cada605d9b6a3bf1348fdf945a3d8869b19bba0ee08", size = 845750, upload-time = "2026-08-28T14:04:00.916Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/47/c95ffc2009878c7aac0c5e08528022dcb885933252a88b5f170058014464/pydantic-2.13.5-py3-none-any.whl", hash = "sha256:346a034f080da3755d8e9cb5e00e8b07de1d39e4f6e2c87d8ab7cafa0b269a73", size = 472589, upload-time = "2026-08-28T14:03:59.136Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/f9/8a06bea35ef8daf588f707784c973a7046e0034c8d8cfb08828eeffb8b75/pydantic_core-2.46.5.tar.gz", hash = "sha256:10416c15b8839ecc4ef4d0885da76da6fd0f67333a0eb8aff6d93c4b8f2910fc", size = 472262, upload-time = "2026-08-28T10:01:31.677Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3f/76358795aa7a8c6d4f36e2cb828ad1c90ee118e1393a9281664f5aade9d4/pydantic_core-2.46.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b9fe6fb92520e3fd61f2e49000b6911b188824f089b75973ea06d6267f0b476d", size = 2076516, upload-time = "2026-08-28T09:58:21.576Z" }, + { url = "https://files.pythonhosted.org/packages/db/50/26b091836076ce4cb2fac264186936acc069e0595772cfd02a563bc4761a/pydantic_core-2.46.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a39ac25a9a2fa4072efdb429833c4a4c8009a51ff9eea3eeae131713cd27991e", size = 1922874, upload-time = "2026-08-28T09:58:23.766Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/2a8ce3849e299d44e2d2c196b6082643a3235565a735cb51db7a6261f614/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fdc8b93a41521988916eeaa271173fcca7fa0803d62f87675aac8dcec1c8e29", size = 1951772, upload-time = "2026-08-28T09:58:25.435Z" }, + { url = "https://files.pythonhosted.org/packages/87/46/ac0dc8bdd9e6048183a14eb127764e7ad9240021c17513074a4711b0e31e/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b98134087d9de723658d17a42c7d0da8d6e2ef08015dee7dc93889047315f5e4", size = 2031832, upload-time = "2026-08-28T09:58:27.102Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c2/339de5bef7be36301a2231eaa52e62163742c2281f11b5f4892bc79785cd/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e652ab17569c94bff5475520f907b7148b8c24036a8ebbe5cf7cf7493d28579a", size = 2208645, upload-time = "2026-08-28T09:58:28.948Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a0/9ff22b797724262da14427abaed4dd1d864a139693fc5e7809114376a716/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d925f3d9afd05a8c0fb3a1031463a8d59ebe5e2afad297e29c78be19e13b4e62", size = 2265935, upload-time = "2026-08-28T09:58:30.625Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a4/eb9409ec0736e50aa70a412f16c204ed149516846912f7e6724d4c73ee53/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fc5be0abd4a407e200d844b404e33639a554e7bd0d448e7b9ae181be4789ac2", size = 2066284, upload-time = "2026-08-28T09:58:32.289Z" }, + { url = "https://files.pythonhosted.org/packages/c0/02/7f6156ffc926857f1c37c07d9a388682865a81830ab6a1b637082c25e399/pydantic_core-2.46.5-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:816ff0a6550ffc06c098ccd2e0698600f9aa7da192a79eaa6f9af504a35db869", size = 2105889, upload-time = "2026-08-28T09:58:33.986Z" }, + { url = "https://files.pythonhosted.org/packages/92/b1/e781d357ebe09fc929f995700f1b3503e8897f1cece183ecb1300d4d67e9/pydantic_core-2.46.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c7ea57fc63aa7da93a1bd2d644e6577befae10c52c4e36377635eea1056a74f5", size = 2158006, upload-time = "2026-08-28T09:58:35.647Z" }, + { url = "https://files.pythonhosted.org/packages/70/0a/644597d84ab400e50609c192120b85c9681c22d3a20461b9060a79be0a7a/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:efd62a42486f1bda5d24cb4f63d15a3c7768375fe83d36f9417b4ad7a2fb20b3", size = 2158408, upload-time = "2026-08-28T09:58:37.38Z" }, + { url = "https://files.pythonhosted.org/packages/1e/ee/ca3b7b3a4b3769ffe9ce9432a7c9be755de9593a46d3b0d54d0409323e44/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:2bc9419666990c06d7397831f2126a1ecc3594aaa3ff7de5bf2d066802f4e07b", size = 2309609, upload-time = "2026-08-28T09:58:39.22Z" }, + { url = "https://files.pythonhosted.org/packages/ce/52/39fa1f451486019524ca685020390e7ca351832fd874530ba30c8628e6dc/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:18a09e1e1011b462f2e32774f25859ef1223d5c2b0546a633cf56654710721e0", size = 2342618, upload-time = "2026-08-28T09:58:40.89Z" }, + { url = "https://files.pythonhosted.org/packages/81/5e/468fc630568c61dcef3cd47ad32ffbeed9af643f49208d1ea86ab4f890c4/pydantic_core-2.46.5-cp312-cp312-win32.whl", hash = "sha256:5cb482e9e84c851f4e623fe4acc1ced89168cf1fe18f7089db4548c8f5bbb65b", size = 1939475, upload-time = "2026-08-28T09:58:42.591Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c9/4c19f41b84cf6b622a72fbeed7665b25d47a187d68d47d0d430c07f23268/pydantic_core-2.46.5-cp312-cp312-win_amd64.whl", hash = "sha256:5e81740c09e310f5aa5cbd3e434a01c154d4bef93241c7877b39f211d2b78ba8", size = 2043140, upload-time = "2026-08-28T09:58:44.272Z" }, + { url = "https://files.pythonhosted.org/packages/af/dd/0c1a050299147c746e5256db16d645ab5efd4f78c59937d581a0524e74a2/pydantic_core-2.46.5-cp312-cp312-win_arm64.whl", hash = "sha256:f7b0ec93a2893de856652154d73b7ba622f26fa97726487dcac373de5f4c6084", size = 1997729, upload-time = "2026-08-28T09:58:46.13Z" }, + { url = "https://files.pythonhosted.org/packages/f5/37/5abe39a8372a61d3dc3c1338fc504281c01b32fdb3169cd7187153b56d3e/pydantic_core-2.46.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:b7ca9034437b6022f941f4857459562ee00a560b97e7cce8a0ec5a74fc6766e0", size = 2075885, upload-time = "2026-08-28T09:58:47.856Z" }, + { url = "https://files.pythonhosted.org/packages/21/43/6323b1f8b217780454c61304bcd2b38ae4762f50754414124603ccc90bb2/pydantic_core-2.46.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f332f0e72a5a0400141f830744e141bf9f97917878dbe968669e8a7fefea78ff", size = 1922768, upload-time = "2026-08-28T09:58:49.58Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a3/c05ca796e1197618a774b01e596aeedfefc2f7d8c01ae3054e910b120e8a/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:193375f3548919d3f0b60936ca113ada3e38f264f91b9b8e0508efaad57be931", size = 1951241, upload-time = "2026-08-28T09:58:51.511Z" }, + { url = "https://files.pythonhosted.org/packages/68/32/33bc39ac705c52cffc908e8389f9754fdb208aea5c69cceddf4eb3ce99af/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:79bdfa52f843137045b2d081cc05c120ba6665d29b7559c2c47690906f39279f", size = 2031975, upload-time = "2026-08-28T09:58:53.166Z" }, + { url = "https://files.pythonhosted.org/packages/b0/70/2333e885c0f6a67bc105c5916965dac9b57f2718ee20d81d1a06a4ebdc13/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:24922243639cbdac66c75fcb6fd6495a9cb52b213d62f9a0d16f0310b1ff8038", size = 2208542, upload-time = "2026-08-28T09:58:55.017Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ea/296debfb4264207bbda5936133892e027c0a58875ad53ebd512fba8ec3a2/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c76fe65e607be28c7fd4d56fc3c42b1583aa058ce3408b7ad0fd540171d31f9f", size = 2264692, upload-time = "2026-08-28T09:58:56.767Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f2/9e4de77a6271e07a76d2d58b11c091a979c191ed2939bf80067568b369d2/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f7b393a8b3da82f5c1fc0751e6d01ac6c55b93c18226a60bdfba4a724efafd1", size = 2066633, upload-time = "2026-08-28T09:58:58.531Z" }, + { url = "https://files.pythonhosted.org/packages/8d/db/f9e9d0c97445987b2084823d5c240de88087338f04fc2cfaa2df186b8049/pydantic_core-2.46.5-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:7ac031912d54f3d83ef3b3eb98dfabc1608802e2202263d25957eeed40b94761", size = 2105235, upload-time = "2026-08-28T09:59:00.421Z" }, + { url = "https://files.pythonhosted.org/packages/07/c5/79169b047b3b2c3e99e04bc76372af9637e0bf6db638274fa927df96369e/pydantic_core-2.46.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:837b396ca3d7b74091ca623f6cbd8351bd42d670a79c2683e79fb089f06a2de5", size = 2157367, upload-time = "2026-08-28T09:59:02.442Z" }, + { url = "https://files.pythonhosted.org/packages/26/b5/ba6057afb7c291bd449f51b867f95aef2072941c4ce4e5c31d6ffd132d3b/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:5ee239d575f80b08eca11f6e20f90c4c695de7825c67eefe6091fbf20dda648e", size = 2158420, upload-time = "2026-08-28T09:59:04.2Z" }, + { url = "https://files.pythonhosted.org/packages/6e/28/2057abecaafdc22912afa819603a51f0a62d40643b7c4871c51721fea9be/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e80675d75ae2cd14372cb65cad5400d9347a3d3f6c13000183f22dfd027283ed", size = 2309588, upload-time = "2026-08-28T09:59:06.048Z" }, + { url = "https://files.pythonhosted.org/packages/71/9d/881156dc404e27479c4246128d73538464cab4a239bec61995e227644c30/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9c4b71f10dd532fb7a5cbc8f58707779e64f03a258c2bf8bfbaecfcd9970b519", size = 2341866, upload-time = "2026-08-28T09:59:08.539Z" }, + { url = "https://files.pythonhosted.org/packages/5a/38/d66f443a259f84d13babdceae568e572b0ed26da17ca5d0a649ebb110a67/pydantic_core-2.46.5-cp313-cp313-win32.whl", hash = "sha256:97bf8de4d541598c94a59344eeb988a94c08ff76b5723c41f6567ec18c7892ea", size = 1938580, upload-time = "2026-08-28T09:59:10.402Z" }, + { url = "https://files.pythonhosted.org/packages/2c/1e/1d5371213f4cc9a7ed70c0bfcc7911de22311ee99a662a56077d7292d2ac/pydantic_core-2.46.5-cp313-cp313-win_amd64.whl", hash = "sha256:15f4a94963c95accac15b7b657bb177d3ad82bb90b0d0526d9a9b85079925db5", size = 2041980, upload-time = "2026-08-28T09:59:12.396Z" }, + { url = "https://files.pythonhosted.org/packages/5a/48/4222d90b1c67568bace4dec6dca6271449c66de3595d72b6d098f5fde597/pydantic_core-2.46.5-cp313-cp313-win_arm64.whl", hash = "sha256:d22a945598fb91236b4dd793a6e42e4f3dd7740bb5aace5ebd7d4c08d13bb575", size = 1997213, upload-time = "2026-08-28T09:59:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/8e/8a/14596f2a8367da50cf7cbac48169ee5d9c8e11d486a3b527082384630c72/pydantic_core-2.46.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c1c43ad4339643d70ebb8124e1305a7dab423001eff58bb41a0f731adbc98355", size = 2074081, upload-time = "2026-08-28T09:59:16.141Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d5/d8a4eb6d6c7f66b91dd37c576d76e9e60fba900caf5372c17bcf949febc2/pydantic_core-2.46.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1a353f84de772f423b5ffb11d7ae352fbbef0f446f3c0b0af0f8236d7233606e", size = 1920497, upload-time = "2026-08-28T09:59:18.065Z" }, + { url = "https://files.pythonhosted.org/packages/8e/26/092079428f86e927e030b2c0ced87df69dbb1c875cdeaa67bf42ea2be746/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5086029a57366b8cf81b130a43908738095c270c21a8d7f0e8bdfdb89718e2f3", size = 1952130, upload-time = "2026-08-28T09:59:20.476Z" }, + { url = "https://files.pythonhosted.org/packages/08/c3/8ec0e290a9ebaebd64047bf5fda94be835c6b1551b02437e4b76778fbcd7/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46c25dda9d092a06c08db76ffe0a197107904d0dfac653f7d5306bbcd6d6119c", size = 2026371, upload-time = "2026-08-28T09:59:22.227Z" }, + { url = "https://files.pythonhosted.org/packages/01/72/4fd20ad520fb8da0157f95b27a7eb05a72790ef08138e7701ac972c342ea/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:37ea7b83c935e5b0d68c9449b82651accf78a10828b2c02b2f2d9e9496446c21", size = 2202822, upload-time = "2026-08-28T09:59:24.277Z" }, + { url = "https://files.pythonhosted.org/packages/31/b0/d16e0771206b29314f0d52198b720be21e8a99ab2bf11e3bc0d7c9cebdff/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64e88d5585bea9ce95861079de72006c7fa6d3df4e3a3b65ba31eb979c15c9f", size = 2262756, upload-time = "2026-08-28T09:59:26.608Z" }, + { url = "https://files.pythonhosted.org/packages/2c/9b/59634b7ac631c63b2a37760eb6943af3e29573d6b59a4abc5e7f019d4cee/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d510bac3ee52247af28ed4bb18a1e799f040ac60fd2bf5ccd4c92f1fbe786f", size = 2068352, upload-time = "2026-08-28T09:59:29.044Z" }, + { url = "https://files.pythonhosted.org/packages/08/7c/570abb1ad2155348dc754ea91be22e5aaa18eb6d69a6068f7c6f2679a6ed/pydantic_core-2.46.5-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:a2a5e1d0ff29adddc9f6d6821a66302e4493f8ca898b715b6b1182c2c201ea0a", size = 2104777, upload-time = "2026-08-28T09:59:30.95Z" }, + { url = "https://files.pythonhosted.org/packages/8e/25/5bf74adc65a1ac5b7be3f6cb0bcb5433615c1598a801c19d830d84c98ded/pydantic_core-2.46.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03b9666e41e35d8909852ba191a0607520f81b74eaf12ccf8737005dbb313821", size = 2156312, upload-time = "2026-08-28T09:59:32.604Z" }, + { url = "https://files.pythonhosted.org/packages/90/6a/2ef38830675e050121040618135564ed56b860b45433b02d9b4ebece46f3/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:a91c17edf6eea2402cb5457b4c89e99bc5ed1004aa34c4adf1d4258c1a5c22c2", size = 2150067, upload-time = "2026-08-28T09:59:34.453Z" }, + { url = "https://files.pythonhosted.org/packages/90/ef/a7dbb03a14a64c2a4621f989c615ed9a892535a6cad938fc27079f919d80/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b49924c73a235e969511bf2aabdff3beebf9820931f646c80274d5d780010c47", size = 2304516, upload-time = "2026-08-28T09:59:36.194Z" }, + { url = "https://files.pythonhosted.org/packages/68/f8/6bb4c4b80e8a6fde1904c64a51c62a1d04fcdfa3ea521a66b2ddefa1d885/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:2cbd9a5eff05e51c447c34dfa4632145b26b09120cf04bd0c871e44c1a5e1c9a", size = 2335223, upload-time = "2026-08-28T09:59:37.931Z" }, + { url = "https://files.pythonhosted.org/packages/2a/80/f46b8c681195190b2c1f1c7c0a81abce60663e987613e09ef64d433dd96b/pydantic_core-2.46.5-cp314-cp314-win32.whl", hash = "sha256:2d5d76654becf5efd62c9e51c3756c67b49498b0c9a40884934c40807adbd074", size = 1934827, upload-time = "2026-08-28T09:59:39.836Z" }, + { url = "https://files.pythonhosted.org/packages/f7/3c/60674207246bc0a4009d2391b7c7251c7159f279c8d2ab8aae8ef46f3dee/pydantic_core-2.46.5-cp314-cp314-win_amd64.whl", hash = "sha256:fa10ef4112775900e7a0661068635eb67b2ab824fbde764de6e0e21982a93db0", size = 2042648, upload-time = "2026-08-28T09:59:41.792Z" }, + { url = "https://files.pythonhosted.org/packages/69/0c/117c562c7c1babdf44576b72a5e496906506c93690387ecfbca7c729ae2e/pydantic_core-2.46.5-cp314-cp314-win_arm64.whl", hash = "sha256:045ab3b6d308439e32b81cc173bba5b9018bc6ed896afd0c65b3b009b1699af5", size = 1989652, upload-time = "2026-08-28T09:59:43.702Z" }, + { url = "https://files.pythonhosted.org/packages/e8/66/9336ae58f9eb68c41d121894e52c4c89eccb07eb8f602a04ee9c3f37736a/pydantic_core-2.46.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8816f3d218beb4b787de5c9759c259b8fa61f9dec42dc7811f320a33771778b7", size = 2065829, upload-time = "2026-08-28T09:59:45.364Z" }, + { url = "https://files.pythonhosted.org/packages/c5/02/bc19b47a96c2d3109760711acf22369e56bd7e405ca52f7ade164d2ead57/pydantic_core-2.46.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:bce57638e08ac148e5778cce7feb968307a727d66f8e2274a543d0cf0c9ad6a3", size = 1905716, upload-time = "2026-08-28T09:59:47.18Z" }, + { url = "https://files.pythonhosted.org/packages/52/a4/70b47c0509923dd98ccfed04fb3e32ea3849c82a0ff2205bb41009b43c00/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976e1128455aa595ea04c79ccfedff1aaeab96ee013fcc916bed120c4f0ad94f", size = 1934216, upload-time = "2026-08-28T09:59:49.241Z" }, + { url = "https://files.pythonhosted.org/packages/52/ab/aa03b65f7bb198585edf806b906c3223ecf1795543e39e23aec4cce27ad2/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b891faeedeafba41b2983e5001a81b6a915b69544c7e7570d1989ce1c36ac7", size = 2010635, upload-time = "2026-08-28T09:59:51.692Z" }, + { url = "https://files.pythonhosted.org/packages/3c/8b/0da06343f30b84ec549aafd309c6456223d5dc8bd36af504c573faad561d/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f194189415698233dd1114a093a9b56e61e2c57e11b469be3b0506f46f0771c", size = 2209369, upload-time = "2026-08-28T09:59:53.582Z" }, + { url = "https://files.pythonhosted.org/packages/d6/5b/844c4defaa34a3df66eb9257087d121d70c201298b96abdf9f492fc2f1bf/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82a36973cf8a2ef5406f4fe2edbf8ed0c99629535d959e0b100c76a32535a111", size = 2253238, upload-time = "2026-08-28T09:59:55.484Z" }, + { url = "https://files.pythonhosted.org/packages/f4/64/a4e536cb16d7f61a7fd3120b46c577fc7fa7325992f69c4f52bc786d77d8/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdbb78909f52b981d3b2d56b97328d71eb0b974c36bd77c920123a7ebb192829", size = 2065740, upload-time = "2026-08-28T09:59:58.038Z" }, + { url = "https://files.pythonhosted.org/packages/5f/75/aaa38c6bc2d085f6605b34eabdc6a8a4e0b2e61fc9c8e6e52b28e97b3125/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:52e24eacdb536cade636aa90fb851835222becff8484b7001fdc78cb0290f2aa", size = 2087425, upload-time = "2026-08-28T09:59:59.898Z" }, + { url = "https://files.pythonhosted.org/packages/55/ae/fcab4cfc39aba3689e1d20c8b5250ad280957022c09af2ed9cd585602a5e/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:37ae34309d7bd8c0d61ab839668058f2a7962ea1fc51d105d2db228fe0618034", size = 2139306, upload-time = "2026-08-28T10:00:03.057Z" }, + { url = "https://files.pythonhosted.org/packages/2d/f4/f1d03a4bc9d9acbc62f4d742b8a319af52f71885079868b2ff8e48a651ee/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:0cdbada856a1c69a7624a64d3d9aefe79300bd6ef827b43a4f265010b9b55184", size = 2144589, upload-time = "2026-08-28T10:00:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/83/f3/7a53bb1356de514a4cd295f25b6ac39237895620c0462d2592b76c16e114/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:545f26c504b27c3758439a5e6d9349931f0a04f855668d5fe323c89e82300a38", size = 2288882, upload-time = "2026-08-28T10:00:07.931Z" }, + { url = "https://files.pythonhosted.org/packages/cd/94/5a81583660c175c59d49ffb09f4b3a44debeaf86a19fca664ae1cdd9ee32/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:ff218293c9c806138dca139765e3b067621be52bcd93cdc14c7711be7ddc90a9", size = 2335210, upload-time = "2026-08-28T10:00:10.177Z" }, + { url = "https://files.pythonhosted.org/packages/5a/9f/5d685c2693b972d1a59c998586e8823712b66603aeff47ee60a4bdaafd37/pydantic_core-2.46.5-cp314-cp314t-win32.whl", hash = "sha256:97cf3eb53a8cccacf9d46686a0926186c9bfb5574f2ed66d3639d5fe117cd3a9", size = 1921180, upload-time = "2026-08-28T10:00:12.35Z" }, + { url = "https://files.pythonhosted.org/packages/70/12/5c94ee16d65a37a15f9e869f5e6256df111154491173801a4c5e800ab548/pydantic_core-2.46.5-cp314-cp314t-win_amd64.whl", hash = "sha256:d2f9fc07a8042a8f95925b35c4f04f469707c981fc33245b6ca187cf5d2dd290", size = 2020515, upload-time = "2026-08-28T10:00:14.774Z" }, + { url = "https://files.pythonhosted.org/packages/63/19/67830dda664e6bdf9285ee2e40f355d0d7d6b92aa0c42e8d217bb8d33d36/pydantic_core-2.46.5-cp314-cp314t-win_arm64.whl", hash = "sha256:acf8a67ba51f4ca9ddbd0e6b3000a65ac51ab734661778b3e7ba64d99a710f2f", size = 1989276, upload-time = "2026-08-28T10:00:16.984Z" }, + { url = "https://files.pythonhosted.org/packages/df/dd/053c2e4303f791f3b8f8a14ab0b22008e8eb21d868c0c90b4f9be705b76a/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:013d6f3483d81e02e7c328831808f336c8596ee33b4bd4026b9ffb1e960b8942", size = 2062540, upload-time = "2026-08-28T10:01:00.318Z" }, + { url = "https://files.pythonhosted.org/packages/d7/dd/a18df751a5e37dd51bfad7f68e766999125bebe68c9e1d10a493ad01bd63/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:e9c134bb666dd54b778b9fc0d2b50cbb7f979b9e3716f26a88c9ab3b6fc1dd0f", size = 1902040, upload-time = "2026-08-28T10:01:02.529Z" }, + { url = "https://files.pythonhosted.org/packages/b7/13/01d40f9d07ce8a779fd6e0bd8ad4fba91309500dd67b869e2e219d261a6d/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:347ec774390c87326a2e4929d58d3f7e8763a104d5d35f4cd595a4c952366433", size = 1967479, upload-time = "2026-08-28T10:01:05.004Z" }, + { url = "https://files.pythonhosted.org/packages/fa/04/c81d4841331c2178b6fb09ae225425e110ed72d990c9fe556c4ec03d1013/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e24d8f05fa2d28513d94e877e9c75ad66175376209b3977f916e240e623193c", size = 2111034, upload-time = "2026-08-28T10:01:07.345Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/ca/31c57507b13119d7d3cfa1576dad2911a4861e3be07b579395f4e9d393f9/pydantic_settings-2.15.0.tar.gz", hash = "sha256:694b793e84f766ba76a90ebdefc01d0a9a045dab0382bee70393da93712ad117", size = 261253, upload-time = "2026-08-07T09:24:57.419Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/a4/2bffa9f8e804325a09867f0e9d30795c80ea9f8d62560bd1b6ad6220eb2f/pydantic_settings-2.15.0-py3-none-any.whl", hash = "sha256:0ba092c291c94baceb5eff768aa0d56400a457585bc0175925a5a5510303da42", size = 69413, upload-time = "2026-08-07T09:24:55.839Z" }, +] + +[[package]] +name = "pygments" +version = "2.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" }, +] + +[[package]] +name = "pyjwt" +version = "2.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/81/58d0ac84e1ef3a3843791d6954d94c0b33d526c75eeb1efbce9d0a4c4077/pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423", size = 107515, upload-time = "2026-05-21T19:54:36.618Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/5e/ecf12fdb62546d64385c158514e9b2b671f7832108ef2ecd2020ce0af2d1/pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728", size = 31274, upload-time = "2026-05-21T19:54:35.362Z" }, +] + +[package.optional-dependencies] +crypto = [ + { name = "cryptography" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "pytest-asyncio" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/7c/d36d04db312ecf4298932ef77e6e4a9e8ad017906e24e34f0b0c361a2473/pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42", size = 58514, upload-time = "2026-05-26T09:56:04.083Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/e2/08a497ef684b88559c9cc5f4ad53a37e7b99e727094a86d6ea32536d5d3c/pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1", size = 16930, upload-time = "2026-05-26T09:56:02.576Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/53/ed9d74092561d4b01a2ef1349d52cdbc135e526c245f366b089cfca6de49/python_dotenv-1.2.3.tar.gz", hash = "sha256:a20a594dabeaa385725aa239d5244871c143ecb356add8a20fcf23773a6c3a35", size = 58945, upload-time = "2026-08-16T16:54:54.067Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/17/c5c6b53ddc18f297992099b3d9ec16c855c0ccc83263a21fe4d1c625ec6c/python_dotenv-1.2.3-py3-none-any.whl", hash = "sha256:904552145e8bfed22162c09dab1c2b9b54fefa7b23ba780f4f26ca0316b0f0d9", size = 22780, upload-time = "2026-08-16T16:54:52.473Z" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.32" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/42/55c32bb9b12693c092ad250a0e82edb5b31ddeda6eb772de5f308b3804ad/python_multipart-0.0.32.tar.gz", hash = "sha256:be54b7f3fa167bb83e4fcd936b887b708f4e57fe75911c02aebf53efaf8d938e", size = 46881, upload-time = "2026-06-04T16:18:58.647Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/04/e8135ebd1ad02c56ec633277529b2602ff99ff634be76cdba5744cf554fd/python_multipart-0.0.32-py3-none-any.whl", hash = "sha256:ff6d3f776f16878c894e52e107296ffc890e913c611b1a4ec6c44e2821fe2e23", size = 30042, upload-time = "2026-06-04T16:18:57.319Z" }, +] + +[[package]] +name = "pywin32" +version = "312" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/ff/32aa7d2ed0ab12b323aaa64f9b75e6ad4f8fd09f9ccfc28c79414d46838d/pywin32-312-cp312-cp312-win32.whl", hash = "sha256:dab4f65ac9c4e48400a2a0530c46c3c579cd5905ecd11b80692373915269208b", size = 6371877, upload-time = "2026-06-04T07:49:28.836Z" }, + { url = "https://files.pythonhosted.org/packages/03/d9/77040d3b43df3f3be32ea289433d660d2727f5ba327bc73be835127d9d60/pywin32-312-cp312-cp312-win_amd64.whl", hash = "sha256:b457f6d628a47e8a7346ce22acb7e1a46a4a78b52e1d17e1af56871bd19a93bc", size = 6914841, upload-time = "2026-06-04T07:49:31.85Z" }, + { url = "https://files.pythonhosted.org/packages/e3/cc/7b1ec671775756020a0ee7f4feeaf3c568f0ab86bd3900088cf986937a92/pywin32-312-cp312-cp312-win_arm64.whl", hash = "sha256:6017c58e12f6809fbb0555b75df144c2922a9ffd18e4b9b5afa863b6c1a9d950", size = 6727901, upload-time = "2026-06-04T07:49:34.244Z" }, + { url = "https://files.pythonhosted.org/packages/2d/41/12fbfd7f36ed2146d8bc9de96c2741296bf0d490b98508496cff322e274c/pywin32-312-cp313-cp313-win32.whl", hash = "sha256:7a27df850933d16a8eabfbaeb73d52b273e2da667f80d70b01a89d1f6828d02c", size = 6370184, upload-time = "2026-06-04T07:49:36.253Z" }, + { url = "https://files.pythonhosted.org/packages/ba/db/36a78e3403099d31d9746d13fdcde5accc43c1155f375a34d15983a479a7/pywin32-312-cp313-cp313-win_amd64.whl", hash = "sha256:c53e878d15a1c44788082bfe712a905433473aa38f86375b7cf8b45e3acbaaf9", size = 6914298, upload-time = "2026-06-04T07:49:38.876Z" }, + { url = "https://files.pythonhosted.org/packages/84/37/c1697194092b76de9ed47ca124323f02c57ffc8a45c06f88a3d5acaf01eb/pywin32-312-cp313-cp313-win_arm64.whl", hash = "sha256:59aba5d5940842075343a5ddc6b11f1cdf0d1567fe745290359dfbcc7c2eb831", size = 6727640, upload-time = "2026-06-04T07:49:41.083Z" }, + { url = "https://files.pythonhosted.org/packages/fc/2b/1f3cded5822fd49c02f40544cbb5f58c7cfd6b1694869fd476cb6170ee97/pywin32-312-cp314-cp314-win32.whl", hash = "sha256:a77a90fbb6881238d2ca9c6fd797b25817f3768fe78d214a90137ff055a75f5b", size = 6468928, upload-time = "2026-06-04T07:49:43.188Z" }, + { url = "https://files.pythonhosted.org/packages/21/82/3bf86d2e2808902013132e1ce905a7da0da53790f3836c64bf44d55e24f3/pywin32-312-cp314-cp314-win_amd64.whl", hash = "sha256:a4dd3a848290ef724347b19f301045831d8e802fa4464f491b98b1e0a081432e", size = 7024157, upload-time = "2026-06-04T07:49:45.34Z" }, + { url = "https://files.pythonhosted.org/packages/a4/0e/73f6d6800b4f27655abd9e9f6aaeaefcddb2b946e4674efa2bab184a7f7b/pywin32-312-cp314-cp314-win_arm64.whl", hash = "sha256:9fce94568364e0155e6dfb781ac5d95903be8baf28670632beab1b523f300daa", size = 6839598, upload-time = "2026-06-04T07:49:47.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/61/caa39686032d2ebdd04ff0ab5cbe163126c0066d98e00c9018646e42393b/pywin32-312-cp315-cp315-win32.whl", hash = "sha256:5c1fbe4a937a73ae9297384a3da38518cbc694c68ad8a809b2e19acd350f03ed", size = 6471159, upload-time = "2026-06-04T07:49:50.035Z" }, + { url = "https://files.pythonhosted.org/packages/0f/cd/7e1de64a4a6f69c04214169657ccab0d93a670ea50e35eb8f489d7378249/pywin32-312-cp315-cp315-win_amd64.whl", hash = "sha256:c2f03a0f73f804a13c2735b99392b0cd426bb4f2c4d0178e5ac966a0f21618d5", size = 7025293, upload-time = "2026-06-04T07:49:54.857Z" }, + { url = "https://files.pythonhosted.org/packages/23/ed/4532e9388e65fa16b46776ef47ad631a64eda1631884488af707666350ed/pywin32-312-cp315-cp315-win_arm64.whl", hash = "sha256:a8597d28f267b39074aef51fa593530082b39cbe5a074226096857b1fed2dfb9", size = 6840337, upload-time = "2026-06-04T07:49:57.531Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "rpds-py" +version = "2026.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/2a/9618a122aeb2a169a28b03889a2995fe297588964333d4a7d67bdf46e147/rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4", size = 64051, upload-time = "2026-06-30T07:17:53.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/be/2e8974163072e7bab7df1a5acd54c4498e75e35d6d18b864d3a9d5dadc92/rpds_py-2026.6.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0811d33247c3d6128a3001d763f2aa056bb3425204335400ac54f89eec3a0d0", size = 343691, upload-time = "2026-06-30T07:15:14.96Z" }, + { url = "https://files.pythonhosted.org/packages/a4/73/319dfa745dd668efe89309141ded489126461fcecd2b8f3a3cda185129b6/rpds_py-2026.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:538949e262e46caa31ac01bdb3c1e8f642622922cacbabbae6a8445d9dc33eaf", size = 338542, upload-time = "2026-06-30T07:15:16.267Z" }, + { url = "https://files.pythonhosted.org/packages/21/63/4239893be1c4d09b709b1a8f6be4188f0870084ff547f46606b8a75f1b03/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55927d532399c2c646100ff7feb48eaa940ad70f42cd68e1328f3ded9f81ca24", size = 368180, upload-time = "2026-06-30T07:15:17.62Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ca/9c5de382225234ceb37b1844ebdb140db12b2a278bb9efe2fcd19f6c82ce/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f56f1695bc5c0871cbc33dc0130fcf503aab0c57dcc5a6700a4f49eba4f2652e", size = 375067, upload-time = "2026-06-30T07:15:18.952Z" }, + { url = "https://files.pythonhosted.org/packages/87/dc/863f69d1bf04ade34b7fe0d59b9fdf6f0135fe2d7cbca74f1d665589559d/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:270b293dae9058fc9fcedab50f13cebf46fb8ed1d1d54e0521a9da5d6b211975", size = 490509, upload-time = "2026-06-30T07:15:20.434Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ef/eac16a12048b45ec7c7fa94f2be3438a5f26bf9cc8580b18a1cfd609b7f6/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:127565fead0a10943b282957bd5447804ff3160ad79f2ad2635e6d249e380680", size = 382754, upload-time = "2026-06-30T07:15:21.831Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/d2f3f532616be4d06c316ef119683e832bd3d41e112bf3a88f4151c95b17/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecabd69db66de867690f9797f2f8fa27ba501bbc24540cbdbdc649cd15888ba6", size = 366189, upload-time = "2026-06-30T07:15:23.371Z" }, + { url = "https://files.pythonhosted.org/packages/e3/29/41a7b0e98a4b44cd676ab7598419623373eb43b20be68c084935c1a8cf88/rpds_py-2026.6.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:58eadac9cd119677b60e1cf8ac4052f35949d71b8a9e5556efccbe82533cf22a", size = 377750, upload-time = "2026-06-30T07:15:24.659Z" }, + { url = "https://files.pythonhosted.org/packages/2e/05/ecda0bec46f9a1565090bcdc941d023f6a25aff85fda28f89f8d19878152/rpds_py-2026.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7491ee23305ac3eb59e492b6945881f5cd77a6f731061a3f25b77fd40f9e99a4", size = 395576, upload-time = "2026-06-30T07:15:25.987Z" }, + { url = "https://files.pythonhosted.org/packages/68/a8/6ed52f03ee6cb854ce78785cc9a9a672eb880e83fd7224d471f667d151f1/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c99f7e8ccb3dd6e3e4bfeac657a7b208c9bac8075f4b078c02d7404c34107fa", size = 543807, upload-time = "2026-06-30T07:15:27.356Z" }, + { url = "https://files.pythonhosted.org/packages/8f/d6/156c0d3eea27ba09b92562ba2364ba124c0a061b199e17eac637cd25a5e2/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:62698275682bf121181861295c9181e789030a2d516071f5b8f3c23c170cd0fc", size = 611187, upload-time = "2026-06-30T07:15:28.931Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/774212ed989c62f7f310220089f9b0a3fb8f40f5443d1727abd5d9f52bc9/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a214c993455f99a89aaeadc9b21241900037adc9d97203e374d75513c5911822", size = 573030, upload-time = "2026-06-30T07:15:30.553Z" }, + { url = "https://files.pythonhosted.org/packages/c9/50/22f73127a41f1ce4f87fe39aadfb9a126345801c274aa93ae88456249327/rpds_py-2026.6.3-cp312-cp312-win32.whl", hash = "sha256:501f9f04a588d6a09179368c57071301445191767c64e4b52a6aa9871f1ef5ed", size = 202185, upload-time = "2026-06-30T07:15:32.027Z" }, + { url = "https://files.pythonhosted.org/packages/04/3a/f0ee4d4dde9d3b69dedf1b5f74e7a40017046d55052d173e418c6a94f960/rpds_py-2026.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:2c958bf94822e9290a40aaf2a822d4bc5c88099093e3948ad6c571eca9272e5f", size = 220394, upload-time = "2026-06-30T07:15:33.359Z" }, + { url = "https://files.pythonhosted.org/packages/f3/83/3382fe37f809b59f02aac04dbc4e765b480b46ee0227ed516e3bdc4d3dfc/rpds_py-2026.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:22bffe6042b9bcb0822bcd1955ec00e245daf17b4344e4ed8e9551b976b63e96", size = 215753, upload-time = "2026-06-30T07:15:34.778Z" }, + { url = "https://files.pythonhosted.org/packages/a4/9e/b818ee580026ec578138e961027a68820c40afeb1ec8f6819b54fb99e196/rpds_py-2026.6.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3cfe765c1da0072636ca06628261e0ea05688e160d5c8a03e0217c3854037223", size = 343012, upload-time = "2026-06-30T07:15:36.005Z" }, + { url = "https://files.pythonhosted.org/packages/f3/6b/686d9dc4359a8f163cfbbf89ee0b4e586431de22fe8248edb63a8cf50d49/rpds_py-2026.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f4d78253f6996be4901669ad25319f842f740eccf4d58e3c7f3dd39e6dde1d8f", size = 338203, upload-time = "2026-06-30T07:15:37.462Z" }, + { url = "https://files.pythonhosted.org/packages/9e/9b/069aa329940f8207615e091f5eedbbd40e1e15eac68a0790fd05ccdf796c/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f45a148e28767bf343d33a684693c70e451c6f4c0e9904709a723fafbdfc1f", size = 367984, upload-time = "2026-06-30T07:15:39.008Z" }, + { url = "https://files.pythonhosted.org/packages/14/db/34c203e4becff3703e4d3bc121842c00b8689197f398161203a880052f4e/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:842e7b070435622248c7a2c44ae53fa1440e073cc3023bc919fed570884097a7", size = 374815, upload-time = "2026-06-30T07:15:40.253Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7d/8071067d2cc453d916ad836e828c943f575e8a44612537759002a1e07381/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8020133a74bd81b4572dd8e4be028a6b1ebcd70e6726edc3918008c08bee6ee6", size = 490545, upload-time = "2026-06-30T07:15:41.729Z" }, + { url = "https://files.pythonhosted.org/packages/a3/42/da06c5aa8f0484ff07f270787434204d9f4535e2f8c3b51ed402267e63c3/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdc7e35386f3847df728fbcb5e887e2d79c19e2fa1eba9e51b6621d23e3243af", size = 382828, upload-time = "2026-06-30T07:15:43.327Z" }, + { url = "https://files.pythonhosted.org/packages/57/d7/fe978efc2ae50abe48eb7464668ea99f53c010c60aeebb7b35ad27f23661/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acac386b453c2516111b50985d60ce46e7fadb5ea71ae7b25f4c946935bf27cf", size = 365678, upload-time = "2026-06-30T07:15:44.992Z" }, + { url = "https://files.pythonhosted.org/packages/69/9d/1d8922e1990b2a6eb532b6ff53d3e73d2b3bbffc84116c75826bee73dfc6/rpds_py-2026.6.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:425560c6fa0415f27261727bb20bd097568485e5eb0c121f1949417d1c516885", size = 377811, upload-time = "2026-06-30T07:15:46.523Z" }, + { url = "https://files.pythonhosted.org/packages/b1/3d/198dceafb4fb034a6a47347e1b0735d34e0bd4a50be4e898d408ee66cb14/rpds_py-2026.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a550fb4950a06dde3beb4721f5ad4b25bf4513784665b0a8522c792e2bd822a4", size = 395382, upload-time = "2026-06-30T07:15:47.955Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f1/13968e49655d40b6b19d8b9140296bbc6f1d86b3f0f6c346cf9f1adddf4b/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f4bca01b63096f606e095734dd56e74e175f94cfbf24ff3d63281cec61f7bb7", size = 543832, upload-time = "2026-06-30T07:15:49.33Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ab/289bcb1b90bd3e40a2900c561fa0e2087345ecbb094f0b870f2345142b7c/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ccffae9a092a00deb7efd545fe5e2c33c33b88e7c054337e9a74c179347d0b7d", size = 611011, upload-time = "2026-06-30T07:15:50.847Z" }, + { url = "https://files.pythonhosted.org/packages/1e/16/5043105e679436ccfbc8e5e0dd2d663ed18a8b8113515fd06a5e5d77c83e/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1cf01971c4f2c5553b772a542e4aaf191789cd331bc2cd4ff0e6e65ba49e1e97", size = 572431, upload-time = "2026-06-30T07:15:52.394Z" }, + { url = "https://files.pythonhosted.org/packages/85/ed/adab103321c0a6565d5ae1c2998349bc3ee175b82ccc5ae8fc04cc413075/rpds_py-2026.6.3-cp313-cp313-win32.whl", hash = "sha256:8c3d1e9c15b9d51ca0391e13da1a25a0a4df3c58a37c9dc368e0736cf7f69df0", size = 201710, upload-time = "2026-06-30T07:15:53.894Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ed/a03b09668e74e5dabbf2e211f6468e1820c0552f7b0500082da31841bf7b/rpds_py-2026.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:9250a9a0a6fd4648b3f868da8d91a4c52b5811a62df58e753d50ae4454a36f80", size = 219454, upload-time = "2026-06-30T07:15:55.25Z" }, + { url = "https://files.pythonhosted.org/packages/27/17/b8642c12930b71bc2b25831f6708ccf0f75abcd11883932ec9ce54ba3a78/rpds_py-2026.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:900a67df3fd1660b035a4761c4ce73c382ea6b35f90f9863c36c6fd8bf8b09bb", size = 215063, upload-time = "2026-06-30T07:15:56.573Z" }, + { url = "https://files.pythonhosted.org/packages/b6/36/7fbe9dcdaf857fb3f63c2a2284b62492d95f5e8334e947e5fb6e7f68c9be/rpds_py-2026.6.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:931908d9fc855d8f74783377822be318edb6dcb19e47169dc038f9a1bf60b06e", size = 344510, upload-time = "2026-06-30T07:15:57.921Z" }, + { url = "https://files.pythonhosted.org/packages/ba/54/f785cc3d3f60839ca57a5af4927a9f347b07b2799c373fc20f7949f87c7e/rpds_py-2026.6.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7469697dce35be237db177d42e2a2ee26e6dcc5fc052078a6fefabd288c6edd", size = 339495, upload-time = "2026-06-30T07:15:59.238Z" }, + { url = "https://files.pythonhosted.org/packages/63/ef/d4cdaf309e6b095b43597103cf8c0b951d6cca2acce68c474f75ec12e0c7/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcfbcf66006befb9fd2aeaa9e01feaf881b4dc330a02ba07d2322b1c11be7b5d", size = 369454, upload-time = "2026-06-30T07:16:01.021Z" }, + { url = "https://files.pythonhosted.org/packages/96/4a/9559a68b7ee15db09d7981212e8c2e219d2a1d6d4faa0391d813c3496a36/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847927daf4cffbd4e90e42bc890069897101edd015f956cb8721b3473372edda", size = 374583, upload-time = "2026-06-30T07:16:02.287Z" }, + { url = "https://files.pythonhosted.org/packages/ef/75/8964aa7d2c6e8ac43eba8eb6e6b0fdda1f46d39f2fc3e6aa9f2cb17f485d/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aca6c1ef08a82bfe327cc156da694660f599923e2e6665b6d81c9c2d0ac9ffc8", size = 492919, upload-time = "2026-06-30T07:16:03.723Z" }, + { url = "https://files.pythonhosted.org/packages/8f/97/6908094ac804115e65aedfd90f1b5fee4eebebd3f6c4cfc5419939267565/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae50181a047c871561212bb97f7932a2d45fb53e947bd9b57ebad85b529cbc53", size = 383725, upload-time = "2026-06-30T07:16:05.305Z" }, + { url = "https://files.pythonhosted.org/packages/d1/9c/0d1fdc2e7aba23e290d603bc494e97bd205bae262ce33c6b32a69768ed5e/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc319e5a1de4b6913aac94bf6a2f9e847371e0a140a43dd4991db1a09bc2d504", size = 367255, upload-time = "2026-06-30T07:16:07.086Z" }, + { url = "https://files.pythonhosted.org/packages/c4/fe/f0209ca4a9ed074bc8acb44dfd0e81c3122e94c9689f5645b7973a866719/rpds_py-2026.6.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e4316bf32babbed84e691e352faf967ce2f0f024174a8643c37c94a1080374fc", size = 379060, upload-time = "2026-06-30T07:16:08.525Z" }, + { url = "https://files.pythonhosted.org/packages/c6/8d/f1cc54c616b9d8897de8738aac148d20afca93f68187475fe194d09a71b9/rpds_py-2026.6.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c6e5a2f750cc71c3e3b11d71661f21d6f9bc6cebc6564b1466417a1ec03ec77", size = 395960, upload-time = "2026-06-30T07:16:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/fb/04/aafff00f73aeca2945f734f1d483c64ab8f472d0864ab02377fd8e89c3b2/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4470ce197d4090875cf6affbf1f853338387428df97c4fb7b7106317b8214698", size = 545356, upload-time = "2026-06-30T07:16:11.816Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cc/e229663b9e4ddac5a4acbe9085dd80a71af2a5d356b8b39d6bff233f24b0/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea964164cc9afa72d4d9b23cc28dafae93693c0a53e0b42acbff15b22c3f9ddd", size = 612319, upload-time = "2026-06-30T07:16:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7a/8a0e6d3e6cd066af108b71b43122c3fe158dd9eb86acac626593a2582eb1/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:639c8929aa0afe81be836b04de888460d6bed38b9c54cfc18da8f6bfabf5af5d", size = 573508, upload-time = "2026-06-30T07:16:15.23Z" }, + { url = "https://files.pythonhosted.org/packages/87/03/2a69ab618a789cf6cf85c86bb844c62d090e700ab1a2aa676b3741b6c516/rpds_py-2026.6.3-cp314-cp314-win32.whl", hash = "sha256:882076c00c0a608b131187055ddc5ae29f2e7eaf870d6168980420d58528a5c8", size = 202504, upload-time = "2026-06-30T07:16:16.893Z" }, + { url = "https://files.pythonhosted.org/packages/85/62/a3892ba945f4e24c78f352e5de3c7620d8479f73f211406a97263d13c7d2/rpds_py-2026.6.3-cp314-cp314-win_amd64.whl", hash = "sha256:0be972be84cfcaf46c8c6edf690ca0f154ac17babf1f6a955a51579b34ad2dc5", size = 220380, upload-time = "2026-06-30T07:16:18.108Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e7/c2bd44dc831931815ad11ebb5f430b5a0a4d3caa9de837107876c30c3432/rpds_py-2026.6.3-cp314-cp314-win_arm64.whl", hash = "sha256:2a9c6f195058cb45335e8cc3802745c603d716eb96bc9625950c1aac71c0c703", size = 215976, upload-time = "2026-06-30T07:16:19.654Z" }, + { url = "https://files.pythonhosted.org/packages/79/9c/fff7b74bce9a091ec9a012a03f9ff5f69364eaf9451060dfc4486da2ffdd/rpds_py-2026.6.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:f90938e92afda60266da758ee7d363447f7f0138c9559f9e1811629580582d90", size = 346840, upload-time = "2026-06-30T07:16:21.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/44/77bcb1168b33704908295533d27f10eb811e9e3e193e8993dc99572211d3/rpds_py-2026.6.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec829541c45bca16e61c7ae50c20501f213605beb75d1aba91a6ee37fbbb56a4", size = 340282, upload-time = "2026-06-30T07:16:22.875Z" }, + { url = "https://files.pythonhosted.org/packages/87/3c/7a9081c7c9e645b39efe19e4ffbeccd80add246327cd9b888aecffd72317/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd70d95892096cdb26f15a00c45907b17817577aa8d1c76b2dcc2788391f9e9", size = 370403, upload-time = "2026-06-30T07:16:24.415Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/af47021eb7dad6ff3396cb001c08f0f3c4d06c20253f75be6421a59fe6b7/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29dfa0533a5d4c94d4dfa1b694fcb56c9c63aad8330ffdd816fd225d0a7a162f", size = 376055, upload-time = "2026-06-30T07:16:26.111Z" }, + { url = "https://files.pythonhosted.org/packages/81/fc/a3bcf517084396a6dd258c592567a3c011ba4557f2fde23dceaf26e74f2e/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af05d726809bff6b141be124d4c7ce998f9c9c7f30edb1f46c07aa103d540b41", size = 494419, upload-time = "2026-06-30T07:16:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/c9/eb/13d529d1788135425c7bf207f8463458ca5d92e43f3f701365b83e9dffc1/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9826217f048f620d9a712672818bf231442c1b35d96b227a07eabd11b4bb6945", size = 384848, upload-time = "2026-06-30T07:16:29.183Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f4/b7ac49f30013aba8f7b9566b1dd07e81de95e708c1374b7bacc5b9bc5c9c/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536bceea4fa4acf7e1c61da2b5786304367c816c8895be71b8f537c480b0ea1f", size = 371369, upload-time = "2026-06-30T07:16:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/31/86/6260bafa622f788b07ddec0e52d810305c8b9b0b8c27f58a2ab04bf62b4f/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:bc0011654b91cc4fb2ae701bec0a0ba1e552c0714247fa7af6c59e0ccfa3a4e1", size = 379673, upload-time = "2026-06-30T07:16:32.486Z" }, + { url = "https://files.pythonhosted.org/packages/19/c3/03f1ee79a047b48daeca157c89a18509cde22b6b951d642b9b0af1be660a/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:539d75de9e0d536c84ff18dfeb805398e58227001ce09231a26a08b9aed1ee0e", size = 397500, upload-time = "2026-06-30T07:16:34.471Z" }, + { url = "https://files.pythonhosted.org/packages/f0/95/8ed0cd8c377dca12aea498f119fe639fc474d1461545c39d2b5872eb1c0f/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:166cf54d9f44fc6ceb53c7860258dde44a81406646de79f8ed3234fca3b6e538", size = 545978, upload-time = "2026-06-30T07:16:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f2/0eb57f0eaa83f8fc152a7e03de968ab77e1f00732bebc892b190c6eebde7/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:d34c20167764fbcf927194d532dd7e0c56772f0a5f943fa5ef9e9afbba8fb9db", size = 613350, upload-time = "2026-06-30T07:16:38.213Z" }, + { url = "https://files.pythonhosted.org/packages/5b/de/e0674bdbc3ef7634989b3f854c3f34bc1f587d36e5bfdc5c378d57034619/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea7bb13b7c9a29791f87a0387ba7d3ad3a6d783d827e4d3f27b40a0ff44495e2", size = 576486, upload-time = "2026-06-30T07:16:39.797Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f6/21101359743cd136ada781e8210a85769578422ba460672eea0e29739200/rpds_py-2026.6.3-cp314-cp314t-win32.whl", hash = "sha256:6de4744d05bd1aa1be4ed7ea1189e3979196808008113bbbf899a460966b925e", size = 201068, upload-time = "2026-06-30T07:16:41.316Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b2/9574d4d44f7760c2aa32d92a0a4f41698e33f5b204a0bf5c9758f52c79d5/rpds_py-2026.6.3-cp314-cp314t-win_amd64.whl", hash = "sha256:c7b9a2f8f4d8e90af72571d3d495deebdd7e3c75451f5b41719aee166e940fc2", size = 220600, upload-time = "2026-06-30T07:16:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/08/ae/f23a2697e6ee6340a578b0f136be6483657bef0c6f9497b752bb5c0964bb/rpds_py-2026.6.3-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:e059c5dde6452b44424bd1834557556c226b57781dee1227af23518459722b13", size = 344726, upload-time = "2026-06-30T07:16:44.5Z" }, + { url = "https://files.pythonhosted.org/packages/c3/63/e7b3a1a5358dd32c930a1062d8e15b67fd6e8922e81df9e91706d66ee5c8/rpds_py-2026.6.3-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2f7c26fbc5acd2522b95d4177fe4710ffd8e9b20529e703ffbf8db4d93903f05", size = 339587, upload-time = "2026-06-30T07:16:46.255Z" }, + { url = "https://files.pythonhosted.org/packages/ec/64/10a85681916ca55fffb91b0a211f84e34297c109243484dd6394660a8a7c/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3086b538543802f84c843911242db20447de00d8752dd0efc936dbcf02218ba", size = 369585, upload-time = "2026-06-30T07:16:48.101Z" }, + { url = "https://files.pythonhosted.org/packages/76/c2/baf95c7c38823e12ba34407c5f5767a89e5cf2233895e56f608167ae9493/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2e5c5ee828d42cb11760761c0af6507927bec42d0ad5458f97c9203b054617", size = 375479, upload-time = "2026-06-30T07:16:49.93Z" }, + { url = "https://files.pythonhosted.org/packages/6a/94/0aad06c72d65101e11d33528d438cda99a39ce0da99466e156158f2541d3/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0c1e5d10cdc7135537988c74a0188da68e2f3c30813ba3744ab1e42e0480f9", size = 492418, upload-time = "2026-06-30T07:16:51.641Z" }, + { url = "https://files.pythonhosted.org/packages/b5/17/de3f5a479a1f056535d7489819639d8cd591ea6281d700390b43b1abd745/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c2642a7603ec0b16ed77da4555db3b4b472341904873788327c0b0d7b95f1bb", size = 384123, upload-time = "2026-06-30T07:16:53.622Z" }, + { url = "https://files.pythonhosted.org/packages/46/7d/bf09bd1b145bb2671c03e1e6d1ab8651858d90d8c7dfeadd85a37a934fd8/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4320744c1ffdd95a603def63344bfab2d33edeab301c5007e7de9f9f5b3885", size = 367351, upload-time = "2026-06-30T07:16:55.241Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ea/1bb734f314b8be319149ddee80b18bd41372bdcfbdf88d28131c0cd37719/rpds_py-2026.6.3-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:a9f4645593036b81bbdb36b9c8e0ea0d1c3fee968c4d59db0344c14087ef143a", size = 378827, upload-time = "2026-06-30T07:16:56.841Z" }, + { url = "https://files.pythonhosted.org/packages/4b/93/d9611e5b25e26df9a3649813ed66193ace9347a7c7fc4ab7cf70e94851c0/rpds_py-2026.6.3-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e55d236be29255554da47abe5c577637db7c24a02b8b46f0ca9524c855801868", size = 395966, upload-time = "2026-06-30T07:16:58.557Z" }, + { url = "https://files.pythonhosted.org/packages/c3/cb/99d77e16e5534ae1d90629bbe419ba6ee170833a6a85e3aa1cc41726fbbc/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:24e9c5386e16669b674a69c156c8eeefcb578f3b3397b713b08e6d60f3c7b187", size = 545680, upload-time = "2026-06-30T07:17:00.164Z" }, + { url = "https://files.pythonhosted.org/packages/59/15/11a29755f790cef7a2f755e8e14f4f0c33f39489e1893a632a2eee59672b/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:c60924535c75f1566b6eb75b5c31a48a43fef04fa2d0d201acbad8a9969c6107", size = 611853, upload-time = "2026-06-30T07:17:01.962Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/0c27547e21644da938fb530f7e1a8148dd24d02db07e7a5f2567a17ce710/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:38a2fea2787428f811719ceb9114cb78964a3138838320c29ac39526c79c16ba", size = 573715, upload-time = "2026-06-30T07:17:03.693Z" }, + { url = "https://files.pythonhosted.org/packages/29/71/4d8fcf700931815594bce892255bbd973b94efaf0fc1932b0590df18d886/rpds_py-2026.6.3-cp315-cp315-win32.whl", hash = "sha256:d483fe17f01ad64b7bf7cc38fcefff1ca9fb83f8c2b2542b68f97ffe0611b369", size = 202864, upload-time = "2026-06-30T07:17:05.746Z" }, + { url = "https://files.pythonhosted.org/packages/eb/62/b577562de0edbb55b2be85ce5fd09c33e386b9b13eee09833af4240fd5c4/rpds_py-2026.6.3-cp315-cp315-win_amd64.whl", hash = "sha256:67e3a721ffc5d8d2210d3671872298c4a84e4b8035cfe42ffd7cde35d772b146", size = 220430, upload-time = "2026-06-30T07:17:07.471Z" }, + { url = "https://files.pythonhosted.org/packages/c8/95/d6d0b2509825141eef60669a5739eec88dbc6a48053d6c92993a5704defe/rpds_py-2026.6.3-cp315-cp315-win_arm64.whl", hash = "sha256:6e84adbcf4bf841aed8116a8264b9f50b4cb3e7bd89b516122e616ac56ca269e", size = 215877, upload-time = "2026-06-30T07:17:09.008Z" }, + { url = "https://files.pythonhosted.org/packages/b7/bf/f3ea278f0afd615c1d0f19cb69043a41526e2bb600c2b536eb192218eb27/rpds_py-2026.6.3-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:ae6dd8f10bd17aad820876d24caec9efdafd80a318d16c0a48edb5e136902c6b", size = 346933, upload-time = "2026-06-30T07:17:10.762Z" }, + { url = "https://files.pythonhosted.org/packages/9d/29/9907bdf1c5346763cf10b7f6852aad86652168c259def904cbe0082c5864/rpds_py-2026.6.3-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:bdbd97738551fca3917c1bd7188bec1920bb520104f28e7e1007f9ceb17b7690", size = 340274, upload-time = "2026-06-30T07:17:12.266Z" }, + { url = "https://files.pythonhosted.org/packages/6f/2c/8e03767b5778ef25cebf74a7a91a2c3806f8eced4c92cb7406bbe060756d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b95977e7211527ab0ba576e286d023389fbeeb32a6b7b771665d333c60e5342", size = 370763, upload-time = "2026-06-30T07:17:14.107Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e1/df2a7e1ba2efd796af26194250b8d42c821b46592311595162af9ef0528d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15fde0e6fb0d88a60d221204873743e5d9f0b7d29165e62cd86d0413ad74ba6", size = 376467, upload-time = "2026-06-30T07:17:15.76Z" }, + { url = "https://files.pythonhosted.org/packages/6b/de/8a0814d1946af29cb068fb259aa8622f856df1d0bab58429448726b537f5/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a136d453475ac0fcbda502ef1e6504bd28d6d904700915d278deeab0d00fe140", size = 496689, upload-time = "2026-06-30T07:17:17.308Z" }, + { url = "https://files.pythonhosted.org/packages/df/f3/f19e0c852ba13694f5a79f3b719331051573cb5693feacf8a88ffffc3a71/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f826877d462181e5eb1c26a0026b8d0cab05d99844ecb6d8bf3627a2ca0c0442", size = 385340, upload-time = "2026-06-30T07:17:18.928Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ae/7ec3a9d2d4351f99e37bcb06b6b6f954512646bfdbf9742e1de727865daf/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79486287de1730dbaff3dbd124d0ca4d2ef7f9d29bf2544f1f93c09b5bcbbd12", size = 372179, upload-time = "2026-06-30T07:17:20.539Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ac/9cee911dff2aaa9a5a8354f6610bf2e6a616de9197c5fff4f54f82585f1e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:808345f53cb952433ca2816f1604ff3515608a81784954f38d4452acfe8e61d5", size = 379993, upload-time = "2026-06-30T07:17:22.212Z" }, + { url = "https://files.pythonhosted.org/packages/83/6b/7c2a07ba88d1e9a936612f7a5d067467ed03d971d5a06f7d309dff044a7e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1967debc37f64f2c4dc90a7f563aec558b471966e12adcac4e1c4240496b6ebf", size = 398909, upload-time = "2026-06-30T07:17:23.66Z" }, + { url = "https://files.pythonhosted.org/packages/97/0b/776ffcb66783637b0031f6d58d6fb55913c8b5abf00aeecd46bf933fb477/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:f0840b5b17057f7fd918b76183a4b5a0635f43e14eb2ce60dce1d4ee4707ea00", size = 546584, upload-time = "2026-06-30T07:17:25.264Z" }, + { url = "https://files.pythonhosted.org/packages/55/33/ba3bc04d7092bd553c9b2b195624992d2cc4f3de1f380b7b93cbee67bd79/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:faa679d19a6696fd54259ad321251ad77a13e70e03dd834daa762a44fb6196ef", size = 614357, upload-time = "2026-06-30T07:17:26.888Z" }, + { url = "https://files.pythonhosted.org/packages/8b/71/14edf065f04630b1a8472f7653cad03f6c478bcf95ea0e6aed55451e33ea/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:23a439f31ccbeff1574e24889128821d1f7917470e830cf6544dced1c662262a", size = 576533, upload-time = "2026-06-30T07:17:28.546Z" }, + { url = "https://files.pythonhosted.org/packages/ba/76/65002b08596c389105720a8c0d22298b8dc25a4baf89b2ce431343c8b1de/rpds_py-2026.6.3-cp315-cp315t-win32.whl", hash = "sha256:913ca42ccad3f8cc6e292b587ae8ae49c8c823e5dce51a736252fc7c7cdfa577", size = 201204, upload-time = "2026-06-30T07:17:30.193Z" }, + { url = "https://files.pythonhosted.org/packages/8c/97/d855d6b3c322d1f27e26f5241c42016b56cf01377ea8ed348285f54652f0/rpds_py-2026.6.3-cp315-cp315t-win_amd64.whl", hash = "sha256:ae3d4fe8c0b9213624fdce7279d70e3b148b682ca20719ebd193a23ebfa47324", size = 220719, upload-time = "2026-06-30T07:17:31.788Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sse-starlette" +version = "3.4.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "starlette" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/00/b42a44342a054d58cb1115d7c8aa9cb4290dd9442f9c1b91a4b8173dba22/sse_starlette-3.4.8.tar.gz", hash = "sha256:ed89ffbb75cbf78a5fe2f2109cd584792ee7f9dfac96f791db546df8f15f3f9c", size = 32548, upload-time = "2026-08-05T11:19:49.982Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/3a/764912c58293d95b6dcdf4cc255f9d10de310580ced547b082eb9d72018c/sse_starlette-3.4.8-py3-none-any.whl", hash = "sha256:6e82314c786709a3cd9520f2285cf9fff90e181e598e8a357b0cf80f66afba0d", size = 16516, upload-time = "2026-08-05T11:19:48.748Z" }, +] + +[[package]] +name = "starlette" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/b4/205b0d5241d934e8add0c38aa924c4f9fb7330834ff11e5444db964ec3f9/starlette-1.6.0.tar.gz", hash = "sha256:d4e3ac5e546444960c710297a3c9fc3f7ebae1b7e963f3d36173b49da535be9b", size = 2716969, upload-time = "2026-08-08T18:27:57.512Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/cb/6a6a47d5b464bd08695d254f3da6e7986cc70c9fa5d778eda57538edfe56/starlette-1.6.0-py3-none-any.whl", hash = "sha256:a86dd39d14bb45f85a3d18525215a9ef0cfd1f192ac793220e72598c90335f0c", size = 75969, upload-time = "2026-08-08T18:27:56.196Z" }, +] + +[[package]] +name = "tokenizers" +version = "0.23.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c1/60/21f715d9faba5f5407ff759472ade058ec4a507ad62bcea47cb847239a73/tokenizers-0.23.1.tar.gz", hash = "sha256:1feeeadf865a7915adc25445dea30e9933e593c31bb96c277cee36de227c8bfa", size = 365748, upload-time = "2026-04-27T14:43:25.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/39/b87a87d5bb9470610b80a2d31df42fcffeaf35118b8b97952b2aff598cc7/tokenizers-0.23.1-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e03d6ffcbe0d56ee9c1ccd070e70a13fa750727c0277e138152acbc0252c2224", size = 3146732, upload-time = "2026-04-27T14:43:15.427Z" }, + { url = "https://files.pythonhosted.org/packages/e2/6a/068ed9f6e444c9d7e9d55ce134181325700f3d7f30410721bdc8f848d727/tokenizers-0.23.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:e0948bbb1ac1d7cdfc9fb6d62c596e3b7550036ad60ecd654a66ad273326324e", size = 3054954, upload-time = "2026-04-27T14:43:13.745Z" }, + { url = "https://files.pythonhosted.org/packages/6c/36/e006edf031154cba92b8416057d92c3abe3635e4c4b0aa0b5b9bb39dde70/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf13402aff9bc533c89cb849ec3b412dc3fbeacc9744840e423d7bf3f7dc0e3", size = 3374081, upload-time = "2026-04-27T14:43:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/a2/ef/7735d226f9c7f874a6bee5e3f27fb25ecabdf207d37b8cf45286d0795893/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f836ca703b89ae07919a309f9651f7a88fd5a33d5f718ba5ad0870ec0256bad6", size = 3247641, upload-time = "2026-04-27T14:43:03.856Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d9/24827036f6e21297bfffda0768e58eb6096a4f411e932964a01707857931/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae848657742035523fdf261773630cb819a26995fcd3d9ecae0c1daf6e5a4959", size = 3585624, upload-time = "2026-04-27T14:43:10.664Z" }, + { url = "https://files.pythonhosted.org/packages/0c/9a/22f3582b3a4f49358293a5206e25317621ee4526bfe9cdaa0f07a12e770e/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53b09e85775d5187941e7bab30e941b4134ab4a7dd8c68e783d231fb7ca27c51", size = 3844062, upload-time = "2026-04-27T14:43:05.643Z" }, + { url = "https://files.pythonhosted.org/packages/7e/65/b8f8814eef95800f20721384136d9a1d22241d50b2874357cb70542c392f/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea5a0ce170074329faaa8ea3f6400ecde604b6678192688533af80980daae71a", size = 3460098, upload-time = "2026-04-27T14:43:08.854Z" }, + { url = "https://files.pythonhosted.org/packages/0d/d5/1353e5f677ec27c2494fb6a6725e82d56c985f53e90ec511369e7e4f02c6/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5075b405006415ea148a992d093699c66eb01952bf59f4d5727089a98bda45a4", size = 3346235, upload-time = "2026-04-27T14:43:12.377Z" }, + { url = "https://files.pythonhosted.org/packages/71/89/39b6b8fc073fb6d413d0147aa333dc7eff7be65639ac9d19930a0b21bf33/tokenizers-0.23.1-cp310-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:56f3a77de629917652f876294dc9fe6bad4a0c43bc229dc72e59bb23a0f4729a", size = 3426398, upload-time = "2026-04-27T14:43:07.264Z" }, + { url = "https://files.pythonhosted.org/packages/0f/80/127c854da64827e5b79264ce524993a90dddcb320e5cd42412c5c02f9e8a/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9d10a6d957ef01896dc274e890eee27d41bd0e74ef31e60616f0fc311345184e", size = 9823279, upload-time = "2026-04-27T14:43:17.222Z" }, + { url = "https://files.pythonhosted.org/packages/fe/ba/44c2502feb1a058f096ddfb4e0996ef3225a01a388e1a9b094e91689fe93/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:1974288a609c343774f1b897c8b482c791ab17b75ab5c8c2b1737565c1d82288", size = 9644986, upload-time = "2026-04-27T14:43:19.45Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c1/464019a9fb059870bfe4eebb4ba12208f3042035e258bf5e782906bd3847/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:120468fb4c24faf0543c835a4fabafa4deb3f20a035c9b6e83d0b553a97615d4", size = 9976181, upload-time = "2026-04-27T14:43:21.463Z" }, + { url = "https://files.pythonhosted.org/packages/79/94/3ac1432bda31626071e9b6a12709b97ae05131c804b94c8f3ac622c5da32/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e3d8f40ea6268047de7046906326abed5134f27d4e8447b23763afe5808c8a96", size = 10113853, upload-time = "2026-04-27T14:43:23.617Z" }, + { url = "https://files.pythonhosted.org/packages/6a/dd/631b21433c771b1382535326f0eca80b9c9cee2e64961dd993bc9ac4669e/tokenizers-0.23.1-cp310-abi3-win32.whl", hash = "sha256:93120a930b919416da7cd10a2f606ac9919cc69cacae7980fa2140e277660948", size = 2536263, upload-time = "2026-04-27T14:43:29.888Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/2553f72aaf65a2797d4229e37fa7fbe38ffbf3e32912d31bdd78b3323e59/tokenizers-0.23.1-cp310-abi3-win_amd64.whl", hash = "sha256:e7bfaf995c1bdbbd21d13539decb6650967013759318627d85daeb7881af16b7", size = 2798223, upload-time = "2026-04-27T14:43:28.51Z" }, + { url = "https://files.pythonhosted.org/packages/cd/2b/2be299bab55fc595e3d38567edb1a87f86e594842968fa9515a07bdcf422/tokenizers-0.23.1-cp310-abi3-win_arm64.whl", hash = "sha256:a26197957d8e4425dfba746315f3c425ea00cfa8367c5fbc4ec73447893dcea9", size = 2664127, upload-time = "2026-04-27T14:43:26.949Z" }, +] + +[[package]] +name = "tqdm" +version = "4.70.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/3b/6c24bec5be5e743ffd99576daa5cc077722fc7d5bbc00bd133fa0c698dc6/tqdm-4.70.0.tar.gz", hash = "sha256:55b0b0dbd97462d06ebee91e4dac24ed4d4702be82b24f07e6c1d27e08cea220", size = 795438, upload-time = "2026-07-27T11:33:15.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/1c/01bfd571a64e7f270e6bab5e33777debe0edc56759233ce84f27dec92d14/tqdm-4.70.0-py3-none-any.whl", hash = "sha256:7f585706bfddbdebf89daac705b2dfcc16890130727d3197ca62c732b4310953", size = 80184, upload-time = "2026-07-27T11:33:13.167Z" }, +] + +[[package]] +name = "truststore" +version = "0.10.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/a3/1585216310e344e8102c22482f6060c7a6ea0322b63e026372e6dcefcfd6/truststore-0.10.4.tar.gz", hash = "sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301", size = 26169, upload-time = "2025-08-12T18:49:02.73Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/97/56608b2249fe206a67cd573bc93cd9896e1efb9e98bce9c163bcdc704b88/truststore-0.10.4-py3-none-any.whl", hash = "sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981", size = 18660, upload-time = "2025-08-12T18:49:01.46Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/26/b09b8010994eccc3c09092e6b34058f36a460eea2d4c3e8b910c695975a0/typing_inspection-0.4.4.tar.gz", hash = "sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47", size = 76928, upload-time = "2026-08-12T12:37:25.997Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", hash = "sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147", size = 14750, upload-time = "2026-08-12T12:37:24.648Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.52.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/0f/3f86e61397dd33bf2ccf28188c40db6a740658aeebbbf6e7dbc101a1f487/uvicorn-0.52.4.tar.gz", hash = "sha256:73acfee47a0b133c5de13d219492d62d8a31e935f4fe6e41a232451a15379f86", size = 100627, upload-time = "2026-08-19T06:27:41.821Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/79/4a20b54ab0491485ccd8c077db2d39187c7f12b3e15485d38a7be37c81b4/uvicorn-0.52.4-py3-none-any.whl", hash = "sha256:f86e41a149d7d05a9969337e3946a9c171c06a5d42680896daaba624aeac8da1", size = 79871, upload-time = "2026-08-19T06:27:40.36Z" }, +] + +[[package]] +name = "win32-setctime" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload-time = "2024-12-07T15:28:28.314Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload-time = "2024-12-07T15:28:26.465Z" }, +] diff --git a/vendor/elabapi-python/PKG-INFO b/vendor/elabapi-python/PKG-INFO new file mode 100644 index 0000000..2d9de4d --- /dev/null +++ b/vendor/elabapi-python/PKG-INFO @@ -0,0 +1,19 @@ +Metadata-Version: 2.4 +Name: elabapi-python +Version: 5.6.1 +Summary: eLabFTW REST API v2 Documentation +Home-page: https://github.com/elabftw/elabapi-python +Author-email: +Keywords: Swagger,eLabFTW REST API v2 Documentation +Requires-Dist: urllib3>=1.15 +Requires-Dist: six>=1.10 +Requires-Dist: certifi +Requires-Dist: python-dateutil +Dynamic: description +Dynamic: home-page +Dynamic: keywords +Dynamic: requires-dist +Dynamic: summary + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + diff --git a/vendor/elabapi-python/README.md b/vendor/elabapi-python/README.md new file mode 100644 index 0000000..db5faed --- /dev/null +++ b/vendor/elabapi-python/README.md @@ -0,0 +1,417 @@ +# elabapi-python +This document describes all available endpoints and methods for eLabFTW's API version 2. + +This Python package is automatically generated by the [Swagger Codegen](https://github.com/swagger-api/swagger-codegen) project: + +- API version: 2.0.0 +- Package version: 5.6.1 +- Build package: io.swagger.codegen.v3.generators.python.PythonClientCodegen + +## Requirements. + +Python 2.7 and 3.4+ + +## Installation & Usage +### pip install + +If the python package is hosted on Github, you can install directly from Github + +```sh +pip install git+https://github.com/elabftw/elabapi-python.git +``` +(you may need to run `pip` with root permission: `sudo pip install git+https://github.com/elabftw/elabapi-python.git`) + +Then import the package: +```python +import elabapi_python +``` + +### Setuptools + +Install via [Setuptools](http://pypi.python.org/pypi/setuptools). + +```sh +python setup.py install --user +``` +(or `sudo python setup.py install` to install the package for all users) + +Then import the package: +```python +import elabapi_python +``` + +## Getting Started + +Please follow the [installation procedure](#installation--usage) and then run the following: + +```python +from __future__ import print_function +import time +import elabapi_python +from elabapi_python.rest import ApiException +from pprint import pprint + +# Configure API key authorization: token +configuration = elabapi_python.Configuration() +configuration.api_key['Authorization'] = 'YOUR_API_KEY' +# Uncomment below to setup prefix (e.g. Bearer) for API key, if needed +# configuration.api_key_prefix['Authorization'] = 'Bearer' + +# create an instance of the API class +api_instance = elabapi_python.ApiKeysApi(elabapi_python.ApiClient(configuration)) +id = 56 # int | ID of the API key + +try: + # Delete an API key. + api_instance.delete_apikey(id) +except ApiException as e: + print("Exception when calling ApiKeysApi->delete_apikey: %s\n" % e) + +# Configure API key authorization: token +configuration = elabapi_python.Configuration() +configuration.api_key['Authorization'] = 'YOUR_API_KEY' +# Uncomment below to setup prefix (e.g. Bearer) for API key, if needed +# configuration.api_key_prefix['Authorization'] = 'Bearer' + +# create an instance of the API class +api_instance = elabapi_python.ApiKeysApi(elabapi_python.ApiClient(configuration)) + +try: + # Read API keys + api_response = api_instance.get_apikeys() + pprint(api_response) +except ApiException as e: + print("Exception when calling ApiKeysApi->get_apikeys: %s\n" % e) + +# Configure API key authorization: token +configuration = elabapi_python.Configuration() +configuration.api_key['Authorization'] = 'YOUR_API_KEY' +# Uncomment below to setup prefix (e.g. Bearer) for API key, if needed +# configuration.api_key_prefix['Authorization'] = 'Bearer' + +# create an instance of the API class +api_instance = elabapi_python.ApiKeysApi(elabapi_python.ApiClient(configuration)) +body = elabapi_python.ApikeysBody() # ApikeysBody | (optional) + +try: + # Create an API key + api_instance.post_apikeys(body=body) +except ApiException as e: + print("Exception when calling ApiKeysApi->post_apikeys: %s\n" % e) +``` + +## Documentation for API Endpoints + +All URIs are relative to *https://elab.local:3148/api/v2* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +*ApiKeysApi* | [**delete_apikey**](docs/ApiKeysApi.md#delete_apikey) | **DELETE** /apikeys/{id} | Delete an API key. +*ApiKeysApi* | [**get_apikeys**](docs/ApiKeysApi.md#get_apikeys) | **GET** /apikeys | Read API keys +*ApiKeysApi* | [**post_apikeys**](docs/ApiKeysApi.md#post_apikeys) | **POST** /apikeys | Create an API key +*BrandingApi* | [**get_instance_branding**](docs/BrandingApi.md#get_instance_branding) | **GET** /instance/branding/{id} | Read a branding asset as a binary file. +*BrandingApi* | [**post_instance_branding**](docs/BrandingApi.md#post_instance_branding) | **POST** /instance/branding/{id} | Update a branding asset. +*CommentsApi* | [**delete_entity_comment**](docs/CommentsApi.md#delete_entity_comment) | **DELETE** /{entity_type}/{id}/comments/{subid} | Delete an entity comment. +*CommentsApi* | [**patch_entity_comment**](docs/CommentsApi.md#patch_entity_comment) | **PATCH** /{entity_type}/{id}/comments/{subid} | Modify an entity comment. +*CommentsApi* | [**post_entity_comments**](docs/CommentsApi.md#post_entity_comments) | **POST** /{entity_type}/{id}/comments | Create a comment. +*CommentsApi* | [**read_entity_comment**](docs/CommentsApi.md#read_entity_comment) | **GET** /{entity_type}/{id}/comments/{subid} | Read a comment of that entity. +*CommentsApi* | [**read_entity_comments**](docs/CommentsApi.md#read_entity_comments) | **GET** /{entity_type}/{id}/comments | Read all comments of that entity. +*CompoundsApi* | [**delete_compound**](docs/CompoundsApi.md#delete_compound) | **DELETE** /compounds/{id} | Soft-delete a compound +*CompoundsApi* | [**get_compound**](docs/CompoundsApi.md#get_compound) | **GET** /compounds/{id} | Get a single compound +*CompoundsApi* | [**get_compounds**](docs/CompoundsApi.md#get_compounds) | **GET** /compounds | Read compounds +*CompoundsApi* | [**post_compounds**](docs/CompoundsApi.md#post_compounds) | **POST** /compounds | Create or import a compound +*ConfigApi* | [**delete_config**](docs/ConfigApi.md#delete_config) | **DELETE** /config | Reset the config to default values +*ConfigApi* | [**get_config**](docs/ConfigApi.md#get_config) | **GET** /config | Read the config +*ConfigApi* | [**patch_config**](docs/ConfigApi.md#patch_config) | **PATCH** /config | Modify the config +*ContainersApi* | [**delete_container**](docs/ContainersApi.md#delete_container) | **DELETE** /{entity_type}/{id}/containers/{subid} | Delete a container. +*ContainersApi* | [**patch_container**](docs/ContainersApi.md#patch_container) | **PATCH** /{entity_type}/{id}/containers/{subid} | Modify a container. +*ContainersApi* | [**post_container**](docs/ContainersApi.md#post_container) | **POST** /{entity_type}/{id}/containers/{subid} | Create a container for this entity. +*ContainersApi* | [**read_container**](docs/ContainersApi.md#read_container) | **GET** /{entity_type}/{id}/containers/{subid} | Read a container. +*ContainersApi* | [**read_containers**](docs/ContainersApi.md#read_containers) | **GET** /{entity_type}/{id}/containers | Read all containers for this entity. +*CustomFieldsKeysApi* | [**custom_fields_keys**](docs/CustomFieldsKeysApi.md#custom_fields_keys) | **GET** /extra_fields_keys | Read custom fields keys. +*DSpaceApi* | [**dspace_create**](docs/DSpaceApi.md#dspace_create) | **POST** /dspace | Create a new DSpace workspace item. +*DSpaceApi* | [**dspace_read**](docs/DSpaceApi.md#dspace_read) | **GET** /dspace | Read DSpace information. +*DSpaceApi* | [**dspace_submit**](docs/DSpaceApi.md#dspace_submit) | **PATCH** /dspace | Submit an eLabFTW entry to DSpace. +*EventsApi* | [**delete_event**](docs/EventsApi.md#delete_event) | **DELETE** /event/{id} | Delete a booking slot. +*EventsApi* | [**patch_event**](docs/EventsApi.md#patch_event) | **PATCH** /event/{id} | Modify a booking slot. +*EventsApi* | [**post_events**](docs/EventsApi.md#post_events) | **POST** /events/{id} | Create an event for the item specified as id. +*EventsApi* | [**read_event**](docs/EventsApi.md#read_event) | **GET** /event/{id} | Read a booking slot. +*EventsApi* | [**read_events**](docs/EventsApi.md#read_events) | **GET** /events | Read all events in the team. +*ExperimentsApi* | [**delete_experiment**](docs/ExperimentsApi.md#delete_experiment) | **DELETE** /experiments/{id} | Delete an experiment. +*ExperimentsApi* | [**get_experiment**](docs/ExperimentsApi.md#get_experiment) | **GET** /experiments/{id} | Read an experiment +*ExperimentsApi* | [**patch_experiment**](docs/ExperimentsApi.md#patch_experiment) | **PATCH** /experiments/{id} | Modify an experiment +*ExperimentsApi* | [**post_experiment**](docs/ExperimentsApi.md#post_experiment) | **POST** /experiments | Create an experiment +*ExperimentsApi* | [**post_experiment_by_id**](docs/ExperimentsApi.md#post_experiment_by_id) | **POST** /experiments/{id} | Duplicate an experiment with its ID +*ExperimentsApi* | [**read_experiments**](docs/ExperimentsApi.md#read_experiments) | **GET** /experiments | Read all experiments that are accessible +*ExperimentsCategoriesApi* | [**delete_expcat**](docs/ExperimentsCategoriesApi.md#delete_expcat) | **DELETE** /teams/{id}/experiments_categories/{subid} | Delete a category. +*ExperimentsCategoriesApi* | [**patch_expcat**](docs/ExperimentsCategoriesApi.md#patch_expcat) | **PATCH** /teams/{id}/experiments_categories/{subid} | Modify a category. +*ExperimentsCategoriesApi* | [**post_team_one_expcat**](docs/ExperimentsCategoriesApi.md#post_team_one_expcat) | **POST** /teams/{id}/experiments_categories | Create a new category for experiments. +*ExperimentsCategoriesApi* | [**read_team_experiments_categories**](docs/ExperimentsCategoriesApi.md#read_team_experiments_categories) | **GET** /teams/{id}/experiments_categories | Read experiments categories of a team. +*ExperimentsCategoriesApi* | [**read_team_one_expcat**](docs/ExperimentsCategoriesApi.md#read_team_one_expcat) | **GET** /teams/{id}/experiments_categories/{subid} | Read a category. +*ExperimentsStatusApi* | [**delete_expstatus**](docs/ExperimentsStatusApi.md#delete_expstatus) | **DELETE** /teams/{id}/experiments_status/{subid} | Delete a status. +*ExperimentsStatusApi* | [**patch_expstatus**](docs/ExperimentsStatusApi.md#patch_expstatus) | **PATCH** /teams/{id}/experiments_status/{subid} | Modify a status. +*ExperimentsStatusApi* | [**post_team_one_expstatus**](docs/ExperimentsStatusApi.md#post_team_one_expstatus) | **POST** /teams/{id}/experiments_status | Create a new experiments status. +*ExperimentsStatusApi* | [**read_team_experiments_status**](docs/ExperimentsStatusApi.md#read_team_experiments_status) | **GET** /teams/{id}/experiments_status | Read experiments status of a team. +*ExperimentsStatusApi* | [**read_team_one_expstatus**](docs/ExperimentsStatusApi.md#read_team_one_expstatus) | **GET** /teams/{id}/experiments_status/{subid} | Read a status. +*ExperimentsTemplatesApi* | [**delete_experiment_template**](docs/ExperimentsTemplatesApi.md#delete_experiment_template) | **DELETE** /experiments_templates/{id} | Delete an experiment template. +*ExperimentsTemplatesApi* | [**get_experiment_template**](docs/ExperimentsTemplatesApi.md#get_experiment_template) | **GET** /experiments_templates/{id} | Read an experiment template +*ExperimentsTemplatesApi* | [**patch_experiment_template**](docs/ExperimentsTemplatesApi.md#patch_experiment_template) | **PATCH** /experiments_templates/{id} | Modify an experiment template +*ExperimentsTemplatesApi* | [**post_experiment_template**](docs/ExperimentsTemplatesApi.md#post_experiment_template) | **POST** /experiments_templates | Create an experiment template +*ExperimentsTemplatesApi* | [**post_experiment_template_by_id**](docs/ExperimentsTemplatesApi.md#post_experiment_template_by_id) | **POST** /experiments_templates/{id} | Duplicate an experiment template with its ID +*ExperimentsTemplatesApi* | [**read_experiments_templates**](docs/ExperimentsTemplatesApi.md#read_experiments_templates) | **GET** /experiments_templates | Read all experiments_templates that are accessible +*ExportsApi* | [**delete_export**](docs/ExportsApi.md#delete_export) | **DELETE** /exports/{id} | Remove an export request and its associated file +*ExportsApi* | [**post_export**](docs/ExportsApi.md#post_export) | **POST** /exports | Register an export request +*ExportsApi* | [**read_export**](docs/ExportsApi.md#read_export) | **GET** /exports/{id} | Get export +*ExportsApi* | [**readall_exports**](docs/ExportsApi.md#readall_exports) | **GET** /exports | List exports +*FavoriteTagsApi* | [**delete_favtag**](docs/FavoriteTagsApi.md#delete_favtag) | **DELETE** /favtags/{id} | Unfavorite a tag. +*FavoriteTagsApi* | [**post_favtags**](docs/FavoriteTagsApi.md#post_favtags) | **POST** /favtags | Add a tag as favorite. +*FavoriteTagsApi* | [**read_favtags**](docs/FavoriteTagsApi.md#read_favtags) | **GET** /favtags | Read all favorite tags for the user. +*IdpsApi* | [**delete_idp**](docs/IdpsApi.md#delete_idp) | **DELETE** /idps/{id} | Delete an idp. +*IdpsApi* | [**delete_idp_cert**](docs/IdpsApi.md#delete_idp_cert) | **DELETE** /idps/{id}/certs/{cert_id} | Delete an idp cert. +*IdpsApi* | [**delete_idp_endpoint**](docs/IdpsApi.md#delete_idp_endpoint) | **DELETE** /idps/{id}/endpoints/{endpoint_id} | Delete an idp endpoint. +*IdpsApi* | [**patch_idp**](docs/IdpsApi.md#patch_idp) | **PATCH** /idps/{id} | Actions on an idp. +*IdpsApi* | [**post_idp**](docs/IdpsApi.md#post_idp) | **POST** /idps | Create an idp. +*IdpsApi* | [**post_idp_cert**](docs/IdpsApi.md#post_idp_cert) | **POST** /idps/{id}/certs | Add a cert to this IdP. +*IdpsApi* | [**post_idp_endpoint**](docs/IdpsApi.md#post_idp_endpoint) | **POST** /idps/{id}/endpoints | Add an endpoint to this IdP. +*IdpsApi* | [**read_idp**](docs/IdpsApi.md#read_idp) | **GET** /idps/{id} | Read an idp. +*IdpsApi* | [**read_idp_cert**](docs/IdpsApi.md#read_idp_cert) | **GET** /idps/{id}/certs/{cert_id} | Read a cert for an IdP. +*IdpsApi* | [**read_idp_certs**](docs/IdpsApi.md#read_idp_certs) | **GET** /idps/{id}/certs | Read all certs for an IdP. +*IdpsApi* | [**read_idp_endpoint**](docs/IdpsApi.md#read_idp_endpoint) | **GET** /idps/{id}/endpoints/{endpoint_id} | Read an endpoint for an IdP. +*IdpsApi* | [**read_idp_endpoints**](docs/IdpsApi.md#read_idp_endpoints) | **GET** /idps/{id}/endpoints | Read all endpoints for an IdP. +*IdpsApi* | [**read_idps**](docs/IdpsApi.md#read_idps) | **GET** /idps | Read all IDPs. +*IdpsSourcesApi* | [**delete_idps_source**](docs/IdpsSourcesApi.md#delete_idps_source) | **DELETE** /idps_sources/{id} | Delete an idp source. +*IdpsSourcesApi* | [**patch_idps_source**](docs/IdpsSourcesApi.md#patch_idps_source) | **PATCH** /idps_sources/{id} | Patch an idp source. +*IdpsSourcesApi* | [**post_idp_source**](docs/IdpsSourcesApi.md#post_idp_source) | **POST** /idps_sources | Create an idp source. +*IdpsSourcesApi* | [**read_idps_source**](docs/IdpsSourcesApi.md#read_idps_source) | **GET** /idps_sources/{id} | Read an IdPs source +*IdpsSourcesApi* | [**read_idps_sources**](docs/IdpsSourcesApi.md#read_idps_sources) | **GET** /idps_sources | Read all IDPs sources +*ImportApi* | [**post_import**](docs/ImportApi.md#post_import) | **POST** /import | Send a file to import +*ImportApi* | [**read_import**](docs/ImportApi.md#read_import) | **GET** /import | Get information about this endpoint +*InfoApi* | [**get_info**](docs/InfoApi.md#get_info) | **GET** /info | Get information about the instance. +*InstanceApi* | [**post_instance**](docs/InstanceApi.md#post_instance) | **POST** /instance | Run an instance level action. +*ItemsApi* | [**delete_item**](docs/ItemsApi.md#delete_item) | **DELETE** /items/{id} | Delete an item. +*ItemsApi* | [**get_item**](docs/ItemsApi.md#get_item) | **GET** /items/{id} | Read an item +*ItemsApi* | [**patch_item**](docs/ItemsApi.md#patch_item) | **PATCH** /items/{id} | Modify an item +*ItemsApi* | [**post_item**](docs/ItemsApi.md#post_item) | **POST** /items | Create an item +*ItemsApi* | [**post_item_by_id**](docs/ItemsApi.md#post_item_by_id) | **POST** /items/{id} | Duplicate an item with its ID +*ItemsApi* | [**read_items**](docs/ItemsApi.md#read_items) | **GET** /items | Read all items that are accessible +*ItemsTypesResourcesTemplatesApi* | [**delete_items_type**](docs/ItemsTypesResourcesTemplatesApi.md#delete_items_type) | **DELETE** /items_types/{id} | Delete a resource template. +*ItemsTypesResourcesTemplatesApi* | [**get_items_type**](docs/ItemsTypesResourcesTemplatesApi.md#get_items_type) | **GET** /items_types/{id} | Read a resource template +*ItemsTypesResourcesTemplatesApi* | [**patch_items_type**](docs/ItemsTypesResourcesTemplatesApi.md#patch_items_type) | **PATCH** /items_types/{id} | Modify a resource template +*ItemsTypesResourcesTemplatesApi* | [**post_items_types**](docs/ItemsTypesResourcesTemplatesApi.md#post_items_types) | **POST** /items_types | Create a resource template +*ItemsTypesResourcesTemplatesApi* | [**post_items_types_by_id**](docs/ItemsTypesResourcesTemplatesApi.md#post_items_types_by_id) | **POST** /items_types/{id} | Duplicate a resource template with its ID +*ItemsTypesResourcesTemplatesApi* | [**read_items_types**](docs/ItemsTypesResourcesTemplatesApi.md#read_items_types) | **GET** /items_types | Read all resources templates that are accessible +*LinksToCompoundsApi* | [**delete_entity_compounds_link**](docs/LinksToCompoundsApi.md#delete_entity_compounds_link) | **DELETE** /{entity_type}/{id}/compounds_links/{subid} | Delete a compound link. +*LinksToCompoundsApi* | [**post_entity_compounds_links**](docs/LinksToCompoundsApi.md#post_entity_compounds_links) | **POST** /{entity_type}/{id}/compounds_links/{subid} | Link an entity to a compound. +*LinksToCompoundsApi* | [**read_entity_compounds_links**](docs/LinksToCompoundsApi.md#read_entity_compounds_links) | **GET** /{entity_type}/{id}/compounds_links | Read all compounds links of that entity. +*LinksToExperimentsApi* | [**delete_entity_experiments_link**](docs/LinksToExperimentsApi.md#delete_entity_experiments_link) | **DELETE** /{entity_type}/{id}/experiments_links/{subid} | Delete an experiment link. +*LinksToExperimentsApi* | [**post_entity_experiments_links**](docs/LinksToExperimentsApi.md#post_entity_experiments_links) | **POST** /{entity_type}/{id}/experiments_links/{subid} | Create or import a link. +*LinksToExperimentsApi* | [**read_entity_experiments_links**](docs/LinksToExperimentsApi.md#read_entity_experiments_links) | **GET** /{entity_type}/{id}/experiments_links | Read all experiments links of that entity. +*LinksToItemsApi* | [**delete_entitiy_items_link**](docs/LinksToItemsApi.md#delete_entitiy_items_link) | **DELETE** /{entity_type}/{id}/items_links/{subid} | Delete an item link. +*LinksToItemsApi* | [**post_entity_items_links**](docs/LinksToItemsApi.md#post_entity_items_links) | **POST** /{entity_type}/{id}/items_links/{subid} | Create or import a link. +*LinksToItemsApi* | [**read_entity_items_links**](docs/LinksToItemsApi.md#read_entity_items_links) | **GET** /{entity_type}/{id}/items_links | Read all items links of that entity. +*NotificationsApi* | [**delete_notifications**](docs/NotificationsApi.md#delete_notifications) | **DELETE** /users/{id}/notifications | Delete all notifications of the user. +*NotificationsApi* | [**patch_notification**](docs/NotificationsApi.md#patch_notification) | **PATCH** /users/{id}/notifications/{subid} | Update the acknowledgment status of a notification. +*NotificationsApi* | [**read_notification**](docs/NotificationsApi.md#read_notification) | **GET** /users/{id}/notifications/{subid} | Read a notification. +*NotificationsApi* | [**read_notifications**](docs/NotificationsApi.md#read_notifications) | **GET** /users/{id}/notifications | Read notifications of a user. +*ReportsApi* | [**get_reports**](docs/ReportsApi.md#get_reports) | **GET** /reports | Get usage reports +*ResourcesCategoriesApi* | [**delete_rescat**](docs/ResourcesCategoriesApi.md#delete_rescat) | **DELETE** /teams/{id}/resources_categories/{subid} | Delete a category. +*ResourcesCategoriesApi* | [**patch_rescat**](docs/ResourcesCategoriesApi.md#patch_rescat) | **PATCH** /teams/{id}/resources_categories/{subid} | Modify a category. +*ResourcesCategoriesApi* | [**post_team_one_rescat**](docs/ResourcesCategoriesApi.md#post_team_one_rescat) | **POST** /teams/{id}/resources_categories | Create a new category for resources. +*ResourcesCategoriesApi* | [**read_team_one_rescat**](docs/ResourcesCategoriesApi.md#read_team_one_rescat) | **GET** /teams/{id}/resources_categories/{subid} | Read a category. +*ResourcesCategoriesApi* | [**read_team_resources_categories**](docs/ResourcesCategoriesApi.md#read_team_resources_categories) | **GET** /teams/{id}/resources_categories | Read resources categories of a team. +*ResourcesStatusApi* | [**delete_resstatus**](docs/ResourcesStatusApi.md#delete_resstatus) | **DELETE** /teams/{id}/items_status/{subid} | Delete a status. +*ResourcesStatusApi* | [**patch_resstatus**](docs/ResourcesStatusApi.md#patch_resstatus) | **PATCH** /teams/{id}/items_status/{subid} | Modify a status. +*ResourcesStatusApi* | [**post_team_one_resstat**](docs/ResourcesStatusApi.md#post_team_one_resstat) | **POST** /teams/{id}/items_status | Create a new status for resources. +*ResourcesStatusApi* | [**read_team_items_status**](docs/ResourcesStatusApi.md#read_team_items_status) | **GET** /teams/{id}/items_status | Read resources status of a team. +*ResourcesStatusApi* | [**read_team_one_resstatus**](docs/ResourcesStatusApi.md#read_team_one_resstatus) | **GET** /teams/{id}/items_status/{subid} | Read a status. +*RevisionsApi* | [**patch_entity_revision**](docs/RevisionsApi.md#patch_entity_revision) | **PATCH** /{entity_type}/{id}/revisions/{subid} | Restore a revision. +*RevisionsApi* | [**read_entity_revision**](docs/RevisionsApi.md#read_entity_revision) | **GET** /{entity_type}/{id}/revisions/{subid} | Read a revision of that entity. +*RevisionsApi* | [**read_entity_revisions**](docs/RevisionsApi.md#read_entity_revisions) | **GET** /{entity_type}/{id}/revisions | Read all revisions of that entity. +*StepsApi* | [**delete_step**](docs/StepsApi.md#delete_step) | **DELETE** /{entity_type}/{id}/steps/{subid} | Delete a step. +*StepsApi* | [**patch_step**](docs/StepsApi.md#patch_step) | **PATCH** /{entity_type}/{id}/steps/{subid} | Actions on a step. +*StepsApi* | [**post_step**](docs/StepsApi.md#post_step) | **POST** /{entity_type}/{id}/steps | Create a step. +*StepsApi* | [**read_steps**](docs/StepsApi.md#read_steps) | **GET** /{entity_type}/{id}/steps | Read all steps of that entity. +*StorageUnitsApi* | [**delete_storage_unit**](docs/StorageUnitsApi.md#delete_storage_unit) | **DELETE** /storage_units/{id} | Delete a storage unit. +*StorageUnitsApi* | [**patch_storage_unit**](docs/StorageUnitsApi.md#patch_storage_unit) | **PATCH** /storage_units/{id} | Modify a storage unit. +*StorageUnitsApi* | [**post_storage_unit**](docs/StorageUnitsApi.md#post_storage_unit) | **POST** /storage_units | Create a new storage unit. +*StorageUnitsApi* | [**read_storage_unit**](docs/StorageUnitsApi.md#read_storage_unit) | **GET** /storage_units/{id} | Read a storage unit. +*StorageUnitsApi* | [**read_storage_units**](docs/StorageUnitsApi.md#read_storage_units) | **GET** /storage_units | Read all containers, or the storage unit hierarchy when `?hierarchy=true`. +*TagsApi* | [**delete_tag**](docs/TagsApi.md#delete_tag) | **DELETE** /{entity_type}/{id}/tags | Delete all tags. +*TagsApi* | [**patch_tag**](docs/TagsApi.md#patch_tag) | **PATCH** /{entity_type}/{id}/tags/{subid} | Actions on a tag (like removing it from the entity). +*TagsApi* | [**post_tag**](docs/TagsApi.md#post_tag) | **POST** /{entity_type}/{id}/tags | Create a tag. +*TagsApi* | [**read_tag**](docs/TagsApi.md#read_tag) | **GET** /{entity_type}/{id}/tags/{subid} | Read a tag. +*TagsApi* | [**read_tags**](docs/TagsApi.md#read_tags) | **GET** /{entity_type}/{id}/tags | Read all tags of that entity. +*TeamTagsApi* | [**delete_team_tag**](docs/TeamTagsApi.md#delete_team_tag) | **DELETE** /teams/{id}/tags/{subid} | Delete a tag. +*TeamTagsApi* | [**patch_team_tag**](docs/TeamTagsApi.md#patch_team_tag) | **PATCH** /teams/{id}/tags/{subid} | Actions on a tag. +*TeamTagsApi* | [**post_team_tag**](docs/TeamTagsApi.md#post_team_tag) | **POST** /teams/{id}/tags | Create a tag in the team. +*TeamTagsApi* | [**read_team_tag**](docs/TeamTagsApi.md#read_team_tag) | **GET** /teams/{id}/tags/{subid} | Read a tag. +*TeamTagsApi* | [**read_team_tags**](docs/TeamTagsApi.md#read_team_tags) | **GET** /teams/{id}/tags | Read all tags for the team. +*TeamgroupsApi* | [**delete_teamgroup**](docs/TeamgroupsApi.md#delete_teamgroup) | **DELETE** /teams/{id}/teamgroups/{subid} | Delete a teamgroup. +*TeamgroupsApi* | [**patch_teamgroup**](docs/TeamgroupsApi.md#patch_teamgroup) | **PATCH** /teams/{id}/teamgroups/{subid} | Modify a teamgroup. +*TeamgroupsApi* | [**post_teamgroups**](docs/TeamgroupsApi.md#post_teamgroups) | **POST** /teams/{id}/teamgroups | Create a new teamgroup. +*TeamgroupsApi* | [**read_team_teamgroups**](docs/TeamgroupsApi.md#read_team_teamgroups) | **GET** /teams/{id}/teamgroups | Read teamgroups of a team. +*TeamgroupsApi* | [**read_teamgroup**](docs/TeamgroupsApi.md#read_teamgroup) | **GET** /teams/{id}/teamgroups/{subid} | Read a teamgroup. +*TeamsApi* | [**patch_team**](docs/TeamsApi.md#patch_team) | **PATCH** /teams/{id} | Actions on a team. +*TeamsApi* | [**post_teams**](docs/TeamsApi.md#post_teams) | **POST** /teams | Create a new team. +*TeamsApi* | [**read_team**](docs/TeamsApi.md#read_team) | **GET** /teams/{id} | Read a team. Requires Admin permissions. +*TeamsApi* | [**read_teams**](docs/TeamsApi.md#read_teams) | **GET** /teams | Read all teams. Requires Sysadmin permissions. +*TodolistApi* | [**delete_todoitem**](docs/TodolistApi.md#delete_todoitem) | **DELETE** /todolist/{id} | Delete a todoitem. +*TodolistApi* | [**patch_todoitem**](docs/TodolistApi.md#patch_todoitem) | **PATCH** /todolist/{id} | Actions on a todoitem. +*TodolistApi* | [**post_todolist**](docs/TodolistApi.md#post_todolist) | **POST** /todolist | Create a todo item +*TodolistApi* | [**read_todoitem**](docs/TodolistApi.md#read_todoitem) | **GET** /todolist/{id} | Read a todo entry. +*TodolistApi* | [**read_todolist**](docs/TodolistApi.md#read_todolist) | **GET** /todolist | Read all todoitems. +*UnfinishedStepsApi* | [**read_unfinished_steps**](docs/UnfinishedStepsApi.md#read_unfinished_steps) | **GET** /unfinished_steps | Read all unfinished steps. +*UploadsApi* | [**delete_upload**](docs/UploadsApi.md#delete_upload) | **DELETE** /{entity_type}/{id}/uploads/{subid} | Delete an upload. +*UploadsApi* | [**patch_upload**](docs/UploadsApi.md#patch_upload) | **PATCH** /{entity_type}/{id}/uploads/{subid} | Modify attributes such as \"real_name\", \"comment\" or \"state\" of an upload. +*UploadsApi* | [**post_upload**](docs/UploadsApi.md#post_upload) | **POST** /{entity_type}/{id}/uploads | Create an upload. +*UploadsApi* | [**post_upload_replace**](docs/UploadsApi.md#post_upload_replace) | **POST** /{entity_type}/{id}/uploads/{subid} | Replace an existing uploaded file. The existing file will be archived and the new one will be added. +*UploadsApi* | [**read_upload**](docs/UploadsApi.md#read_upload) | **GET** /{entity_type}/{id}/uploads/{subid} | Read an upload. +*UploadsApi* | [**read_uploads**](docs/UploadsApi.md#read_uploads) | **GET** /{entity_type}/{id}/uploads | Read attached files of that entity. +*UserUploadsApi* | [**read_user_uploads**](docs/UserUploadsApi.md#read_user_uploads) | **GET** /users/{id}/uploads | Read attached files from a user +*UsersApi* | [**patch_user**](docs/UsersApi.md#patch_user) | **PATCH** /users/{id} | Modify a user. +*UsersApi* | [**post_user**](docs/UsersApi.md#post_user) | **POST** /users | Create a new user. +*UsersApi* | [**read_user**](docs/UsersApi.md#read_user) | **GET** /users/{id} | Read information of a user. +*UsersApi* | [**read_users**](docs/UsersApi.md#read_users) | **GET** /users | Read users from instance. + +## Documentation For Models + + - [AllOfentityEditableMetadatamerge](docs/AllOfentityEditableMetadatamerge.md) + - [AnyOfuploadsSubidBody1](docs/AnyOfuploadsSubidBody1.md) + - [Apikey](docs/Apikey.md) + - [ApikeysBody](docs/ApikeysBody.md) + - [BrandingIdBody](docs/BrandingIdBody.md) + - [Changelog](docs/Changelog.md) + - [Comment](docs/Comment.md) + - [Compound](docs/Compound.md) + - [CompoundCreateRequest](docs/CompoundCreateRequest.md) + - [CompoundDuplicateRequest](docs/CompoundDuplicateRequest.md) + - [CompoundsBody](docs/CompoundsBody.md) + - [CompoundsLinksSubidBody](docs/CompoundsLinksSubidBody.md) + - [Config](docs/Config.md) + - [Container](docs/Container.md) + - [ContainersSubidBody](docs/ContainersSubidBody.md) + - [ContainersSubidBody1](docs/ContainersSubidBody1.md) + - [DspaceBody](docs/DspaceBody.md) + - [DspaceBody1](docs/DspaceBody1.md) + - [DspaceEntity](docs/DspaceEntity.md) + - [DspaceMetadata](docs/DspaceMetadata.md) + - [DspaceMetadata1](docs/DspaceMetadata1.md) + - [Entity](docs/Entity.md) + - [EntityAndItemEditable](docs/EntityAndItemEditable.md) + - [EntityDuplicate](docs/EntityDuplicate.md) + - [EntityEditable](docs/EntityEditable.md) + - [EntityTemplate](docs/EntityTemplate.md) + - [EntityTemplateEditable](docs/EntityTemplateEditable.md) + - [Error](docs/Error.md) + - [Event](docs/Event.md) + - [EventIdBody](docs/EventIdBody.md) + - [EventidDelta](docs/EventidDelta.md) + - [EventsIdBody](docs/EventsIdBody.md) + - [ExclusiveEditMode](docs/ExclusiveEditMode.md) + - [Experiment](docs/Experiment.md) + - [ExperimentsLinksSubidBody](docs/ExperimentsLinksSubidBody.md) + - [ExperimentsTemplatesIdBody](docs/ExperimentsTemplatesIdBody.md) + - [Export](docs/Export.md) + - [ExportsBody](docs/ExportsBody.md) + - [ExtraFieldsKeys](docs/ExtraFieldsKeys.md) + - [FavtagsBody](docs/FavtagsBody.md) + - [Id](docs/Id.md) + - [Id1](docs/Id1.md) + - [Id2](docs/Id2.md) + - [Id3](docs/Id3.md) + - [Id4](docs/Id4.md) + - [IdCertsBody](docs/IdCertsBody.md) + - [IdCommentsBody](docs/IdCommentsBody.md) + - [IdEndpointsBody](docs/IdEndpointsBody.md) + - [IdExperimentsCategoriesBody](docs/IdExperimentsCategoriesBody.md) + - [IdExperimentsStatusBody](docs/IdExperimentsStatusBody.md) + - [IdItemsStatusBody](docs/IdItemsStatusBody.md) + - [IdResourcesCategoriesBody](docs/IdResourcesCategoriesBody.md) + - [IdStepsBody](docs/IdStepsBody.md) + - [IdTagsBody](docs/IdTagsBody.md) + - [IdTagsBody1](docs/IdTagsBody1.md) + - [IdTeamgroupsBody](docs/IdTeamgroupsBody.md) + - [IdUploadsBody](docs/IdUploadsBody.md) + - [Idp](docs/Idp.md) + - [IdpCert](docs/IdpCert.md) + - [IdpEndpoint](docs/IdpEndpoint.md) + - [IdpSource](docs/IdpSource.md) + - [IdpsBody](docs/IdpsBody.md) + - [IdpsIdBody](docs/IdpsIdBody.md) + - [IdpsSourcesBody](docs/IdpsSourcesBody.md) + - [IdpsSourcesIdBody](docs/IdpsSourcesIdBody.md) + - [ImportBody](docs/ImportBody.md) + - [InlineResponse200](docs/InlineResponse200.md) + - [InlineResponse2001](docs/InlineResponse2001.md) + - [InlineResponse20010](docs/InlineResponse20010.md) + - [InlineResponse2001Experiments](docs/InlineResponse2001Experiments.md) + - [InlineResponse2001Items](docs/InlineResponse2001Items.md) + - [InlineResponse2001Users](docs/InlineResponse2001Users.md) + - [InlineResponse2002](docs/InlineResponse2002.md) + - [InlineResponse2003](docs/InlineResponse2003.md) + - [InlineResponse2004](docs/InlineResponse2004.md) + - [InlineResponse2004QueryParameters](docs/InlineResponse2004QueryParameters.md) + - [InlineResponse2005](docs/InlineResponse2005.md) + - [InlineResponse2006](docs/InlineResponse2006.md) + - [InlineResponse2007](docs/InlineResponse2007.md) + - [InlineResponse2008](docs/InlineResponse2008.md) + - [InlineResponse2009](docs/InlineResponse2009.md) + - [InlineResponse2009Embedded](docs/InlineResponse2009Embedded.md) + - [InlineResponse2009EmbeddedEntries](docs/InlineResponse2009EmbeddedEntries.md) + - [InstanceBody](docs/InstanceBody.md) + - [Item](docs/Item.md) + - [ItemEditable](docs/ItemEditable.md) + - [ItemsLinksSubidBody](docs/ItemsLinksSubidBody.md) + - [ItemsTypesIdBody](docs/ItemsTypesIdBody.md) + - [Link](docs/Link.md) + - [Metadata](docs/Metadata.md) + - [MetadataElabftw](docs/MetadataElabftw.md) + - [MetadataElabftwExtraFieldsGroups](docs/MetadataElabftwExtraFieldsGroups.md) + - [MetadataExtraFields](docs/MetadataExtraFields.md) + - [Notification](docs/Notification.md) + - [NotificationsSubidBody](docs/NotificationsSubidBody.md) + - [PatchAction](docs/PatchAction.md) + - [Revision](docs/Revision.md) + - [RevisionsSubidBody](docs/RevisionsSubidBody.md) + - [Statuslike](docs/Statuslike.md) + - [Step](docs/Step.md) + - [StepsSubidBody](docs/StepsSubidBody.md) + - [StorageUnit](docs/StorageUnit.md) + - [StorageUnitsBody](docs/StorageUnitsBody.md) + - [StorageUnitsIdBody](docs/StorageUnitsIdBody.md) + - [Tag](docs/Tag.md) + - [TagsSubidBody](docs/TagsSubidBody.md) + - [TagsSubidBody1](docs/TagsSubidBody1.md) + - [Team](docs/Team.md) + - [Teamgroup](docs/Teamgroup.md) + - [TeamgroupUsers](docs/TeamgroupUsers.md) + - [TeamgroupsSubidBody](docs/TeamgroupsSubidBody.md) + - [TeamsBody](docs/TeamsBody.md) + - [TeamsIdBody](docs/TeamsIdBody.md) + - [Todoitem](docs/Todoitem.md) + - [TodolistBody](docs/TodolistBody.md) + - [TodolistIdBody](docs/TodolistIdBody.md) + - [UnfinishedStep](docs/UnfinishedStep.md) + - [UnfinishedSteps](docs/UnfinishedSteps.md) + - [Upload](docs/Upload.md) + - [UploadsSubidBody](docs/UploadsSubidBody.md) + - [UploadsSubidBody1](docs/UploadsSubidBody1.md) + - [Users](docs/Users.md) + - [UsersBody](docs/UsersBody.md) + - [UsersFull](docs/UsersFull.md) + - [UsersFullTeams](docs/UsersFullTeams.md) + - [UsersIdBody](docs/UsersIdBody.md) + +## Documentation For Authorization + + +## token + +- **Type**: API key +- **API key parameter name**: Authorization +- **Location**: HTTP header + + +## Author + + diff --git a/vendor/elabapi-python/elabapi_python.egg-info/PKG-INFO b/vendor/elabapi-python/elabapi_python.egg-info/PKG-INFO new file mode 100644 index 0000000..2d9de4d --- /dev/null +++ b/vendor/elabapi-python/elabapi_python.egg-info/PKG-INFO @@ -0,0 +1,19 @@ +Metadata-Version: 2.4 +Name: elabapi-python +Version: 5.6.1 +Summary: eLabFTW REST API v2 Documentation +Home-page: https://github.com/elabftw/elabapi-python +Author-email: +Keywords: Swagger,eLabFTW REST API v2 Documentation +Requires-Dist: urllib3>=1.15 +Requires-Dist: six>=1.10 +Requires-Dist: certifi +Requires-Dist: python-dateutil +Dynamic: description +Dynamic: home-page +Dynamic: keywords +Dynamic: requires-dist +Dynamic: summary + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + diff --git a/vendor/elabapi-python/elabapi_python.egg-info/SOURCES.txt b/vendor/elabapi-python/elabapi_python.egg-info/SOURCES.txt new file mode 100644 index 0000000..3e9f6c0 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python.egg-info/SOURCES.txt @@ -0,0 +1,348 @@ +README.md +setup.py +elabapi_python/__init__.py +elabapi_python/api_client.py +elabapi_python/configuration.py +elabapi_python/rest.py +elabapi_python.egg-info/PKG-INFO +elabapi_python.egg-info/SOURCES.txt +elabapi_python.egg-info/dependency_links.txt +elabapi_python.egg-info/requires.txt +elabapi_python.egg-info/top_level.txt +elabapi_python/api/__init__.py +elabapi_python/api/api_keys_api.py +elabapi_python/api/branding_api.py +elabapi_python/api/comments_api.py +elabapi_python/api/compounds_api.py +elabapi_python/api/config_api.py +elabapi_python/api/containers_api.py +elabapi_python/api/custom_fields_keys_api.py +elabapi_python/api/d_space_api.py +elabapi_python/api/events_api.py +elabapi_python/api/experiments_api.py +elabapi_python/api/experiments_categories_api.py +elabapi_python/api/experiments_status_api.py +elabapi_python/api/experiments_templates_api.py +elabapi_python/api/exports_api.py +elabapi_python/api/favorite_tags_api.py +elabapi_python/api/idps_api.py +elabapi_python/api/idps_sources_api.py +elabapi_python/api/import_api.py +elabapi_python/api/info_api.py +elabapi_python/api/instance_api.py +elabapi_python/api/items_api.py +elabapi_python/api/items_types__resources_templates_api.py +elabapi_python/api/links_to_compounds_api.py +elabapi_python/api/links_to_experiments_api.py +elabapi_python/api/links_to_items_api.py +elabapi_python/api/notifications_api.py +elabapi_python/api/reports_api.py +elabapi_python/api/resources_categories_api.py +elabapi_python/api/resources_status_api.py +elabapi_python/api/revisions_api.py +elabapi_python/api/steps_api.py +elabapi_python/api/storage_units_api.py +elabapi_python/api/tags_api.py +elabapi_python/api/team_tags_api.py +elabapi_python/api/teamgroups_api.py +elabapi_python/api/teams_api.py +elabapi_python/api/todolist_api.py +elabapi_python/api/unfinished_steps_api.py +elabapi_python/api/uploads_api.py +elabapi_python/api/user_uploads_api.py +elabapi_python/api/users_api.py +elabapi_python/models/__init__.py +elabapi_python/models/all_ofentity_editable_metadatamerge.py +elabapi_python/models/any_ofuploads_subid_body1.py +elabapi_python/models/apikey.py +elabapi_python/models/apikeys_body.py +elabapi_python/models/branding_id_body.py +elabapi_python/models/changelog.py +elabapi_python/models/comment.py +elabapi_python/models/compound.py +elabapi_python/models/compound_create_request.py +elabapi_python/models/compound_duplicate_request.py +elabapi_python/models/compounds_body.py +elabapi_python/models/compounds_links_subid_body.py +elabapi_python/models/config.py +elabapi_python/models/container.py +elabapi_python/models/containers_subid_body.py +elabapi_python/models/containers_subid_body1.py +elabapi_python/models/dspace_body.py +elabapi_python/models/dspace_body1.py +elabapi_python/models/dspace_entity.py +elabapi_python/models/dspace_metadata.py +elabapi_python/models/dspace_metadata1.py +elabapi_python/models/entity.py +elabapi_python/models/entity_and_item_editable.py +elabapi_python/models/entity_duplicate.py +elabapi_python/models/entity_editable.py +elabapi_python/models/entity_template.py +elabapi_python/models/entity_template_editable.py +elabapi_python/models/error.py +elabapi_python/models/event.py +elabapi_python/models/event_id_body.py +elabapi_python/models/eventid_delta.py +elabapi_python/models/events_id_body.py +elabapi_python/models/exclusive_edit_mode.py +elabapi_python/models/experiment.py +elabapi_python/models/experiments_links_subid_body.py +elabapi_python/models/experiments_templates_id_body.py +elabapi_python/models/export.py +elabapi_python/models/exports_body.py +elabapi_python/models/extra_fields_keys.py +elabapi_python/models/favtags_body.py +elabapi_python/models/id.py +elabapi_python/models/id1.py +elabapi_python/models/id2.py +elabapi_python/models/id3.py +elabapi_python/models/id4.py +elabapi_python/models/id_certs_body.py +elabapi_python/models/id_comments_body.py +elabapi_python/models/id_endpoints_body.py +elabapi_python/models/id_experiments_categories_body.py +elabapi_python/models/id_experiments_status_body.py +elabapi_python/models/id_items_status_body.py +elabapi_python/models/id_resources_categories_body.py +elabapi_python/models/id_steps_body.py +elabapi_python/models/id_tags_body.py +elabapi_python/models/id_tags_body1.py +elabapi_python/models/id_teamgroups_body.py +elabapi_python/models/id_uploads_body.py +elabapi_python/models/idp.py +elabapi_python/models/idp_cert.py +elabapi_python/models/idp_endpoint.py +elabapi_python/models/idp_source.py +elabapi_python/models/idps_body.py +elabapi_python/models/idps_id_body.py +elabapi_python/models/idps_sources_body.py +elabapi_python/models/idps_sources_id_body.py +elabapi_python/models/import_body.py +elabapi_python/models/inline_response200.py +elabapi_python/models/inline_response2001.py +elabapi_python/models/inline_response20010.py +elabapi_python/models/inline_response2001_experiments.py +elabapi_python/models/inline_response2001_items.py +elabapi_python/models/inline_response2001_users.py +elabapi_python/models/inline_response2002.py +elabapi_python/models/inline_response2003.py +elabapi_python/models/inline_response2004.py +elabapi_python/models/inline_response2004_query_parameters.py +elabapi_python/models/inline_response2005.py +elabapi_python/models/inline_response2006.py +elabapi_python/models/inline_response2007.py +elabapi_python/models/inline_response2008.py +elabapi_python/models/inline_response2009.py +elabapi_python/models/inline_response2009_embedded.py +elabapi_python/models/inline_response2009_embedded_entries.py +elabapi_python/models/instance_body.py +elabapi_python/models/item.py +elabapi_python/models/item_editable.py +elabapi_python/models/items_links_subid_body.py +elabapi_python/models/items_types_id_body.py +elabapi_python/models/link.py +elabapi_python/models/metadata.py +elabapi_python/models/metadata_elabftw.py +elabapi_python/models/metadata_elabftw_extra_fields_groups.py +elabapi_python/models/metadata_extra_fields.py +elabapi_python/models/notification.py +elabapi_python/models/notifications_subid_body.py +elabapi_python/models/patch_action.py +elabapi_python/models/revision.py +elabapi_python/models/revisions_subid_body.py +elabapi_python/models/statuslike.py +elabapi_python/models/step.py +elabapi_python/models/steps_subid_body.py +elabapi_python/models/storage_unit.py +elabapi_python/models/storage_units_body.py +elabapi_python/models/storage_units_id_body.py +elabapi_python/models/tag.py +elabapi_python/models/tags_subid_body.py +elabapi_python/models/tags_subid_body1.py +elabapi_python/models/team.py +elabapi_python/models/teamgroup.py +elabapi_python/models/teamgroup_users.py +elabapi_python/models/teamgroups_subid_body.py +elabapi_python/models/teams_body.py +elabapi_python/models/teams_id_body.py +elabapi_python/models/todoitem.py +elabapi_python/models/todolist_body.py +elabapi_python/models/todolist_id_body.py +elabapi_python/models/unfinished_step.py +elabapi_python/models/unfinished_steps.py +elabapi_python/models/upload.py +elabapi_python/models/uploads_subid_body.py +elabapi_python/models/uploads_subid_body1.py +elabapi_python/models/users.py +elabapi_python/models/users_body.py +elabapi_python/models/users_full.py +elabapi_python/models/users_full_teams.py +elabapi_python/models/users_id_body.py +test/__init__.py +test/test_all_ofentity_editable_metadatamerge.py +test/test_any_ofuploads_subid_body1.py +test/test_api_keys_api.py +test/test_apikey.py +test/test_apikeys_body.py +test/test_branding_api.py +test/test_branding_id_body.py +test/test_changelog.py +test/test_comment.py +test/test_comments_api.py +test/test_compound.py +test/test_compound_create_request.py +test/test_compound_duplicate_request.py +test/test_compounds_api.py +test/test_compounds_body.py +test/test_compounds_links_subid_body.py +test/test_config.py +test/test_config_api.py +test/test_container.py +test/test_containers_api.py +test/test_containers_subid_body.py +test/test_containers_subid_body1.py +test/test_custom_fields_keys_api.py +test/test_d_space_api.py +test/test_dspace_body.py +test/test_dspace_body1.py +test/test_dspace_entity.py +test/test_dspace_metadata.py +test/test_dspace_metadata1.py +test/test_entity.py +test/test_entity_and_item_editable.py +test/test_entity_duplicate.py +test/test_entity_editable.py +test/test_entity_template.py +test/test_entity_template_editable.py +test/test_error.py +test/test_event.py +test/test_event_id_body.py +test/test_eventid_delta.py +test/test_events_api.py +test/test_events_id_body.py +test/test_exclusive_edit_mode.py +test/test_experiment.py +test/test_experiments_api.py +test/test_experiments_categories_api.py +test/test_experiments_links_subid_body.py +test/test_experiments_status_api.py +test/test_experiments_templates_api.py +test/test_experiments_templates_id_body.py +test/test_export.py +test/test_exports_api.py +test/test_exports_body.py +test/test_extra_fields_keys.py +test/test_favorite_tags_api.py +test/test_favtags_body.py +test/test_id.py +test/test_id1.py +test/test_id2.py +test/test_id3.py +test/test_id4.py +test/test_id_certs_body.py +test/test_id_comments_body.py +test/test_id_endpoints_body.py +test/test_id_experiments_categories_body.py +test/test_id_experiments_status_body.py +test/test_id_items_status_body.py +test/test_id_resources_categories_body.py +test/test_id_steps_body.py +test/test_id_tags_body.py +test/test_id_tags_body1.py +test/test_id_teamgroups_body.py +test/test_id_uploads_body.py +test/test_idp.py +test/test_idp_cert.py +test/test_idp_endpoint.py +test/test_idp_source.py +test/test_idps_api.py +test/test_idps_body.py +test/test_idps_id_body.py +test/test_idps_sources_api.py +test/test_idps_sources_body.py +test/test_idps_sources_id_body.py +test/test_import_api.py +test/test_import_body.py +test/test_info_api.py +test/test_inline_response200.py +test/test_inline_response2001.py +test/test_inline_response20010.py +test/test_inline_response2001_experiments.py +test/test_inline_response2001_items.py +test/test_inline_response2001_users.py +test/test_inline_response2002.py +test/test_inline_response2003.py +test/test_inline_response2004.py +test/test_inline_response2004_query_parameters.py +test/test_inline_response2005.py +test/test_inline_response2006.py +test/test_inline_response2007.py +test/test_inline_response2008.py +test/test_inline_response2009.py +test/test_inline_response2009_embedded.py +test/test_inline_response2009_embedded_entries.py +test/test_instance_api.py +test/test_instance_body.py +test/test_item.py +test/test_item_editable.py +test/test_items_api.py +test/test_items_links_subid_body.py +test/test_items_types__resources_templates_api.py +test/test_items_types_id_body.py +test/test_link.py +test/test_links_to_compounds_api.py +test/test_links_to_experiments_api.py +test/test_links_to_items_api.py +test/test_metadata.py +test/test_metadata_elabftw.py +test/test_metadata_elabftw_extra_fields_groups.py +test/test_metadata_extra_fields.py +test/test_notification.py +test/test_notifications_api.py +test/test_notifications_subid_body.py +test/test_patch_action.py +test/test_reports_api.py +test/test_resources_categories_api.py +test/test_resources_status_api.py +test/test_revision.py +test/test_revisions_api.py +test/test_revisions_subid_body.py +test/test_statuslike.py +test/test_step.py +test/test_steps_api.py +test/test_steps_subid_body.py +test/test_storage_unit.py +test/test_storage_units_api.py +test/test_storage_units_body.py +test/test_storage_units_id_body.py +test/test_tag.py +test/test_tags_api.py +test/test_tags_subid_body.py +test/test_tags_subid_body1.py +test/test_team.py +test/test_team_tags_api.py +test/test_teamgroup.py +test/test_teamgroup_users.py +test/test_teamgroups_api.py +test/test_teamgroups_subid_body.py +test/test_teams_api.py +test/test_teams_body.py +test/test_teams_id_body.py +test/test_todoitem.py +test/test_todolist_api.py +test/test_todolist_body.py +test/test_todolist_id_body.py +test/test_unfinished_step.py +test/test_unfinished_steps.py +test/test_unfinished_steps_api.py +test/test_upload.py +test/test_uploads_api.py +test/test_uploads_subid_body.py +test/test_uploads_subid_body1.py +test/test_user_uploads_api.py +test/test_users.py +test/test_users_api.py +test/test_users_body.py +test/test_users_full.py +test/test_users_full_teams.py +test/test_users_id_body.py \ No newline at end of file diff --git a/vendor/elabapi-python/elabapi_python.egg-info/dependency_links.txt b/vendor/elabapi-python/elabapi_python.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/vendor/elabapi-python/elabapi_python.egg-info/requires.txt b/vendor/elabapi-python/elabapi_python.egg-info/requires.txt new file mode 100644 index 0000000..17318e9 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python.egg-info/requires.txt @@ -0,0 +1,4 @@ +urllib3>=1.15 +six>=1.10 +certifi +python-dateutil diff --git a/vendor/elabapi-python/elabapi_python.egg-info/top_level.txt b/vendor/elabapi-python/elabapi_python.egg-info/top_level.txt new file mode 100644 index 0000000..00f89ed --- /dev/null +++ b/vendor/elabapi-python/elabapi_python.egg-info/top_level.txt @@ -0,0 +1,2 @@ +elabapi_python +test diff --git a/vendor/elabapi-python/elabapi_python/__init__.py b/vendor/elabapi-python/elabapi_python/__init__.py new file mode 100644 index 0000000..4c63c0a --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/__init__.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +# flake8: noqa + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +# import apis into sdk package +from elabapi_python.api.api_keys_api import ApiKeysApi +from elabapi_python.api.branding_api import BrandingApi +from elabapi_python.api.comments_api import CommentsApi +from elabapi_python.api.compounds_api import CompoundsApi +from elabapi_python.api.config_api import ConfigApi +from elabapi_python.api.containers_api import ContainersApi +from elabapi_python.api.custom_fields_keys_api import CustomFieldsKeysApi +from elabapi_python.api.d_space_api import DSpaceApi +from elabapi_python.api.events_api import EventsApi +from elabapi_python.api.experiments_api import ExperimentsApi +from elabapi_python.api.experiments_categories_api import ExperimentsCategoriesApi +from elabapi_python.api.experiments_status_api import ExperimentsStatusApi +from elabapi_python.api.experiments_templates_api import ExperimentsTemplatesApi +from elabapi_python.api.exports_api import ExportsApi +from elabapi_python.api.favorite_tags_api import FavoriteTagsApi +from elabapi_python.api.idps_api import IdpsApi +from elabapi_python.api.idps_sources_api import IdpsSourcesApi +from elabapi_python.api.import_api import ImportApi +from elabapi_python.api.info_api import InfoApi +from elabapi_python.api.instance_api import InstanceApi +from elabapi_python.api.items_api import ItemsApi +from elabapi_python.api.items_types__resources_templates_api import ItemsTypesResourcesTemplatesApi +from elabapi_python.api.links_to_compounds_api import LinksToCompoundsApi +from elabapi_python.api.links_to_experiments_api import LinksToExperimentsApi +from elabapi_python.api.links_to_items_api import LinksToItemsApi +from elabapi_python.api.notifications_api import NotificationsApi +from elabapi_python.api.reports_api import ReportsApi +from elabapi_python.api.resources_categories_api import ResourcesCategoriesApi +from elabapi_python.api.resources_status_api import ResourcesStatusApi +from elabapi_python.api.revisions_api import RevisionsApi +from elabapi_python.api.steps_api import StepsApi +from elabapi_python.api.storage_units_api import StorageUnitsApi +from elabapi_python.api.tags_api import TagsApi +from elabapi_python.api.team_tags_api import TeamTagsApi +from elabapi_python.api.teamgroups_api import TeamgroupsApi +from elabapi_python.api.teams_api import TeamsApi +from elabapi_python.api.todolist_api import TodolistApi +from elabapi_python.api.unfinished_steps_api import UnfinishedStepsApi +from elabapi_python.api.uploads_api import UploadsApi +from elabapi_python.api.user_uploads_api import UserUploadsApi +from elabapi_python.api.users_api import UsersApi +# import ApiClient +from elabapi_python.api_client import ApiClient +from elabapi_python.configuration import Configuration +# import models into sdk package +from elabapi_python.models.all_ofentity_editable_metadatamerge import AllOfentityEditableMetadatamerge +from elabapi_python.models.any_ofuploads_subid_body1 import AnyOfuploadsSubidBody1 +from elabapi_python.models.apikey import Apikey +from elabapi_python.models.apikeys_body import ApikeysBody +from elabapi_python.models.branding_id_body import BrandingIdBody +from elabapi_python.models.changelog import Changelog +from elabapi_python.models.comment import Comment +from elabapi_python.models.compound import Compound +from elabapi_python.models.compound_create_request import CompoundCreateRequest +from elabapi_python.models.compound_duplicate_request import CompoundDuplicateRequest +from elabapi_python.models.compounds_body import CompoundsBody +from elabapi_python.models.compounds_links_subid_body import CompoundsLinksSubidBody +from elabapi_python.models.config import Config +from elabapi_python.models.container import Container +from elabapi_python.models.containers_subid_body import ContainersSubidBody +from elabapi_python.models.containers_subid_body1 import ContainersSubidBody1 +from elabapi_python.models.dspace_body import DspaceBody +from elabapi_python.models.dspace_body1 import DspaceBody1 +from elabapi_python.models.dspace_entity import DspaceEntity +from elabapi_python.models.dspace_metadata import DspaceMetadata +from elabapi_python.models.dspace_metadata1 import DspaceMetadata1 +from elabapi_python.models.entity import Entity +from elabapi_python.models.entity_and_item_editable import EntityAndItemEditable +from elabapi_python.models.entity_duplicate import EntityDuplicate +from elabapi_python.models.entity_editable import EntityEditable +from elabapi_python.models.entity_template import EntityTemplate +from elabapi_python.models.entity_template_editable import EntityTemplateEditable +from elabapi_python.models.error import Error +from elabapi_python.models.event import Event +from elabapi_python.models.event_id_body import EventIdBody +from elabapi_python.models.eventid_delta import EventidDelta +from elabapi_python.models.events_id_body import EventsIdBody +from elabapi_python.models.exclusive_edit_mode import ExclusiveEditMode +from elabapi_python.models.experiment import Experiment +from elabapi_python.models.experiments_links_subid_body import ExperimentsLinksSubidBody +from elabapi_python.models.experiments_templates_id_body import ExperimentsTemplatesIdBody +from elabapi_python.models.export import Export +from elabapi_python.models.exports_body import ExportsBody +from elabapi_python.models.extra_fields_keys import ExtraFieldsKeys +from elabapi_python.models.favtags_body import FavtagsBody +from elabapi_python.models.id import Id +from elabapi_python.models.id1 import Id1 +from elabapi_python.models.id2 import Id2 +from elabapi_python.models.id3 import Id3 +from elabapi_python.models.id4 import Id4 +from elabapi_python.models.id_certs_body import IdCertsBody +from elabapi_python.models.id_comments_body import IdCommentsBody +from elabapi_python.models.id_endpoints_body import IdEndpointsBody +from elabapi_python.models.id_experiments_categories_body import IdExperimentsCategoriesBody +from elabapi_python.models.id_experiments_status_body import IdExperimentsStatusBody +from elabapi_python.models.id_items_status_body import IdItemsStatusBody +from elabapi_python.models.id_resources_categories_body import IdResourcesCategoriesBody +from elabapi_python.models.id_steps_body import IdStepsBody +from elabapi_python.models.id_tags_body import IdTagsBody +from elabapi_python.models.id_tags_body1 import IdTagsBody1 +from elabapi_python.models.id_teamgroups_body import IdTeamgroupsBody +from elabapi_python.models.id_uploads_body import IdUploadsBody +from elabapi_python.models.idp import Idp +from elabapi_python.models.idp_cert import IdpCert +from elabapi_python.models.idp_endpoint import IdpEndpoint +from elabapi_python.models.idp_source import IdpSource +from elabapi_python.models.idps_body import IdpsBody +from elabapi_python.models.idps_id_body import IdpsIdBody +from elabapi_python.models.idps_sources_body import IdpsSourcesBody +from elabapi_python.models.idps_sources_id_body import IdpsSourcesIdBody +from elabapi_python.models.import_body import ImportBody +from elabapi_python.models.inline_response200 import InlineResponse200 +from elabapi_python.models.inline_response2001 import InlineResponse2001 +from elabapi_python.models.inline_response20010 import InlineResponse20010 +from elabapi_python.models.inline_response2001_experiments import InlineResponse2001Experiments +from elabapi_python.models.inline_response2001_items import InlineResponse2001Items +from elabapi_python.models.inline_response2001_users import InlineResponse2001Users +from elabapi_python.models.inline_response2002 import InlineResponse2002 +from elabapi_python.models.inline_response2003 import InlineResponse2003 +from elabapi_python.models.inline_response2004 import InlineResponse2004 +from elabapi_python.models.inline_response2004_query_parameters import InlineResponse2004QueryParameters +from elabapi_python.models.inline_response2005 import InlineResponse2005 +from elabapi_python.models.inline_response2006 import InlineResponse2006 +from elabapi_python.models.inline_response2007 import InlineResponse2007 +from elabapi_python.models.inline_response2008 import InlineResponse2008 +from elabapi_python.models.inline_response2009 import InlineResponse2009 +from elabapi_python.models.inline_response2009_embedded import InlineResponse2009Embedded +from elabapi_python.models.inline_response2009_embedded_entries import InlineResponse2009EmbeddedEntries +from elabapi_python.models.instance_body import InstanceBody +from elabapi_python.models.item import Item +from elabapi_python.models.item_editable import ItemEditable +from elabapi_python.models.items_links_subid_body import ItemsLinksSubidBody +from elabapi_python.models.items_types_id_body import ItemsTypesIdBody +from elabapi_python.models.link import Link +from elabapi_python.models.metadata import Metadata +from elabapi_python.models.metadata_elabftw import MetadataElabftw +from elabapi_python.models.metadata_elabftw_extra_fields_groups import MetadataElabftwExtraFieldsGroups +from elabapi_python.models.metadata_extra_fields import MetadataExtraFields +from elabapi_python.models.notification import Notification +from elabapi_python.models.notifications_subid_body import NotificationsSubidBody +from elabapi_python.models.patch_action import PatchAction +from elabapi_python.models.revision import Revision +from elabapi_python.models.revisions_subid_body import RevisionsSubidBody +from elabapi_python.models.statuslike import Statuslike +from elabapi_python.models.step import Step +from elabapi_python.models.steps_subid_body import StepsSubidBody +from elabapi_python.models.storage_unit import StorageUnit +from elabapi_python.models.storage_units_body import StorageUnitsBody +from elabapi_python.models.storage_units_id_body import StorageUnitsIdBody +from elabapi_python.models.tag import Tag +from elabapi_python.models.tags_subid_body import TagsSubidBody +from elabapi_python.models.tags_subid_body1 import TagsSubidBody1 +from elabapi_python.models.team import Team +from elabapi_python.models.teamgroup import Teamgroup +from elabapi_python.models.teamgroup_users import TeamgroupUsers +from elabapi_python.models.teamgroups_subid_body import TeamgroupsSubidBody +from elabapi_python.models.teams_body import TeamsBody +from elabapi_python.models.teams_id_body import TeamsIdBody +from elabapi_python.models.todoitem import Todoitem +from elabapi_python.models.todolist_body import TodolistBody +from elabapi_python.models.todolist_id_body import TodolistIdBody +from elabapi_python.models.unfinished_step import UnfinishedStep +from elabapi_python.models.unfinished_steps import UnfinishedSteps +from elabapi_python.models.upload import Upload +from elabapi_python.models.uploads_subid_body import UploadsSubidBody +from elabapi_python.models.uploads_subid_body1 import UploadsSubidBody1 +from elabapi_python.models.users import Users +from elabapi_python.models.users_body import UsersBody +from elabapi_python.models.users_full import UsersFull +from elabapi_python.models.users_full_teams import UsersFullTeams +from elabapi_python.models.users_id_body import UsersIdBody diff --git a/vendor/elabapi-python/elabapi_python/__pycache__/__init__.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..398988288172121284ca55b9d99e5e31e6e65120 GIT binary patch literal 13749 zcmb7K2Y4IFbskC-MS>JbiRu+9r!IC<5~Y*GF3hNs)b+bP5Ll8pfdK9;K#A9T(e>VY zFRpPM$GJF;<2a7vII!b5j$)XO?Q`7XoP9pWaU3V_y)9URyVOY^B>eNw|E9i~c{9-a zbLIpD{#p0Vw;XRC5q0Tql()f`y~m5j?&m8^zp#sM`~&VzZ3%T5AzvU zs0DH%EMz=KEs~32G2=?LL@tG;jH}c#xg3@=u2w7LN?6Hwu39C75M(@0t(I$G4dWWM zR<46}jOVL!k7+EC*qbag&P3C`1`ID_su35aSj#EJt93ajS~SE8q&o+tqOy zhdARMYE&j5!FZ=i$`qs+x2Y>705IOA44H;BlnAI>*Wn_1LF>Lqr3@jV%({2mbbtyjJwpW@;11Qaksi%-T`+o z?ooHjQ*erLuewX#4ROOft+|O952jqkBAY-K-k`Kefj1Qg)+J_%1UKCGUSPs7uUkEmzlv+ykAqv|>NJUq|1PrV>tgclk2tC!@< z@G|28^@@BIUS)hty(V9W*BPIu-jHv?n~cv_Z^^geZN?Xe3J3S>W}27;8Tn*QGYBy4WDLwsrnQ78Tbt2%haFB&%$RJYwFMBJMa$U%hjLD z&%x&yht*%m&%@^#530YEUw|(#j;OzqUxY6*j;g zcjb@ZM~pM--{p_t$Bf6+PvlSGr;JaipUI!Y&l#Uo{~>I3;3_zmN0)qly~!fzR0r~X_14t~e@di6i@_wakhH>m%We}F$Q zzES;OZ;=$eMIbnRQ*V(fLS_asGnlykWnY)mwL1sQO z^O?CDnFYu!L}no~_aL(fnZ?K~X69aGmLRhfnWfC!hs-i$mLs#AnfsAhfy_!|RxZT z3Yi1Q9AM^kWDX*82$@67yn)PNWR4(ngqb&yIf_glGJVXvg-ky(1IP>n#qiskK62I1 z0{VgQV9&t$!M^VPfnfWQP;jg<*p-ZAM)gEGoQ@?Efxy5>%m_v;E*RB~2*d_;BN&dy zgW<7oEFK<=>p?vcO(kQAH1dgPa8yr^B%?-fC<#HUiVcQYz77T!8*Ho%27_yZiR6{x zwqSQleM2B{IHf132}Vkf1jkHW8w%@d>jQyaJ)uK5tw)1{<88r_bUJ0U)zuBh(j%F{ z+DLM=&NvYs9@b%7I2ChnBpKC*^+YYo0zaYHZ&T6fs_>wZjAzoi78^|^A&pd^Jrz^> zxPf1oD(?X7LM$01PJ~rd!3&cjfitd}SCL#wQ3IZ>8`FWbZRdg#d%JSdkic3^syMZs#RKPe_FQ(rm8=kgz&I_ED^Iua&~?M z%LnxEXg)cIlEaY9*w&>)Sf!Q^B%{fA%t)I(n|BPIDG@V9^r)-4z_C<38MZyH@|dB+ zB&L)YtH3fWs52fzk3v@_e?;fZ;KIRK6x04my~Tq29HR}*R$ni`vNX=il%dCHa&wWipn!GVS)|OE1A(b2BbCk?mSl-6zu! z&TpX9aNM-gxL;W_G9wg4a%Lz>LyKRH=2w&X)r?=|p=hU$d!FsBn6&nEi>V4lyY2JK zqLv}$^v%d`8CLe9N!jMUVP(w?@njm4$R(kuv&&2=4BN-6-6|juiqh_3r7+V@Q3tCr z>Fg(#WKJk*?FSZtqmV)^ZRON)a|lv)7cp6eIp)TWiBj6;^L3~4vx4K|8~~O8d*@J& zZv@O^!I325cm`sBQ@DHTjrH|d$-Gb@Nxi9=%941+RN6HeC|ERAz=wf%7H^N3HMI@o zD^po=ovAE&(&{PoHXqICFn%NqxPPW`7xpx5@nl;)+3lX}4o`L`vP-8lX=nH7pdO9t zv@E7J*vZAMf+7hNRoJJuHG#!6mdxX~YY(a6F`lxrtC{8#-tmZHQehFL?w!!a-54?s zrB7gXuz+$c_Fg_QQB&h+@;d=F&VAxzdZ9Z#X=5)x5>7`(+9TE(SZW{aXoN?^goJ7z9DW=7a z-(}9C$3&%*usyrRVJ4NwR(4Z3EXl9!Qi?oc)bHw8&NfxAwMcH zcOgX8)_&yf+}uKr`Zvq&K^X(9elyXNiN{gG@s2?W>Lk@u&RVl=hc+H765{l1O~WgS zrkxIG+E6B)0bSEzCPw_HSLx_&;Z#gZjpLmpQHzlNY8c2E8UiTxQw>`809MWNQ$?(! zgjFS^3VPItD)ZLBve_hC;VGkdjWwmDS?#T{?ij2qBi$x19bY}PA-;R$yGyU*r&oID zqZ-FKTxhvp19iTuu%?1EYdi|l^XDcD=a6vQ8H5z&nO7UOsU#b(Ubzc5_{zijD$;K~ zLmlYs=2eJIs>#G_Ag~I$A+cyKiPm|PJ7is)v^1_^md+#TG7o7CPfS+SkYcT$!nzx= zay}`&9K^h{vSxvAeRwTn#X?ee`G3s1t+8qmsg`@S3dhTA_+pZ5_m!mSa);~9zTRn* z2YLxvd(9g6F|UMyL((yz7o;VAI!Rb;WjqqTVpmuCk_?X{(VeROd%R+G$Y77e<#vSbZOyn1e! zw^=Pi*IAaXC8?J$JKny|uUTo_r1Oj79FlqMVk9#!#a!Wf(s?zXbY`12ki^TI)7BN5 z3))C3uffeYH)}0FB%4U>HNzS6`pZRbCXv^&&EU0Lb1S!y(yJGwG<$(RNs7};rcS;V z;Y&Mg^C}|ZzQ#i>Np=<#F^U(mxKWFba$3^5;A^^d!`DXLSA3`=`#K-{#5mg9eKP3w zuMN`mAL_jtX4lH^0?}ceux?j&DY0}@x&=aNO?i9DS} z1MDG_!p*`miJHL)`6BEkosXZnbPceNgoP`2a)CO(+(0`i3r~>AN_!DO2Wfr0*Q(yu zHb5tdeP+O_yNe{X-ri$MG<=ZO=m>L`G;~kX2+PQEIOrj zX<1XoZ!Wtkr(!=^JE+LK{8!_!BWe(uR} zF!YneXSLa(GB3*k5*8l4PA~Bl&wUqxW78Ci!8HdOTrp<4Liz(m7713WJ^zdk&dY6#WXWt;DeUao|UrJ)1!9=n1bDLT8 zWu$KQ8zapfFS~+Ku1F(OpR<2FS|>Eo$bMc$>N(--Lo8$c)JM&E9_qF8Rh5XpTuT5N$GSFv`Ow7!m;f)UF1 ziB|AR$({u<68UyH<@gC)K|-G`h)OeWpKzRHKG6W*W4Y<^>1)kzFQX*%^&{BQ6Rsz{-=;go(ROOO^~(X=K!zWB zr1OTj;qb2ta3dAqw`<$aPrNv9BIQz_NyUf-Zl10v6y!t8TS)11=P*yCDWTJ?Wa8)I zSUA2<@#~ho<=i$+YpHO!odiDHwtX#tJ4oac3fLlzh6H~mfjdd;GZ%$o+$vmwmifQ} zr>Fp*%Uiwxmm%Cm7Cy&{`<)E#CZW&W#Vy30-g!%ad!{KpMZeW(Vg9iO?j@nmSlZ8D za36_$P7PZ$srviLz~?A5BNqDQ2Oc1qk6%*I0S}VEXA;e*#MS4ANbEDB?)Nu%n1nuO zm0M^9m5-3zXKp9UZ4Z8wEPUb)jC|lR%J+$3I5Kke>T%Ng3_*dm0iGbS&wx@O1y7Q| zC-`t8EqH3W_SvtBnt6adOBbo#|`rBsy zq-iIuUpVVD4gU*STGMJ%)@}tV?nN zYuuj`Xo4hm1pn>MiM=dtWZPCABFsWPDzQn}F9bMNT2A!y2b1P!#0Cy?VNQ%ph}{!n zOIB<_kR^N|D-KMEo~-Dx`KGLBnh+gX(J>*0vtoEcsH{*EVpmq|nh-~`;^>5E%Zj!M zVJbse5tZT+Ugu|3_AczDh*d#zdfI66_ z>!!P1+DX?`Tt}4awQ1KK)1AzOnP#SHw>#rB?QCXuJ4+af0lzSbGVx|6drWoZu-iZO z^ZmU8APL&-ANxf8@ZRq}zQ6DN`#o|vtQ?-^zq$16Z^9h+bNWypqw@0THN3pa1vrrl z@B!T!{nf8msHb&oI*AD^3v#FF7;G#;~BN3KK@!h{khOhgjnV)Sw(A%v%= zh49sIbUJ)_IwC}36SMJXEQ$EogfJ6HUWrd6gvq!lC{654$n{6W1gaJG_yj@l2(kF{ zVZSiAudCZ?JwF?XQ5O=kk#XUwoX?MpUA``>^+Y5V5yQ#IgmC$WU$~M?&L;ewom0`| zmAT8l@%T(<;#zoWDk64-XQSHtczhx<6^Z$f&H76kxtEtp!j}{A>A7Si6rGuki^+3{ z!x+U#c;Z4lK8-Kq^KUXuN2;XufC}F3&F{zxNmr@7fyQfhf^-(T>!bt*LEFR9MGx7wzZyi^XW8 z1g(?~H*L+0SfM~{c|h;8h|UJCfeX|Jj5XY|yyyy;YB;gtVr9Tw!|hWFiB%V?hP$@b zK=72y6DUH-YN}2C7ib7rS)DZj8&YZmc7$~S2f}(a4_e+4C}z1Dlu|;VgnjP_lp?1P zXbhCG@5VqmzMBG0gr0y4VRN7YVN0MAVQZiY;m&{?VOyXYp*K*2a95xf;qE}4*gj?O zHc3VOv(aPIQNZ;t8!({oT}&VYs^~Za%yE{+AT}U_lAuIQM=y(E@rH1DE;>Dt@L8>D zIzTHTZYb^(*ltk@UcpwF#!g9Ii70h-SQ8Nupe+DmXXawjaRyoKY|mhqMPpaPVl*5} z3gK}vo~uuiiwU0)z}|>XM#mFEe9}twsymJCI)MAMvgyL(SA_8F?6lH^5Edf> z>o40wlVW^^bxRqFH5oxmNTT7LJ3lh$R|gWNUSLztCF6PJFW+FLl|6^iOlY-Z$IpuK zDKR|bvkpfl|FwJ7IuHj^ND7gOXi}Lt>cUJoHV1@r1Ksn_hEX}%%-frO!M9Aizx&q|n z+f>EX@bp}M9qjuvYqA3GZK-WM9)B*%>XF~5hG=YjdJgj%jj`-XC%1G?u21Wr)oYRT zz{8SZIv$&njFZ#xa8lAIlA>g|4E!b;Ca}zsg~DWXCL)>SsX8~Vk}cZpL?-C}qaPr6 zl?(FYAa`Rxaq^>X{TM%5I<3WyX*HEo6yESr6!azsi|EY zzRc=ZP z9;Oxt4!INvR#KVb|GaKmTOb?j%;P!*KPM|4lEe{sN@kU=f*WK z!Us^Z41Uvi0r+vl_}%;rYoL`&Q2|fbu8anvh008E@A2onda(kDl5u=Go`^_>XTjCH z$BVUyOHdyLk;sQ+4uybhF=b`>Q^ul(C@W=pfy-L#FBiR7^m56IC3h{=>R0iL#Xq#T z#YSW)JZu3e+YLLw(-@io&GQXG0F=N0Du?NagOVZfQ!Ax+^b^2g1a1@)TM^_9LnIDE za^;4Q1JS1_C(XnQ+dKUOQYD_{v#FBqHA}bLd0Hp+(NKnfm{+;c(n4z%;AxYx zttjroo46andpb6|l97RYf+`i{S!Uf6+Y#|J{wGQi017+yWGrjl=G)>y2gpdLYjD#E6d*SkCsNn*wGceYfQo42j0ze82XJcUOA0aY0ezoN9ZQTKI>2!@tX0sUjRi2b&5Rk;nq!7-#$w1Diy>%M>zn{( z3R={!a1U#tO6_s(cl5f}GxIimFl&9F9EH}(oYx1+LquxRGddEqs=_A5Zqj;&`P`;m zlh&>YIX2ZtpM}JsAWz~_tQ;k1&u)5xx?uU};ONz$BUl_T^jTugpc6cSw%$Q!%oTKK zeZ$rd7HMBtZ`4XideehCinLjDo!138)MC@h0j`3sX8aF23yEZiZP`>IK2^fiqX%X; zo|8<+7)Lm7_;O3)D<`%qojvn~j43QDVX8P27-5L$hK8 z%-=)^+)NTA05M_&#gUO1zxZ6z>y-Hq)7&hvgEEDn#gu9iVK4;I`A7&7d@lbLOf(kk$Mj%FvM?|7gB5`R_HT66+ekF{IRM~7ec}4E2 zRD~X*nn)vh7iE7RytHTv%y&K?|k zr01K?^N%>b{sO-+^lJ-eugcamWNP|SHGOw>r)!QcoMGR4Q#E^6&t!X!qd@IRe&Ni| z-JY9s+Ne9lFPvrFd837Opf^?1yZYsH z&1t1WpWDIv7Ou#Vv3ODz&+^dw^>;1je{JIIrCDcH#5Ws9I4`c3woOH`Zw*j?OA*I;<4rFtlN{V@4(;vBCfjSK4+-zTyWgCa}B$R zr>?nI=~=M-#8&%@lDcd|Q>MX}YVfUm<<3mH;p|P@y@sYm+b?X5S=Wv=yKv97W4S)l zxG&X+DQnEQ+EcFfw99v2&%3(rbG)N#D=$aHoG~O6eu-F7o*30BJ|_YO`4MhdA=t>R zJt|_{fDZZQJmE3Ok7=yQmfTH1p1hNLT9?puatR$sH6)~%4sDU>wdo1!RFZK)H&iK; z*@P~p+tivxEw-gKu(x9x;}Yb0prwVz$wEC)5whCCraCndwvaG8mP@s(ZRdV_H0D5? zBe02u*$}lCn_4Hfl092Sg!KyYG5z^3j+Lu<3b808ZVzL|Hb3fUu>yvtjR}31yar(L z=CIbYgJT-0A9bm1k0WJ>h$UZ;KpTh@6e<_e4f*6Xi|Jzqu!x`6V|`xlOi!D&-hs_w zy_*V}wt*9kr9qn*0kLBVeasv)HDi2u2h2>$Z~B-qX3*Y|W0Ldg!%G1ECzbYJTy=^iN}KZB|coFP5rhMdp{&Z2WsC`08!su~T` zMyf{C1!~6nu2OJl+T>}J(>2OI!3G2MCoAH!p4%Wo6K2_q|BsF%IKq3d(j-U&j{w?Z z{D^KCOS$>Ush+NKuNnnz2%<8<$P~9l(d&o=dx!rsV0DzWWtOOHXt2C921Qw-93(4JY!{La<(g(hR#$&=Xc$IS^u5-wfdtO#}g^X6KMX{;hTqFIl5+V`q);n zIR1K1#wI|GmaVFJ@#N!Du5I_bUwQj0tAWhE_? zKs}#4vLHG^BIMuH4t5&8f24e{$MkoudW3)PXc+XH#tH7#hhUJtAN_X(*m1Cc`A1=8 zk;T2w+;h#a8jWe3L?N{WqgDl!5h^`^P|po(3I?@HPzLW&X;d@U$mJB!W{wmb0#U32 zwZ`;2xO3h~?l68Qd8pYw8pz2N3E*~_=O;uShv6ni1r)=Cn!(SEs>5n_Yy`4Mpv+}p zyIhSEnn^(|$o7~YN<1<~Ow%3=PZQE(Xg|D8@ypYMa7dgNzL<>cGVF zSR3&g0*13_=gZsv1frx0tqZ=q9^9qeVFcLbm7KkL>3ABtWMZm!rJTD~4y2tuYxbV| zCVf%ky0hw*{~P|LD{s!+o=H2~!E9TY;<7PS(zx85F6mvf^#1m-nJcZq-Ysg(I%{cb zzBB+yqyJtLk8lH&Ykcv40IV0}iZzZj2hp?-PViwUQi8f+ zVum(70j-S251s_aq(SB|p~+1TEc$wIzsjyD1p9%UDoM{cYQqMOdK>l9=rOg<4IH%r z>WspD*HnC3-!J_O`fmE1zH9tiOh2ZXdWJQwH#ZsiW+U*d#-~jhR|tB~xWcDLFBDQ@ zjgG4$1y88Zd+>y&n6a4~6$;twNjwh|r_L2h4eDrVW4iM-V~{H3XH4U;htb03CpQN% z9a=14>t`*>7_@+LYqVS)0j zpK+yfZUvcYSot|Z!<(@2zX;>X2pBNX+1Xn+PMKVr_@wr*? z2J(xO6igwIT<7|8++S#@|H6e+=T3-GN-8FsVHie0*&YZT7_saL@iHYgZiCOEP>jw% zD+n=zL^Y{lyL|G<^SH}x$qR`wlCWJpv^2~{UB6up)@`qu(HTZqBqLidnL~eWIw4tz zRi}!?5%gIMB1n)bfrt+tnQ3=yAbL_&juLH1_+M1`6)YTR5wuFBFCGFR`q);oX#Cp2 z*FAS__1O}b$#$elb}XASC2gsaw)L92H``uoTRyrvn6B|>YMw~dJn?>6y5`uT`DbnI zU?bf=sjYqKBzUvx`iy&5$_$RTQju&2#Wh5Vd7$PNiy2 z{h%>jb9T}Ear4f1hu$7qZNA$~{GYo|YTkc)V5y(lsL9lJq-r}>!s*(+58QnpH52#e zCho7SkBDVO#@(HAcc)9bv+g?ieYGX!K5*0cv3tim#j@gUbuR5bylA{hH;rsUb6TE3WpIi`WXYA?Qcmd(owDl7}%s}Y088xna%AKJI8Ubb7TOXwV&hlDcq~4b@G{pSnaKmr%OSuCMLf2S#L1T>LY!)t3aZsW z_>agQHY}QK18{$VXAP;~b8a@^-Ez8ezibK+rTow?@qr(sJu-Y*O>2SCb6`e!XU zPsOg(r8P<3Pt4H;DsL@+zO}>i73iM6q3VeW+fw`}mEV1$i?C}khb~A&WB_8mX>96cgkLZu=Q(-Z6KaE7jWjZo zK#Heanxa^fCz{QIz(7`>47p0#yN`iH4jQyc-fX4w3(-m8IFuupV_G=?1^f^9`UnGP zYo*AN*P_$Y+Yb$5ri>ThGpkMvdAUM0*f|jaoRN-Doxkm?A-M1f1G47>sW?Z(xg3np zLgt$k{eog!BI!WkGnL$TlccW3ri!RGHxkuR1jN zNUCBrD~|CLK%weX$)J$83AM2hX2jaCvKqkqSe2v^RZuJ&xxA1JAe6D=ojN6FM-Md6 z%Igazok0?@v@_8JRD)AmZ)9A%Z5!&Y(zMage7f?vFx9LmJ4@LJrQHazp?J$=cI-4r zop^?VvlR4FFhqf7M-|V}CsPVsz?)R0O{4e}r4aGVH;u|eW^($LWs?~>i`uPxPc}8K z3{*amK%FmezaHVa(rR!Rw~pRCx_mh6@!grpdUmcxvYxK2r!VW-`^aW=o#5|tMhC)T zuCnIV7jJ$sQ?V;mv1_I0+ehC!dgqz!?(X;P+1&@SyL(yKpWS^pyZhk%67yj)ahfY( z;yeyUv9xl*A=}tATN64#HX_E7xWML0z}P;K)P$F$Ii$X4W6m=hT!xCrXXm)MWmgnhIzD zx2ehUIW-k>dZ9VmI=UiO6J+mg)=YCX$xW8hCwZ2veXv30oQwiCRi_!@z4rOGZ8*R= z+R9A5D7&HhB>joO5$N04Cexe=#QkVhGMpUjACS!FFN~Zze=guP$(bmLIWy!o7~7bV zflOPH{z7m>GG6E(Id)Pq4Gf+g92xW)^GfF0pxr$G6!|!)7;9z@+z)W|CG?3n8ET(? zl^)P5wZVR=0rnCcxkPB{lHArMpSMV?qAuR1;57>Vgo4*8_>UC4LBX38Tt|THwe-&L z&C~S8rXn{=hIF)ECkW~^93m?r2N9L;&8Z;TA;KE($wD9870MTbUpvY~6Hm(N$vAhW zoI6+a*?s-lzEkwqwI2q1G9MUR5UUK1zWY|L*tK{y?WoTy)s}L$tvIv2PiFn6>96|$ zmGV+4Kb7*!rEa7hLS88*`y9*m4Q6`|W)B?89v-5tGxXQFm&)#{d)-RsXDI!k|D zJ@;*#Yd6rctCw(d@8e?5S$|*0m+gO~*E@^vb9zUyjB5$Est;*U8Ls^%*6~Z`SGi6O zHUk}5uHizd%lB%?>1|b!Ow(*uLbGX5t1M(W$k#@m=Sk~&@?}{IIb)6)M$ADS)9B3t zTj)m2OkW81%{;uXFX%>T*8CC-Tm2GXtt4kZqk{J_%77teI`2Y^k>MtaF(Jl=7#V|7 zj0G{eKvB#T)ECkoqpzkyT2ngL6D-gR_%vW<=|O*f7ya3;R>OvzH)T6(keuFZ^Z)k* z1X7KU!I=}XegKt#QQY{pmSm~c9?qS#(oX=v*%sDdo3g|usgT(sJ*#XIC0 z)p9IHu13`_E3cvgOuxnjZfZ_zhWW&`=apn~0#tT5#%6`?jwHMd)@y=MX1#{P#YXEj z@D*9FgM5!pu~CEC*)ZFAHtP3ao)(`$NwJdx(sw1OMnSPni}0c4r0$$@D>v6U7rp}a zX!3qwj%Lgrz1H%?Ux!zN%g?X0{MoaA9ahZGWiB2zev2gIY;+c0a{TW~ zeEWuB(k5cVJb;%x6FoFGu?;RpDo`myhSqV@kYSc5wTxGn8}|nPaT>AsX9)h3#()jX zkx6}R*WllF-)Z^Q-j%s;`&ayb+bs{`tL_>ey2LP*IYL2Bm1>GyhYRI|WCEXyU$F(r zstXfx<;vN3sgx(P_>dGH6qGuMA%88MNi12=qO^OhRYp7_x9 z#J#GvmBDmXceZ)w?V@b;u9Zl-dT+M5P5zilSMOsf_nLPu6=~(O)iq0}-aL2vTx!?g z_qx-&2GezeYwqK}*7Fr7d1yAvYBQycsnW*f?&a`u>xZS@2Oh3sn7`i)E8Uuxa*xRbN}5a29# zz$xe2p0m@P{`enK{6#bVbL-ET8QuR>(0uXend|Q#VSi z2#bE&a~{J$_4MQU9EX3^Sw+i|~!$@IS|L;M@{pC$+;eQ(E;`eQxj@Ap^- z^fqEFwTJjThOl133kmx9fIP+6#5{Lb(71S0A$x?ng<+V-7N!jn<6}CUQ{fp?i3y(4 z1@r}#1lq~Ue0N8$Vg3(>nJ0NdxYR#B9+^#E5(v~Lpq*pZ0#OX#Am%H~5)+z2F1MYO z6u)p*;nNf)YED5W$TbUX5#N+A|3Gpl`ILBJ9sRU4e}ho$yslmF>d4>Z8b~A~wes04 z$*eRe@z)j3Mls;IaF`OhI_1b^NY0i|K?|k-9RX!O76tksJ6Bo-&+DJHcBIRFZ%-|k z-P(V1|2O;Inp!ZgmHY15>X)mSnX3gxs9SwE`B~>lg^CD?tTSUenWb0 z{gvnrhM4l8Aiu@!VL=4O=jQdhI(ISD3Fhtxh)@pZu~WIZK8gPoNgIKnX5%8~cTvjs zDck@m`MK^AKn$Q>86Y6AxBRTVFYWgK`Oxz7Z&ux|dZYTip#{g9+fM*dpSJl{TkafA z?>UK#_ng9V88iZGb`QZs^+D$1^hecx!?*!8st*=RMh2~D3&=n_;6_vp$bb%~{Q-Ce z^3PGrlT31-#W?1V?k0f^bbc=x`|>JE#-F1* z3lzm045^n`K3SzEm%jx49r1o5Q?={iz$-HgOnYXMnFXdVG|8it^BHIWl6}K42!>@& zK;{9CQOATF4^a5<*2lEDzz);qD&|V-fo*^8YFrp#M{&q0Aya!WReLa9dpJ|upQ`PD zzd2odV&UvhOKKN>H(TXdK9Q+v2V0P>fGc0BVkbQRD)wgg9(~`O+Iw>G#7ae~t~2fG z(vtV5EB4@o(5<1HL(7L&jVVv>9sB!VNF5kjYdZI#>-@(x%~>~2Bk5`@?{m6}%7+zP zMUyOST{U*CknKeAI$u zo_Q`oAMz>KQhJ5vkA}=nhKhGkSZt;mOk!jvel;Q$X{SlW-)HfONLYj~4oEg9{uKoT zA(9zACRvTSq=|n?@nH%`S0$NbClASZjm}mmS|kxf5FMSIV6{k2l`WabO{(~}RK*u4 z_#OgwdO}9SsvBGR25&XlcRTNnf~~3l%%h&)qOupb$K{->F5~ok;Pk8*GHw1;n?KWb zCWSxe*%vJfx^;{7Wy?#J#qzJ)>9y#kqQ&N~m)vV;%`|kS8oJiHkEa_>tXXP*Vry8h zs=jsO8#mS(2eOSlU5P z$Ao>W*VE1?KoaVj-yFI4eS5`3dNB}x|EzQ3#A zI>_n&p0f^?m^b))6X&MK|3|bsui~6SPzNNNCr;s10aD}#rwX7I0g_gb5e}?V`AtuL z`GjrLW5Ku#C270P8wt`O3d@0sV}6WB$T5}P>_m9qF_ntZ5r1w zeDUiDHnQqf8(~o!MZPLwn=EcjZ{iSYBqvN`k^3X3d&%|6L8v@`yI#^rj{Q5=>CDYH z4lldX&ejj?t?MOjigv@a^wJsf^>=^DF6Q{E*~+~n`1Rki`SpLr`}G@SH|z{~>4^m( zshzy?=6B076p&i- zWDMF0H_Zk6R$hhJZU(G>jTZt|Tmq;&!<~kf03fvia0`hFsu;nJ%Fv+Mvl%3FlpQI+ zbpUsAWMEHWo&>$n7ve;6+Xy!^=pwuZ?8f>2ZGasbDR!ns255N`s6eiQv7Cp=kMH3s zKV(fr=9`b>nnEZxXv0v1aOulkU%5mECd#fHqro*aCovAf^^rd`*h!a~th4&1q4kpL zN1UOkcpazw%RL{Id$LvTY}MgR)j+Ch;Qgo5Rc9XM>fHddjNUA#*Iv_OK||%-~Ucj1kPYeI_ij+7H3HiJAJm*NTtb*5{iO)=n4%*l`ST~HbC7& zxO>w>$0$`fK+BC9i5kIi0cNg3^)hGic)FsUf#?zi3!Y)J^ zZCBs+Y>*gNvgS{TwAX|U?w(D_0jU}+W>FG!K}s&lQ;jSXEdVD z(`XNgU_+M`;}PgyK!;ld^#gn_4{1+x5(}Dh{ZY%Ra~y__r0@(~KDKFegd*9qr4CSj zNTZ)&jKeI~D6{;BqhBqw9tXjNu$h4rO(zl9$ROX6Vr(0T$ulr&qw%6A=0Y-ijt0YU zn7jE1^SjL~SF59pnS*fe^Xlit4OmrneGr+`I8j@6J|~AJfj>8#wfY?9RO3xqHQGU2 z$ptA4j>q9?Tq}etSwk$Dv0Gl7cm=B=IrCjrm93p;YA=})@+d{Ia=k8@aot3fMvU!aNm@25LqMCCf z_GKfG>hp2WMD8qyJit+GuEbvSj4(4h5!93^X@WEAk@t?=X<6(4LT2}9YWFBG)WVs2 zWzGdt76)`}4JrEDweD$s_wd_?S1U5z1F7zT4?Tl7OBM}Tmpko(A`C~5cBgRJ&j8N; ztd9K9-M8*;TJHH)^LGs^I0e+3cK6b~K8-!8#-7y?T;+rNeHI7dFPrh~OL_LKM$(=W zi^pF%`@qIEALkzwbFS)}N0)kU9$m0}Y_D9r{*EhSZ%x@-vp8Q=>PgXG=Xz<)QV$YJ zTT`X2xWeYmXKz3I#`I0=q8=yaGY#FThVCCa;cDPr3cNCei+pzMhO>aZ^yMQj9$9Kz zYxZYs2UE6#+3Lnjb#JP=cQu)=KD2Q9CneRIK5=CN7f~)+vL#guB@9D@mNEq>&@Ct5 zb#IGjh)BP~Y*3PZNFOSBH!pL}W!u9f zpx`hCCn%sTAbyjAK?;si@FWHQjRNQhIT7fO6O$DDdkPjPc#(paD6j%L#joK_stASX z{6%y;MEitY5CMWLi$sl-wSfYXXjnjBiB6RML+*jD%xJma%DL;8CYA?R_I~^DdxzI5 z`|cde92!dDuX5;x^Y=>1aeczAYqzf5)GrTY%PO;oD0O8^-M1V!9a$(cnD0uq-2I@e zsLr%zaO3Rw8U8$vQ*Dp+4rAZL2A#1Q2i{D@4|F=?o=1AT-KRH-E6o@yQ^v{%I^MXK zQmWuzXx#hI#2e|1T(3WS`drq3Bzx$IY|nwmwllo3>*4R{+ED2T?=tRx*xrJC7kF-v zKgANcJt#Wn1CS2Byl14$K|vM@xK5dR%DV5Xp)0tN@~(3=JulI4)RmyU={ z7#IGy1OXr9cb

t~O=O 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 XSLi>O_}~2F0oTzx!(TD@OD+8`;W7|a literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/experiments_templates_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/experiments_templates_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a7cdc05291a9283aab10e50dc6ca979f873c0f6 GIT binary patch literal 23257 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/idps_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/idps_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8cb3177c51349fec7f510e98a126a9bb8363e2c GIT binary patch literal 38002 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 Yl+FKNRP?v*$*`?^dh~Y`{wKHj|LL8EPXGV_ literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/idps_sources_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/idps_sources_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fea04a585a26dac02c056c977b810763595f7bc GIT binary patch literal 15214 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/instance_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/instance_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8eb110804ce64b0702dc915cb5e3789389dc9186 GIT binary patch literal 4440 zcmd@XOKcm*b(cSpOH!05>qklUM3N;jwMh9R*JWx4j%E3yMmDshYuEwSOL9c5wA@|K zETu@7>IX|8KC7Qb`X3^!_H_-AK zG^H0RWvrR9spy&@WET{QitZXJVpPL~vOp^{G(^m3Z6$fXh{=(1I#cia@h+#ncfn*^~~M3mCc5 zASOX$7j$V5y+q`4N)V=W(4C2JQ868aI=!;2Rp4G$Q^Fjc|8LbK%oZ9FGr`%Inal3G z&^_jId;!e!J`WS8O}c-LzuTrZS4-Rrel`ipfn8gGyO0WwUXvc%N3l9jn2A$H8X@~$ zx~!S$qHN0P6`d?mLoVPn278(}SEOZKf!Q+Hl}?;RAU1BSf?a8ispL*!C#|^3mSB=H zR_&l9DVkzRl6`F7J)|0|#~B;Pp!<}w!kxA7!0X<@KlD{^T8ZJ`#CBnwJD>~Zeqs1_ ztI&b_@i~v^8HI7qGuM4sdyQKXBL?Ef|DKeF~|1m-igZc5_4ljSGB?d(KWq7(e-Th zHX`_81yd6|4cvWRuBc`TWpxK0P7>s!5KbXO#WKanV7BdmNkHpjmQ=8C>Cz=IRD$Iq zx`>=h(y0k|RQHjwyk1;AbqFWvAQ4P~13;={r%KoyOA129kiir7Fi>9C)y8V$%0B?A zuu+7Nahri-6T*rUm6($?4sR-Jj7hE#TucfXg3SuiGH6!UumG{D-fql0-sWl$+_wPk z20>}RPSn*?dkA$h)WK@#)fGg@+FhU@c8tUVn#4Ro(lvF}4mFhrj^hQ1?S5mwx}+5d ze03y6o7a;*!mQKwF;VTn(uzz<)b=rYlzAfKokSQ!^Z*&Vx1p%Z%xm_aFa*$a7P?Ql zoqq1rL^ZGx8?6P$tZ@5hnMaxRrLFK_Ej(y-bZ>Q>`?llUSJ_&})XO{2ZA7NFJA1b} z&wtx_{wuTAIsI}Ox@s0ct1~19BoDY&92Okc`ZG8ObFDPb%=<^(%F}Qw#2o?Abi5-W zeE*h)e-Gk53xG~*hCAPVrctNO1sbEhKe)3`46u07pwhuz@8`G*NN3!+E4~LFE4M-* z4K;AYmYjbaC^g_Qf47+Pv*7X}M5!m;aT(d??cVU&d*|?252JMVLL?ZIVH-s>?;Gplc>n zjj-azcF9!ASg)9*3jo*NzXl~51$w7^LJB*=Y169Ys(Ax+&#A z5T0H8;6sH{MJqM)2g^>7U)@}W9|ZzzE$_8R=ungD}Y1@q!K+)2U7*cpj8xlP1G<0C6^Rfcy8t&Dq{%StY{^By7kask;|}dWozyW>J?BcQeeS zZ0yAx`J`o;NOc8<*#)}0#7Vj=;If3huQ|D!uyWNNJ2GP*^3)3eO`k&;f&_k?>mFFY zTNSKed@I;n3-&(w$*bT+fxm^?&*6P{eAS={2%Yu zM$Z4W=ckXZSFc#H_-1VQb=Qd<58s)#PM>?@Zyje zyL+pV?Vdz6>P)Rfe>JwDu756+N*L zLAzdlXs{YxU#JC704K@uKgC|ew#MdaV{=V_Bm>ZD!IJ=xc;`t74vKYr_Q|79wxH;V zjarfJCtc84ksd43Yqj@VJwsOf9V>C%N{m`v{l8oMeDPV|X4kkilzg7~GP9AI-W+QEOeo>PGywj9g`-kI7o)rBSwRw z6&^8yB$f4IMP=iNBt3*zp1Tv1z>)|xRYk*^4%;n~1g~{TB2gehdRXUJPNyV6t!*j= zNj6P*!ow4oO419?Ik;|NtezpPW6xE}x?gc`JU)N$hltmI@}EM7zvu0{H+g@ZSqCy1 zA{POUF*sj=QWh8_tZ1@51QV9p?Oyhx17CArYbiFYKML!w#DJb(1ow5Qk@o>(k0Cqw z^SacR$P{dVF>{o?sCK+O&%X%-dEeV(96$OU7upSQeE9EN`iH<0&!1f%dCRfCL+M}Q CHn08w literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/items_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/items_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..453570444dd90ba93242bd116c1123292f64cfc6 GIT binary patch literal 23776 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 M#osvSpLg^B0CpMnz5oCK literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/items_types__resources_templates_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/items_types__resources_templates_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f0e5bb5059e2859c7b572df820b6448e7c03261 GIT binary patch literal 22856 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/links_to_compounds_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/links_to_compounds_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9087eceaa0ada4a1ca41057db6dae820d42e2eb GIT binary patch literal 12341 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/links_to_experiments_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/links_to_experiments_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54493d2a78371a32879b2ddc2da920e0f88fd9f7 GIT binary patch literal 12460 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 Hb~pbEBAziZ literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/links_to_items_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/links_to_items_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a4cdd823fef454a6ac284879b37f6102d18ca71 GIT binary patch literal 12167 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/notifications_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/notifications_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7d17b34531a4f3eec36c4617907eb529625a179 GIT binary patch literal 13834 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 OG4$a2mkeI1r2hrdl?lTD literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/resources_status_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/resources_status_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e1e563b1c8bd774b30768ebd8585351cd425ee6 GIT binary patch literal 16795 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 Me*4!9{!>f;57MXMs{jB1 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/revisions_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/revisions_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c4507fd95dfd75acc34d3f6d855ee5a2f71d457 GIT binary patch literal 12033 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/steps_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/steps_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..248aab28d3908380cbd5cd8c264dcd21335ebb4d GIT binary patch literal 14744 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 B&13)o literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/storage_units_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/storage_units_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8195839d1992f1a7c1eb118d2edb73afe037c6d GIT binary patch literal 18139 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 T^mm^5cE_RR)OP}%t!DlYsYU8x literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/tags_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/tags_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea953f44a86b6c7b845c6dbdd32f0e9c88d30085 GIT binary patch literal 17643 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 CcL;v~ literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/teamgroups_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/teamgroups_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9483868a1c64ec39462e634e38e3ae5296e1ab4d GIT binary patch literal 16636 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 EFF%gbng9R* literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/todolist_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/todolist_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..543500fe9ebc1ec2323ffbd8472a4a76aea0659a GIT binary patch literal 14912 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 Yv$+3<3;)Hj=&}r7@A#I(f2QgG0NC!y!vFvP literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/user_uploads_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/user_uploads_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..617374d761d982a3e58e7c7e6eefb1effc5af350 GIT binary patch literal 4387 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 Lea+#WHS>P}_J+2N literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/api_keys_api.py b/vendor/elabapi-python/elabapi_python/api/api_keys_api.py new file mode 100644 index 0000000..66399ed --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/api_keys_api.py @@ -0,0 +1,310 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class ApiKeysApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_apikey(self, id, **kwargs): # noqa: E501 + """Delete an API key. # noqa: E501 + + Delete an API key # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_apikey(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the API key (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_apikey_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_apikey_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_apikey_with_http_info(self, id, **kwargs): # noqa: E501 + """Delete an API key. # noqa: E501 + + Delete an API key # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_apikey_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the API key (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_apikey" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_apikey`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/apikeys/{id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_apikeys(self, **kwargs): # noqa: E501 + """Read API keys # noqa: E501 + + Get list of API keys for currently logged in user. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_apikeys(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[Apikey] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_apikeys_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_apikeys_with_http_info(**kwargs) # noqa: E501 + return data + + def get_apikeys_with_http_info(self, **kwargs): # noqa: E501 + """Read API keys # noqa: E501 + + Get list of API keys for currently logged in user. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_apikeys_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[Apikey] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_apikeys" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/apikeys', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Apikey]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_apikeys(self, **kwargs): # noqa: E501 + """Create an API key # noqa: E501 + + Create an API key. The cleartext key is sent back in the location header. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_apikeys(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param ApikeysBody body: + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_apikeys_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.post_apikeys_with_http_info(**kwargs) # noqa: E501 + return data + + def post_apikeys_with_http_info(self, **kwargs): # noqa: E501 + """Create an API key # noqa: E501 + + Create an API key. The cleartext key is sent back in the location header. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_apikeys_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param ApikeysBody body: + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_apikeys" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/apikeys', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/branding_api.py b/vendor/elabapi-python/elabapi_python/api/branding_api.py new file mode 100644 index 0000000..2de750e --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/branding_api.py @@ -0,0 +1,247 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class BrandingApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_instance_branding(self, id, format, **kwargs): # noqa: E501 + """Read a branding asset as a binary file. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_instance_branding(id, format, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: Branding id. (required) + :param str format: Use binary format to retrieve the branding asset. (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_instance_branding_with_http_info(id, format, **kwargs) # noqa: E501 + else: + (data) = self.get_instance_branding_with_http_info(id, format, **kwargs) # noqa: E501 + return data + + def get_instance_branding_with_http_info(self, id, format, **kwargs): # noqa: E501 + """Read a branding asset as a binary file. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_instance_branding_with_http_info(id, format, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: Branding id. (required) + :param str format: Use binary format to retrieve the branding asset. (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'format'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_instance_branding" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `get_instance_branding`") # noqa: E501 + # verify the required parameter 'format' is set + if ('format' not in params or + params['format'] is None): + raise ValueError("Missing the required parameter `format` when calling `get_instance_branding`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + if 'format' in params: + query_params.append(('format', params['format'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['image/svg+xml', 'image/png', 'image/jpeg', 'image/webp', 'image/x-icon', 'image/vnd.microsoft.icon', 'application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/instance/branding/{id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_instance_branding(self, action, file, id, **kwargs): # noqa: E501 + """Update a branding asset. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_instance_branding(action, file, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str action: (required) + :param str file: (required) + :param int id: Branding id. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_instance_branding_with_http_info(action, file, id, **kwargs) # noqa: E501 + else: + (data) = self.post_instance_branding_with_http_info(action, file, id, **kwargs) # noqa: E501 + return data + + def post_instance_branding_with_http_info(self, action, file, id, **kwargs): # noqa: E501 + """Update a branding asset. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_instance_branding_with_http_info(action, file, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str action: (required) + :param str file: (required) + :param int id: Branding id. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['action', 'file', 'id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_instance_branding" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'action' is set + if ('action' not in params or + params['action'] is None): + raise ValueError("Missing the required parameter `action` when calling `post_instance_branding`") # noqa: E501 + # verify the required parameter 'file' is set + if ('file' not in params or + params['file'] is None): + raise ValueError("Missing the required parameter `file` when calling `post_instance_branding`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_instance_branding`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + if 'action' in params: + form_params.append(('action', params['action'])) # noqa: E501 + if 'file' in params: + local_var_files['file'] = params['file'] # noqa: E501 + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['multipart/form-data']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/instance/branding/{id}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/comments_api.py b/vendor/elabapi-python/elabapi_python/api/comments_api.py new file mode 100644 index 0000000..ae9e8ba --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/comments_api.py @@ -0,0 +1,580 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class CommentsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_entity_comment(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Delete an entity comment. # noqa: E501 + + The comment gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_comment(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the comment (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_entity_comment_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.delete_entity_comment_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def delete_entity_comment_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Delete an entity comment. # noqa: E501 + + The comment gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_comment_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the comment (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_entity_comment" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `delete_entity_comment`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_entity_comment`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `delete_entity_comment`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/comments/{subid}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_entity_comment(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Modify an entity comment. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_entity_comment(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the comment (required) + :param Comment body: Parameters for patching an entity comment. + :return: Comment + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_entity_comment_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.patch_entity_comment_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def patch_entity_comment_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Modify an entity comment. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_entity_comment_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the comment (required) + :param Comment body: Parameters for patching an entity comment. + :return: Comment + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_entity_comment" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `patch_entity_comment`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_entity_comment`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `patch_entity_comment`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/comments/{subid}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Comment', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_entity_comments(self, entity_type, id, **kwargs): # noqa: E501 + """Create a comment. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_entity_comments(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param IdCommentsBody body: Parameters for creating a comment + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_entity_comments_with_http_info(entity_type, id, **kwargs) # noqa: E501 + else: + (data) = self.post_entity_comments_with_http_info(entity_type, id, **kwargs) # noqa: E501 + return data + + def post_entity_comments_with_http_info(self, entity_type, id, **kwargs): # noqa: E501 + """Create a comment. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_entity_comments_with_http_info(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param IdCommentsBody body: Parameters for creating a comment + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_entity_comments" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `post_entity_comments`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_entity_comments`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/comments', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_entity_comment(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Read a comment of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_entity_comment(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the comment (required) + :return: Comment + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_entity_comment_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.read_entity_comment_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def read_entity_comment_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Read a comment of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_entity_comment_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the comment (required) + :return: Comment + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_entity_comment" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `read_entity_comment`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_entity_comment`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `read_entity_comment`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/comments/{subid}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Comment', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_entity_comments(self, entity_type, id, **kwargs): # noqa: E501 + """Read all comments of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_entity_comments(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[Comment] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_entity_comments_with_http_info(entity_type, id, **kwargs) # noqa: E501 + else: + (data) = self.read_entity_comments_with_http_info(entity_type, id, **kwargs) # noqa: E501 + return data + + def read_entity_comments_with_http_info(self, entity_type, id, **kwargs): # noqa: E501 + """Read all comments of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_entity_comments_with_http_info(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[Comment] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_entity_comments" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `read_entity_comments`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_entity_comments`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/comments', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Comment]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/compounds_api.py b/vendor/elabapi-python/elabapi_python/api/compounds_api.py new file mode 100644 index 0000000..025dbe7 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/compounds_api.py @@ -0,0 +1,409 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class CompoundsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_compound(self, id, **kwargs): # noqa: E501 + """Soft-delete a compound # noqa: E501 + + The compound gets marked as deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_compound(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the compound (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_compound_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_compound_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_compound_with_http_info(self, id, **kwargs): # noqa: E501 + """Soft-delete a compound # noqa: E501 + + The compound gets marked as deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_compound_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the compound (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_compound" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_compound`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/compounds/{id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_compound(self, id, **kwargs): # noqa: E501 + """Get a single compound # noqa: E501 + + Retrieve one compound by its ID # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_compound(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the compound (required) + :return: Compound + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_compound_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.get_compound_with_http_info(id, **kwargs) # noqa: E501 + return data + + def get_compound_with_http_info(self, id, **kwargs): # noqa: E501 + """Get a single compound # noqa: E501 + + Retrieve one compound by its ID # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_compound_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the compound (required) + :return: Compound + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_compound" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `get_compound`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/compounds/{id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Compound', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_compounds(self, **kwargs): # noqa: E501 + """Read compounds # noqa: E501 + + Get the list of all compounds # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_compounds(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[Compound] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_compounds_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_compounds_with_http_info(**kwargs) # noqa: E501 + return data + + def get_compounds_with_http_info(self, **kwargs): # noqa: E501 + """Read compounds # noqa: E501 + + Get the list of all compounds # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_compounds_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[Compound] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_compounds" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/compounds', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Compound]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_compounds(self, body, **kwargs): # noqa: E501 + """Create or import a compound # noqa: E501 + + - If `action=duplicate`, import (or match) a compound from PubChem using `cid` or `cas`. If both parameters are present, only the `cid` is used. - Otherwise, create a compound directly from the provided fields. - If a compound with the same unique identifier already exists (e.g `cas_number`, `pubchem_cid`), the API will return the existing compound instead of creating a new one. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_compounds(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param CompoundsBody body: (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_compounds_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.post_compounds_with_http_info(body, **kwargs) # noqa: E501 + return data + + def post_compounds_with_http_info(self, body, **kwargs): # noqa: E501 + """Create or import a compound # noqa: E501 + + - If `action=duplicate`, import (or match) a compound from PubChem using `cid` or `cas`. If both parameters are present, only the `cid` is used. - Otherwise, create a compound directly from the provided fields. - If a compound with the same unique identifier already exists (e.g `cas_number`, `pubchem_cid`), the API will return the existing compound instead of creating a new one. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_compounds_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param CompoundsBody body: (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_compounds" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `post_compounds`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/compounds', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/config_api.py b/vendor/elabapi-python/elabapi_python/api/config_api.py new file mode 100644 index 0000000..da81fee --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/config_api.py @@ -0,0 +1,296 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class ConfigApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_config(self, **kwargs): # noqa: E501 + """Reset the config to default values # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_config(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_config_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.delete_config_with_http_info(**kwargs) # noqa: E501 + return data + + def delete_config_with_http_info(self, **kwargs): # noqa: E501 + """Reset the config to default values # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_config_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_config" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/config', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_config(self, **kwargs): # noqa: E501 + """Read the config # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_config(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: Config + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_config_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_config_with_http_info(**kwargs) # noqa: E501 + return data + + def get_config_with_http_info(self, **kwargs): # noqa: E501 + """Read the config # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_config_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: Config + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_config" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/config', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Config', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_config(self, **kwargs): # noqa: E501 + """Modify the config # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_config(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Config body: The config values to change. + :return: Config + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_config_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.patch_config_with_http_info(**kwargs) # noqa: E501 + return data + + def patch_config_with_http_info(self, **kwargs): # noqa: E501 + """Modify the config # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_config_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Config body: The config values to change. + :return: Config + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_config" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/config', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Config', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/containers_api.py b/vendor/elabapi-python/elabapi_python/api/containers_api.py new file mode 100644 index 0000000..edf94aa --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/containers_api.py @@ -0,0 +1,596 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class ContainersApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_container(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Delete a container. # noqa: E501 + + Remove an entity from a storage unit. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_container(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the container (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_container_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.delete_container_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def delete_container_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Delete a container. # noqa: E501 + + Remove an entity from a storage unit. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_container_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the container (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_container" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `delete_container`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_container`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `delete_container`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/containers/{subid}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_container(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Modify a container. # noqa: E501 + + Update the quantity stored, the unit, or the storage location of a container. Setting `storage_id` moves the container to a different storage unit while preserving its `id` and `created_at`. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_container(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the container (required) + :param ContainersSubidBody1 body: Parameters for modifying a container. + :return: Container + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_container_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.patch_container_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def patch_container_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Modify a container. # noqa: E501 + + Update the quantity stored, the unit, or the storage location of a container. Setting `storage_id` moves the container to a different storage unit while preserving its `id` and `created_at`. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_container_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the container (required) + :param ContainersSubidBody1 body: Parameters for modifying a container. + :return: Container + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_container" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `patch_container`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_container`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `patch_container`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/containers/{subid}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Container', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_container(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Create a container for this entity. # noqa: E501 + + Store this entity in a storage unit with a specified quantity. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_container(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the container (required) + :param ContainersSubidBody body: Parameters for creating a container. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_container_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.post_container_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def post_container_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Create a container for this entity. # noqa: E501 + + Store this entity in a storage unit with a specified quantity. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_container_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the container (required) + :param ContainersSubidBody body: Parameters for creating a container. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_container" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `post_container`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_container`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `post_container`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/containers/{subid}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_container(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Read a container. # noqa: E501 + + Get details of a specific container entry. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_container(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the container (required) + :return: Container + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_container_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.read_container_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def read_container_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Read a container. # noqa: E501 + + Get details of a specific container entry. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_container_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the container (required) + :return: Container + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_container" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `read_container`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_container`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `read_container`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/containers/{subid}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Container', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_containers(self, entity_type, id, **kwargs): # noqa: E501 + """Read all containers for this entity. # noqa: E501 + + Get a list of all storage locations (containers) where this entity is stored. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_containers(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[Container] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_containers_with_http_info(entity_type, id, **kwargs) # noqa: E501 + else: + (data) = self.read_containers_with_http_info(entity_type, id, **kwargs) # noqa: E501 + return data + + def read_containers_with_http_info(self, entity_type, id, **kwargs): # noqa: E501 + """Read all containers for this entity. # noqa: E501 + + Get a list of all storage locations (containers) where this entity is stored. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_containers_with_http_info(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[Container] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_containers" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `read_containers`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_containers`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/containers', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Container]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/custom_fields_keys_api.py b/vendor/elabapi-python/elabapi_python/api/custom_fields_keys_api.py new file mode 100644 index 0000000..f91927a --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/custom_fields_keys_api.py @@ -0,0 +1,126 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class CustomFieldsKeysApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def custom_fields_keys(self, **kwargs): # noqa: E501 + """Read custom fields keys. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.custom_fields_keys(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str q: Search for a term in the custom fields keys. + :param int limit: Number of custom fields keys that will be returned. Value >= -1; -1: no limit, 0: users default setting from UCP. + :return: list[ExtraFieldsKeys] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.custom_fields_keys_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.custom_fields_keys_with_http_info(**kwargs) # noqa: E501 + return data + + def custom_fields_keys_with_http_info(self, **kwargs): # noqa: E501 + """Read custom fields keys. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.custom_fields_keys_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str q: Search for a term in the custom fields keys. + :param int limit: Number of custom fields keys that will be returned. Value >= -1; -1: no limit, 0: users default setting from UCP. + :return: list[ExtraFieldsKeys] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['q', 'limit'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method custom_fields_keys" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'q' in params: + query_params.append(('q', params['q'])) # noqa: E501 + if 'limit' in params: + query_params.append(('limit', params['limit'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/extra_fields_keys', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[ExtraFieldsKeys]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/d_space_api.py b/vendor/elabapi-python/elabapi_python/api/d_space_api.py new file mode 100644 index 0000000..d68584e --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/d_space_api.py @@ -0,0 +1,320 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class DSpaceApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def dspace_create(self, body, **kwargs): # noqa: E501 + """Create a new DSpace workspace item. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.dspace_create(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DspaceBody body: (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.dspace_create_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.dspace_create_with_http_info(body, **kwargs) # noqa: E501 + return data + + def dspace_create_with_http_info(self, body, **kwargs): # noqa: E501 + """Create a new DSpace workspace item. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.dspace_create_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DspaceBody body: (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method dspace_create" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `dspace_create`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['text/html', 'application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/dspace', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def dspace_read(self, action, **kwargs): # noqa: E501 + """Read DSpace information. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.dspace_read(action, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str action: Action to perform: - `getcollections`: list available DSpace collections. - `gettypes`: list DSpace item types (submission vocabularies). If omitted or invalid, the endpoint returns an error explaining valid usage. (required) + :return: InlineResponse2009 + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.dspace_read_with_http_info(action, **kwargs) # noqa: E501 + else: + (data) = self.dspace_read_with_http_info(action, **kwargs) # noqa: E501 + return data + + def dspace_read_with_http_info(self, action, **kwargs): # noqa: E501 + """Read DSpace information. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.dspace_read_with_http_info(action, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str action: Action to perform: - `getcollections`: list available DSpace collections. - `gettypes`: list DSpace item types (submission vocabularies). If omitted or invalid, the endpoint returns an error explaining valid usage. (required) + :return: InlineResponse2009 + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['action'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method dspace_read" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'action' is set + if ('action' not in params or + params['action'] is None): + raise ValueError("Missing the required parameter `action` when calling `dspace_read`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'action' in params: + query_params.append(('action', params['action'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/dspace', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='InlineResponse2009', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def dspace_submit(self, body, **kwargs): # noqa: E501 + """Submit an eLabFTW entry to DSpace. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.dspace_submit(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DspaceBody1 body: (required) + :return: InlineResponse20010 + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.dspace_submit_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.dspace_submit_with_http_info(body, **kwargs) # noqa: E501 + return data + + def dspace_submit_with_http_info(self, body, **kwargs): # noqa: E501 + """Submit an eLabFTW entry to DSpace. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.dspace_submit_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DspaceBody1 body: (required) + :return: InlineResponse20010 + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method dspace_submit" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `dspace_submit`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/dspace', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='InlineResponse20010', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/events_api.py b/vendor/elabapi-python/elabapi_python/api/events_api.py new file mode 100644 index 0000000..b0d2967 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/events_api.py @@ -0,0 +1,510 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class EventsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_event(self, id, **kwargs): # noqa: E501 + """Delete a booking slot. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_event(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the event to modify. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_event_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_event_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_event_with_http_info(self, id, **kwargs): # noqa: E501 + """Delete a booking slot. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_event_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the event to modify. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_event" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_event`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/event/{id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_event(self, body, id, **kwargs): # noqa: E501 + """Modify a booking slot. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_event(body, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EventIdBody body: Parameters for modifying an event. (required) + :param int id: ID of the event to modify. (required) + :return: Event + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_event_with_http_info(body, id, **kwargs) # noqa: E501 + else: + (data) = self.patch_event_with_http_info(body, id, **kwargs) # noqa: E501 + return data + + def patch_event_with_http_info(self, body, id, **kwargs): # noqa: E501 + """Modify a booking slot. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_event_with_http_info(body, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EventIdBody body: Parameters for modifying an event. (required) + :param int id: ID of the event to modify. (required) + :return: Event + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_event" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `patch_event`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_event`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/event/{id}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Event', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_events(self, id, **kwargs): # noqa: E501 + """Create an event for the item specified as id. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_events(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the item to book. (required) + :param EventsIdBody body: Parameters for creating an event. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_events_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.post_events_with_http_info(id, **kwargs) # noqa: E501 + return data + + def post_events_with_http_info(self, id, **kwargs): # noqa: E501 + """Create an event for the item specified as id. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_events_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the item to book. (required) + :param EventsIdBody body: Parameters for creating an event. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_events" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_events`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/events/{id}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_event(self, id, **kwargs): # noqa: E501 + """Read a booking slot. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_event(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the event to modify. (required) + :return: Event + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_event_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_event_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_event_with_http_info(self, id, **kwargs): # noqa: E501 + """Read a booking slot. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_event_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the event to modify. (required) + :return: Event + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_event" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_event`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/event/{id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Event', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_events(self, **kwargs): # noqa: E501 + """Read all events in the team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_events(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[Event] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_events_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.read_events_with_http_info(**kwargs) # noqa: E501 + return data + + def read_events_with_http_info(self, **kwargs): # noqa: E501 + """Read all events in the team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_events_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[Event] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_events" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/events', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Event]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/experiments_api.py b/vendor/elabapi-python/elabapi_python/api/experiments_api.py new file mode 100644 index 0000000..7f5633a --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/experiments_api.py @@ -0,0 +1,686 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class ExperimentsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_experiment(self, id, **kwargs): # noqa: E501 + """Delete an experiment. # noqa: E501 + + The experiment gets soft-deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_experiment(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the experiment (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_experiment_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_experiment_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_experiment_with_http_info(self, id, **kwargs): # noqa: E501 + """Delete an experiment. # noqa: E501 + + The experiment gets soft-deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_experiment_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the experiment (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_experiment" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_experiment`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/experiments/{id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_experiment(self, id, **kwargs): # noqa: E501 + """Read an experiment # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_experiment(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the experiment (required) + :param str format: Get the entity in a different format like csv, pdf, eln or zip. \"pdfa\" means archive pdf (PDF/A), same with \"zipa\". + :param bool json: Include a full JSON export in the ZIP archive. Only applicable if format is zip(a). + :param bool with_title: Include the title in the QR code. Only applicable if format is qrpng. + :param int size: Specify the size of the QR code in pixels. Only applicable if format is qrpng. + :param bool changelog: Toggles if the changelog should be included in PDF exports (pdf, pdfa, zip, zipa). Changelog is by default included if the export provides PDF/A, otherwise not. + :return: Entity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_experiment_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.get_experiment_with_http_info(id, **kwargs) # noqa: E501 + return data + + def get_experiment_with_http_info(self, id, **kwargs): # noqa: E501 + """Read an experiment # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_experiment_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the experiment (required) + :param str format: Get the entity in a different format like csv, pdf, eln or zip. \"pdfa\" means archive pdf (PDF/A), same with \"zipa\". + :param bool json: Include a full JSON export in the ZIP archive. Only applicable if format is zip(a). + :param bool with_title: Include the title in the QR code. Only applicable if format is qrpng. + :param int size: Specify the size of the QR code in pixels. Only applicable if format is qrpng. + :param bool changelog: Toggles if the changelog should be included in PDF exports (pdf, pdfa, zip, zipa). Changelog is by default included if the export provides PDF/A, otherwise not. + :return: Entity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'format', 'json', 'with_title', 'size', 'changelog'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_experiment" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `get_experiment`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + if 'format' in params: + query_params.append(('format', params['format'])) # noqa: E501 + if 'json' in params: + query_params.append(('json', params['json'])) # noqa: E501 + if 'with_title' in params: + query_params.append(('withTitle', params['with_title'])) # noqa: E501 + if 'size' in params: + query_params.append(('size', params['size'])) # noqa: E501 + if 'changelog' in params: + query_params.append(('changelog', params['changelog'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/experiments/{id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Entity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_experiment(self, body, id, **kwargs): # noqa: E501 + """Modify an experiment # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_experiment(body, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param object body: Parameters for patching an entity (required) + :param int id: ID of the experiment (required) + :return: Experiment + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_experiment_with_http_info(body, id, **kwargs) # noqa: E501 + else: + (data) = self.patch_experiment_with_http_info(body, id, **kwargs) # noqa: E501 + return data + + def patch_experiment_with_http_info(self, body, id, **kwargs): # noqa: E501 + """Modify an experiment # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_experiment_with_http_info(body, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param object body: Parameters for patching an entity (required) + :param int id: ID of the experiment (required) + :return: Experiment + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_experiment" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `patch_experiment`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_experiment`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/experiments/{id}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Experiment', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_experiment(self, **kwargs): # noqa: E501 + """Create an experiment # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_experiment(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityEditable body: Parameters for creating an experiment + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_experiment_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.post_experiment_with_http_info(**kwargs) # noqa: E501 + return data + + def post_experiment_with_http_info(self, **kwargs): # noqa: E501 + """Create an experiment # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_experiment_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityEditable body: Parameters for creating an experiment + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_experiment" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/experiments', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_experiment_by_id(self, id, **kwargs): # noqa: E501 + """Duplicate an experiment with its ID # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_experiment_by_id(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: The unique identifier of the experiment to duplicate. (required) + :param EntityDuplicate body: Parameters for duplicating an experiment + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_experiment_by_id_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.post_experiment_by_id_with_http_info(id, **kwargs) # noqa: E501 + return data + + def post_experiment_by_id_with_http_info(self, id, **kwargs): # noqa: E501 + """Duplicate an experiment with its ID # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_experiment_by_id_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: The unique identifier of the experiment to duplicate. (required) + :param EntityDuplicate body: Parameters for duplicating an experiment + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_experiment_by_id" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_experiment_by_id`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/experiments/{id}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_experiments(self, **kwargs): # noqa: E501 + """Read all experiments that are accessible # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_experiments(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str q: Search for a term in title, body or elabid. + :param str extended: Extended search (advanced query). + :param int related: Look only for entries linked to this entry id. + :param str related_origin: When using the \"related\" query parameter, select the type of the related ID (experiments or items) + :param str category: Add a filter on the Category. Supports comma separated list of numbers, including \"null\". + :param str status: Add a filter on the Status. Supports comma separated list of numbers, including \"null\". + :param list[str] tags: An array of tags for filtering results containing all of these tags. + :param int limit: Limit the number of results. + :param int offset: Skip a number of results. Use with limit to work the pagination. + :param str owner: Filter results by author (user id) + :param int scope: Set the scope for the results. 1: self, 2: team, 3: everything. It defaults to the user value stored in preferences. + :param str order: Change the ordering of the results. + :param str sort: Change the sorting of results: ascending or descending. + :param str state: Filter results based on their state: 1 (Normal), 2 (Archived), 3 (Deleted). Supports comma separated values. + :param int full: Return all columns of each entry when set to 1. + :return: list[Experiment] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_experiments_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.read_experiments_with_http_info(**kwargs) # noqa: E501 + return data + + def read_experiments_with_http_info(self, **kwargs): # noqa: E501 + """Read all experiments that are accessible # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_experiments_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str q: Search for a term in title, body or elabid. + :param str extended: Extended search (advanced query). + :param int related: Look only for entries linked to this entry id. + :param str related_origin: When using the \"related\" query parameter, select the type of the related ID (experiments or items) + :param str category: Add a filter on the Category. Supports comma separated list of numbers, including \"null\". + :param str status: Add a filter on the Status. Supports comma separated list of numbers, including \"null\". + :param list[str] tags: An array of tags for filtering results containing all of these tags. + :param int limit: Limit the number of results. + :param int offset: Skip a number of results. Use with limit to work the pagination. + :param str owner: Filter results by author (user id) + :param int scope: Set the scope for the results. 1: self, 2: team, 3: everything. It defaults to the user value stored in preferences. + :param str order: Change the ordering of the results. + :param str sort: Change the sorting of results: ascending or descending. + :param str state: Filter results based on their state: 1 (Normal), 2 (Archived), 3 (Deleted). Supports comma separated values. + :param int full: Return all columns of each entry when set to 1. + :return: list[Experiment] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['q', 'extended', 'related', 'related_origin', 'category', 'status', 'tags', 'limit', 'offset', 'owner', 'scope', 'order', 'sort', 'state', 'full'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_experiments" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'q' in params: + query_params.append(('q', params['q'])) # noqa: E501 + if 'extended' in params: + query_params.append(('extended', params['extended'])) # noqa: E501 + if 'related' in params: + query_params.append(('related', params['related'])) # noqa: E501 + if 'related_origin' in params: + query_params.append(('related_origin', params['related_origin'])) # noqa: E501 + if 'category' in params: + query_params.append(('category', params['category'])) # noqa: E501 + if 'status' in params: + query_params.append(('status', params['status'])) # noqa: E501 + if 'tags' in params: + query_params.append(('tags[]', params['tags'])) # noqa: E501 + collection_formats['tags[]'] = 'multi' # noqa: E501 + if 'limit' in params: + query_params.append(('limit', params['limit'])) # noqa: E501 + if 'offset' in params: + query_params.append(('offset', params['offset'])) # noqa: E501 + if 'owner' in params: + query_params.append(('owner', params['owner'])) # noqa: E501 + if 'scope' in params: + query_params.append(('scope', params['scope'])) # noqa: E501 + if 'order' in params: + query_params.append(('order', params['order'])) # noqa: E501 + if 'sort' in params: + query_params.append(('sort', params['sort'])) # noqa: E501 + if 'state' in params: + query_params.append(('state', params['state'])) # noqa: E501 + if 'full' in params: + query_params.append(('full', params['full'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/experiments', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Experiment]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/experiments_categories_api.py b/vendor/elabapi-python/elabapi_python/api/experiments_categories_api.py new file mode 100644 index 0000000..0a65bed --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/experiments_categories_api.py @@ -0,0 +1,538 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class ExperimentsCategoriesApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_expcat(self, id, subid, **kwargs): # noqa: E501 + """Delete a category. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_expcat(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the category. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_expcat_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.delete_expcat_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def delete_expcat_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Delete a category. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_expcat_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the category. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_expcat" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_expcat`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `delete_expcat`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/experiments_categories/{subid}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_expcat(self, id, subid, **kwargs): # noqa: E501 + """Modify a category. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_expcat(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the category. (required) + :param Statuslike body: Parameters for modifying a category. + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_expcat_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.patch_expcat_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def patch_expcat_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Modify a category. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_expcat_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the category. (required) + :param Statuslike body: Parameters for modifying a category. + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_expcat" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_expcat`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `patch_expcat`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/experiments_categories/{subid}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Statuslike', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_team_one_expcat(self, id, **kwargs): # noqa: E501 + """Create a new category for experiments. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_team_one_expcat(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param IdExperimentsCategoriesBody body: Parameters for creating a category. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_team_one_expcat_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.post_team_one_expcat_with_http_info(id, **kwargs) # noqa: E501 + return data + + def post_team_one_expcat_with_http_info(self, id, **kwargs): # noqa: E501 + """Create a new category for experiments. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_team_one_expcat_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param IdExperimentsCategoriesBody body: Parameters for creating a category. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_team_one_expcat" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_team_one_expcat`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/experiments_categories', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_team_experiments_categories(self, id, **kwargs): # noqa: E501 + """Read experiments categories of a team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_experiments_categories(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :return: list[Statuslike] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_team_experiments_categories_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_team_experiments_categories_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_team_experiments_categories_with_http_info(self, id, **kwargs): # noqa: E501 + """Read experiments categories of a team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_experiments_categories_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :return: list[Statuslike] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_team_experiments_categories" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_team_experiments_categories`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/experiments_categories', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Statuslike]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_team_one_expcat(self, id, subid, **kwargs): # noqa: E501 + """Read a category. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_one_expcat(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the category. (required) + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_team_one_expcat_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.read_team_one_expcat_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def read_team_one_expcat_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Read a category. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_one_expcat_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the category. (required) + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_team_one_expcat" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_team_one_expcat`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `read_team_one_expcat`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/experiments_categories/{subid}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Statuslike', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/experiments_status_api.py b/vendor/elabapi-python/elabapi_python/api/experiments_status_api.py new file mode 100644 index 0000000..58d1137 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/experiments_status_api.py @@ -0,0 +1,538 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class ExperimentsStatusApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_expstatus(self, id, subid, **kwargs): # noqa: E501 + """Delete a status. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_expstatus(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the status (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_expstatus_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.delete_expstatus_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def delete_expstatus_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Delete a status. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_expstatus_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the status (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_expstatus" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_expstatus`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `delete_expstatus`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/experiments_status/{subid}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_expstatus(self, id, subid, **kwargs): # noqa: E501 + """Modify a status. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_expstatus(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the status (required) + :param Statuslike body: Parameters for modifying a status. + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_expstatus_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.patch_expstatus_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def patch_expstatus_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Modify a status. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_expstatus_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the status (required) + :param Statuslike body: Parameters for modifying a status. + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_expstatus" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_expstatus`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `patch_expstatus`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/experiments_status/{subid}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Statuslike', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_team_one_expstatus(self, id, **kwargs): # noqa: E501 + """Create a new experiments status. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_team_one_expstatus(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param IdExperimentsStatusBody body: Parameters for creating a status. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_team_one_expstatus_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.post_team_one_expstatus_with_http_info(id, **kwargs) # noqa: E501 + return data + + def post_team_one_expstatus_with_http_info(self, id, **kwargs): # noqa: E501 + """Create a new experiments status. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_team_one_expstatus_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param IdExperimentsStatusBody body: Parameters for creating a status. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_team_one_expstatus" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_team_one_expstatus`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/experiments_status', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_team_experiments_status(self, id, **kwargs): # noqa: E501 + """Read experiments status of a team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_experiments_status(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :return: list[Statuslike] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_team_experiments_status_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_team_experiments_status_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_team_experiments_status_with_http_info(self, id, **kwargs): # noqa: E501 + """Read experiments status of a team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_experiments_status_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :return: list[Statuslike] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_team_experiments_status" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_team_experiments_status`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/experiments_status', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Statuslike]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_team_one_expstatus(self, id, subid, **kwargs): # noqa: E501 + """Read a status. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_one_expstatus(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the status (required) + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_team_one_expstatus_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.read_team_one_expstatus_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def read_team_one_expstatus_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Read a status. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_one_expstatus_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the status (required) + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_team_one_expstatus" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_team_one_expstatus`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `read_team_one_expstatus`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/experiments_status/{subid}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Statuslike', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/experiments_templates_api.py b/vendor/elabapi-python/elabapi_python/api/experiments_templates_api.py new file mode 100644 index 0000000..ca34c87 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/experiments_templates_api.py @@ -0,0 +1,662 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class ExperimentsTemplatesApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_experiment_template(self, id, **kwargs): # noqa: E501 + """Delete an experiment template. # noqa: E501 + + The experiment template gets soft-deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_experiment_template(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the experiment template (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_experiment_template_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_experiment_template_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_experiment_template_with_http_info(self, id, **kwargs): # noqa: E501 + """Delete an experiment template. # noqa: E501 + + The experiment template gets soft-deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_experiment_template_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the experiment template (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_experiment_template" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_experiment_template`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/experiments_templates/{id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_experiment_template(self, id, **kwargs): # noqa: E501 + """Read an experiment template # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_experiment_template(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the experiment template (required) + :return: EntityTemplate + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_experiment_template_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.get_experiment_template_with_http_info(id, **kwargs) # noqa: E501 + return data + + def get_experiment_template_with_http_info(self, id, **kwargs): # noqa: E501 + """Read an experiment template # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_experiment_template_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the experiment template (required) + :return: EntityTemplate + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_experiment_template" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `get_experiment_template`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/experiments_templates/{id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityTemplate', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_experiment_template(self, id, **kwargs): # noqa: E501 + """Modify an experiment template # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_experiment_template(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the experiment template (required) + :param ExperimentsTemplatesIdBody body: Parameters for modifying an experiment template + :return: EntityTemplate + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_experiment_template_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.patch_experiment_template_with_http_info(id, **kwargs) # noqa: E501 + return data + + def patch_experiment_template_with_http_info(self, id, **kwargs): # noqa: E501 + """Modify an experiment template # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_experiment_template_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the experiment template (required) + :param ExperimentsTemplatesIdBody body: Parameters for modifying an experiment template + :return: EntityTemplate + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_experiment_template" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_experiment_template`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/experiments_templates/{id}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityTemplate', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_experiment_template(self, **kwargs): # noqa: E501 + """Create an experiment template # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_experiment_template(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityTemplateEditable body: Parameters for creating an experiment template + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_experiment_template_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.post_experiment_template_with_http_info(**kwargs) # noqa: E501 + return data + + def post_experiment_template_with_http_info(self, **kwargs): # noqa: E501 + """Create an experiment template # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_experiment_template_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityTemplateEditable body: Parameters for creating an experiment template + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_experiment_template" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/experiments_templates', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_experiment_template_by_id(self, id, **kwargs): # noqa: E501 + """Duplicate an experiment template with its ID # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_experiment_template_by_id(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: The unique identifier of the experiment template to duplicate. (required) + :param EntityDuplicate body: Parameters for duplicating an experiment template + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_experiment_template_by_id_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.post_experiment_template_by_id_with_http_info(id, **kwargs) # noqa: E501 + return data + + def post_experiment_template_by_id_with_http_info(self, id, **kwargs): # noqa: E501 + """Duplicate an experiment template with its ID # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_experiment_template_by_id_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: The unique identifier of the experiment template to duplicate. (required) + :param EntityDuplicate body: Parameters for duplicating an experiment template + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_experiment_template_by_id" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_experiment_template_by_id`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/experiments_templates/{id}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_experiments_templates(self, **kwargs): # noqa: E501 + """Read all experiments_templates that are accessible # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_experiments_templates(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str q: Search for a term in title, body or elabid. + :param str extended: Extended search (advanced query). + :param int related: Look only for entries linked to this entry id. + :param str related_origin: When using the \"related\" query parameter, select the type of the related ID (experiments or items) + :param str category: Add a filter on the Category. Supports comma separated list of numbers, including \"null\". + :param str status: Add a filter on the Status. Supports comma separated list of numbers, including \"null\". + :param list[str] tags: An array of tags for filtering results containing all of these tags. + :param int limit: Limit the number of results. + :param int offset: Skip a number of results. Use with limit to work the pagination. + :param str owner: Filter results by author (user id) + :param int scope: Set the scope for the results. 1: self, 2: team, 3: everything. It defaults to the user value stored in preferences. + :param str order: Change the ordering of the results. + :param str sort: Change the sorting of results: ascending or descending. + :param str state: Filter results based on their state: 1 (Normal), 2 (Archived), 3 (Deleted). Supports comma separated values. + :param int full: Return all columns of each entry when set to 1. + :return: list[EntityTemplate] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_experiments_templates_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.read_experiments_templates_with_http_info(**kwargs) # noqa: E501 + return data + + def read_experiments_templates_with_http_info(self, **kwargs): # noqa: E501 + """Read all experiments_templates that are accessible # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_experiments_templates_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str q: Search for a term in title, body or elabid. + :param str extended: Extended search (advanced query). + :param int related: Look only for entries linked to this entry id. + :param str related_origin: When using the \"related\" query parameter, select the type of the related ID (experiments or items) + :param str category: Add a filter on the Category. Supports comma separated list of numbers, including \"null\". + :param str status: Add a filter on the Status. Supports comma separated list of numbers, including \"null\". + :param list[str] tags: An array of tags for filtering results containing all of these tags. + :param int limit: Limit the number of results. + :param int offset: Skip a number of results. Use with limit to work the pagination. + :param str owner: Filter results by author (user id) + :param int scope: Set the scope for the results. 1: self, 2: team, 3: everything. It defaults to the user value stored in preferences. + :param str order: Change the ordering of the results. + :param str sort: Change the sorting of results: ascending or descending. + :param str state: Filter results based on their state: 1 (Normal), 2 (Archived), 3 (Deleted). Supports comma separated values. + :param int full: Return all columns of each entry when set to 1. + :return: list[EntityTemplate] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['q', 'extended', 'related', 'related_origin', 'category', 'status', 'tags', 'limit', 'offset', 'owner', 'scope', 'order', 'sort', 'state', 'full'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_experiments_templates" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'q' in params: + query_params.append(('q', params['q'])) # noqa: E501 + if 'extended' in params: + query_params.append(('extended', params['extended'])) # noqa: E501 + if 'related' in params: + query_params.append(('related', params['related'])) # noqa: E501 + if 'related_origin' in params: + query_params.append(('related_origin', params['related_origin'])) # noqa: E501 + if 'category' in params: + query_params.append(('category', params['category'])) # noqa: E501 + if 'status' in params: + query_params.append(('status', params['status'])) # noqa: E501 + if 'tags' in params: + query_params.append(('tags[]', params['tags'])) # noqa: E501 + collection_formats['tags[]'] = 'multi' # noqa: E501 + if 'limit' in params: + query_params.append(('limit', params['limit'])) # noqa: E501 + if 'offset' in params: + query_params.append(('offset', params['offset'])) # noqa: E501 + if 'owner' in params: + query_params.append(('owner', params['owner'])) # noqa: E501 + if 'scope' in params: + query_params.append(('scope', params['scope'])) # noqa: E501 + if 'order' in params: + query_params.append(('order', params['order'])) # noqa: E501 + if 'sort' in params: + query_params.append(('sort', params['sort'])) # noqa: E501 + if 'state' in params: + query_params.append(('state', params['state'])) # noqa: E501 + if 'full' in params: + query_params.append(('full', params['full'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/experiments_templates', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityTemplate]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/exports_api.py b/vendor/elabapi-python/elabapi_python/api/exports_api.py new file mode 100644 index 0000000..8342d7d --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/exports_api.py @@ -0,0 +1,399 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class ExportsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_export(self, id, **kwargs): # noqa: E501 + """Remove an export request and its associated file # noqa: E501 + + This method will remove the file from the server temporary storage and clear the export request. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_export(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the export request (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_export_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_export_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_export_with_http_info(self, id, **kwargs): # noqa: E501 + """Remove an export request and its associated file # noqa: E501 + + This method will remove the file from the server temporary storage and clear the export request. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_export_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the export request (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_export" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_export`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/exports/{id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_export(self, **kwargs): # noqa: E501 + """Register an export request # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_export(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param ExportsBody body: + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_export_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.post_export_with_http_info(**kwargs) # noqa: E501 + return data + + def post_export_with_http_info(self, **kwargs): # noqa: E501 + """Register an export request # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_export_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param ExportsBody body: + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_export" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/exports', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_export(self, id, **kwargs): # noqa: E501 + """Get export # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_export(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the export request (required) + :return: list[Export] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_export_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_export_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_export_with_http_info(self, id, **kwargs): # noqa: E501 + """Get export # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_export_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the export request (required) + :return: list[Export] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_export" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_export`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/exports/{id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Export]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def readall_exports(self, **kwargs): # noqa: E501 + """List exports # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.readall_exports(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[Export] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.readall_exports_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.readall_exports_with_http_info(**kwargs) # noqa: E501 + return data + + def readall_exports_with_http_info(self, **kwargs): # noqa: E501 + """List exports # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.readall_exports_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[Export] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method readall_exports" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/exports', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Export]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/favorite_tags_api.py b/vendor/elabapi-python/elabapi_python/api/favorite_tags_api.py new file mode 100644 index 0000000..f4996c0 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/favorite_tags_api.py @@ -0,0 +1,304 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class FavoriteTagsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_favtag(self, id, **kwargs): # noqa: E501 + """Unfavorite a tag. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_favtag(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the tag. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_favtag_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_favtag_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_favtag_with_http_info(self, id, **kwargs): # noqa: E501 + """Unfavorite a tag. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_favtag_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the tag. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_favtag" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_favtag`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/favtags/{id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_favtags(self, **kwargs): # noqa: E501 + """Add a tag as favorite. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_favtags(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param FavtagsBody body: Parameters for adding a favorite tag. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_favtags_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.post_favtags_with_http_info(**kwargs) # noqa: E501 + return data + + def post_favtags_with_http_info(self, **kwargs): # noqa: E501 + """Add a tag as favorite. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_favtags_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param FavtagsBody body: Parameters for adding a favorite tag. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_favtags" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/favtags', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_favtags(self, **kwargs): # noqa: E501 + """Read all favorite tags for the user. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_favtags(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: InlineResponse2003 + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_favtags_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.read_favtags_with_http_info(**kwargs) # noqa: E501 + return data + + def read_favtags_with_http_info(self, **kwargs): # noqa: E501 + """Read all favorite tags for the user. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_favtags_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: InlineResponse2003 + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_favtags" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/favtags', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='InlineResponse2003', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/idps_api.py b/vendor/elabapi-python/elabapi_python/api/idps_api.py new file mode 100644 index 0000000..135a38f --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/idps_api.py @@ -0,0 +1,1296 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class IdpsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_idp(self, id, **kwargs): # noqa: E501 + """Delete an idp. # noqa: E501 + + The idp gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_idp(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_idp_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_idp_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_idp_with_http_info(self, id, **kwargs): # noqa: E501 + """Delete an idp. # noqa: E501 + + The idp gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_idp_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_idp" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_idp`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps/{id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_idp_cert(self, id, cert_id, **kwargs): # noqa: E501 + """Delete an idp cert. # noqa: E501 + + The idp cert gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_idp_cert(id, cert_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :param int cert_id: ID of the idp cert (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_idp_cert_with_http_info(id, cert_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_idp_cert_with_http_info(id, cert_id, **kwargs) # noqa: E501 + return data + + def delete_idp_cert_with_http_info(self, id, cert_id, **kwargs): # noqa: E501 + """Delete an idp cert. # noqa: E501 + + The idp cert gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_idp_cert_with_http_info(id, cert_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :param int cert_id: ID of the idp cert (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'cert_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_idp_cert" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_idp_cert`") # noqa: E501 + # verify the required parameter 'cert_id' is set + if ('cert_id' not in params or + params['cert_id'] is None): + raise ValueError("Missing the required parameter `cert_id` when calling `delete_idp_cert`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'cert_id' in params: + path_params['cert_id'] = params['cert_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps/{id}/certs/{cert_id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_idp_endpoint(self, id, endpoint_id, **kwargs): # noqa: E501 + """Delete an idp endpoint. # noqa: E501 + + The idp endpoint gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_idp_endpoint(id, endpoint_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :param int endpoint_id: ID of the idp endpoint (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_idp_endpoint_with_http_info(id, endpoint_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_idp_endpoint_with_http_info(id, endpoint_id, **kwargs) # noqa: E501 + return data + + def delete_idp_endpoint_with_http_info(self, id, endpoint_id, **kwargs): # noqa: E501 + """Delete an idp endpoint. # noqa: E501 + + The idp endpoint gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_idp_endpoint_with_http_info(id, endpoint_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :param int endpoint_id: ID of the idp endpoint (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'endpoint_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_idp_endpoint" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_idp_endpoint`") # noqa: E501 + # verify the required parameter 'endpoint_id' is set + if ('endpoint_id' not in params or + params['endpoint_id'] is None): + raise ValueError("Missing the required parameter `endpoint_id` when calling `delete_idp_endpoint`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'endpoint_id' in params: + path_params['endpoint_id'] = params['endpoint_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps/{id}/endpoints/{endpoint_id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_idp(self, id, **kwargs): # noqa: E501 + """Actions on an idp. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_idp(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :param IdpsIdBody body: Parameters for modifying an idp. + :return: Idp + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_idp_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.patch_idp_with_http_info(id, **kwargs) # noqa: E501 + return data + + def patch_idp_with_http_info(self, id, **kwargs): # noqa: E501 + """Actions on an idp. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_idp_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :param IdpsIdBody body: Parameters for modifying an idp. + :return: Idp + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_idp" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_idp`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps/{id}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Idp', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_idp(self, **kwargs): # noqa: E501 + """Create an idp. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_idp(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param IdpsBody body: Parameters for creating an idp. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_idp_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.post_idp_with_http_info(**kwargs) # noqa: E501 + return data + + def post_idp_with_http_info(self, **kwargs): # noqa: E501 + """Create an idp. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_idp_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param IdpsBody body: Parameters for creating an idp. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_idp" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_idp_cert(self, id, **kwargs): # noqa: E501 + """Add a cert to this IdP. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_idp_cert(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :param IdCertsBody body: Parameters for adding a cert to an IdP. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_idp_cert_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.post_idp_cert_with_http_info(id, **kwargs) # noqa: E501 + return data + + def post_idp_cert_with_http_info(self, id, **kwargs): # noqa: E501 + """Add a cert to this IdP. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_idp_cert_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :param IdCertsBody body: Parameters for adding a cert to an IdP. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_idp_cert" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_idp_cert`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps/{id}/certs', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_idp_endpoint(self, id, **kwargs): # noqa: E501 + """Add an endpoint to this IdP. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_idp_endpoint(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :param IdEndpointsBody body: Parameters for adding an endpoint to an IdP. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_idp_endpoint_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.post_idp_endpoint_with_http_info(id, **kwargs) # noqa: E501 + return data + + def post_idp_endpoint_with_http_info(self, id, **kwargs): # noqa: E501 + """Add an endpoint to this IdP. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_idp_endpoint_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :param IdEndpointsBody body: Parameters for adding an endpoint to an IdP. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_idp_endpoint" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_idp_endpoint`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps/{id}/endpoints', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_idp(self, id, **kwargs): # noqa: E501 + """Read an idp. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idp(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :return: Idp + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_idp_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_idp_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_idp_with_http_info(self, id, **kwargs): # noqa: E501 + """Read an idp. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idp_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :return: Idp + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_idp" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_idp`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps/{id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Idp', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_idp_cert(self, id, cert_id, **kwargs): # noqa: E501 + """Read a cert for an IdP. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idp_cert(id, cert_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :param int cert_id: ID of the idp cert (required) + :return: IdpCert + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_idp_cert_with_http_info(id, cert_id, **kwargs) # noqa: E501 + else: + (data) = self.read_idp_cert_with_http_info(id, cert_id, **kwargs) # noqa: E501 + return data + + def read_idp_cert_with_http_info(self, id, cert_id, **kwargs): # noqa: E501 + """Read a cert for an IdP. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idp_cert_with_http_info(id, cert_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :param int cert_id: ID of the idp cert (required) + :return: IdpCert + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'cert_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_idp_cert" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_idp_cert`") # noqa: E501 + # verify the required parameter 'cert_id' is set + if ('cert_id' not in params or + params['cert_id'] is None): + raise ValueError("Missing the required parameter `cert_id` when calling `read_idp_cert`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'cert_id' in params: + path_params['cert_id'] = params['cert_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps/{id}/certs/{cert_id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='IdpCert', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_idp_certs(self, id, **kwargs): # noqa: E501 + """Read all certs for an IdP. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idp_certs(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :return: list[IdpCert] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_idp_certs_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_idp_certs_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_idp_certs_with_http_info(self, id, **kwargs): # noqa: E501 + """Read all certs for an IdP. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idp_certs_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :return: list[IdpCert] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_idp_certs" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_idp_certs`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps/{id}/certs', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[IdpCert]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_idp_endpoint(self, id, endpoint_id, **kwargs): # noqa: E501 + """Read an endpoint for an IdP. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idp_endpoint(id, endpoint_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :param int endpoint_id: ID of the idp endpoint (required) + :return: IdpEndpoint + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_idp_endpoint_with_http_info(id, endpoint_id, **kwargs) # noqa: E501 + else: + (data) = self.read_idp_endpoint_with_http_info(id, endpoint_id, **kwargs) # noqa: E501 + return data + + def read_idp_endpoint_with_http_info(self, id, endpoint_id, **kwargs): # noqa: E501 + """Read an endpoint for an IdP. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idp_endpoint_with_http_info(id, endpoint_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :param int endpoint_id: ID of the idp endpoint (required) + :return: IdpEndpoint + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'endpoint_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_idp_endpoint" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_idp_endpoint`") # noqa: E501 + # verify the required parameter 'endpoint_id' is set + if ('endpoint_id' not in params or + params['endpoint_id'] is None): + raise ValueError("Missing the required parameter `endpoint_id` when calling `read_idp_endpoint`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'endpoint_id' in params: + path_params['endpoint_id'] = params['endpoint_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps/{id}/endpoints/{endpoint_id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='IdpEndpoint', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_idp_endpoints(self, id, **kwargs): # noqa: E501 + """Read all endpoints for an IdP. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idp_endpoints(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :return: list[IdpEndpoint] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_idp_endpoints_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_idp_endpoints_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_idp_endpoints_with_http_info(self, id, **kwargs): # noqa: E501 + """Read all endpoints for an IdP. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idp_endpoints_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idp (required) + :return: list[IdpEndpoint] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_idp_endpoints" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_idp_endpoints`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps/{id}/endpoints', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[IdpEndpoint]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_idps(self, **kwargs): # noqa: E501 + """Read all IDPs. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idps(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[Idp] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_idps_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.read_idps_with_http_info(**kwargs) # noqa: E501 + return data + + def read_idps_with_http_info(self, **kwargs): # noqa: E501 + """Read all IDPs. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idps_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[Idp] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_idps" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Idp]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/idps_sources_api.py b/vendor/elabapi-python/elabapi_python/api/idps_sources_api.py new file mode 100644 index 0000000..113d5a0 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/idps_sources_api.py @@ -0,0 +1,500 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class IdpsSourcesApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_idps_source(self, id, **kwargs): # noqa: E501 + """Delete an idp source. # noqa: E501 + + The idp source gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_idps_source(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idps source (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_idps_source_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_idps_source_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_idps_source_with_http_info(self, id, **kwargs): # noqa: E501 + """Delete an idp source. # noqa: E501 + + The idp source gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_idps_source_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idps source (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_idps_source" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_idps_source`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps_sources/{id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_idps_source(self, id, **kwargs): # noqa: E501 + """Patch an idp source. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_idps_source(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idps source (required) + :param IdpsSourcesIdBody body: Parameters for patching an idp source. + :return: IdpSource + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_idps_source_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.patch_idps_source_with_http_info(id, **kwargs) # noqa: E501 + return data + + def patch_idps_source_with_http_info(self, id, **kwargs): # noqa: E501 + """Patch an idp source. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_idps_source_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idps source (required) + :param IdpsSourcesIdBody body: Parameters for patching an idp source. + :return: IdpSource + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_idps_source" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_idps_source`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps_sources/{id}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='IdpSource', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_idp_source(self, **kwargs): # noqa: E501 + """Create an idp source. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_idp_source(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param IdpsSourcesBody body: Parameters for creating an idp source. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_idp_source_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.post_idp_source_with_http_info(**kwargs) # noqa: E501 + return data + + def post_idp_source_with_http_info(self, **kwargs): # noqa: E501 + """Create an idp source. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_idp_source_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param IdpsSourcesBody body: Parameters for creating an idp source. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_idp_source" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps_sources', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_idps_source(self, id, **kwargs): # noqa: E501 + """Read an IdPs source # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idps_source(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idps source (required) + :return: IdpSource + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_idps_source_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_idps_source_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_idps_source_with_http_info(self, id, **kwargs): # noqa: E501 + """Read an IdPs source # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idps_source_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the idps source (required) + :return: IdpSource + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_idps_source" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_idps_source`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps_sources/{id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='IdpSource', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_idps_sources(self, **kwargs): # noqa: E501 + """Read all IDPs sources # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idps_sources(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[IdpSource] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_idps_sources_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.read_idps_sources_with_http_info(**kwargs) # noqa: E501 + return data + + def read_idps_sources_with_http_info(self, **kwargs): # noqa: E501 + """Read all IDPs sources # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_idps_sources_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[IdpSource] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_idps_sources" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/idps_sources', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[IdpSource]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/import_api.py b/vendor/elabapi-python/elabapi_python/api/import_api.py new file mode 100644 index 0000000..72a8e8b --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/import_api.py @@ -0,0 +1,231 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class ImportApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def post_import(self, **kwargs): # noqa: E501 + """Send a file to import # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_import(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str file: + :param str entity_type: + :param int category: + :param float canread_base: + :param float canwrite_base: + :param int owner: + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_import_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.post_import_with_http_info(**kwargs) # noqa: E501 + return data + + def post_import_with_http_info(self, **kwargs): # noqa: E501 + """Send a file to import # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_import_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str file: + :param str entity_type: + :param int category: + :param float canread_base: + :param float canwrite_base: + :param int owner: + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['file', 'entity_type', 'category', 'canread_base', 'canwrite_base', 'owner'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_import" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + if 'file' in params: + local_var_files['file'] = params['file'] # noqa: E501 + if 'entity_type' in params: + form_params.append(('entity_type', params['entity_type'])) # noqa: E501 + if 'category' in params: + form_params.append(('category', params['category'])) # noqa: E501 + if 'canread_base' in params: + form_params.append(('canread_base', params['canread_base'])) # noqa: E501 + if 'canwrite_base' in params: + form_params.append(('canwrite_base', params['canwrite_base'])) # noqa: E501 + if 'owner' in params: + form_params.append(('owner', params['owner'])) # noqa: E501 + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['multipart/form-data']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/import', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_import(self, **kwargs): # noqa: E501 + """Get information about this endpoint # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_import(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: InlineResponse2002 + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_import_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.read_import_with_http_info(**kwargs) # noqa: E501 + return data + + def read_import_with_http_info(self, **kwargs): # noqa: E501 + """Get information about this endpoint # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_import_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: InlineResponse2002 + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_import" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/import', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='InlineResponse2002', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/info_api.py b/vendor/elabapi-python/elabapi_python/api/info_api.py new file mode 100644 index 0000000..6ac7223 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/info_api.py @@ -0,0 +1,128 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class InfoApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_info(self, **kwargs): # noqa: E501 + """Get information about the instance. # noqa: E501 + + Get information about the instance. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param bool hist: Get usage information about the instance. If `hist` is present, returns cumulative histogram data for experiments, items (resources), and users. + :param int columns: Number of columns (buckets) to display in histogram outputs. + :return: InlineResponse2001 + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_info_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_info_with_http_info(**kwargs) # noqa: E501 + return data + + def get_info_with_http_info(self, **kwargs): # noqa: E501 + """Get information about the instance. # noqa: E501 + + Get information about the instance. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_info_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param bool hist: Get usage information about the instance. If `hist` is present, returns cumulative histogram data for experiments, items (resources), and users. + :param int columns: Number of columns (buckets) to display in histogram outputs. + :return: InlineResponse2001 + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['hist', 'columns'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_info" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'hist' in params: + query_params.append(('hist', params['hist'])) # noqa: E501 + if 'columns' in params: + query_params.append(('columns', params['columns'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/info', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='InlineResponse2001', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/instance_api.py b/vendor/elabapi-python/elabapi_python/api/instance_api.py new file mode 100644 index 0000000..c3adc4b --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/instance_api.py @@ -0,0 +1,130 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class InstanceApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def post_instance(self, body, **kwargs): # noqa: E501 + """Run an instance level action. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_instance(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param InstanceBody body: Parameters for the instance action. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_instance_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.post_instance_with_http_info(body, **kwargs) # noqa: E501 + return data + + def post_instance_with_http_info(self, body, **kwargs): # noqa: E501 + """Run an instance level action. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_instance_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param InstanceBody body: Parameters for the instance action. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_instance" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `post_instance`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/instance', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/items_api.py b/vendor/elabapi-python/elabapi_python/api/items_api.py new file mode 100644 index 0000000..3a2a6f3 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/items_api.py @@ -0,0 +1,686 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class ItemsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_item(self, id, **kwargs): # noqa: E501 + """Delete an item. # noqa: E501 + + The item gets soft-deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_item(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the item (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_item_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_item_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_item_with_http_info(self, id, **kwargs): # noqa: E501 + """Delete an item. # noqa: E501 + + The item gets soft-deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_item_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the item (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_item" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_item`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/items/{id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_item(self, id, **kwargs): # noqa: E501 + """Read an item # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_item(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the item (required) + :param str format: Get the entity in a different format like csv, pdf, eln or zip. \"pdfa\" means archive pdf (PDF/A), same with \"zipa\". + :param bool json: Include a full JSON export in the ZIP archive. Only applicable if format is zip(a). + :param bool with_title: Include the title in the QR code. Only applicable if format is qrpng. + :param int size: Specify the size of the QR code in pixels. Only applicable if format is qrpng. + :param bool changelog: Toggles if the changelog should be included in PDF exports (pdf, pdfa, zip, zipa). Changelog is by default included if the export provides PDF/A, otherwise not. + :return: Entity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_item_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.get_item_with_http_info(id, **kwargs) # noqa: E501 + return data + + def get_item_with_http_info(self, id, **kwargs): # noqa: E501 + """Read an item # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_item_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the item (required) + :param str format: Get the entity in a different format like csv, pdf, eln or zip. \"pdfa\" means archive pdf (PDF/A), same with \"zipa\". + :param bool json: Include a full JSON export in the ZIP archive. Only applicable if format is zip(a). + :param bool with_title: Include the title in the QR code. Only applicable if format is qrpng. + :param int size: Specify the size of the QR code in pixels. Only applicable if format is qrpng. + :param bool changelog: Toggles if the changelog should be included in PDF exports (pdf, pdfa, zip, zipa). Changelog is by default included if the export provides PDF/A, otherwise not. + :return: Entity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'format', 'json', 'with_title', 'size', 'changelog'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_item" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `get_item`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + if 'format' in params: + query_params.append(('format', params['format'])) # noqa: E501 + if 'json' in params: + query_params.append(('json', params['json'])) # noqa: E501 + if 'with_title' in params: + query_params.append(('withTitle', params['with_title'])) # noqa: E501 + if 'size' in params: + query_params.append(('size', params['size'])) # noqa: E501 + if 'changelog' in params: + query_params.append(('changelog', params['changelog'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/items/{id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Entity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_item(self, body, id, **kwargs): # noqa: E501 + """Modify an item # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_item(body, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param object body: Parameters for patching an item (required) + :param int id: ID of the item (required) + :return: Item + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_item_with_http_info(body, id, **kwargs) # noqa: E501 + else: + (data) = self.patch_item_with_http_info(body, id, **kwargs) # noqa: E501 + return data + + def patch_item_with_http_info(self, body, id, **kwargs): # noqa: E501 + """Modify an item # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_item_with_http_info(body, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param object body: Parameters for patching an item (required) + :param int id: ID of the item (required) + :return: Item + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_item" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `patch_item`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_item`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/items/{id}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Item', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_item(self, **kwargs): # noqa: E501 + """Create an item # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_item(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityEditable body: Parameters for creating an item + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_item_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.post_item_with_http_info(**kwargs) # noqa: E501 + return data + + def post_item_with_http_info(self, **kwargs): # noqa: E501 + """Create an item # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_item_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityEditable body: Parameters for creating an item + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_item" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/items', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_item_by_id(self, id, **kwargs): # noqa: E501 + """Duplicate an item with its ID # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_item_by_id(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: The unique identifier of the item to duplicate. (required) + :param EntityDuplicate body: Parameters for duplicating an item + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_item_by_id_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.post_item_by_id_with_http_info(id, **kwargs) # noqa: E501 + return data + + def post_item_by_id_with_http_info(self, id, **kwargs): # noqa: E501 + """Duplicate an item with its ID # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_item_by_id_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: The unique identifier of the item to duplicate. (required) + :param EntityDuplicate body: Parameters for duplicating an item + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_item_by_id" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_item_by_id`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/items/{id}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_items(self, **kwargs): # noqa: E501 + """Read all items that are accessible # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_items(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str q: Search for a term in title, body or elabid. + :param str extended: Extended search (advanced query). + :param int related: Look only for entries linked to this entry id. + :param str related_origin: When using the \"related\" query parameter, select the type of the related ID (experiments or items) + :param str category: Add a filter on the Category. Supports comma separated list of numbers, including \"null\". + :param str status: Add a filter on the Status. Supports comma separated list of numbers, including \"null\". + :param list[str] tags: An array of tags for filtering results containing all of these tags. + :param int limit: Limit the number of results. + :param int offset: Skip a number of results. Use with limit to work the pagination. + :param str owner: Filter results by author (user id) + :param int scope: Set the scope for the results. 1: self, 2: team, 3: everything. It defaults to the user value stored in preferences. + :param str order: Change the ordering of the results. + :param str sort: Change the sorting of results: ascending or descending. + :param str state: Filter results based on their state: 1 (Normal), 2 (Archived), 3 (Deleted). Supports comma separated values. + :param int full: Return all columns of each entry when set to 1. + :return: list[Item] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_items_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.read_items_with_http_info(**kwargs) # noqa: E501 + return data + + def read_items_with_http_info(self, **kwargs): # noqa: E501 + """Read all items that are accessible # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_items_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str q: Search for a term in title, body or elabid. + :param str extended: Extended search (advanced query). + :param int related: Look only for entries linked to this entry id. + :param str related_origin: When using the \"related\" query parameter, select the type of the related ID (experiments or items) + :param str category: Add a filter on the Category. Supports comma separated list of numbers, including \"null\". + :param str status: Add a filter on the Status. Supports comma separated list of numbers, including \"null\". + :param list[str] tags: An array of tags for filtering results containing all of these tags. + :param int limit: Limit the number of results. + :param int offset: Skip a number of results. Use with limit to work the pagination. + :param str owner: Filter results by author (user id) + :param int scope: Set the scope for the results. 1: self, 2: team, 3: everything. It defaults to the user value stored in preferences. + :param str order: Change the ordering of the results. + :param str sort: Change the sorting of results: ascending or descending. + :param str state: Filter results based on their state: 1 (Normal), 2 (Archived), 3 (Deleted). Supports comma separated values. + :param int full: Return all columns of each entry when set to 1. + :return: list[Item] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['q', 'extended', 'related', 'related_origin', 'category', 'status', 'tags', 'limit', 'offset', 'owner', 'scope', 'order', 'sort', 'state', 'full'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_items" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'q' in params: + query_params.append(('q', params['q'])) # noqa: E501 + if 'extended' in params: + query_params.append(('extended', params['extended'])) # noqa: E501 + if 'related' in params: + query_params.append(('related', params['related'])) # noqa: E501 + if 'related_origin' in params: + query_params.append(('related_origin', params['related_origin'])) # noqa: E501 + if 'category' in params: + query_params.append(('category', params['category'])) # noqa: E501 + if 'status' in params: + query_params.append(('status', params['status'])) # noqa: E501 + if 'tags' in params: + query_params.append(('tags[]', params['tags'])) # noqa: E501 + collection_formats['tags[]'] = 'multi' # noqa: E501 + if 'limit' in params: + query_params.append(('limit', params['limit'])) # noqa: E501 + if 'offset' in params: + query_params.append(('offset', params['offset'])) # noqa: E501 + if 'owner' in params: + query_params.append(('owner', params['owner'])) # noqa: E501 + if 'scope' in params: + query_params.append(('scope', params['scope'])) # noqa: E501 + if 'order' in params: + query_params.append(('order', params['order'])) # noqa: E501 + if 'sort' in params: + query_params.append(('sort', params['sort'])) # noqa: E501 + if 'state' in params: + query_params.append(('state', params['state'])) # noqa: E501 + if 'full' in params: + query_params.append(('full', params['full'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/items', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Item]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/items_types__resources_templates_api.py b/vendor/elabapi-python/elabapi_python/api/items_types__resources_templates_api.py new file mode 100644 index 0000000..09f64ab --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/items_types__resources_templates_api.py @@ -0,0 +1,662 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class ItemsTypesResourcesTemplatesApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_items_type(self, id, **kwargs): # noqa: E501 + """Delete a resource template. # noqa: E501 + + The resource template gets soft-deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_items_type(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the resource template (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_items_type_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_items_type_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_items_type_with_http_info(self, id, **kwargs): # noqa: E501 + """Delete a resource template. # noqa: E501 + + The resource template gets soft-deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_items_type_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the resource template (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_items_type" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_items_type`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/items_types/{id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_items_type(self, id, **kwargs): # noqa: E501 + """Read a resource template # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_items_type(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the resource template (required) + :return: EntityTemplate + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_items_type_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.get_items_type_with_http_info(id, **kwargs) # noqa: E501 + return data + + def get_items_type_with_http_info(self, id, **kwargs): # noqa: E501 + """Read a resource template # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_items_type_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the resource template (required) + :return: EntityTemplate + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_items_type" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `get_items_type`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/items_types/{id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityTemplate', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_items_type(self, id, **kwargs): # noqa: E501 + """Modify a resource template # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_items_type(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the resource template (required) + :param ItemsTypesIdBody body: Parameters for modifying a resource template + :return: EntityTemplate + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_items_type_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.patch_items_type_with_http_info(id, **kwargs) # noqa: E501 + return data + + def patch_items_type_with_http_info(self, id, **kwargs): # noqa: E501 + """Modify a resource template # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_items_type_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the resource template (required) + :param ItemsTypesIdBody body: Parameters for modifying a resource template + :return: EntityTemplate + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_items_type" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_items_type`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/items_types/{id}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityTemplate', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_items_types(self, **kwargs): # noqa: E501 + """Create a resource template # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_items_types(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityTemplateEditable body: Parameters for creating a resource template + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_items_types_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.post_items_types_with_http_info(**kwargs) # noqa: E501 + return data + + def post_items_types_with_http_info(self, **kwargs): # noqa: E501 + """Create a resource template # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_items_types_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityTemplateEditable body: Parameters for creating a resource template + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_items_types" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/items_types', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_items_types_by_id(self, id, **kwargs): # noqa: E501 + """Duplicate a resource template with its ID # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_items_types_by_id(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: The unique identifier of the resource template to duplicate. (required) + :param EntityDuplicate body: Parameters for duplicating a resource template + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_items_types_by_id_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.post_items_types_by_id_with_http_info(id, **kwargs) # noqa: E501 + return data + + def post_items_types_by_id_with_http_info(self, id, **kwargs): # noqa: E501 + """Duplicate a resource template with its ID # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_items_types_by_id_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: The unique identifier of the resource template to duplicate. (required) + :param EntityDuplicate body: Parameters for duplicating a resource template + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_items_types_by_id" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_items_types_by_id`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/items_types/{id}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_items_types(self, **kwargs): # noqa: E501 + """Read all resources templates that are accessible # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_items_types(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str q: Search for a term in title, body or elabid. + :param str extended: Extended search (advanced query). + :param int related: Look only for entries linked to this entry id. + :param str related_origin: When using the \"related\" query parameter, select the type of the related ID (experiments or items) + :param str category: Add a filter on the Category. Supports comma separated list of numbers, including \"null\". + :param str status: Add a filter on the Status. Supports comma separated list of numbers, including \"null\". + :param list[str] tags: An array of tags for filtering results containing all of these tags. + :param int limit: Limit the number of results. + :param int offset: Skip a number of results. Use with limit to work the pagination. + :param str owner: Filter results by author (user id) + :param int scope: Set the scope for the results. 1: self, 2: team, 3: everything. It defaults to the user value stored in preferences. + :param str order: Change the ordering of the results. + :param str sort: Change the sorting of results: ascending or descending. + :param str state: Filter results based on their state: 1 (Normal), 2 (Archived), 3 (Deleted). Supports comma separated values. + :param int full: Return all columns of each entry when set to 1. + :return: list[EntityTemplate] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_items_types_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.read_items_types_with_http_info(**kwargs) # noqa: E501 + return data + + def read_items_types_with_http_info(self, **kwargs): # noqa: E501 + """Read all resources templates that are accessible # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_items_types_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str q: Search for a term in title, body or elabid. + :param str extended: Extended search (advanced query). + :param int related: Look only for entries linked to this entry id. + :param str related_origin: When using the \"related\" query parameter, select the type of the related ID (experiments or items) + :param str category: Add a filter on the Category. Supports comma separated list of numbers, including \"null\". + :param str status: Add a filter on the Status. Supports comma separated list of numbers, including \"null\". + :param list[str] tags: An array of tags for filtering results containing all of these tags. + :param int limit: Limit the number of results. + :param int offset: Skip a number of results. Use with limit to work the pagination. + :param str owner: Filter results by author (user id) + :param int scope: Set the scope for the results. 1: self, 2: team, 3: everything. It defaults to the user value stored in preferences. + :param str order: Change the ordering of the results. + :param str sort: Change the sorting of results: ascending or descending. + :param str state: Filter results based on their state: 1 (Normal), 2 (Archived), 3 (Deleted). Supports comma separated values. + :param int full: Return all columns of each entry when set to 1. + :return: list[EntityTemplate] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['q', 'extended', 'related', 'related_origin', 'category', 'status', 'tags', 'limit', 'offset', 'owner', 'scope', 'order', 'sort', 'state', 'full'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_items_types" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'q' in params: + query_params.append(('q', params['q'])) # noqa: E501 + if 'extended' in params: + query_params.append(('extended', params['extended'])) # noqa: E501 + if 'related' in params: + query_params.append(('related', params['related'])) # noqa: E501 + if 'related_origin' in params: + query_params.append(('related_origin', params['related_origin'])) # noqa: E501 + if 'category' in params: + query_params.append(('category', params['category'])) # noqa: E501 + if 'status' in params: + query_params.append(('status', params['status'])) # noqa: E501 + if 'tags' in params: + query_params.append(('tags[]', params['tags'])) # noqa: E501 + collection_formats['tags[]'] = 'multi' # noqa: E501 + if 'limit' in params: + query_params.append(('limit', params['limit'])) # noqa: E501 + if 'offset' in params: + query_params.append(('offset', params['offset'])) # noqa: E501 + if 'owner' in params: + query_params.append(('owner', params['owner'])) # noqa: E501 + if 'scope' in params: + query_params.append(('scope', params['scope'])) # noqa: E501 + if 'order' in params: + query_params.append(('order', params['order'])) # noqa: E501 + if 'sort' in params: + query_params.append(('sort', params['sort'])) # noqa: E501 + if 'state' in params: + query_params.append(('state', params['state'])) # noqa: E501 + if 'full' in params: + query_params.append(('full', params['full'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/items_types', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityTemplate]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/links_to_compounds_api.py b/vendor/elabapi-python/elabapi_python/api/links_to_compounds_api.py new file mode 100644 index 0000000..74ca249 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/links_to_compounds_api.py @@ -0,0 +1,362 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class LinksToCompoundsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_entity_compounds_link(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Delete a compound link. # noqa: E501 + + The link gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_compounds_link(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the compound linked (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_entity_compounds_link_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.delete_entity_compounds_link_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def delete_entity_compounds_link_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Delete a compound link. # noqa: E501 + + The link gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_compounds_link_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the compound linked (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_entity_compounds_link" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `delete_entity_compounds_link`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_entity_compounds_link`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `delete_entity_compounds_link`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/compounds_links/{subid}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_entity_compounds_links(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Link an entity to a compound. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_entity_compounds_links(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the compound linked (required) + :param CompoundsLinksSubidBody body: Parameters for creating a link. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_entity_compounds_links_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.post_entity_compounds_links_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def post_entity_compounds_links_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Link an entity to a compound. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_entity_compounds_links_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the compound linked (required) + :param CompoundsLinksSubidBody body: Parameters for creating a link. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_entity_compounds_links" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `post_entity_compounds_links`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_entity_compounds_links`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `post_entity_compounds_links`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/compounds_links/{subid}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_entity_compounds_links(self, entity_type, id, **kwargs): # noqa: E501 + """Read all compounds links of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_entity_compounds_links(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[Link] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_entity_compounds_links_with_http_info(entity_type, id, **kwargs) # noqa: E501 + else: + (data) = self.read_entity_compounds_links_with_http_info(entity_type, id, **kwargs) # noqa: E501 + return data + + def read_entity_compounds_links_with_http_info(self, entity_type, id, **kwargs): # noqa: E501 + """Read all compounds links of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_entity_compounds_links_with_http_info(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[Link] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_entity_compounds_links" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `read_entity_compounds_links`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_entity_compounds_links`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/compounds_links', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Link]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/links_to_experiments_api.py b/vendor/elabapi-python/elabapi_python/api/links_to_experiments_api.py new file mode 100644 index 0000000..e5c5bb0 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/links_to_experiments_api.py @@ -0,0 +1,362 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class LinksToExperimentsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_entity_experiments_link(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Delete an experiment link. # noqa: E501 + + The link gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_experiments_link(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the experiment linked (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_entity_experiments_link_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.delete_entity_experiments_link_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def delete_entity_experiments_link_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Delete an experiment link. # noqa: E501 + + The link gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_experiments_link_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the experiment linked (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_entity_experiments_link" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `delete_entity_experiments_link`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_entity_experiments_link`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `delete_entity_experiments_link`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/experiments_links/{subid}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_entity_experiments_links(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Create or import a link. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_entity_experiments_links(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the experiment linked (required) + :param ExperimentsLinksSubidBody body: Parameters for creating or importing a link. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_entity_experiments_links_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.post_entity_experiments_links_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def post_entity_experiments_links_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Create or import a link. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_entity_experiments_links_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the experiment linked (required) + :param ExperimentsLinksSubidBody body: Parameters for creating or importing a link. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_entity_experiments_links" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `post_entity_experiments_links`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_entity_experiments_links`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `post_entity_experiments_links`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/experiments_links/{subid}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_entity_experiments_links(self, entity_type, id, **kwargs): # noqa: E501 + """Read all experiments links of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_entity_experiments_links(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[Link] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_entity_experiments_links_with_http_info(entity_type, id, **kwargs) # noqa: E501 + else: + (data) = self.read_entity_experiments_links_with_http_info(entity_type, id, **kwargs) # noqa: E501 + return data + + def read_entity_experiments_links_with_http_info(self, entity_type, id, **kwargs): # noqa: E501 + """Read all experiments links of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_entity_experiments_links_with_http_info(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[Link] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_entity_experiments_links" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `read_entity_experiments_links`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_entity_experiments_links`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/experiments_links', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Link]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/links_to_items_api.py b/vendor/elabapi-python/elabapi_python/api/links_to_items_api.py new file mode 100644 index 0000000..9ea7014 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/links_to_items_api.py @@ -0,0 +1,362 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class LinksToItemsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_entitiy_items_link(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Delete an item link. # noqa: E501 + + The link gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entitiy_items_link(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the item (link) (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_entitiy_items_link_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.delete_entitiy_items_link_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def delete_entitiy_items_link_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Delete an item link. # noqa: E501 + + The link gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entitiy_items_link_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the item (link) (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_entitiy_items_link" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `delete_entitiy_items_link`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_entitiy_items_link`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `delete_entitiy_items_link`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/items_links/{subid}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_entity_items_links(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Create or import a link. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_entity_items_links(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the item (link) (required) + :param ItemsLinksSubidBody body: Parameters for creating or importing a link. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_entity_items_links_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.post_entity_items_links_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def post_entity_items_links_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Create or import a link. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_entity_items_links_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the item (link) (required) + :param ItemsLinksSubidBody body: Parameters for creating or importing a link. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_entity_items_links" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `post_entity_items_links`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_entity_items_links`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `post_entity_items_links`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/items_links/{subid}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_entity_items_links(self, entity_type, id, **kwargs): # noqa: E501 + """Read all items links of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_entity_items_links(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[Link] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_entity_items_links_with_http_info(entity_type, id, **kwargs) # noqa: E501 + else: + (data) = self.read_entity_items_links_with_http_info(entity_type, id, **kwargs) # noqa: E501 + return data + + def read_entity_items_links_with_http_info(self, entity_type, id, **kwargs): # noqa: E501 + """Read all items links of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_entity_items_links_with_http_info(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[Link] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_entity_items_links" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `read_entity_items_links`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_entity_items_links`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/items_links', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Link]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/notifications_api.py b/vendor/elabapi-python/elabapi_python/api/notifications_api.py new file mode 100644 index 0000000..43370a9 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/notifications_api.py @@ -0,0 +1,431 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class NotificationsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_notifications(self, id, **kwargs): # noqa: E501 + """Delete all notifications of the user. # noqa: E501 + + All notifications for the user are deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_notifications(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id3 id: ID of the user or `me`. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_notifications_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_notifications_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_notifications_with_http_info(self, id, **kwargs): # noqa: E501 + """Delete all notifications of the user. # noqa: E501 + + All notifications for the user are deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_notifications_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id3 id: ID of the user or `me`. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_notifications" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_notifications`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/users/{id}/notifications', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_notification(self, id, subid, **kwargs): # noqa: E501 + """Update the acknowledgment status of a notification. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_notification(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id4 id: ID of the user or `me`. (required) + :param int subid: ID of the notification. (required) + :param NotificationsSubidBody body: Defines whether the notification is acknowledged. + :return: Notification + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_notification_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.patch_notification_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def patch_notification_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Update the acknowledgment status of a notification. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_notification_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id4 id: ID of the user or `me`. (required) + :param int subid: ID of the notification. (required) + :param NotificationsSubidBody body: Defines whether the notification is acknowledged. + :return: Notification + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_notification" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_notification`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `patch_notification`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/users/{id}/notifications/{subid}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Notification', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_notification(self, id, subid, **kwargs): # noqa: E501 + """Read a notification. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_notification(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id4 id: ID of the user or `me`. (required) + :param int subid: ID of the notification. (required) + :return: Notification + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_notification_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.read_notification_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def read_notification_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Read a notification. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_notification_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id4 id: ID of the user or `me`. (required) + :param int subid: ID of the notification. (required) + :return: Notification + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_notification" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_notification`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `read_notification`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/users/{id}/notifications/{subid}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Notification', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_notifications(self, id, **kwargs): # noqa: E501 + """Read notifications of a user. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_notifications(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id3 id: ID of the user or `me`. (required) + :return: InlineResponse2007 + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_notifications_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_notifications_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_notifications_with_http_info(self, id, **kwargs): # noqa: E501 + """Read notifications of a user. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_notifications_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id3 id: ID of the user or `me`. (required) + :return: InlineResponse2007 + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_notifications" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_notifications`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/users/{id}/notifications', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='InlineResponse2007', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/reports_api.py b/vendor/elabapi-python/elabapi_python/api/reports_api.py new file mode 100644 index 0000000..818011e --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/reports_api.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class ReportsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_reports(self, **kwargs): # noqa: E501 + """Get usage reports # noqa: E501 + + Get usage reports at the instance or team level. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_reports(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str format: Select the output format + :param str scope: Select the scope. Instance is for sysadmins only. Team will generate report for the current team. If scope is `compounds_history`, you can also provide `start` and `end` (format `YYYY-MM-DD`). + :param date start: Start date (YYYY-MM-DD). Only used when scope is `compounds_history`. + :param date end: End date (YYYY-MM-DD). Only used when scope is `compounds_history`. + :return: InlineResponse2004 + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_reports_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_reports_with_http_info(**kwargs) # noqa: E501 + return data + + def get_reports_with_http_info(self, **kwargs): # noqa: E501 + """Get usage reports # noqa: E501 + + Get usage reports at the instance or team level. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_reports_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str format: Select the output format + :param str scope: Select the scope. Instance is for sysadmins only. Team will generate report for the current team. If scope is `compounds_history`, you can also provide `start` and `end` (format `YYYY-MM-DD`). + :param date start: Start date (YYYY-MM-DD). Only used when scope is `compounds_history`. + :param date end: End date (YYYY-MM-DD). Only used when scope is `compounds_history`. + :return: InlineResponse2004 + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['format', 'scope', 'start', 'end'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_reports" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'format' in params: + query_params.append(('format', params['format'])) # noqa: E501 + if 'scope' in params: + query_params.append(('scope', params['scope'])) # noqa: E501 + if 'start' in params: + query_params.append(('start', params['start'])) # noqa: E501 + if 'end' in params: + query_params.append(('end', params['end'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json', 'text/csv']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/reports', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='InlineResponse2004', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/resources_categories_api.py b/vendor/elabapi-python/elabapi_python/api/resources_categories_api.py new file mode 100644 index 0000000..5f13a96 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/resources_categories_api.py @@ -0,0 +1,538 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class ResourcesCategoriesApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_rescat(self, id, subid, **kwargs): # noqa: E501 + """Delete a category. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_rescat(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the category. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_rescat_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.delete_rescat_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def delete_rescat_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Delete a category. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_rescat_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the category. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_rescat" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_rescat`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `delete_rescat`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/resources_categories/{subid}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_rescat(self, id, subid, **kwargs): # noqa: E501 + """Modify a category. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_rescat(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the category. (required) + :param Statuslike body: Parameters for modifying a resource category. + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_rescat_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.patch_rescat_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def patch_rescat_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Modify a category. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_rescat_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the category. (required) + :param Statuslike body: Parameters for modifying a resource category. + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_rescat" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_rescat`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `patch_rescat`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/resources_categories/{subid}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Statuslike', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_team_one_rescat(self, id, **kwargs): # noqa: E501 + """Create a new category for resources. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_team_one_rescat(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param IdResourcesCategoriesBody body: Parameters for creating a resource category. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_team_one_rescat_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.post_team_one_rescat_with_http_info(id, **kwargs) # noqa: E501 + return data + + def post_team_one_rescat_with_http_info(self, id, **kwargs): # noqa: E501 + """Create a new category for resources. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_team_one_rescat_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param IdResourcesCategoriesBody body: Parameters for creating a resource category. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_team_one_rescat" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_team_one_rescat`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/resources_categories', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_team_one_rescat(self, id, subid, **kwargs): # noqa: E501 + """Read a category. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_one_rescat(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the category. (required) + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_team_one_rescat_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.read_team_one_rescat_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def read_team_one_rescat_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Read a category. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_one_rescat_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the category. (required) + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_team_one_rescat" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_team_one_rescat`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `read_team_one_rescat`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/resources_categories/{subid}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Statuslike', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_team_resources_categories(self, id, **kwargs): # noqa: E501 + """Read resources categories of a team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_resources_categories(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :return: list[Statuslike] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_team_resources_categories_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_team_resources_categories_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_team_resources_categories_with_http_info(self, id, **kwargs): # noqa: E501 + """Read resources categories of a team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_resources_categories_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :return: list[Statuslike] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_team_resources_categories" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_team_resources_categories`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/resources_categories', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Statuslike]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/resources_status_api.py b/vendor/elabapi-python/elabapi_python/api/resources_status_api.py new file mode 100644 index 0000000..a5bd6ed --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/resources_status_api.py @@ -0,0 +1,538 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class ResourcesStatusApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_resstatus(self, id, subid, **kwargs): # noqa: E501 + """Delete a status. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_resstatus(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the status (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_resstatus_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.delete_resstatus_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def delete_resstatus_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Delete a status. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_resstatus_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the status (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_resstatus" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_resstatus`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `delete_resstatus`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/items_status/{subid}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_resstatus(self, id, subid, **kwargs): # noqa: E501 + """Modify a status. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_resstatus(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the status (required) + :param Statuslike body: Parameters for modifying a status. + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_resstatus_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.patch_resstatus_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def patch_resstatus_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Modify a status. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_resstatus_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the status (required) + :param Statuslike body: Parameters for modifying a status. + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_resstatus" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_resstatus`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `patch_resstatus`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/items_status/{subid}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Statuslike', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_team_one_resstat(self, id, **kwargs): # noqa: E501 + """Create a new status for resources. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_team_one_resstat(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param IdItemsStatusBody body: Parameters for creating a resources status. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_team_one_resstat_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.post_team_one_resstat_with_http_info(id, **kwargs) # noqa: E501 + return data + + def post_team_one_resstat_with_http_info(self, id, **kwargs): # noqa: E501 + """Create a new status for resources. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_team_one_resstat_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param IdItemsStatusBody body: Parameters for creating a resources status. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_team_one_resstat" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_team_one_resstat`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/items_status', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_team_items_status(self, id, **kwargs): # noqa: E501 + """Read resources status of a team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_items_status(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :return: list[Statuslike] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_team_items_status_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_team_items_status_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_team_items_status_with_http_info(self, id, **kwargs): # noqa: E501 + """Read resources status of a team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_items_status_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :return: list[Statuslike] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_team_items_status" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_team_items_status`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/items_status', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Statuslike]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_team_one_resstatus(self, id, subid, **kwargs): # noqa: E501 + """Read a status. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_one_resstatus(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the status (required) + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_team_one_resstatus_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.read_team_one_resstatus_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def read_team_one_resstatus_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Read a status. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_one_resstatus_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the status (required) + :return: Statuslike + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_team_one_resstatus" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_team_one_resstatus`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `read_team_one_resstatus`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/items_status/{subid}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Statuslike', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/revisions_api.py b/vendor/elabapi-python/elabapi_python/api/revisions_api.py new file mode 100644 index 0000000..67c4500 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/revisions_api.py @@ -0,0 +1,360 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class RevisionsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def patch_entity_revision(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Restore a revision. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_entity_revision(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the revision (required) + :param RevisionsSubidBody body: Parameters for restoring an entity revision. + :return: Revision + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_entity_revision_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.patch_entity_revision_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def patch_entity_revision_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Restore a revision. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_entity_revision_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the revision (required) + :param RevisionsSubidBody body: Parameters for restoring an entity revision. + :return: Revision + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_entity_revision" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `patch_entity_revision`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_entity_revision`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `patch_entity_revision`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/revisions/{subid}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Revision', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_entity_revision(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Read a revision of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_entity_revision(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the revision (required) + :return: Revision + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_entity_revision_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.read_entity_revision_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def read_entity_revision_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Read a revision of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_entity_revision_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the revision (required) + :return: Revision + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_entity_revision" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `read_entity_revision`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_entity_revision`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `read_entity_revision`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/revisions/{subid}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Revision', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_entity_revisions(self, entity_type, id, **kwargs): # noqa: E501 + """Read all revisions of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_entity_revisions(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[InlineResponse2008] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_entity_revisions_with_http_info(entity_type, id, **kwargs) # noqa: E501 + else: + (data) = self.read_entity_revisions_with_http_info(entity_type, id, **kwargs) # noqa: E501 + return data + + def read_entity_revisions_with_http_info(self, entity_type, id, **kwargs): # noqa: E501 + """Read all revisions of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_entity_revisions_with_http_info(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[InlineResponse2008] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_entity_revisions" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `read_entity_revisions`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_entity_revisions`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/revisions', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[InlineResponse2008]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/steps_api.py b/vendor/elabapi-python/elabapi_python/api/steps_api.py new file mode 100644 index 0000000..3df6579 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/steps_api.py @@ -0,0 +1,471 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class StepsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_step(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Delete a step. # noqa: E501 + + The step gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_step(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the step (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_step_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.delete_step_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def delete_step_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Delete a step. # noqa: E501 + + The step gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_step_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the step (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_step" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `delete_step`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_step`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `delete_step`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/steps/{subid}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_step(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Actions on a step. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_step(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the step (required) + :param StepsSubidBody body: Parameters for modifying a step + :return: Step + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_step_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.patch_step_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def patch_step_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Actions on a step. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_step_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the step (required) + :param StepsSubidBody body: Parameters for modifying a step + :return: Step + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_step" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `patch_step`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_step`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `patch_step`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/steps/{subid}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Step', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_step(self, entity_type, id, **kwargs): # noqa: E501 + """Create a step. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_step(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param IdStepsBody body: Parameters for creating a step. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_step_with_http_info(entity_type, id, **kwargs) # noqa: E501 + else: + (data) = self.post_step_with_http_info(entity_type, id, **kwargs) # noqa: E501 + return data + + def post_step_with_http_info(self, entity_type, id, **kwargs): # noqa: E501 + """Create a step. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_step_with_http_info(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param IdStepsBody body: Parameters for creating a step. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_step" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `post_step`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_step`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/steps', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_steps(self, entity_type, id, **kwargs): # noqa: E501 + """Read all steps of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_steps(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[Step] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_steps_with_http_info(entity_type, id, **kwargs) # noqa: E501 + else: + (data) = self.read_steps_with_http_info(entity_type, id, **kwargs) # noqa: E501 + return data + + def read_steps_with_http_info(self, entity_type, id, **kwargs): # noqa: E501 + """Read all steps of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_steps_with_http_info(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[Step] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_steps" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `read_steps`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_steps`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/steps', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Step]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/storage_units_api.py b/vendor/elabapi-python/elabapi_python/api/storage_units_api.py new file mode 100644 index 0000000..faf5e5e --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/storage_units_api.py @@ -0,0 +1,516 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class StorageUnitsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_storage_unit(self, id, **kwargs): # noqa: E501 + """Delete a storage unit. # noqa: E501 + + Delete a storage unit. Requires permission to manage inventory locations. Cannot delete a storage unit that has children or containers. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_storage_unit(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the storage unit. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_storage_unit_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_storage_unit_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_storage_unit_with_http_info(self, id, **kwargs): # noqa: E501 + """Delete a storage unit. # noqa: E501 + + Delete a storage unit. Requires permission to manage inventory locations. Cannot delete a storage unit that has children or containers. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_storage_unit_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the storage unit. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_storage_unit" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_storage_unit`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/storage_units/{id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_storage_unit(self, id, **kwargs): # noqa: E501 + """Modify a storage unit. # noqa: E501 + + Update the name and/or the parent of a storage unit. Setting `parent_id` reparents the unit (and everything under it) in place. Pass `parent_id: null` to move the unit to the root. Requires permission to manage inventory locations. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_storage_unit(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the storage unit. (required) + :param StorageUnitsIdBody body: Parameters for modifying a storage unit. + :return: StorageUnit + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_storage_unit_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.patch_storage_unit_with_http_info(id, **kwargs) # noqa: E501 + return data + + def patch_storage_unit_with_http_info(self, id, **kwargs): # noqa: E501 + """Modify a storage unit. # noqa: E501 + + Update the name and/or the parent of a storage unit. Setting `parent_id` reparents the unit (and everything under it) in place. Pass `parent_id: null` to move the unit to the root. Requires permission to manage inventory locations. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_storage_unit_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the storage unit. (required) + :param StorageUnitsIdBody body: Parameters for modifying a storage unit. + :return: StorageUnit + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_storage_unit" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_storage_unit`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/storage_units/{id}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='StorageUnit', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_storage_unit(self, body, **kwargs): # noqa: E501 + """Create a new storage unit. # noqa: E501 + + Create a new storage unit. Requires permission to manage inventory locations. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_storage_unit(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param StorageUnitsBody body: Parameters for creating a storage unit. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_storage_unit_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.post_storage_unit_with_http_info(body, **kwargs) # noqa: E501 + return data + + def post_storage_unit_with_http_info(self, body, **kwargs): # noqa: E501 + """Create a new storage unit. # noqa: E501 + + Create a new storage unit. Requires permission to manage inventory locations. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_storage_unit_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param StorageUnitsBody body: Parameters for creating a storage unit. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_storage_unit" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `post_storage_unit`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/storage_units', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_storage_unit(self, id, **kwargs): # noqa: E501 + """Read a storage unit. # noqa: E501 + + Get details of a specific storage unit including its full hierarchical path. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_storage_unit(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the storage unit. (required) + :return: StorageUnit + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_storage_unit_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_storage_unit_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_storage_unit_with_http_info(self, id, **kwargs): # noqa: E501 + """Read a storage unit. # noqa: E501 + + Get details of a specific storage unit including its full hierarchical path. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_storage_unit_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the storage unit. (required) + :return: StorageUnit + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_storage_unit" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_storage_unit`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/storage_units/{id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='StorageUnit', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_storage_units(self, **kwargs): # noqa: E501 + """Read all containers, or the storage unit hierarchy when `?hierarchy=true`. # noqa: E501 + + Without parameters, returns the full list of containers (assignments of experiments or resources to storage locations) that you have access to. With `?hierarchy=true`, returns a flat list of all storage units (freezers, boxes, positions, etc.) with their hierarchy metadata (`id`, `name`, `parent_id`, `full_path`, `level_depth`, `children_count`). This allows clients to discover, traverse, or display the storage unit tree. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_storage_units(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param bool hierarchy: When true, returns a flat list of all storage units in the hierarchy (id, name, parent_id, full_path, level_depth, children_count) instead of the default container assignment list. + :return: InlineResponse200 + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_storage_units_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.read_storage_units_with_http_info(**kwargs) # noqa: E501 + return data + + def read_storage_units_with_http_info(self, **kwargs): # noqa: E501 + """Read all containers, or the storage unit hierarchy when `?hierarchy=true`. # noqa: E501 + + Without parameters, returns the full list of containers (assignments of experiments or resources to storage locations) that you have access to. With `?hierarchy=true`, returns a flat list of all storage units (freezers, boxes, positions, etc.) with their hierarchy metadata (`id`, `name`, `parent_id`, `full_path`, `level_depth`, `children_count`). This allows clients to discover, traverse, or display the storage unit tree. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_storage_units_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param bool hierarchy: When true, returns a flat list of all storage units in the hierarchy (id, name, parent_id, full_path, level_depth, children_count) instead of the default container assignment list. + :return: InlineResponse200 + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['hierarchy'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_storage_units" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'hierarchy' in params: + query_params.append(('hierarchy', params['hierarchy'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/storage_units', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='InlineResponse200', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/tags_api.py b/vendor/elabapi-python/elabapi_python/api/tags_api.py new file mode 100644 index 0000000..72a074d --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/tags_api.py @@ -0,0 +1,572 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class TagsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_tag(self, entity_type, id, **kwargs): # noqa: E501 + """Delete all tags. # noqa: E501 + + All the tags from that entity get removed. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_tag(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_tag_with_http_info(entity_type, id, **kwargs) # noqa: E501 + else: + (data) = self.delete_tag_with_http_info(entity_type, id, **kwargs) # noqa: E501 + return data + + def delete_tag_with_http_info(self, entity_type, id, **kwargs): # noqa: E501 + """Delete all tags. # noqa: E501 + + All the tags from that entity get removed. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_tag_with_http_info(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_tag" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `delete_tag`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_tag`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/tags', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_tag(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Actions on a tag (like removing it from the entity). # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_tag(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the tag (required) + :param TagsSubidBody1 body: Parameters for modifying a tag + :return: Tag + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_tag_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.patch_tag_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def patch_tag_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Actions on a tag (like removing it from the entity). # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_tag_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the tag (required) + :param TagsSubidBody1 body: Parameters for modifying a tag + :return: Tag + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_tag" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `patch_tag`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_tag`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `patch_tag`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/tags/{subid}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Tag', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_tag(self, entity_type, id, **kwargs): # noqa: E501 + """Create a tag. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_tag(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param IdTagsBody1 body: Parameters for creating a tag. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_tag_with_http_info(entity_type, id, **kwargs) # noqa: E501 + else: + (data) = self.post_tag_with_http_info(entity_type, id, **kwargs) # noqa: E501 + return data + + def post_tag_with_http_info(self, entity_type, id, **kwargs): # noqa: E501 + """Create a tag. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_tag_with_http_info(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param IdTagsBody1 body: Parameters for creating a tag. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_tag" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `post_tag`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_tag`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/tags', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_tag(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Read a tag. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_tag(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the tag (required) + :return: Tag + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_tag_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.read_tag_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def read_tag_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Read a tag. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_tag_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the tag (required) + :return: Tag + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_tag" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `read_tag`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_tag`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `read_tag`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/tags/{subid}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Tag', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_tags(self, entity_type, id, **kwargs): # noqa: E501 + """Read all tags of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_tags(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[Tag] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_tags_with_http_info(entity_type, id, **kwargs) # noqa: E501 + else: + (data) = self.read_tags_with_http_info(entity_type, id, **kwargs) # noqa: E501 + return data + + def read_tags_with_http_info(self, entity_type, id, **kwargs): # noqa: E501 + """Read all tags of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_tags_with_http_info(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :return: list[Tag] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_tags" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `read_tags`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_tags`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/tags', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Tag]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/team_tags_api.py b/vendor/elabapi-python/elabapi_python/api/team_tags_api.py new file mode 100644 index 0000000..c519fb3 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/team_tags_api.py @@ -0,0 +1,538 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class TeamTagsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_team_tag(self, id, subid, **kwargs): # noqa: E501 + """Delete a tag. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_team_tag(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the tag. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_team_tag_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.delete_team_tag_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def delete_team_tag_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Delete a tag. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_team_tag_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the tag. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_team_tag" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_team_tag`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `delete_team_tag`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/tags/{subid}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_team_tag(self, id, subid, **kwargs): # noqa: E501 + """Actions on a tag. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_team_tag(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the tag. (required) + :param TagsSubidBody body: Parameters for modifying a tag. + :return: Tag + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_team_tag_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.patch_team_tag_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def patch_team_tag_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Actions on a tag. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_team_tag_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the tag. (required) + :param TagsSubidBody body: Parameters for modifying a tag. + :return: Tag + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_team_tag" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_team_tag`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `patch_team_tag`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/tags/{subid}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Tag', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_team_tag(self, id, **kwargs): # noqa: E501 + """Create a tag in the team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_team_tag(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param IdTagsBody body: Parameters for adding a tag in the team. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_team_tag_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.post_team_tag_with_http_info(id, **kwargs) # noqa: E501 + return data + + def post_team_tag_with_http_info(self, id, **kwargs): # noqa: E501 + """Create a tag in the team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_team_tag_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param IdTagsBody body: Parameters for adding a tag in the team. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_team_tag" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_team_tag`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/tags', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_team_tag(self, id, subid, **kwargs): # noqa: E501 + """Read a tag. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_tag(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the tag. (required) + :return: Tag + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_team_tag_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.read_team_tag_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def read_team_tag_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Read a tag. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_tag_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the tag. (required) + :return: Tag + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_team_tag" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_team_tag`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `read_team_tag`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/tags/{subid}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Tag', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_team_tags(self, id, **kwargs): # noqa: E501 + """Read all tags for the team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_tags(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :return: list[Tag] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_team_tags_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_team_tags_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_team_tags_with_http_info(self, id, **kwargs): # noqa: E501 + """Read all tags for the team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_tags_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :return: list[Tag] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_team_tags" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_team_tags`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/tags', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Tag]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/teamgroups_api.py b/vendor/elabapi-python/elabapi_python/api/teamgroups_api.py new file mode 100644 index 0000000..bf50a1d --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/teamgroups_api.py @@ -0,0 +1,538 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class TeamgroupsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_teamgroup(self, id, subid, **kwargs): # noqa: E501 + """Delete a teamgroup. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_teamgroup(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the teamgroup. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_teamgroup_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.delete_teamgroup_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def delete_teamgroup_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Delete a teamgroup. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_teamgroup_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the teamgroup. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_teamgroup" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_teamgroup`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `delete_teamgroup`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/teamgroups/{subid}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_teamgroup(self, id, subid, **kwargs): # noqa: E501 + """Modify a teamgroup. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_teamgroup(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the teamgroup. (required) + :param TeamgroupsSubidBody body: Parameters for modifying a teamgroup. + :return: Teamgroup + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_teamgroup_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.patch_teamgroup_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def patch_teamgroup_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Modify a teamgroup. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_teamgroup_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the teamgroup. (required) + :param TeamgroupsSubidBody body: Parameters for modifying a teamgroup. + :return: Teamgroup + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_teamgroup" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_teamgroup`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `patch_teamgroup`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/teamgroups/{subid}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Teamgroup', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_teamgroups(self, id, **kwargs): # noqa: E501 + """Create a new teamgroup. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_teamgroups(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param IdTeamgroupsBody body: Parameters for creating a teamgroup. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_teamgroups_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.post_teamgroups_with_http_info(id, **kwargs) # noqa: E501 + return data + + def post_teamgroups_with_http_info(self, id, **kwargs): # noqa: E501 + """Create a new teamgroup. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_teamgroups_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param IdTeamgroupsBody body: Parameters for creating a teamgroup. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_teamgroups" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_teamgroups`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/teamgroups', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_team_teamgroups(self, id, **kwargs): # noqa: E501 + """Read teamgroups of a team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_teamgroups(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :return: dict(str, Teamgroup) + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_team_teamgroups_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_team_teamgroups_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_team_teamgroups_with_http_info(self, id, **kwargs): # noqa: E501 + """Read teamgroups of a team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_teamgroups_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :return: dict(str, Teamgroup) + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_team_teamgroups" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_team_teamgroups`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/teamgroups', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='dict(str, Teamgroup)', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_teamgroup(self, id, subid, **kwargs): # noqa: E501 + """Read a teamgroup. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_teamgroup(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the teamgroup. (required) + :return: InlineResponse2005 + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_teamgroup_with_http_info(id, subid, **kwargs) # noqa: E501 + else: + (data) = self.read_teamgroup_with_http_info(id, subid, **kwargs) # noqa: E501 + return data + + def read_teamgroup_with_http_info(self, id, subid, **kwargs): # noqa: E501 + """Read a teamgroup. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_teamgroup_with_http_info(id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the team. (required) + :param int subid: ID of the teamgroup. (required) + :return: InlineResponse2005 + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_teamgroup" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_teamgroup`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `read_teamgroup`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}/teamgroups/{subid}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='InlineResponse2005', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/teams_api.py b/vendor/elabapi-python/elabapi_python/api/teams_api.py new file mode 100644 index 0000000..61f708a --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/teams_api.py @@ -0,0 +1,405 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class TeamsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def patch_team(self, id, **kwargs): # noqa: E501 + """Actions on a team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_team(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id id: ID of the team or `current`. (required) + :param TeamsIdBody body: Parameters for modifying a team. + :return: Team + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_team_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.patch_team_with_http_info(id, **kwargs) # noqa: E501 + return data + + def patch_team_with_http_info(self, id, **kwargs): # noqa: E501 + """Actions on a team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_team_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id id: ID of the team or `current`. (required) + :param TeamsIdBody body: Parameters for modifying a team. + :return: Team + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_team" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_team`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Team', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_teams(self, **kwargs): # noqa: E501 + """Create a new team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_teams(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param TeamsBody body: Parameters for creating a new team. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_teams_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.post_teams_with_http_info(**kwargs) # noqa: E501 + return data + + def post_teams_with_http_info(self, **kwargs): # noqa: E501 + """Create a new team. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_teams_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param TeamsBody body: Parameters for creating a new team. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_teams" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_team(self, id, **kwargs): # noqa: E501 + """Read a team. Requires Admin permissions. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id id: ID of the team or `current`. (required) + :return: Team + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_team_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_team_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_team_with_http_info(self, id, **kwargs): # noqa: E501 + """Read a team. Requires Admin permissions. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_team_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id id: ID of the team or `current`. (required) + :return: Team + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_team" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_team`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams/{id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Team', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_teams(self, **kwargs): # noqa: E501 + """Read all teams. Requires Sysadmin permissions. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_teams(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[Team] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_teams_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.read_teams_with_http_info(**kwargs) # noqa: E501 + return data + + def read_teams_with_http_info(self, **kwargs): # noqa: E501 + """Read all teams. Requires Sysadmin permissions. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_teams_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[Team] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_teams" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/teams', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Team]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/todolist_api.py b/vendor/elabapi-python/elabapi_python/api/todolist_api.py new file mode 100644 index 0000000..b2b3cec --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/todolist_api.py @@ -0,0 +1,498 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class TodolistApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_todoitem(self, id, **kwargs): # noqa: E501 + """Delete a todoitem. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_todoitem(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the todoitem. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_todoitem_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_todoitem_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_todoitem_with_http_info(self, id, **kwargs): # noqa: E501 + """Delete a todoitem. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_todoitem_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the todoitem. (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_todoitem" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_todoitem`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/todolist/{id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_todoitem(self, id, **kwargs): # noqa: E501 + """Actions on a todoitem. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_todoitem(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the todoitem. (required) + :param TodolistIdBody body: Parameters for modifying a todoitem. + :return: Todoitem + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_todoitem_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.patch_todoitem_with_http_info(id, **kwargs) # noqa: E501 + return data + + def patch_todoitem_with_http_info(self, id, **kwargs): # noqa: E501 + """Actions on a todoitem. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_todoitem_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the todoitem. (required) + :param TodolistIdBody body: Parameters for modifying a todoitem. + :return: Todoitem + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_todoitem" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_todoitem`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/todolist/{id}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Todoitem', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_todolist(self, **kwargs): # noqa: E501 + """Create a todo item # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_todolist(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param TodolistBody body: Parameters for creating a todoitem. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_todolist_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.post_todolist_with_http_info(**kwargs) # noqa: E501 + return data + + def post_todolist_with_http_info(self, **kwargs): # noqa: E501 + """Create a todo item # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_todolist_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param TodolistBody body: Parameters for creating a todoitem. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_todolist" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/todolist', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_todoitem(self, id, **kwargs): # noqa: E501 + """Read a todo entry. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_todoitem(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the todoitem. (required) + :return: Todoitem + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_todoitem_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_todoitem_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_todoitem_with_http_info(self, id, **kwargs): # noqa: E501 + """Read a todo entry. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_todoitem_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int id: ID of the todoitem. (required) + :return: Todoitem + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_todoitem" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_todoitem`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/todolist/{id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Todoitem', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_todolist(self, **kwargs): # noqa: E501 + """Read all todoitems. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_todolist(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[Todoitem] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_todolist_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.read_todolist_with_http_info(**kwargs) # noqa: E501 + return data + + def read_todolist_with_http_info(self, **kwargs): # noqa: E501 + """Read all todoitems. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_todolist_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[Todoitem] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_todolist" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/todolist', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Todoitem]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/unfinished_steps_api.py b/vendor/elabapi-python/elabapi_python/api/unfinished_steps_api.py new file mode 100644 index 0000000..46a06b1 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/unfinished_steps_api.py @@ -0,0 +1,122 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class UnfinishedStepsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def read_unfinished_steps(self, **kwargs): # noqa: E501 + """Read all unfinished steps. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_unfinished_steps(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str scope: Set to \"team\" to extend the list to other members. + :return: list[UnfinishedSteps] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_unfinished_steps_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.read_unfinished_steps_with_http_info(**kwargs) # noqa: E501 + return data + + def read_unfinished_steps_with_http_info(self, **kwargs): # noqa: E501 + """Read all unfinished steps. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_unfinished_steps_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str scope: Set to \"team\" to extend the list to other members. + :return: list[UnfinishedSteps] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['scope'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_unfinished_steps" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'scope' in params: + query_params.append(('scope', params['scope'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/unfinished_steps', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[UnfinishedSteps]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/uploads_api.py b/vendor/elabapi-python/elabapi_python/api/uploads_api.py new file mode 100644 index 0000000..8a9be37 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/uploads_api.py @@ -0,0 +1,717 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class UploadsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_upload(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Delete an upload. # noqa: E501 + + The upload gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_upload(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the upload (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_upload_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.delete_upload_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def delete_upload_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Delete an upload. # noqa: E501 + + The upload gets deleted. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_upload_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the upload (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_upload" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `delete_upload`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_upload`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `delete_upload`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/uploads/{subid}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def patch_upload(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Modify attributes such as \"real_name\", \"comment\" or \"state\" of an upload. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_upload(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the upload (required) + :param UploadsSubidBody1 body: Parameters for modifying an upload attributes. + :return: Upload + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_upload_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.patch_upload_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def patch_upload_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Modify attributes such as \"real_name\", \"comment\" or \"state\" of an upload. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_upload_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the upload (required) + :param UploadsSubidBody1 body: Parameters for modifying an upload attributes. + :return: Upload + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_upload" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `patch_upload`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_upload`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `patch_upload`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/uploads/{subid}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Upload', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_upload(self, entity_type, id, **kwargs): # noqa: E501 + """Create an upload. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_upload(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param str file: + :param str comment: + :param str state: Filter results based on their state: 1 (Normal), 2 (Archived), 3 (Deleted). Supports comma separated values. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_upload_with_http_info(entity_type, id, **kwargs) # noqa: E501 + else: + (data) = self.post_upload_with_http_info(entity_type, id, **kwargs) # noqa: E501 + return data + + def post_upload_with_http_info(self, entity_type, id, **kwargs): # noqa: E501 + """Create an upload. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_upload_with_http_info(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param str file: + :param str comment: + :param str state: Filter results based on their state: 1 (Normal), 2 (Archived), 3 (Deleted). Supports comma separated values. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'file', 'comment', 'state'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_upload" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `post_upload`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_upload`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + if 'state' in params: + query_params.append(('state', params['state'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + if 'file' in params: + local_var_files['file'] = params['file'] # noqa: E501 + if 'comment' in params: + form_params.append(('comment', params['comment'])) # noqa: E501 + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['multipart/form-data']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/uploads', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_upload_replace(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Replace an existing uploaded file. The existing file will be archived and the new one will be added. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_upload_replace(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the upload (required) + :param str file: + :param str comment: + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_upload_replace_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.post_upload_replace_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def post_upload_replace_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Replace an existing uploaded file. The existing file will be archived and the new one will be added. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_upload_replace_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the upload (required) + :param str file: + :param str comment: + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid', 'file', 'comment'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_upload_replace" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `post_upload_replace`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `post_upload_replace`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `post_upload_replace`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + if 'file' in params: + local_var_files['file'] = params['file'] # noqa: E501 + if 'comment' in params: + form_params.append(('comment', params['comment'])) # noqa: E501 + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['multipart/form-data']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/uploads/{subid}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_upload(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Read an upload. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_upload(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the upload (required) + :param str format: To download the file itself, use `binary` format parameter. In python library, when downloading a file content, make sure to add ` _preload_content=False` into the call to `read_upload()`. + :return: Upload + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_upload_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + else: + (data) = self.read_upload_with_http_info(entity_type, id, subid, **kwargs) # noqa: E501 + return data + + def read_upload_with_http_info(self, entity_type, id, subid, **kwargs): # noqa: E501 + """Read an upload. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_upload_with_http_info(entity_type, id, subid, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param int subid: ID of the upload (required) + :param str format: To download the file itself, use `binary` format parameter. In python library, when downloading a file content, make sure to add ` _preload_content=False` into the call to `read_upload()`. + :return: Upload + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'subid', 'format'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_upload" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `read_upload`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_upload`") # noqa: E501 + # verify the required parameter 'subid' is set + if ('subid' not in params or + params['subid'] is None): + raise ValueError("Missing the required parameter `subid` when calling `read_upload`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + if 'subid' in params: + path_params['subid'] = params['subid'] # noqa: E501 + + query_params = [] + if 'format' in params: + query_params.append(('format', params['format'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json', '*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/uploads/{subid}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Upload', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_uploads(self, entity_type, id, **kwargs): # noqa: E501 + """Read attached files of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_uploads(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param str state: Filter results based on their state: 1 (Normal), 2 (Archived), 3 (Deleted). Supports comma separated values. + :return: list[Upload] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_uploads_with_http_info(entity_type, id, **kwargs) # noqa: E501 + else: + (data) = self.read_uploads_with_http_info(entity_type, id, **kwargs) # noqa: E501 + return data + + def read_uploads_with_http_info(self, entity_type, id, **kwargs): # noqa: E501 + """Read attached files of that entity. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_uploads_with_http_info(entity_type, id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param int id: ID of the entity (required) + :param str state: Filter results based on their state: 1 (Normal), 2 (Archived), 3 (Deleted). Supports comma separated values. + :return: list[Upload] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'id', 'state'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_uploads" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `read_uploads`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_uploads`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entity_type'] = params['entity_type'] # noqa: E501 + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + if 'state' in params: + query_params.append(('state', params['state'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/{entity_type}/{id}/uploads', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Upload]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/user_uploads_api.py b/vendor/elabapi-python/elabapi_python/api/user_uploads_api.py new file mode 100644 index 0000000..82d1cc6 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/user_uploads_api.py @@ -0,0 +1,126 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class UserUploadsApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def read_user_uploads(self, id, **kwargs): # noqa: E501 + """Read attached files from a user # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_user_uploads(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id2 id: ID of the user or `me`. (required) + :return: list[InlineResponse2006] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_user_uploads_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_user_uploads_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_user_uploads_with_http_info(self, id, **kwargs): # noqa: E501 + """Read attached files from a user # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_user_uploads_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id2 id: ID of the user or `me`. (required) + :return: list[InlineResponse2006] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_user_uploads" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_user_uploads`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/users/{id}/uploads', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[InlineResponse2006]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api/users_api.py b/vendor/elabapi-python/elabapi_python/api/users_api.py new file mode 100644 index 0000000..62ea4c0 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api/users_api.py @@ -0,0 +1,429 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from elabapi_python.api_client import ApiClient + + +class UsersApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def patch_user(self, id, **kwargs): # noqa: E501 + """Modify a user. # noqa: E501 + + Note: it is possible to use \"me\" instead of the userid to access the user of the API key. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_user(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id1 id: ID of the user or `me`. (required) + :param UsersIdBody body: Parameters for modifying a user. + :return: Users + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.patch_user_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.patch_user_with_http_info(id, **kwargs) # noqa: E501 + return data + + def patch_user_with_http_info(self, id, **kwargs): # noqa: E501 + """Modify a user. # noqa: E501 + + Note: it is possible to use \"me\" instead of the userid to access the user of the API key. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.patch_user_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id1 id: ID of the user or `me`. (required) + :param UsersIdBody body: Parameters for modifying a user. + :return: Users + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method patch_user" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `patch_user`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/users/{id}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Users', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def post_user(self, **kwargs): # noqa: E501 + """Create a new user. # noqa: E501 + + An Admin can create a user in its own team only. A sysadmin can specify the team. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_user(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param UsersBody body: Parameters for creating a user. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.post_user_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.post_user_with_http_info(**kwargs) # noqa: E501 + return data + + def post_user_with_http_info(self, **kwargs): # noqa: E501 + """Create a new user. # noqa: E501 + + An Admin can create a user in its own team only. A sysadmin can specify the team. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.post_user_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param UsersBody body: Parameters for creating a user. + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method post_user" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/users', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_user(self, id, **kwargs): # noqa: E501 + """Read information of a user. # noqa: E501 + + Note: it is possible to use \"me\" instead of the userid to access the user of the API key. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_user(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id1 id: ID of the user or `me`. (required) + :return: Users + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_user_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.read_user_with_http_info(id, **kwargs) # noqa: E501 + return data + + def read_user_with_http_info(self, id, **kwargs): # noqa: E501 + """Read information of a user. # noqa: E501 + + Note: it is possible to use \"me\" instead of the userid to access the user of the API key. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_user_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Id1 id: ID of the user or `me`. (required) + :return: Users + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_user" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `read_user`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/users/{id}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Users', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def read_users(self, **kwargs): # noqa: E501 + """Read users from instance. # noqa: E501 + + Get a list of users with an active account on the instance. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_users(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int team: Add a filter on the team + :param int current_team: If set to 1, use the requester's current team as filter. + :param bool only_admins: Return only team admins. + :param bool only_archived: Return only archived users. + :return: list[object] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.read_users_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.read_users_with_http_info(**kwargs) # noqa: E501 + return data + + def read_users_with_http_info(self, **kwargs): # noqa: E501 + """Read users from instance. # noqa: E501 + + Get a list of users with an active account on the instance. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.read_users_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int team: Add a filter on the team + :param int current_team: If set to 1, use the requester's current team as filter. + :param bool only_admins: Return only team admins. + :param bool only_archived: Return only archived users. + :return: list[object] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['team', 'current_team', 'only_admins', 'only_archived'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method read_users" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'team' in params: + query_params.append(('team', params['team'])) # noqa: E501 + if 'current_team' in params: + query_params.append(('currentTeam', params['current_team'])) # noqa: E501 + if 'only_admins' in params: + query_params.append(('onlyAdmins', params['only_admins'])) # noqa: E501 + if 'only_archived' in params: + query_params.append(('onlyArchived', params['only_archived'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['token'] # noqa: E501 + + return self.api_client.call_api( + '/users', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[object]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/vendor/elabapi-python/elabapi_python/api_client.py b/vendor/elabapi-python/elabapi_python/api_client.py new file mode 100644 index 0000000..681e233 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/api_client.py @@ -0,0 +1,632 @@ +# coding: utf-8 +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" +from __future__ import absolute_import + +import datetime +import json +import mimetypes +from multiprocessing.pool import ThreadPool +import os +import re +import tempfile + +# python 2 and python 3 compatibility library +import six +from six.moves.urllib.parse import quote + +from elabapi_python.configuration import Configuration +import elabapi_python.models +from elabapi_python import rest + + +class ApiClient(object): + """Generic API client for Swagger client library builds. + + Swagger generic API client. This client handles the client- + server communication, and is invariant across implementations. Specifics of + the methods and models for each application are generated from the Swagger + templates. + + NOTE: This class is auto generated by the swagger code generator program. + Ref: https://github.com/swagger-api/swagger-codegen + Do not edit the class manually. + + :param configuration: .Configuration object for this client + :param header_name: a header to pass when making calls to the API. + :param header_value: a header value to pass when making calls to + the API. + :param cookie: a cookie to include in the header when making calls + to the API + """ + + PRIMITIVE_TYPES = (float, bool, bytes, six.text_type) + six.integer_types + NATIVE_TYPES_MAPPING = { + 'int': int, + 'long': int if six.PY3 else long, # noqa: F821 + 'float': float, + 'str': str, + 'bool': bool, + 'date': datetime.date, + 'datetime': datetime.datetime, + 'object': object, + } + + def __init__(self, configuration=None, header_name=None, header_value=None, + cookie=None): + if configuration is None: + configuration = Configuration() + self.configuration = configuration + + self.pool = ThreadPool() + self.rest_client = rest.RESTClientObject(configuration) + self.default_headers = {} + if header_name is not None: + self.default_headers[header_name] = header_value + self.cookie = cookie + # Set default User-Agent. + self.user_agent = 'Swagger-Codegen/5.6.1/python' + + def __del__(self): + self.pool.close() + self.pool.join() + + @property + def user_agent(self): + """User agent for this API client""" + return self.default_headers['User-Agent'] + + @user_agent.setter + def user_agent(self, value): + self.default_headers['User-Agent'] = value + + def set_default_header(self, header_name, header_value): + self.default_headers[header_name] = header_value + + def __call_api( + self, resource_path, method, path_params=None, + query_params=None, header_params=None, body=None, post_params=None, + files=None, response_type=None, auth_settings=None, + _return_http_data_only=None, collection_formats=None, + _preload_content=True, _request_timeout=None): + + config = self.configuration + + # header parameters + header_params = header_params or {} + header_params.update(self.default_headers) + if self.cookie: + header_params['Cookie'] = self.cookie + if header_params: + header_params = self.sanitize_for_serialization(header_params) + header_params = dict(self.parameters_to_tuples(header_params, + collection_formats)) + + # path parameters + if path_params: + path_params = self.sanitize_for_serialization(path_params) + path_params = self.parameters_to_tuples(path_params, + collection_formats) + for k, v in path_params: + # specified safe chars, encode everything + resource_path = resource_path.replace( + '{%s}' % k, + quote(str(v), safe=config.safe_chars_for_path_param) + ) + + # query parameters + if query_params: + query_params = self.sanitize_for_serialization(query_params) + query_params = self.parameters_to_tuples(query_params, + collection_formats) + + # post parameters + if post_params or files: + post_params = self.prepare_post_parameters(post_params, files) + post_params = self.sanitize_for_serialization(post_params) + post_params = self.parameters_to_tuples(post_params, + collection_formats) + + # auth setting + self.update_params_for_auth(header_params, query_params, auth_settings) + + # body + if body: + body = self.sanitize_for_serialization(body) + + # request url + url = self.configuration.host + resource_path + + # perform request and return response + response_data = self.request( + method, url, query_params=query_params, headers=header_params, + post_params=post_params, body=body, + _preload_content=_preload_content, + _request_timeout=_request_timeout) + + self.last_response = response_data + + return_data = response_data + if _preload_content: + # deserialize response data + if response_type: + return_data = self.deserialize(response_data, response_type) + else: + return_data = None + + if _return_http_data_only: + return (return_data) + else: + return (return_data, response_data.status, + response_data.getheaders()) + + def sanitize_for_serialization(self, obj): + """Builds a JSON POST object. + + If obj is None, return None. + If obj is str, int, long, float, bool, return directly. + If obj is datetime.datetime, datetime.date + convert to string in iso8601 format. + If obj is list, sanitize each element in the list. + If obj is dict, return the dict. + If obj is swagger model, return the properties dict. + + :param obj: The data to serialize. + :return: The serialized form of data. + """ + if obj is None: + return None + elif isinstance(obj, self.PRIMITIVE_TYPES): + return obj + elif isinstance(obj, list): + return [self.sanitize_for_serialization(sub_obj) + for sub_obj in obj] + elif isinstance(obj, tuple): + return tuple(self.sanitize_for_serialization(sub_obj) + for sub_obj in obj) + elif isinstance(obj, (datetime.datetime, datetime.date)): + return obj.isoformat() + + if isinstance(obj, dict): + obj_dict = obj + else: + # Convert model obj to dict except + # attributes `swagger_types`, `attribute_map` + # and attributes which value is not None. + # Convert attribute name to json key in + # model definition for request. + obj_dict = {obj.attribute_map[attr]: getattr(obj, attr) + for attr, _ in six.iteritems(obj.swagger_types) + if getattr(obj, attr) is not None} + + return {key: self.sanitize_for_serialization(val) + for key, val in six.iteritems(obj_dict)} + + def deserialize(self, response, response_type): + """Deserializes response into an object. + + :param response: RESTResponse object to be deserialized. + :param response_type: class literal for + deserialized object, or string of class name. + + :return: deserialized object. + """ + # handle file downloading + # save response body into a tmp file and return the instance + if response_type == "file": + return self.__deserialize_file(response) + + # fetch data from response object + try: + data = json.loads(response.data) + except ValueError: + data = response.data + + return self.__deserialize(data, response_type) + + def __deserialize(self, data, klass): + """Deserializes dict, list, str into an object. + + :param data: dict, list or str. + :param klass: class literal, or string of class name. + + :return: object. + """ + if data is None: + return None + + if type(klass) == str: + if klass.startswith('list['): + sub_kls = re.match(r'list\[(.*)\]', klass).group(1) + return [self.__deserialize(sub_data, sub_kls) + for sub_data in data] + + if klass.startswith('dict('): + sub_kls = re.match(r'dict\(([^,]*), (.*)\)', klass).group(2) + return {k: self.__deserialize(v, sub_kls) + for k, v in six.iteritems(data)} + + # convert str to class + if klass in self.NATIVE_TYPES_MAPPING: + klass = self.NATIVE_TYPES_MAPPING[klass] + else: + klass = getattr(elabapi_python.models, klass) + + if klass in self.PRIMITIVE_TYPES: + return self.__deserialize_primitive(data, klass) + elif klass == object: + return self.__deserialize_object(data) + elif klass == datetime.date: + return self.__deserialize_date(data) + elif klass == datetime.datetime: + return self.__deserialize_datatime(data) + else: + return self.__deserialize_model(data, klass) + + def call_api(self, resource_path, method, + path_params=None, query_params=None, header_params=None, + body=None, post_params=None, files=None, + response_type=None, auth_settings=None, async_req=None, + _return_http_data_only=None, collection_formats=None, + _preload_content=True, _request_timeout=None): + """Makes the HTTP request (synchronous) and returns deserialized data. + + To make an async request, set the async_req parameter. + + :param resource_path: Path to method endpoint. + :param method: Method to call. + :param path_params: Path parameters in the url. + :param query_params: Query parameters in the url. + :param header_params: Header parameters to be + placed in the request header. + :param body: Request body. + :param post_params dict: Request post form parameters, + for `application/x-www-form-urlencoded`, `multipart/form-data`. + :param auth_settings list: Auth Settings names for the request. + :param response: Response data type. + :param files dict: key -> filename, value -> filepath, + for `multipart/form-data`. + :param async_req bool: execute request asynchronously + :param _return_http_data_only: response data without head status code + and headers + :param collection_formats: dict of collection formats for path, query, + header, and post parameters. + :param _preload_content: if False, the urllib3.HTTPResponse object will + be returned without reading/decoding response + data. Default is True. + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :return: + If async_req parameter is True, + the request will be called asynchronously. + The method will return the request thread. + If parameter async_req is False or missing, + then the method will return the response directly. + """ + if not async_req: + return self.__call_api(resource_path, method, + path_params, query_params, header_params, + body, post_params, files, + response_type, auth_settings, + _return_http_data_only, collection_formats, + _preload_content, _request_timeout) + else: + thread = self.pool.apply_async(self.__call_api, (resource_path, + method, path_params, query_params, + header_params, body, + post_params, files, + response_type, auth_settings, + _return_http_data_only, + collection_formats, + _preload_content, _request_timeout)) + return thread + + def request(self, method, url, query_params=None, headers=None, + post_params=None, body=None, _preload_content=True, + _request_timeout=None): + """Makes the HTTP request using RESTClient.""" + if method == "GET": + return self.rest_client.GET(url, + query_params=query_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + headers=headers) + elif method == "HEAD": + return self.rest_client.HEAD(url, + query_params=query_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + headers=headers) + elif method == "OPTIONS": + return self.rest_client.OPTIONS(url, + query_params=query_params, + headers=headers, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + elif method == "POST": + return self.rest_client.POST(url, + query_params=query_params, + headers=headers, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + elif method == "PUT": + return self.rest_client.PUT(url, + query_params=query_params, + headers=headers, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + elif method == "PATCH": + return self.rest_client.PATCH(url, + query_params=query_params, + headers=headers, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + elif method == "DELETE": + return self.rest_client.DELETE(url, + query_params=query_params, + headers=headers, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + else: + raise ValueError( + "http method must be `GET`, `HEAD`, `OPTIONS`," + " `POST`, `PATCH`, `PUT` or `DELETE`." + ) + + def parameters_to_tuples(self, params, collection_formats): + """Get parameters as list of tuples, formatting collections. + + :param params: Parameters as dict or list of two-tuples + :param dict collection_formats: Parameter collection formats + :return: Parameters as list of tuples, collections formatted + """ + new_params = [] + if collection_formats is None: + collection_formats = {} + for k, v in six.iteritems(params) if isinstance(params, dict) else params: # noqa: E501 + if k in collection_formats: + collection_format = collection_formats[k] + if collection_format == 'multi': + new_params.extend((k, value) for value in v) + else: + if collection_format == 'ssv': + delimiter = ' ' + elif collection_format == 'tsv': + delimiter = '\t' + elif collection_format == 'pipes': + delimiter = '|' + else: # csv is the default + delimiter = ',' + new_params.append( + (k, delimiter.join(str(value) for value in v))) + else: + new_params.append((k, v)) + return new_params + + def prepare_post_parameters(self, post_params=None, files=None): + """Builds form parameters. + + :param post_params: Normal form parameters. + :param files: File parameters. + :return: Form parameters with files. + """ + params = [] + + if post_params: + params = post_params + + if files: + for k, v in six.iteritems(files): + if not v: + continue + file_names = v if type(v) is list else [v] + for n in file_names: + with open(n, 'rb') as f: + filename = os.path.basename(f.name) + filedata = f.read() + mimetype = (mimetypes.guess_type(filename)[0] or + 'application/octet-stream') + params.append( + tuple([k, tuple([filename, filedata, mimetype])])) + + return params + + def select_header_accept(self, accepts): + """Returns `Accept` based on an array of accepts provided. + + :param accepts: List of headers. + :return: Accept (e.g. application/json). + """ + if not accepts: + return + + accepts = [x.lower() for x in accepts] + + if 'application/json' in accepts: + return 'application/json' + else: + return ', '.join(accepts) + + def select_header_content_type(self, content_types): + """Returns `Content-Type` based on an array of content_types provided. + + :param content_types: List of content-types. + :return: Content-Type (e.g. application/json). + """ + if not content_types: + return 'application/json' + + content_types = [x.lower() for x in content_types] + + if 'application/json' in content_types or '*/*' in content_types: + return 'application/json' + else: + return content_types[0] + + def update_params_for_auth(self, headers, querys, auth_settings): + """Updates header and query params based on authentication setting. + + :param headers: Header parameters dict to be updated. + :param querys: Query parameters tuple list to be updated. + :param auth_settings: Authentication setting identifiers list. + """ + if not auth_settings: + return + + for auth in auth_settings: + auth_setting = self.configuration.auth_settings().get(auth) + if auth_setting: + if not auth_setting['value']: + continue + elif auth_setting['in'] == 'header': + headers[auth_setting['key']] = auth_setting['value'] + elif auth_setting['in'] == 'query': + querys.append((auth_setting['key'], auth_setting['value'])) + else: + raise ValueError( + 'Authentication token must be in `query` or `header`' + ) + + def __deserialize_file(self, response): + """Deserializes body to file + + Saves response body into a file in a temporary folder, + using the filename from the `Content-Disposition` header if provided. + + :param response: RESTResponse. + :return: file path. + """ + fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path) + os.close(fd) + os.remove(path) + + content_disposition = response.getheader("Content-Disposition") + if content_disposition: + filename = re.search(r'filename=[\'"]?([^\'"\s]+)[\'"]?', + content_disposition).group(1) + path = os.path.join(os.path.dirname(path), filename) + response_data = response.data + with open(path, "wb") as f: + if isinstance(response_data, str): + # change str to bytes so we can write it + response_data = response_data.encode('utf-8') + f.write(response_data) + else: + f.write(response_data) + return path + + def __deserialize_primitive(self, data, klass): + """Deserializes string to primitive type. + + :param data: str. + :param klass: class literal. + + :return: int, long, float, str, bool. + """ + try: + return klass(data) + except UnicodeEncodeError: + return six.text_type(data) + except TypeError: + return data + + def __deserialize_object(self, value): + """Return a original value. + + :return: object. + """ + return value + + def __deserialize_date(self, string): + """Deserializes string to date. + + :param string: str. + :return: date. + """ + try: + from dateutil.parser import parse + return parse(string).date() + except ImportError: + return string + except ValueError: + raise rest.ApiException( + status=0, + reason="Failed to parse `{0}` as date object".format(string) + ) + + def __deserialize_datatime(self, string): + """Deserializes string to datetime. + + The string should be in iso8601 datetime format. + + :param string: str. + :return: datetime. + """ + try: + from dateutil.parser import parse + return parse(string) + except ImportError: + return string + except ValueError: + raise rest.ApiException( + status=0, + reason=( + "Failed to parse `{0}` as datetime object" + .format(string) + ) + ) + + def __hasattr(self, object, name): + return name in object.__class__.__dict__ + + def __deserialize_model(self, data, klass): + """Deserializes list or dict to model. + + :param data: dict, list. + :param klass: class literal. + :return: model object. + """ + + if not klass.swagger_types and not self.__hasattr(klass, 'get_real_child_model'): + return data + + kwargs = {} + if klass.swagger_types is not None: + for attr, attr_type in six.iteritems(klass.swagger_types): + if (data is not None and + klass.attribute_map[attr] in data and + isinstance(data, (list, dict))): + value = data[klass.attribute_map[attr]] + kwargs[attr] = self.__deserialize(value, attr_type) + + instance = klass(**kwargs) + + if (isinstance(instance, dict) and + klass.swagger_types is not None and + isinstance(data, dict)): + for key, value in data.items(): + if key not in klass.swagger_types: + instance[key] = value + if self.__hasattr(instance, 'get_real_child_model'): + klass_name = instance.get_real_child_model(data) + if klass_name: + instance = self.__deserialize(data, klass_name) + return instance diff --git a/vendor/elabapi-python/elabapi_python/configuration.py b/vendor/elabapi-python/elabapi_python/configuration.py new file mode 100644 index 0000000..8f5c543 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/configuration.py @@ -0,0 +1,254 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import copy +import logging +import multiprocessing +import sys +import urllib3 + +import six +from six.moves import http_client as httplib + + +class TypeWithDefault(type): + def __init__(cls, name, bases, dct): + super(TypeWithDefault, cls).__init__(name, bases, dct) + cls._default = None + + def __call__(cls): + if cls._default is None: + cls._default = type.__call__(cls) + return copy.copy(cls._default) + + def set_default(cls, default): + cls._default = copy.copy(default) + + +class Configuration(six.with_metaclass(TypeWithDefault, object)): + """NOTE: This class is auto generated by the swagger code generator program. + + Ref: https://github.com/swagger-api/swagger-codegen + Do not edit the class manually. + """ + + def __init__(self): + """Constructor""" + # Default Base url + self.host = "https://elab.local:3148/api/v2" + # Temp file folder for downloading files + self.temp_folder_path = None + + # Authentication Settings + # dict to store API key(s) + self.api_key = {} + # dict to store API prefix (e.g. Bearer) + self.api_key_prefix = {} + # function to refresh API key if expired + self.refresh_api_key_hook = None + # Username for HTTP basic authentication + self.username = "" + # Password for HTTP basic authentication + self.password = "" + # Logging Settings + self.logger = {} + self.logger["package_logger"] = logging.getLogger("elabapi_python") + self.logger["urllib3_logger"] = logging.getLogger("urllib3") + # Log format + self.logger_format = '%(asctime)s %(levelname)s %(message)s' + # Log stream handler + self.logger_stream_handler = None + # Log file handler + self.logger_file_handler = None + # Debug file location + self.logger_file = None + # Debug switch + self.debug = False + + # SSL/TLS verification + # Set this to false to skip verifying SSL certificate when calling API + # from https server. + self.verify_ssl = True + # Set this to customize the certificate file to verify the peer. + self.ssl_ca_cert = None + # client certificate file + self.cert_file = None + # client key file + self.key_file = None + # Set this to True/False to enable/disable SSL hostname verification. + self.assert_hostname = None + + # urllib3 connection pool's maximum number of connections saved + # per pool. urllib3 uses 1 connection as default value, but this is + # not the best value when you are making a lot of possibly parallel + # requests to the same host, which is often the case here. + # cpu_count * 5 is used as default value to increase performance. + self.connection_pool_maxsize = multiprocessing.cpu_count() * 5 + + # Proxy URL + self.proxy = None + # Safe chars for path_param + self.safe_chars_for_path_param = '' + + @property + def logger_file(self): + """The logger file. + + If the logger_file is None, then add stream handler and remove file + handler. Otherwise, add file handler and remove stream handler. + + :param value: The logger_file path. + :type: str + """ + return self.__logger_file + + @logger_file.setter + def logger_file(self, value): + """The logger file. + + If the logger_file is None, then add stream handler and remove file + handler. Otherwise, add file handler and remove stream handler. + + :param value: The logger_file path. + :type: str + """ + self.__logger_file = value + if self.__logger_file: + # If set logging file, + # then add file handler and remove stream handler. + self.logger_file_handler = logging.FileHandler(self.__logger_file) + self.logger_file_handler.setFormatter(self.logger_formatter) + for _, logger in six.iteritems(self.logger): + logger.addHandler(self.logger_file_handler) + if self.logger_stream_handler: + logger.removeHandler(self.logger_stream_handler) + else: + # If not set logging file, + # then add stream handler and remove file handler. + self.logger_stream_handler = logging.StreamHandler() + self.logger_stream_handler.setFormatter(self.logger_formatter) + for _, logger in six.iteritems(self.logger): + logger.addHandler(self.logger_stream_handler) + if self.logger_file_handler: + logger.removeHandler(self.logger_file_handler) + + @property + def debug(self): + """Debug status + + :param value: The debug status, True or False. + :type: bool + """ + return self.__debug + + @debug.setter + def debug(self, value): + """Debug status + + :param value: The debug status, True or False. + :type: bool + """ + self.__debug = value + if self.__debug: + # if debug status is True, turn on debug logging + for _, logger in six.iteritems(self.logger): + logger.setLevel(logging.DEBUG) + # turn on httplib debug + httplib.HTTPConnection.debuglevel = 1 + else: + # if debug status is False, turn off debug logging, + # setting log level to default `logging.WARNING` + for _, logger in six.iteritems(self.logger): + logger.setLevel(logging.WARNING) + # turn off httplib debug + httplib.HTTPConnection.debuglevel = 0 + + @property + def logger_format(self): + """The logger format. + + The logger_formatter will be updated when sets logger_format. + + :param value: The format string. + :type: str + """ + return self.__logger_format + + @logger_format.setter + def logger_format(self, value): + """The logger format. + + The logger_formatter will be updated when sets logger_format. + + :param value: The format string. + :type: str + """ + self.__logger_format = value + self.logger_formatter = logging.Formatter(self.__logger_format) + + def get_api_key_with_prefix(self, identifier): + """Gets API key (with prefix if set). + + :param identifier: The identifier of apiKey. + :return: The token for api key authentication. + """ + if self.refresh_api_key_hook: + self.refresh_api_key_hook(self) + + key = self.api_key.get(identifier) + if key: + prefix = self.api_key_prefix.get(identifier) + if prefix: + return "%s %s" % (prefix, key) + else: + return key + + def get_basic_auth_token(self): + """Gets HTTP basic authentication header (string). + + :return: The token for basic HTTP authentication. + """ + token = "" + if self.username or self.password: + token = urllib3.util.make_headers( + basic_auth=self.username + ':' + self.password + ).get('authorization') + return token + + def auth_settings(self): + """Gets Auth Settings dict for api client. + + :return: The Auth Settings information dict. + """ + return { + 'token': + { + 'type': 'api_key', + 'in': 'header', + 'key': 'Authorization', + 'value': self.get_api_key_with_prefix('Authorization') + }, + } + + def to_debug_report(self): + """Gets the essential information for debugging. + + :return: The report for debugging. + """ + return "Python SDK Debug Report:\n"\ + "OS: {env}\n"\ + "Python Version: {pyversion}\n"\ + "Version of the API: 2.0.0\n"\ + "SDK Package Version: 5.6.1".\ + format(env=sys.platform, pyversion=sys.version) diff --git a/vendor/elabapi-python/elabapi_python/models/__init__.py b/vendor/elabapi-python/elabapi_python/models/__init__.py new file mode 100644 index 0000000..349d183 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/__init__.py @@ -0,0 +1,142 @@ +# coding: utf-8 + +# flake8: noqa +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +# import models into model package +from elabapi_python.models.all_ofentity_editable_metadatamerge import AllOfentityEditableMetadatamerge +from elabapi_python.models.any_ofuploads_subid_body1 import AnyOfuploadsSubidBody1 +from elabapi_python.models.apikey import Apikey +from elabapi_python.models.apikeys_body import ApikeysBody +from elabapi_python.models.branding_id_body import BrandingIdBody +from elabapi_python.models.changelog import Changelog +from elabapi_python.models.comment import Comment +from elabapi_python.models.compound import Compound +from elabapi_python.models.compound_create_request import CompoundCreateRequest +from elabapi_python.models.compound_duplicate_request import CompoundDuplicateRequest +from elabapi_python.models.compounds_body import CompoundsBody +from elabapi_python.models.compounds_links_subid_body import CompoundsLinksSubidBody +from elabapi_python.models.config import Config +from elabapi_python.models.container import Container +from elabapi_python.models.containers_subid_body import ContainersSubidBody +from elabapi_python.models.containers_subid_body1 import ContainersSubidBody1 +from elabapi_python.models.dspace_body import DspaceBody +from elabapi_python.models.dspace_body1 import DspaceBody1 +from elabapi_python.models.dspace_entity import DspaceEntity +from elabapi_python.models.dspace_metadata import DspaceMetadata +from elabapi_python.models.dspace_metadata1 import DspaceMetadata1 +from elabapi_python.models.entity import Entity +from elabapi_python.models.entity_and_item_editable import EntityAndItemEditable +from elabapi_python.models.entity_duplicate import EntityDuplicate +from elabapi_python.models.entity_editable import EntityEditable +from elabapi_python.models.entity_template import EntityTemplate +from elabapi_python.models.entity_template_editable import EntityTemplateEditable +from elabapi_python.models.error import Error +from elabapi_python.models.event import Event +from elabapi_python.models.event_id_body import EventIdBody +from elabapi_python.models.eventid_delta import EventidDelta +from elabapi_python.models.events_id_body import EventsIdBody +from elabapi_python.models.exclusive_edit_mode import ExclusiveEditMode +from elabapi_python.models.experiment import Experiment +from elabapi_python.models.experiments_links_subid_body import ExperimentsLinksSubidBody +from elabapi_python.models.experiments_templates_id_body import ExperimentsTemplatesIdBody +from elabapi_python.models.export import Export +from elabapi_python.models.exports_body import ExportsBody +from elabapi_python.models.extra_fields_keys import ExtraFieldsKeys +from elabapi_python.models.favtags_body import FavtagsBody +from elabapi_python.models.id import Id +from elabapi_python.models.id1 import Id1 +from elabapi_python.models.id2 import Id2 +from elabapi_python.models.id3 import Id3 +from elabapi_python.models.id4 import Id4 +from elabapi_python.models.id_certs_body import IdCertsBody +from elabapi_python.models.id_comments_body import IdCommentsBody +from elabapi_python.models.id_endpoints_body import IdEndpointsBody +from elabapi_python.models.id_experiments_categories_body import IdExperimentsCategoriesBody +from elabapi_python.models.id_experiments_status_body import IdExperimentsStatusBody +from elabapi_python.models.id_items_status_body import IdItemsStatusBody +from elabapi_python.models.id_resources_categories_body import IdResourcesCategoriesBody +from elabapi_python.models.id_steps_body import IdStepsBody +from elabapi_python.models.id_tags_body import IdTagsBody +from elabapi_python.models.id_tags_body1 import IdTagsBody1 +from elabapi_python.models.id_teamgroups_body import IdTeamgroupsBody +from elabapi_python.models.id_uploads_body import IdUploadsBody +from elabapi_python.models.idp import Idp +from elabapi_python.models.idp_cert import IdpCert +from elabapi_python.models.idp_endpoint import IdpEndpoint +from elabapi_python.models.idp_source import IdpSource +from elabapi_python.models.idps_body import IdpsBody +from elabapi_python.models.idps_id_body import IdpsIdBody +from elabapi_python.models.idps_sources_body import IdpsSourcesBody +from elabapi_python.models.idps_sources_id_body import IdpsSourcesIdBody +from elabapi_python.models.import_body import ImportBody +from elabapi_python.models.inline_response200 import InlineResponse200 +from elabapi_python.models.inline_response2001 import InlineResponse2001 +from elabapi_python.models.inline_response20010 import InlineResponse20010 +from elabapi_python.models.inline_response2001_experiments import InlineResponse2001Experiments +from elabapi_python.models.inline_response2001_items import InlineResponse2001Items +from elabapi_python.models.inline_response2001_users import InlineResponse2001Users +from elabapi_python.models.inline_response2002 import InlineResponse2002 +from elabapi_python.models.inline_response2003 import InlineResponse2003 +from elabapi_python.models.inline_response2004 import InlineResponse2004 +from elabapi_python.models.inline_response2004_query_parameters import InlineResponse2004QueryParameters +from elabapi_python.models.inline_response2005 import InlineResponse2005 +from elabapi_python.models.inline_response2006 import InlineResponse2006 +from elabapi_python.models.inline_response2007 import InlineResponse2007 +from elabapi_python.models.inline_response2008 import InlineResponse2008 +from elabapi_python.models.inline_response2009 import InlineResponse2009 +from elabapi_python.models.inline_response2009_embedded import InlineResponse2009Embedded +from elabapi_python.models.inline_response2009_embedded_entries import InlineResponse2009EmbeddedEntries +from elabapi_python.models.instance_body import InstanceBody +from elabapi_python.models.item import Item +from elabapi_python.models.item_editable import ItemEditable +from elabapi_python.models.items_links_subid_body import ItemsLinksSubidBody +from elabapi_python.models.items_types_id_body import ItemsTypesIdBody +from elabapi_python.models.link import Link +from elabapi_python.models.metadata import Metadata +from elabapi_python.models.metadata_elabftw import MetadataElabftw +from elabapi_python.models.metadata_elabftw_extra_fields_groups import MetadataElabftwExtraFieldsGroups +from elabapi_python.models.metadata_extra_fields import MetadataExtraFields +from elabapi_python.models.notification import Notification +from elabapi_python.models.notifications_subid_body import NotificationsSubidBody +from elabapi_python.models.patch_action import PatchAction +from elabapi_python.models.revision import Revision +from elabapi_python.models.revisions_subid_body import RevisionsSubidBody +from elabapi_python.models.statuslike import Statuslike +from elabapi_python.models.step import Step +from elabapi_python.models.steps_subid_body import StepsSubidBody +from elabapi_python.models.storage_unit import StorageUnit +from elabapi_python.models.storage_units_body import StorageUnitsBody +from elabapi_python.models.storage_units_id_body import StorageUnitsIdBody +from elabapi_python.models.tag import Tag +from elabapi_python.models.tags_subid_body import TagsSubidBody +from elabapi_python.models.tags_subid_body1 import TagsSubidBody1 +from elabapi_python.models.team import Team +from elabapi_python.models.teamgroup import Teamgroup +from elabapi_python.models.teamgroup_users import TeamgroupUsers +from elabapi_python.models.teamgroups_subid_body import TeamgroupsSubidBody +from elabapi_python.models.teams_body import TeamsBody +from elabapi_python.models.teams_id_body import TeamsIdBody +from elabapi_python.models.todoitem import Todoitem +from elabapi_python.models.todolist_body import TodolistBody +from elabapi_python.models.todolist_id_body import TodolistIdBody +from elabapi_python.models.unfinished_step import UnfinishedStep +from elabapi_python.models.unfinished_steps import UnfinishedSteps +from elabapi_python.models.upload import Upload +from elabapi_python.models.uploads_subid_body import UploadsSubidBody +from elabapi_python.models.uploads_subid_body1 import UploadsSubidBody1 +from elabapi_python.models.users import Users +from elabapi_python.models.users_body import UsersBody +from elabapi_python.models.users_full import UsersFull +from elabapi_python.models.users_full_teams import UsersFullTeams +from elabapi_python.models.users_id_body import UsersIdBody diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/__init__.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..863f215859d509a0beeb7f69aaaaf0d09b412e85 GIT binary patch literal 10230 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 AkpKVy literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/all_ofentity_editable_metadatamerge.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/all_ofentity_editable_metadatamerge.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3b4cac5f51cd1e828020faab59f9d8b26d44913 GIT binary patch literal 4181 zcma(UU2hZF^^QGbPn-`E@V^&bMv7)Nd%{dvblhaL z^hAf{($|;;Wa*(OrF1tn%xh{l?K|4_K`3-7ry0nCmD7@R(#7ir#I9&pD0EIUG^W~G zijGZn(+S(oS>3T%TDK?iW6`9Ujak>#bXsGbYECb&lV(awYep2%LeEh0{)phn7d2Z= zskWMQb>Tv>^s)9|Sj>?T0!k&QP*A3iiLIoIFli*vPDX-p|52Zdy}xux-A>4eG*Dam zTsMsb2e?7kZNc)W;C@r2T2Z1ZZc4S{EmXI@P7%LeQH@J2goWY(fR*tez^b?musU7= zuqGY?7>-x6E$OOAwL?#5GMC1|-nu>2m(p!Cr>CN<#?soeIv_rMwg1v!UpM96kj$u- zMZqo9ylqm@aM?7}p3rE?6cp9(oq{9en3-m3HW~_@F~RUQ)!;RL!KIf~jXXHjR5avN zmq;k~R8F&;YSp&E>GHOwWYt`8Y0nfhWGYB%0 zATc2!To#T8x=6xzMmQ!=k`^Mq>7IA#gmzMuWo{A81X1DGv8-Xo&_!d{O?K7FsYxxS zL7a`-*Of_Ahp$P9H(!xi3c zLL4r~q<3D9H)!r&Dw2(wOLcLdqwsru*#ZzzxeUOiY7%#tCrdm(n_GXcM zv~;UPDFu|)^I4AaH~0k7!x)!*tmD&|1A@=Gs+jX<_M+Gr5olK5MoYkVsq>>&|xdf$L%=b2>l)+hWR0B0 zY#l2O{Lz%2v|sZjjBM1z+9v?!$Z$D3Bp@4j(v~f;g>#9%w_$kt*#lAlFTQ>!XqyVY zw&-($6RL$dh=Cyq)DYo@h0joiW_RQh88thWQcpVF?+l+3&FG1YnN%~@Nm#gdj{zmC z6~ImM=g+>o{MU+NXK$gicV4}(-_`G3U1~l5Hvs^{BE#9(TnWE{A+5 zemq50;XLpQiaFvdsYdL7hQf0u7{)3?cLS}6x~*l`DTbljux0=~@Nazt;3ipVYMr+i zPT#%$sG`_(sL*t1)lYVJEL?lg@#x5R!s7A2oLW5f=ww_fYwD&B3cw*HLGnX5x zmEY2DI2G^^LjC!|}tVcDvY)EqIRTejneg25UAiL>j7Xi!JucM;pl zkMZKeQ2I!KRUx?m)2w{PhU|+Y} zHEZi;13xvjd^7X)%)(%C@A1OkuS;Zc*SiU+1+>0AdsfIvww0R6slr>{^&BZ<3$F4PSoo`!D8G_cM1h_lzgu z&Lz3?O|4+iaILh%Vh+=0IcdR0X?Rj|X}6t)25OY^Kgv7oQCFDJh`_qw0*e7yF9h@& zs0~GVuafSfUPKx-0KhrJbzgpd>+?U%EXg}u{*h;Ih_K-NkHX@$Y$LpCxi+TW6v&u{ z_H45AWx1g! z?jdEVn8u(nB2Fvz@6f83dh@8;n@7Daoc};@1$tdbXf9m6pJdqIV4mO(2t`p4 jo(E(>T&pKS&A&*+k0kVOa`>fqP7vA_Zv0Ge=3MO literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/any_ofuploads_subid_body1.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/any_ofuploads_subid_body1.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..448ffa458e245739878a92bef8fa9679d6f045dd GIT binary patch literal 3661 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 Ze=_x-Gl7S`BR;l!?)zVX-($^L{|ihFS)Kp@ literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/apikeys_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/apikeys_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d79988a1e8d4d445bfb52efbaade24b912cfb1b GIT binary patch literal 5169 zcmbtYU2GKB6~427UeDTI|EzxjbFndaL0%IIfmr;=gr87~(|T+LX=%r^yJLG`cV@XW zYsW?=jw&^f20={1Po^$SZ&OLWmtE)unWO1t#Kn|(ouua!WKJC zhrh~9U`zMLD5afLH!dlC^u+!>Z;9gjSye|7%&eNE6AoP;5blZX5yexgt}?|^Q#3Kv zN5?HIYxec_j%n6-E)h!_nO<{J85>hskCN4j{iKmn$5cHAWa3lQd?4xQ@6-ijkk!A! z_%=CDz<2}=$Gnn<`P#v3l27u-Jj^czqzc{(ND(R6MlJ}f;(So5Y$N*%99iZ0%E3q} zd#5jnYiNQ}sAL>EAKGwDRVj^B-9}iIR0DOj6o$G+s)af%)j?e=)w8;>hG?T5>d$Hy z)hY9sk(zp151UV49C&}|L?7h`m`p3CN#P`woMlijO3|9s8dqt-dK4|@eucBkGGmM> znV2XZH{h%+s-`rHFL3x}6g>wxn2L$E*R+`J1q4Jrwog|wsvS%!`XtjVl?6c>RtZ(o zH96YG1OGT)9fArlEDV!0^qj&+!kQ7%^D-R|O{-wI<~WLxa%-IE%sfB%rk?I|a_7yFlSEg@>{lD z^?eg;%ZI{?p-uUg&7YmlhZ+_`Tl1T@Uq8F-B~^44ZI>+C90u6uC)5U=+hmvwLR((8 zlc+HLn^P*dJ|YQCNR3hG1K3JMEO+;QhZI8uu0ziUO(86-jS78CwQ@{H7{5OAK4wj2 z)jkTC6z2sN0-2$yfyP9gD1&%P_~F^Lr81)MdyxuBXUTFssg2y2zBauOY-Q+D$sz_} zP{eO73~nPHp>+z!-VN!$+C&sz*9ut${E%Dh4K4A)5CaUuQ`E!lz?C;q1zKVa)&vuW z;on4W1p`D#Q`>dX(fxlz#-EGGaJ}la&;hoi5UAe53L=a#$w2}D!HJYXd0?SR67MMU z)u4HkeO=%{97Et#ffZOI+M@(EXqvU&=k9PCDNCVq<=T~n;FdRs&L4}=aanI@G*SFN z&E%lU-NQkaJKAu^GVknj(1q3-V6C9Ni!QX$8g$_V!!Uxu{sp?)I`(-4;JP+Fg6uqze`ET{sLwj$a}vdBnK<_9(2uc*D!EPb%(O>I3eX=(6JO$0;Q`#P{lgxv z&zFRR2qp1mmqom#*n7D|TR=zhs-5ACK(`#8(GcwA=X-&zaj#(kZW-V7jzNAGI2Vm` zlS77*Rhgw>LJEI0r6sL3cNn4qEwTC@RJTdIfC!XE5?pPIc7sq3QX=-siffQxA>(fI9=l>(F%`>VtQ}TG1zY&ABwpCTLuns{RdzF^uwnkA2$ z+vlwN{dXq6s$6Q`yV$%JvXIW5_b)xz`PII!h4}-2I68my(e6VF+YT=iq2qA=;GtzN zv|R6KH6)zchjt~VmwYq3x{$-l7?Vu9VoZe>4CJJuW@@@=DSA@1eQC|KY;Q)%G72(q z!EGO&qV0FM0JWJ*@a&c$bfN)%UD^Srnz^)P`#4WQw*3=II;YxR%+4Si#oP~ylUU&4 z*$o>U_6U41zkv$Uv$}?>f$y5zzL@#d%>ALIt^Raa;?^iC>?OLqc zmEXGk-prkuyC31V$90?LPCVSVRM)*&*UdSsc!b8oPa>^foca9Bt+T5YKIG(cI4xHZ z+I7>qRkgB>w7m1YgH$#B`Xa0jbuWgx^X(n?F5J2B+w|w+O>e%v^QL(#wBjXOcP|G> zZPV52^>G{x$m94Ap#xZi+9@xM;RwC5;(DGNk$AotD~$w@QW^<{?#bC;16W8N(JF5GzI%BNT6Quoq# z(s%Vo;hu$H&wBOIBe?pAex5!TgAYs;imM)1tK}qQ!y{bK5&n=KaikuJ3ak$nl;H(q0%o7lZyTc)$c|Ry;v}+o~6O%h0-}`-y z$G^=H9_5Cc<194nAXK)8sSFbuJK$iPD^;c~Bnr-<9ATIwW2`Vcp@Lga5LN;~!M7SA ZLe0NO<+nt9?wb~bZ8vv(Pq5{?{s&0wh=u?F literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/branding_id_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/branding_id_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b5c5773de110a6e3ca12e284bbf53e457a39b4d GIT binary patch literal 5631 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 Y&A&+H*F<{kKOzd-uD$*p!6!fUKZ3gqk^lez literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/changelog.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/changelog.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a17568ed1cc30f527c61b82ef0787fb4da9cd678 GIT binary patch literal 7609 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/comment.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/comment.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ee77b5d3620910f9fe08998546a88d0ac09687d GIT binary patch literal 10203 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Ν--+@vG7*Wv9&-j+pw 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 z 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 AEC2ui literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/compound_duplicate_request.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/compound_duplicate_request.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c0a102f584564d34c9ff00d978145278e3833c4 GIT binary patch literal 6689 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 E12jlLwg3PC literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/compounds_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/compounds_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88b7f2a468a584c0ce470661f0f5057a7060d8f9 GIT binary patch literal 3567 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 JAUJZV{|6*K8nOTY literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/compounds_links_subid_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/compounds_links_subid_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2502357880e8ad6462d8ad908a6e9f76b0b4b3e4 GIT binary patch literal 4779 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/config.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/config.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7efc137026f9be1d2180327da1bccc2dadd5881b GIT binary patch literal 85733 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/container.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/container.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c80d4921847943fd41d2144992c487464ff0fa6e GIT binary patch literal 10867 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/containers_subid_body1.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/containers_subid_body1.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b94339d90f935dc2fc5d0c5343efc524226c758 GIT binary patch literal 6492 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/dspace_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/dspace_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b57fae5cd736056b90ff9af5de712148c94e0cf GIT binary patch literal 5457 zcmb_gO>7&-6`m!z6t()HeyCqt(nzu_)3GSmh!aP(6F8NexUQ8%D>VY>cC{o|(#qs6 zJ-f6crE;A^Tf0pVr>+qh0cxjkkr*i20KMc;>w|&h67(Wj&b{x=aw&?E zUAO6goSmPyZ{E*0Z{F-iO^rmL^!#aR?)PB-0a`Mb&hgs^?WbttQeM)r?fu)D0WPjTFsj_N>;JPd` zXPBCaNz$+huCl3?(rx~N%P*rEIe@`@Omh5|%@!hQ-Lm7Z9H%u~O{uo}gQ(Aul4d%s zB@s_f2(ZB?SOo~lLQst+Jx`#?eDKHq#tEnZ+QI}$L(46^Cv52(%xP5GmK zCtzvm>CF)f1p$CNX9hEdJ&1M~ykN4k+(UyJY?*2Mf^y!}liJ{U*g7WTgMi(E>^y88 z!|N)AE*IAtOmPNE0(>0H&O0GR(GA^J6sK`hy_h$+4`i@lrcSKIfz9bRpv@6>Fdv64l@LI>NZ#YQ_+*U1DKgJ*f!L!!dMr!Q%+?GZ+s zW~1gbi~!zB>M)?+*@Ay&#MkG zdp@fTQGlxy6&Oa?I|8eLhlLtbRtq(Eq|;O)`=(|Gkrcu)Saq#|)J0apUHNd=a;S^d z!(g(AM(CjVxCswH1579+s|bk~jV${P7uuQt*e#9&Ui}Myl%LF~lJrf?m{nnWmstIO zG3cf}M;8vAG|sDOJw>6;X*~Q-ZJKWC0L|nqn@5s_MyEziLz}|z@O`8nVGK4EIwb1j z4&h#~(4e%$EevDqx8ZN?hKf6(x;bCfaj#+ba>r|T8^)Ha$L{ay`&+2hbx6^yK#lDu z!}OnvnD%!6lOWoQd30LW(s29%hO=fimxgo84YLSn3(vpDBl^Es)5G&lkrx3Dh$E~K zs#17k(A^R;yai7pA?|GRvps1@50*a?X+51 zfEjW@y`xb_7Y^=#a*z2VFwUC6sN5MIxX}k&z>Nc}6{>NZ*#(sg?nu6B7YFw%cN<<^ zu734?TlYJ)+p&$Wb8LrT$6O}|i6O*c$Sq@~VW}|IgE2keQEWcFpwviS{w*Oncr)7@ z$FrK3N#EfDFC!4I^hPHFah|JU-<#i8m{j2ai6aboiDRhcMHbr0M8Ko=R-J6~0_!;L6kbZ?gxnccYVu|_ zpWaFyr!pNrBxLgVgpcd<5g}ECl6Z^vb{sv;OZ?Fib%2iKaVvw5K(`$FXdKoO`C4FW zTx&vr(>buPcZ?sE?g8y)J&@LAHD>FW#KVuK^rXGz>_=3fB{p7$>UznMH38|Er)|*_ za2SG=h`qAn*=G;TgDk#Lr@}TBT)eO^A3yzxaOc@Sym04* zyH6cm?mo6ggq~xoM~<%f;mP%m)%q zR*j_Q1TY9X{*0PsXkae56F?_AqRR!SAyeZw0*1(m2Kn*r1es>#(zX-eJO#xOc~;=~ z&ua5l5C|bbhT>*ihytf!yRQ>4Zha0FB(e34mxEunw7k&~;DwhhtW*RVnSwDD^2TJ^&a zX=qz&x>dPSzdv8Uf3<7R&BYswAN&~S?$z&F8oB-SO8vfk{XWiN-6u31yB}$L|I~Y@ zuASbf2q33`%W18e(7vnowd(b5()!%P9#Y->tGU~IR;v2*RsE}-JvZlW%>6q3o^;i} z+Sz;6x>mLBCtXji1xa1=<(lnL9PP)W_;;ZJP=wkokBs1myt3l$J1-vbEIn2l2O#^^ zjTy?cEcnQ~>U+634-#;v31+iEWjhsFxW;Ex+r?~IF5v`WQvy4ueyi_bXc5G+FyLJx zUxu6Bz4-HsOR1ab8|e>>yWxT5(7<->aX)bFd!WJZ9Jp7?il-gds`Uh1Q>VC`Q~b-r zlq>WUq&`RB#q!h#uS}@*wkwl6_!hiU$basK8{d8N%A3DfTn_DaB}M7HQuNaljBE)R zLcB;<9w}3x%?w;;cRF<^gq=o*AOK_JEQ#U_@@jpWCQN&lnu$5MRYM48@B!u=T*XgB z{VWO+@qLK8;yzWBJ8nYli0~48S3v;_`_2g}igpgHQR+T-=qEsB^+AR1!%fw`5k;4G<-EMOqi|!6ProE6rQ|J4MsXWk+U@g<0U3A zPN;C&&byb&przRmfBC}hhT<^A3k^Gt)d;@Sq`;nn?{7(^$kBpDhLHeM9yewp2)U;* zgRp)B)lbQ~&o747LP4nNNXzck$o_TF-xR!b8Uj^I?`ov8(0wQc#cm)8)~@?PBHi#q zYYkg#5fZFh5u5X3^SZA}+>0|UYuH+AFHm;1ATLgv% n{&@qAI6+tshJ?UIgb20&B$Zzf>0#hUg3x`n`D=ntzUsdL@Gj>d literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/dspace_body1.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/dspace_body1.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0379549e0c4c6c9bf78651c165f5ea45e8721250 GIT binary patch literal 6329 zcmcf_U2qe}c~8G*Nw#cR{>S!WV?Yqggn|5c2pLj4gi@5mha1lrDxamZeIT90-U(tS zrsSawq+}qaOw6QHU?y$COlO+MKJ>ZMN4uo8dgXzc^Ba$GwjtflSUl()nuba7B zNe_|S?L_jN@*H$q>zH@i74y#hE1>*Ho_zJ>TXbYtI!TYbag3hdPls};LRQfX*-&#@ zAaHU<)oI!uqiID?F?CYWshr7B`Mj)V?c|`1h}E2` z8Hw7RvX4}|0Y;SS%KE`m!K!P*8(>7KzN{ZQ6{@nK+#=+J zV#sOPke@wmhOCic%}|ZmnA;4ba+!>hLc26YurUs2`oLCUo{2y^tHBEWCXsT~3mxKu zKidA<1XSQJ!YIi=%PPDlZ0I38FMQ7S8bZeEGbOBJG~;+78QYifIV+}xm}_o#nNVpz zm1!0PlmYLVQZ=w)Rilz+uZfu73?|F?s!5g@^CvCN%-XbyUYAuh*~qa9Mq?h+qbr%I zieViI1s|j4>4B_f44_B{F67u*uI&K@+;+;ikUXDLQ_8@3aNiu`gWx~?`B`vZ&FLoX zE@wd>NOJ_qNwk-Ee%2I|NmWygWYUb5F&%eC_W&9C092RA!;bFDo-f7LVq52B&(*qO zO9y;H#m?b_L(u5xu^|hvd?|#gjge}QDMo>5=pyBCTiIfe8MAq1kb>0* zVgd^R{r3b`4<8-*qpSgHu1d4HoYHkh4j?QpxI|VWq&~VF?p_LaFN)m^BTuSixzIsr zafv+x4Um|S3KBA2lBwi6XtxysEW0!g7VMt8D{WDRfxuR!mX{$Wl&R#ulHa=c5_9{H zY3JpPnx;?}6n@%FtP5)58JaEV29H0J3Y|#gG-V>@G6O$G=wZgdl~DdM7neU5x{l(b zWm;e@Fz_<`^=(jbk%yX>f}IZ{+ZH?DydN1^42?YO==+=4YKgxjM1aQj)(rN$lEFI8 zzZF{w3`rQd@wDZU5DsC3sfr$_M+^$VLd_Pk&(L%#4&f1wXs~^zoGYk|AEFSEKsGjp zR8E^xrweevLTH8cPc`_`c3bc$$K0#NcXWVSkP&N!s@(iBh;NK0&YmX_vJNWS_^(~O za&b}Y{C-XU-zC#`wymlSINbhk^0!>aA;)qYr&pD@3JnfgZc|+iiMf4M9LYid1UF)B zparfz$A3_38~lf##T_s@hBMf({3p5;?BM?M`u)foi=j6jwr&5g?tgKg_e$<#9hh5@ zNFcBwif?_PW71Z19_G0RS~6PYCQHUl#Eg^&a%-b0l!$G|^$^6by?f=|MX}@iwd1!- zcKj6X0w4&>x-1~eww|(}x@B#UMq(~r#h@&lPc|bFcu-i-z58pCXB<7RYuBBO?#{dGYpRdvHo?= z%trFsZwV>D%6#v*-o`4f+JZu936rAMtt|hFH42*h4Fq^0-&Sk~Mlm<-Ybm9$wmrWP}^*G!^ ztx`rO+$~|JCTC{->+IxUs^H-+1coD{F3!(qgaipC<9OQgGTvHhJ(;3T;E_CSXV4Mw zRzMw{guT3cFOW6vH7Y=^=$YF&!gDz*U9_@vxV_{RX23~GW%$vwnld(IqG%N;iM7|D zx>=S{jl#{s;kKj+$kl*Kw7rVr$Y%%411+wE={Iso-0hyr^v}q;Y#5C7z^a&F3U8O4 zkfwMjBWEYm@?o>DJh<4)*Ve`Trvl?C~> zdQ1J}>|)okzX(uqx8XZh=l3Uop^{&`1XZy=&>u*{jk72f{60+v2VAxkJc(~GZ{kES zG-}oh6$rqi8cMcI25cuzqDHU6Uw;v*OXNXI*Mf29$gK;X*DSZ}UuxOE;wHVj?wq^3 z>+=I&2=|`p6x)2P+z78wP<=REC8(+Ci%^mq3OhYJmEBb zOwkJ&!}M^RLeli|Jl1rdRc3X(PeL9B#kvx3w2f7iJr98Tmr%h4tD*6-@9UQKkLQ0m zf9K?K-}6g-&;PyUg)2ud4?T!>EDYU`?z%kuAl$al_bFT(b}of?KIrcK^auZl9xF!M z*1Yb%$Qp6e#_PTtp~oVLv@JB-vr0s+)B0UGb6n=F7F4<2VYC$MGLR18fm$t2{A=qv=%? z$Mc+s#BYu9@<;&pGgX_0ggFmNf|HA9##UYd2{&Hm;XT5a&jXZU`t$J6m6Z+4Xe+W= z(+6G&=r*PS*4P5jrDM#yM7|C;UAy?f#f9|k%&p8P+Wm04&F*n2a2=0o=EV^nkdC$59nqF80Z;wcz?Rus!nN-e!I5y;Q z*4P~Y)BB)81)^VdEQkA-!u`d@Rus!9-qVye_2DG?h!VOlvGfyDVwRrF*t3BjwuI(jK-F~hUub6Ic+gNzY$xx zEWetG0L3uV;E!tjc`fEnBoeVk6rCn#af?7Q2`*8{U^|pdB1QI0IGLPMnQmm@*-Oj8 zv>)W1OM!*;15UFRBcD21Fq9<5Pdw>O(LR2y2R+lLD+a{l^@lyn$++bnLAs7&bsSeV zCBe_YQB%nhS{-)6K*71Q0x6m$*FEmW1Lx1ls>|&aS41CF^`vE6F}k-Hp{ssRlkd`r zl{(VWTa0!UBklIcT!|82-KtCU(ls}JoC2#YpE9l*cGc7CFT4}eT zyGqbq9K-v`_mT+PgX2vI+hfD}z1wV9Xu(U5FZBND_fD_60$z@zaRpnCTHCzMkDhaR zAd4%{Xkc}T)b@$@R3mD&fx@Wbrkg;P| zWeR#{XL@_Od%o`J(ON}?OrSOYb?`!WfRJzT#ckePXYDX_W{5%2bjvb(#>3BA!8J244 zX+xI#Ms<@Wa$_{1nQ^8MX(m;ZNve*idQu%qYE&~4nY3tk^QoKN;5R3T3Uh* zjknWL%gUJTZEYjEHJTlY#M7xZ^RhZJqOn#rqv!kabV3`^j0mvFPtfw7xMROVbIu@Z ze}nfKa-M+m2s(~=6p=|=!EK79cq1b7Dn6xz_k2o7DQzSd1Xgn1ugHz$P);H%Jzv@z zDirVZm9lj_exS9;_5dPuz7k z`bC6)d|x{W1n?{LlO*(<#@~c>Z^+NvKvgm?XMiRpcYH($ixc5O7tmI!(iE7J1keua z20%wQsN%q+C+xMoF|MU2rYG!*gpRmQ>4s{h*>kPK9$PZC12T-p({D%M3*48;EXas6{&ktjS@4m4V6+1Xc+T6HTHF5+&iAWe3-(h@b68HsrlZ zR;o!==;p-q#Dc$pVXVaS2!j{&4EN4H=zw>GI4l&+`%e)M<@%Zcc+8Ij20atMQU15T zml&>c?5zHuZ6$vPKOVVB@8DD8Be>CNi*x!FnmqWOY-ssQ2w@XGX+slfjie>d~^dzm$|{3iZ!K&U4i2);~aQFOOE07M7% zOzhbJfO_I3@MCr09_~^Xcj(D=xWfU~0HhCRp5v}^x}D>$`(gFzh4RynYie)!U&I|A zNE~;5!14^)PYfXnLr&{0%mTTwX3UO~%kli_=71XV-X96c!k3wrXo)*NARfxeGNdSK z%v-+{H*cPr7q#4`akyKMd3H6x0b6u{-?&J9w}6Feih5)4tzP;Kylq+435zzM7gC!2v>f`9WJAXmww zx~;R;{PDTVUzIM^9ayY8u;L*tyXG(5+x6AKuZ0Ik{`~HPcOUNUSZF%BLWJg{%WrqA zc;LzH4p%@it6#B8VIjsBvnz7-F)tZSyJSRz>k-tuvTo{zX{knBv!$eNTDB*pX4p2= z2sg}@a2su}BL%q4>=3V<8Db~w<43FQW15*wTDHVx3NhQu&uZIqQ5!dXzzFpwG^e=X zVnZA4_7HHI-vEJ%FjzC?`>w9>i^<-tSy03on+1m$x?Gy)bv-56REvTb|{uEw{|uWvd>tZSRVY zRBf87crlZs2YDtx4IKa@P^Y~#izD`mnj3p=PU1Chq%apisi_+ylxZ2*C8#I(wb-pM zc%pzyf-jQ+F3T>-z?C5#_`N^+7nN8eH z&L!^{4+E_W{?-@m$C%*uBlLLH3P^(Wy+%bfAx z3iehSbG-F=-g@NqfA-QVAcsY7ya@j0mGMip5L<$<#)$Cv`Fm>$d)AaK+P!m7_NNNXV?RQ{WkeoN$M R($58<>DJ-z2|oF%{{`bcna=vf6Qp%<(Rq=uW0 zi@(BjU`vmMDWxq`OI?*CwEINoPek$kw4$L1dRmFmNsBH5gq`6|QM{mN3X=^bPDiIA zbiy#wdZeRcTs0;#qv2R8*`Z&P$Hx`cE~nL8JC=$o}Ugm{W2vS0k7W{<*>q=9b)&hqpXZrR1$AmjzZd?3H}=)`J=c`v(@3TDgq28TP?t)6sLP~ssQpp})a6ouRg4#ff@WElo|a=u zk7CGi*^r+GVE^eWz3=yTM<_qTSVGoy3Wq6Yj1&dC?Vjt|Z2`M|2bc;A@U_BsHT0t=(}g z#jbGscPQWxW5%`UWJ--G9h2Y~DaHo@neFK*a171vMzdWmq}~zd45HvX`~<`4DbpK` zs+wv9 zRxD>(=wO?lLp?O+$pGntZ(%t|Lc;X*3kvu);sk6)Q)AEsBo)Y1=+R1g}(sd#o65k*j<)l1#duncK*;~ud zA!0csK?gPG+P?-3&|ZkaPD45SNRAWPwju!Ta^rwC=X65)5%v&8F_M3)BvSwoN}!4xH{ZZaKB zK=W+Ks$d`je>$Ro8?D4Y_tW*jzUBSzJ`P-3F1hq1SaZu~88BxCpvCr&gU>H>@Uay5 zp8)hKOA8=W0+KR}&iMesxMT(k0K_-BfRyU?F?rGx@GW;`e83O-wSMwdkqM1;kc#` z_3^92x^t{s98!_A!VDFYPxw#cYRuSiogpgF5?k*;HJ=yC2O!0;wauMGIhPW#S5R#G z90V;u7DumHWTc|F+mgd9nviwbFcvrhAIhv z`kPSQAnP@a3&!HPd)L19t=1e{sX4acBrS&*uRc8d_3>|nrIUX?yL9$(+o|QI(;Gx+ zKE3wFsSPK5x!$2tNG{durVln^d^58&o3BPOy6I-oIAl$5ET*XHs-_#V7E?@DLe&k^ znUvG)07`^MX1eeoO}E7bsP)V!&tw^*C*!aYR|Imv6(E5RvM{oZtcyTRQx8-)W2DXTkR^IX4EqU%Gfx3mNMc-=0(Upp$ zYX=TKn7KD||5rG-UeU17{pk2=#gUbYBb>vgL#R6aBv|+5r7tes?b#}FAt#r`X`_VD z);q@ClFcSk`{wgzQd0eU?NNNSxNW7lZLP8S!R33G|B(1XyyIMJY`LS~E#7pJ18o}~ zQeHhLWhl;y@f{#GrdlD8FW-a(6 zK+X4j5?B*6uq>OsJn>iFhTP@1Gt1t6mb56LU2^9&0wX(uhcJ|*D~y|Q&}bYUY3}xfWglQSK%>vKICLaK_c#vs4seKG`eIZ zv8Edq!LI`-VAcoW4Hs3ef<+3C(Hg!9lzJ;vc#P;^jjR676@TYiWi8rgW^QKD{Z-k+ zvK4=L*&E(%Cftc1DyBj6WKf6<64Hh$3DZY&z#9k{7V#u?=iO&Z1GpxFx zGOMECP4K%>ESlq}!zOPd0j3L9#6;Nfv&A8O5vpI4O^4I%-SB##f;U^$T1EAy+gatg z(E}k0yS3TwbJ62&01{8xrlZJRx8;P^2DUZ=#N+$yYoj(x+mNGe zK-%KZhHnld?LHh2Anm?qwRP_5XRkZl;b&fld;c@9+uiX)nZw;=36FBa1%bhhp%0r5 zrm#cU@K_k;N)>1eDS>q;XBg(k7!LFnsNixFgiViEaBT&NQ1)-)`;LguUDpMn>CT5g J5d898{|n4accB0P literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/dspace_metadata1.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/dspace_metadata1.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dff7ad8b2b84e0d28a20abb1b718b43354970d23 GIT binary patch literal 5147 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/entity_and_item_editable.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/entity_and_item_editable.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a81a0e488a7cd3ecf3681a000083c86d8961185c GIT binary patch literal 16483 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/entity_duplicate.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/entity_duplicate.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67244adfdb78982f5283576f9bf2450c4c1dde25 GIT binary patch literal 6398 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 UN%%qFC7;lDb?O^}Uq0%80kaqMV*mgE literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/entity_editable.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/entity_editable.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7779b412b70309102bdd8752c26c87c685f5ea5c GIT binary patch literal 21629 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 Y{ZxANlZr%xt8b%u;#U$z=yuZo1z42&aR2}S literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/entity_template_editable.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/entity_template_editable.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80ecc1208bc36cce9db7e2989bc8c270a3176cd7 GIT binary patch literal 6240 zcmc&2-*Xekc~8Na`?cSGn~jZr0;TUyXU`3{6Y>pyI7KXVHlK&i4H6}cM1`p9w7>-3x|oZ% zZsvy8ecJP~$V5tZkUkRibd#t!D;{*)IG8u-3VAR6)35$qnL9cC2A!ISPSfXJJ4F`{ z&=Z+>F0JaOVrm)P@1I`K44Np7(S&NmnKq{yR7s_%vZ!b&WiF*sRZnCynr_0lo}g*f zT*xF0I-g;*w8dV-#;-C1(9#28N@+jUGZ&NyojADvDZl^Ktg0gkMpli}MH?;xfcwMy z{r(qKU1f@?Cg|K!gf5t7)`*ObCN*;*Hy4g)(xb*jC7D#&h?3RH{dgv!CRIHQVE*s$ ze_hp3=wWoPaEzCBRyOYz3COn5TzC-SFoLyO=oZ?IW|k zsCdw2uh~~xs_Y_UR-9@neO5HHz9}x;iXrG8gq^TZ67@!X9Cuv_w^S2%-8Q&eZ9J8A z1@4Y$T{k%=F#l|Q)Za}GmcUrUY{OJ{Xv8=)UDB0sN14#tUcKt>a;p-X-uo>YzoBdNaedWpySf{$ycW*B9v=jJf#>0 z1yxjXW`=@P%j!VQ1(lY>Pf_H~EGS==Ws*!uhyDH&8BjKpsvvg0z{ZzW^c*PiQrK^~ zL3=|kt39shOjQ!HX2@DPo#RSkb-?IFrkU!a!;PhFWpgR38cYJBSsheXqhgw1COKG; zRT>Y83*9E`5shY#zKsw_ykt`tE3U7uabTd5)qP&>V;A;__Q-<+D@D3x{C2&r< z^C_1;`5}!_@O$7KWV57?GU^MuiEws_H6x9^wHXz5NFMvzm$4cJ!{gTRr5>f&}WNx zq(hs4jl|1Z0Uy{$j%}jp-TUr zM3`#kn2t98laL!>XqgdETGM}9V2!{dXwW$u$V1BDk|kWrtl@1KP>X4Y5do^hWwPE% zn%fJ3P(Bb^lR~T$2IFOug%9j=Q6cyZG+$`#f`+Fw03E>7|6D+R|NmGdSp__3P2KtF z#Pm=~lWYfYC*J;q%I6LtJXr-NO z^p^X|A%A zt(*Ojh<*}Nd8|;%wz8GDvaxKP`XRcjykw-(T6P129cw}HJYp?4z@G-=D z&&6E)Jf9L$Pbit`a#qivqvT~~dx}6kKt_+*8Ds=!%b|>>VK0&I1-!<+Vgkevo=byM z{8F~BC_5O0xEgMEQ^R*4{L_RMHy?>mP%DrVn=e6igUo>K+9d`tu5;Ql-@ritm8g4F z#o^B$mNerto+w z6IW8kG3eMUbiikz*<2={zwyQEf2=EvJf9zVenq*Z-PArhzt(f=&jM83g81gOkNzfL zs6ILdt~FE<18`=+sCov8CQuRp2_c!vz!Qq7Rvge0$zCFt&*-_2OGpm6mAZF z#u2D4lY3n~E9UBRH!prxSLiyB?>eyVCjEO?FMPcBvuC~#Zjb%p`0e9&hR4@}N7sqa zceHqTeBBK#KX<6navR!PRvm1F52Lif(7#x|qzah>lUaVv&~(F8^tftyQkr2}Zg>i@ zJpjbXwLB-a;oJ%uPzzz9D=|A ziyg=MvfySEo4O#c!{G|(4bCf^1+ z-hb!U@2n(lrEaD^((eRD)})cGoIvy7oIo|}25^n^_{QtFhl{LaG2 zBi=-qDZ^De)C8O?35kVTmvc<0H5vgwjSjZL*|VHVwRt+1F&AiN?wlIO0xY)J>8MSEot+AiO4pxAF_OoG>;#fhbpl;|>N0G=vh7^6%=1cy8E zD%64e)Ri>u<(Fl+adRo`H^?%QR+^=12#K_0Ql;) zT`)Qit`m6q8~=dnJ+k3)i_*H}g{qkZ2aCbM4bk10)8zxRtz5g@hcv9>cp}2PU3Caa7p6OrW<`BB#NWo zH@U>1%?5sZ`Pgg7h@U}axtPj^u`_^aDab&TQchtzb@cVzmsPlc-|F+;L4ld6Kpwg{{qc_)?WYs literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/error.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/error.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28bc141db8aaff758db5920c9029bf83d587e4d1 GIT binary patch literal 5785 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 NUO4m{4u8p{_P;<-1BCzp literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/event_id_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/event_id_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9996d4111d31d6cfaf769bd585b6073cacf0ddd2 GIT binary patch literal 3548 zcmaJ^+fN+V89y^Sdtte3xS5M%d;nuuTf0!p#18VMc8nd@HECH;kT%LNyE`mnc4yXS zW^o`Q<*CB$gGpQzkfj<+t`ek3$zvb-2lNr@w$LdLk&+jyFTgtQ{k}6hYgllO*mKUD z^PTVV`!45DsICqYXq|r>zxSwukRR~FZQkOf@D5CtNQ^KN6Jp{WfeCyRnaD>E^E8tV z67#f@nDmjt>2vgkk<4dR-BK*g(1XE| zNzJ6G;u=kx3TGc?_Tbv;G1sx@h(OgdpOS`^W3I{Z~; z0$X}6N-6E6x^Z6_po9H=zX%3D$f-K2VCK{$op$I3fUqyx7YyD~b(JZWnxcuB0Xk_} zIdh=5H?3Kd`9w5nWP8mAN;<8wh?3Jv^Q4hd)2bc?vfxX!d?@MI@AN|Pqi_=@OXMR0 z;1L9ld14}y+DIQ^UikSCKIV@}&bjAdd07XXXQzff7#SR(9LQuwF-;1HDtXJGpj^o+YE7!NXaz;h-Ce*i$BZ;nve97h zh5?vaR846XKj84oDtaFLF%u0YU8B%85q{|L0;&N~B8-v@%$$}M!s2YtK4ocyDl`j% zGvMV3O$V$soyHtoht>qUI;ElWvzo4027?93R5KGMN~HG3y;K}!o+-;C*PlFUy%M4Xf2?f2k;2M0>>i&$Si?-bs>&KybU8-WvzpZl3}TA z5kC8iDA$ws|3XL}PUbq}ewS`c>@V`tr8s1+(?+E@&u9E{_j`(aN-H7p%Hju!SG%*A z&`L%nm)ey&R@V&#cdx>kkV`o##Y$33TpI|S99@p$x7#z-m|^9oEHvOYLuwm~;fzWMOG-~P2?Gje?+a(!8O zs;y{Grq=<+x;Ag%I-8|WDYFoBeudO`zx?;2G+(y&69S`a3UcLXU z`|I=H32PU=y}EYw#o0^i?U#3m&~bU|;-wuAjNI;Uwe2yrPwWa1#JDiKx>%ECYbK|f zwm+@H&1f+@sF|8>T8f@jZ7HLfmhH(ZIfgO86}KhyqV09K0JWJ<@M_I4bizJ{)xh>K z)y!usTjD$g+4fE=nY?OyrqmhJ2NZBkLgOBH*w!E6Y>YGWpU^?|tF2$~{n*s{<=hu@ zt0S9T7dE;s{JZJm!&?hCwi}Kw-+0l`y)d{PYFX}j-mn=uy%9RSeX{fUd;e*;z17fC z@OrxH3dBR}7k!VbUIj>9%W~st#b)i9joLF?Cr>?{TbXsROwv*;}Uv-eGV}F{0)0I6Nl|5T+ z9Z&DA-1~Fp^WdUqtF3d+7pJxl zvJ%+Yb!E6@S@fNCo^y$M- z|2VfEc-v7G)pHw$I#+cZCI_m95HHb{SIZQblZLm-Q8(|XaMbDm6k)8M`zkrht5lny z3B#JCM&h2D#HT5Phw6QJDcuZv7*;}_iukm^RF&m5(Md`#9D?^JDp*WC+b7HFeSqVD z1D&-yKxTG9hYrNNI=&f-Y=k0P_00&*+{3w5?^iX?YBoaA^+5D6Mkt13R0WeIGA0a+ z5povo5oXVn;_*%P@Yf*Pv_{x@)TB&nT|KNdt_>qC-Xq|``lf$`=z4&1-IyO1hr%@o zi>_qxcu}srPS|V?$GS)^k z(8&)Tba){#{0D{&AaSD%DFXj=B<0d66BuDpcN9ZyxyN{iSAuyFy5Eys(c=y51bood z2#vn^yE{HU?D<4*$6lbtdu;C=(Hq?hh~5)>0k60Bry9}Q?l8p&g<||m7}#0pY>}x9 zo?}p&ov?8v9@GNvUI&mXY!FB>{mf42;35%(U0*j3( literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/eventid_delta.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/eventid_delta.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4deda2ed235004f207ca2925532be022a5ddd194 GIT binary patch literal 6366 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 aaLxZAjo*;q9sZ<;>%aKO_XNKTnEwG6A%YPA literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/events_id_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/events_id_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b6be90c4ae5b4ca14080589226ad274b847b182 GIT binary patch literal 5937 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/exclusive_edit_mode.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/exclusive_edit_mode.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4239bfb3471c7ff1c459725960e036e058b37e4e GIT binary patch literal 7205 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 I1Z&p+0+xcbd;kCd literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/experiment.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/experiment.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e5786164c94160146c8cfc0e5946031997dc17a GIT binary patch literal 3950 zcma(UTWk~A^^QGbPn?GdNeBrLE(sw7Hg=#qb|W5wC9o_dTjIEjvZc`mA(bFe?MAB9{p?4-tA54{s?%vIZMFMD`x7wx-*fJGoCjgmtK{4} z_nv#+=iK8`ZEc9a==jUXjlaU`d;IW*R9=+M!(xua2qQ5e=DQ*=fzLkXGbhq3VRHXVlS*Ml~aqGj+p;eIrG)nmul&EIMW~ zT4vE@x%4$=0aVfqui* z?a8ET2^WgxkJ5i&F-L|8n3SM7!IVBGwvk@Kq~Sn284kw$$9*pL!SW?_7a_yaV14;> z-838=6-3ZC)9r@r!gJ<{h|TLOx+y#XsExBa<3;ds%24dznZsA3YM(6fZF34 zEt{O8nY~kRc#fHAre-6d&;=75Y*Q_z+x&t{FRL1P2%gDE$f+%pQ0&Q^W;wO0Z9{P7 zZB5Clxn$W+TvrVKF#MM;0)XHb;v~Zl5G2YTA!N|=WaW%N_{T|9hzr+*lYw3m_gxT9 z2$ZCSZr@bbn)bAZsx%9lWFW@JbORzyH)za_s)265Q=8H;^s~C5+9qR|Nsg>2x}n>O z0_UQoWyTy)WogR^+`Nsmg-8(RP9mB$>}X20)#z=L-L!IQQj2PkIb-&1Wx~|qYXUOJ zWPB4sxFP%t+$E^tt4JaB9H6!?OlLy z^(@@M;Nc@K#wuJZR2vE0-YVISmv5CRrGV0UIV*|yhMYh;feFROIywC)=U|g}vNn61 zJW88%ctXhab8#Qn=PN?02_=bU?{;EmW%YK6_JEG$r#OR;K({>lXb5;ooEO*{dBuhO zq+6UiFsRviW>`F(-E4t$hYDir_$0s|P3cK{Lo8uRq9sZn0GK0*N?OMujXiBEp4i5v z#Ms+3Jp1eiEkG9EfD^P$1-UKyoZz@>Vew$#NCHJ(xMLw3%FykOd@7@6M^ow!f*6&!C?7t7cd;Ro&mWBBnDje_&wPnh7CuWSTy;03D5g(Y0{vN!QoMz7ZBr{^{)E*=L7O zE$utKN`&^)%kQ3A^~22dhNr`C>35teV8l2x76hVBFs(u3U^6GATe@M{s*%(jF{4|y zPXGwv`{{?*l{ay92BS$px5Zjx?cW@|xqnsZCk| zz<}xsgS*)!yL}4}1D^F90MxX{;sj*%PU`8d2qE96p@nX zQd+Gcv~$*eQ1fyh+4ByFIIOIs=Jok+8^I|c;ok(FG92a<+hGl>p}HP zKiPYDH9)rQn5pI7cq0IL?fwu{h5!WUj-5xWim#9O%G{wMc7`OWl_yxWx&rSpae3ohvh zEH;!1VXdXvTp?4SO&Z#ttzO%>u+?rK6ke>D>#8@)Yg8YjqozGh&CwfL5*v30ZTu~0 z%`SHP83l=WCSs3+nW`v@J~t;NxCGrfDpJloC!i?WEwILV_qkiw0L$tGfbPSzYAuG} zDTLoyZrF*onZ7r@AbnN$q^=N-Kuhwbi7L*-axh1(3w_rKIgIKEQ->00KaT^)C6`jZ4&+roqHp9~G zG%1iM@Y5`*RGMWA2%bU&{vhFt$34dZKD^cxfM1iBKEEWd$^ig%LQ~-G)qe-;W+rAo zD+ap?!LDVwsVMI*$h+r%S=@7^u;<8g`RJV!{#IY zMSraGN&8%}cvTOw_ffhY0FIAo3|bQ6?8ZhIdfsxA8*!W52$U4~na2BUSDlS2!lUk5 w{S3pt0#n>N005pSL3kOE1+mmfgt~u{s_#kYUnKfkyd((wW_SEZaON`o56$mbr~m)} literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/experiments_links_subid_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/experiments_links_subid_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..539e761d542dffaf118a5ada3937afb3b24e7680 GIT binary patch literal 4883 zcmcIo-BT3V6~Eo{!7#uKU&@!_1w9uPq*N#z!E z``+$*&pn^Nb1thTB|!qM=?{aK4u=T&8Ygb^hsU?#4qW7T3*~fgtV#GJ`ub}#_51iXLNvXP}Sel^+ zgS{h~NfWtuG@+Vtro~i~D#;{OMinio#F8pi^+ejxbPL|=37S%^5hG#JA%oG}5iO=e zUu7ncrTe3l(k7}KSCmfLb+F@&VDP=Psv`?#T8-0DXI&>O?1***gJ)G;Ws0RHXl%Tb zj#yUO>}+oz)~u0CEE+db?dF&=Jgl-dC9UPhaU-D)t9lfc1)rki-El{Lrx$aR)lXqC zO)e5p9zn%1k0dg0J*Z9cb_mP|PY*o(QdsiWl1l(@wywS*N(LFkL6BIrw`V(3Fs3G`tp#7c*Kky5*+>uOqM8d|`7SJN+>QYNM)P8o^u zr{zF<;&S(UyyAf*wqJ>(7uX)tV%>39VJISw(VJEeKnETu^pPZtoW^H@JL?l- z1%&jMCiDA;g<&BgP8`}&RN6)rngX_y;BiBm4tCdcDmgapj(F?>ImcN^LPL*CX}V$= zjQQcvh-iCFH95p5CLT(uooY|%R(nFRl=d-$T{hE7Ty0mud55eqdDPHgHVRH`F#Zy} zs4YDXPOQ6AIXC4@neFPDk>n&=NjA|;at!PgO^@3FS=MyTl4ZMbOCh7~nmxdx*#O;j z@}#P6%KMArrJW5^-p7I3rJ}NhqMb{%^t1C>4=Ju+g+(Nu*DOqM%US z?Isan;-6<#2v772M|IQ~f*Cl^)(mb8(O%d*n8>7)S{!0=&?Pjc0TyVfw80!V;tFxd zD;C8WZPoO+nnquWyd3$ROtmshN2mVpnd@ZMcv|hG;HklgzzRVJa{?=Zhlx6(tQdOk z680-3c2v`by8v^+AlY(KT6y#18z0XH>R1?Fy$}WHZe05xzyPB_65B;x>@PnGXDVQl zfxN9GPY3>N7vE>lA|39`$D}Wt2%m0rSTQivLk24iq z$}Y@%*TjKy`lyoB5)}H3%5%w}W1d0UdaYwJ@*SGWm==wx)X?EKM6bOuiP#YQ05^0o zW-!|iDJZ2_+#Mnw?hcL*gaF};F*PA`>ZXadft0l7B@EH_2>eWhdF}{xO|$3cYdWSv z5SEXMT9(UqER~-5ds)@(?KA#IW$mjzPemw8JSCxQkW|-yR_ypo-UEP40DjzG0$}xN z(m`}#0A4w*Cy$Tr8v?l-BHFt)cSo+bRFHRmO-KfIrke%;Wu4Y9x?ZJw2QU(N>+=rq ziUKF@_g3eV-dBU2Tt1Nep!3EC%Ke1$nXF%)5$)O%ku>x zMTC-pDtGrlb$+xpM>|1A@~V@;Mj%@TZPW{A`S@9&Ydot@0BrV7?CIeM=)kj+_aI9{ z9bjo#YQY~(XmRTWr^crOoTDlykWW0=fFx4N?FvVz*sj88V(W zC)x!gim6x@V|8#wM6iXc>%i0w97`&xSVB2&e|PH~k|P#9mNeo@(mW0WXA>qWvmUzZ zCYzK6p4zFgZsdXA*yYM50?uYO*--PZuS+1&|v1U)+ z9s9Cyv1q>SRPu(=HfRp;EV)9n?%sH!TJ7tnE!|re%9lN}7RpI*i+1w5jcL zsK9C{Sa`k1(2*j3j*YgTsb(f=*Ck+?Z2yBEIPDMbZDu*@&2W|mwuJJ9lYgPs&Bew-YHt~kX`$-ep0%9s^n#m zM}2aTN5LU5p?BJr0FR!yp}9`z!WA#!qU&J-3LQ-!rc6zP&D{H%Q+26M?F_llpH9On z%PvUg5+T}*At0}FTiXvo3gli@7&$9c+=%daoqQACcJq^;eKM1{pS+vAr#}j}%?H|E zRtAO(S4JZYczueYw4u4eav`hFz#V0fvkes{+$IMd83v)MI}96N;vQ;kRKn|OZD)-J z6mq5AlW@h&Yd5a_d~!ap!(kkmbz9zwgYf1Bcohcn>o&q{0)!ietI%dCyHD8cZ6}~N z!tS~hz@XaEhG@*NMyL_Hq{i`9&ESrG1+Hahpo&3I=TVE-42)`7o)ew;^}!~%IwOO* zD7F2vtX=`-yrSxLR-|B)iFXk+E`;FYhR((C(S`8QrHX3Q)#Q!IS>G3-2cd;6g9)1+VM>?dR&iYH9$&AaYa;_;g(ia1Buab#tK5W4z0A#jC-JF$=fu&Jo} zQ<%;NDCZRPh7|^{{utIl5urO$h8onB6p{|gGGyLN634}|jGW}Ygk^b1W2OZ+8C5sn za{;K`h=bdqw(JtbN-dVLR2dN$YbQI9OW)&8wdpri3lQANAl!*Nk(cjbcN*7klOX`% zKQ3`OPs{}RZ{q?iu^hlfpX7$eYQ$vFeM(kDk1vo7_@OH$g=M#zvmSAq|M~@}L1EUK zn>`Qsd=1$U@rPE#fN#gD2S!;OWh;rl_@^KJSzx~^g=xcD;K~5lNAi^<>URz`;+l>RifVCIq2j*8eTRCqMPyCtZRf literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/experiments_templates_id_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/experiments_templates_id_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c38d532bb16e21f11b3ec5d4ff572b172f90333 GIT binary patch literal 3701 zcmai1-A^3X6~8k(`@!JXLo45T_Oj$Wo0ZR|!(3=AjRL=pRt2FHk3iPI-uwyjXn!)_LzaGdpXH4ZdQ} zy>sum=i_(JIrmbitPB%q?SG%V@y{|szQ+%*`HO?XyD(TJal%Mkh>O<*COEywM5p&L zUn6NFabGiuOCL-9K6fAUXT+#~?tfwR7fSN-*hh49I6g)%{PHTDIZZE_seD#7EXC4H zBOD%^);LWU=V)5xDW)Y=P8D6J%8a7vN>W#;YNT_fW>_$9q-j>Qrp+{`QzoND6FF4yw4EB}EoG1n_xJuJ9R4t;8fXH~sVO?+@(luGZ>%>QzM>i`Q!F)2le2?# z+Ol$du%{=ZS=0GsEM;bU_-!SVQCYW=(@Nu%nN~BZ5d*gHGxU5U<@)bZq4-g_41-1T zF#+%h0>^xDkx4D2moPv40tg=q#wDPkxF2X)JODHt4+1TZhk#bZ%UES594)t-hwtQ6 zrXhlSOwHzWu$o^@Uo_LR&yIkixtk*&jtvh|2iKIYa83bWC2yG&Y%MuSt!b4OoucT7 zw+fKvn3-WpHWm(FG66!1s%gz~Hn{S#ijjxonT>^0o{#9N2tN#f0-6CqBa9OrMsCXp zQE_hIVB2XoRcIFM&>;qPV|KnR)4nS?X!&dovy8Q!N{{B#W9J?aaHWy`}@ z*3xnkP>$th?T{>MhGxmK-F~o3F^{POY~+}13*@__t#_qwL(K(5iga3mC4ShdmLGb6kp-w3ejS64*Uj?eV%>3i7-gic&mHtgzN%Mb>7O0-qYks+ULV#LMASZi;h2E5>iem zNi=x76OE0K%$(#WCRZ?*AH=_q&f*+iSuRjuXJ~ z;VOcJ{pcZ(^od1Kq>*Qcu44ql%wiZ0fQO_(<=6uW!vJLUKnCE)-vhEhwi;TNtd$GP zx4$aeXgIyzaC+NE+PhY6J?{Fd?`vUo;4kM_&p$miwAOldn+R=ZH_r@h`=EFHj#k<} zuHCWAKoN74*_FkDE?cuXmD|CL3b(Aq?6Af)gIkJ`Qf*1sxMlmYN{(TOIELF29;)qk zr2se2C!JEyFp{DHhQ+}SFqP+Z%a$COf^7R|6g{unzMJYS4*&;TxzL;daK*O0`Rp+Y z`L{rzHdfc%4gAp1{Kfnq=2ylxItSJ}2mak~=H8XNm$qu(Ub^(Ow(IWjR-|dE^GWSS zN!t~KcHXxhRP3~p z#`m7Lk&60n>U;m%u~9y-UOuqd()Q@a@{K?0pNH@JHe1^7^9SWSK632Tc7VK9f49;( zs8?dsDf2%EpCLAZy6wOckD<7)d5P&2EJ#jaF1EK&aEob1hB7q=hvq%Ds5$kbibQ>O zAeRF!%MRw?A(d4uH;A#=?ulDF09gv+?AF5%6IkBIome3k$Pbaa&p!R#r%UNa`m+Ae zcpB+m3w6JW1}2PyMjH$kA@fE{r3xmB&GXjrvhgxJP$nI_C!M$8r0c|FRAAk(f$cXR zu4+W#jaRkHbOl6ktSS(Wk($pwx%bKM=hs5-xR#@}Ucrtn$|QmlQ+~9K8hJUk#E7H>~hq{ux>hui_a8H zY*}6v-4yo2CV2UxfyG3%1G22%0(1^LUYF$>?Bd6P;PFBhe$)EXjmXe?WN5Rd5y6_j zH^1Wlvg&cwdL*_MioJ>%s&z1{fWab}5C$g*IfecSb0 zI=oa36PAMjwV8rgdk3W0l~^LRWZqI`EVSsan_Nza;_b%pKPxtf%yly47yLJrl1sZd z2*Mk}H4LqF4%8udzwk3aeoJ;lpFgx63IM4R>H-Vbw*yYM8xZ|%yP+n3{qDP>KeihZ z{YQ60et*x8RieMu6^a22mHlVXu~R^7k*N%xdQj)xsB$&FYz5rwE+FUFFtB2>@^&C_ iD+$6*AS6hIS|U{amy~@^!q26Pg3!8B|0BWP(fWTPRZ$lJ literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/export.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/export.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..197ef6d7a44bc5cd112bab34a4ac2130383bbd1c GIT binary patch literal 16509 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/exports_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/exports_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0022f80b47c77ba94f8391d7bff91a4b87f383aa GIT binary patch literal 10526 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/extra_fields_keys.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/extra_fields_keys.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad389d90647531f473e24ea483b7862eb7884307 GIT binary patch literal 5128 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�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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/id1.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/id1.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e48f17fe9e69b41a37e2bf8c7517bb85180f9d57 GIT binary patch literal 3466 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/id3.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/id3.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51e2655d15a674f866a6f85fca8cfad59ac479f6 GIT binary patch literal 3466 zcmaJET~iy^_3mm{65>O_fcZ#_FJO#i4}v-nJB&YS$JlXQlNP~*8D+Yxq(!VP?aFso zIFKRbse{{xIB}W4xKra9cM@hg(>(T}KcJ7OZVTP=keTGg(-%O_d(XMMD=@Zm2c13l z-gD3QIrmbot&I>EU4NUrWmXaL9Zviqdr0{mK$b{?Fp>}w;thcb{3|k%e*-MgLOMwz z&_)u{N77)xJ;&s%7?bDz7twyMrml{CNJobgWAxH5uG5**^op4-<~74sZQV2?k+Esr zq8V?EW;83!^ps{%HJ796jH>6g&tu_H;27Pn-EZ>#my3YOGf+=oLI|X0)tk#DOgG3@sl?yY{W|pb>cqDSg1Yg-y%jh;g z;PT6>MiJsL8;_)YW6&lMei-R8ssY&{jFTK-?#K!;agKtLw3n(h4+3)#)hXQo-|7ZU zxPBa26P((Nj=|3BhH9G(79>l{O<5?3I%9o#!|uzdw%T{sWVfw?n%4R>NQNo*+Q_)%Q~OdU4)p-R&5Lj* z>QjzOiHg(;*G2-TN9%o>z3-rhdYm%AX}_MB6nyxSD;xnyHu$^y^n~;WNlpIF-q)Ap zb2?zdV?rh_jf>o#uL!9olq8$|)5(?!_IizufQ{tGBtwkAwj#!83}ne%7Wf)vjSI&} zOqx4Bs@X+mSiElBe22O!Xw25Jjlmzy=xO_fT*9nCPn6#WutbtxMxZtc!MC>Jw>P+! zn0p6?@1J9E4s;PmoRDoQC~Zx2Ler|H+BRbt!kFL)AG@W+FjbuJxty9$Wz-AK5v&C7 zSo~bhOshHT0wC^oKM-5(02aufKm6vGf34c+y!x9fP_nW zwVl6$?SppWCG(2BgSdeg0=SFb!0+gf*ghb7)=MML(2ZOPh9$%>?qIm2+gg5~?F=)G z9R_d)e%8AH7RXj}`?9@yY31(MRU6HxOU{Nju#)UbxUdL7J*@9*{p{xe?oz0wxZs~?)t43OL zq?~TqP9U!q80G?3+>tPPj_h&)YO9#yy_jLj#DWaFfD>ezRm|Cr#CZyeBhRS0qUHo{ zYqM4mDB$vg!6WUmt=<=8%q#1k0HE8|H!KFfZ*Kc?{)_q5v5oFCrS3ETZa#bO+TxY1 z#y6L*JZ1!?rqh-xjg)2V59y-ss04#upZ5ie+fzlS8)+ZM?8 z(WcKn{q3jAnMb*m+(YAOw0Aw+`?A?s0o?3PK$f7CMk`GQ7QEq`#m#BC3QvMbuHYnp zW=*=fP*bN6mjcXkbEE$j!7U(troKDqbF@8;LTZ@DU>TK>S4<|&X6lxf#)l{fcJXln}gJT%PBf1X@;(J=gXgAE~ZlL93G z|01N7$|(yNVY7A>Lv4A4IKWnKodxh4vLgoM@OC%|piXECF5KJ>^3QHilsk9Bt@7dB zcSJe98y4jwyJ1=G`=L&hJ6xuik>i$crz9W(6(q%#DSUmm%!7rEkfAaC|5C8xG literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/id4.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/id4.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56f9b57e20b292ed1f1d2e67e66f43108b42a5e9 GIT binary patch literal 3466 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 Q`lTSW&Ah($ literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/id_endpoints_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/id_endpoints_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6224e06b9df86d08747217c19655d915a4f2797d GIT binary patch literal 6361 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/id_experiments_categories_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/id_experiments_categories_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4bc8f1ef7ba8dc52d78f40327f68af139ea6f4b GIT binary patch literal 5397 zcmbtYU2GHC6~1G89A})wasCq^+$8)N6o;j-un|9nCHyQ)wq+76lA}(>_QV;mXUv^3 zkf7|cs?>$uMX*I^gOEy)SnVQJDi3{VrK&G|>0?r8<4$=%+I>NNNeKJibMDy27zjVT ziSOKd=iGD8&v(x~ca~~vB?6`AFQX?ehY0xrJH;Xv8cXj&;~J3(BeEcSjtETPPY?6( zrwa9Ypqx__lf7c}z@sBI4wKCGA5seqiWhdTc-*qI-XFn4aE3_nV1aMl)>H z)=fi_hQ@V^CJSRUsaXl8$2E(p=`>YOt9n|Er!}e>$*idxHjEodn$hfWGilK=lhMKw z>n)eR#w=h7%S>pa@o0OVHCUT|W?Rj&7EugPNf+)z*?U zKG9FdZ98lA_w}W8dpsA9Cd^Eqbw*94G}fzT^-?=wCbg7iM1f3tgqjZ~T>ag;U<|VK zSLk0OBLs{`&~VHvdzh~i%m#nHsE3KNDEoQKFE`484st?ZRU-kpx`S*haAegZ)yJC3 z*}H97dWI$-2g~}wk>CsG)Rfc6wH<`j$aPTH$|0!hav17*xq*dKRgorV#o^?@ z*{sHN^quuS*eYc*U9-*(~C5e1@9Q95G?0O~$G~ z3KoEBFj2HU8p#7c>@N*L1z;A2Ng7&i;XUD*9@6tNEX4hU9IsE8xD9*au*h+m_7!PT zLQ05uCU-1j9okD(ngLDI0Piu~0Fdbhm0ds$Mnp$cxE6ketKrlpb=(9Q-B9gvts-8> zXKCrNr+Qi_7y#Wd`!a^zmsD-F?~KV#T3I!r^=Ytm#_Ti7X;X*ZY1l$0CEsp(3XAGtJI113~}x zOY}2)BCGXNK(us6U>KF*Q40?XHKnW$YVLGrS; zhSqbD#}{y+_xfv9goFNa?6rXrir7QDJ%c?QVC_)hsq++jtt&4DpT`~&^N1Dz_+BHM zi6O*b$Sudp_ibUU8>3$75GqmyGjB#XZ8@ z6asQ2$ii&Myr>HQG^r=-XHG{%1zKY15LDMltbhoVMiz?Nmh1-MAEZR=Rg|KA*1&s^ z#WUzs*`|W4-SIe8n)$_gk=6d%{t2g!Q`i+ybornJ}K*hHam*BW>$j z7vK^63D)uATeK2Bm$S)MPr)j_!AEFbE(F7^#ZYW8h)=h*Oqoqs7ryL<%7mZw9#rSa zgVxSzduH$TGv8Oww{Dqh-2(Ye&-$5Dx7L5Z^{#Md`yck)*>i8x&e^VA3qKJ=<1x?F(T%EfuU%@9fvKR;X@KhvyS+ID=Lr=U3EX*HeG9PdeO!h$pz^H3;m zvclQ+yoU2fVWRaU)NiL|hUV99pIf{AU#&YX9=x#sLDP!q{r8&I zUl@20YM)+vyJZ3^t1?pJsdXwHG076!@leLa1{xEJc34fH;54%{-_9Jn)hCSQtHFiDZ<&K*oJ0eViPah~?VXr!VMbS=yd6spsOY>`(X03w?9Sj@se%H?V(5|`Au6$z~ zT5Ia!)QtFD-L1O0P;@pBecoueF86m0G~m`D^dBc=6DlZ7ZY%-#WeV~y0;uF2!hQ}6 zD%CKwSF3?EU*KF!Y9Qz|w*DhTX9JYW8W9;!iZLDH9}*bK$?p|#01ieP(4ctDf^{TC zfde_0#&(UOpjd@BAw?O}nPsQps&AO^x(d8tCIE+c>N>R;K=pXe))WlGm?$}c!l^#t zUi18xWPeANg@sABgnCHz^2RGwXgL_~fhp4~DMnbN~PV literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/id_experiments_status_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/id_experiments_status_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ad0fa701e55ce01881076fbdda3aa830ae0b085 GIT binary patch literal 5313 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/id_items_status_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/id_items_status_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50f25d5dc05506b5048741d76d236ffa5f7b561b GIT binary patch literal 5193 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 E01)w)oB#j- literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/id_resources_categories_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/id_resources_categories_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf83056f118c0eb341aff1ea4817de2a322bda0d GIT binary patch literal 5357 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 Y>i$EjzbDdT-=rXP&H8^N*z#Tf2aLPg^Z)<= literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/id_steps_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/id_steps_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58aea20afdf89003c01a05dabdb3aaabe3c7f016 GIT binary patch literal 4339 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/id_uploads_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/id_uploads_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6b6490d6a5250a35cfa5d2681ae1e3533cc7c75 GIT binary patch literal 5219 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 SFTAr}SKsy7KXdqHz5YKr^+uln literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/idp_endpoint.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/idp_endpoint.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b19b0661145d917c0a687399ac3ae2d1af016f1c GIT binary patch literal 9557 zcmc&(eQX>@72mzj_1)R$kMo_sJ+|}VOR=4Xq#thjk&-loq)ze1Z7RDxukSX_CU<++ z*>%#SbxHrB4y0;I2{=@usZ>NGAyJSJAV7#ekShN2k+wdTNUc=Yw%`{b&CXk`GB!j~#i6jP4VUkUdWvAg6Ya zz4`P^PF8hESMq8obmX|Ak&M+wGP0JY%9N}TDVrtIDM`snQ(2kFYNn7^R2|yY49Us* z@q9)j$MTd|Lu}Q|{$;8`w`9j4A*7F}`RAlzvTxV+yF;PF1zE)@XazYH2?gALFyL+Vo(&s8Zjh>#fXS) z0kKc4YvWGvG&muM(Kc?E)iJG^s2Pp9hcwG#eHo1)Hn{5HiE!0#8p~(|vB_1BOhl@F z6Dy+;#Aa8$cA~cGH}NtWK}@*nbrW?}ziBC>5yVzkJvtGs`b}FIjUcwW>h%-#Rln(Q z(} zXC+M|fN*I>&l3QPgEFEYmx+Zcf=II80;UTzKTW0FU?{XV4;a>ooKbZ4f!SY9QfELv z&J2bOFDQlK)pVK+8XhHM1Qac$W%EXGN>MY4I&BEqe44465w@CAGgLJ~X(}V$Q<83k zbNP&NOkov@sHHWSp?RQT%p#c8Vpa#)NZLj=R5%a(Q0-T4KnA9QALFu6G83x-`du}o zXNkSD38zJ*upzK}Hu8r|i@aAZJ)|u0ohqaI_GQrZAm$huqGJ}UrV?NgM zNEX>+Y0S@Bp2#AvW=nvzOlFaBvn4nM;~p(!Q3@ou?>)FC{eJYEE&%XL7Ez4}{iIdpAB?oO)*u*4s+q+Vc;U;w=~Um%N&B3p_NODWR>9GdLJ^?y;53L8L+OpW~M5 zx%${^&!2yOE=oI~CGBW2R2&O{eP2Rdgr}L9cBI8yuo()4h6@rHJdnd}v9`+D2&|%V_hd1=JqQNrj;O|H(>>@fiIih$t2^v}M+LXg$!&7lXBgxYS5DV=_ z0l9#IvN9UWfWi8oL^`yCOppMM7tg=AAhfSV2ik3>4o^Y>_Xp840#(-A~@6@JIa3wO_sB)vxH zN&H|RrFm)u07^MYXRDg@ntH(&vkp9m{At+iS?`*LA_qj7b^s}8A7m%tr|pD{t#5nB z{MYB>b9G=guZ6c>Z|o@5KlX7$;`R7^;9A4bir?E*x5RmC>y|=XOV_KBJJG2>Iyz-- zj2luaw1+55B(}aACQlrOQwJy%1^0={X}w>QWg<$s?4zb{1gDCb+%2@}HYQP_PUs7+ zQ7803j3&1_Sp&?XyxsaVdwzC7==gu>)9)O8T2BCYdiyWR-P9y&KvR|08~ql#L^p#- z&+e+COID}rD-+#<>$ep%TuEDnm{Z&j4dr^nnzupo9KNceH;vcA{Y-E6n|c$x*08-y zZ(7N#wRfU7-*fcFb|W{WID67M93{xu=%Mv@mD}mmRs=Yepv%z&B3Yvd=y;d=diDrE zKnc1v;idC0EeM@!H31DK+gWbncf96c*zUTjL_(qUWME>_?!W}4U8~w%byT7#M(6;{ z*!EFS0A)T3Hqb%HeuQrfA9bTGKF20C~`GZIy7D022Qc)5aru>6w6C@DtCf zLhGHt?3WJARu8KiLfH`|Cu_QtE0EL2WwqQPJ}qg)>JH+0>-fC4H)aLMno%T`elMPT zjJO+Qt7E(m@3b>9pt0M@bPL!sqP0QP$aV6FhjMy7sC!9j=)j#yR*Y<-;BR1h`W z$j}u)i=${NfrdL>xixbQ@-cq#Wz25-)cqR=S+4%7PWsl+x`l*HfVqY-5$0;BI_`Q9 zdjNR0A%+qvgBUi@-H`nq3m6Sw3oHy?G3P)4H{lYuom2U7Xfo5Nb9l5{IJm`tNR4l` zZkOysXA}2T*qCSF%R=9{6Mj7Eu@9%JZyfh*md1SJ2z-|8_vkZXVn<%w>scB{bzw>5 z+aN4yQ`@5+ZA1_B@rU7<9JL66N_0kbdWD^G%r}Zh_=;p-7Fa!HpeOe{(YIyE9@*&; z3ghUyvE-U3-1WdnXf!L5J(As11rKjS=ycDRhw<}cjtg^y8&B9>jAKBGrSY53s1xHi z>x~R+1ia1Q8XbYL{A?_cHI6mLL(I*0cFQP>pqXJeKq!Q1A=+M$sjlFq6a15mlGe*2 zdWZ^?#L8D8yW|R3j6pcV=GKuLYz#0<#9l?R<+BOi!(2QgMo`bEaI~u)BY0fWBweTU z5%?;}8~pRGD2yTO&PutdjP#JP*}WxMpAYUvk2I@21O=1q-_VJM5wUaJPo8@3>%Xd5 z9C)-i@aVksmU3Bn^W;L;f%kdHnA)%rtMmIT^iat!M&+yE57rN);l;No6@0EIgPk5r z3ce9`PGgf`ArQI;J_P~z6kX1_WI*>qJKYDFp9kjdhr&7TdZKGyzq04@>33@u6FZ8D z9T1c4+j`}>x3|8#^F99Ry+3{U>ciLW+P%>8;1b98K3KYM_mUT$jPGPE+?y!R8#OQx zWrG>D)_qJ0LkXG@oR;C1Ql~~p(G(S&6g4dyzO16bjZ01{&_{7bk3eSla1{-|*$Yr> zGgIuQh9Y#50Tz8R0^mu{WOc*G`s7oFpG9B{?@9TLhG8-|fk83@F|6CNK!LT`{{lko z1IQp0-q17`_*eu6^S#B*_kNVP@BIF`z1L&y^Lwwww$AOl9&Mf9{7!5! zx}_N1a=p9nov-{QcAyk%g~R9O#ud&>nl1+3h};mk#@6}fD>aJ^+lmd_O5K~@n!P;x z<~Q)&^@jHOeedjCZ0IjG^s^q8J$&b#7--s;t za4q-W=;b2u@1BIO!~Ml@f2phYtrM3|{4o1^=%TmO)pt>QBfRY8y6;*FaP{%IDhFT` zAhY9Ng92a?ax>l3h9mSUlC62RMPkwSLANCU&lxVuAW~F-MY1oa&0R}2Z*w5L7AO>e zN;iT9E4KCsj8nOx8v$4-=&n3yYPK~Xa?$3UVBD|q&_4qV(3x7p`8A?X_1gW@|If z8FyU3TeRu57tX)%?dpLkXQd{AxXfzs4C6dnQ!XRO+gERbcp8pxy0W7=ctu zeh$P@7WFpUT2UCAp*LJW)T{Qz=s+<#P-<#H;XuspivP!TZ`T#0gA2l-xttE~@R_rm zcnpK95`Oq7$K8ee@MpI?Rm_y2{Zh=%8}es=RjA*hX;H=yI^zvp=sMhm%nj z+oJ54-3$cmddR#8zzvTwj}=`R*A+10*L8i!!WM{+WN^ex$png7m2xrFJ3I;K!f&%zz4nupgxSetwr(1@yT)S{JCre<_Gg|-$i(+t7ds?V7BRRK-b z!FI2ITW#(v4Eea7(F|tCvA54OSCH>%5QSZ z9FGq#uz`4hl;#{<;)Yw*P>L|s!N{LOScrWDE z+Z(Zj|E{GST%c~*6ZE&Nc%ig}CAgUi2(LW-^3%&6!5_!==n|IToQ|}Dzr&)161GKN zdFJJ3mOW8_7q&MoVQHz?qV05OJCU~bm1kdm7HJ8#$B>pdwCsDBg8<*-Sg)jBPAz+C z{Jluqyo4oS$(%!v({B&bHZ1xRMSlXR`|(W+QujO5Y&6z0LF)QNf4u0ABlQ-fP9XIb zhk8SOe;#l3$3MTv;~)H7@c27F7ySOAf7W^YJ?7%!y1~w?;_^KWnc<-_MF-9Zm^Okf zYQ<`Uqh+G?Avy!3u-Kf|2N`$`Jii(fp32T>zM_dw;lt*Y9Ct+|yVk_hE?${pK7k6d> zle%?&w1I{QQi=kN6i7vtAXQ3!wo-rgM}PE(w?Ms}A~jMXRZ*qN#^is`xwA9-@IvC` z%D!_S=iYnH{mwb}-m~k0fR{k(`}6ei-?b6)IaaLXE)>>xLE#D!2_+&YI-ch!$G#5g zU|%P7hDk3Go$W+)O}TbD&2iK{=ZLt^{@1JgSe`j}^cCUA0r9Bt%u9!bQ#*wH=~ysq{&COgOM}^m|_Kiy0+_ENB@eCY&jTeLg!Ajir+#+G%-iPNCc7jB1x->9{hdq@qCP{SqY~ zkD2nDc}=0R{sD)ZI7MLd2yPs8iVo`Pf^8FB@b89yr|5}#s9UTNd9haXiaycLT0CNp zSl3RDbF^lP7lZ9&XJJxWJ5_rmRJxp57VFDsc(I|R?wj&e9n)Aw!;4KNb^nyV>X=X& z4KFsA)B{t2s$*KpXn3);q+T~wS9MIdjD{E6O6tL>VAV10r8HtkJE8UB7RVdKPRJX@ zF36k2ZpcHTK%3_RkzS+ra6BWXvoxlB*$7*C_Qd#$M-Pk%Og&=>SL44BS$YZ;;(&iN;`KX_f#Gu#BmpHeu^Q-dNe$^)Vtobk zC+0X;S)b)n%s!9RH^I$7`B;6z=3>IZT7(2|(>PhnXaWUcX~M-?o=z|qhD{T0*78yU zMPzBhGXrxTn@*s-EX{FqT*Ps9&_-I=F33U>P)mU0nN?F@{%T4PO;aC_1PrGH5V$17 zARv{2P%l-Y-~(D4hNhB=g@X}@tLWX5YD(7A^wF?HY7CdABxWB?rQxoDr^94SjwDn1 z2mEVB#jwF zG_zpvlBA|oU6PDOd;6kR+bD3MEkU+KK5J?{=eoe>Lt*&T<~w`Nx$f}od7&S_o%xP# z{D$*=L--Z!eqZ4HQ~8$gg+qB?-T8g_*7gg}<$bL=UteB$?2f-P?`zNb2J?M8?)Zhg zuQ})I$#-qN@M7NAne#>RgM04!`&OOAKfDe+keIEaP{A@&=yoVvArs^Xd@EBwiEw8V zhZHzo(4N(}ke-DS7<^II%Hza4Mio6vQ|KbT*^n`+FJzQ4P%+(mi=*|x1$M z>mAF;;IKgcO$b$#X`FV#Y7qw$iOHcMOG1fYv>O^;f`1K78RTgsp_X@eQ=u!O zeiORtgcUkGW@3k8jniIW)WQyhDZ`E(9(~ZNV2_PmbNHRw?}FWuja{j4-86`s8*HIj zFhe}-H=v1!h|y9+vvh?FZULHD0oIjZPcGQA%=c^_*hL%I(gmu>UqrZ+(1g0QrOMFi zn4|FHbP%MlFh`NgFlTp#A!t2|J*WZ9Ub}|x^6lRR^tWx$D^Ad_XC6FMsngx`cnf;# zj)m6T1cGhAAFm8XTM_??m41OcQlC3?H&IP-d`R>hwf7%AWIDHk#i?|obtP|S0aaI{t9c|O{ zqacI@G>TdVGaj*V1Yg((V}b=jpc3s>?ODN(Ot_BV?XV(QF`L3nahR!;PrQM!WUXw^2!%;JpI9p4 z6T)q<5~^=SvR1NYs*vGBcn?1_;b8K7M2L?FWD?&WEKTC`!z?|VBe>xMMvqt-Fap`K zh|y74%gxq;y~edBICyBe&JG@74=3}jWxl>4RFYAsu43E|{)D(1)61T5s1>*q>(4=U zg-jMS0=W@6OImy1z&L?R)V+#i?N2}S122woqXq&ixY{j;Q8O=VvaVCQ8%9MqgF91l z!8iE52{}0vm!C5Fiq4@hIJ!5Hj>!q_DJYmke}gGBd?PH8KfLnk%YUq0+5T*9`?FW& z>*_W2{S(VwhyTh!#*BuoS6$lIVTMX+F_2P4`v5)I3n%vCp5XUUJMg%pum`U3FL5&& z6BG@J?tu)%cd5FPEZG721MJ)j*=_jOo`7tL+-vQ+s^56#+UbvLS6X-ET6e%Ryl?2n z$q$D7Y(h6&Y)(!x+^6J3Rxz9>lm!hVQW!?Do~x(?M#BcE{{qb#2FD=O(a?0x^F?d> zdyBtbym548V0Ug{_dixK5lx(YV z*qUqD%4S$|aLrGC7HWI%`FEec{K9&T3ukhfGp+iGFmOq~>|g64;U^yS5`W8YR9N3P zhyj$Y-s{J&9seNluJ@8N-_>_XyX;$YlJ0G*9#Y?OF0j#ugy)rsf2yWB?-Tw*m9yQp^Bd#A$dk8KBaQnheDKld^8AY{f&| z@PJKXAho^>I%xSfaHXNQTOwZsn=k(CS3kQNzn-|3ct3SJxP6)5zEOCz1}1zj6j?HOU6N%If(C8J8>ttYOQ17e9>!`cyOA9*w?Hu zlh)^j^vrQ3hQH8I_`T*NgtiYxoOC~M#EcL{MI)7@TV{mFaKj+@83q|F7@gsfB;_P* zMhSRk%YT4K8-NVKLyKx#32w^;x8<9{xHXIC7jL*fs{61m7mP0R(TzKVi!dnh5d*O? zZtNH#+fW+r?69qg50i!k?@^*#guaHHRPdZqDtX41{~;w_Ggwsg??GX?a7&5=D2qDa z9g?!w2Og;AOOyqda1d?54DSiWSiKp#$9ql0GtN?^1@|>2Cy@iMB*Af-O<>tCNyu=a zCn!m?D%JD^#JE#w=&k`U(lJoJXJIlUfDTce$?A%PZWVqFBnDqNlNZd0q(@V9aMKU{ z8NoD0rsF?Bo~JOI#)+CGut)f@F9ttV6jsq-VF?L3FvEKXQxTTo&S)9X&0mr=httik z@*c?QNidX$zc7T52l6c);JnrXHO-!-7gj?g*u=U9^Bs@nTYB?dI|^M78bj_URv#mt zx;00QJG}0M(khl9?C9a&diBj$*BrdN1>1wGSc17s+BTcE4QXrNdhN~Eke1C+kF;T% zw%4ZZMcT#{cR1$`BlR%$v?2AdO+8>!4hOxYE9dS)>Rs5=jnupDhuYjN_jftm(fho^-FcsPyGOpN zbGXg$6@viI%UQ(aWylN%Rp`@L@R;^(B2|taT#ih|dx|E36uqR@2N|689Jl7-IoEoK aaCQG8wVxC31J~6z`hwW=x)1F7fFlPBNrW|*(AVkT$0u=WfTt}_Bd7=aaRhgrhXr;XU? z(@yNoOgAIgTN%MI;n;0A-XqQ#Tfn*SUypo5nmTymHGX7BIKl5beuzJ_lRpp-%|+#y zCTU7M=JA}ERa8Elrtx7}4H0EZR(UBB;iWT@5|O4NGB3x%iMSHefF29;QCXXfhgE($ zPWW^en^i-;OjHod?+o%h-^0h^r=>xDX!nk%J)UC;Ifg2z2|2`{G57|7aYt~6$Mdor zlZm9sVSZ|Uke}7GggQ7dFr#R*b5p@kJUXDBm1bsSvRz6jRyh<8%QJE;2yC8jaOA@w zWBf+$PFL2dZD_;^28_p`;fP(Z5l07@E$^Qr$PuUD6kI}uzzJ@_BY1^M0jVybPpEEX zPO_w8f)jkL%{kT(cDkT(jwq-mxq(64ic!U=VMJUstREzH=$ zso`TMh6Z`M8bT3CRe4wz(wr9O0bv$2d2Lqa(@^9Qer78yganDt5Gfk;cn-t?_!=*V z6^*`N$csv`IapNlL62@%H4@--M@)*!ItOb}(dLz~?vbOg-b6{$i0+xj#&kK7DZ4dU zil)hNGNXj8awuIU6)+ycVTLP!pqC+D%qlUf!mJvy;gGpNpu)fsVbFW5*;wjv*ij~e zbeaUL0X?gR{4~+FwBKRCO97`Nr_JWTQ|T46=F%%>O{Pc8%%)e& znog{k^Ql*b6?Do`B_?TcveD@cxOImrN2WK*ucF1lX&XuZ;XpK|4TL348aNv#r__WL zk_Tki45qcS;+ePtwKK3O#0e#WSKgkOhfN`7R>gFc+D#o$V6ll)u-bx&d7TqQC8lVi zsQXPD2Tjs0&_aC=vJ1@phL($t%brwAJ3OjWZJie#UvkX_&(;oT_7#xZyO6y#Ro{Hs zooePUSEX8efz8{H^me5>wp>1zQ>;&V`BZ!V<>4G^n)k}F6+2Vey@mh@S<3(_Sf-1n z6$;mxQDy|5`Kgx)unSjTmSOKi?}1R^4~N09~B&;@3tmZ_`)Oe3#n2cS97oIv4J0nGuFc0~hOwTxzXoSh9_~@LfQP(~t^OM8zm^>M<>7E}T z-w+|NHqoR38#O7lql(7ivkXgkAdJC(6>Uw;Sy^*w&%N4BOYMj6)*e}^JOZ%4;xSBX z83=f>yfLi(!or&AkILh1D7^=jM%jkt{8YMp4Vn2jmKk-GBu~k zJRGtj@%Sma)X>|}y|WAwH{M$w7V)%KfJNN<^g7GuWj60Op#u5fG0GW|) z05VfA?5%_gCEGxE6IE!B98@8J;A!Mn@P7?!fU0_CQ~wiU=yw)|GUxfSYL~+he0OdD zLXXg49)vJXQ2-(QqRN6$M*8Q-{df@i%z{uxT%mQ!LTG(^7zoM;HxQJm7j{+(K|5fi zCW6o$IS4`mc^a}mVIhbaT~d#CIQzAQ8|%}rtghu?gOW;nosIXEhnNN&ZobpOFK)fo z+AS^Ne*t>V(e2GkZ!U2ikM4m!w%}vQE;LeE^b|LXfgDS&0UWDZ*i9+i;K!Y3se>dlCTs!2(bwUQkx+atMORu1sQ5gjd3)f%FJ{<{_yO&5@5J zjMQZLo{aQ=BlqL^p3g1tWW*I3s4RL)n#2H6M!tcfOuewbQZRZB25Z6yEs_HxB#`GJ z`wteL)cs`6>zM#kS!K(i=h(@@C2UY9xDLm?mP-7CDGP0@(}M|FBRTF&s3}Gav`2!RyQp zCdQ5f$w(u3Ld;9u7~OK@5us`Zbn2K_K4zFXcr(#6ZiRKnY`fF4Vvccifi#Ue#_=FV zli7}QhDn0B$T)7fG>s$rX%g60X4GMFo4t;t(3g|;1-8b%Mp=kcIu`mzXi(7zRT?pG zxYtO?L{soi5dQeE64G*_poj{z#MUC#>ljY7!Z9IZ7I@X-NUBKGoCF$Irh!mX)OE2i%nNx}JZg5W|9+D#J3s5k4 z>R4DW9U$fc^Vw@(y!uD?^7j47?fVy{o5~I4!&6HghyKb!M)zpiUGc&G7$oEm7Oy&r zfDa}QOku}XGzmUS8DN(!Z34&eH=rv+l^}>{vL7-Sy+hIDXqExU5H=o!tQ7}`yTt|O zUQ@@Sc5B~_v!A+`n|3Cfc0v%lXY;MoA8r10*B9)aXFq@O&Wm@q?OE#DyTY*DdsENt zS+T>Djyq5VcT~#jx*Iwov@^XbeeETpA5!&-85wSn@uEsmm6)nYv5>4gB8sZ%_NbH~ zFQG;_S-JzKPK_d0vHk9tfgh zG9uJeY)$@5dvWMr0xR4c`0FmZzHVy$;M{xXZk<@}dp6nk>_3{GyY%wK1NZ9N77yI5 z-+XcCp08!G?{@vNuRrPQzt`Dw`=x)@A4=7?tU2v{wQG!>ue<8HR{4-)YFic?Zn>BJ zTa*5+sm|V;=Wd+)@J(#H=Wkmay1i@Jza{D4LM5!)*oM9L>svlJ{O;jvN7pJGD9K?+ zTB&6CzN^}`%GEBW`T2+4Ol9Nyv$q|~-oB)_FV)d~^W=?_zl^-=xoS^!^juZ1c~|XB z=e89WQ`2~{s_?{!)}tQ$`%nNNLT;pWy*J`6FPUr3^hNZpBAD$1;I2T4&G1A{zzjiP zlKyJI*sNsZQY>KCU5Ny6X?jHhE-a#wW*|0i)7D+EoI#xK%bqzP^y9>#tGmE_?Q3}F z{M+Xj!#5*0A|J-?`nE4|+Y85zYk`iv8w&K^1w`a0b8K`>%?IHoWs+(+Nq@pHX{bC2 z_aHxlH}g*zct?d}&by;BNLx{1++_i2zPfkbxb())&nON)oWP!u~j#xUD(Fzmus3x?|rhF-GcfbK9P z3&l{BLShV;sFCDudeBDK7NVgsbT>?p|N2+BpAUqI5aTyN{7%xDE)%L?Umqe zY+SB$SfVi|8YZZ~Dm{PEV>^y2zzwHUpc!qAAwp2gBZ{!S&PA|XDT+9Xbc;_EY3M8h zH_fp)G*`d`#Y2F{BOp$%vf}0<`dN(a>s)$|o;NPr-`>D)0E~r77r-P4B6#^i zPNK*L5!Na!_7MGj0gcnEpn`%7aL`~3PmBPkC_>ArDKPENm{ptI$*piM$Z8mWBY4zQ zV_W*Kq17m?`rQq#3rAO)8Glo%z9ZGxo&Ia!jY68?VPlgsu(FeJRj=AOXX~0BN-J1` z5T48P*7#4xS8ZN{?q9*uN^6?8!{Y5g-s-o+pNPoYjr0cO?Y4M%in=zUe?emN8az; zzw_PB?|kF+>S~!lY5VK&)eF^xe1{#c_zR8ox1ljh5`>Y2kPt5jOyIT1L|*%tZwqN9 z312fwNSCFp=S>tcuSVw&uRvWU}d!=op9Inz`_IZ1G0QxGc=~!T8fTL_Rw+L z&RRX)-DA2vo*RiL%}lp-LmeB_SeKgBi|wSD(#A9+4$I`{sCi$~)!(IJp|k!OG-k&d~IOa=;OlkqMC8Pra^F!@}I*^DY0?p*Az$z{W6BW(maDf4P?+8Q4*fL(46^CwRTVnsjmJm=F`EIyZEpT~wtR zkS`6fG^!imQQe>k*L!_2pHra}M5s>b7;72bP;Ha30C10qj$~=+QQooe3`(6V-5JB~ zPN}xqeZyqetgM>Ux-|&PQTv86Vd~JEfbcXKAB6bm%1%Of8eUf^bh%Jgw+`l4^pr9J z4v1$bouH!VhHfj0Q@5c-+#B2tGFXj3ZjonA+h(NShE{g$nvuQ@Hm@{p|DtLgW=OJV z80cV|o3R-hvt)quLtS3lNlciUIIqEVLbtjGq2?&`!1pC$l;0t_hiP_>85k}yI@dfC zUa5*MRdvF|O3k@{N1N_7&IOjD-Rpi|T{usC)#1EMwzPZ^as#30W?&kG9}k2eIBk|3 zAcimmLvHCWLWeg(;01$wB5m}&mgnp`^4=c_$-&NS+fao!J1BZVVMs$5)4U8wL;PLE zjyJ!@opM7B!=9HRcy-;95Sqz=5C^IJTcaJ8IT~13mO!;!qYGy^+&xm z8@2a<6gZ`TQ>mQj30^jF1lB`!-fW4S@Xo_Y4c^Q~?VaRtD%0T!A%iCeM6SzHuBA5G~=`xQLJs6b1szXxQt1SkgJiSo29dZLC)iLqB!Jo~hR79fk*=Tz9Hf~U=k zPQ|!tskY4+Vs=b$gpW&L(Fq<+tC^9MdfaI*!N$Vw_|dePRMXaRXt=9B1RhokkXz(W zAAR%TUn-ZoPAztwno}R?5A=uE7Fv4$CII2Lh9CHPb$1jCqS+kk-nl5T665)&{~hwTJ12tVsxAh*bBQ_GzF_~e5d zUso#k&d1lEbbfv48)5#)pHIx6SlV}VVb`%d5n7L}ymK_~gPQ9dtA+$b z|JbR7gBU-|sV?L;3L>oKRE%kmpxVrlbxSuaTQ!oJBc*lAc6=E%%eJFL=q^V>CpvzY z3#_(sBRuP27&);3hejvBG%J_39f|W46vxlu(eYi=CM|ro03xBdD9PE@ZuWIAth2ra z0=Yo6ZYJ=3Q}dV8zngx1X}RObV#kqxG`(~C{LGov`fYP(mg+la&aOtb&UHMkUykfv zjObC-dcGRvDAFaC^xF32MB(+=T8Xi|JNB1s9_pa=0e>DAI`r$8e zZZ*1X?(EY;%h5fH(LJ2QnkY0Jdse^o%M14|+`qV9At5Kp<&+N*+Hu#uA6nZ*w!HhY zm4q69fAwkma#iPIRp&}e>!Yg=uKpo?PrmD0X=%G_-LG2nk)8YU0aDXAQ@t6*(S97o ze+mrrdxWkJ1m)4~?Zr*Fvysv-Wr& zxc05k;CUS0m9pY#$FB9)^qy-`h>%LgtBDZ^}H~!ExA9NV}dz z>h9dUee*Zd3&HKKq$r(Nihde~kyju?7%HwSN6HjvGX^RC>t5Xf;dP@u0KkZxB`D4y z>(NK)h-r^gbL6U)#Lq(pAB)%FbK@MOCHMyLdx%*!-cv=H7u_4_hfVMehyoVwofA+L z?K)VaGzE2s@I%Dv0D|trOVzv_*}oXszf!jaZ8Lp)`mz73@RRUjB)$-gZ#EI0!kvkE z?kpJ;dH~4wp*q6U-eNGmNge)0g(}Sxb_^vc6WY)=35`P*F2!U6;G(YS?-9BXq+B#G z3}yj5Ut^f7#Du{$YYKuS<~L5T@Wf8K`C-7)Yye#s^m$k!oHIyr2s@4I8$fdW-#}6+GP8jH zDO`YQkc*KRblkI;F<1=9XJk$E`Gfgj07wm~jNa|Y`^1L8t&5N+LT^u@_cAE?cK}oc z!fRrMfBU)*T6t{cYe^vV`ITQ?SrcpgEjV76$JUGXt^URrZ;Sr;i=gP=@gnH=cmEI; z{kvRoP!fQ71ZQ>#h$AwMwP7RR#v~WBOn!LOT?-#)AHY()+7|ACCrS|30zpAquO~wI YU!?LoBEOW9g0Smu;}7tqC%C8n7lRh{W&i*H literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/idps_sources_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/idps_sources_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b323bb54204111880f559a4bfc9c20b58dc1b3b GIT binary patch literal 4474 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 k0l{%ZecEyfgM4!JeP`U+&)e^#A|> literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/idps_sources_id_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/idps_sources_id_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..027a985e77b3c3d499cfd77b04331efeade37e48 GIT binary patch literal 5006 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/import_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/import_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf700f568182bfc92b3562ae334e6f907b39b761 GIT binary patch literal 9815 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 W^KXpzOV=eQJAAG0?+iYv0Q@gfv=Gez literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response200.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response200.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e26c24d175ae6080e895d757383e8793c355cf8e GIT binary patch literal 3609 zcmaJ^+fN+V89y^Sdtte3Fn1E;0~q5qVxh#u4)UdTj2+iCX<1N^HtI0!9+t6pXVzzC zaUde)sj}OLIJHnfmTD}ya*!e=k9p`H&_}3~LZ>`LN?xqK0PDQ>`_AmFF_#>%-#K$G z-{tpR&Y@6Q879!$|1o~+Ss5We;)mD##X;d67%Y%D;Uq4_sz{vgK;RKd!zB%OBm4Zz0USZ_FdjTwwtEr?8zE-PfD}3p1UT$ZRNBi z>tPTmllEP8+SK7|8Un`TViG*ootuGxF}zQ;_$d^ydUOG(%3mQG%gs0;Rn-mMR#m5Y zpZYOx?KtRTVH(YoAC9)(Q@#&17trw601Cl`04M}dEr8bzDS?|r8%Fr{v^FwIhLt^& z@Y!F4y@tI1cS7=TGS{96di%!Y{vt0!NkBroZB$8!G{-M*{bX@XYbGR7Ui=`5N^caG zn#ri*?e?UO9qEJ(H!s4Oh_`c8iI=37xYiOlJzVYWdDZt9heb{);Ivy$j33cF$t8|3 zNYr?%yYz&-0ZDb<%B$X!d-swbRX>_j0n^wE_v3LaC<{&iLtk*dH5WMbD)bnHf`>NbxSuaTQic(Q8Kz^JHD)z;}{u2aYsR4I)0Z6?6&d~qKI=0plE<&O>hEG z^70wmQ3Ov(b^Oy>CeIw-Z8l>CUY96jpBkFKnEUJ8 z^2mC}nYE5H|86*Y|JuDPo3(E)UU^>Id2ett(zMv|w01pmVl8rF^H}@S_x@9ReWSLi z;P-VLDG(p6c@TJ5@iIh?G%eOGm#tTyTB|;_aqRfxxuv;Bf5f%T>Ngh$pPpW?KDkzX zQgGOorMmM!)HZ!_R`<`kX*62fJ)1n1csVROca}Eq%f}WDm*mCg}US7DL3xwJ|2~LHyq%5wT5dLjX&%fcGs@KNefE{1Ye}) zvrq1S@|U^Q&|9v;sHE30`h~*dFnFzyNQu(Ey=627My26ZbI_GMDjhUC0M!}G>aG&c z^Ni|~bi%Z!s5xt931 zyMQ<{XB-}FP`ce1awWd51>DdsAQ$)`Y{iVU+JV4DBT3tVkfao9iB$DpQuZSWzf>+u NQtM*iXM(+u`hSUlB*y>% literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2001.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2001.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63848b4267f59dbd3e59d631301c25a7647eaa4a GIT binary patch literal 3619 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2001_items.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2001_items.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f224672be962050fd531e65b6df9984350be80e GIT binary patch literal 5249 zcmb_gT~Hg>6}~HJg^&R8|7Qaiu#IIGff*dz8vl$F|HN@k8Wtv=f$6f67Fdv0^4%2< zcu43>C$-b2aq3}$>uGIw+)0?pO!L@>PM`aTYNx1MKX@j2@$?0Z^WJmrYGr|qn>xJ% zckj=+=boSMo_nq~%FF!(O6On3rUrt9e1jdQi226GYtUFE5@AFVB-eR?3H<9~F8*~h zcO&T_lDnBmo>9+1x4n*u6Rwar_iw-YVo=B5YU9y%SN+?lb2Vi**>s$|R*1p^f^{kqM6vVYRZPG zFw+vvl&K_`4`gDcPz}T!FQB!Z1ld%PzbpZ0aFBFT+CAOUT8_M1k9| zD_R00G~sb*CWHwg#!j@GDl`c?CjjK*V97YubSl}f8VHG2xx7geugq1k%HtXy ziKM10W{N%2EabL4hME|EHe#S~0DEhyC#jn~U?ipIa*9nGX(guisBn{)psXbqsLTd-=9*eRerwH5%33zi&ar}j zpo4Ah&1PsUl3_9k->qdA2?=w*JF7zEK=2itn5M>I3~;)g;9DbzKf+Wq!*s;?4`UT! z=4@JxPz17nSzrMW8$K2AF;FeaAR-g)T5H#K;uY)Chbt?gS|Dqcq_TE3*q#lxulU*- z9?w_-$j~Vq0wiBVP{Y?Q9KgSoUddQ~zdw>z-~?~7@&Cb8MV1<17y&~rZYXXY1GS+= z=3@0Qa1{OxyxqVW)ueUb*S==k4zC8EUl-uRkK_-;%`5S600S`(@lpo5u{zYU2rU@z ztd{N2!nZw(OAuvwn0#{O+LaZ@IR6VseqI2{_fzK?Iyk)zi|@B|%PEZ5ctAr8uqIH& zfdi_)2@W{GFgCn{GuY#BXxRC2;CVFQjlqM756rMgdWkNKz>r-Ai%pXs>%f5HaVVaB z59TpeL*D!&AsJYi?i_)u!Y&tG2lKpi&j^ad%dlsJ=VI7#<}q4gQ9y$cj1Rnwlshd+ zXePrRhuYcoVs#e~TsQ%1FoN(h?2!t)7P!Je8ukoUIW*6{PQsDr6bDYla$-2)#o4*Q z5gH>k&TNsKkQ>5I2-Ypd*~#IwMTfg^y`CI)aeY1~BtR$`X>eGKG!|OhOVk27l9%la zJ_6k`=%XRnOXPcjt#Pkm0j>_u+@3)m^6lHhzP=$-Nvq7%FiC|!8rNdxri%$tftJ{K z6RJfrl1BteBMFYS1-n5Q1}PDHTZ&_!T`&)_xCX2eGbQ70%Py;AQZW?MWULidg#=4@ zuP78)zM}~x8I3E)tpnS~1I{XZG?9ua3FA04>?PoFVj$NA^5wfB%n zg5j}ZZBT(RJUl(Yx%|!0fs>t3O~b!&1gZt{u%UIyymRvA$;z;{N`lEA7YDh|qB?clhX<8@^ocP`TwcwD+u1*og7Xtnz$bD`R{z ztda>8UN|PR{FdyrV{$p-g4Z0o%D#y@M% zW)3CZTjr|r{`~6*eLNJCy&i(t&Gs!*UcMc>+PiR$kPr|R{x;B`%7~* z(4P(T=UO{%Pu-mQed1I9b$70{^SW^(u zJK}IlagL-Ds(5x8E)Eff$uxa}GBphzb6&Z2#-Q5iKP2wnbQ-8kt0WCC*ra0G2(E+8 ziVv|DPCKx(T3_Nxn7@q6FfcBVZ-aH8y#LYrOYz%@n~7Wc{b2WsulspZ;8EeGz+=G^ z=R$;nfqZdPb2kDBBaydgH zfAiRhtPcnnCN})Z4j0`(s2UBaD@okLFUxT8W)j#glVubsKNFPYag7-!{xG4ZV7dgX zpNawYLcq-`$6%>NGo~tI$i?@L<;&mRv-ac4Yp5oKaK5p93OSsQp)hY?bru)Z$@uev zsm0_1M*}uFg9Mm<*kKp($w7ca#vh>ikgU7hqHoRTg{qP?wdJbn*F|@oci{qrx2CRK zRb#&U)bA79)@q5jV%=3Dc5JwzwT3Ntzj&)x#m21IxbE_a`*5ad4O<239R=zgNFDga z=+8!xb|;QkBkj&7wM}CElh<5g_=(RYwmk8PV$XLKF42A-a-rd-xqu2BhRSj=m0>bu zd2P6JiY@v=l3}~$IK!V)FoYPLP{A!J26}~HJg^&R8|7Qaiu#IIGff*dz8vl$F|HN@k8Wtv=f$6f67Fdv0^4%2< zcu43>C$-b2aq3}$>uGIw+)0?pO!L@>PM`aTYNx1MKX@j2@$?0Z^WJmrYGr|qn>xJ% zckj=+=boSMo_nq~%FF!(O6On3rUrt9e1jdQi226GYtUFE5@AFVB-eR?3H<9~F8*~h zcO&T_lDnBmo>9+1x4n*u6Rwar_iw-YVOsd8;lP|FOB^5mbn3xUwEl(UgWw`+kA(vGa&BUfvQ#MS6 znU-j#OeMj5AQLNvY9Qu#0nO!tf9!7zK?SfDhDicicHuo?QxEBR85W{mLM~P&3fzWW z(GnP;36DcFAxsD%*IfTLcB0)>p-Ip=0U#d-OU9|DQ^|(aKuEO81c4g@ZJ1UY2K48uVu1 zK&2QT1VneIXW>BUPFK!%xwJ-)#vL!SBG1bibbUBIYx!hZ(=}6;ExL{3VTWQbh-V<4 z7s#WQ_N$%;zUEwg^HtBU0y(D}XvhXSbM!|K%35-P%4}d~uBr9ox7OUGtYri394q(- zI@spkY=*`n87719-CA~$kTCbVvnoUm1YfaBHxUv$e1+rF2Dr;AR?b%@aim#pF z@r)IK44uLuK=MTdHGJ*D0sLF(m5k;0`y*)uPVgoh{~t_MWT^p$5isQ9hT_&SP#aog zE>;f%N8#VV+YPKyOboWh8W2Q4B2I{*fjaE4h%RRhvM1y zU>;*N~hg{FwaZ(jG#!o40}d+E`}Xv9-}1|1vD7J_`u6Zxzmz_ zW-{z?sGVIeR(Aoxg%hv_BM2|U9;vWvfh!!OVb5TdL-XwGBpi88ao|)eCx#PVoSh3C zp)pe9%ofQBxgqR?VBJ!jog7YEbhr!G>&amk*XMIW0)YE+W1+RZL@l5rdD+h3 zBhW2_J{p3(M7|f;8uuC&;Og+q?HS}D-@ZNU>l-qaw8~5klT`SlaV=(Ux|k3ZXo-zC zp;{y(c|@QzlHh1tup5M7kP@-Cr8xH41@j<_YrrZoQ!?(h?6OKG6+U%va*JAW=+?S4Jm{rZw} zTf3>X3 z7#=Iu1{D~?qnT>5$R4Z%Cp)2*6vt3b-%Xj>gk8UrlsBYAhFn!4eoi^)_L!Zf7YJM z)i!O2?%mZJ#7%3idvBCI^^xkPrMf$%t5y55Rr_*nyKc|loWJz}&ONN!v2^-g|7z9V zY}H=QVcjLv9eY&U^x64O&)>MPQQ|>P9-Grz8KJwcn>WhV+ezb*ryZoM{y}~Bm*#4q zKO5-JwRYT|x;gdx#Har2?p$ll{0-A&r|uX#yj{nhg413X%j2l%(30lq|Td^OtcM2F3;QZLsc>_dj}nDSkU~GjU75AM9T7bw6(kJSyB2cr1A0 zT!>IGkS~s^T*byS@Io8oLXYtm_?WH1SV&+ISg9IMRiKSgJUqVDYOV91-h-_H4dsxz&r0nSM{*)qR|LMZ49?Xp`T?`s*TfV z%ABOB=#(16-ysdRHY`44d&CNB_VY8w6?q$@tkJ7H zKO05boj6{Nv^$^FHi`95UUP}zCq9?h^28^KJ>ONhMEiNjg@&8v0xEDAD$B)GhRKlS zwc*Yww&)8@-p@!Ly-mfU6vdB3aFROpBd%jP(Ta#ssa>zgm9#dwq-R&M zr9i3sQ`l{RICYK42v9pfio`&G2Ixl%v|s&cQ6PZW*cH3=M}Pzcg8oRB^WS@Cxim>p zPNifZ&d%e`+?g|H?#x_mR#y56gzi6|JO55IAzxs|31T*}c@Ppei9{HY1j%(uU;_WT zn2Uei%-u}7h~#c1l4r_uz-_l<;;btqF8$Z9zN$R}M`e}yw2i`w(I z;~a=#0YRK103Jc$m|Jo&PY1vzc_a~j-mr&>QkmqF$|XO~d8IZf&`Qn=tZd3BRko4? z*`8VXRQY&)z8X6%RTaqiq+njYVydEKo9Y4?pH!2V4@?D0wy7OA40F;j*^ewY(9d#1GUTypp*nd;}hcl2NF8JYw+Wa*{unC0-i9^Z` zJO{kW%b`3Eye_*HiQUfQ)J248FCk~E<2g+c7cZf4D7Qnz%}a*kWw{d1G^EddFOGxe zVOE$GLawEut*b-_sX`NgcpP@~3@l-cYC4td{WBISx9a2)=vB%E@Ky6{K7Iuy2%uFN z)6iHXG+i;1tQ4Lh(efB-e5O>LfdGJ!pwx;DC3JHrrkKjmr6jvxq?D*Sq=Mm@F)zsr zNeyxfV1Sa07lH*COf7-|(w(fF&GJbbLmDTp%<`BUPAytKS=MyTlx3@JD`;V-avzM! zkRiH4KJV_o>bd8mnf6Znwq|G#e%o_jr@W#)T@lLkJ$EnAovCO_S9E9SzI%c8Ohs$D zqA$}uaxXx0>H7h??k0i$O5CI87-HODTNjch zXP^dlWQjQzTV&oEHyAd;okJgQC#poFY6=Z98hI^|N;0#!{U}q-d8VT+_?AN%W#(c^ z9i_S5?!POrN|-!+(C8Ql4rO%^b1qrEC8oC(jKkQp8lo#?y_QthuLb+l!TwcWKWl`- zXl}zoCb!v9{3dQt_}YPQwEsxE!`$!x)+nbGFqS2j`n$lr81^v+R}m6&anw1~1|mcA zuxH566Yw+8ZUVCPr03v$AGI;v9i#uAV|2b1+6kATotBtSP_*^fPSL4ty^z63ZLopU zizZxbimoLEB;KWVhrVz^A#tk!7uJFZ< zPP;=&xG^CqgMiN#QX*bf*EXcgQ+podHVb&!lMeQ*`g(TG%TEh_j*V*og(K3!-`WZDNkw%g*8ZzV`2&op>qR!7NHb zI&t#!F4?(5?G8J$CKI`}g`IdM|0Z^#+Mi)%*F=>zlHkX+`mbNi7re+ksZeIE>IM@ z@TTf1DunETY_E0XmEQvYp=GLjGWVc4>pGC_OZQBo4d)@^nZ!N9gHw;=#h}2oV-jb; z!z5k~d60xw67e|Fj@Glah{WlapbZ*69wHtor#06rJmn*v@ft_w@z;6qXM2i4Px<4- zTPY8Y=3I}En8b@J4|(GR9}Q?~aB3cZ9ZgP8MRRx`9)3q6EKo^Gef!yAzb@e!pHi8rp|c47 zXiSTm1uq(81tPKe3Pd-_WR?*)8cA?wo5KxE0E`m3R}>t4dY~T0;u^Ec%%qIk?z*h9 zImJ*+lQDd_g#=5uoOkK6e23#oVmhY0XzeR;$Ypy8AC4!ZO5Au661Mam=*z%M#TD}L z8=t)X$MUtom(znUuPC>*TiSaURy$7qO@N5+9?=f-4}#&2VuKI?4j#=^6M0auVXS-xBH$1)o`>iPdC=6cV%|A&>(WQ% zYfU5RrV)6WcK6@8_BFm?FRT-x>xIm7hu7WkS$~g=w>QHon^nQdXfn&M8JcdGiXK%h4?giMcS1?AFpdb9&GO)4TB6+x zNE`Fh+!Mr*K_M@Hj96ZH(9g$B%ftH=WJ~1NE6aUBT{O^l0*VJA0e%aLe?((me?@X-q9!mEf`e)N~*G^nL`k=mT<>+Vi{a24Y2)3;BegF^1 zzI3qf!Jh69zW=ZKlbQOKP0`(3yGh)%?z;Cz;E|8iwyZSVDPOA@NY@Nx_VnCdzP0?` zPq6MmP20+`5B9Is>`m9~-PCu=YJD_$A8_O>FB<0+^E=alRZzbdr5WU)yl1A z9f9O#{RfZ$PC{&lZB05-uqZei(J@fm84=Dm3~(jV^jXT(6fBnGW47-ks_l~sxh-!h z1yZI}mIBv8LNRUf7QL4&FYHd}&T1*Wh*0%=7@mQa@Cx}d*zopSKYwc_b~}D6{+|9> zaB$T(xD^H5ARL7*NN^WR&LlxWHaN57vui#M-j8#9yyv*<`Mz&?uP3mgbxr>W($%a-Bvj5FS+-MvKf?H3*9W2uuN_4$=#Xa&LZ}`=)s+M)^~*9G zxbtyL2V@z?n5_xQ;P7UKiH>?b3Dsq=63Hk~@DTKDRidTTrsqu+ytyfc|Fy7u*;9Mb z_M>?X)dc%pGzfb~a($9# zGqT}wi@tTA7ouviXCTwuo@t}-w^1%Oc(0ts!e=wheVMj>@Ru!oR8=KDyH1I>YQyCd z_inl&wT>z9IeDAc#E!JsvEeEg4`R)pbxf@{W~IAw(p@NByCycL#b%Tqz?v469>_`e z=A?U3x?xRhON(tNJ&ZL^q4e<1q#ri6h>Z^qy2S89pG$0i=o7`Eud7_5?aSftz|n@5 zm>q}6axs;m?XkS}cH-OqQ47(o(&?S_U?E+~tGcO}T0swo zk56d^%{XH;qZ(PUi7RMT|Yh8qUJq2y3Fd|1_0rkHAmPRtC` zDbp+(!>LqOGp9-u$#fx~GR`U4tjY$JqE>0A3mG-5>PY|#|A?HAq;3A~T68*V|AWRn zIY~fx1O>;ul81?XAU60DC129Ze3D-ZNI~BAOPx|UPEHFfa55-G;$*jjh=opuMq^H= z>LWF*g9%EFRsG1xNZmC}>tKRXw5s25vZ3yp=4u$JB~DnQ)CzTz)CP4_ib35hwL{$^ zb+FcKDA8rL9@TT2u8yikv7j63&Y_`ae{2Qf&z~82Wi$9WlBC74j(Lls!gh9G?Oo|@#Pi01ZFgo3|n5X9m{K&EaA0+ zB?GiCYZ)tGDp}s}LW2c?Di*>D9b+Wz>JK`^13xtGH4`du2w{xmpk)`{6V~+*o)2l(Yl*WxjW>r>_ zEY4U#S=MyTlx3^uLFSY0^S6!FV~+ zwiMY|-mv+@W93NeQlzik)BoY??zmpzE9N}BZ_}r7*!Q&&SF@r{6ighA;RYriETJbtY>1_8p!dKhCh07NfgBu>- z24*WZ@G}^>ZvqamZ2>=HWsNTlR~tYN@ZuT(^1aRgc)Z^LqrbtKiUD-fD~-Rz0A{NV z;1?R21FbbtUwmqA?ZVAwLMgVx9~UT^NTUyNp)HKxeEU zj|I_%xc}Yl#E&*|+aOvVWlEllHIF7{f;?8e(`U;#u;}NGr z#?iNVk%TxI6J2O`*AuPVVD{L4SQB*s0ZOXuTEPmTeM}t1Q#$6+rY-wR}odyNTjz>DX%j`9=QKI84Y3zE>H%1jNfEbvb=TH0Kf zKA=^gB-V~VHBZJJi$H25!R59hH#kaxO0>P2;>u?;%mXc+5y)N(GVXTUV+E!ZLorRp zHp8lfUcz$GRi*d>3WWDV@dAK71B!1*ar<8`Xb;m`k$Ck1V5nsqlifOI2x-h4PJxg2m{Hyc%%ZKL<-ih@r9Q-D>ZSK&WX!pXF&tl8btxM6Z zcQy`u_R7CwN6WG9HJ^7&>l*RWwyXYY4fleiwR@rcR%p3p$5P9V^2W_KFI>NH zr=@4%&}X}rTedH?Z08tOJwp47-^IE=dF|uZt{qzoh=@tFF|9NZy5*{QtzmT&>3ZQ_ zKWXUrwqyI3o0lW0rAVsW*MIZ$_0xaOeH^~(E%yyvHLgWgy=3E4D}K`4F<0mOMnUqh z{wrvJO+sy#hlX@C!J6Vaq8p%i=AWz%3~(B0dX_S^2+DF_I_yJDwQp;13-uR^0A*T% zBD`Yc71K7}nmo<&gO39`tGmAA!qmq=o`K6|$q&)?k1l?2aUpXvcRhDQ|0X)P7#w`? za6<>-Qs{>Uzt2=c5)3%S<&tyP^(x%9PjPxr@dubwHu0wt0(%J-)MgoYZ$s`MdT+BQ z=V7UnZ+sVR`{=#P@BOiUl3CH)DOj;CmI&j>4KKB!Gy_~^;htXaSRNDVjSfSE#?V?7 z=2=Ol+9aJQm{YVcaav8|3lxL*sI&00@M^-#o`Jo&gCfu9z_NVXzHC@NSOgCZNTB18 zmS2|Dvmljv>a?e>1GIrL0o4iK_U)!;m!rFuqPxm%T__~T!*BUMZ~C-pDVkgiCT;Cj zWB}{1&9#fyKe&_$!zT!N3i%Sw@2FVm!}#K_D9GDw!VUw1TIzN6q15BlEnI@>2?Uh3 z&ab0%F-Yw=8L-n)ei=c^7$zkAp~Zf32|_pF9T^!(w4o$*C67CWWf@M{QV!b@=>UkokOsR;0Vb;v!=pA)GF2IaEM^5(&^fAS>?^R}P)!Kh_g{Q$ z4}1wg*(+Eb#p)PTR=W&N2=A3?xq{Y!o$!*xxw9|UXrRG!gk?!Gs1S= zjdlAv?mp-7CGQ43zTUe*pD*=OlgGEoW*0ey14%-L_d#WO7(9()!*4qY7ekGFAPuo~ uxsSaKpcr$E0jS_G6@*oPP!QK*L}>aC34Kq(_ry0n!ls3ep9p^WuKx#P<_{hK literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2004.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2004.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9122c8bc7ecd84cf7c7d2a1185e7024b153498cd GIT binary patch literal 4538 zcmbstTTdL<`OMx}hRbrtfQ=6~}WAxO!7wGH&J!2$t8CACwOEYv)9GlTh znsnD_QZ*Ayn^H}xq|;QHRkXA+l~$>$C$om8Td=MtX-2hXjHF4Y4MyD~dQFGE%1j_j z2V#`cE~*CisOWlR8y)R12pj^Noowl(@KzkDyp^yD zNd#CaRRFA#DgjnYRRAMWHLFPlqcwKj1wF0l>ZodF4c$}+`uhi8)&bG^8zYy;&JI&< zk3?EAO$vrla+X0s#-ehlHKS5j859-Z?Sd(?%t$dM6BETV2B_YmYErZK2M)cAqUXS@ zb1~7bxtUYhoSanvU$wv(cE@(Ut{~34MU;_*r%}`aj?vvV2LXVK3gaXVBd771;LXN` zsWL*Y)})Kyr-YOc_07k(pGo_uLNg#&8hmjY6qTf!P9?|sBP)KpR^G;XRZ>H*&1kw} z8H|PC+!dc4FxB)lpO|!MW3K#G7%Y)-G75cZ>n2fQ{_FE9 z1T8vEsoJP94eQ`zJ8)SVyW%iYtsK+QJ%16UVP?%`)!`k^EO9n*MPQg8p@ZZ|Oq7_i zYJl9NcGnJEmrB@&AJza^B!wDM)36rl$wzut!#%7P7I*e$L|;N*h2Cl0Q@@e^A2o`i zILt$AoAQ6TBL7!Cj<9-=gH-}>;li-b9WD&9 zv_$%eE=<6Z(?*MN?X3{Fl)xziKhC|;kW00my!}@~a`0ugYXY)^)2{l4Tv~cyqTE{@ z4@~f@66fCjL3dMu2$-nwFelJgc$0)yG9K`-y;HB&^}_C@lkiQ%MFcFVcxsU$fQW7X_C_+(?2aZBcI!kiaGSUP<%x(+&H;i*Lj( zvkVzegXCW}qnL_iG1dZKMFm@Ue@h0j!^hG}W-6(iuz$5f8gZ$_j-`!+k~UAkz`_14 z&@$TrERrwY`|8TqLUSQ90QEoGJ!=t}+56FHx(U35F5H@S*@c1T;&{Y*7URCm;-Ex&nXZTL2cxi{|!a z>(QzEw>~dlYaYlq55O(d)%)n?>}aR27gmL1?U1=$YHD(ReR`){aoCYAzFh(dFc9w*zn zyUkAnzWE#g+{(4}w?p4Iw|=_t=Y>aOYduHuJxBi8eDu!w+h<-hv@M@`+R%IZ?2Aat za?caESPtYP2VU&&dh(lpHC$M4XxR+{M&|>PcMFQ@!qA)vH(&FIFt&Ng!bIE z?p1DdkUej`?j)5>&zcT?(Y;m?&sW6P+dCg#zkmHN=}*MF{`K~*yXL)$4L{j`xDX;W zO}DGIr*%{$PwVK~;FAEIwrfg97c6OBAbJUk*B!B~iNUm(rl%-VvtTUm>EYBLs#EMm z{dOpu1uV-h%fhoFqgamfV%fdLU+oY?Cy=vSb~Ykx{SLptOt?tCk2HS#;U7O-PCiWE zPe0I~M*3F6ecQEw0m8M=2?JhD6;l!{xXqK2OSk77l-rY>-%0)=nsk_-j0y}9St;94 z6r%LI7KP5H0-u^#OcPA&If;5SPk!WI7TkLR!s zv+Bpy`ABRv9NVrdJdRrzOCTuigyE}%97ef>`9no7-Ayk3j6&H~2s?(XlyI-ByK;|P zSVo#yo`6N`oBt7^t6|DnWLPysg^_42>Pd%J7|;=A8ScB#Q?(!^J5j}b^eAAl69`Tt zexnS51^*OC$VFl%&_9I;SO_^86g`id7wZah7Qjbj!{-l%3*iue8dBc2y7y$k?`sS# zUMh%u8gr+w!@=NCp_+uMH+*Hm1Dk#r6>tP~XQ*i{xHli%yWtB52XJR!0Y|SIT7pfl z-t+}yufo3IzE?mY{zJ7d*x|5*+`vVEg#>#8fbC-{>%>9GaZb)^i41W4J6b-$E(0pY nI)915B_;?Pp|B9xY#>7Qze)LbM0_2%CI}tNO+OIq`KkW}zM>g| literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2004_query_parameters.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2004_query_parameters.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94e81f88215e25cc8ab4e2b558169689776900b9 GIT binary patch literal 5395 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2006.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2006.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7712d483b65db29044bd3b6daac93768a23b9966 GIT binary patch literal 10875 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2008.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2008.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3db3d38d8a63df1d02c1d3f867b9a323d9881b1 GIT binary patch literal 6597 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 O;X0S1-xK^Y)BF#fI?4?I literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2009.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2009.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82773da445ed844f26e698bdbcd4fe831e646224 GIT binary patch literal 3619 zcmaJ^+fN+V89y^Sdtte3xL+LO!_9c@vP&t%Hu9x*j2*`{X<1N^HtI0DJ1k@G&aBVO z;y^^oQ-zy{IJHnfmTD}yN>Cy-kA3JL&_}3~LZ>`LN?xqK0PDQ>`_AmFF_#>%-#K$G z-{tpR&Y@6Q86?m;{xNaqt1?1jFjyop!bnVriMIqM@Lpsh?>)@ZMA}Kr z(?Vj>2hxDYImf(dG3=fFUr_yxlDIzlJ{=i~jnXT>y-BD0=rtpm&#JnmSel^+gQHWL zNmIo+no`Xq(-Nvll}v^z(~6c+5*d}MdMamVx&`xkie^=7%1D`X(qObGqT6)%tIPzp zv@b#_?V!4GPZ^{`1HHct2H(r6I;vpi)FhpD_6@?u-bimScth1yrdVoP&m6 zLbD)013sSwgHlw}Y0N=+cvY|~QyPXsR?`*BU@#$>YG%?z!PHJgv$_>cDV7qwZ?L;& zPD!d!6+&gwx-U-~8hlMd$QX=Ig3o$#GY~Sm`zaScxdLWXA@TC!2Z>j@ zqnOY_#w2&QD|Ni48#dg&3}-^_&M_%gl3L#pw66LJS6)w?UNdRLOmX`c;G2^qgKCUSeeAf%j75^r=*$D2x{qcu7XHjXPzATh<=mU2DDhPXP$4f-PL|;b#9HmiL>D7uF$R2yO&WJh+PBU_bIRQ1pvMFr?uZ zh$>ftVMZ|w1HeJjEH%3a3WkBl8i1UIpLrh0JlSe&U9wiLEZ_gKY@@Mny|HiGLpr)w z?mg}Pvi}=l_3Ym+uU>wB=E7Rr#cd+AU)(%*VcP>ew>w;Edra*^y9@*|F3hehmTTFX z$*HF8PpfcuTFee=rly;gq9;{b%4nu#d$LN7VQ6s0Z3&%edmS#Y+sr3;A!istVIRYy zVEdrz@*Dm;eY;5^_ z?$2{8qZ?gk*SpUCyYbwE8w=OA>W(d4dtTSQFtinFUg~;Qw-GwI9y+;oqT|`y|EasV zS=U_fdb(-~#6xQz`W{uh43L`UrTUe!jq20u)u%U4bUv9|o_qWUT-&NXwlwstf1~=; zdi5#JVMi3|FMeOw{Q0fVZaunP@Jq-^ayV^Q5Zd+7dQ`E~Mw-sQY$p{B-!`23x^tsE zx?UdLY;AvXXZg-wGM@z>dNx}-9-5EJcRb|8nQb3=qhXz;VEeUP2N&Tc;3iLmrGp1?{tPks#5fBNyCK3+;a$t-6c>(4_yYk{7FC}4tc6xw01 z2$?ogDoHR=Y_65ux~A*!+?e3{PVg7qgrodKSYSPHfbCZsu41(Q$g9{{ya7i|tR4`4 zq1sPBdhpRFb8CS&9gR^-w_yTsjVEC6S}hUcrG5KLX$q`L!{g?#Yk5pKY<3VTG?vyq zWuE0#s!h^_VNFpZaYs$!la|2)_Z~d0u7^Dg>myH4e12d8%krw|q^cJV!Mha|EGDGw zlV$ZDpmLZyouyl_+dK&b-3i(DZQHLlLjCKZ{>|DZ1ZnQU+=};$s;5=!p~zYwau6#N z$FZt_!6F$K2FD3GgLVnCr%O?KlwJH8iMFj0){m;}(_UAP)E<{c@Ce>H;L+N~e}(8; zfN~X?A0~&xRfv+VWRXiymf;4?XK-90%P6$C5|ZUfjhPlcoOJ`1{Q#|zgqV60xY(6g z`m{veQe`ZlXs44rJQVTPV)%a$8^q1^GUN~Z?~;^Dr%YgkmETbewdD@v1n&*=9FRYf z9ns?rYzKTms)Tyq{OxTY?{}}Y6OY}x|1ETl%Zoun}{!}G;+Z?7Cuu!po z4IMiJ#1@&#;OPeS+leAa;_F(#J?#K;i4DP4OiHr@2;4S;u;U8|QlX9rRsSVrKak){ Q>8c>KEj9c^u;)_$4+|+LH2?qr literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2009_embedded.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/inline_response2009_embedded.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..437444a871e870f1e515d6a359bcbaf9b53628b4 GIT binary patch literal 4597 zcmbtX-BTRL5ud#;j)mj+6d#h%07B@b;vke{ER3W`5t0>IIOd?Ns*|q2>7Ly^VFEab zr=VwMXQrq7*FD{R>!FZLptXH9di9^>gnW$?xA~pH`fD(lB{9NDOp19fNL&)VhkHct z<=zI;N@Ct767ya59rfDhxIgWQ_^19Qv$xd5+2MET&_HaMp8DB&I?+SV1T-A0;FW2Aq|$0SuV*x!4KX91(+$?s-F<8zn_#IF zOFgd!=2O=O-yR<5qrxu9jA|GZ45Sv!90gsAAW?IiQ3n)?K)9=5l046)xtfj2@|hf% zz@#jtnc{%WFRSVWFz;kkwo1SexW%9AaIO6w|)c&_^C8P zGBC26m`UzzL`swpa;Y*?JfD`*Qp7XWyZxoKld3ce%4NVY#{jhy)pQ!OU14y+YXucY zek+vH&~vkzu9`W{190tv$MP90GbSbmUQ4N!?aJzAS4uV2t{XXi&B&`s*2Tcd$IKhb zL{5X*1UP$+i;v)Ko%u;{cHNyS&QwTcbZNqv3g2K&g*oPo<|jcwMbkA?QLMJ@)r`8E z4uFhC3y>M|tYObh-)}-Ids}Y$o&=j#%Bq*jnpbwWe*D&|mz3{YhfO3|1Q#Ya7N%%| z!7LdeL(p$-`$}(mtt6GTx2JDSF9!GUO8B(3bK}Y^ zx-Rr~6OQ|3?Ek<~mgT;@3a`@z{|5v3zu`B?G05;TAkLF`g&xNk*NZC%F~Czz8tKO& z8<~y17KCNtYe9Hbv!t8oQXD?nZK(Lb-7f@E6!@d>)!ZE&b-31$H-Aq^0Z!)I;t(e6 zcFA+p;idcHD3WL+zPL!7IC0kx+Dk+Q=Z~XqqQ%iKM2ksHWW?w0c5l5@-2tl?Pr{k7 zvk`X1inkWI0xl!Ip(=OJtKQ8J4yP1w+9)SNEt-3Cks}P^HSX#LIU$k5O?B?dtKPlI z<+MqMhY(s%jd+AUpAk|=`La#t1*53p&OX7}4pfoYb)wYNmJVlTa zeQ#59@!1dSAd6?vDlu~k-Uex)WLz~=)8rh1h)9<7{)WI|1^Y8SGzWg*$>40FD<|5hUz)g5-$D0mV1?9MKg*aC}+35eVSn(@d7#014lNi{KID z9r!nn0hu9B>zn7y`BV39d|tX--?LQT1Bs}uWB&TXj?a&LAuaU&@#MnE$A|kDTaK?1 zsrC5E>;0=<=!M>qkmWVB_pMU6h>OdtkW;)U7{3gwB+Z~AHMu2ghNc^)swbJ{!>nL= zvud7WRuh6-J~XQ3x4FP>qmU3~4M$Ik1Vmo20+5jl8PoC!o|0nuC)7-VS>9`G(!k;X z%2Q}|>_e~EF>^S!KMnhgzXE~uTvc;3@J)Twr_;Zko*!Or?_Fx|{agL(x6a)>^R#yN z+?mI<9XAJ_h8ySFAJs004=jZbJl)s!=qG=#J-<@hxbFA1SFaN1|A(*t~$6>bx?3v^GJ2apVc;gdf}4`cQ3A& z_>hy&=CoQ)X!{-WZuwdZX*l+>m6Y##va9>c{mW&&OJ%()&8-iv-n;s{%qQ|4?@Dvq z9pi4U z2ctof7C%hvnuOWaU&Lz#@_E>0S|xe-(UDb6+leu7Z17tv0G0xFR?E&08MeHKCow|K zkZ;0uw?F*VhjXb1nR}W0`r~ltVzBc+lO8@8fkrC~M1fTdRq(-SuC_wUhOaS8 zXq!WA3bac@J-=1j9+9^C+6NIFL+^$(zzd9OV>FR7$7wEcl_l{9B!_zOI{W}R8}agX zxLZ72td#L#E6Re$e!_k@1iundKF!hrg6i>AD(&+mP-KaToSyk4ft3g43b)+U@`?mE!M_X&`I2rc3mAXmkz{L@)23{c>TfEU;s!Z zDXm_tfxO|V3(Q9;YFDOG}0sd=o_JXNYx^~nxty`A!al)OZJS!2@Yo^xk*SuX}m z$hG&*{XO@dbH01-Id`?LP9%`Jz8pP!qlu7juu@8HyRiBK6y}IT7?A|YaYA4M|2mk1 zf1S+PMz#^j877iz#I@gP&13EfN5nn-Ur{+JkG*>44LaB-ouM!Pyq{j!OOIuf`HZ3& zvY}=*Q9LuL>NI7y(UhVmnL4KER8FUp7-ik8Y{Rn35QEk!emF_}&2bUe$b zy~Ix4qOUL=$kM%0N@*9>vghR(?c3k`6Hz>!Q#9Oyo>P+af;BD%1AC*rqWGGkDNHt$ z6djw2(MiL|>9L-k3Dua)k42N&Opkt1o|sTrx13YUZC@<>!l#%0jUY{ z1}Ox2qtwiT6TV2R+1an9RZSUG^juccmA$>aFZE@{lvGMd^=SrE75%#)@G^aF;Pjck z80BzCre$5HfD1WqWGRTatQ%@fD%92mMfsO{0SP&lonUe%DvHOlpm~ETDb?T;EP5GP z%LA&WqN3^44Hj{l?hA4{ubAGHs^`-3l<6|2atiapc9;*d8psBcB|SogIN*mMUmb-E z4u&v9(onJzuL)~vIG!ioXCDtjh8xmls>3v0I&NgRH|;6Sm=Ge4>BCQy9_^+w&447* zaCpW+(kZHHRI=bY5b>IxgvF&VQDW1bKt9bnsKa5)sG4kKSryw6m+8`#^mtXXj@yQ# zMa_IqMl*U+vLW|e%(8QOPEIO43Y^w)<6`1MR)yLHIJH^E8{yb==ceG)YNcwzuJWzx zJt{{@f>ppIq1ZS{fVDuNL~~Q7FOg6+)kq}F-A@!vv@~`%Y+8>(c8T0=314=7P+Mr* z44=9}b31&*!j{gQ@~guTDkOTb{r~z=qGQw+HUo0hQc&CO;KqUH85^#ZCi{fMxJSSe4cs17{i5P z6pn}(5m+s-cS~Ra_~^(!Wet#XSeQGX%nj#$A5N}^>=G#kNkizvw`bp8^o1E*J0w{? zB2Youa{2Co0?1cL!t(L51|-LRyQ~Osgv#x3RGia)k$$MeMR7wi&dFe1ECu{Hf_@<9 zf$8pk4Me4;Y`EafHp*o;x`$@+y1@nTHZ~iGzhU+u$L5LK!IO*rlXsijuZRz06Oql0vJVXX9O)&R z5Qio!4OU*LcH1^|RnT>-N~Px!fQ%hRx9zfDVX#c{_x4Y}exaKuWf zf0xxoWZ)!@w-HZq6ai0?5GF&e(&*Bv!@-@Q+5fvzj)#H%ORXAHi5Z#oxEo%aNKiDN=uPT+~^BnZUUK|6a z*T_P|ku+{OOz)(u%Z9;NC(Mcnrtnt9t!nxXrsd37N1WGW=XwqxfG$UcCd{t{%D z$eq@Xd1K+_>lZ(-S#I6C)VjCmBwaff&fnbm`MxiNTL=Dh|mOQgu3aSP~c(4V5X?*s-_#VmQ+kvTGb8HnUQm> z3wMNCG+n4$(``|K(RzN2huI7P74dLq)bv0+mrom}i_;VmR@mS?r%dS>=VBmPa#K0c z4fs|zs%Bui{!hptq-$)t?D@7e{PE0hXBN&ZZ$GfK{lLFkUz~mI^07OiP4mZYhjw1> zyAx=i-~MT6Ik00Xu;b3wu1}BtJJeqYwXeFJ+k>mbNt>>EuKDl#NU(jrd7);xaraW= z?!wmRZp>Vt`Q(?_cc*dFeBY=0mK%31HSXdRRvbd}p}V2>k57Db;@YWIuL~);EJ{T` zq1&$-*ZeD;r0u2q+lasA>y`swhL&p&FV!9{bZonE_WIf1r#}*}Itv|LSM_VPD^9ZY z`J#t3v|L`t9YLvblm9a)06-zP(j(11;;|}~4r$4F@kljVX*3|{Q?&`olpJWT^hjqp z@{0A!0M90#Tn*-Il+kx&yU-!fJARZnr6g)sY9LIxIl}b!=X4_uHz>05wls_eoTD*)xqa9N)kZi4OisYV(|Q;B zkg#5B3~W0Z<%$b}mFl(IWjE7z|DUi*%YRCmm&QqHu>`)vU-cKqd=gV8BN(J zGdL1%e4?Y<1IDPS^{W6~^ij*;dU=S#xciL*7`o689v8Vij5r4d1|m%;XHCxF!eSx; zw|72`Wq%@p`?PxkiNv_dbOWDMwJdadK{?qZfOHQKHtW#Ns$+RWNuaexkID4eF2Iy! zd_B5ifc3A~16p1S{P;q^`Y`Lqnav3}!0=3;Oq9v$uo5~7oIC3!2rlE{Xacb5QG2# literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/instance_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/instance_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..111fc7969e18fd5a0fb20c84922daf76704d01e0 GIT binary patch literal 3557 zcmaJET~8d>_0H_f?y`JrFkn7n;|mz$wZ%d$V>`$nwF7os*Q8}ZLE0$8?C!9PJv+0$ zGm8TeDNhw{A3{P=K$dDOxk`{CC69gR59lM*ZJ|>hA|)?YUx0Pqd(M2UVU2Ueo_puq zbIUOBMC0S-{BbN%sk_rIlux&U95#`r%>gLD?ba*f^La+bkHk~?02aI$fr|6b!sfHejj7+K~ z&3HJPQOq<`Q;JDtO{4OZtZH&fQ>db6@`kEgfY&oLr&yCl#-tMlqn?N^)8(%)6WG#o zaY|_i)r|*oKOOAr{Y515eqPa01v9Ut>6A;?4}`t(-bmz@qAN_clnhNx_tQzs%A5T? zJz3S7ETrOTBiCa-l(Sidb<26Rv`!ltC9CLhAd9>}%ZJjg{VwFZkK#>OERhchIFF#? zSRlbOp_TL!Cc-a>?qi{Z05F^o0ahe}03(SIz{*4zU{#`mRc9lyO1tW|Zd$UQR&E%X z=@&i#Y`G0%)FlXLM%WWWHY zSyaiWmUF=6my`7Z1Y|lMN&8lzaXkDm^8N9)dEsB-mLghuz$0NmI35XuZ{z6CrPUbt3A)juH@AG)+LK2GC9iu|hDQW!j_fLC!atk5JO7DXttNm4iYaye8 zPwh(`JJJONcdx;js82a6BuY|CTVe>&MzTD@7L<6tBCImr+su&sbG z8Ub0NBMW?uvPQX+Bqq$98dj_V(@m$Q+!BDA%PY)MvDd*L&8TVXKrUfcpeKs&0azkQ zFC$Q!1m{~@^4nXEmY92G!}rfgI0w4$Lw3kAB$T$s+o4I>lr4)f3}KA3xsTmyW0)#- z__8MFQW^QGed<6-c<1AnH6tx+=2cj@biHuOYy~h!zWLz0-~P2?v-`$I_l;%wiMpab zzQ5jj`|lh8Rs$rC$iof(2)4@&#w+QN1cU&BI|8_iZozr@XPj`J_uL>1y+D6DN-(S? zh6w;35L8Ra?Q;Udlw(H$T!f$b4uCnb-PpQptzKVw_;tl*}etT{0+ViuQ*W0e_5U%~o)}_lk0hk@TW7T%RR6n*WKoE0;+0|ZKmaOT#V%njs z0=J{Z?1*amZORrj)wJwDPR=t-3P*8Uz%bgP%LS;-Ldt2_409(IWY`YuAXChOX4!(n zlap+5O4bUB9k{Pdn?ay}s}hD2a+huWVbR7+Gye$y`d@9`eDKG{mM>?&m|Y#&?7Xl9^I837^wdW5)b@#vXYc-}{`OXVb5RU*9x0Ll zty>5#R=o_9BhAYVs}-BIXEtijY@ImyWOilt@$YbNyY}tn!Dr_;Yfo>~o_09w@?67} z@9Uetyz}{;#k<9jfSd%E(@qtkoeS1t)ovSUdgo<3sXF>6?b*O)Wo)A|w$y76MzX9Si1S7xcC)$ekSbrYvUJrM_Za>z9V}Cm=mY}$XOZ^8B-tg^n z>}t9RFNtwS({bmSHtwoD9^+Uy9AM=N!;On}A9CZm=v#2e#8v?r7p?p3lSiNYadtg? z%+(e3^9N?Tqw6><4m1ufS)wcNm>IAq3on+#Zr@SvFl;|GV(g&%x;ZN-RGpwH!YkFu7b=7I>H~N$-HZhoHbbWx@qK~SDoJa+TbCjnf@dfy=vAK`lqBT=_~T#*UF030 zGdlrb2(h$|ZARl8(fC$f6MAR%(d?@DRn5~HK&^-4uR96lI8Lg9#S$6g`o{=4iw1Es zXG$sgCWD+uAsV$t*m=~XOl@5`L~TS4BQf445X8F1e?;kem^#X_5Fm$QHRu>!&f)op zB*EQS&~RNPNhr?SiAvIh%1ldxSEFvgb_l#_q#=Qh0T;U(Tbr6HSc-%V5-oIV#K}9n zl^Fgf!}^i9L4q=Y|31=E>68hKu(P|0p|(!U9Dw(Nc?rPp$u1ud!#m+1fEunLICpm^ z=uCS-UTohBH;YI2F7RS}FU*U__rjvs^HU8kwz*6(N1-GC5+-&QfXy?7!J`cNvzs`s z#DiME4eUDPDjNh+tU$8^0Nf@Vw;K#|Lb0B3HUA|QKaj{v;ReUGEnN7C;Ot2KKMG|P AVE_OC literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/item.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/item.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16fdc3f9be25552d4519d590eeceae5a5159cee0 GIT binary patch literal 15184 zcmdTrTWlLwcEiU|6iJDCSug7`q9jYygL?QGuH)E_d|p9LtO;lDRXo zA_Y#oK(KYvE$lS)uG}m(4v_7x(H2cVTC_kv@>#U~5Z7|WoqEv#yC|UcM~;&3_MAHp z%?v5pveBX)TX*g~_uR*M-aGdmZdFwH7o~bU{ro)2c=R>A)%}hsk<+_==qHTIC zIDWp@RNgbQr)Zn71;@|#nacGu^+ntCTX6jRfT`Rt(@?a{pasXzM@;3$nZ}}RhAcRK ze%MrQnrSN9X2guck2W);ncolTUj6{2E&M@9Tlqtfw(*Ba`&@na8O42C7Uwr=L3@`k zPrPz&Jjzjj7EcM1#DQZI7UT>EKEiM=oP0^-G-tx01JP^2m1Rk0jtKJ+pKmM!u1n^` zL{g>=)c)p$^a8lWrHD^)fiG0pi>ZttD=tYU;R?l{lwz})%w_bKN+2$zu@IXTBvC2T zN=g-l%?t0u=9B3KS(KDY10tm|vZP@Eek=n%G9_e{dWx|ifyay?JeiJV1xZ$FDI5j` zU|dX5Kdk{(h%pAmOs3~zi^+5%vlvSVOOn!r%@KGhvp`ZyG4#GMAX<1wX((2O6)nXo z;tPa`>G+aTp|Le4FJ(oEp!*|!OahoxV1kaA1Tm??1pOvKr$tbLqz;oknAAg}R0y&R zYZ0(1HZNo+;<^`yItCX@>}TuW!K1=r>6l_t2&WG%X`Yr*>omWum9%A2E4eN0^krCW z=dsk4SxR0@soYXBd_SEFa)CaygzVTZAz$b-<(P%h&R3-jI;Wfz!ljT>6~{#(!zpB+ z3UO1&@szO!O|ca6YRXs*raTmKA%$F4Ta{5rHiax#Azli(mO}okka7ySnL=Tx5Fdry zNi`S{KZSgmYBV4L3i&G4WI!q?WHn{1G1G_iy2&GYZu=c#rkEkeROM@q!=7PgDmdmi z9IK^BGu@5%QL;JZ6NID+p!qkDgS&L7IR_pJq5^8SXLzcbGbtOZ*0 z{+gV>Ex$MP!zaH?kuC z(i^#R<(@aP1*~G?hPQ6$Flr_2wxPqBAYCh%UlEytld;1 z_OA$El!)>IN#jEQ_|2jO*Q6*o3fXtpL2zR53d2jn*>Yq6QmVsB6&=GqJx6qfvTYaei%JPq-*XQ#^vjXfw%q-a@vD>sx zkYN};?4+bp`XrnqXCj!40$>ULBwVwA#u}!z_rAADrS6I3Djb4lhG@<1x3p|e!d{8X ziex@1(T_;{ywr9aoDh$Tk`x7pFvyJzN4ZxPVNb_p(y1j18Z|)u+=&D@JBfn#1NfW> z%$yhJXJG?Hfd>FM4x6i`Oj_g?;S&?SX|eyzLRzK>2h9k{bUd|?0H+LCne@_pWg{s7T5-K?Ry*^vu&ta>{N zbrW|oR5xFT%q?aJ_BXFN($4cW--BTUu!w0x*1U5PF>TNJ8vR>T|E3fjpy7u8&$+^G zVLx}K(|KDY;+NhaA)kw_{E6p}_iK)XKX*hU*BxF~I)X)Z@k zr>_X9WP*cqL8NCc7tEtv;CkO3z8W6j<`*QHn-#$*;O`>$?#R`NuuJj1j?Kmi$q>Z@ z7Bw%(RK>zB)hSTTs)Wy)%%Yfx(J>?m#Si+ex<$H&$J2rv@F$^WUSqzgVVWb?D`ADY z=O27f(~_@x>EEgwKCWL0+^asg#ky)MHyKw&<))8m>$~r5ehO!@oU(h8l57R{XUF1l!Mdb8*d>o)(!QYm#_J>CAd)uBy=F5dLr{7W~r@fQJ zAKlU>Z}go7@QR|gcv z?_TyFTP?d_C@VW`8c=|3(u0CJYfq)L0l%nqZ9raFv;hHxhvdJo#<2L_WB0vXPoozf zSoOks&{cBo#gt+f&21Xdf%Mrmq8floo`^} z*mS{)YElGig|&}TT7X}2x)vb)7A-&kc>|I+B{Ef#M(t}Z!a-;0?=4(`jAIJ|7a19~BG1yw~mI|1V9 z(GDKHB=O{x8-_C)0gi3b87>8<)iMMSlsI0&P4RB#V^f|^WQ<*T@OH$cJhtu+07LZ^ zMLlYHVi)o&iwm)hV`Z!Fe}a+f*+mf+Zfj@BN!cW$on)xr92bCzx^^N%E!v3yB0%yS zGE?(Ob<9)yq2!atgwF!s!poom@fvY7VN^n0K7YFD`VP*mDgN1iQ z>G8C4ceBuSR6P=clZY;4mt9Noh)8KO7CIDE!7yhFbTyI-M&Q_f_m1z^1-e==nw7N} zQS{Wzv}$O`xx0Yrr4bz~@>gTb*#9n(MNxbN+G z8prz2B^4GltRxAK&EY52)kjUBKvTPsQFcwmn`EVBM@@x6W()LmAQv21^$zS_PuEK7 zX#qixucbTjaAy^T!FE>Af|-<7&r85VT|JSX7WG5`NkTGjQP1#kP*3f^3Mz~T^N;my zFW_2NQbYCI|<;w%+AC*_Z@B|bz8vY zFYF-ufXM}xP!B+b1}{YPRkzqUODIO|@KN1jjO2nNtKN}9bNJu6%{c)RDrr~6Iiwnw zweJ6xU?9KR|ul4;l5o=Lp{S^xX45OYeJT z=zY&>7&>8YGr!)iHkdZrj39s-qFlVxpi!P z)blkxfcNrqaAAtaZuFUQ^Twz~udsQTau*BKJ*c(PdP+b~=6T{L9DVeWjUFL0jaz8? znC9uic~0VLV0-kD^qy=qd=BAeC#IZ~o}V*}pW&EkBeZMU2E+e7)BoUrgxU)osyLx-#tOnfJ-Mq zT^3n}B2ezeFLV>}zinv#@zp=N zdgt7F_u*Xk;eTm3^5F~D#~#$}T^YMq*K>XRL9l71`wNH{+LsINd(htb#q+nx>UKcgokR`*PKN`Sz~QuHL@->HApspnC7h_!kG(t9x_R zy|jmiPRE{SzpiWg@!5~he)95GnHzg@t37Q77_R%K{7K+p2h;e>w;?7_|Hp}+jIH}2 z6s#lP7W(Y1+i(3e^|9}!E8o_6Q~JdJ(8aX(Z+e)j`s+omdC|tGzdi#QP(4W1XGdR+ zytX~Mh3TG$hJ8iM77w@6@C^&!*;$Z|{<9QyZ57opPY7c0WV3)JD`i@b-EW|Klll>ESM;SPa?gsm=SiU7XKP2TL~>d!-BOp z-u>|1KPVnkV94eIAY0smV;bjAAG;q+K<{%9C|zt#opKa|M!~(JUo`n>0wE|#JRO0s zsm$zKVjO=GMBoQPZ$oJODcD(j0Ao|D!yr+#%2@2K8h@s+&inJFSf?{kT?X>Z#6fk@oK)Y7cA|I| zvJjIi65KGT!L(j&0bf!>Dm{`YL;chI7(iW=s4@KrhxrL6cOX&r#K7j^w`}p4@pAzQ z=J**R;L*40&CxYct;Ah})DQFi0rSx5V!fMQ4K zu{+vTs@K_u9NX~F>1BJdrg0Nuh6=ZG7kqvVB<7w28URkk)sr z(RVBMUGe*Ge*aDEg+q89_RMKLm$CZ{+&Ek6}$G_I=FgJ8WQw5xZ%fZO^gohowU7X*2PHcmcb8o$b!C-4C7R?3e?q_HELvfj?;A z4F#$^kS*lS62o?ai^hDEl)MKa9dZ@om3h5Q?#UyAyJ$}B;UtO3&!9>xV;u%A5r7$Be0mm4>9Qv z254iOO~Mvh^*qPOUqCP5MHvY_B5VsCj)xwv!@X6;e>WeIy4`0Ez@D+;e<|0x_Z9awM>_dhZDLj>6-Z(*D^ge z9!}sb>F|8mwM?&#hZ7=}bnSetYneV94=40n(slE7u4M*nJe)9SN!QQUyOtTU@o>Vh zCEYOJ;94eX5HS&}l_lnogw^)ccKkK<@Q-W?nlt9p|Z~NM=M? z=D}o$%Sw(1?K9PuS1w7suBJSyrjZLqB2RLQL|lpm0w;4|6ck>92514Tz9lic3P&^qa|h)J5l5z~jJaOh7`Cj^;WH>5jmJkRlNl71M)6b1@eImMqp+0ndIp84Q7S0qLIx$OQ7S1V zpD```EJrCfGbn3~r;1W;XPQk)fKu*eT1-liQohWznv@Ww{7t6Kq*O0}+|I9M+6~I0 zXVDY&UXNO}lpp6sehD-#1MBz2bQV_8be0#i6>}!qp@tGx4XQ?5Q;1U);*6wPN3|?r zRif|{lBPvE57c0)QH#b?sz;4lhC`8bszZ}Bs#BHPX$|hW)asgt%GBkWV`!6Fol4^- z2keBXk+LW!_B8qcr5-Yjb*6MB-OL!L;3ZBL->MN=Bfuc%xCtX^74B-AD=qGAU5 z7<5Ul1AB0j`Kpt@<$u7n6}x)z-Ck_%yygF4b+LB7h|f_ZRzz@!ebU z9*H4+s5m@^?}6g@0ep{`)d!mk!AP-ZS$I32 zekSU<{@X7~u#?91(xR7q?jn$2WwlL&a~BSnSzL~HUp!8fmAn)O^PmLoc?jAf zcn!cy#@_Q}5JC!Mwbj-QOFz@djW+Zqvsug3Hm-;HLYQCUcoGF-(p)VdVXidDeh2L{ zytRi~v718KatH(h@w^Co2&>5UD1;|6m?5Lkov4?JfR0m&2e-%E(;M))D z&n;&a%5ccakj^GE%PBC`z?I9cEajGEo-PT%YX1 z@m1Gs2AJ-Vhg|zUjL!A%J1tIG;svv7U2t@Pl~vTxRQQO)#RfOEC3=dxd$rL`Pd`N= z;f_dOW}!HqSpvs6L9Ymrf$dgb2vCku=|MjIa8%eX@k$2&v52VFN7796E*VL<|c zLqFzEF$X_?=)%&*|EPLDQ~dkp6w~d!Wg}l!{~dF^r#g&D*LN7W6)Kr@{D@P#Y?JP6 z>q}tS(han>$rvbv2iCZO-OvAr=KMPwaTm%HAUOFoL^!GLwYWnAr7}aFgTWclKv~$J zfdq0Kf?vYl7TOF7jmXqPu6sY&_(3T)=oejC-QNxw<=5cAMF)(l1Q+-@uXecOg0}Rx zz+f!f8Y=n<;l4GlZ}+J9pcEB548{c$l-q%b9ctJK57RI#0}m(z8y=8APC@YZm}BCB zk3BSup}GG628@^Y4dSpBVDyX+`aL6Jw{x4tZ|~_(QuzC^^3=tMhJ_ zVQ)1#(9ngWb8hSLFi-6(wGbsO{wFZnEyZXdJi5k>?j9qb+bu;&Q|@ANAf=>~1urFe z?lta&npa`C25L}7Hq;=2%s}v8m}6Ry;bRZE{{7(RCwBbUkNL_PgBy7EP>lmQxbH7P z4(=sX`_T$r$nDMfL6hv;j^RRhc#Rw0J#1F(u(7w}E*%GE>_seqv1ho~wG&$209hDl zLAlt_f&_vmS2ZXL6Ds}4to&`I_w$lb?tcqw<4hugyy9G=@i4X*m3j@sn`ICBm^+ zHpge+4nP4%g&mHk&_?W~Uk;G*C@3e$@Q%p^WRB)yAZTMH(~he4Y?3x?Cdtu`ySM}Y z69U%Geq2QR1jS`_&M|ZPNs#u9H3z~qP>h1Mp%@8d9)f33xVnvNWcF?2epQ0!k}F_$ zF*`;APB{{<73J~v7z?4e;9`$RGTbUBr7?OUn_Grkbn%)bmxtoL^~S)mcEkoJIlU-8 zCz|noR2?kYn&Cv2G&@~_=~y8gTjOH8H>Cejg6Wdh+(nL_Px}_K9mypv+wokI?cOm5 z7HsF6Gb90GHgJt1x8WKI{3C<20nbDJ;huqM94E3WOfei>OYba$)e6N@; zw<9Hpj-cS2h{i)?wf{R24UNv1;CZYN9$Vwac8}+;cf|9y11ulS+sSr&C_|&$19{sX z?F{22$ku={%Gm~EB#;yYi#8ZXj{}VL13<_yAB>lE<{_R0)*X>-_z08_XL|{oLD4SZ z;EwEt6DR3?*#U^Ybc#l&AUg9KH2PGWKl$>@Gy5Yxw#Q^7a1Kqe zgQI4O10mdDCYh`UH>uil76s#YBIrVbVsbpjHF5*<5?miGL&<#KoatV7-fLVpXZ>?1 zOZv?E=Wv@#A0r>HM)9GS*tl7s&m0~&(?{^MGqZk!+i3NC{Sf573U?TDc(6pDS-)Vm zYSs!?eAa&!KNua)Aw8|v1cu($Pu!f-$7tEC5h8QA#i5U-pWyutE#b5|9-}3rCdU{) z2iLk2vtBx$pD|33;h8zpJ#Wr*%bVN2M{r09bF@RtFh?*4%Q#2ppe>fR1+vDrW@+AGphcdxw%nH+=Zdr_xEq=4ynfKuK)91i>AP3&Je8Cm5qOvQIG1mW^u4kxuY3zX(1&ZbL{!` z^0A|tTvE))#~`Bdt)epF(cDeu&)@p;jlZf|AAi0u{`{)=S^AUor|+zFpZ+@!1XOQm zlkNk48)|S47_Ep40AT__96roNvEX|rAsqDTV(`z9H1N_+P}4=0Aqf)j;|YRA2;>^F ztw8V@4h}8JP3BQc_o{OD#3xsOUbWsbRcM(4Z?V3iyYGHJ^z(yXdhQ+m#dG(byFYq# zt@qhY#uItAc;x7&58ia#;Op#@)7R80Xo%3p)N0+MI)QEuvRb()!4EeSq6X43IPWNU z)S>z_Y4BS1Es1$@1$%@OruuOjRaUD7xaH*q>T699JJAa2w4heN=j3umQT?<|PeNs> zx+1TiSnmJ$+xi@K24Wi;ZnyM+fS+7$4to zyW-=}w;WU7w%T;JYQ1ixP&ZQS>HqA;CpSL*P0V{#*ReYN#liKu;X>Uot>LlP)Aa0D zjcq@D`J%nLt7%g^3KD+$M zfgFp5co>53^+aU`JbhCC%Lz+)^s?dEipi%DnEAg0tk@n5h*oQBa-QaN6SB zAJd3`hLeY8?a)xznNPF#!{ck*cGyF5K|pdmp^_d+y#L z=3HF>W}D&g%;7lbYRD0;Mqk z%s7RpTAk}*JW(k&w4!vtbLKAlvzpIqzVnbJ1a*L)rYC-$VMcL4p6eqfB)1z7{XGW` z>K;S>04i{HJ1e<#8;QTfZfmC$Up2J+!xJacXa}K}!SrmNUguCh66!QS?*;py8PbaZ zLXhwnv|)gYHg#*&ei}iKtLcpfj!gT_1icPx!X&Ps+K(jYfgtuo`;|pM#&GWxt)8(y z(Jq{-thj_D3M3M+S}$iX9!exo0D4Y1k+_&9vXTK;{A>=gD`9?fNr3eGP^Vgr#x}hG zKT-i#`#ixdfy(JizV=%WwL+E@SOWI*n-6XIqRRDS9L_2Re}ru{CBPQIum6$>vm-L} z?NelkVlapSDh>@$HuAp#6n}?#?DetSCRYJLEz{anZ0!Mr6+3&2?L8PqhQLPa{|Cm3 zeIv!;@y8uCO%*p^-Hb4;1I58^OAdVNM^`eax&o zYH~-ByKSBADX=}reFSrOA zvA2pn>A|eQO&T@%$4&lm%*1Db_5)F>()B!MZUrS}NG!c|4CRIFEm;k@3|0GgI{|Ch)EQa)qb&_S3&+@J$u( FzX7B8mQ(-$ literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/items_links_subid_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/items_links_subid_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2379a1e4d9a9608a6db8c717d1fc04917feb6508 GIT binary patch literal 4793 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 aYKai~2PyrQ1fP2og3!9S?|XtRKlMKVOj{NJ literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/items_types_id_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/items_types_id_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a123f1af016f206c61ee755992368b0d6119dda GIT binary patch literal 3601 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/metadata_elabftw.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/metadata_elabftw.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8af4f6ba9eaffdd57e23cf1d23251dbecfb265ed GIT binary patch literal 4644 zcmbstU2_xH^{&1w$se+@jXx6XYmBi4SOx|HQTQk+#-RkK_1Y6=M6+H=Yk5K16?az# zJLA+(8E7BklzL)@nF2F(63=v|dF(@fKp(A=)b5st%p@;NUt~o3(5IercUL$6xFOr*nttSv^(ADViyps;-5@ zle4Np)6N=AD@KZ`NyVUYHcRC>S(gmo=VbBZ~urwuxzGwK{MXxQ`> zW&l}wI7TV$r<#6Ej?>Yj2M>kA@8lH?SupZSiq6@1aX>s6I~Wd+DVoA$Q%Te0e4Ngj zX5NU8jAT@Ewvdda^xTMXUCv|_HZ14W$~dK`m5idr04@9kB_B`O^4rkkOv)d^V1-;J zpge+#V_wn2d_ABx(RWZ_e(1f>2gHaN=q6VLR(Cll)^(Gk4gnUr9GYlzCfhnOxE)6f zbrV)Eh52+$bWR<9K5n?U&;zSFNZB9HY;bj{pEa z6{biQMt0*f!JSPB$vQ$VHD@c|XM~Ip^(-8yI+G4lndU&aEO_ILs)0|a8WnB(kFR;H zHmL^xR%2R4*UhP#Z0d{!;M_HjTKW_ykN!3(SlB~`u*<$X_USP)P z2e3rG+B0<1_eHR8b5|es-JA72#rl1lgYhpL_LRJ&VSgFWNUEYpnBbVJy&DEAWQt5c zU)}bQsIc(wF$H24-KK`ls6GQ*;AqucR);QkOPMiwo*JNB$PP#`Re(v3+HOQ`H>&K9OQ}kR2aw9oOnJCGpAu3}C`oj%qnC5E z3uGkUcQV)rWGkSJCgChUKMQn?XH5x^-FypsCwO+T(~*5;z%`gxn5kj~13#KpQ|5Pa zCwc{HqWl(s6_Ri~0=W?dSK5l+Afkaw^u4O)>Sqt^123L&tIpIVJPmH0x>?zfO_MQH zL{zYZ8{1Nl6+DrZbIG)P%8FL!A%{flL{?A9S>qH8Y}B`bkkJERiTv^1&wugf(8lna z#o;$s<$LNK_3qX6p7Vbd0PxV^r`DGFJ)lr6GuE0ld=OX%jd*bvHG}>4>EVdS(S&dO z396Jc!7!Xy7XVO#Pc@a?Ha)OcaTDAC%3BcbbpT7`aYxUpdH>9v>z{=-It~{*4#N%D zKY0JzgTc>^d@igV`_t*Q(~tI_SnoSoBEs&Io5xR-ywG#Gqm7o=P;XcvIEeAXtVX9; zk}zo*R$T^eYp{zIRt;4%Oj%1QmJja~%bSz)46jqpxaC7jT7H`fU>k)bFQXW`Pc*=< z6)ONYVIgZ;K2B4REdQLGEhv`vsxoh20RlBJG&|#=D_9*bG5A^7G`;`;g8&A>Mu z-JdM}cJcn?#=x=Sz_Gt~9KSVo^X%icS60tHY8$*c`Z&_HI`9zgq`k$+-p9TD4}bcP zw)2~9U1h&_U`LsFY3p*}cEhtE+0nJyem}I)vai^(Z?kvLy~R6=cYlR@k6T_@9esFY zqh+YrGQ=rtd4%?pU$u38a^d3(w=b6Kd`QV>Qz|tOI^nYEf@5Hue1jA&imZ40^gQ46Pk6rXAc7+-BT7i5XuuQ8i53iY=Y}$^C z8Dg8SS^$YM!ACMbT@Qq4rJ+zBAzQiGCMp z{pkH$@Be0TJ@~54F0$yhip8d3+|LwG$Pzcx&;#|I?-iO~puTJs5jYPk0nJE7qM* z3JUQ{gzQI|goS+--+Y-&{Mm+btr7MHa#F>)rqt#f*EPh)QUpxd+VQstT@O;u9}B`_ zR2Yx8pn^0xheX1X1oveji{l1K!ZV$nhy)KqW|&!cd1*Rq*MU~`6!=m<(6JgZ*Qv>Z zsYsYH(RZw%bLr08)pfv7Ovu1?AaTz;23YJQf-{KUE%pn>>EI9OaBa z-XBAz4g;_}OksUE2-sf9F{)&MtKQb~DK-wM7~%ZU2X~erYz2aXuiQq2rhk&q*ChPR Q_nsj1Ezf*Qu;+^SFUCDdj{pDw literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/metadata_elabftw_extra_fields_groups.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/metadata_elabftw_extra_fields_groups.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f61d394180559dd00ec3f22f5ceb27ffc0c85131 GIT binary patch literal 5309 zcmb_gTWl2989p;RyB?1(>&yDK+{QM>EYxd?xFlO3f?^y>aT<@U5E*rt-5sw7c4wC} zvj!VEAuowZgCIpHrbxj^REecZ&0`;;KKIcswBAm5KuTUvUu;a?`~PQl7PCMMp-1+) z&42#$U%vC7|LjUljYObyetYWlceR9kj{~pxi=CA{(78?&LW#mD{4tJltmP@sS|9bb zk`AKy!bA~H3cG#oI_gjH5&z_WCH=Qr{K(LI@?f7bBp>|UQF(l)d^nrPXLQrnY$Iz* z($JV;$;slJoYbuZHR8G@Yw5JCjcZ0)i>Gy2H_@yMhlhaKU!OH0gdEBLo0pX754oT|QO`U4Co|NMg zF?r0kb5^XkH)Ysk`FJ#u&GcI5v{Xu`JzCBv^%L2op3==IkVy|w^MQn`zgriLL00|_ z;^sEeX@ce3}{!+g8~ zX5_Ts(WJN(7vU%OuVo~;N7m#FD4YhUj~XTb&M;-g1=qlw-|?xShhIfSoSLM8ry*mQ znw_Oj^osZ#!P3*CPi8C>4G{0-do!lpi*D*Ym!)T{oR-jgb=PC+c-DZ?IGm*{Ws?Br zp4V<>Ge6D&dbo9D9%G|D|nBSwh2}e{_!!&GFbs}q7AnK8B1(B_t zP+cSs8e67?&%{Dg8#Gd3L;JLFPYf5TYAzipG`D`%U#JQ$RIMwtuD^VA$w#W!ub|lz zC3nF9`^>pv=v*hmWDwf&vYAA<$v^e$5JeDwMpDj>LJt7CrqJcVM2b<}&QlYS{#u-3 z)Sk%cF+hPW&2h9EWQHaPjfFbNv<_%r@`R`+rGYKo)~6;Hi2vrp4o*N!$Jk*Ro0;` zFtHE*Ej;<4eFF(KUlv`>e;!i4EFlF?u8nn*<#aQ5h2CecGXmEnA zgX&%UQUXnL__FjYXz)s5;Y9@8T_-z;$&J92TLxDjtm0e;h9JSCc+&1JLa~v&{bxe* zurk*<0(Xg9PVl>nyi8#PMPg-G7-5+j4!rLeJh5n?<4Bd;haLig6@?3vVZo#Jc0JM1 z4PTGH1(X1h6vFTI#)6q79%U`Kg`3N1$6CeKZ7n z`Pp7zYusy?gUdvi+%m{+0rx&}uXRXYayqpQOkv?qP8tdOsjCW6ftFZ#8>;JMq=*QV zM&UedOLl|!3{oQY%8F;7&F~#$;Rl=wJFDVubG%bArdgV8Q@ROOML35$zbZmF;=Z(& zi6^xKPHfFEQRErjm(C`%v~>VF?pkm?u{J_=k^JSoZ{Gb|pkil8GH8NjdNdDF1GAkXxRxFNN4x#+1uS;@A`(D z+xyqI=H9xyecych{w2b7>@U2rZ^;KO(>qcF*{N~fsf3Lv+svscX1yu~D$A)zL52m6 zawNktOv~2HgzgAw!-BjvqvdEjN`y{y1az(Acewzym5;N0mKms6KeU9unEK)+h)4%gcgHa7J^&uZ|c1B>;Hs~7D8<+eqUF^ z3h~K}R|D6oAB&`+ZKi3qapeZcN?$5Wn58UpLctXV+r=)`j}5jKea| zHSK>8YWw2Y=f|!cU#Sp~li+e%swQ&RRr^}?ayw~#^Kl2MZob#N=UZX1YX3sj{=&wN zTc>ZF{xbc!bk$eb*m>2uR<-OSo3<|nNL}-E&9fmN&B{XlZ=eGRh1xAI4EG4gvf>?5 zFL<#GG`c!yz)fYCDVgdyaGm!mc5@BgeJDV-AIRl^%62Mp@Z!yAwhQI5i{A;rSp{}Z z_sh5x2+x7A7RJnrl@C7sU?zDheItF-yc_J97ki$y2_7D1lMd*xEV~rEV4_$& zotdt!N8m+wib;QpJ>5^as+@{&^jEN;JbS^H1lr;yUlK0q1z=Q6V;%$>uUxov;SW>u z;(Awpl-VmKpPqu5r=kuwQlcvl!Aa0D1&_t&UFXBx^JZfZ*)b%qx*ljAUJ0XeJZq21 z+4yNafxl!>_+8^Hyk(C>eDoI}5j)Cg0X*ueI_KuQjvp4m&lMZ@Js)|w+zXVly$WqHr!!z8>!siOGd^Q09+y;!C8jPVvJa6kN zMq*5c9I<%2Pq;6#fTi0I+1ZZ`?wMqmJ^-ZjFjjcQJ54GaOZc@bp_VvWut`4>U?Si~ zW5gx{0A?)KEL0zpW!~o(m&5>6btD)n)HN;peNBOj$067S8w+*K#o=Q~^lw-SkwEP- zU*T_E@j-71d+-Vhh@ZUw(fiB1=x@gP;1c#qwBZtM7-^+XMm`!rS~g#gwBbjgHh=S@ zJ-k2qNaXz+9*KT`?~k>-zugrc<%a8L02+!nro&U6V*26)T%a?h%CvhKoa5SO$A2W)vR(fNTM67- literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/metadata_extra_fields.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/metadata_extra_fields.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..649492b396d3e95a2620ba9adaa07b38583add04 GIT binary patch literal 6988 zcmbtZU2qfE6}~I2WLdH$%a$!$7_+wd6U4H^Kz>|8{`d)@I1P&l9ecW7No#vS+7)+K zfK5$dCQYCr4GE<&lbJwf(n*-fOw)(Xv@?C^V;`-O)asU*W+r*b^u@;Hz31H3u4N-g zAQ$WI{W|Ji=wyjKTi?3Duk|rc)U`-*23fCnglyCl^$=oYAw&grcQ@Ech*QK9sTf zw{usBDGr4=NqjjSJu^~Zr zRA#32qxFYk)yvprv2g`WKnz#aL!+UZV$z_din}ONs z<3q0;-ZLmL;AC>LVF-XAxoGMFD8tpFU`{GRMQZ|T%IO8n6sSHy<$Nj_+^qvfOhL)2 zCL3VSmzT97;BP7ww7iB%EiWK1$y>ZRRZuM7NjXx|S|J;>1;jHAzz%6W zW@ueB1ldr=K>}2W2YzTKOTU8*Op6;PIVjnQ)c`G3HKb>W^;Hav*yDJoZ+?THC|02*)UfYe|L^%{Gh1QhYJ1^}ohnh;E&T>cBrI*X0mQrY4xpV!cgXK_LDb!P5 zx8=)*&IK=N=v_h`Wn6eb1PI+0zC;e*$aCAfypjdZOo$YfL~~ zNk^M^ROZ`Jp;S09D|d|vZ<3#$5`VBPgTdfnK?YyL#Qum9tP)_W)eMeFKPBahIa9Sw z&9K_jIaxby*Cbt&vc*D9&A@SH1u~OL=6G5^ZSi0z%5)fWQ_U-VIXxrin18Z-N*>Nx zE2Nw*C}5ayHXF=)Sw7WN@`mNtiutrctva3gIKv7QbVEgVXZfg{Rdp*sl@mpkDp|`9 zhO1;u@ReXjki&EqUj*~9yhWO`d_@CJ-sx@oHSiK@R$#t@o#SK3<(RPf%)m_YF(F?x zOd$<8)fiUKJU%m&^jg6q=z8~1s#D7khksr+8K9D01}GavVJ09YTM>?dS_XHqj5FE+ zEqmc-JPz48a;J$Tj_?=4V34;$8*VpumYa6}HyVGpZI-_k?OXDBTfz&(+ZbL5lD5R# zK^t{0j$jHb|1c|j!?i-2@kckqhaO*ThhTtcO|%`dYAeKZ%j&3Qg>1Rkki6Oq&s;n+ z7f9S|hG;HKAWcxXisur1?ZnQPU%CeL{cJ2-5TmtC==+DQa$w2oDd7-@34#XF=w2Ft1;P&(Uu!r&U2_YdOkde4EdIV2LmPYQsqqV>zdC~3<3Za;(;yVcZ30XB`t_b`Q6)1_N zmms@Z71j9Oi2WkWViN_WAiBxiA_ zt6~K!urnv;(^+|!)mO_sRHjMoWO1gk3ko**hcKDZ1=%_B*=wJ_`j`6oz86Y;FU-o< z)obbp$LG5C|AT{!xem5+ZN7g2GpyztuZA^n2zmsmc(E6ygWm_qV!Njz4SwibG+(v} zisnfH^C$?Og~ixci7H>f&KDsAb0h}3jC166yld9H@%*(@pVrUEx0T}C;0o8f>BfnV zHhsGNbMEGoe|+}lv$wYHoa=sOfp9&~l%LwU;Ds;aJJ|^D4(e&E9u}f@4Bl9I%3zml z!>XHr+bZbB3aW;x8K$gdAkNOI2E^HUxj>(TJ+O^K+z;BM-B3qbqnKt-925bR^s^Yq z@>9it>x9L#899l)Us&Gb%9Mc@DhQq-+3_<%!CLbGh5sH1j4vUBTX3}Hg8!R%;{BQT zW^Npw-|%E>&cp zV^wn4WbC!?g@?E?w&5}Ms5@rwek{q+qcHHEeZw;hvVZ?)7`yk+Ft!q*eidnX2d*e@ z&CCTl?JeUro#bk63|dyW5^lt$TkT4-z}5sj+0{Chhq+p>a6P8q1}MOd zjvE9WZAHeo=`Ai$@5dN>Vnya|5-Q%OZ=b9v1PK}4qMr6 z2ICg{UW=p@0}uNVHh?9JFp~Tbq+|@ms>yj=H7H4Ngy=7RgBN+y*R{MS?cW*i#wemVtx4q4@!jZ;(Zg*B4j__#tZ|(Y7-D#X8FI z&c%9PtN+|VY>bzq?d4ckIljKqcsCsOZCwzEKfLIv^CgzNP+Gte+;;uJH%HEoEPBFr zdvpOyF6|nZb`8>o-W)wYy66e`I8Hwf9PbGudrezuUS}q4hq*9fgy~*3a*1J zVd<}nxahB&xLcVRBe)}s;2HJoa2x%IchVL2&i>0U|3Dhwck~VZ$X?+nzx%ZV{ON7{ zo@{b@O3rAKrergI|Iy=$%BM^kpOV!iQO0GJm(pooIxQ(_X*@0Sawe6_Dj5yvnG`=I zYsa%Gm7mBG-kf5iYK$)v6^7-vC3v3i;WOD&(jdQg$JS^4{=+#rgCeLoImw?k_y&P- zYhtV4zhBPCMAGCGKRz?aAJ?>;Iyf*esc6Ti#}moy)PQJU7h*$6lRRSke3w|LW z)Cjed>J$2eV1zlrlB!WosE;r^%)v?ZX!Vg$>9j^!XmIdwLSsoiFdC@Xr^&&?389jD z&1g-7IwVxKk#4<|%Q>cP=q#Xjv09!}^esn?Iz zSM1a2;NgU5NxfmTp<^yB2YAB@r-9vGlT<02=07>-h~7(tHG=mvpURz zkPRg*>wpRa_Q9a*SPik%-LS(<8tF6%SOa=V4f$!JZKl&T`IR-d*d9ClF(pQa8InTFkzvNetR(KPI#l<%fdS%c!Gl-JUzxk2$!%2*ng z!Jt%8N-m9SVo)nGqD$xWrAeNw7C7Q4X5Jd~uIs;!DSg(l4>a{5aee;x(k+dvXE70+3-J{Cs ziM8^pxa#1$jikRdFqP2;Qj#VOoXL`tYEDYZ12UWm6WST^bXI}dX^=ciC=r}dmFgo3O~+K^XPdkez3~Y-*YJT;d9Co$ymv zXlaL^nnHWmyytVSwY(aQA-TQK+y-3!LT5KtBZWZi!mdKN_0s-ApeY~dDs*hPbf^$$ z$Ok$L5&qJ_LZCSx=q^MzT{`?IYHL2Qq0pW9ye3)*1oMIRLTkt61IuovrehWNOVYLz zs9>2|RRjvxnPKJ#{FbK;Oq`u1`(-#;(XS{eK05&=a6FC$DL+j8gGAP*Nd~>untKfr zZ6+rV!dBJ%cUjT^vcL~Yr=qMpX@{I{6g}veT}i!$OlU~wndN$>K6K^m!rA#Ci2@~Q zdjqK0o&?S3I$AOO8i`twEc`D`{eJ&oP68(iYq37F*aS+}D7d3Q%OYb+Ef%;Qa(FV6Qdb#Fl!2O90Zt3sSB85l zYE+Iph7a@x2ktojSEw{Dfpx#0U6@_u+SU*DNgM1(i(SMRc?@VD&HXq;cZ0+hqNtez zQ6!L8Ap1AA*w?Obg7yY3_p`S7Dw@Shq+Cf zm{)(pFw@X8*E3=VkdC=_m}6x;BPbG0!=4e`a5P!%o6NcdU%exEm7r+^-4sm%8)1e$ z7PmF)vBr(idgx{7gX+^X>=Eo)?NQ;{HtacqAJ%2b3KyFrrC_8|Iq}1dCTnJUL@12l zji06xIU(W?GvT$NELk&IBbDj!Aq2N}54)&7A2CdT;h7P1Wi*Z8<~B-?mI&S|0Hepu z3>blK(}>Ygn9ED&g0;rEhFJ)BcxL;K(CCE`^DyFQ5IW7tL{sqT0siwTC8;^WDYz?e zC01XB>^d`I?g*4dU@dL!bpt00QsUk#OV;{qfOe3@HKbQ*SrKQu>(Z-^ORA)4gzSS} zaaL!~syK}iH_*AAX=!RaCGFDt9HwsePwY%*lTupU1qFi-LqIB?cjuYkzVXTHf2>~W ze-tk(9f-7hBYM6-7 z$@E$?x-R0kpsH6*%J5jF5#6t-N=DVBOj6c8X+?$j`IM9+xF4wCx(8v@y~ZfOtxk{A zxI4kU6Zg?@knSV0I-Q1iIUSP~b?<2@JuU0*lk$v;5o#m!X#~S?ALyY{$xL^MQCF8oPDk=80dW-}7H}7ot5^)oXzjH`BFc*~ip}=W8GKEh@H0{B3*btjWF~nc=Kv+^k;uXmHsRhyw|AcTI@o;W+|SP4NZm@`On;F1EZD!u z^*^jX+62`<1_c_-MSCermVQ*P)_w3GG)5&Iqpzl8hS+0qmW)G3QZ6tA!%^=F!El4z zf*-h-(j{Abr1{> zJ!pwHC({s&p5Vu`+HpQRenL*-gE4{U<5TeLwJ+`_0!T!y5kvoIt)h6>2-E6b=mf9A zD4-dr)qSEUpMv#p2DS`hJFZ4AFe8L$S{+NlL_U}(G_~UD%q`5__I_0NVI7bbxx~YZ zg!529@dFeh)$HIghS`D&v9p`)E%_*gGWfQKO5J6M0t1wboslbujl>v=jTaC4qVZ{v zU*vcyT)ctc=}Tw~mxh1n7Y5!X2p)TcepKSIOCRuzH$EJQv|&as+8mbf&SSjxp=NPz z$V~B8T=R@Hg`)XI5suyIG?r^b5j8Pef}%K~5LHXVt5zlp%~b$YHVJ$4br?>sMX#xh zPiwM>zPAHuoOyN|uaCM$@B zJWvhqj2oTqCR{Z2Q&`$}nH87Y%Pn(0$m*G32s~_|v851hH}ke=p}u*gp}N_3{?KwO z6KpDkqJ_ptAsjRFwoQflu*vWs9PxH8zrgtFR$Nuy)>Su@mazn{1wQWLn-|_(adF-- z(u2!bS`L}KQJXi4ymc4F3nKEyklu{EF`Ku;=IubMj1bhrK-9=<_7z;kb&(Lj9 zwm;y)W^D3ZsbvkY~4SZ>aQ681J4l;+kN%9Z@~ky#;pGZ D9}w{) literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/notifications_subid_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/notifications_subid_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66983b5aa93ebbbc412304b80c9de19756090e2c GIT binary patch literal 4823 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 JAo%6C{u>obY6k!S literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/patch_action.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/patch_action.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4dc3bff923aaf8ede3d510a0b85d62a8cae91ab5 GIT binary patch literal 6796 zcmd5BTXPfF`RwZIm2BCPZ`fcjHU4)WS$z^JH;6cXELHZC94@ZnNdVVOXqY|GofEgi&@2-)YFDIu2a!DVwYj> zuTTTF75BzOQS25q{k%LV9^F6igdn_}Q#3@u$SEmt%APj}69-}gf^b~X6e^oaT1-w4 zij$_9GY0$nCscDXpNysSY`<|qo|sT*pPW<6^^~4gCKN3O(}a6Sc|2v)Z$r1!Sp64N zZjey|%p=G+>XLZs?f|yIpIh?8T+}0ZC7eS z2C12bCu*XtR^S!cOidn6p|tOX0qdD_@t02>9Tb`1QyJMXM9=^^Z|Wj2vn&PCoK!@I z>mqWxGzv1$QGJ5S*_a?4(Lu(hsH9bsEwJ~?%32=uXF4WWF2kgj3p6L{vb-|G!V+?D zXl|0qhGO}$ima*H1oZ=Iv<3m1MLboK9yACKKUD2i4FH$}H%u~6vkPl+>smOU6*lG= z1tF*FGv!@}`J@+m#7xQ5$gnHvgPws5^xI{Eo8Y4SOm77T#XeCMv%rlEn98`Sfx@bq zDA~#xkNPZM!XYw{sG!oHaLBZ3(<)k6R@G!vr&Ux(-Im)>GUHX<24W5NBwA6Ktg~Hw~t$m6{2s$tW=TbEp~)!m-@6 z0240IIQyWV@L=pw<+RoH{1$})on)|rIcpmKu@lOgz4mmMU^ z&0IXLfEPmLv>7exHy4EBHKX|QIIgLLZ{tooXz^;mU?xC`-!$wXy9p3MpwYCdbLiv2qanFn{JqA|= zK^V-*VE7K}zcDx0m>HjmozSM_jG7h!<`ou7#%#8YeM`*d4U;*Rq#};Rbxj$I3YI^a z(Jv+yI$<>^7gL$Mp-w62cu<+G8i++HC8MX#SpinfYpmgB(3Mj)FfDaLvuaE=s~D!7 z%~_Fr4opdbXeOgcjjKu~ZF%j^nSBq(Pwc%kFdKES1PlQ`)WSUPF40QmRwS z3z%eOlj%*=#q`EjmOAi``UNGOV8j~+iVf_0O`T{9^gIVY;|KtzKf&;oLwCbl7q*>T z3da|M@%ub!8|5$86#@-Qfn6|Cs6Y0PhL-o6=e& zFw~@)QO#-S+{ZenROJFR_CrIG#}yc<;_3QG_6AG@p`u@%y)wJt-?~xF%aQCgSaE|uwBjBbt@!^aTDhWbIRIiU+smVPApAcI(l#*% zecQesMN5?;IL5`q>A8oJyN7wjy$%FuO852xnAyKc7;{b;dw3j+L$vCK<#Y!E6nrUs z;X$+q!1|cQy7xeL9)|`1%#r(H(iX$`6kZDSviNk|j!(X&hJkhQX^Z$??M5@l8v%2f zesC2x$NIppU4sZD;WkWViO83F4C}(jOD=rC^|3F60Ce!jEtEbYzI?H1RAWxMu#v!QK z)2_lM1{(7m`OWK}z54r_<-X?^`<|bdZ>cxc56>-hocJRLfSC{4rrjP*iG)Yyt+jRYxS_|(B>P4#t4x;QZtJZn4NMP<^SiT8J?m;G&pc<+MX}^|IEO$mVOv{y(a}=*= z3~|eiQnWnwE->53C)r~LMb(LVS>j@OA$`qfOv}yoyv zus)hP!hQz^jL!kUJ-Q)s+51&X+Xu5hnZ12#x#y|Ho~QoO^7NJCmyg_SY@a`})VS;N z(Yv87^F1F!cDZvgwDWFf_s8G;YvYMR;}-CtJ>ga25+m2V*MkrIB)nz5>2}R>!|ug~ z-G$B_w`On7e)t0%yW7w{fAr&h%MHDY4ZUoK6`pH4_(kKE4_c{dwkn;hL+^(S6Oh9$0aa&OJph zsc*i#i62J>GC%%3sDLg4w97+%II3P%DOq00BeA!DSfwX`J38JfsFDLAmEJc?2^@11 z_yh%M8H7yBmvgRWD5UB<$nt`q@ZD06nbnGdz4 zP~U>TZ(|rki(uq;L4`eSptV$$5_ycQ)?@I-HpUPgWACkFHr8X1x4i-jH{c8JHc0ly zcN@F+SFpy(-o6M$u3oxw>BpOAZ)Hi1!HRWWgBw9ISgH1wX&`3;UgS25yu;jPy@TL{ z(R)^SatcoX>bRKH%}G&Do>fx#(hN63NVet7F-SfR!`aLf@sSEmHIcYu-zF>%EQ04` zM9?uk%bQ3j=YbvT1ZemD8m1XN08oHvSMAH8zQs^qA<~M>fyDN<=aagR>J~$>1%J#I zXPI_bhIJ-Rd<=q%95;BHkUdBbH?zB}j}N1VJ(eO(cL;qQHmJs0Q#N9aeZRxGm~w#2 zh_w7EBrfw=xnvkR;rW>L&E*h4CNQjNOe@pv?XtkdKy9w8(WU=sNZ)`N)z zV&sg35{Yq@8fFF_H#HrGeZX%$1sVn!46$m_^QpX1Jhi*G1KoOID;#j5@2WW9}%fUd0PWc8pR2X2-y1?swI;>p2i&K56KGe^7xB> zFMxUyX)QFjg8)~2?k4Zt$zmOev=^GY3X!c&&x4@g=`OYsZ`}&-^K4ypL9K{2xVC$P z@0@x2%nD!c>A?O-5o^UAY_8uUI&+~07gBHivZr~`)4amhcy{7QOA%|uW@q-c^6YIm zyY`(o-hN|+581mk7O{4}Ym2A({*$~XcHhr?w%zx8JpEtS@t*BA!AL7an-r292Vn73 zp$D<{9 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/revision.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/revision.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9cf4b2c13dc14c23541704b94e091e571329d8e GIT binary patch literal 8282 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/revisions_subid_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/revisions_subid_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70c5d443c0cb7327a6fa32af5e4d0e99b091360b GIT binary patch literal 4754 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 Dg^W*Q literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/statuslike.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/statuslike.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91d271012f6bff2f8943b3269132f9010f49ba29 GIT binary patch literal 5534 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/step.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/step.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5721949e3267b4141dc0e4e0199db25548401a2 GIT binary patch literal 9884 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 A9smFU literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/steps_subid_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/steps_subid_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e01b23b21cbce7350b680d964812e44a6046d44d GIT binary patch literal 7053 zcmbtZZ*UXG72iAE$+9F%{{I)7!{(nLmK_QqaR@0XkkACDa5(XdNzW(gun(k@*gHXN zVoLgi%z?hXG2I%^C*sL$rq4X9j*V%wSIz0Ab~2mN#xx@i(}LgN$p@3p z`JK8X#5jjSJWfD(1O-QZGEapr5SuKpKQS&)QTEGKazL(@vFDfDxYhqR$UWaHYXt0mi5EO!>g{TTQ(;k*O&Ecj@PWZ zrlEX}+}KWNL~epQDmO!2E4M&hC$~afFSpT#v0$vjj>wjlGv$0jPrZ~)O?*=i=bSt> z`1-K}0}{hbGOe1X1mIEgR#pN%loTjgks74;3HxUooKGUMM4?q_aY`>aBxY}XeRP;}4M8=S^k4uT!owfh$kH#M0=wddNE%vBVLgCKSr6y4!oIoIMVxhl_ieZ~UD{)a zPxuKLmeNo=Wyr@y`qNdV5g`HX;qRxBT~@}pF)qeWZeK2PsaH~^42UlcW(j8m6NeH!?P6V_SfOjd{98SoWZ$_Bw$dvg=uD-5rzxLtNEv(H3~ zDJFu9@f^>AIu!-1J8PdGx*{9=V43*xs}Zmj+V>_2)Sjr zewVw~11exvrTxJ?#L2w;XyOe9g9AAgoQ$i6ClTudsSZxY4;g3Fw4Rcn&TH(_8+C*? z`jnK(n-=q92~8Ru%o^Hg%xC)@!?Q(jaQX?`pU;8CXp=kFCM0b=*FP0=$pI-Kgy=c< z^c0W_zJVJbpfpQ?be3jRi)lLMW14o<8v(DGJ*%Y@#-(YZl)+*j0D!i^$N~5>_d&(f z9j?E$_ip{V+0MiB^@FqFLA&jl=|~||Hy_#p!-d*||E+8JuzAKmU)Q%J`Whld;;V@i zgQT_Va@avgN&i3++mB`_@0ARt+;2UZxjX>{&uHLkL8C$R(^ja;O$KifyQ9Kn%J&+^ z1+`GQhO-deFc;l08`$s=(|H4?(U5WqYxmdvA^&9#L3z(~qxJEl@T zvexgII@a4ou*M|KdfV&H5(DhiMiafNl`(1*8g)#e+QF6L3L9K|CuUk1>U+Q;s5%DoQs- zl0wBGbiDwmfxPl-Lh`UO*E3RjI}Gz)pkxRm$Pz04*tyNpt?Zrwsg%{xAt8>`&sou%Z|C0 z9q?@I*>dajCtE(-`8juI_wQf4^WyyWJ+m8LC=#ywg~GFYiaz*d=Z@7tQbT{+u7-^$ z+sv+U^CSueP^Miqra@v3@*Y9m)D6>8jU=Qw(zX%cujxB83J-2E1zgnKX^z!unyNw+)`{x_COdq%#ZJXJ2yKy19c`my7 z?)skFKlpd!p+aLD1YDcymxxblxZ=MWz8@giX1;pWwH< zbsaMYZtq;E+d5abl~GvaxuzGsY;61Z)em32dU&ZyKuUr`sTd~GrYqLf@Ztv2`rQ3) z5^ny;xSd)EZJ!HmFLZU^JbC@(uhJg|ulNdGJy*=Dp+z5AzrE-uwawEtE4?|&ka_bT zLIdCkwNuvgmr@G+Uo!7R(J%DGQJ z)KlecZTrD6f!vB$zBBwsSYo2{yFk8jQL@lkkUp%_=N42d2*`KpN?=fj_2nHyz%8EyFB z+@*6rpPCJp`<1!kI?ph7jGfpslJ`{$zlg@#s?&(x)C_-r7)QcSoLQ)(C* z5TA1c@QU4zN8%>8m4La{kyy4Ck9CL8Bgjbw<2d{`oQ^>VxQ~XGe?+C(fW+8~ zRkKWn^B`eiC zP-RZ)pm8RtRW_9dPgF2`8uGH#G}9bwx_qxi}c4 z4BDRXnE@ieGDmR3@^s-1$eRZUO*K4 zzK!srlQ?05f$Qrn6cWZiHcvIW8ykMdzSxWknL@zgfM738!BlirW)DW;zKfnn~ bjf9K*hg5$>g7<|9p4)Kcjc*D5GR6EK;^{+$ literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/storage_unit.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/storage_unit.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efd0f999da2287dbd0ab256388c96c81d647548e GIT binary patch literal 7523 zcmb_hU2GKB6~42(vmVddUjOX+X90V_Hh4i^Qwkw*fs~Y=&?HX6unMW&F5}&?J+Ob= znFZ{Kggi8XmMA0?1%z6Nlqx~0)I3C073HB)U;0*WN$TwsRgsdHs4q4q?>*_Zrl(aptQ0l3oi1e5X*Hh!GVvSK zd@OD0Z`DD&vpmJ25hn;3kD%eGU-r>JFPKdZ*grnOQ(g|r4YD9N%A$<@pu9$Iijkun zZI}?`<`~&#Go+0ZjRzxMQC3@SsiG0&u%{oI2-W?jwTecN+dTcIiKe>Wv{%sxa)+ni zJkebDn@AOnAV)p@mWh_S-*kFuT+@_sGIgS$LGJ{(r~+k!;3I~Mv*4ogPB&$DnWp-PZb39v0*oe# zv!;+rY0yli%!tP}31>6`6VZ=Cb%uP|(RDU(UZ_NS;2~CGz3>P-kJZxIz~@3wWzAZA z#wwxabGs^?-RJjLLg8{~Ri%6N`2&?uq#TkeYu2A1t7>+ZL+dJi8^35;z33-R{mUSY zq+KjQ2ipvJF=$*ONpcXLwPk?Bxw&`utKg?`J82oIFa<5xZ(hA>J@X;ld6r2eG>LRz zPc6wPRgDtO<1T(!wxiUTEvln{Cqul!(H591JkV|GsEb6SP_xxHTfDQ=GP{wc8LBg6 zv7NL=-ad8i)Y&kFLz1N34Fw%{GqytK5^foIT7?1qm-2TQ0#Cp1RvkdE}AhsSrI58s^T;%?mv%hrk3C_c0i zEL0#T3m5n0S+kW!Eo7h_#%Ld?Y~k!7anHb;y#4aj0WK$P0wg)B@1RSW~3=v$Vm)g z5I(YljU8AI@=z<1>)_0GQ*CIJS~rEEVKvTN5pN*rF5eeQo^bPFCM@p32;cHa7~W!N z_VRqo=bEzJ;(<4omZbv~qC$ z$px2(e_hkT73-0WWkJg$!2*|OpsvXJ@UmRiFsSdq3yoC;FC3s4oPUIG(1EegY0c0V zPI%x28eWxH04+fHb%|^yd2Sqrta8vBSK4FiFvt!#6nCH7Y_1*T>E9Dlf-j5x4@&$$&%cNIl$+`{=nR;TsI1 zSV;zCSE|buBJE`0AbPNx;-oQbP8s0johJg76-Tnm5gOwi&RfqsA^QZ9Fr2R`jwFXu zjSla_^>laA$MpG-kPwl`c$dRs96bdqIT4MQWs4kIl8xc4gnRB#t?FM@o zW{KFVDUN*x;62R6H)b{%g%nD=;WHa%6kRb4O1HpQan9sUd17T#*pXFolNn`~Ip}pC z_UDNm*#exI`Yvc#WS;>Oy%(x8{NkS*7lxlI4?lHTxu#vwt{$83J@7XUD&|_4 z#QOUF0yxy_iM(CJel6{X2=|Ar_4qWM42$N+0IC%FlyJ$hG`Y@rUo@dP1o|e zq2$x58OUlng)gDC;y5Zs6={}dH-PhGVx0t7lId? z?g*s4=W_IV<3iiUa@)pA-@vugS59Aj4d2~rTXlKw2U{1~hRSV2jKh+Ti|+g~((~Rk z?>uwyx#flcatc_S7MqAPc)_^Xw6vCVKXGRrY3lsVG59((R1OVQde>b$dgbWvvhRo& z{FUDR3;M;-lArW#S`3ob&a=(;1`KFG=Er{u4ZtGQR=KYaN9ffQXXiN{i6u@FUQYnw zjh3I5s9Jfph36E*0&PveXa-?d0z0$4X7OO`?=UYN zecl=JbvXL=tG{~na^_n0O7?30W_WmB7`|71+!0Lub1=si82oR%O~O02cg0R z#C^4DAv|0T4_7+6(Kx5ioxaY0*z$f$Ih>dm68G8&#jxeXU>QiefYHNZ>P%h+3+kRkg;oZd@Vp_?$HDcFbb zf3I}P6`+I6pCJK;8b40lvoJ1bEM|GEb3@jI<;{HDeAB-pa#6Zr0BKeQIH1xdc3@aD^}zr5sYn<5xty6BzSzYcH(- Jmf({~{U6}5w$lIr literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/storage_units_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/storage_units_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ba063b63dea05a6b6c0398e14321e468a6421b9 GIT binary patch literal 5378 zcmb_gTWlN06`fr!DQfkg9;6<0ERQTdLMNgeBhEv09K^NbxK5bXYc>XGbhRW`)Y{~d zo?Xh3QY9)-GkTCrPy1W0~@{z#Vd-+O1dYnrlB zr|5v3oyXlfcg~!-b7$8(I%EQAxK1apm2pKgb_th#Nz@J_)}ye ze+F1!fNUp9AWjtNw6s6qzQ=+EF%g{ox2(UaWnVt|20d{^IZ0po@i98Rj~*`PswLgD zHQOkgvV3yNuxP&CM)SIrV@6iDs8%deZCW#mTDGWD-ON|YhG|2)nWrV)o+{@pI$374 zKE!Uz)vq%P)Y5%PO6dqS%jdLldSw6Jr)2r{if*C_Rz=UzX;*F>1otNQ%JNa&)R|`M zd77OWr&G3FvBt;73WhyZ%_ei@(wKE#D-?7#s#OfXoGa(`f^H^3O#TLEp31rNck?#WWq{&L%r>E+e6>!Xp~VpnD$lQ@)D1qGnkXmQ$MLnx7057?l%0TOGbaEvNQjPPY9-xit!NCmq#Ah^ z26I>|WT~8oJVGSGAM5KW$bia1niQerCSDUBsG&Shr@D&1p0t>4A>(S2A!bF4VP8la;GD2AnQwpsR73KCz1#_lBE|X z@3&ZJ5ir}yjg?G$EU($x*!eO$YgM$IKBmK7nY7QV(`5r{)39gCj5h*lM=LY1XH2iE z)~no7Ys_-jR;}XVs##dwWM#$)tEvGFs_G0jPc!LtJq`w0qma#$FJprjr1#}odw|^^@VAg=9OU+{iwExXJhrs;`0buom)c(i7JneSfcvn4ES4XQpDR8;{T=@3Bt3T6 zmDQ>HauZWw31%^vlJfM$Z6kG<1V>EfVc2;6Zf^tK5u>9n*%G$|92>1RN%Njwo7!s zy16M${$<={J3^XbNJEdY2;>8d#Rj$ovNZN!4Hz3GTXuX9*+@`4{y0Iyfa4XimzY8Z zn%s1v(Rb9_wxg4kJc;{H&vW#WSAI`O72d3jWZ?93(Mt zWWc1s95djZ+>}8M@uUcGl9oJaZ`4ygyP@~B7vUZBn>?i@@MrZ=eXS4+rKJm|GRs=p>94eE zWy6o=jhy|!VT`OmB-USn>`KGAl7{%no2|bRuwB7Qz+Qv~ zpWg+<(_$S8DfJB=DBK8!%w`laKtVEWz0?2%8^O*UkX7JsJrCJDxzj(iVBdJ@>iJJw zSNiuY_wR$4YGn6~b2oQ?`t;|*;IC`0?gY;2Ggb%$A)JNehDKcNz-BA1fwc8^ z$RO72?!6HDx4#iJJv--&KnID9+0`@)esk->$Xx1uYN zUCWVOceah(`r$vL$7<2R^vPTKpv=-c&~w9+=Z+%{Sp+J61a)ib{>ek5NC)P_bbS(n?^0%Y40t0B_WccEjW zOGg;FOUEM=7zw$XHg)Gnz^3GFLeDwz7&_VL6d+nP%mQV41(wRYn0sLe_ZV;y2~{c} zWjieuh&xJ}?NT=egEg?#3BlgPJ6iw4mJm9Aj`HXO=gHTR*oSZb`t61M_2SjyHS>04 zbSXT#5d+*D9E0sp;P(RDI8Di$BcI#A%Mch%aBC;{*MbSx^a+T_e*iBw2QYZe!MSg8 z&2hWt;l+9o^JS#>!?!NJ_1@f4_%YXBw9!lcnoU5<171YP_;SrIG!Jtsz{T`o$8lPC zSnD`=W^}0y?wvujY)sN@*`A{1>=`|WA4?c~Iync|=a&-!hF1l?HF3tcbyaoI4VIlC zyaZoF(7^gubV91Cp94%bE~VS?OOUm8L552S`|OM1r&c2SmLvOWy#ol*+{L*Y!B0AG zb}mPfOX1{3q;N34vKX~PxF?LCBIF62l`y-<=jUd#;vWidW{ZR!LQ|S-H}y?y$By^# z1q?~Rk@WWeEkc*VlpDyf5e}+Uq6b03dk3hIRTZ{DwTR_*RmD;3JrPx%G?--<;i7Mr zp}Pf;E$4txdq9!Xfj-a3R&8BH&xyf`6Rw}WGwwYwWa&0|V*cU6-BX;S2SJn_#te^O zC#J%-f)8dn)z@gjAV*OE4{FzYN?5`SBMR$xko}6RiGg5vH5`Jhi*)zZV)3#@?Irm&I)z?b|O3zLg6umfFoA!4%*Vfe z=3hfL64@Uma^P%WkKbL##EdT{PX0&Iey%2u4Sh&YAC-sbpGbprRun4eHaY|_qHOvd@06n^A=T9W*gS=)S3szoB(Q%h<00?)+cS_Q6&Cr-?YiXLC z7@%Xeowo-1`!l*dR!GKEX0G45sAe)6>r?Z(*G`#fEu$H6Ad{Y=J8atmw9gko(@vuvA8 z&1eZjx2+TD!)AKoX*2LJd4BMNp`!zo+cA|@EsKId)q-tO(2b{5YL98Oq(q8}E6;)n z^UTaJH5ZqpBPN*4rdnFJ`2u&poN5#R4ij<7@mn@?`~ZZQ&j}c6PIGGWDg!hrdYXlR z9aam~V5+QpRFV(=vA;9~6@XbtkSw&^!h6E99@6uY5RySc&NODd-4ecJ4UEuipiGky zGD6HZ*}qadw2!JZ2a;w1)uXxr*wPIuyEq!05gk$C0!WG{fm5H>5&t>eP(j--1d92c zfTd+eUyNAD6JXpK?avu@e_FNG{);9%Z{^jL)~|urjM^8KaZ`uhICziA_#nWyFFyg^ zW0bo}smnRF`YqSWN&(FbN>!3z=y-m@2`P#WV~XOeT`6n4Jh>IPvfhH~GI`S0c_r|< zRE&1PCsJJBeI@WH6fK4$bK$kcHS0bT|FNq10-yYW>HXz1Or_>yUHo$NdPOHPhpmxz+gTaJ@)YSk*4L}rG9z+J1 zW*3-&aDVNi2ADmO*9Is+Seg-79S8!S2z)FQlro6Igj?9@ScP#EY!?zYKy{fcG?T{G z>yuX}XG5K=1%^@{ZlU909{0S37>2J~I9?yf|Est)0Jry40|Q_ZhG7gLNWl-m^KqeSOduOD!0$=$Y87t8 zl{eiokiLloWu!u!MWoh)YFRrfxdNxCZ)e>qIQ0%Zfh#J(dg z_OG&t3)=sy4d8Ha1CLwR7rgGPn6HXC1Fl1$Ee06|!m>l41(rDk4zRUQ;YIhtA=dU@ zi>!1AyexTa4S`SHB0Gs848xFHPFKc~(%43fzuvu9rX*xf$<12G`+p*&04wu7!*ENw z<&1AnX)hx%j12OU2n_S&6FcR3ygIO`Ameb@Z9@ye$BQgPNg`0DE}wd)c?-;*ItY{) zNqI>GWbagOSIC_bfzwT8nit=4hE>`r4Leoxi8&50<&(V~p)rhsmzN4YAsL2~FmzRw z@=4{Ls${qinZ==mkIVBFAz?zvFori?hSzwlmvgipWF)UT8Egcy70^aQaF)o=0$t-- z2?1`>z~tuB{DyNcQ#XBq{4B3ATgR*%{%BfH*~{)}L3yhfk>L^|kQ-SjOY7+k zt|Z_Ru~${f`ssyv;KeuS)Yztir_K1BnlaTcwE zB_x%0iSNsrDK%>yfQCyw276guP+cb9eE8ij|6DuYcX+Pv@U(hYzpdXnKihTUZvs@@ zd-%bti~TFup;~NwLahQrFe50%kF%&8{Ju&RyL}~P1O}g?Ryh+4J&IANKo0@k)^Zi9 zU_Ch53zZ4~*1J$$CXYM1rtN!&ZeRSmcD`fRT*od*xO%qSyKsNY*So(HX7+x2aOU8{ z?fYiC_b(7(fX@&roD5U_WrZu zovX*M9C_TjcKXP})-6|#K8|!wZ+g%=AK5$?+5C7z&x7~=)q0}X+PNh9H#IL2KW(`Y zyjk}=M4CIN+wRrQH*K41+E(1qdw1&g)SXK>_qb{8^w9^q=bN_9HErcPEc%4D{ZCpu zzdZTH$(yH^Y67@Zz};z~j?hgv?3;Cq-DJ(X&o`2~_DAhozv-P1_s@mPCdA zkAXc4BjIK8L!|BcC!c;YoxYpBoxNi`jP%Wh`c`TI9fWIPBQ*HK!3#++P%339xpZre zVP?kp9pS$*jJV8?#02(JSWun+;Cl$Af9ZS3oxB7~OF7V!NXzw)uYUa5)NE*-%Q13U zE}q>+U}RY=5r#dw>QI^nsWR}KUF}*<2&;__K!nE7S`p@1L8JO8O`7%?HIwJG6#mG< z;3t<0@aR4k^Rpem5qD6O868+rX55_I5n&Phl7bAD9MTCYigp3CvYI*Fsowy#wHYcj zCwSYV?ziS6yXPXii!EzVNmEy+?ulPD+;5nR#AieCmAb;?xOMRf1&D5E;F>@55=V3;sn1KKrH0IO}VkyDS+Pfr$XO~Dw7iHj2| z-NX~_D=}zkHpFE9lZWeD9H|F@lpVneuVbf80r!F*+fs_RqXmZ?M*_UG-8hQ)<3`5p z!ulgrza@)4zZhBw1)*vrP3^_D=%VOv3tm12L93~w*hWj;=Tb=A0xz#%!=f)FMwk51 zTEG^LNxvKZ_3)yv)*WwJz}7;0iFSiWy8&q<^J3ea*oM@-IMa^Qz0cY^#r9`!`^5OO zkWXCyEF_BkKQ{QpZkK)J9IlQ*6aa5K$Hz2=$%Yej;mpOVk{1#N*DMEE0!T4BSUpg| jwI>LR!H^JGY9&I$ze(-)M0y^W6ol^S_8$p;`KkW}WC--l literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/tag.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/tag.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07ee1e05f9565b52e27dec340a2dc9dfd7fd291e GIT binary patch literal 6716 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/tags_subid_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/tags_subid_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d216f3097f1cf321eebdec503d9caa1b9190e80d GIT binary patch literal 5256 zcmbVQU2qfE6~4RD%93nLmMvprgLA=v5!4c4AU`e%lLV7ciqm@S#1oUQSJGNukaor0 z6~rb^$YiE5ZPJiZCT7wJWQI<{OlO+MK6LurN4sQdb<0dMle}d5B4hI2bM9(oS(ps% z1>L>B=boSMoO`aeO8;M`&U_jr2WbfGjntz~I? zc8Jc{cF`J2rEcB_GMS^1F3a8D#CR z(7#4b6Hp#O#W9~OGJhYa4gUF)B9mlE4)9h$?vR5$s4>??=$U>(>qw#w3 zZd(p-SQC_+>-x>7n>XFlQolxS?IEm1jzHZiN1=|$ZBR$$7}RZYJB#I-5^<+>OwCzx zDXnLpH?ybyx3#|NWM7yc<5D^7b7I{;z^P z<>uIO^Y(HNeg9;+Idb`ExvS@cmnuHe(z}N0%hc2k9c*(W^+4kq87HIgZ7jP;LYRB= zMGYJuQRM27n$yq&sBPr3(c!~GOtVYOK!E;lTZfoEThxXqATFE`7{ zfts7hiEre=We`Pk%j@YYVq`4av)OMWEng~Q>Yq6)rPRr3F#wRNRAp;8f$ zssYI64xKR0t9d<3p)P4WW>2|lnxcCz9+*%3h!#qgP171R4fsvdi;vHbfFp!o!41QV znal}5s4u8s4v;+IQz7PSd-f14V z+rF*bcKqM5u8+1X2JXaCYm%=cQX#(9NF_|V`#xxKjaD-R5W@DO0r⪼DRC^5w(cb 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/teamgroup.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/teamgroup.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd72b388f44c12e7e9281d074ae15d24fe1adca0 GIT binary patch literal 5548 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/teamgroup_users.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/teamgroup_users.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04f13d344f803dd6970893e26c963b9006eff62a GIT binary patch literal 5032 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/teamgroups_subid_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/teamgroups_subid_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ad465c360f5c9a33bf8ccb0ef917a5393e3cf8d GIT binary patch literal 3630 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 E|7f%jA^-pY literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/todoitem.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/todoitem.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..566eeeb5789a0742ea567bec9bf8e58afa14ceed GIT binary patch literal 6910 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/todolist_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/todolist_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96e91725c69d4c0836fd2537c5ec78c9abe93e13 GIT binary patch literal 4337 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 Nj)nKXBRKL~{|C-w*1Z4# literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/unfinished_step.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/unfinished_step.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7900d8258b605d574af9d6851016833b6cad846 GIT binary patch literal 5658 zcmbstTXPfF`K+{(){<>mwtU5y#pWhFmK_Qq@o*`WOMoC!)=J3Ot-O}j_JXt$XIBP0 zH6@v8VpBj6c5xLN`M04lO(a5z#7T}b9OYQ;pbl0$sk4c+ z6Uo^^Bz}P3=d{*Q*N7wJn)tU@d0!qn(f5&f{d6NND`q3Cg{4k@}QCzGN)CaXz#D5;2wmdK=4&46(&A*K{#G@a1J;WQNsN9@$C z{S~Uiw&I?!D2g4TmcA_aipTf$yyf+t%P1O>pl6i0IA-DX0%A|N$Ll?*XbP1LB_R%t z_ll#2kZIr&Hbf6?tStpC9g--rI z(3mCz1cXOWaMUR|DBlKRlX%G`xx-HCl01?iRj{^OYLa{{Lhfwh&q+)d8%Qf&l$eJ-`~N z0boFCq_rd7P_tPb)rM6~)kl?tWGI>EwLtj9rO3IyMs zG)5J%Ab1glZO?+*Gc-Ly4Yt7AFC}YPFro3V*K~s2m`>fG6BS8S zH~OLVi;&ZFs0q_$s76vTT{=*vQvpb$6$sEXB5_-R&>;@^qjl#E0N@c^lq8{L71rZc z^$?#GHdpWqLZaM|n~)1N$>QEo2OANSw$G8MbI1cYJxRc{$_O{Yg&Y%|t3@exiL#gi zu_VE5K*nIaswPU7p+-U;(-{L6-7$+tcZ@MZXiZK2H-k*R@XSi-xP8UEl~OFYV+19{yU*1 z=c~GLDA&+*^JLCfv*2sZHMiY7U2NVuz2qd7oAW5)cu{xI!8X%$3pA!ll$?jUylf*O zZer}D0s#q)R85HKVQ7IBml0hag}l8~F|t%c-7|Y6@!k}IT>^W zyk${GeQ=hGodvSSv!Wbay8OhB^X&e#?p-VUfm|@7P(#I61N_8<8aGy5>1Y)wiTry2 zrb&OnB9I!1v$-wG4Q@Z65^b-n*z(y1^FWIuVtR~p3{QLPFg>HPE*l1=J786aGr6lJ zQQQ;`B<0jlLOx{fDi7t>4&ejIbX-pAhoE6$UW0w~HUQVjpFjHM=YOqO>^i#8b#z94 zpw6oIFU_}|`a1`Jc@8^tZI*utJCw7Gspc9c2r2}DIB^yQgY|l1*y|_=f{#2$i83N6 zdJ{#xfed)nP*Npgpu2Ih6TolaufGf6I(gdIHe<{knZ5FL#bV>0g~mOQmv!u%yZmtH z*L%O=9`FCl;m3!cbRL-BdT@zw?FV!399VKf&G-&gL1M37H7npC$__KD3J-=DUN*Yv z8ByS+X;9Ov>Z+z2vKCiN9wU|MOvxFFT4#itJSx(3S-SwXo*iOO35wPea>0FcB6>ZaU3G`4&>`TNPa zzQyhP7q;*JN8>v;PEH+r8r(E<>`8Fv)bXeO=9%q}f{Xqg3;rEXw{$%E**}A)a>3@j z%elQaPn=@i9rwM;mjbD6o~fU!SPbl52<*;n+4f*^cJltOaqekg)6DTldlv({76QB2 z4$BU%{@}A<^OtAtp1F56@8NML-r8xYl8D>y822idx00rJU$&FVhCgVJ5{tgh1z%^b zt^L8p*^7Tn-u2#b=Gr>$==XffPO_zQ$xUh+rm9|z<|soJ%}+xE%n_hfUK`2L`pSy! ze|B7ANqD$49zbfLY9k_5GN32>8-sPtE7ns99)9jj2Cxj%lY#FCDcP{>wk+>5-Qe1= zomu~?{$Thnkf!63>*NQ2{q1YNy*870kep54*Pi&h=7p|TC4hdxB+w2G_N*vIAs8qW zn?uG~(+POz4l-H?*=LVIi}1k^M~}jS@*D!6PRRM1PbX_)8kXr+%J|G*cN-GM-%ZX7 ztroRNph&k7Y*}uEV0iP$kt;*Pa!2`glo#0gyZlWqGJ-m-oW4b#d$$w_LHP zhxMLkX&2@WA!j5K3DuzhH93W+cw;fROS4IASH@yURAI&+iw&z(Hj*JDF7&2-Tsip~Ntp;@xiwg$sGydXTzx#end<@@2(xxT8qdaRg@&oWqs%G4MI~ zFc^;&x7FdK2qIvHXgzb$IGF|DY5KPSJ}1i#r%PB8+yH8bKbQ+N=7P4Fv>ysY%Owk)*}clENv<7&z~p|yl9ctyH}FFyYC<7J27YQS;-61J9t1>8+V z+)aq<`(ohJ0mN;^@mj=f-3acBV6&^?#oG>7_=VtbZGIuRT-`rbJ6u~Wc9B!KdZNhi zPXU+?s?ct1xGmpcVknajBpa44577ZY#W16H0Dx~BkzmbE{V)7o>mvXF literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/unfinished_steps.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/unfinished_steps.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43f9f09cca444130a94304c61e818998fb314771 GIT binary patch literal 5131 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 SzHm(oLg&qi9|(T=uKxpZ9hM{j literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/upload.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/upload.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0223e27f69a5a56e503419b37be111c02cd3f5ce GIT binary patch literal 13363 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/uploads_subid_body1.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/uploads_subid_body1.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d4adeb606940458a97bccc3a99f6d0dfb828da5 GIT binary patch literal 6926 zcmb_gYj6|S6}~I2WLdH$%a&jAgA3**2r|!*I3#IOARz>&VeNz&J6W%#wONo?;_k}C zrcR)fNlXG0Qp&_kI)%*8NtkA)`Pa_0GyT`;PrFWQb<0dMll)=&$HwG;&$%nDWl2CF zy|(V&$GNX_zH{!mXSuf4Pav)T^U#Ugjf8xQl|u653(Jo~;R=xmBa$Gw4hu}+Ul()n zuba7B$T}jqqeK!1#XW9&9P^C2VxGzW`qh_};e&mz)1wEZKKk6x4$<+QbbmUL9aD8v zF}1Yr_xByw44TZh(WGi5m^Q2$R7s_%GOlPTWjLi$RZnKpnr=e7o}^={c|4so=t!E; z{1TfCdw!J}FfH8~r<8V4J$*{)p$GPC-{JSal2LWsf{{@Zblj%v0mAL^?SB6Ys;)A{ zRFiagqK6(g&5Y60-94(A$FsxnM0%{-IIWD1s%)E*(VTK3om59vJq~34+j#QcgnfQH zcbFI#kcoo?m`9Lt%q_W?*a>Xof1>1xi_9Z=r7FoMRr8uxib{bfIU%sBL7!9;C42HS zv+BX>qmkle?6Oq5ipD1ei|T>FK*cekRWv@SuBcu!SW|IKcomILsxPY74%Sv2(@;z! zMWTcSrAEj@QWNBLQZwXXsRi{wm<&sgGG#38_wP>wLQJYAHIomp z=NnV>ETC^9?zh~A$t*YEE+$%DC4q>ws+p>!WL+6kttvnULfP^d0B4o?V1uk0GgK`W zfUGxBfB{s93x230%fEsQ^h)R_DJa>A*8nO-HKgZ>_vN*V*yF@PU%xQyCFEFL%2}!3 z#an0!+U?Zu<}KS(RZfdI4CP}#N#Uk>8Wl!`m}@d##(27oDs&8(m;(JA(R9!fO{bEr z5xuc$t4hxE#xJih$0rxK%rO*&!WGg_j>5MzttT;I^4%9yFqo(bws>fI1Ztoz<;N*Cmi`{5 znpvi!qCNcZ9%fEt)E)}j&hXe3qv`knLd%=$XZ0gce(Y^j676*TPdwG%hc?>b;~=DrUzR`BRh+mLjs z_ZeJb7J61t*~=(wDdw^fgoih9-vz+%OK>eTDAgEF*`Neg>zPLQ|;rObHtGWGRpd7U5GII;%m(2wWC#2p?yF;4^N zc=03&QPM9Ks0*tetKS5@N1g>I3C$T#{i5Wo>dXr7&3^G{xInY=ExbzeGbLfB;(emW z$5UZtXGSOtpcBYb(LN!N04qT_qBIp&D$G=JhR@(B^IX4+pXYNz0)&!*=E58Ucvtf@ zaPJ)fo&UkiARYxN7@aEp^0k8-Ek_POl`6FfFEDl;{VXuv;B zY6)|dJCCS9PAtC&*_9%9wIB4qa9W3N0C?CXVy`3>__H4RVK1&;tIABvxY|vZRdrl3 z6w_p^8%D(hOL(iubFqB;Qp(tHQhCPOT5iJflf?I>(g`JHJOc%r_y$a6pt_wUU%vj; ztADIs*!KL~w&!P*YuZ)q)04BEhyEr&#+8S!Tlv&)!VIOS#)n=76oM3iCvNOT-r)Cs zoY?Kk^Fr)pTY#2tf}wIUv;x2eQ8U%CB2KVf*tr|B-@(s#60)=8R&(c!dHuPor@yFP zXx=&3yc3>fU7N0-`fSq|yT1}{?*09AN!HL6170D=sD&Cql(etJT+#FS>3mU~ReupPJ~l$s@?EG>^c z3sA#jm4_=B0x0I?ewgKDs*z2ZmdNK6WXr?7dCPrLoiOlz0goP%?bP#WD|jn;k^dUV zjekG}FWYd#wD-H_=qFRZoVwn(uwn1qhQ0r6e&YNK)BA5l+Gh68M>b6#xD{%h*>EGW z5ZX8w+IVYC*Nvb4D{?3oX$5<_p?;aTX~QM&<(j)bQr|k$c)fZdyk#!DCAVh%wW+I9 zpT2{Ax58~R2X5?M2ydPXZ{{;BxrD~2zlpSda`@xJmyax0i8zyJ&$L)W=!Q$?<(j3n zq~*!G>qt%0*G-$gj4TA=bAfoSbKSKQS5N#V^|AkwJJ;ED$+#R?a+5V%7rmseX}W?Z zf_&sg{Us;>Bq6ucJq7$gX8IV;W3~Dm~%H*GGD63Mp!}5ZpFhEt|4Q==Q0Y({U2G5f3LX982{lVKa$!n>rsZaI!(6(9M zw(^?|)q^u(9Ta$Q0q^XRR5&C*T+2ZSsSWY%4)NgZkiGXIaF&phWxIy33LgGmVHLaY zPcSm?G<_3l_y}C44=cOMj?{)=#41A~4B%mSDm9}?IMgV_-YQ+m{X(VI9kEMNYAomxV6<~CqCbm;kMZNrP0<-p((F)x7eJ+kC-dwh#N zFJyJ3p(WQC1+nJBO-t3DM(^1p*w~h9q`8LnT(~9QcsCgItXZVQ8(eZ#dD@rVP+G(i zytKVF@4s>GjU`vm(~0d3i&%1K*EqCmkT$g7X`J&kF1dW3_1M$2h^56ye&!B`x&x_e z-+%Mmn@CHsJ%Y5

1<$+mJT!{@}Sm+y&oVJ?^6Y4sG=`-Fe*QiQnK(%_8Iu+-Gkflh7x!TufzqvEa4UjI*wUr{KicAb5r)ffS9F(FGaY#e%Tp^$Fr~ agb2ZZlj?7Y|E@Uh64uUmzbE+RtNsttEE#G5 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/users.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/users.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4835aabeecae5529d4664b2097e71ff8af2de277 GIT binary patch literal 8850 zcmcIpU2qfE72egKSCVa6w&frBZ!P?TU~E$YA@KkyDL+XlhOls>gBQyfelhZ9HKl8bn{VcH~5)j#jBK)jMqs*wcAF9oEaR4dg< zNcBkrQYgxu;7QGtAT>m}?Iq#FKjlB#TsbUzmcms$g49^i4o(GE?9)`mBS_5^?b@l@ z75hZ0cm%1XqFpytw_=~xDjq>Aaz%?!&BiE`}9=uNMe*DjZ!bvO;QZ%W@!V|5vdRA7O9`K&eq2VP49#bYw+tv zfa~1JvBTs0Mn&ohDNWXO5qv_<8(9&Sm%T1UJ3pzs|M}BoMH+ve(6cgsD>(Q zy6IKsz!6PhCa-Cf$(to9=oZk`*+ed%JgJ-|0vJMY$rB7KB#2clR&`j_V-U` zG&pb!4r9i0Gf(3TKf!58r$xdR&?{QVPYZoliZ&d?CgAi`y|W@1d*`cqS5wtO#c7$~ zlfZYZL9;cSa8Zh=(MX9*6K+b`qM?1XOn4~eyBZqHC|*iAqM_xC;-i#l4X1%oYA7YA z;hZpvkOaMsUCd46cTg-5(%@OPUx`J-Uh?#cc8k!ebL%+(Q~=B8106iP_exWe(J5CmMFA> zj#fv{MbGC#Td}Jbf1|}|MUEf`y2S-vfgif68DjX^Vijbngz%k9@5~F`>xWRYA+%*X3@xK*b1)$7 zrlW&nVUIE_(Zn&*4|-czqG457B7qD*mBlyMqF8qHT?su6mN^?sD=@FFFs#~2Ph49k z2a-)_iW5oP(X2>lNj(R&U81?*gI9*WSGJ=DZMHKW5XmudSqN88G^mp|uj@YEV4`x>``7 zAyrTzf#4bHxA4F0Vy&H5f=`24IZ#?>)OEqOwoVS@TF?|Ha(IZhT+EXC2V{I&7qf&p z>?$K>F_d<=(%s9!z8Y@NgPIm@Xhs!oNFbw7{RtnwJr|?*h}D&JxY!zcIDl$Jm7PH0 z#$~w}75NwB!aT{-IMqtZl_8>U89pm9t_IF7P|N}cRj&dE31l}^MSR$S)lDw=db~!E#s`d685uAF+wzFfIE>|`W5HbGSQ9*C3Owfqj?$YyOBS$%6C@XN3Ncj7 z%EO{k?x-=*7a&i#O%l>Mixdlk?p#|Cxu1It(3aWlMhq5}cM|&T)m62gt!Z zxbZE{2mY>R{We$0e$Uv~XdzXCpc9b;P=V3Llp%(_zIIe|B5-K?2a-~*09%m8c%8QqXGDaG_?st&2;IXOpgAyCCl z58`KfnH1pG^GTYLCb($gKAK7~eMHgonqhjVOg>?HPs>_fG2O83=$O1^$w8Jx!UbT~ zRl)opAnBh&1v$KM(?#D`tLxJ|7d=>*xbJCb@w+eb8fNen(un;LxF2-zZtpXUkGn1gf|s? z`fi`Ub^gP5@ZJ4z$IX3rw=IM>7Q!2;ge4ar+4V(p`v(W#KY0Dna*YQid6=ZdT2Ac0 zW?Zjb>gC#=e;DIxTYjPZa(p2eD+FW3?%3@Uw@&;@dp~f^UF_a)O}`#oa&tYK7kykq z%f-4!V>eD6jok=5tU{<+d2HOqMdv7%w^>n$<_U)@y&uvfYGzg>N)F($zSyzdN@2O^ zxZCvQa=>MnH92-DV9T`^2CG=1rVsoP#96sN){5Y2#RzwS`zjQ<`u0!XzL~zQ-O@hH zd=?s-7ls}+9KC=V9)ky(@I()B6w5GbP}_d^IxHf{ zU~6jqYe<|IM5SVIOS_9BzQ?LwQ1#xB_ zhD0@)Hg3%$6s>H5Jlh&~Tf`x9=-<@O4Tf)A<&uBojUi9#U7zi>;bZs}MG`y;*!hZfto zrjBAnEH-!JU%0JQx5P>e4_l(%_~LV%uYSo@Z7FzLmRx@C0KREm#HR->?cSCL&$_(B z4+NLD>w)0)j(k(^^7b;Y5og$&^9c7eRHln48Sq&-~EBN literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/users_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/users_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35a4afbecc15ce6d30bdd7becad07cef790c38bf GIT binary patch literal 9474 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/users_full.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/users_full.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc009b8d10a2a28d9fce420b051e92533e298342 GIT binary patch literal 16265 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 QUg7G!$o`hWU+N0}2k|#Bng9R* literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/users_full_teams.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/users_full_teams.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7da6efbb031e5bede83b0436aaedd55e078cec51 GIT binary patch literal 7099 zcmb_hU2Gf25#HmUPNXF2hx(%>`SfRt7DTD89jB`8)Tw{sI#v>&m^h`-(}_GuXHz7- zca$v!a-E`Rq|`y2x<+IKs2#vX;-Wx7WkwbW&#v=^~;tNJQ6|>!8z|N8MA7kbC|=Ugddt;^gQn!nqUTsBrAX)57e2;dm;R znNgCutgES{*E>3`YC_x^6XJ>%qw0jB334JK$g{GVkS7v~pd{nzl$z9GJQ){e6n#1s z*M!Lw6|61xYUcV1)nHj+e^?NNZXubvBo7NG4i0_G>wO`uB#{Lzt;B>`lWrIYhr&Z% z?v!o=LLFsC8o z|9d=W<=n*SKUaS;R*PD@(88F$ou-9;cof=L}ry;lDP~(OxDbFYduWFJU zpHY*nmAVYu8a^DOv1xTyiBldJrIlErUs4}dRZxw@Y(s($alj9~Y~v45foF0Nl7N<3 zSPzV?pojFVuy>Y!5_6ub=$-BJB*IO=j^}F=`F$e}HX=_X!8yQL<*Q`WbY~*_h z6u}&EPXPV-7ZWVb;LsE|#f2R6{lyRo1A;8ffVval{*!7FoKQ^)qUmrWA)n!tK#OjP zsj*VZ>yb50MOLvupY!ITvKza^>RMPHBR+q`C4Q9|trAe?-Nk=mc zr{@e_lGLQCOOnxCte~*{A`JX!7ofUEK5J-RbY16jjjizT=33j~QDZ;aghkgUd~2?~ z6Q9AHuX^cduBqkvshrQB_3g^Fv|T@)^EG6ByK`+l*UuI;o3g&H-0pp!R<*4;Nmcg- z>_%dFn}QCunFR)+af?LAIe3_6qO%xFbSDh8Zsvo z$VuB^;0*jUbV!h_o&=iS;!UZZ4A1#Ip6H5ChUgAv+L%HlMNIu52Hk}M6(EYT84V?f z;vO#}A)0}W>HO0C3g5bOP*ZtOw`2V=tVm@7yB&Rr*$7QELm99ZFd)h}fI!U`|!9Q2!r17e^hN07 z0L9zg9ejfh&kpSNzEABVtI!Vc&dqLMJRJJB$Ph_#Q5Z7IxxyQZHP(ftVCQ<d_9`^*=Jx5p6#qeTw;FL{Hkz`i@45Vq$nx&2eGwM99Ami6D^Mwd*}R$(1r*)+H5ZoMMq{Ox;01bAS2msXTS(# z%OFOhu$PH}FW{5^b-f*!t;#_rQx|#Hi3y67F{2VN^`Znyl-T?uS_+&fu;T zT;UA@+Di$l)rsYNc5v))uGJXY@F+qS36yn6Us2F^1r-lO#OA)S-FHxh6 z35woCzYP`Wz@_TSOo19GX4>c>sQv^$?K@CiBM+K8mi4>GZeRYeaa5^=-s-`A2T~5Xn!yfD_86GW$X6kcK6&_xV`Y+kMZ4ux?RgB?j2aI z>&w>lu@%-GT;q|?01!;?+}m2Om|A+!#h7 zT+a*-I3_G-G;YQZhW`SrX&C&jkuUs>Z(n`$>T>)};&$S_Yb(9f1j@_YKUgpyXw9E9Q&8!8GfG@iTwJ z+pjIX_Va}mzRlzoIkZb2uW=YD3LjiFPgfc_;~>!#R_K(N6#*mNYg(&;V ztOo+hK0a7p0gpg44~Ul=mUlHXuy~&cxks>s8d0tIRS$c6B?(U0Oaj|gl7y^UZ~T%p zsZvc(KqfPpg4Y#*MJfgccm&omsxdsO6B%8RFv!CHyby!8j_ElwL*>yF9fEebWU%Rw z%*0=G2<%46EjQ92Ez80@resNnGCxOETDxi$iX ZtNAyn{G50nxsE%z&Koa(MexaX{V(}eGLirQ literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/__pycache__/users_id_body.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/models/__pycache__/users_id_body.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5401dc630a9e7d7abdd67d5343203cecd236053 GIT binary patch literal 3548 zcmaJETTdL<`ONI>h2^s0W-gBL;bvG{yHLx-4)UdTj2+iCX<1N^Hp(!&J1k>%XVzzC zaUde)sj}M#lej1#OEs2UB}kEy$3FB2^bzW|&?yg*k{7Elz&h{!zB4;(Sa6Qm@0>a3 zyWh^CP+c7)FuMLWaraRLAwS@UJG{k3;T>2kkr-hlCd9Thn*nX~k|k<4dR-BK*g(1XFzDb1v* z;vP+@W|Cx3TGc?_TeLY39sx@V#Ogd>WS`^V^I{Z~;0$X}E zN-6E6x^Yh#q(cM!zX%3D$f-K2VCK{$opJC60kJ>Y9}M19b(JZWnxcu>K{{nwIdibD zFRfWq`9w5nWc$qfN;<8wh?3Jv>!guV)2bc?wBSp$d^qXY??9pWQMdt%CGrsg=Mi)q z^Tb3ZwUK_pyzuj(`GDb$EvQ79L zD0;b`y#E(M@<5sEjQd@@adDu?OPAtMxy~4q;=G>m%RTQco++(_#4C#*Bwp>VVnQn! zlU!_9>UdobAl$hEG$9vrOp2AHmbf+$pdP7pabC{@#buFG3OMc86VrtcS8|CXEaLU< z={`N7KtNKXd-8gACApl+Y_MF0J0I(Fw4T{G4Qn5!jZ; z7>$A~FP8@& zUd#y8CMLMnmi+b>*AjEDY`FgE0y@w|9Jc+IA)~Z4(e_U%reax)VF<&5Eqvk>8^ctw z0~a$&Hjz>;+ui#sqDUUSm@$${#=Hy*2dy87%r*cE>*B#p~#Z{Db&`H#~TXUcq_fXMAu@EP6p2eu?hnN-!)X zhVcgnNSdW)_xXTf#<61n&cn}q7r+A9ZfaY$RFh?+*&Pq*>{-3{tmo@< z-wA8yzrC_{<;9tc>+P3zh|qCq>%zqy56s-|aJB6*wNLB{5X87JySmtuWotI4nzlc! z!p&$gJE)nOZd!_-RBb7vnU?LzDmjKZ!4bV zuH5}|=JVj9XREDq(R^IF>meu4?D)uA#~xJkz#Pg&-p79hCPOX)bjBNdIHq3Na4XO4 zNKk#kTy%dYFfFF(Y0A_b1j&66QDgFTn+SVsUoHn&mhI2MV<)RvPSRpG-Iu4f52_N_ z*>z>XgT40<6?@(S`7zY^=(9h3ww!vJS;;)nUxXs-fyiO=u_Czn9k5t}(i$l>AJ`}k z*F0`k^9^`JOmIaf_ycXi(Rv~*um}*aa(&^pMY9jzw$AQNpfRyeK)!|QAAS1p(?8Cy z2i|s6MfKc)sm@iMfW?8XA;e2~<=rv`=A_}Ra@5T`CLFap2u&Ef=e|zP@+#FPX~M9k zsFAp~OV3q?0JzeN+XDB{D7yjuUbQ z?Gffqm-6vV_VCvr+O$U4In<;~Yh698HSUcdF5V*$!uqCvgy?#Ja^098HiyGC=oVec zB6(1j;a1FNa9t(KD6M!BlI2N_nN|j#i@E{Fe(-P04@?i*!2Yjsn9@#n*WlDA4u?(bWIT27f<~}aOP6~ E5A+NX5&!@I literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/models/all_ofentity_editable_metadatamerge.py b/vendor/elabapi-python/elabapi_python/models/all_ofentity_editable_metadatamerge.py new file mode 100644 index 0000000..bc4ff04 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/all_ofentity_editable_metadatamerge.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from elabapi_python.models.metadata import Metadata # noqa: F401,E501 + +class AllOfentityEditableMetadatamerge(Metadata): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + if hasattr(Metadata, "swagger_types"): + swagger_types.update(Metadata.swagger_types) + + attribute_map = { + } + if hasattr(Metadata, "attribute_map"): + attribute_map.update(Metadata.attribute_map) + + def __init__(self, *args, **kwargs): # noqa: E501 + """AllOfentityEditableMetadatamerge - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + Metadata.__init__(self, *args, **kwargs) + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AllOfentityEditableMetadatamerge, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AllOfentityEditableMetadatamerge): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/any_ofuploads_subid_body1.py b/vendor/elabapi-python/elabapi_python/models/any_ofuploads_subid_body1.py new file mode 100644 index 0000000..43bb991 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/any_ofuploads_subid_body1.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AnyOfuploadsSubidBody1(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """AnyOfuploadsSubidBody1 - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AnyOfuploadsSubidBody1, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AnyOfuploadsSubidBody1): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/apikey.py b/vendor/elabapi-python/elabapi_python/models/apikey.py new file mode 100644 index 0000000..a22d31a --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/apikey.py @@ -0,0 +1,292 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Apikey(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'name': 'str', + 'created_at': 'str', + 'last_used_at': 'str', + 'hash': 'str', + 'can_write': 'int', + 'team': 'int', + 'team_name': 'str' + } + + attribute_map = { + 'id': 'id', + 'name': 'name', + 'created_at': 'created_at', + 'last_used_at': 'last_used_at', + 'hash': 'hash', + 'can_write': 'can_write', + 'team': 'team', + 'team_name': 'team_name' + } + + def __init__(self, id=None, name=None, created_at=None, last_used_at=None, hash=None, can_write=None, team=None, team_name=None): # noqa: E501 + """Apikey - a model defined in Swagger""" # noqa: E501 + self._id = None + self._name = None + self._created_at = None + self._last_used_at = None + self._hash = None + self._can_write = None + self._team = None + self._team_name = None + self.discriminator = None + if id is not None: + self.id = id + if name is not None: + self.name = name + if created_at is not None: + self.created_at = created_at + if last_used_at is not None: + self.last_used_at = last_used_at + if hash is not None: + self.hash = hash + if can_write is not None: + self.can_write = can_write + if team is not None: + self.team = team + if team_name is not None: + self.team_name = team_name + + @property + def id(self): + """Gets the id of this Apikey. # noqa: E501 + + + :return: The id of this Apikey. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Apikey. + + + :param id: The id of this Apikey. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def name(self): + """Gets the name of this Apikey. # noqa: E501 + + + :return: The name of this Apikey. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Apikey. + + + :param name: The name of this Apikey. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def created_at(self): + """Gets the created_at of this Apikey. # noqa: E501 + + + :return: The created_at of this Apikey. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this Apikey. + + + :param created_at: The created_at of this Apikey. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def last_used_at(self): + """Gets the last_used_at of this Apikey. # noqa: E501 + + + :return: The last_used_at of this Apikey. # noqa: E501 + :rtype: str + """ + return self._last_used_at + + @last_used_at.setter + def last_used_at(self, last_used_at): + """Sets the last_used_at of this Apikey. + + + :param last_used_at: The last_used_at of this Apikey. # noqa: E501 + :type: str + """ + + self._last_used_at = last_used_at + + @property + def hash(self): + """Gets the hash of this Apikey. # noqa: E501 + + + :return: The hash of this Apikey. # noqa: E501 + :rtype: str + """ + return self._hash + + @hash.setter + def hash(self, hash): + """Sets the hash of this Apikey. + + + :param hash: The hash of this Apikey. # noqa: E501 + :type: str + """ + + self._hash = hash + + @property + def can_write(self): + """Gets the can_write of this Apikey. # noqa: E501 + + + :return: The can_write of this Apikey. # noqa: E501 + :rtype: int + """ + return self._can_write + + @can_write.setter + def can_write(self, can_write): + """Sets the can_write of this Apikey. + + + :param can_write: The can_write of this Apikey. # noqa: E501 + :type: int + """ + + self._can_write = can_write + + @property + def team(self): + """Gets the team of this Apikey. # noqa: E501 + + + :return: The team of this Apikey. # noqa: E501 + :rtype: int + """ + return self._team + + @team.setter + def team(self, team): + """Sets the team of this Apikey. + + + :param team: The team of this Apikey. # noqa: E501 + :type: int + """ + + self._team = team + + @property + def team_name(self): + """Gets the team_name of this Apikey. # noqa: E501 + + + :return: The team_name of this Apikey. # noqa: E501 + :rtype: str + """ + return self._team_name + + @team_name.setter + def team_name(self, team_name): + """Sets the team_name of this Apikey. + + + :param team_name: The team_name of this Apikey. # noqa: E501 + :type: str + """ + + self._team_name = team_name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Apikey, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Apikey): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/apikeys_body.py b/vendor/elabapi-python/elabapi_python/models/apikeys_body.py new file mode 100644 index 0000000..2f73bdf --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/apikeys_body.py @@ -0,0 +1,140 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ApikeysBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'name': 'str', + 'canwrite': 'int' + } + + attribute_map = { + 'name': 'name', + 'canwrite': 'canwrite' + } + + def __init__(self, name='An API key', canwrite=0): # noqa: E501 + """ApikeysBody - a model defined in Swagger""" # noqa: E501 + self._name = None + self._canwrite = None + self.discriminator = None + if name is not None: + self.name = name + if canwrite is not None: + self.canwrite = canwrite + + @property + def name(self): + """Gets the name of this ApikeysBody. # noqa: E501 + + A name for the API key. # noqa: E501 + + :return: The name of this ApikeysBody. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this ApikeysBody. + + A name for the API key. # noqa: E501 + + :param name: The name of this ApikeysBody. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def canwrite(self): + """Gets the canwrite of this ApikeysBody. # noqa: E501 + + Set to 1 to allow the key to do write actions. # noqa: E501 + + :return: The canwrite of this ApikeysBody. # noqa: E501 + :rtype: int + """ + return self._canwrite + + @canwrite.setter + def canwrite(self, canwrite): + """Sets the canwrite of this ApikeysBody. + + Set to 1 to allow the key to do write actions. # noqa: E501 + + :param canwrite: The canwrite of this ApikeysBody. # noqa: E501 + :type: int + """ + + self._canwrite = canwrite + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ApikeysBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ApikeysBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/branding_id_body.py b/vendor/elabapi-python/elabapi_python/models/branding_id_body.py new file mode 100644 index 0000000..7f29a4d --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/branding_id_body.py @@ -0,0 +1,147 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class BrandingIdBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str', + 'file': 'str' + } + + attribute_map = { + 'action': 'action', + 'file': 'file' + } + + def __init__(self, action='update', file=None): # noqa: E501 + """BrandingIdBody - a model defined in Swagger""" # noqa: E501 + self._action = None + self._file = None + self.discriminator = None + if action is not None: + self.action = action + self.file = file + + @property + def action(self): + """Gets the action of this BrandingIdBody. # noqa: E501 + + Update a branding asset. Requires Sysadmin permissions. # noqa: E501 + + :return: The action of this BrandingIdBody. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this BrandingIdBody. + + Update a branding asset. Requires Sysadmin permissions. # noqa: E501 + + :param action: The action of this BrandingIdBody. # noqa: E501 + :type: str + """ + allowed_values = ["update"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + @property + def file(self): + """Gets the file of this BrandingIdBody. # noqa: E501 + + Branding file. Accepted types are SVG, PNG, JPEG, WebP and ICO. Maximum size is 1 MiB. # noqa: E501 + + :return: The file of this BrandingIdBody. # noqa: E501 + :rtype: str + """ + return self._file + + @file.setter + def file(self, file): + """Sets the file of this BrandingIdBody. + + Branding file. Accepted types are SVG, PNG, JPEG, WebP and ICO. Maximum size is 1 MiB. # noqa: E501 + + :param file: The file of this BrandingIdBody. # noqa: E501 + :type: str + """ + if file is None: + raise ValueError("Invalid value for `file`, must not be `None`") # noqa: E501 + + self._file = file + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(BrandingIdBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, BrandingIdBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/changelog.py b/vendor/elabapi-python/elabapi_python/models/changelog.py new file mode 100644 index 0000000..df17aed --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/changelog.py @@ -0,0 +1,224 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Changelog(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'created_at': 'str', + 'target': 'str', + 'content': 'str', + 'fullname': 'str', + 'userid': 'int' + } + + attribute_map = { + 'created_at': 'created_at', + 'target': 'target', + 'content': 'content', + 'fullname': 'fullname', + 'userid': 'userid' + } + + def __init__(self, created_at=None, target=None, content=None, fullname=None, userid=None): # noqa: E501 + """Changelog - a model defined in Swagger""" # noqa: E501 + self._created_at = None + self._target = None + self._content = None + self._fullname = None + self._userid = None + self.discriminator = None + if created_at is not None: + self.created_at = created_at + if target is not None: + self.target = target + if content is not None: + self.content = content + if fullname is not None: + self.fullname = fullname + if userid is not None: + self.userid = userid + + @property + def created_at(self): + """Gets the created_at of this Changelog. # noqa: E501 + + Timestamp when the change was recorded. # noqa: E501 + + :return: The created_at of this Changelog. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this Changelog. + + Timestamp when the change was recorded. # noqa: E501 + + :param created_at: The created_at of this Changelog. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def target(self): + """Gets the target of this Changelog. # noqa: E501 + + Field/attribute that was changed. # noqa: E501 + + :return: The target of this Changelog. # noqa: E501 + :rtype: str + """ + return self._target + + @target.setter + def target(self, target): + """Sets the target of this Changelog. + + Field/attribute that was changed. # noqa: E501 + + :param target: The target of this Changelog. # noqa: E501 + :type: str + """ + + self._target = target + + @property + def content(self): + """Gets the content of this Changelog. # noqa: E501 + + New value stored for the target field (may be a scalar or JSON-encoded string depending on target). # noqa: E501 + + :return: The content of this Changelog. # noqa: E501 + :rtype: str + """ + return self._content + + @content.setter + def content(self, content): + """Sets the content of this Changelog. + + New value stored for the target field (may be a scalar or JSON-encoded string depending on target). # noqa: E501 + + :param content: The content of this Changelog. # noqa: E501 + :type: str + """ + + self._content = content + + @property + def fullname(self): + """Gets the fullname of this Changelog. # noqa: E501 + + Full name of the user who made the change. # noqa: E501 + + :return: The fullname of this Changelog. # noqa: E501 + :rtype: str + """ + return self._fullname + + @fullname.setter + def fullname(self, fullname): + """Sets the fullname of this Changelog. + + Full name of the user who made the change. # noqa: E501 + + :param fullname: The fullname of this Changelog. # noqa: E501 + :type: str + """ + + self._fullname = fullname + + @property + def userid(self): + """Gets the userid of this Changelog. # noqa: E501 + + Userid of the user who made the change. # noqa: E501 + + :return: The userid of this Changelog. # noqa: E501 + :rtype: int + """ + return self._userid + + @userid.setter + def userid(self, userid): + """Sets the userid of this Changelog. + + Userid of the user who made the change. # noqa: E501 + + :param userid: The userid of this Changelog. # noqa: E501 + :type: int + """ + + self._userid = userid + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Changelog, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Changelog): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/comment.py b/vendor/elabapi-python/elabapi_python/models/comment.py new file mode 100644 index 0000000..6444bd7 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/comment.py @@ -0,0 +1,344 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Comment(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'created_at': 'str', + 'item_id': 'int', + 'comment': 'str', + 'userid': 'int', + 'modified_at': 'str', + 'fullname': 'str', + 'firstname': 'str', + 'lastname': 'str', + 'orcid': 'str' + } + + attribute_map = { + 'id': 'id', + 'created_at': 'created_at', + 'item_id': 'item_id', + 'comment': 'comment', + 'userid': 'userid', + 'modified_at': 'modified_at', + 'fullname': 'fullname', + 'firstname': 'firstname', + 'lastname': 'lastname', + 'orcid': 'orcid' + } + + def __init__(self, id=None, created_at=None, item_id=None, comment=None, userid=None, modified_at=None, fullname=None, firstname=None, lastname=None, orcid=None): # noqa: E501 + """Comment - a model defined in Swagger""" # noqa: E501 + self._id = None + self._created_at = None + self._item_id = None + self._comment = None + self._userid = None + self._modified_at = None + self._fullname = None + self._firstname = None + self._lastname = None + self._orcid = None + self.discriminator = None + if id is not None: + self.id = id + if created_at is not None: + self.created_at = created_at + if item_id is not None: + self.item_id = item_id + if comment is not None: + self.comment = comment + if userid is not None: + self.userid = userid + if modified_at is not None: + self.modified_at = modified_at + if fullname is not None: + self.fullname = fullname + if firstname is not None: + self.firstname = firstname + if lastname is not None: + self.lastname = lastname + if orcid is not None: + self.orcid = orcid + + @property + def id(self): + """Gets the id of this Comment. # noqa: E501 + + + :return: The id of this Comment. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Comment. + + + :param id: The id of this Comment. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def created_at(self): + """Gets the created_at of this Comment. # noqa: E501 + + + :return: The created_at of this Comment. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this Comment. + + + :param created_at: The created_at of this Comment. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def item_id(self): + """Gets the item_id of this Comment. # noqa: E501 + + + :return: The item_id of this Comment. # noqa: E501 + :rtype: int + """ + return self._item_id + + @item_id.setter + def item_id(self, item_id): + """Sets the item_id of this Comment. + + + :param item_id: The item_id of this Comment. # noqa: E501 + :type: int + """ + + self._item_id = item_id + + @property + def comment(self): + """Gets the comment of this Comment. # noqa: E501 + + + :return: The comment of this Comment. # noqa: E501 + :rtype: str + """ + return self._comment + + @comment.setter + def comment(self, comment): + """Sets the comment of this Comment. + + + :param comment: The comment of this Comment. # noqa: E501 + :type: str + """ + + self._comment = comment + + @property + def userid(self): + """Gets the userid of this Comment. # noqa: E501 + + + :return: The userid of this Comment. # noqa: E501 + :rtype: int + """ + return self._userid + + @userid.setter + def userid(self, userid): + """Sets the userid of this Comment. + + + :param userid: The userid of this Comment. # noqa: E501 + :type: int + """ + + self._userid = userid + + @property + def modified_at(self): + """Gets the modified_at of this Comment. # noqa: E501 + + + :return: The modified_at of this Comment. # noqa: E501 + :rtype: str + """ + return self._modified_at + + @modified_at.setter + def modified_at(self, modified_at): + """Sets the modified_at of this Comment. + + + :param modified_at: The modified_at of this Comment. # noqa: E501 + :type: str + """ + + self._modified_at = modified_at + + @property + def fullname(self): + """Gets the fullname of this Comment. # noqa: E501 + + + :return: The fullname of this Comment. # noqa: E501 + :rtype: str + """ + return self._fullname + + @fullname.setter + def fullname(self, fullname): + """Sets the fullname of this Comment. + + + :param fullname: The fullname of this Comment. # noqa: E501 + :type: str + """ + + self._fullname = fullname + + @property + def firstname(self): + """Gets the firstname of this Comment. # noqa: E501 + + + :return: The firstname of this Comment. # noqa: E501 + :rtype: str + """ + return self._firstname + + @firstname.setter + def firstname(self, firstname): + """Sets the firstname of this Comment. + + + :param firstname: The firstname of this Comment. # noqa: E501 + :type: str + """ + + self._firstname = firstname + + @property + def lastname(self): + """Gets the lastname of this Comment. # noqa: E501 + + + :return: The lastname of this Comment. # noqa: E501 + :rtype: str + """ + return self._lastname + + @lastname.setter + def lastname(self, lastname): + """Sets the lastname of this Comment. + + + :param lastname: The lastname of this Comment. # noqa: E501 + :type: str + """ + + self._lastname = lastname + + @property + def orcid(self): + """Gets the orcid of this Comment. # noqa: E501 + + + :return: The orcid of this Comment. # noqa: E501 + :rtype: str + """ + return self._orcid + + @orcid.setter + def orcid(self, orcid): + """Sets the orcid of this Comment. + + + :param orcid: The orcid of this Comment. # noqa: E501 + :type: str + """ + + self._orcid = orcid + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Comment, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Comment): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/compound.py b/vendor/elabapi-python/elabapi_python/models/compound.py new file mode 100644 index 0000000..75020e3 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/compound.py @@ -0,0 +1,1848 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Compound(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'created_at': 'datetime', + 'created_by': 'int', + 'modified_at': 'datetime', + 'modified_by': 'int', + 'userid': 'int', + 'team': 'int', + 'state': 'int', + 'name': 'str', + 'molecular_formula': 'str', + 'cas_number': 'str', + 'ec_number': 'str', + 'chebi_id': 'str', + 'chembl_id': 'str', + 'dea_number': 'str', + 'drugbank_id': 'str', + 'dsstox_id': 'str', + 'hmdb_id': 'str', + 'inchi': 'str', + 'inchi_key': 'str', + 'iupac_name': 'str', + 'kegg_id': 'str', + 'metabolomics_wb_id': 'str', + 'molecular_weight': 'str', + 'nci_code': 'str', + 'nikkaji_number': 'str', + 'pharmgkb_id': 'str', + 'pharos_ligand_id': 'str', + 'pubchem_cid': 'int', + 'rxcui': 'str', + 'smiles': 'str', + 'unii': 'str', + 'wikidata': 'str', + 'wikipedia': 'str', + 'is_corrosive': 'int', + 'is_explosive': 'int', + 'is_flammable': 'int', + 'is_gas_under_pressure': 'int', + 'is_hazardous2env': 'int', + 'is_hazardous2health': 'int', + 'is_serious_health_hazard': 'int', + 'is_oxidising': 'int', + 'is_toxic': 'int', + 'is_radioactive': 'int', + 'is_antibiotic': 'int', + 'is_antibiotic_precursor': 'int', + 'is_drug': 'int', + 'is_drug_precursor': 'int', + 'is_explosive_precursor': 'int', + 'is_cmr': 'int', + 'is_nano': 'int', + 'is_controlled': 'int', + 'is_ed2health': 'int', + 'is_ed2env': 'int', + 'is_pbt': 'int', + 'is_pmt': 'int', + 'is_vpvb': 'int', + 'is_vpvm': 'int', + 'fp2_base64': 'str', + 'userid_human': 'str', + 'team_name': 'str', + 'has_fingerprint': 'int' + } + + attribute_map = { + 'id': 'id', + 'created_at': 'created_at', + 'created_by': 'created_by', + 'modified_at': 'modified_at', + 'modified_by': 'modified_by', + 'userid': 'userid', + 'team': 'team', + 'state': 'state', + 'name': 'name', + 'molecular_formula': 'molecular_formula', + 'cas_number': 'cas_number', + 'ec_number': 'ec_number', + 'chebi_id': 'chebi_id', + 'chembl_id': 'chembl_id', + 'dea_number': 'dea_number', + 'drugbank_id': 'drugbank_id', + 'dsstox_id': 'dsstox_id', + 'hmdb_id': 'hmdb_id', + 'inchi': 'inchi', + 'inchi_key': 'inchi_key', + 'iupac_name': 'iupac_name', + 'kegg_id': 'kegg_id', + 'metabolomics_wb_id': 'metabolomics_wb_id', + 'molecular_weight': 'molecular_weight', + 'nci_code': 'nci_code', + 'nikkaji_number': 'nikkaji_number', + 'pharmgkb_id': 'pharmgkb_id', + 'pharos_ligand_id': 'pharos_ligand_id', + 'pubchem_cid': 'pubchem_cid', + 'rxcui': 'rxcui', + 'smiles': 'smiles', + 'unii': 'unii', + 'wikidata': 'wikidata', + 'wikipedia': 'wikipedia', + 'is_corrosive': 'is_corrosive', + 'is_explosive': 'is_explosive', + 'is_flammable': 'is_flammable', + 'is_gas_under_pressure': 'is_gas_under_pressure', + 'is_hazardous2env': 'is_hazardous2env', + 'is_hazardous2health': 'is_hazardous2health', + 'is_serious_health_hazard': 'is_serious_health_hazard', + 'is_oxidising': 'is_oxidising', + 'is_toxic': 'is_toxic', + 'is_radioactive': 'is_radioactive', + 'is_antibiotic': 'is_antibiotic', + 'is_antibiotic_precursor': 'is_antibiotic_precursor', + 'is_drug': 'is_drug', + 'is_drug_precursor': 'is_drug_precursor', + 'is_explosive_precursor': 'is_explosive_precursor', + 'is_cmr': 'is_cmr', + 'is_nano': 'is_nano', + 'is_controlled': 'is_controlled', + 'is_ed2health': 'is_ed2health', + 'is_ed2env': 'is_ed2env', + 'is_pbt': 'is_pbt', + 'is_pmt': 'is_pmt', + 'is_vpvb': 'is_vpvb', + 'is_vpvm': 'is_vpvm', + 'fp2_base64': 'fp2_base64', + 'userid_human': 'userid_human', + 'team_name': 'team_name', + 'has_fingerprint': 'has_fingerprint' + } + + def __init__(self, id=None, created_at=None, created_by=None, modified_at=None, modified_by=None, userid=None, team=None, state=None, name=None, molecular_formula=None, cas_number=None, ec_number=None, chebi_id=None, chembl_id=None, dea_number=None, drugbank_id=None, dsstox_id=None, hmdb_id=None, inchi=None, inchi_key=None, iupac_name=None, kegg_id=None, metabolomics_wb_id=None, molecular_weight=None, nci_code=None, nikkaji_number=None, pharmgkb_id=None, pharos_ligand_id=None, pubchem_cid=None, rxcui=None, smiles=None, unii=None, wikidata=None, wikipedia=None, is_corrosive=None, is_explosive=None, is_flammable=None, is_gas_under_pressure=None, is_hazardous2env=None, is_hazardous2health=None, is_serious_health_hazard=None, is_oxidising=None, is_toxic=None, is_radioactive=None, is_antibiotic=None, is_antibiotic_precursor=None, is_drug=None, is_drug_precursor=None, is_explosive_precursor=None, is_cmr=None, is_nano=None, is_controlled=None, is_ed2health=None, is_ed2env=None, is_pbt=None, is_pmt=None, is_vpvb=None, is_vpvm=None, fp2_base64=None, userid_human=None, team_name=None, has_fingerprint=None): # noqa: E501 + """Compound - a model defined in Swagger""" # noqa: E501 + self._id = None + self._created_at = None + self._created_by = None + self._modified_at = None + self._modified_by = None + self._userid = None + self._team = None + self._state = None + self._name = None + self._molecular_formula = None + self._cas_number = None + self._ec_number = None + self._chebi_id = None + self._chembl_id = None + self._dea_number = None + self._drugbank_id = None + self._dsstox_id = None + self._hmdb_id = None + self._inchi = None + self._inchi_key = None + self._iupac_name = None + self._kegg_id = None + self._metabolomics_wb_id = None + self._molecular_weight = None + self._nci_code = None + self._nikkaji_number = None + self._pharmgkb_id = None + self._pharos_ligand_id = None + self._pubchem_cid = None + self._rxcui = None + self._smiles = None + self._unii = None + self._wikidata = None + self._wikipedia = None + self._is_corrosive = None + self._is_explosive = None + self._is_flammable = None + self._is_gas_under_pressure = None + self._is_hazardous2env = None + self._is_hazardous2health = None + self._is_serious_health_hazard = None + self._is_oxidising = None + self._is_toxic = None + self._is_radioactive = None + self._is_antibiotic = None + self._is_antibiotic_precursor = None + self._is_drug = None + self._is_drug_precursor = None + self._is_explosive_precursor = None + self._is_cmr = None + self._is_nano = None + self._is_controlled = None + self._is_ed2health = None + self._is_ed2env = None + self._is_pbt = None + self._is_pmt = None + self._is_vpvb = None + self._is_vpvm = None + self._fp2_base64 = None + self._userid_human = None + self._team_name = None + self._has_fingerprint = None + self.discriminator = None + if id is not None: + self.id = id + if created_at is not None: + self.created_at = created_at + if created_by is not None: + self.created_by = created_by + if modified_at is not None: + self.modified_at = modified_at + if modified_by is not None: + self.modified_by = modified_by + if userid is not None: + self.userid = userid + if team is not None: + self.team = team + if state is not None: + self.state = state + if name is not None: + self.name = name + if molecular_formula is not None: + self.molecular_formula = molecular_formula + if cas_number is not None: + self.cas_number = cas_number + if ec_number is not None: + self.ec_number = ec_number + if chebi_id is not None: + self.chebi_id = chebi_id + if chembl_id is not None: + self.chembl_id = chembl_id + if dea_number is not None: + self.dea_number = dea_number + if drugbank_id is not None: + self.drugbank_id = drugbank_id + if dsstox_id is not None: + self.dsstox_id = dsstox_id + if hmdb_id is not None: + self.hmdb_id = hmdb_id + if inchi is not None: + self.inchi = inchi + if inchi_key is not None: + self.inchi_key = inchi_key + if iupac_name is not None: + self.iupac_name = iupac_name + if kegg_id is not None: + self.kegg_id = kegg_id + if metabolomics_wb_id is not None: + self.metabolomics_wb_id = metabolomics_wb_id + if molecular_weight is not None: + self.molecular_weight = molecular_weight + if nci_code is not None: + self.nci_code = nci_code + if nikkaji_number is not None: + self.nikkaji_number = nikkaji_number + if pharmgkb_id is not None: + self.pharmgkb_id = pharmgkb_id + if pharos_ligand_id is not None: + self.pharos_ligand_id = pharos_ligand_id + if pubchem_cid is not None: + self.pubchem_cid = pubchem_cid + if rxcui is not None: + self.rxcui = rxcui + if smiles is not None: + self.smiles = smiles + if unii is not None: + self.unii = unii + if wikidata is not None: + self.wikidata = wikidata + if wikipedia is not None: + self.wikipedia = wikipedia + if is_corrosive is not None: + self.is_corrosive = is_corrosive + if is_explosive is not None: + self.is_explosive = is_explosive + if is_flammable is not None: + self.is_flammable = is_flammable + if is_gas_under_pressure is not None: + self.is_gas_under_pressure = is_gas_under_pressure + if is_hazardous2env is not None: + self.is_hazardous2env = is_hazardous2env + if is_hazardous2health is not None: + self.is_hazardous2health = is_hazardous2health + if is_serious_health_hazard is not None: + self.is_serious_health_hazard = is_serious_health_hazard + if is_oxidising is not None: + self.is_oxidising = is_oxidising + if is_toxic is not None: + self.is_toxic = is_toxic + if is_radioactive is not None: + self.is_radioactive = is_radioactive + if is_antibiotic is not None: + self.is_antibiotic = is_antibiotic + if is_antibiotic_precursor is not None: + self.is_antibiotic_precursor = is_antibiotic_precursor + if is_drug is not None: + self.is_drug = is_drug + if is_drug_precursor is not None: + self.is_drug_precursor = is_drug_precursor + if is_explosive_precursor is not None: + self.is_explosive_precursor = is_explosive_precursor + if is_cmr is not None: + self.is_cmr = is_cmr + if is_nano is not None: + self.is_nano = is_nano + if is_controlled is not None: + self.is_controlled = is_controlled + if is_ed2health is not None: + self.is_ed2health = is_ed2health + if is_ed2env is not None: + self.is_ed2env = is_ed2env + if is_pbt is not None: + self.is_pbt = is_pbt + if is_pmt is not None: + self.is_pmt = is_pmt + if is_vpvb is not None: + self.is_vpvb = is_vpvb + if is_vpvm is not None: + self.is_vpvm = is_vpvm + if fp2_base64 is not None: + self.fp2_base64 = fp2_base64 + if userid_human is not None: + self.userid_human = userid_human + if team_name is not None: + self.team_name = team_name + if has_fingerprint is not None: + self.has_fingerprint = has_fingerprint + + @property + def id(self): + """Gets the id of this Compound. # noqa: E501 + + + :return: The id of this Compound. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Compound. + + + :param id: The id of this Compound. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def created_at(self): + """Gets the created_at of this Compound. # noqa: E501 + + + :return: The created_at of this Compound. # noqa: E501 + :rtype: datetime + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this Compound. + + + :param created_at: The created_at of this Compound. # noqa: E501 + :type: datetime + """ + + self._created_at = created_at + + @property + def created_by(self): + """Gets the created_by of this Compound. # noqa: E501 + + + :return: The created_by of this Compound. # noqa: E501 + :rtype: int + """ + return self._created_by + + @created_by.setter + def created_by(self, created_by): + """Sets the created_by of this Compound. + + + :param created_by: The created_by of this Compound. # noqa: E501 + :type: int + """ + + self._created_by = created_by + + @property + def modified_at(self): + """Gets the modified_at of this Compound. # noqa: E501 + + + :return: The modified_at of this Compound. # noqa: E501 + :rtype: datetime + """ + return self._modified_at + + @modified_at.setter + def modified_at(self, modified_at): + """Sets the modified_at of this Compound. + + + :param modified_at: The modified_at of this Compound. # noqa: E501 + :type: datetime + """ + + self._modified_at = modified_at + + @property + def modified_by(self): + """Gets the modified_by of this Compound. # noqa: E501 + + + :return: The modified_by of this Compound. # noqa: E501 + :rtype: int + """ + return self._modified_by + + @modified_by.setter + def modified_by(self, modified_by): + """Sets the modified_by of this Compound. + + + :param modified_by: The modified_by of this Compound. # noqa: E501 + :type: int + """ + + self._modified_by = modified_by + + @property + def userid(self): + """Gets the userid of this Compound. # noqa: E501 + + + :return: The userid of this Compound. # noqa: E501 + :rtype: int + """ + return self._userid + + @userid.setter + def userid(self, userid): + """Sets the userid of this Compound. + + + :param userid: The userid of this Compound. # noqa: E501 + :type: int + """ + + self._userid = userid + + @property + def team(self): + """Gets the team of this Compound. # noqa: E501 + + + :return: The team of this Compound. # noqa: E501 + :rtype: int + """ + return self._team + + @team.setter + def team(self, team): + """Sets the team of this Compound. + + + :param team: The team of this Compound. # noqa: E501 + :type: int + """ + + self._team = team + + @property + def state(self): + """Gets the state of this Compound. # noqa: E501 + + + :return: The state of this Compound. # noqa: E501 + :rtype: int + """ + return self._state + + @state.setter + def state(self, state): + """Sets the state of this Compound. + + + :param state: The state of this Compound. # noqa: E501 + :type: int + """ + + self._state = state + + @property + def name(self): + """Gets the name of this Compound. # noqa: E501 + + + :return: The name of this Compound. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Compound. + + + :param name: The name of this Compound. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def molecular_formula(self): + """Gets the molecular_formula of this Compound. # noqa: E501 + + + :return: The molecular_formula of this Compound. # noqa: E501 + :rtype: str + """ + return self._molecular_formula + + @molecular_formula.setter + def molecular_formula(self, molecular_formula): + """Sets the molecular_formula of this Compound. + + + :param molecular_formula: The molecular_formula of this Compound. # noqa: E501 + :type: str + """ + + self._molecular_formula = molecular_formula + + @property + def cas_number(self): + """Gets the cas_number of this Compound. # noqa: E501 + + + :return: The cas_number of this Compound. # noqa: E501 + :rtype: str + """ + return self._cas_number + + @cas_number.setter + def cas_number(self, cas_number): + """Sets the cas_number of this Compound. + + + :param cas_number: The cas_number of this Compound. # noqa: E501 + :type: str + """ + + self._cas_number = cas_number + + @property + def ec_number(self): + """Gets the ec_number of this Compound. # noqa: E501 + + + :return: The ec_number of this Compound. # noqa: E501 + :rtype: str + """ + return self._ec_number + + @ec_number.setter + def ec_number(self, ec_number): + """Sets the ec_number of this Compound. + + + :param ec_number: The ec_number of this Compound. # noqa: E501 + :type: str + """ + + self._ec_number = ec_number + + @property + def chebi_id(self): + """Gets the chebi_id of this Compound. # noqa: E501 + + + :return: The chebi_id of this Compound. # noqa: E501 + :rtype: str + """ + return self._chebi_id + + @chebi_id.setter + def chebi_id(self, chebi_id): + """Sets the chebi_id of this Compound. + + + :param chebi_id: The chebi_id of this Compound. # noqa: E501 + :type: str + """ + + self._chebi_id = chebi_id + + @property + def chembl_id(self): + """Gets the chembl_id of this Compound. # noqa: E501 + + + :return: The chembl_id of this Compound. # noqa: E501 + :rtype: str + """ + return self._chembl_id + + @chembl_id.setter + def chembl_id(self, chembl_id): + """Sets the chembl_id of this Compound. + + + :param chembl_id: The chembl_id of this Compound. # noqa: E501 + :type: str + """ + + self._chembl_id = chembl_id + + @property + def dea_number(self): + """Gets the dea_number of this Compound. # noqa: E501 + + + :return: The dea_number of this Compound. # noqa: E501 + :rtype: str + """ + return self._dea_number + + @dea_number.setter + def dea_number(self, dea_number): + """Sets the dea_number of this Compound. + + + :param dea_number: The dea_number of this Compound. # noqa: E501 + :type: str + """ + + self._dea_number = dea_number + + @property + def drugbank_id(self): + """Gets the drugbank_id of this Compound. # noqa: E501 + + + :return: The drugbank_id of this Compound. # noqa: E501 + :rtype: str + """ + return self._drugbank_id + + @drugbank_id.setter + def drugbank_id(self, drugbank_id): + """Sets the drugbank_id of this Compound. + + + :param drugbank_id: The drugbank_id of this Compound. # noqa: E501 + :type: str + """ + + self._drugbank_id = drugbank_id + + @property + def dsstox_id(self): + """Gets the dsstox_id of this Compound. # noqa: E501 + + + :return: The dsstox_id of this Compound. # noqa: E501 + :rtype: str + """ + return self._dsstox_id + + @dsstox_id.setter + def dsstox_id(self, dsstox_id): + """Sets the dsstox_id of this Compound. + + + :param dsstox_id: The dsstox_id of this Compound. # noqa: E501 + :type: str + """ + + self._dsstox_id = dsstox_id + + @property + def hmdb_id(self): + """Gets the hmdb_id of this Compound. # noqa: E501 + + + :return: The hmdb_id of this Compound. # noqa: E501 + :rtype: str + """ + return self._hmdb_id + + @hmdb_id.setter + def hmdb_id(self, hmdb_id): + """Sets the hmdb_id of this Compound. + + + :param hmdb_id: The hmdb_id of this Compound. # noqa: E501 + :type: str + """ + + self._hmdb_id = hmdb_id + + @property + def inchi(self): + """Gets the inchi of this Compound. # noqa: E501 + + + :return: The inchi of this Compound. # noqa: E501 + :rtype: str + """ + return self._inchi + + @inchi.setter + def inchi(self, inchi): + """Sets the inchi of this Compound. + + + :param inchi: The inchi of this Compound. # noqa: E501 + :type: str + """ + + self._inchi = inchi + + @property + def inchi_key(self): + """Gets the inchi_key of this Compound. # noqa: E501 + + + :return: The inchi_key of this Compound. # noqa: E501 + :rtype: str + """ + return self._inchi_key + + @inchi_key.setter + def inchi_key(self, inchi_key): + """Sets the inchi_key of this Compound. + + + :param inchi_key: The inchi_key of this Compound. # noqa: E501 + :type: str + """ + + self._inchi_key = inchi_key + + @property + def iupac_name(self): + """Gets the iupac_name of this Compound. # noqa: E501 + + + :return: The iupac_name of this Compound. # noqa: E501 + :rtype: str + """ + return self._iupac_name + + @iupac_name.setter + def iupac_name(self, iupac_name): + """Sets the iupac_name of this Compound. + + + :param iupac_name: The iupac_name of this Compound. # noqa: E501 + :type: str + """ + + self._iupac_name = iupac_name + + @property + def kegg_id(self): + """Gets the kegg_id of this Compound. # noqa: E501 + + + :return: The kegg_id of this Compound. # noqa: E501 + :rtype: str + """ + return self._kegg_id + + @kegg_id.setter + def kegg_id(self, kegg_id): + """Sets the kegg_id of this Compound. + + + :param kegg_id: The kegg_id of this Compound. # noqa: E501 + :type: str + """ + + self._kegg_id = kegg_id + + @property + def metabolomics_wb_id(self): + """Gets the metabolomics_wb_id of this Compound. # noqa: E501 + + + :return: The metabolomics_wb_id of this Compound. # noqa: E501 + :rtype: str + """ + return self._metabolomics_wb_id + + @metabolomics_wb_id.setter + def metabolomics_wb_id(self, metabolomics_wb_id): + """Sets the metabolomics_wb_id of this Compound. + + + :param metabolomics_wb_id: The metabolomics_wb_id of this Compound. # noqa: E501 + :type: str + """ + + self._metabolomics_wb_id = metabolomics_wb_id + + @property + def molecular_weight(self): + """Gets the molecular_weight of this Compound. # noqa: E501 + + + :return: The molecular_weight of this Compound. # noqa: E501 + :rtype: str + """ + return self._molecular_weight + + @molecular_weight.setter + def molecular_weight(self, molecular_weight): + """Sets the molecular_weight of this Compound. + + + :param molecular_weight: The molecular_weight of this Compound. # noqa: E501 + :type: str + """ + + self._molecular_weight = molecular_weight + + @property + def nci_code(self): + """Gets the nci_code of this Compound. # noqa: E501 + + + :return: The nci_code of this Compound. # noqa: E501 + :rtype: str + """ + return self._nci_code + + @nci_code.setter + def nci_code(self, nci_code): + """Sets the nci_code of this Compound. + + + :param nci_code: The nci_code of this Compound. # noqa: E501 + :type: str + """ + + self._nci_code = nci_code + + @property + def nikkaji_number(self): + """Gets the nikkaji_number of this Compound. # noqa: E501 + + + :return: The nikkaji_number of this Compound. # noqa: E501 + :rtype: str + """ + return self._nikkaji_number + + @nikkaji_number.setter + def nikkaji_number(self, nikkaji_number): + """Sets the nikkaji_number of this Compound. + + + :param nikkaji_number: The nikkaji_number of this Compound. # noqa: E501 + :type: str + """ + + self._nikkaji_number = nikkaji_number + + @property + def pharmgkb_id(self): + """Gets the pharmgkb_id of this Compound. # noqa: E501 + + + :return: The pharmgkb_id of this Compound. # noqa: E501 + :rtype: str + """ + return self._pharmgkb_id + + @pharmgkb_id.setter + def pharmgkb_id(self, pharmgkb_id): + """Sets the pharmgkb_id of this Compound. + + + :param pharmgkb_id: The pharmgkb_id of this Compound. # noqa: E501 + :type: str + """ + + self._pharmgkb_id = pharmgkb_id + + @property + def pharos_ligand_id(self): + """Gets the pharos_ligand_id of this Compound. # noqa: E501 + + + :return: The pharos_ligand_id of this Compound. # noqa: E501 + :rtype: str + """ + return self._pharos_ligand_id + + @pharos_ligand_id.setter + def pharos_ligand_id(self, pharos_ligand_id): + """Sets the pharos_ligand_id of this Compound. + + + :param pharos_ligand_id: The pharos_ligand_id of this Compound. # noqa: E501 + :type: str + """ + + self._pharos_ligand_id = pharos_ligand_id + + @property + def pubchem_cid(self): + """Gets the pubchem_cid of this Compound. # noqa: E501 + + + :return: The pubchem_cid of this Compound. # noqa: E501 + :rtype: int + """ + return self._pubchem_cid + + @pubchem_cid.setter + def pubchem_cid(self, pubchem_cid): + """Sets the pubchem_cid of this Compound. + + + :param pubchem_cid: The pubchem_cid of this Compound. # noqa: E501 + :type: int + """ + + self._pubchem_cid = pubchem_cid + + @property + def rxcui(self): + """Gets the rxcui of this Compound. # noqa: E501 + + + :return: The rxcui of this Compound. # noqa: E501 + :rtype: str + """ + return self._rxcui + + @rxcui.setter + def rxcui(self, rxcui): + """Sets the rxcui of this Compound. + + + :param rxcui: The rxcui of this Compound. # noqa: E501 + :type: str + """ + + self._rxcui = rxcui + + @property + def smiles(self): + """Gets the smiles of this Compound. # noqa: E501 + + + :return: The smiles of this Compound. # noqa: E501 + :rtype: str + """ + return self._smiles + + @smiles.setter + def smiles(self, smiles): + """Sets the smiles of this Compound. + + + :param smiles: The smiles of this Compound. # noqa: E501 + :type: str + """ + + self._smiles = smiles + + @property + def unii(self): + """Gets the unii of this Compound. # noqa: E501 + + + :return: The unii of this Compound. # noqa: E501 + :rtype: str + """ + return self._unii + + @unii.setter + def unii(self, unii): + """Sets the unii of this Compound. + + + :param unii: The unii of this Compound. # noqa: E501 + :type: str + """ + + self._unii = unii + + @property + def wikidata(self): + """Gets the wikidata of this Compound. # noqa: E501 + + + :return: The wikidata of this Compound. # noqa: E501 + :rtype: str + """ + return self._wikidata + + @wikidata.setter + def wikidata(self, wikidata): + """Sets the wikidata of this Compound. + + + :param wikidata: The wikidata of this Compound. # noqa: E501 + :type: str + """ + + self._wikidata = wikidata + + @property + def wikipedia(self): + """Gets the wikipedia of this Compound. # noqa: E501 + + + :return: The wikipedia of this Compound. # noqa: E501 + :rtype: str + """ + return self._wikipedia + + @wikipedia.setter + def wikipedia(self, wikipedia): + """Sets the wikipedia of this Compound. + + + :param wikipedia: The wikipedia of this Compound. # noqa: E501 + :type: str + """ + + self._wikipedia = wikipedia + + @property + def is_corrosive(self): + """Gets the is_corrosive of this Compound. # noqa: E501 + + + :return: The is_corrosive of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_corrosive + + @is_corrosive.setter + def is_corrosive(self, is_corrosive): + """Sets the is_corrosive of this Compound. + + + :param is_corrosive: The is_corrosive of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_corrosive not in allowed_values: + raise ValueError( + "Invalid value for `is_corrosive` ({0}), must be one of {1}" # noqa: E501 + .format(is_corrosive, allowed_values) + ) + + self._is_corrosive = is_corrosive + + @property + def is_explosive(self): + """Gets the is_explosive of this Compound. # noqa: E501 + + + :return: The is_explosive of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_explosive + + @is_explosive.setter + def is_explosive(self, is_explosive): + """Sets the is_explosive of this Compound. + + + :param is_explosive: The is_explosive of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_explosive not in allowed_values: + raise ValueError( + "Invalid value for `is_explosive` ({0}), must be one of {1}" # noqa: E501 + .format(is_explosive, allowed_values) + ) + + self._is_explosive = is_explosive + + @property + def is_flammable(self): + """Gets the is_flammable of this Compound. # noqa: E501 + + + :return: The is_flammable of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_flammable + + @is_flammable.setter + def is_flammable(self, is_flammable): + """Sets the is_flammable of this Compound. + + + :param is_flammable: The is_flammable of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_flammable not in allowed_values: + raise ValueError( + "Invalid value for `is_flammable` ({0}), must be one of {1}" # noqa: E501 + .format(is_flammable, allowed_values) + ) + + self._is_flammable = is_flammable + + @property + def is_gas_under_pressure(self): + """Gets the is_gas_under_pressure of this Compound. # noqa: E501 + + + :return: The is_gas_under_pressure of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_gas_under_pressure + + @is_gas_under_pressure.setter + def is_gas_under_pressure(self, is_gas_under_pressure): + """Sets the is_gas_under_pressure of this Compound. + + + :param is_gas_under_pressure: The is_gas_under_pressure of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_gas_under_pressure not in allowed_values: + raise ValueError( + "Invalid value for `is_gas_under_pressure` ({0}), must be one of {1}" # noqa: E501 + .format(is_gas_under_pressure, allowed_values) + ) + + self._is_gas_under_pressure = is_gas_under_pressure + + @property + def is_hazardous2env(self): + """Gets the is_hazardous2env of this Compound. # noqa: E501 + + + :return: The is_hazardous2env of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_hazardous2env + + @is_hazardous2env.setter + def is_hazardous2env(self, is_hazardous2env): + """Sets the is_hazardous2env of this Compound. + + + :param is_hazardous2env: The is_hazardous2env of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_hazardous2env not in allowed_values: + raise ValueError( + "Invalid value for `is_hazardous2env` ({0}), must be one of {1}" # noqa: E501 + .format(is_hazardous2env, allowed_values) + ) + + self._is_hazardous2env = is_hazardous2env + + @property + def is_hazardous2health(self): + """Gets the is_hazardous2health of this Compound. # noqa: E501 + + + :return: The is_hazardous2health of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_hazardous2health + + @is_hazardous2health.setter + def is_hazardous2health(self, is_hazardous2health): + """Sets the is_hazardous2health of this Compound. + + + :param is_hazardous2health: The is_hazardous2health of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_hazardous2health not in allowed_values: + raise ValueError( + "Invalid value for `is_hazardous2health` ({0}), must be one of {1}" # noqa: E501 + .format(is_hazardous2health, allowed_values) + ) + + self._is_hazardous2health = is_hazardous2health + + @property + def is_serious_health_hazard(self): + """Gets the is_serious_health_hazard of this Compound. # noqa: E501 + + + :return: The is_serious_health_hazard of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_serious_health_hazard + + @is_serious_health_hazard.setter + def is_serious_health_hazard(self, is_serious_health_hazard): + """Sets the is_serious_health_hazard of this Compound. + + + :param is_serious_health_hazard: The is_serious_health_hazard of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_serious_health_hazard not in allowed_values: + raise ValueError( + "Invalid value for `is_serious_health_hazard` ({0}), must be one of {1}" # noqa: E501 + .format(is_serious_health_hazard, allowed_values) + ) + + self._is_serious_health_hazard = is_serious_health_hazard + + @property + def is_oxidising(self): + """Gets the is_oxidising of this Compound. # noqa: E501 + + + :return: The is_oxidising of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_oxidising + + @is_oxidising.setter + def is_oxidising(self, is_oxidising): + """Sets the is_oxidising of this Compound. + + + :param is_oxidising: The is_oxidising of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_oxidising not in allowed_values: + raise ValueError( + "Invalid value for `is_oxidising` ({0}), must be one of {1}" # noqa: E501 + .format(is_oxidising, allowed_values) + ) + + self._is_oxidising = is_oxidising + + @property + def is_toxic(self): + """Gets the is_toxic of this Compound. # noqa: E501 + + + :return: The is_toxic of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_toxic + + @is_toxic.setter + def is_toxic(self, is_toxic): + """Sets the is_toxic of this Compound. + + + :param is_toxic: The is_toxic of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_toxic not in allowed_values: + raise ValueError( + "Invalid value for `is_toxic` ({0}), must be one of {1}" # noqa: E501 + .format(is_toxic, allowed_values) + ) + + self._is_toxic = is_toxic + + @property + def is_radioactive(self): + """Gets the is_radioactive of this Compound. # noqa: E501 + + + :return: The is_radioactive of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_radioactive + + @is_radioactive.setter + def is_radioactive(self, is_radioactive): + """Sets the is_radioactive of this Compound. + + + :param is_radioactive: The is_radioactive of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_radioactive not in allowed_values: + raise ValueError( + "Invalid value for `is_radioactive` ({0}), must be one of {1}" # noqa: E501 + .format(is_radioactive, allowed_values) + ) + + self._is_radioactive = is_radioactive + + @property + def is_antibiotic(self): + """Gets the is_antibiotic of this Compound. # noqa: E501 + + + :return: The is_antibiotic of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_antibiotic + + @is_antibiotic.setter + def is_antibiotic(self, is_antibiotic): + """Sets the is_antibiotic of this Compound. + + + :param is_antibiotic: The is_antibiotic of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_antibiotic not in allowed_values: + raise ValueError( + "Invalid value for `is_antibiotic` ({0}), must be one of {1}" # noqa: E501 + .format(is_antibiotic, allowed_values) + ) + + self._is_antibiotic = is_antibiotic + + @property + def is_antibiotic_precursor(self): + """Gets the is_antibiotic_precursor of this Compound. # noqa: E501 + + + :return: The is_antibiotic_precursor of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_antibiotic_precursor + + @is_antibiotic_precursor.setter + def is_antibiotic_precursor(self, is_antibiotic_precursor): + """Sets the is_antibiotic_precursor of this Compound. + + + :param is_antibiotic_precursor: The is_antibiotic_precursor of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_antibiotic_precursor not in allowed_values: + raise ValueError( + "Invalid value for `is_antibiotic_precursor` ({0}), must be one of {1}" # noqa: E501 + .format(is_antibiotic_precursor, allowed_values) + ) + + self._is_antibiotic_precursor = is_antibiotic_precursor + + @property + def is_drug(self): + """Gets the is_drug of this Compound. # noqa: E501 + + + :return: The is_drug of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_drug + + @is_drug.setter + def is_drug(self, is_drug): + """Sets the is_drug of this Compound. + + + :param is_drug: The is_drug of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_drug not in allowed_values: + raise ValueError( + "Invalid value for `is_drug` ({0}), must be one of {1}" # noqa: E501 + .format(is_drug, allowed_values) + ) + + self._is_drug = is_drug + + @property + def is_drug_precursor(self): + """Gets the is_drug_precursor of this Compound. # noqa: E501 + + + :return: The is_drug_precursor of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_drug_precursor + + @is_drug_precursor.setter + def is_drug_precursor(self, is_drug_precursor): + """Sets the is_drug_precursor of this Compound. + + + :param is_drug_precursor: The is_drug_precursor of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_drug_precursor not in allowed_values: + raise ValueError( + "Invalid value for `is_drug_precursor` ({0}), must be one of {1}" # noqa: E501 + .format(is_drug_precursor, allowed_values) + ) + + self._is_drug_precursor = is_drug_precursor + + @property + def is_explosive_precursor(self): + """Gets the is_explosive_precursor of this Compound. # noqa: E501 + + + :return: The is_explosive_precursor of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_explosive_precursor + + @is_explosive_precursor.setter + def is_explosive_precursor(self, is_explosive_precursor): + """Sets the is_explosive_precursor of this Compound. + + + :param is_explosive_precursor: The is_explosive_precursor of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_explosive_precursor not in allowed_values: + raise ValueError( + "Invalid value for `is_explosive_precursor` ({0}), must be one of {1}" # noqa: E501 + .format(is_explosive_precursor, allowed_values) + ) + + self._is_explosive_precursor = is_explosive_precursor + + @property + def is_cmr(self): + """Gets the is_cmr of this Compound. # noqa: E501 + + + :return: The is_cmr of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_cmr + + @is_cmr.setter + def is_cmr(self, is_cmr): + """Sets the is_cmr of this Compound. + + + :param is_cmr: The is_cmr of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_cmr not in allowed_values: + raise ValueError( + "Invalid value for `is_cmr` ({0}), must be one of {1}" # noqa: E501 + .format(is_cmr, allowed_values) + ) + + self._is_cmr = is_cmr + + @property + def is_nano(self): + """Gets the is_nano of this Compound. # noqa: E501 + + + :return: The is_nano of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_nano + + @is_nano.setter + def is_nano(self, is_nano): + """Sets the is_nano of this Compound. + + + :param is_nano: The is_nano of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_nano not in allowed_values: + raise ValueError( + "Invalid value for `is_nano` ({0}), must be one of {1}" # noqa: E501 + .format(is_nano, allowed_values) + ) + + self._is_nano = is_nano + + @property + def is_controlled(self): + """Gets the is_controlled of this Compound. # noqa: E501 + + + :return: The is_controlled of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_controlled + + @is_controlled.setter + def is_controlled(self, is_controlled): + """Sets the is_controlled of this Compound. + + + :param is_controlled: The is_controlled of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_controlled not in allowed_values: + raise ValueError( + "Invalid value for `is_controlled` ({0}), must be one of {1}" # noqa: E501 + .format(is_controlled, allowed_values) + ) + + self._is_controlled = is_controlled + + @property + def is_ed2health(self): + """Gets the is_ed2health of this Compound. # noqa: E501 + + + :return: The is_ed2health of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_ed2health + + @is_ed2health.setter + def is_ed2health(self, is_ed2health): + """Sets the is_ed2health of this Compound. + + + :param is_ed2health: The is_ed2health of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_ed2health not in allowed_values: + raise ValueError( + "Invalid value for `is_ed2health` ({0}), must be one of {1}" # noqa: E501 + .format(is_ed2health, allowed_values) + ) + + self._is_ed2health = is_ed2health + + @property + def is_ed2env(self): + """Gets the is_ed2env of this Compound. # noqa: E501 + + + :return: The is_ed2env of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_ed2env + + @is_ed2env.setter + def is_ed2env(self, is_ed2env): + """Sets the is_ed2env of this Compound. + + + :param is_ed2env: The is_ed2env of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_ed2env not in allowed_values: + raise ValueError( + "Invalid value for `is_ed2env` ({0}), must be one of {1}" # noqa: E501 + .format(is_ed2env, allowed_values) + ) + + self._is_ed2env = is_ed2env + + @property + def is_pbt(self): + """Gets the is_pbt of this Compound. # noqa: E501 + + + :return: The is_pbt of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_pbt + + @is_pbt.setter + def is_pbt(self, is_pbt): + """Sets the is_pbt of this Compound. + + + :param is_pbt: The is_pbt of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_pbt not in allowed_values: + raise ValueError( + "Invalid value for `is_pbt` ({0}), must be one of {1}" # noqa: E501 + .format(is_pbt, allowed_values) + ) + + self._is_pbt = is_pbt + + @property + def is_pmt(self): + """Gets the is_pmt of this Compound. # noqa: E501 + + + :return: The is_pmt of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_pmt + + @is_pmt.setter + def is_pmt(self, is_pmt): + """Sets the is_pmt of this Compound. + + + :param is_pmt: The is_pmt of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_pmt not in allowed_values: + raise ValueError( + "Invalid value for `is_pmt` ({0}), must be one of {1}" # noqa: E501 + .format(is_pmt, allowed_values) + ) + + self._is_pmt = is_pmt + + @property + def is_vpvb(self): + """Gets the is_vpvb of this Compound. # noqa: E501 + + + :return: The is_vpvb of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_vpvb + + @is_vpvb.setter + def is_vpvb(self, is_vpvb): + """Sets the is_vpvb of this Compound. + + + :param is_vpvb: The is_vpvb of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_vpvb not in allowed_values: + raise ValueError( + "Invalid value for `is_vpvb` ({0}), must be one of {1}" # noqa: E501 + .format(is_vpvb, allowed_values) + ) + + self._is_vpvb = is_vpvb + + @property + def is_vpvm(self): + """Gets the is_vpvm of this Compound. # noqa: E501 + + + :return: The is_vpvm of this Compound. # noqa: E501 + :rtype: int + """ + return self._is_vpvm + + @is_vpvm.setter + def is_vpvm(self, is_vpvm): + """Sets the is_vpvm of this Compound. + + + :param is_vpvm: The is_vpvm of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_vpvm not in allowed_values: + raise ValueError( + "Invalid value for `is_vpvm` ({0}), must be one of {1}" # noqa: E501 + .format(is_vpvm, allowed_values) + ) + + self._is_vpvm = is_vpvm + + @property + def fp2_base64(self): + """Gets the fp2_base64 of this Compound. # noqa: E501 + + Base64-encoded fingerprint # noqa: E501 + + :return: The fp2_base64 of this Compound. # noqa: E501 + :rtype: str + """ + return self._fp2_base64 + + @fp2_base64.setter + def fp2_base64(self, fp2_base64): + """Sets the fp2_base64 of this Compound. + + Base64-encoded fingerprint # noqa: E501 + + :param fp2_base64: The fp2_base64 of this Compound. # noqa: E501 + :type: str + """ + + self._fp2_base64 = fp2_base64 + + @property + def userid_human(self): + """Gets the userid_human of this Compound. # noqa: E501 + + + :return: The userid_human of this Compound. # noqa: E501 + :rtype: str + """ + return self._userid_human + + @userid_human.setter + def userid_human(self, userid_human): + """Sets the userid_human of this Compound. + + + :param userid_human: The userid_human of this Compound. # noqa: E501 + :type: str + """ + + self._userid_human = userid_human + + @property + def team_name(self): + """Gets the team_name of this Compound. # noqa: E501 + + + :return: The team_name of this Compound. # noqa: E501 + :rtype: str + """ + return self._team_name + + @team_name.setter + def team_name(self, team_name): + """Sets the team_name of this Compound. + + + :param team_name: The team_name of this Compound. # noqa: E501 + :type: str + """ + + self._team_name = team_name + + @property + def has_fingerprint(self): + """Gets the has_fingerprint of this Compound. # noqa: E501 + + + :return: The has_fingerprint of this Compound. # noqa: E501 + :rtype: int + """ + return self._has_fingerprint + + @has_fingerprint.setter + def has_fingerprint(self, has_fingerprint): + """Sets the has_fingerprint of this Compound. + + + :param has_fingerprint: The has_fingerprint of this Compound. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if has_fingerprint not in allowed_values: + raise ValueError( + "Invalid value for `has_fingerprint` ({0}), must be one of {1}" # noqa: E501 + .format(has_fingerprint, allowed_values) + ) + + self._has_fingerprint = has_fingerprint + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Compound, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Compound): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/compound_create_request.py b/vendor/elabapi-python/elabapi_python/models/compound_create_request.py new file mode 100644 index 0000000..ff0a730 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/compound_create_request.py @@ -0,0 +1,614 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class CompoundCreateRequest(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str', + 'name': 'str', + 'inchi': 'str', + 'inchi_key': 'str', + 'smiles': 'str', + 'molecular_formula': 'str', + 'cas_number': 'str', + 'iupac_name': 'str', + 'pubchem_cid': 'int', + 'is_corrosive': 'int', + 'is_serious_health_hazard': 'int', + 'is_explosive': 'int', + 'is_flammable': 'int', + 'is_gas_under_pressure': 'int', + 'is_hazardous2env': 'int', + 'is_hazardous2health': 'int', + 'is_oxidising': 'int', + 'is_toxic': 'int' + } + + attribute_map = { + 'action': 'action', + 'name': 'name', + 'inchi': 'inchi', + 'inchi_key': 'inchi_key', + 'smiles': 'smiles', + 'molecular_formula': 'molecular_formula', + 'cas_number': 'cas_number', + 'iupac_name': 'iupac_name', + 'pubchem_cid': 'pubchem_cid', + 'is_corrosive': 'is_corrosive', + 'is_serious_health_hazard': 'is_serious_health_hazard', + 'is_explosive': 'is_explosive', + 'is_flammable': 'is_flammable', + 'is_gas_under_pressure': 'is_gas_under_pressure', + 'is_hazardous2env': 'is_hazardous2env', + 'is_hazardous2health': 'is_hazardous2health', + 'is_oxidising': 'is_oxidising', + 'is_toxic': 'is_toxic' + } + + def __init__(self, action='create', name=None, inchi=None, inchi_key=None, smiles=None, molecular_formula=None, cas_number=None, iupac_name=None, pubchem_cid=None, is_corrosive=None, is_serious_health_hazard=None, is_explosive=None, is_flammable=None, is_gas_under_pressure=None, is_hazardous2env=None, is_hazardous2health=None, is_oxidising=None, is_toxic=None): # noqa: E501 + """CompoundCreateRequest - a model defined in Swagger""" # noqa: E501 + self._action = None + self._name = None + self._inchi = None + self._inchi_key = None + self._smiles = None + self._molecular_formula = None + self._cas_number = None + self._iupac_name = None + self._pubchem_cid = None + self._is_corrosive = None + self._is_serious_health_hazard = None + self._is_explosive = None + self._is_flammable = None + self._is_gas_under_pressure = None + self._is_hazardous2env = None + self._is_hazardous2health = None + self._is_oxidising = None + self._is_toxic = None + self.discriminator = None + if action is not None: + self.action = action + if name is not None: + self.name = name + if inchi is not None: + self.inchi = inchi + if inchi_key is not None: + self.inchi_key = inchi_key + if smiles is not None: + self.smiles = smiles + if molecular_formula is not None: + self.molecular_formula = molecular_formula + if cas_number is not None: + self.cas_number = cas_number + if iupac_name is not None: + self.iupac_name = iupac_name + if pubchem_cid is not None: + self.pubchem_cid = pubchem_cid + if is_corrosive is not None: + self.is_corrosive = is_corrosive + if is_serious_health_hazard is not None: + self.is_serious_health_hazard = is_serious_health_hazard + if is_explosive is not None: + self.is_explosive = is_explosive + if is_flammable is not None: + self.is_flammable = is_flammable + if is_gas_under_pressure is not None: + self.is_gas_under_pressure = is_gas_under_pressure + if is_hazardous2env is not None: + self.is_hazardous2env = is_hazardous2env + if is_hazardous2health is not None: + self.is_hazardous2health = is_hazardous2health + if is_oxidising is not None: + self.is_oxidising = is_oxidising + if is_toxic is not None: + self.is_toxic = is_toxic + + @property + def action(self): + """Gets the action of this CompoundCreateRequest. # noqa: E501 + + Note: the default value for `action` attribute is `create`, and as such it can be omitted. # noqa: E501 + + :return: The action of this CompoundCreateRequest. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this CompoundCreateRequest. + + Note: the default value for `action` attribute is `create`, and as such it can be omitted. # noqa: E501 + + :param action: The action of this CompoundCreateRequest. # noqa: E501 + :type: str + """ + allowed_values = ["create"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + @property + def name(self): + """Gets the name of this CompoundCreateRequest. # noqa: E501 + + + :return: The name of this CompoundCreateRequest. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this CompoundCreateRequest. + + + :param name: The name of this CompoundCreateRequest. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def inchi(self): + """Gets the inchi of this CompoundCreateRequest. # noqa: E501 + + + :return: The inchi of this CompoundCreateRequest. # noqa: E501 + :rtype: str + """ + return self._inchi + + @inchi.setter + def inchi(self, inchi): + """Sets the inchi of this CompoundCreateRequest. + + + :param inchi: The inchi of this CompoundCreateRequest. # noqa: E501 + :type: str + """ + + self._inchi = inchi + + @property + def inchi_key(self): + """Gets the inchi_key of this CompoundCreateRequest. # noqa: E501 + + + :return: The inchi_key of this CompoundCreateRequest. # noqa: E501 + :rtype: str + """ + return self._inchi_key + + @inchi_key.setter + def inchi_key(self, inchi_key): + """Sets the inchi_key of this CompoundCreateRequest. + + + :param inchi_key: The inchi_key of this CompoundCreateRequest. # noqa: E501 + :type: str + """ + + self._inchi_key = inchi_key + + @property + def smiles(self): + """Gets the smiles of this CompoundCreateRequest. # noqa: E501 + + + :return: The smiles of this CompoundCreateRequest. # noqa: E501 + :rtype: str + """ + return self._smiles + + @smiles.setter + def smiles(self, smiles): + """Sets the smiles of this CompoundCreateRequest. + + + :param smiles: The smiles of this CompoundCreateRequest. # noqa: E501 + :type: str + """ + + self._smiles = smiles + + @property + def molecular_formula(self): + """Gets the molecular_formula of this CompoundCreateRequest. # noqa: E501 + + + :return: The molecular_formula of this CompoundCreateRequest. # noqa: E501 + :rtype: str + """ + return self._molecular_formula + + @molecular_formula.setter + def molecular_formula(self, molecular_formula): + """Sets the molecular_formula of this CompoundCreateRequest. + + + :param molecular_formula: The molecular_formula of this CompoundCreateRequest. # noqa: E501 + :type: str + """ + + self._molecular_formula = molecular_formula + + @property + def cas_number(self): + """Gets the cas_number of this CompoundCreateRequest. # noqa: E501 + + + :return: The cas_number of this CompoundCreateRequest. # noqa: E501 + :rtype: str + """ + return self._cas_number + + @cas_number.setter + def cas_number(self, cas_number): + """Sets the cas_number of this CompoundCreateRequest. + + + :param cas_number: The cas_number of this CompoundCreateRequest. # noqa: E501 + :type: str + """ + + self._cas_number = cas_number + + @property + def iupac_name(self): + """Gets the iupac_name of this CompoundCreateRequest. # noqa: E501 + + + :return: The iupac_name of this CompoundCreateRequest. # noqa: E501 + :rtype: str + """ + return self._iupac_name + + @iupac_name.setter + def iupac_name(self, iupac_name): + """Sets the iupac_name of this CompoundCreateRequest. + + + :param iupac_name: The iupac_name of this CompoundCreateRequest. # noqa: E501 + :type: str + """ + + self._iupac_name = iupac_name + + @property + def pubchem_cid(self): + """Gets the pubchem_cid of this CompoundCreateRequest. # noqa: E501 + + + :return: The pubchem_cid of this CompoundCreateRequest. # noqa: E501 + :rtype: int + """ + return self._pubchem_cid + + @pubchem_cid.setter + def pubchem_cid(self, pubchem_cid): + """Sets the pubchem_cid of this CompoundCreateRequest. + + + :param pubchem_cid: The pubchem_cid of this CompoundCreateRequest. # noqa: E501 + :type: int + """ + + self._pubchem_cid = pubchem_cid + + @property + def is_corrosive(self): + """Gets the is_corrosive of this CompoundCreateRequest. # noqa: E501 + + + :return: The is_corrosive of this CompoundCreateRequest. # noqa: E501 + :rtype: int + """ + return self._is_corrosive + + @is_corrosive.setter + def is_corrosive(self, is_corrosive): + """Sets the is_corrosive of this CompoundCreateRequest. + + + :param is_corrosive: The is_corrosive of this CompoundCreateRequest. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_corrosive not in allowed_values: + raise ValueError( + "Invalid value for `is_corrosive` ({0}), must be one of {1}" # noqa: E501 + .format(is_corrosive, allowed_values) + ) + + self._is_corrosive = is_corrosive + + @property + def is_serious_health_hazard(self): + """Gets the is_serious_health_hazard of this CompoundCreateRequest. # noqa: E501 + + + :return: The is_serious_health_hazard of this CompoundCreateRequest. # noqa: E501 + :rtype: int + """ + return self._is_serious_health_hazard + + @is_serious_health_hazard.setter + def is_serious_health_hazard(self, is_serious_health_hazard): + """Sets the is_serious_health_hazard of this CompoundCreateRequest. + + + :param is_serious_health_hazard: The is_serious_health_hazard of this CompoundCreateRequest. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_serious_health_hazard not in allowed_values: + raise ValueError( + "Invalid value for `is_serious_health_hazard` ({0}), must be one of {1}" # noqa: E501 + .format(is_serious_health_hazard, allowed_values) + ) + + self._is_serious_health_hazard = is_serious_health_hazard + + @property + def is_explosive(self): + """Gets the is_explosive of this CompoundCreateRequest. # noqa: E501 + + + :return: The is_explosive of this CompoundCreateRequest. # noqa: E501 + :rtype: int + """ + return self._is_explosive + + @is_explosive.setter + def is_explosive(self, is_explosive): + """Sets the is_explosive of this CompoundCreateRequest. + + + :param is_explosive: The is_explosive of this CompoundCreateRequest. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_explosive not in allowed_values: + raise ValueError( + "Invalid value for `is_explosive` ({0}), must be one of {1}" # noqa: E501 + .format(is_explosive, allowed_values) + ) + + self._is_explosive = is_explosive + + @property + def is_flammable(self): + """Gets the is_flammable of this CompoundCreateRequest. # noqa: E501 + + + :return: The is_flammable of this CompoundCreateRequest. # noqa: E501 + :rtype: int + """ + return self._is_flammable + + @is_flammable.setter + def is_flammable(self, is_flammable): + """Sets the is_flammable of this CompoundCreateRequest. + + + :param is_flammable: The is_flammable of this CompoundCreateRequest. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_flammable not in allowed_values: + raise ValueError( + "Invalid value for `is_flammable` ({0}), must be one of {1}" # noqa: E501 + .format(is_flammable, allowed_values) + ) + + self._is_flammable = is_flammable + + @property + def is_gas_under_pressure(self): + """Gets the is_gas_under_pressure of this CompoundCreateRequest. # noqa: E501 + + + :return: The is_gas_under_pressure of this CompoundCreateRequest. # noqa: E501 + :rtype: int + """ + return self._is_gas_under_pressure + + @is_gas_under_pressure.setter + def is_gas_under_pressure(self, is_gas_under_pressure): + """Sets the is_gas_under_pressure of this CompoundCreateRequest. + + + :param is_gas_under_pressure: The is_gas_under_pressure of this CompoundCreateRequest. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_gas_under_pressure not in allowed_values: + raise ValueError( + "Invalid value for `is_gas_under_pressure` ({0}), must be one of {1}" # noqa: E501 + .format(is_gas_under_pressure, allowed_values) + ) + + self._is_gas_under_pressure = is_gas_under_pressure + + @property + def is_hazardous2env(self): + """Gets the is_hazardous2env of this CompoundCreateRequest. # noqa: E501 + + + :return: The is_hazardous2env of this CompoundCreateRequest. # noqa: E501 + :rtype: int + """ + return self._is_hazardous2env + + @is_hazardous2env.setter + def is_hazardous2env(self, is_hazardous2env): + """Sets the is_hazardous2env of this CompoundCreateRequest. + + + :param is_hazardous2env: The is_hazardous2env of this CompoundCreateRequest. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_hazardous2env not in allowed_values: + raise ValueError( + "Invalid value for `is_hazardous2env` ({0}), must be one of {1}" # noqa: E501 + .format(is_hazardous2env, allowed_values) + ) + + self._is_hazardous2env = is_hazardous2env + + @property + def is_hazardous2health(self): + """Gets the is_hazardous2health of this CompoundCreateRequest. # noqa: E501 + + + :return: The is_hazardous2health of this CompoundCreateRequest. # noqa: E501 + :rtype: int + """ + return self._is_hazardous2health + + @is_hazardous2health.setter + def is_hazardous2health(self, is_hazardous2health): + """Sets the is_hazardous2health of this CompoundCreateRequest. + + + :param is_hazardous2health: The is_hazardous2health of this CompoundCreateRequest. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_hazardous2health not in allowed_values: + raise ValueError( + "Invalid value for `is_hazardous2health` ({0}), must be one of {1}" # noqa: E501 + .format(is_hazardous2health, allowed_values) + ) + + self._is_hazardous2health = is_hazardous2health + + @property + def is_oxidising(self): + """Gets the is_oxidising of this CompoundCreateRequest. # noqa: E501 + + + :return: The is_oxidising of this CompoundCreateRequest. # noqa: E501 + :rtype: int + """ + return self._is_oxidising + + @is_oxidising.setter + def is_oxidising(self, is_oxidising): + """Sets the is_oxidising of this CompoundCreateRequest. + + + :param is_oxidising: The is_oxidising of this CompoundCreateRequest. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_oxidising not in allowed_values: + raise ValueError( + "Invalid value for `is_oxidising` ({0}), must be one of {1}" # noqa: E501 + .format(is_oxidising, allowed_values) + ) + + self._is_oxidising = is_oxidising + + @property + def is_toxic(self): + """Gets the is_toxic of this CompoundCreateRequest. # noqa: E501 + + + :return: The is_toxic of this CompoundCreateRequest. # noqa: E501 + :rtype: int + """ + return self._is_toxic + + @is_toxic.setter + def is_toxic(self, is_toxic): + """Sets the is_toxic of this CompoundCreateRequest. + + + :param is_toxic: The is_toxic of this CompoundCreateRequest. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_toxic not in allowed_values: + raise ValueError( + "Invalid value for `is_toxic` ({0}), must be one of {1}" # noqa: E501 + .format(is_toxic, allowed_values) + ) + + self._is_toxic = is_toxic + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(CompoundCreateRequest, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, CompoundCreateRequest): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/compound_duplicate_request.py b/vendor/elabapi-python/elabapi_python/models/compound_duplicate_request.py new file mode 100644 index 0000000..24f6547 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/compound_duplicate_request.py @@ -0,0 +1,173 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class CompoundDuplicateRequest(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str', + 'cid': 'int', + 'cas': 'str' + } + + attribute_map = { + 'action': 'action', + 'cid': 'cid', + 'cas': 'cas' + } + + def __init__(self, action=None, cid=None, cas=None): # noqa: E501 + """CompoundDuplicateRequest - a model defined in Swagger""" # noqa: E501 + self._action = None + self._cid = None + self._cas = None + self.discriminator = None + self.action = action + if cid is not None: + self.cid = cid + if cas is not None: + self.cas = cas + + @property + def action(self): + """Gets the action of this CompoundDuplicateRequest. # noqa: E501 + + + :return: The action of this CompoundDuplicateRequest. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this CompoundDuplicateRequest. + + + :param action: The action of this CompoundDuplicateRequest. # noqa: E501 + :type: str + """ + if action is None: + raise ValueError("Invalid value for `action`, must not be `None`") # noqa: E501 + allowed_values = ["duplicate"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + @property + def cid(self): + """Gets the cid of this CompoundDuplicateRequest. # noqa: E501 + + PubChem Compound ID (CID). Use it to find a compound via this unique identifier. Not compatible with `cas` parameter. # noqa: E501 + + :return: The cid of this CompoundDuplicateRequest. # noqa: E501 + :rtype: int + """ + return self._cid + + @cid.setter + def cid(self, cid): + """Sets the cid of this CompoundDuplicateRequest. + + PubChem Compound ID (CID). Use it to find a compound via this unique identifier. Not compatible with `cas` parameter. # noqa: E501 + + :param cid: The cid of this CompoundDuplicateRequest. # noqa: E501 + :type: int + """ + + self._cid = cid + + @property + def cas(self): + """Gets the cas of this CompoundDuplicateRequest. # noqa: E501 + + CAS number. Use it to find a compound via this unique identifier. Not compatible with `cid` parameter. # noqa: E501 + + :return: The cas of this CompoundDuplicateRequest. # noqa: E501 + :rtype: str + """ + return self._cas + + @cas.setter + def cas(self, cas): + """Sets the cas of this CompoundDuplicateRequest. + + CAS number. Use it to find a compound via this unique identifier. Not compatible with `cid` parameter. # noqa: E501 + + :param cas: The cas of this CompoundDuplicateRequest. # noqa: E501 + :type: str + """ + + self._cas = cas + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(CompoundDuplicateRequest, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, CompoundDuplicateRequest): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/compounds_body.py b/vendor/elabapi-python/elabapi_python/models/compounds_body.py new file mode 100644 index 0000000..8f23084 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/compounds_body.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class CompoundsBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """CompoundsBody - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(CompoundsBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, CompoundsBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/compounds_links_subid_body.py b/vendor/elabapi-python/elabapi_python/models/compounds_links_subid_body.py new file mode 100644 index 0000000..db4a4fb --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/compounds_links_subid_body.py @@ -0,0 +1,118 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class CompoundsLinksSubidBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str' + } + + attribute_map = { + 'action': 'action' + } + + def __init__(self, action=None): # noqa: E501 + """CompoundsLinksSubidBody - a model defined in Swagger""" # noqa: E501 + self._action = None + self.discriminator = None + if action is not None: + self.action = action + + @property + def action(self): + """Gets the action of this CompoundsLinksSubidBody. # noqa: E501 + + The `create` action will create the link. # noqa: E501 + + :return: The action of this CompoundsLinksSubidBody. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this CompoundsLinksSubidBody. + + The `create` action will create the link. # noqa: E501 + + :param action: The action of this CompoundsLinksSubidBody. # noqa: E501 + :type: str + """ + allowed_values = ["create"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(CompoundsLinksSubidBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, CompoundsLinksSubidBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/config.py b/vendor/elabapi-python/elabapi_python/models/config.py new file mode 100644 index 0000000..d6bec76 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/config.py @@ -0,0 +1,2890 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Config(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'admins_create_users': 'str', + 'admins_create_users_remote_dir': 'str', + 'admin_panel_custom_msg': 'str', + 'admin_validate': 'str', + 'allow_permission_full': 'str', + 'allow_permission_organization': 'str', + 'allow_permission_team': 'str', + 'allow_permission_user': 'str', + 'allow_permission_useronly': 'str', + 'announcement': 'str', + 'anon_users': 'str', + 'autologout_time': 'str', + 'blox_anon': 'str', + 'blox_enabled': 'str', + 'chat_url': 'str', + 'cookie_validity_time': 'int', + 'dspace_host': 'str', + 'dspace_user': 'str', + 'dspace_password': 'str', + 'email_domain': 'str', + 'extauth_email': 'str', + 'extauth_firstname': 'str', + 'extauth_lastname': 'str', + 'extauth_remote_user': 'str', + 'extauth_teams': 'str', + 'lang': 'str', + 'ldap_base_dn': 'str', + 'ldap_search_attr': 'str', + 'ldap_email': 'str', + 'ldap_firstname': 'str', + 'ldap_host': 'str', + 'ldap_lastname': 'str', + 'ldap_password': 'str', + 'ldap_port': 'str', + 'ldap_sync_teams': 'str', + 'ldap_team': 'str', + 'ldap_team_create': 'str', + 'ldap_toggle': 'str', + 'ldap_use_tls': 'str', + 'ldap_username': 'str', + 'local_login': 'str', + 'local_register': 'str', + 'login_announcement': 'str', + 'login_tries': 'str', + 'logout_url': 'str', + 'mail_from': 'str', + 'max_revisions': 'str', + 'min_days_revisions': 'str', + 'min_delta_revisions': 'str', + 'onboarding_email_active': 'str', + 'onboarding_email_admins_body': 'str', + 'onboarding_email_admins_subject': 'str', + 'onboarding_email_body': 'str', + 'onboarding_email_different_for_admins': 'str', + 'onboarding_email_subject': 'str', + 'privacy_policy': 'str', + 'proxy': 'str', + 'remote_dir_config': 'str', + 'remote_dir_service': 'str', + 's3_bucket_name': 'str', + 's3_endpoint': 'str', + 's3_path_prefix': 'str', + 's3_region': 'str', + 's3_verify_cert': 'str', + 'saml_allowrepeatattributename': 'str', + 'saml_authnrequestssigned': 'str', + 'saml_baseurl': 'str', + 'saml_debug': 'str', + 'saml_entityid': 'str', + 'saml_logoutrequestsigned': 'str', + 'saml_logoutresponsesigned': 'str', + 'saml_lowercaseurlencoding': 'str', + 'saml_nameidencrypted': 'str', + 'saml_nameidformat': 'str', + 'saml_privatekey': 'str', + 'saml_relaxdestinationvalidation': 'str', + 'saml_signmetadata': 'str', + 'saml_strict': 'str', + 'saml_sync_teams': 'str', + 'saml_team_create': 'str', + 'saml_team_default': 'str', + 'saml_toggle': 'str', + 'saml_user_default': 'str', + 'saml_wantassertionsencrypted': 'str', + 'saml_wantassertionssigned': 'str', + 'saml_wantmessagessigned': 'str', + 'saml_wantnameid': 'str', + 'saml_wantnameidencrypted': 'str', + 'saml_wantxmlvalidation': 'str', + 'saml_x509': 'str', + 'saml_x509_new': 'str', + 'schema': 'str', + 'smtp_address': 'str', + 'smtp_encryption': 'str', + 'smtp_password': 'str', + 'smtp_port': 'str', + 'smtp_username': 'str', + 'support_url': 'str', + 'ts_authority': 'str', + 'ts_cert': 'str', + 'ts_hash': 'str', + 'ts_limit': 'str', + 'ts_login': 'str', + 'ts_password': 'str', + 'ts_url': 'str', + 'uploads_storage': 'str', + 'users_validity_is_externally_managed': 'str' + } + + attribute_map = { + 'admins_create_users': 'admins_create_users', + 'admins_create_users_remote_dir': 'admins_create_users_remote_dir', + 'admin_panel_custom_msg': 'admin_panel_custom_msg', + 'admin_validate': 'admin_validate', + 'allow_permission_full': 'allow_permission_full', + 'allow_permission_organization': 'allow_permission_organization', + 'allow_permission_team': 'allow_permission_team', + 'allow_permission_user': 'allow_permission_user', + 'allow_permission_useronly': 'allow_permission_useronly', + 'announcement': 'announcement', + 'anon_users': 'anon_users', + 'autologout_time': 'autologout_time', + 'blox_anon': 'blox_anon', + 'blox_enabled': 'blox_enabled', + 'chat_url': 'chat_url', + 'cookie_validity_time': 'cookie_validity_time', + 'dspace_host': 'dspace_host', + 'dspace_user': 'dspace_user', + 'dspace_password': 'dspace_password', + 'email_domain': 'email_domain', + 'extauth_email': 'extauth_email', + 'extauth_firstname': 'extauth_firstname', + 'extauth_lastname': 'extauth_lastname', + 'extauth_remote_user': 'extauth_remote_user', + 'extauth_teams': 'extauth_teams', + 'lang': 'lang', + 'ldap_base_dn': 'ldap_base_dn', + 'ldap_search_attr': 'ldap_search_attr', + 'ldap_email': 'ldap_email', + 'ldap_firstname': 'ldap_firstname', + 'ldap_host': 'ldap_host', + 'ldap_lastname': 'ldap_lastname', + 'ldap_password': 'ldap_password', + 'ldap_port': 'ldap_port', + 'ldap_sync_teams': 'ldap_sync_teams', + 'ldap_team': 'ldap_team', + 'ldap_team_create': 'ldap_team_create', + 'ldap_toggle': 'ldap_toggle', + 'ldap_use_tls': 'ldap_use_tls', + 'ldap_username': 'ldap_username', + 'local_login': 'local_login', + 'local_register': 'local_register', + 'login_announcement': 'login_announcement', + 'login_tries': 'login_tries', + 'logout_url': 'logout_url', + 'mail_from': 'mail_from', + 'max_revisions': 'max_revisions', + 'min_days_revisions': 'min_days_revisions', + 'min_delta_revisions': 'min_delta_revisions', + 'onboarding_email_active': 'onboarding_email_active', + 'onboarding_email_admins_body': 'onboarding_email_admins_body', + 'onboarding_email_admins_subject': 'onboarding_email_admins_subject', + 'onboarding_email_body': 'onboarding_email_body', + 'onboarding_email_different_for_admins': 'onboarding_email_different_for_admins', + 'onboarding_email_subject': 'onboarding_email_subject', + 'privacy_policy': 'privacy_policy', + 'proxy': 'proxy', + 'remote_dir_config': 'remote_dir_config', + 'remote_dir_service': 'remote_dir_service', + 's3_bucket_name': 's3_bucket_name', + 's3_endpoint': 's3_endpoint', + 's3_path_prefix': 's3_path_prefix', + 's3_region': 's3_region', + 's3_verify_cert': 's3_verify_cert', + 'saml_allowrepeatattributename': 'saml_allowrepeatattributename', + 'saml_authnrequestssigned': 'saml_authnrequestssigned', + 'saml_baseurl': 'saml_baseurl', + 'saml_debug': 'saml_debug', + 'saml_entityid': 'saml_entityid', + 'saml_logoutrequestsigned': 'saml_logoutrequestsigned', + 'saml_logoutresponsesigned': 'saml_logoutresponsesigned', + 'saml_lowercaseurlencoding': 'saml_lowercaseurlencoding', + 'saml_nameidencrypted': 'saml_nameidencrypted', + 'saml_nameidformat': 'saml_nameidformat', + 'saml_privatekey': 'saml_privatekey', + 'saml_relaxdestinationvalidation': 'saml_relaxdestinationvalidation', + 'saml_signmetadata': 'saml_signmetadata', + 'saml_strict': 'saml_strict', + 'saml_sync_teams': 'saml_sync_teams', + 'saml_team_create': 'saml_team_create', + 'saml_team_default': 'saml_team_default', + 'saml_toggle': 'saml_toggle', + 'saml_user_default': 'saml_user_default', + 'saml_wantassertionsencrypted': 'saml_wantassertionsencrypted', + 'saml_wantassertionssigned': 'saml_wantassertionssigned', + 'saml_wantmessagessigned': 'saml_wantmessagessigned', + 'saml_wantnameid': 'saml_wantnameid', + 'saml_wantnameidencrypted': 'saml_wantnameidencrypted', + 'saml_wantxmlvalidation': 'saml_wantxmlvalidation', + 'saml_x509': 'saml_x509', + 'saml_x509_new': 'saml_x509_new', + 'schema': 'schema', + 'smtp_address': 'smtp_address', + 'smtp_encryption': 'smtp_encryption', + 'smtp_password': 'smtp_password', + 'smtp_port': 'smtp_port', + 'smtp_username': 'smtp_username', + 'support_url': 'support_url', + 'ts_authority': 'ts_authority', + 'ts_cert': 'ts_cert', + 'ts_hash': 'ts_hash', + 'ts_limit': 'ts_limit', + 'ts_login': 'ts_login', + 'ts_password': 'ts_password', + 'ts_url': 'ts_url', + 'uploads_storage': 'uploads_storage', + 'users_validity_is_externally_managed': 'users_validity_is_externally_managed' + } + + def __init__(self, admins_create_users='1', admins_create_users_remote_dir='0', admin_panel_custom_msg='', admin_validate='0', allow_permission_full='1', allow_permission_organization='1', allow_permission_team='1', allow_permission_user='1', allow_permission_useronly='1', announcement=None, anon_users='1', autologout_time='0', blox_anon='0', blox_enabled='1', chat_url='https://gitter.im/elabftw/elabftw', cookie_validity_time=43200, dspace_host='https://demo.dspace.org/', dspace_user='dspacedemo+admin@gmail.com', dspace_password='', email_domain=None, extauth_email='', extauth_firstname='', extauth_lastname='', extauth_remote_user='', extauth_teams='', lang='en_GB', ldap_base_dn='dc=example,dc=org', ldap_search_attr='mail', ldap_email='mail', ldap_firstname='givenname', ldap_host='ldap', ldap_lastname='cn', ldap_password='admin', ldap_port='389', ldap_sync_teams='0', ldap_team='on', ldap_team_create='0', ldap_toggle='0', ldap_use_tls='0', ldap_username='cn=admin,dc=example,dc=org', local_login='1', local_register='1', login_announcement=None, login_tries='10', logout_url='', mail_from='notconfigured@example.com', max_revisions='10', min_days_revisions='23', min_delta_revisions='100', onboarding_email_active='1', onboarding_email_admins_body='

Test email body for admins.

', onboarding_email_admins_subject='subject for admins', onboarding_email_body='

Test email body for users.

', onboarding_email_different_for_admins='1', onboarding_email_subject='test email subject', privacy_policy=None, proxy='', remote_dir_config='', remote_dir_service='eairef', s3_bucket_name='', s3_endpoint='', s3_path_prefix='', s3_region='fr-par-42', s3_verify_cert='1', saml_allowrepeatattributename='0', saml_authnrequestssigned='0', saml_baseurl=None, saml_debug='0', saml_entityid=None, saml_logoutrequestsigned='0', saml_logoutresponsesigned='0', saml_lowercaseurlencoding='0', saml_nameidencrypted='0', saml_nameidformat='urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', saml_privatekey=None, saml_relaxdestinationvalidation='0', saml_signmetadata='0', saml_strict='1', saml_sync_teams='0', saml_team_create='1', saml_team_default='-1', saml_toggle='0', saml_user_default='1', saml_wantassertionsencrypted='0', saml_wantassertionssigned='0', saml_wantmessagessigned='0', saml_wantnameid='1', saml_wantnameidencrypted='0', saml_wantxmlvalidation='1', saml_x509=None, saml_x509_new=None, schema='196', smtp_address='mail.smtp2go.com', smtp_encryption='ssl', smtp_password='', smtp_port='587', smtp_username='', support_url='https://github.com/elabftw/elabftw/issues', ts_authority='dfn', ts_cert=None, ts_hash='sha256', ts_limit='0', ts_login=None, ts_password='', ts_url=None, uploads_storage='1', users_validity_is_externally_managed='0'): # noqa: E501 + """Config - a model defined in Swagger""" # noqa: E501 + self._admins_create_users = None + self._admins_create_users_remote_dir = None + self._admin_panel_custom_msg = None + self._admin_validate = None + self._allow_permission_full = None + self._allow_permission_organization = None + self._allow_permission_team = None + self._allow_permission_user = None + self._allow_permission_useronly = None + self._announcement = None + self._anon_users = None + self._autologout_time = None + self._blox_anon = None + self._blox_enabled = None + self._chat_url = None + self._cookie_validity_time = None + self._dspace_host = None + self._dspace_user = None + self._dspace_password = None + self._email_domain = None + self._extauth_email = None + self._extauth_firstname = None + self._extauth_lastname = None + self._extauth_remote_user = None + self._extauth_teams = None + self._lang = None + self._ldap_base_dn = None + self._ldap_search_attr = None + self._ldap_email = None + self._ldap_firstname = None + self._ldap_host = None + self._ldap_lastname = None + self._ldap_password = None + self._ldap_port = None + self._ldap_sync_teams = None + self._ldap_team = None + self._ldap_team_create = None + self._ldap_toggle = None + self._ldap_use_tls = None + self._ldap_username = None + self._local_login = None + self._local_register = None + self._login_announcement = None + self._login_tries = None + self._logout_url = None + self._mail_from = None + self._max_revisions = None + self._min_days_revisions = None + self._min_delta_revisions = None + self._onboarding_email_active = None + self._onboarding_email_admins_body = None + self._onboarding_email_admins_subject = None + self._onboarding_email_body = None + self._onboarding_email_different_for_admins = None + self._onboarding_email_subject = None + self._privacy_policy = None + self._proxy = None + self._remote_dir_config = None + self._remote_dir_service = None + self._s3_bucket_name = None + self._s3_endpoint = None + self._s3_path_prefix = None + self._s3_region = None + self._s3_verify_cert = None + self._saml_allowrepeatattributename = None + self._saml_authnrequestssigned = None + self._saml_baseurl = None + self._saml_debug = None + self._saml_entityid = None + self._saml_logoutrequestsigned = None + self._saml_logoutresponsesigned = None + self._saml_lowercaseurlencoding = None + self._saml_nameidencrypted = None + self._saml_nameidformat = None + self._saml_privatekey = None + self._saml_relaxdestinationvalidation = None + self._saml_signmetadata = None + self._saml_strict = None + self._saml_sync_teams = None + self._saml_team_create = None + self._saml_team_default = None + self._saml_toggle = None + self._saml_user_default = None + self._saml_wantassertionsencrypted = None + self._saml_wantassertionssigned = None + self._saml_wantmessagessigned = None + self._saml_wantnameid = None + self._saml_wantnameidencrypted = None + self._saml_wantxmlvalidation = None + self._saml_x509 = None + self._saml_x509_new = None + self._schema = None + self._smtp_address = None + self._smtp_encryption = None + self._smtp_password = None + self._smtp_port = None + self._smtp_username = None + self._support_url = None + self._ts_authority = None + self._ts_cert = None + self._ts_hash = None + self._ts_limit = None + self._ts_login = None + self._ts_password = None + self._ts_url = None + self._uploads_storage = None + self._users_validity_is_externally_managed = None + self.discriminator = None + if admins_create_users is not None: + self.admins_create_users = admins_create_users + if admins_create_users_remote_dir is not None: + self.admins_create_users_remote_dir = admins_create_users_remote_dir + if admin_panel_custom_msg is not None: + self.admin_panel_custom_msg = admin_panel_custom_msg + if admin_validate is not None: + self.admin_validate = admin_validate + if allow_permission_full is not None: + self.allow_permission_full = allow_permission_full + if allow_permission_organization is not None: + self.allow_permission_organization = allow_permission_organization + if allow_permission_team is not None: + self.allow_permission_team = allow_permission_team + if allow_permission_user is not None: + self.allow_permission_user = allow_permission_user + if allow_permission_useronly is not None: + self.allow_permission_useronly = allow_permission_useronly + if announcement is not None: + self.announcement = announcement + if anon_users is not None: + self.anon_users = anon_users + if autologout_time is not None: + self.autologout_time = autologout_time + if blox_anon is not None: + self.blox_anon = blox_anon + if blox_enabled is not None: + self.blox_enabled = blox_enabled + if chat_url is not None: + self.chat_url = chat_url + if cookie_validity_time is not None: + self.cookie_validity_time = cookie_validity_time + if dspace_host is not None: + self.dspace_host = dspace_host + if dspace_user is not None: + self.dspace_user = dspace_user + if dspace_password is not None: + self.dspace_password = dspace_password + if email_domain is not None: + self.email_domain = email_domain + if extauth_email is not None: + self.extauth_email = extauth_email + if extauth_firstname is not None: + self.extauth_firstname = extauth_firstname + if extauth_lastname is not None: + self.extauth_lastname = extauth_lastname + if extauth_remote_user is not None: + self.extauth_remote_user = extauth_remote_user + if extauth_teams is not None: + self.extauth_teams = extauth_teams + if lang is not None: + self.lang = lang + if ldap_base_dn is not None: + self.ldap_base_dn = ldap_base_dn + if ldap_search_attr is not None: + self.ldap_search_attr = ldap_search_attr + if ldap_email is not None: + self.ldap_email = ldap_email + if ldap_firstname is not None: + self.ldap_firstname = ldap_firstname + if ldap_host is not None: + self.ldap_host = ldap_host + if ldap_lastname is not None: + self.ldap_lastname = ldap_lastname + if ldap_password is not None: + self.ldap_password = ldap_password + if ldap_port is not None: + self.ldap_port = ldap_port + if ldap_sync_teams is not None: + self.ldap_sync_teams = ldap_sync_teams + if ldap_team is not None: + self.ldap_team = ldap_team + if ldap_team_create is not None: + self.ldap_team_create = ldap_team_create + if ldap_toggle is not None: + self.ldap_toggle = ldap_toggle + if ldap_use_tls is not None: + self.ldap_use_tls = ldap_use_tls + if ldap_username is not None: + self.ldap_username = ldap_username + if local_login is not None: + self.local_login = local_login + if local_register is not None: + self.local_register = local_register + if login_announcement is not None: + self.login_announcement = login_announcement + if login_tries is not None: + self.login_tries = login_tries + if logout_url is not None: + self.logout_url = logout_url + if mail_from is not None: + self.mail_from = mail_from + if max_revisions is not None: + self.max_revisions = max_revisions + if min_days_revisions is not None: + self.min_days_revisions = min_days_revisions + if min_delta_revisions is not None: + self.min_delta_revisions = min_delta_revisions + if onboarding_email_active is not None: + self.onboarding_email_active = onboarding_email_active + if onboarding_email_admins_body is not None: + self.onboarding_email_admins_body = onboarding_email_admins_body + if onboarding_email_admins_subject is not None: + self.onboarding_email_admins_subject = onboarding_email_admins_subject + if onboarding_email_body is not None: + self.onboarding_email_body = onboarding_email_body + if onboarding_email_different_for_admins is not None: + self.onboarding_email_different_for_admins = onboarding_email_different_for_admins + if onboarding_email_subject is not None: + self.onboarding_email_subject = onboarding_email_subject + if privacy_policy is not None: + self.privacy_policy = privacy_policy + if proxy is not None: + self.proxy = proxy + if remote_dir_config is not None: + self.remote_dir_config = remote_dir_config + if remote_dir_service is not None: + self.remote_dir_service = remote_dir_service + if s3_bucket_name is not None: + self.s3_bucket_name = s3_bucket_name + if s3_endpoint is not None: + self.s3_endpoint = s3_endpoint + if s3_path_prefix is not None: + self.s3_path_prefix = s3_path_prefix + if s3_region is not None: + self.s3_region = s3_region + if s3_verify_cert is not None: + self.s3_verify_cert = s3_verify_cert + if saml_allowrepeatattributename is not None: + self.saml_allowrepeatattributename = saml_allowrepeatattributename + if saml_authnrequestssigned is not None: + self.saml_authnrequestssigned = saml_authnrequestssigned + if saml_baseurl is not None: + self.saml_baseurl = saml_baseurl + if saml_debug is not None: + self.saml_debug = saml_debug + if saml_entityid is not None: + self.saml_entityid = saml_entityid + if saml_logoutrequestsigned is not None: + self.saml_logoutrequestsigned = saml_logoutrequestsigned + if saml_logoutresponsesigned is not None: + self.saml_logoutresponsesigned = saml_logoutresponsesigned + if saml_lowercaseurlencoding is not None: + self.saml_lowercaseurlencoding = saml_lowercaseurlencoding + if saml_nameidencrypted is not None: + self.saml_nameidencrypted = saml_nameidencrypted + if saml_nameidformat is not None: + self.saml_nameidformat = saml_nameidformat + if saml_privatekey is not None: + self.saml_privatekey = saml_privatekey + if saml_relaxdestinationvalidation is not None: + self.saml_relaxdestinationvalidation = saml_relaxdestinationvalidation + if saml_signmetadata is not None: + self.saml_signmetadata = saml_signmetadata + if saml_strict is not None: + self.saml_strict = saml_strict + if saml_sync_teams is not None: + self.saml_sync_teams = saml_sync_teams + if saml_team_create is not None: + self.saml_team_create = saml_team_create + if saml_team_default is not None: + self.saml_team_default = saml_team_default + if saml_toggle is not None: + self.saml_toggle = saml_toggle + if saml_user_default is not None: + self.saml_user_default = saml_user_default + if saml_wantassertionsencrypted is not None: + self.saml_wantassertionsencrypted = saml_wantassertionsencrypted + if saml_wantassertionssigned is not None: + self.saml_wantassertionssigned = saml_wantassertionssigned + if saml_wantmessagessigned is not None: + self.saml_wantmessagessigned = saml_wantmessagessigned + if saml_wantnameid is not None: + self.saml_wantnameid = saml_wantnameid + if saml_wantnameidencrypted is not None: + self.saml_wantnameidencrypted = saml_wantnameidencrypted + if saml_wantxmlvalidation is not None: + self.saml_wantxmlvalidation = saml_wantxmlvalidation + if saml_x509 is not None: + self.saml_x509 = saml_x509 + if saml_x509_new is not None: + self.saml_x509_new = saml_x509_new + if schema is not None: + self.schema = schema + if smtp_address is not None: + self.smtp_address = smtp_address + if smtp_encryption is not None: + self.smtp_encryption = smtp_encryption + if smtp_password is not None: + self.smtp_password = smtp_password + if smtp_port is not None: + self.smtp_port = smtp_port + if smtp_username is not None: + self.smtp_username = smtp_username + if support_url is not None: + self.support_url = support_url + if ts_authority is not None: + self.ts_authority = ts_authority + if ts_cert is not None: + self.ts_cert = ts_cert + if ts_hash is not None: + self.ts_hash = ts_hash + if ts_limit is not None: + self.ts_limit = ts_limit + if ts_login is not None: + self.ts_login = ts_login + if ts_password is not None: + self.ts_password = ts_password + if ts_url is not None: + self.ts_url = ts_url + if uploads_storage is not None: + self.uploads_storage = uploads_storage + if users_validity_is_externally_managed is not None: + self.users_validity_is_externally_managed = users_validity_is_externally_managed + + @property + def admins_create_users(self): + """Gets the admins_create_users of this Config. # noqa: E501 + + + :return: The admins_create_users of this Config. # noqa: E501 + :rtype: str + """ + return self._admins_create_users + + @admins_create_users.setter + def admins_create_users(self, admins_create_users): + """Sets the admins_create_users of this Config. + + + :param admins_create_users: The admins_create_users of this Config. # noqa: E501 + :type: str + """ + + self._admins_create_users = admins_create_users + + @property + def admins_create_users_remote_dir(self): + """Gets the admins_create_users_remote_dir of this Config. # noqa: E501 + + + :return: The admins_create_users_remote_dir of this Config. # noqa: E501 + :rtype: str + """ + return self._admins_create_users_remote_dir + + @admins_create_users_remote_dir.setter + def admins_create_users_remote_dir(self, admins_create_users_remote_dir): + """Sets the admins_create_users_remote_dir of this Config. + + + :param admins_create_users_remote_dir: The admins_create_users_remote_dir of this Config. # noqa: E501 + :type: str + """ + + self._admins_create_users_remote_dir = admins_create_users_remote_dir + + @property + def admin_panel_custom_msg(self): + """Gets the admin_panel_custom_msg of this Config. # noqa: E501 + + + :return: The admin_panel_custom_msg of this Config. # noqa: E501 + :rtype: str + """ + return self._admin_panel_custom_msg + + @admin_panel_custom_msg.setter + def admin_panel_custom_msg(self, admin_panel_custom_msg): + """Sets the admin_panel_custom_msg of this Config. + + + :param admin_panel_custom_msg: The admin_panel_custom_msg of this Config. # noqa: E501 + :type: str + """ + + self._admin_panel_custom_msg = admin_panel_custom_msg + + @property + def admin_validate(self): + """Gets the admin_validate of this Config. # noqa: E501 + + + :return: The admin_validate of this Config. # noqa: E501 + :rtype: str + """ + return self._admin_validate + + @admin_validate.setter + def admin_validate(self, admin_validate): + """Sets the admin_validate of this Config. + + + :param admin_validate: The admin_validate of this Config. # noqa: E501 + :type: str + """ + + self._admin_validate = admin_validate + + @property + def allow_permission_full(self): + """Gets the allow_permission_full of this Config. # noqa: E501 + + + :return: The allow_permission_full of this Config. # noqa: E501 + :rtype: str + """ + return self._allow_permission_full + + @allow_permission_full.setter + def allow_permission_full(self, allow_permission_full): + """Sets the allow_permission_full of this Config. + + + :param allow_permission_full: The allow_permission_full of this Config. # noqa: E501 + :type: str + """ + + self._allow_permission_full = allow_permission_full + + @property + def allow_permission_organization(self): + """Gets the allow_permission_organization of this Config. # noqa: E501 + + + :return: The allow_permission_organization of this Config. # noqa: E501 + :rtype: str + """ + return self._allow_permission_organization + + @allow_permission_organization.setter + def allow_permission_organization(self, allow_permission_organization): + """Sets the allow_permission_organization of this Config. + + + :param allow_permission_organization: The allow_permission_organization of this Config. # noqa: E501 + :type: str + """ + + self._allow_permission_organization = allow_permission_organization + + @property + def allow_permission_team(self): + """Gets the allow_permission_team of this Config. # noqa: E501 + + + :return: The allow_permission_team of this Config. # noqa: E501 + :rtype: str + """ + return self._allow_permission_team + + @allow_permission_team.setter + def allow_permission_team(self, allow_permission_team): + """Sets the allow_permission_team of this Config. + + + :param allow_permission_team: The allow_permission_team of this Config. # noqa: E501 + :type: str + """ + + self._allow_permission_team = allow_permission_team + + @property + def allow_permission_user(self): + """Gets the allow_permission_user of this Config. # noqa: E501 + + + :return: The allow_permission_user of this Config. # noqa: E501 + :rtype: str + """ + return self._allow_permission_user + + @allow_permission_user.setter + def allow_permission_user(self, allow_permission_user): + """Sets the allow_permission_user of this Config. + + + :param allow_permission_user: The allow_permission_user of this Config. # noqa: E501 + :type: str + """ + + self._allow_permission_user = allow_permission_user + + @property + def allow_permission_useronly(self): + """Gets the allow_permission_useronly of this Config. # noqa: E501 + + + :return: The allow_permission_useronly of this Config. # noqa: E501 + :rtype: str + """ + return self._allow_permission_useronly + + @allow_permission_useronly.setter + def allow_permission_useronly(self, allow_permission_useronly): + """Sets the allow_permission_useronly of this Config. + + + :param allow_permission_useronly: The allow_permission_useronly of this Config. # noqa: E501 + :type: str + """ + + self._allow_permission_useronly = allow_permission_useronly + + @property + def announcement(self): + """Gets the announcement of this Config. # noqa: E501 + + This text will be shown on every page, including login page. # noqa: E501 + + :return: The announcement of this Config. # noqa: E501 + :rtype: str + """ + return self._announcement + + @announcement.setter + def announcement(self, announcement): + """Sets the announcement of this Config. + + This text will be shown on every page, including login page. # noqa: E501 + + :param announcement: The announcement of this Config. # noqa: E501 + :type: str + """ + + self._announcement = announcement + + @property + def anon_users(self): + """Gets the anon_users of this Config. # noqa: E501 + + + :return: The anon_users of this Config. # noqa: E501 + :rtype: str + """ + return self._anon_users + + @anon_users.setter + def anon_users(self, anon_users): + """Sets the anon_users of this Config. + + + :param anon_users: The anon_users of this Config. # noqa: E501 + :type: str + """ + + self._anon_users = anon_users + + @property + def autologout_time(self): + """Gets the autologout_time of this Config. # noqa: E501 + + + :return: The autologout_time of this Config. # noqa: E501 + :rtype: str + """ + return self._autologout_time + + @autologout_time.setter + def autologout_time(self, autologout_time): + """Sets the autologout_time of this Config. + + + :param autologout_time: The autologout_time of this Config. # noqa: E501 + :type: str + """ + + self._autologout_time = autologout_time + + @property + def blox_anon(self): + """Gets the blox_anon of this Config. # noqa: E501 + + + :return: The blox_anon of this Config. # noqa: E501 + :rtype: str + """ + return self._blox_anon + + @blox_anon.setter + def blox_anon(self, blox_anon): + """Sets the blox_anon of this Config. + + + :param blox_anon: The blox_anon of this Config. # noqa: E501 + :type: str + """ + + self._blox_anon = blox_anon + + @property + def blox_enabled(self): + """Gets the blox_enabled of this Config. # noqa: E501 + + + :return: The blox_enabled of this Config. # noqa: E501 + :rtype: str + """ + return self._blox_enabled + + @blox_enabled.setter + def blox_enabled(self, blox_enabled): + """Sets the blox_enabled of this Config. + + + :param blox_enabled: The blox_enabled of this Config. # noqa: E501 + :type: str + """ + + self._blox_enabled = blox_enabled + + @property + def chat_url(self): + """Gets the chat_url of this Config. # noqa: E501 + + + :return: The chat_url of this Config. # noqa: E501 + :rtype: str + """ + return self._chat_url + + @chat_url.setter + def chat_url(self, chat_url): + """Sets the chat_url of this Config. + + + :param chat_url: The chat_url of this Config. # noqa: E501 + :type: str + """ + + self._chat_url = chat_url + + @property + def cookie_validity_time(self): + """Gets the cookie_validity_time of this Config. # noqa: E501 + + + :return: The cookie_validity_time of this Config. # noqa: E501 + :rtype: int + """ + return self._cookie_validity_time + + @cookie_validity_time.setter + def cookie_validity_time(self, cookie_validity_time): + """Sets the cookie_validity_time of this Config. + + + :param cookie_validity_time: The cookie_validity_time of this Config. # noqa: E501 + :type: int + """ + + self._cookie_validity_time = cookie_validity_time + + @property + def dspace_host(self): + """Gets the dspace_host of this Config. # noqa: E501 + + URL for dspace host # noqa: E501 + + :return: The dspace_host of this Config. # noqa: E501 + :rtype: str + """ + return self._dspace_host + + @dspace_host.setter + def dspace_host(self, dspace_host): + """Sets the dspace_host of this Config. + + URL for dspace host # noqa: E501 + + :param dspace_host: The dspace_host of this Config. # noqa: E501 + :type: str + """ + + self._dspace_host = dspace_host + + @property + def dspace_user(self): + """Gets the dspace_user of this Config. # noqa: E501 + + Username for dspace integration # noqa: E501 + + :return: The dspace_user of this Config. # noqa: E501 + :rtype: str + """ + return self._dspace_user + + @dspace_user.setter + def dspace_user(self, dspace_user): + """Sets the dspace_user of this Config. + + Username for dspace integration # noqa: E501 + + :param dspace_user: The dspace_user of this Config. # noqa: E501 + :type: str + """ + + self._dspace_user = dspace_user + + @property + def dspace_password(self): + """Gets the dspace_password of this Config. # noqa: E501 + + Password for the corresponding dspace user # noqa: E501 + + :return: The dspace_password of this Config. # noqa: E501 + :rtype: str + """ + return self._dspace_password + + @dspace_password.setter + def dspace_password(self, dspace_password): + """Sets the dspace_password of this Config. + + Password for the corresponding dspace user # noqa: E501 + + :param dspace_password: The dspace_password of this Config. # noqa: E501 + :type: str + """ + + self._dspace_password = dspace_password + + @property + def email_domain(self): + """Gets the email_domain of this Config. # noqa: E501 + + + :return: The email_domain of this Config. # noqa: E501 + :rtype: str + """ + return self._email_domain + + @email_domain.setter + def email_domain(self, email_domain): + """Sets the email_domain of this Config. + + + :param email_domain: The email_domain of this Config. # noqa: E501 + :type: str + """ + + self._email_domain = email_domain + + @property + def extauth_email(self): + """Gets the extauth_email of this Config. # noqa: E501 + + + :return: The extauth_email of this Config. # noqa: E501 + :rtype: str + """ + return self._extauth_email + + @extauth_email.setter + def extauth_email(self, extauth_email): + """Sets the extauth_email of this Config. + + + :param extauth_email: The extauth_email of this Config. # noqa: E501 + :type: str + """ + + self._extauth_email = extauth_email + + @property + def extauth_firstname(self): + """Gets the extauth_firstname of this Config. # noqa: E501 + + + :return: The extauth_firstname of this Config. # noqa: E501 + :rtype: str + """ + return self._extauth_firstname + + @extauth_firstname.setter + def extauth_firstname(self, extauth_firstname): + """Sets the extauth_firstname of this Config. + + + :param extauth_firstname: The extauth_firstname of this Config. # noqa: E501 + :type: str + """ + + self._extauth_firstname = extauth_firstname + + @property + def extauth_lastname(self): + """Gets the extauth_lastname of this Config. # noqa: E501 + + + :return: The extauth_lastname of this Config. # noqa: E501 + :rtype: str + """ + return self._extauth_lastname + + @extauth_lastname.setter + def extauth_lastname(self, extauth_lastname): + """Sets the extauth_lastname of this Config. + + + :param extauth_lastname: The extauth_lastname of this Config. # noqa: E501 + :type: str + """ + + self._extauth_lastname = extauth_lastname + + @property + def extauth_remote_user(self): + """Gets the extauth_remote_user of this Config. # noqa: E501 + + + :return: The extauth_remote_user of this Config. # noqa: E501 + :rtype: str + """ + return self._extauth_remote_user + + @extauth_remote_user.setter + def extauth_remote_user(self, extauth_remote_user): + """Sets the extauth_remote_user of this Config. + + + :param extauth_remote_user: The extauth_remote_user of this Config. # noqa: E501 + :type: str + """ + + self._extauth_remote_user = extauth_remote_user + + @property + def extauth_teams(self): + """Gets the extauth_teams of this Config. # noqa: E501 + + + :return: The extauth_teams of this Config. # noqa: E501 + :rtype: str + """ + return self._extauth_teams + + @extauth_teams.setter + def extauth_teams(self, extauth_teams): + """Sets the extauth_teams of this Config. + + + :param extauth_teams: The extauth_teams of this Config. # noqa: E501 + :type: str + """ + + self._extauth_teams = extauth_teams + + @property + def lang(self): + """Gets the lang of this Config. # noqa: E501 + + + :return: The lang of this Config. # noqa: E501 + :rtype: str + """ + return self._lang + + @lang.setter + def lang(self, lang): + """Sets the lang of this Config. + + + :param lang: The lang of this Config. # noqa: E501 + :type: str + """ + + self._lang = lang + + @property + def ldap_base_dn(self): + """Gets the ldap_base_dn of this Config. # noqa: E501 + + + :return: The ldap_base_dn of this Config. # noqa: E501 + :rtype: str + """ + return self._ldap_base_dn + + @ldap_base_dn.setter + def ldap_base_dn(self, ldap_base_dn): + """Sets the ldap_base_dn of this Config. + + + :param ldap_base_dn: The ldap_base_dn of this Config. # noqa: E501 + :type: str + """ + + self._ldap_base_dn = ldap_base_dn + + @property + def ldap_search_attr(self): + """Gets the ldap_search_attr of this Config. # noqa: E501 + + + :return: The ldap_search_attr of this Config. # noqa: E501 + :rtype: str + """ + return self._ldap_search_attr + + @ldap_search_attr.setter + def ldap_search_attr(self, ldap_search_attr): + """Sets the ldap_search_attr of this Config. + + + :param ldap_search_attr: The ldap_search_attr of this Config. # noqa: E501 + :type: str + """ + + self._ldap_search_attr = ldap_search_attr + + @property + def ldap_email(self): + """Gets the ldap_email of this Config. # noqa: E501 + + + :return: The ldap_email of this Config. # noqa: E501 + :rtype: str + """ + return self._ldap_email + + @ldap_email.setter + def ldap_email(self, ldap_email): + """Sets the ldap_email of this Config. + + + :param ldap_email: The ldap_email of this Config. # noqa: E501 + :type: str + """ + + self._ldap_email = ldap_email + + @property + def ldap_firstname(self): + """Gets the ldap_firstname of this Config. # noqa: E501 + + + :return: The ldap_firstname of this Config. # noqa: E501 + :rtype: str + """ + return self._ldap_firstname + + @ldap_firstname.setter + def ldap_firstname(self, ldap_firstname): + """Sets the ldap_firstname of this Config. + + + :param ldap_firstname: The ldap_firstname of this Config. # noqa: E501 + :type: str + """ + + self._ldap_firstname = ldap_firstname + + @property + def ldap_host(self): + """Gets the ldap_host of this Config. # noqa: E501 + + + :return: The ldap_host of this Config. # noqa: E501 + :rtype: str + """ + return self._ldap_host + + @ldap_host.setter + def ldap_host(self, ldap_host): + """Sets the ldap_host of this Config. + + + :param ldap_host: The ldap_host of this Config. # noqa: E501 + :type: str + """ + + self._ldap_host = ldap_host + + @property + def ldap_lastname(self): + """Gets the ldap_lastname of this Config. # noqa: E501 + + + :return: The ldap_lastname of this Config. # noqa: E501 + :rtype: str + """ + return self._ldap_lastname + + @ldap_lastname.setter + def ldap_lastname(self, ldap_lastname): + """Sets the ldap_lastname of this Config. + + + :param ldap_lastname: The ldap_lastname of this Config. # noqa: E501 + :type: str + """ + + self._ldap_lastname = ldap_lastname + + @property + def ldap_password(self): + """Gets the ldap_password of this Config. # noqa: E501 + + + :return: The ldap_password of this Config. # noqa: E501 + :rtype: str + """ + return self._ldap_password + + @ldap_password.setter + def ldap_password(self, ldap_password): + """Sets the ldap_password of this Config. + + + :param ldap_password: The ldap_password of this Config. # noqa: E501 + :type: str + """ + + self._ldap_password = ldap_password + + @property + def ldap_port(self): + """Gets the ldap_port of this Config. # noqa: E501 + + + :return: The ldap_port of this Config. # noqa: E501 + :rtype: str + """ + return self._ldap_port + + @ldap_port.setter + def ldap_port(self, ldap_port): + """Sets the ldap_port of this Config. + + + :param ldap_port: The ldap_port of this Config. # noqa: E501 + :type: str + """ + + self._ldap_port = ldap_port + + @property + def ldap_sync_teams(self): + """Gets the ldap_sync_teams of this Config. # noqa: E501 + + + :return: The ldap_sync_teams of this Config. # noqa: E501 + :rtype: str + """ + return self._ldap_sync_teams + + @ldap_sync_teams.setter + def ldap_sync_teams(self, ldap_sync_teams): + """Sets the ldap_sync_teams of this Config. + + + :param ldap_sync_teams: The ldap_sync_teams of this Config. # noqa: E501 + :type: str + """ + + self._ldap_sync_teams = ldap_sync_teams + + @property + def ldap_team(self): + """Gets the ldap_team of this Config. # noqa: E501 + + + :return: The ldap_team of this Config. # noqa: E501 + :rtype: str + """ + return self._ldap_team + + @ldap_team.setter + def ldap_team(self, ldap_team): + """Sets the ldap_team of this Config. + + + :param ldap_team: The ldap_team of this Config. # noqa: E501 + :type: str + """ + + self._ldap_team = ldap_team + + @property + def ldap_team_create(self): + """Gets the ldap_team_create of this Config. # noqa: E501 + + + :return: The ldap_team_create of this Config. # noqa: E501 + :rtype: str + """ + return self._ldap_team_create + + @ldap_team_create.setter + def ldap_team_create(self, ldap_team_create): + """Sets the ldap_team_create of this Config. + + + :param ldap_team_create: The ldap_team_create of this Config. # noqa: E501 + :type: str + """ + + self._ldap_team_create = ldap_team_create + + @property + def ldap_toggle(self): + """Gets the ldap_toggle of this Config. # noqa: E501 + + + :return: The ldap_toggle of this Config. # noqa: E501 + :rtype: str + """ + return self._ldap_toggle + + @ldap_toggle.setter + def ldap_toggle(self, ldap_toggle): + """Sets the ldap_toggle of this Config. + + + :param ldap_toggle: The ldap_toggle of this Config. # noqa: E501 + :type: str + """ + + self._ldap_toggle = ldap_toggle + + @property + def ldap_use_tls(self): + """Gets the ldap_use_tls of this Config. # noqa: E501 + + + :return: The ldap_use_tls of this Config. # noqa: E501 + :rtype: str + """ + return self._ldap_use_tls + + @ldap_use_tls.setter + def ldap_use_tls(self, ldap_use_tls): + """Sets the ldap_use_tls of this Config. + + + :param ldap_use_tls: The ldap_use_tls of this Config. # noqa: E501 + :type: str + """ + + self._ldap_use_tls = ldap_use_tls + + @property + def ldap_username(self): + """Gets the ldap_username of this Config. # noqa: E501 + + + :return: The ldap_username of this Config. # noqa: E501 + :rtype: str + """ + return self._ldap_username + + @ldap_username.setter + def ldap_username(self, ldap_username): + """Sets the ldap_username of this Config. + + + :param ldap_username: The ldap_username of this Config. # noqa: E501 + :type: str + """ + + self._ldap_username = ldap_username + + @property + def local_login(self): + """Gets the local_login of this Config. # noqa: E501 + + + :return: The local_login of this Config. # noqa: E501 + :rtype: str + """ + return self._local_login + + @local_login.setter + def local_login(self, local_login): + """Sets the local_login of this Config. + + + :param local_login: The local_login of this Config. # noqa: E501 + :type: str + """ + + self._local_login = local_login + + @property + def local_register(self): + """Gets the local_register of this Config. # noqa: E501 + + + :return: The local_register of this Config. # noqa: E501 + :rtype: str + """ + return self._local_register + + @local_register.setter + def local_register(self, local_register): + """Sets the local_register of this Config. + + + :param local_register: The local_register of this Config. # noqa: E501 + :type: str + """ + + self._local_register = local_register + + @property + def login_announcement(self): + """Gets the login_announcement of this Config. # noqa: E501 + + This text will only be shown on the login page. # noqa: E501 + + :return: The login_announcement of this Config. # noqa: E501 + :rtype: str + """ + return self._login_announcement + + @login_announcement.setter + def login_announcement(self, login_announcement): + """Sets the login_announcement of this Config. + + This text will only be shown on the login page. # noqa: E501 + + :param login_announcement: The login_announcement of this Config. # noqa: E501 + :type: str + """ + + self._login_announcement = login_announcement + + @property + def login_tries(self): + """Gets the login_tries of this Config. # noqa: E501 + + + :return: The login_tries of this Config. # noqa: E501 + :rtype: str + """ + return self._login_tries + + @login_tries.setter + def login_tries(self, login_tries): + """Sets the login_tries of this Config. + + + :param login_tries: The login_tries of this Config. # noqa: E501 + :type: str + """ + + self._login_tries = login_tries + + @property + def logout_url(self): + """Gets the logout_url of this Config. # noqa: E501 + + + :return: The logout_url of this Config. # noqa: E501 + :rtype: str + """ + return self._logout_url + + @logout_url.setter + def logout_url(self, logout_url): + """Sets the logout_url of this Config. + + + :param logout_url: The logout_url of this Config. # noqa: E501 + :type: str + """ + + self._logout_url = logout_url + + @property + def mail_from(self): + """Gets the mail_from of this Config. # noqa: E501 + + + :return: The mail_from of this Config. # noqa: E501 + :rtype: str + """ + return self._mail_from + + @mail_from.setter + def mail_from(self, mail_from): + """Sets the mail_from of this Config. + + + :param mail_from: The mail_from of this Config. # noqa: E501 + :type: str + """ + + self._mail_from = mail_from + + @property + def max_revisions(self): + """Gets the max_revisions of this Config. # noqa: E501 + + + :return: The max_revisions of this Config. # noqa: E501 + :rtype: str + """ + return self._max_revisions + + @max_revisions.setter + def max_revisions(self, max_revisions): + """Sets the max_revisions of this Config. + + + :param max_revisions: The max_revisions of this Config. # noqa: E501 + :type: str + """ + + self._max_revisions = max_revisions + + @property + def min_days_revisions(self): + """Gets the min_days_revisions of this Config. # noqa: E501 + + + :return: The min_days_revisions of this Config. # noqa: E501 + :rtype: str + """ + return self._min_days_revisions + + @min_days_revisions.setter + def min_days_revisions(self, min_days_revisions): + """Sets the min_days_revisions of this Config. + + + :param min_days_revisions: The min_days_revisions of this Config. # noqa: E501 + :type: str + """ + + self._min_days_revisions = min_days_revisions + + @property + def min_delta_revisions(self): + """Gets the min_delta_revisions of this Config. # noqa: E501 + + Minimum number of characters changed required to trigger a revision save. # noqa: E501 + + :return: The min_delta_revisions of this Config. # noqa: E501 + :rtype: str + """ + return self._min_delta_revisions + + @min_delta_revisions.setter + def min_delta_revisions(self, min_delta_revisions): + """Sets the min_delta_revisions of this Config. + + Minimum number of characters changed required to trigger a revision save. # noqa: E501 + + :param min_delta_revisions: The min_delta_revisions of this Config. # noqa: E501 + :type: str + """ + + self._min_delta_revisions = min_delta_revisions + + @property + def onboarding_email_active(self): + """Gets the onboarding_email_active of this Config. # noqa: E501 + + + :return: The onboarding_email_active of this Config. # noqa: E501 + :rtype: str + """ + return self._onboarding_email_active + + @onboarding_email_active.setter + def onboarding_email_active(self, onboarding_email_active): + """Sets the onboarding_email_active of this Config. + + + :param onboarding_email_active: The onboarding_email_active of this Config. # noqa: E501 + :type: str + """ + allowed_values = ["0", "1"] # noqa: E501 + if onboarding_email_active not in allowed_values: + raise ValueError( + "Invalid value for `onboarding_email_active` ({0}), must be one of {1}" # noqa: E501 + .format(onboarding_email_active, allowed_values) + ) + + self._onboarding_email_active = onboarding_email_active + + @property + def onboarding_email_admins_body(self): + """Gets the onboarding_email_admins_body of this Config. # noqa: E501 + + + :return: The onboarding_email_admins_body of this Config. # noqa: E501 + :rtype: str + """ + return self._onboarding_email_admins_body + + @onboarding_email_admins_body.setter + def onboarding_email_admins_body(self, onboarding_email_admins_body): + """Sets the onboarding_email_admins_body of this Config. + + + :param onboarding_email_admins_body: The onboarding_email_admins_body of this Config. # noqa: E501 + :type: str + """ + + self._onboarding_email_admins_body = onboarding_email_admins_body + + @property + def onboarding_email_admins_subject(self): + """Gets the onboarding_email_admins_subject of this Config. # noqa: E501 + + + :return: The onboarding_email_admins_subject of this Config. # noqa: E501 + :rtype: str + """ + return self._onboarding_email_admins_subject + + @onboarding_email_admins_subject.setter + def onboarding_email_admins_subject(self, onboarding_email_admins_subject): + """Sets the onboarding_email_admins_subject of this Config. + + + :param onboarding_email_admins_subject: The onboarding_email_admins_subject of this Config. # noqa: E501 + :type: str + """ + + self._onboarding_email_admins_subject = onboarding_email_admins_subject + + @property + def onboarding_email_body(self): + """Gets the onboarding_email_body of this Config. # noqa: E501 + + + :return: The onboarding_email_body of this Config. # noqa: E501 + :rtype: str + """ + return self._onboarding_email_body + + @onboarding_email_body.setter + def onboarding_email_body(self, onboarding_email_body): + """Sets the onboarding_email_body of this Config. + + + :param onboarding_email_body: The onboarding_email_body of this Config. # noqa: E501 + :type: str + """ + + self._onboarding_email_body = onboarding_email_body + + @property + def onboarding_email_different_for_admins(self): + """Gets the onboarding_email_different_for_admins of this Config. # noqa: E501 + + + :return: The onboarding_email_different_for_admins of this Config. # noqa: E501 + :rtype: str + """ + return self._onboarding_email_different_for_admins + + @onboarding_email_different_for_admins.setter + def onboarding_email_different_for_admins(self, onboarding_email_different_for_admins): + """Sets the onboarding_email_different_for_admins of this Config. + + + :param onboarding_email_different_for_admins: The onboarding_email_different_for_admins of this Config. # noqa: E501 + :type: str + """ + allowed_values = ["0", "1"] # noqa: E501 + if onboarding_email_different_for_admins not in allowed_values: + raise ValueError( + "Invalid value for `onboarding_email_different_for_admins` ({0}), must be one of {1}" # noqa: E501 + .format(onboarding_email_different_for_admins, allowed_values) + ) + + self._onboarding_email_different_for_admins = onboarding_email_different_for_admins + + @property + def onboarding_email_subject(self): + """Gets the onboarding_email_subject of this Config. # noqa: E501 + + + :return: The onboarding_email_subject of this Config. # noqa: E501 + :rtype: str + """ + return self._onboarding_email_subject + + @onboarding_email_subject.setter + def onboarding_email_subject(self, onboarding_email_subject): + """Sets the onboarding_email_subject of this Config. + + + :param onboarding_email_subject: The onboarding_email_subject of this Config. # noqa: E501 + :type: str + """ + + self._onboarding_email_subject = onboarding_email_subject + + @property + def privacy_policy(self): + """Gets the privacy_policy of this Config. # noqa: E501 + + + :return: The privacy_policy of this Config. # noqa: E501 + :rtype: str + """ + return self._privacy_policy + + @privacy_policy.setter + def privacy_policy(self, privacy_policy): + """Sets the privacy_policy of this Config. + + + :param privacy_policy: The privacy_policy of this Config. # noqa: E501 + :type: str + """ + + self._privacy_policy = privacy_policy + + @property + def proxy(self): + """Gets the proxy of this Config. # noqa: E501 + + + :return: The proxy of this Config. # noqa: E501 + :rtype: str + """ + return self._proxy + + @proxy.setter + def proxy(self, proxy): + """Sets the proxy of this Config. + + + :param proxy: The proxy of this Config. # noqa: E501 + :type: str + """ + + self._proxy = proxy + + @property + def remote_dir_config(self): + """Gets the remote_dir_config of this Config. # noqa: E501 + + + :return: The remote_dir_config of this Config. # noqa: E501 + :rtype: str + """ + return self._remote_dir_config + + @remote_dir_config.setter + def remote_dir_config(self, remote_dir_config): + """Sets the remote_dir_config of this Config. + + + :param remote_dir_config: The remote_dir_config of this Config. # noqa: E501 + :type: str + """ + + self._remote_dir_config = remote_dir_config + + @property + def remote_dir_service(self): + """Gets the remote_dir_service of this Config. # noqa: E501 + + + :return: The remote_dir_service of this Config. # noqa: E501 + :rtype: str + """ + return self._remote_dir_service + + @remote_dir_service.setter + def remote_dir_service(self, remote_dir_service): + """Sets the remote_dir_service of this Config. + + + :param remote_dir_service: The remote_dir_service of this Config. # noqa: E501 + :type: str + """ + + self._remote_dir_service = remote_dir_service + + @property + def s3_bucket_name(self): + """Gets the s3_bucket_name of this Config. # noqa: E501 + + + :return: The s3_bucket_name of this Config. # noqa: E501 + :rtype: str + """ + return self._s3_bucket_name + + @s3_bucket_name.setter + def s3_bucket_name(self, s3_bucket_name): + """Sets the s3_bucket_name of this Config. + + + :param s3_bucket_name: The s3_bucket_name of this Config. # noqa: E501 + :type: str + """ + + self._s3_bucket_name = s3_bucket_name + + @property + def s3_endpoint(self): + """Gets the s3_endpoint of this Config. # noqa: E501 + + + :return: The s3_endpoint of this Config. # noqa: E501 + :rtype: str + """ + return self._s3_endpoint + + @s3_endpoint.setter + def s3_endpoint(self, s3_endpoint): + """Sets the s3_endpoint of this Config. + + + :param s3_endpoint: The s3_endpoint of this Config. # noqa: E501 + :type: str + """ + + self._s3_endpoint = s3_endpoint + + @property + def s3_path_prefix(self): + """Gets the s3_path_prefix of this Config. # noqa: E501 + + + :return: The s3_path_prefix of this Config. # noqa: E501 + :rtype: str + """ + return self._s3_path_prefix + + @s3_path_prefix.setter + def s3_path_prefix(self, s3_path_prefix): + """Sets the s3_path_prefix of this Config. + + + :param s3_path_prefix: The s3_path_prefix of this Config. # noqa: E501 + :type: str + """ + + self._s3_path_prefix = s3_path_prefix + + @property + def s3_region(self): + """Gets the s3_region of this Config. # noqa: E501 + + + :return: The s3_region of this Config. # noqa: E501 + :rtype: str + """ + return self._s3_region + + @s3_region.setter + def s3_region(self, s3_region): + """Sets the s3_region of this Config. + + + :param s3_region: The s3_region of this Config. # noqa: E501 + :type: str + """ + + self._s3_region = s3_region + + @property + def s3_verify_cert(self): + """Gets the s3_verify_cert of this Config. # noqa: E501 + + + :return: The s3_verify_cert of this Config. # noqa: E501 + :rtype: str + """ + return self._s3_verify_cert + + @s3_verify_cert.setter + def s3_verify_cert(self, s3_verify_cert): + """Sets the s3_verify_cert of this Config. + + + :param s3_verify_cert: The s3_verify_cert of this Config. # noqa: E501 + :type: str + """ + + self._s3_verify_cert = s3_verify_cert + + @property + def saml_allowrepeatattributename(self): + """Gets the saml_allowrepeatattributename of this Config. # noqa: E501 + + + :return: The saml_allowrepeatattributename of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_allowrepeatattributename + + @saml_allowrepeatattributename.setter + def saml_allowrepeatattributename(self, saml_allowrepeatattributename): + """Sets the saml_allowrepeatattributename of this Config. + + + :param saml_allowrepeatattributename: The saml_allowrepeatattributename of this Config. # noqa: E501 + :type: str + """ + + self._saml_allowrepeatattributename = saml_allowrepeatattributename + + @property + def saml_authnrequestssigned(self): + """Gets the saml_authnrequestssigned of this Config. # noqa: E501 + + + :return: The saml_authnrequestssigned of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_authnrequestssigned + + @saml_authnrequestssigned.setter + def saml_authnrequestssigned(self, saml_authnrequestssigned): + """Sets the saml_authnrequestssigned of this Config. + + + :param saml_authnrequestssigned: The saml_authnrequestssigned of this Config. # noqa: E501 + :type: str + """ + + self._saml_authnrequestssigned = saml_authnrequestssigned + + @property + def saml_baseurl(self): + """Gets the saml_baseurl of this Config. # noqa: E501 + + + :return: The saml_baseurl of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_baseurl + + @saml_baseurl.setter + def saml_baseurl(self, saml_baseurl): + """Sets the saml_baseurl of this Config. + + + :param saml_baseurl: The saml_baseurl of this Config. # noqa: E501 + :type: str + """ + + self._saml_baseurl = saml_baseurl + + @property + def saml_debug(self): + """Gets the saml_debug of this Config. # noqa: E501 + + + :return: The saml_debug of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_debug + + @saml_debug.setter + def saml_debug(self, saml_debug): + """Sets the saml_debug of this Config. + + + :param saml_debug: The saml_debug of this Config. # noqa: E501 + :type: str + """ + + self._saml_debug = saml_debug + + @property + def saml_entityid(self): + """Gets the saml_entityid of this Config. # noqa: E501 + + + :return: The saml_entityid of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_entityid + + @saml_entityid.setter + def saml_entityid(self, saml_entityid): + """Sets the saml_entityid of this Config. + + + :param saml_entityid: The saml_entityid of this Config. # noqa: E501 + :type: str + """ + + self._saml_entityid = saml_entityid + + @property + def saml_logoutrequestsigned(self): + """Gets the saml_logoutrequestsigned of this Config. # noqa: E501 + + + :return: The saml_logoutrequestsigned of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_logoutrequestsigned + + @saml_logoutrequestsigned.setter + def saml_logoutrequestsigned(self, saml_logoutrequestsigned): + """Sets the saml_logoutrequestsigned of this Config. + + + :param saml_logoutrequestsigned: The saml_logoutrequestsigned of this Config. # noqa: E501 + :type: str + """ + + self._saml_logoutrequestsigned = saml_logoutrequestsigned + + @property + def saml_logoutresponsesigned(self): + """Gets the saml_logoutresponsesigned of this Config. # noqa: E501 + + + :return: The saml_logoutresponsesigned of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_logoutresponsesigned + + @saml_logoutresponsesigned.setter + def saml_logoutresponsesigned(self, saml_logoutresponsesigned): + """Sets the saml_logoutresponsesigned of this Config. + + + :param saml_logoutresponsesigned: The saml_logoutresponsesigned of this Config. # noqa: E501 + :type: str + """ + + self._saml_logoutresponsesigned = saml_logoutresponsesigned + + @property + def saml_lowercaseurlencoding(self): + """Gets the saml_lowercaseurlencoding of this Config. # noqa: E501 + + + :return: The saml_lowercaseurlencoding of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_lowercaseurlencoding + + @saml_lowercaseurlencoding.setter + def saml_lowercaseurlencoding(self, saml_lowercaseurlencoding): + """Sets the saml_lowercaseurlencoding of this Config. + + + :param saml_lowercaseurlencoding: The saml_lowercaseurlencoding of this Config. # noqa: E501 + :type: str + """ + + self._saml_lowercaseurlencoding = saml_lowercaseurlencoding + + @property + def saml_nameidencrypted(self): + """Gets the saml_nameidencrypted of this Config. # noqa: E501 + + + :return: The saml_nameidencrypted of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_nameidencrypted + + @saml_nameidencrypted.setter + def saml_nameidencrypted(self, saml_nameidencrypted): + """Sets the saml_nameidencrypted of this Config. + + + :param saml_nameidencrypted: The saml_nameidencrypted of this Config. # noqa: E501 + :type: str + """ + + self._saml_nameidencrypted = saml_nameidencrypted + + @property + def saml_nameidformat(self): + """Gets the saml_nameidformat of this Config. # noqa: E501 + + + :return: The saml_nameidformat of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_nameidformat + + @saml_nameidformat.setter + def saml_nameidformat(self, saml_nameidformat): + """Sets the saml_nameidformat of this Config. + + + :param saml_nameidformat: The saml_nameidformat of this Config. # noqa: E501 + :type: str + """ + + self._saml_nameidformat = saml_nameidformat + + @property + def saml_privatekey(self): + """Gets the saml_privatekey of this Config. # noqa: E501 + + + :return: The saml_privatekey of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_privatekey + + @saml_privatekey.setter + def saml_privatekey(self, saml_privatekey): + """Sets the saml_privatekey of this Config. + + + :param saml_privatekey: The saml_privatekey of this Config. # noqa: E501 + :type: str + """ + + self._saml_privatekey = saml_privatekey + + @property + def saml_relaxdestinationvalidation(self): + """Gets the saml_relaxdestinationvalidation of this Config. # noqa: E501 + + + :return: The saml_relaxdestinationvalidation of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_relaxdestinationvalidation + + @saml_relaxdestinationvalidation.setter + def saml_relaxdestinationvalidation(self, saml_relaxdestinationvalidation): + """Sets the saml_relaxdestinationvalidation of this Config. + + + :param saml_relaxdestinationvalidation: The saml_relaxdestinationvalidation of this Config. # noqa: E501 + :type: str + """ + + self._saml_relaxdestinationvalidation = saml_relaxdestinationvalidation + + @property + def saml_signmetadata(self): + """Gets the saml_signmetadata of this Config. # noqa: E501 + + + :return: The saml_signmetadata of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_signmetadata + + @saml_signmetadata.setter + def saml_signmetadata(self, saml_signmetadata): + """Sets the saml_signmetadata of this Config. + + + :param saml_signmetadata: The saml_signmetadata of this Config. # noqa: E501 + :type: str + """ + + self._saml_signmetadata = saml_signmetadata + + @property + def saml_strict(self): + """Gets the saml_strict of this Config. # noqa: E501 + + + :return: The saml_strict of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_strict + + @saml_strict.setter + def saml_strict(self, saml_strict): + """Sets the saml_strict of this Config. + + + :param saml_strict: The saml_strict of this Config. # noqa: E501 + :type: str + """ + + self._saml_strict = saml_strict + + @property + def saml_sync_teams(self): + """Gets the saml_sync_teams of this Config. # noqa: E501 + + + :return: The saml_sync_teams of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_sync_teams + + @saml_sync_teams.setter + def saml_sync_teams(self, saml_sync_teams): + """Sets the saml_sync_teams of this Config. + + + :param saml_sync_teams: The saml_sync_teams of this Config. # noqa: E501 + :type: str + """ + + self._saml_sync_teams = saml_sync_teams + + @property + def saml_team_create(self): + """Gets the saml_team_create of this Config. # noqa: E501 + + + :return: The saml_team_create of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_team_create + + @saml_team_create.setter + def saml_team_create(self, saml_team_create): + """Sets the saml_team_create of this Config. + + + :param saml_team_create: The saml_team_create of this Config. # noqa: E501 + :type: str + """ + + self._saml_team_create = saml_team_create + + @property + def saml_team_default(self): + """Gets the saml_team_default of this Config. # noqa: E501 + + + :return: The saml_team_default of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_team_default + + @saml_team_default.setter + def saml_team_default(self, saml_team_default): + """Sets the saml_team_default of this Config. + + + :param saml_team_default: The saml_team_default of this Config. # noqa: E501 + :type: str + """ + + self._saml_team_default = saml_team_default + + @property + def saml_toggle(self): + """Gets the saml_toggle of this Config. # noqa: E501 + + + :return: The saml_toggle of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_toggle + + @saml_toggle.setter + def saml_toggle(self, saml_toggle): + """Sets the saml_toggle of this Config. + + + :param saml_toggle: The saml_toggle of this Config. # noqa: E501 + :type: str + """ + + self._saml_toggle = saml_toggle + + @property + def saml_user_default(self): + """Gets the saml_user_default of this Config. # noqa: E501 + + + :return: The saml_user_default of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_user_default + + @saml_user_default.setter + def saml_user_default(self, saml_user_default): + """Sets the saml_user_default of this Config. + + + :param saml_user_default: The saml_user_default of this Config. # noqa: E501 + :type: str + """ + + self._saml_user_default = saml_user_default + + @property + def saml_wantassertionsencrypted(self): + """Gets the saml_wantassertionsencrypted of this Config. # noqa: E501 + + + :return: The saml_wantassertionsencrypted of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_wantassertionsencrypted + + @saml_wantassertionsencrypted.setter + def saml_wantassertionsencrypted(self, saml_wantassertionsencrypted): + """Sets the saml_wantassertionsencrypted of this Config. + + + :param saml_wantassertionsencrypted: The saml_wantassertionsencrypted of this Config. # noqa: E501 + :type: str + """ + + self._saml_wantassertionsencrypted = saml_wantassertionsencrypted + + @property + def saml_wantassertionssigned(self): + """Gets the saml_wantassertionssigned of this Config. # noqa: E501 + + + :return: The saml_wantassertionssigned of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_wantassertionssigned + + @saml_wantassertionssigned.setter + def saml_wantassertionssigned(self, saml_wantassertionssigned): + """Sets the saml_wantassertionssigned of this Config. + + + :param saml_wantassertionssigned: The saml_wantassertionssigned of this Config. # noqa: E501 + :type: str + """ + + self._saml_wantassertionssigned = saml_wantassertionssigned + + @property + def saml_wantmessagessigned(self): + """Gets the saml_wantmessagessigned of this Config. # noqa: E501 + + + :return: The saml_wantmessagessigned of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_wantmessagessigned + + @saml_wantmessagessigned.setter + def saml_wantmessagessigned(self, saml_wantmessagessigned): + """Sets the saml_wantmessagessigned of this Config. + + + :param saml_wantmessagessigned: The saml_wantmessagessigned of this Config. # noqa: E501 + :type: str + """ + + self._saml_wantmessagessigned = saml_wantmessagessigned + + @property + def saml_wantnameid(self): + """Gets the saml_wantnameid of this Config. # noqa: E501 + + + :return: The saml_wantnameid of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_wantnameid + + @saml_wantnameid.setter + def saml_wantnameid(self, saml_wantnameid): + """Sets the saml_wantnameid of this Config. + + + :param saml_wantnameid: The saml_wantnameid of this Config. # noqa: E501 + :type: str + """ + + self._saml_wantnameid = saml_wantnameid + + @property + def saml_wantnameidencrypted(self): + """Gets the saml_wantnameidencrypted of this Config. # noqa: E501 + + + :return: The saml_wantnameidencrypted of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_wantnameidencrypted + + @saml_wantnameidencrypted.setter + def saml_wantnameidencrypted(self, saml_wantnameidencrypted): + """Sets the saml_wantnameidencrypted of this Config. + + + :param saml_wantnameidencrypted: The saml_wantnameidencrypted of this Config. # noqa: E501 + :type: str + """ + + self._saml_wantnameidencrypted = saml_wantnameidencrypted + + @property + def saml_wantxmlvalidation(self): + """Gets the saml_wantxmlvalidation of this Config. # noqa: E501 + + + :return: The saml_wantxmlvalidation of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_wantxmlvalidation + + @saml_wantxmlvalidation.setter + def saml_wantxmlvalidation(self, saml_wantxmlvalidation): + """Sets the saml_wantxmlvalidation of this Config. + + + :param saml_wantxmlvalidation: The saml_wantxmlvalidation of this Config. # noqa: E501 + :type: str + """ + + self._saml_wantxmlvalidation = saml_wantxmlvalidation + + @property + def saml_x509(self): + """Gets the saml_x509 of this Config. # noqa: E501 + + + :return: The saml_x509 of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_x509 + + @saml_x509.setter + def saml_x509(self, saml_x509): + """Sets the saml_x509 of this Config. + + + :param saml_x509: The saml_x509 of this Config. # noqa: E501 + :type: str + """ + + self._saml_x509 = saml_x509 + + @property + def saml_x509_new(self): + """Gets the saml_x509_new of this Config. # noqa: E501 + + + :return: The saml_x509_new of this Config. # noqa: E501 + :rtype: str + """ + return self._saml_x509_new + + @saml_x509_new.setter + def saml_x509_new(self, saml_x509_new): + """Sets the saml_x509_new of this Config. + + + :param saml_x509_new: The saml_x509_new of this Config. # noqa: E501 + :type: str + """ + + self._saml_x509_new = saml_x509_new + + @property + def schema(self): + """Gets the schema of this Config. # noqa: E501 + + + :return: The schema of this Config. # noqa: E501 + :rtype: str + """ + return self._schema + + @schema.setter + def schema(self, schema): + """Sets the schema of this Config. + + + :param schema: The schema of this Config. # noqa: E501 + :type: str + """ + + self._schema = schema + + @property + def smtp_address(self): + """Gets the smtp_address of this Config. # noqa: E501 + + + :return: The smtp_address of this Config. # noqa: E501 + :rtype: str + """ + return self._smtp_address + + @smtp_address.setter + def smtp_address(self, smtp_address): + """Sets the smtp_address of this Config. + + + :param smtp_address: The smtp_address of this Config. # noqa: E501 + :type: str + """ + + self._smtp_address = smtp_address + + @property + def smtp_encryption(self): + """Gets the smtp_encryption of this Config. # noqa: E501 + + + :return: The smtp_encryption of this Config. # noqa: E501 + :rtype: str + """ + return self._smtp_encryption + + @smtp_encryption.setter + def smtp_encryption(self, smtp_encryption): + """Sets the smtp_encryption of this Config. + + + :param smtp_encryption: The smtp_encryption of this Config. # noqa: E501 + :type: str + """ + + self._smtp_encryption = smtp_encryption + + @property + def smtp_password(self): + """Gets the smtp_password of this Config. # noqa: E501 + + + :return: The smtp_password of this Config. # noqa: E501 + :rtype: str + """ + return self._smtp_password + + @smtp_password.setter + def smtp_password(self, smtp_password): + """Sets the smtp_password of this Config. + + + :param smtp_password: The smtp_password of this Config. # noqa: E501 + :type: str + """ + + self._smtp_password = smtp_password + + @property + def smtp_port(self): + """Gets the smtp_port of this Config. # noqa: E501 + + + :return: The smtp_port of this Config. # noqa: E501 + :rtype: str + """ + return self._smtp_port + + @smtp_port.setter + def smtp_port(self, smtp_port): + """Sets the smtp_port of this Config. + + + :param smtp_port: The smtp_port of this Config. # noqa: E501 + :type: str + """ + + self._smtp_port = smtp_port + + @property + def smtp_username(self): + """Gets the smtp_username of this Config. # noqa: E501 + + + :return: The smtp_username of this Config. # noqa: E501 + :rtype: str + """ + return self._smtp_username + + @smtp_username.setter + def smtp_username(self, smtp_username): + """Sets the smtp_username of this Config. + + + :param smtp_username: The smtp_username of this Config. # noqa: E501 + :type: str + """ + + self._smtp_username = smtp_username + + @property + def support_url(self): + """Gets the support_url of this Config. # noqa: E501 + + + :return: The support_url of this Config. # noqa: E501 + :rtype: str + """ + return self._support_url + + @support_url.setter + def support_url(self, support_url): + """Sets the support_url of this Config. + + + :param support_url: The support_url of this Config. # noqa: E501 + :type: str + """ + + self._support_url = support_url + + @property + def ts_authority(self): + """Gets the ts_authority of this Config. # noqa: E501 + + + :return: The ts_authority of this Config. # noqa: E501 + :rtype: str + """ + return self._ts_authority + + @ts_authority.setter + def ts_authority(self, ts_authority): + """Sets the ts_authority of this Config. + + + :param ts_authority: The ts_authority of this Config. # noqa: E501 + :type: str + """ + + self._ts_authority = ts_authority + + @property + def ts_cert(self): + """Gets the ts_cert of this Config. # noqa: E501 + + + :return: The ts_cert of this Config. # noqa: E501 + :rtype: str + """ + return self._ts_cert + + @ts_cert.setter + def ts_cert(self, ts_cert): + """Sets the ts_cert of this Config. + + + :param ts_cert: The ts_cert of this Config. # noqa: E501 + :type: str + """ + + self._ts_cert = ts_cert + + @property + def ts_hash(self): + """Gets the ts_hash of this Config. # noqa: E501 + + + :return: The ts_hash of this Config. # noqa: E501 + :rtype: str + """ + return self._ts_hash + + @ts_hash.setter + def ts_hash(self, ts_hash): + """Sets the ts_hash of this Config. + + + :param ts_hash: The ts_hash of this Config. # noqa: E501 + :type: str + """ + + self._ts_hash = ts_hash + + @property + def ts_limit(self): + """Gets the ts_limit of this Config. # noqa: E501 + + + :return: The ts_limit of this Config. # noqa: E501 + :rtype: str + """ + return self._ts_limit + + @ts_limit.setter + def ts_limit(self, ts_limit): + """Sets the ts_limit of this Config. + + + :param ts_limit: The ts_limit of this Config. # noqa: E501 + :type: str + """ + + self._ts_limit = ts_limit + + @property + def ts_login(self): + """Gets the ts_login of this Config. # noqa: E501 + + + :return: The ts_login of this Config. # noqa: E501 + :rtype: str + """ + return self._ts_login + + @ts_login.setter + def ts_login(self, ts_login): + """Sets the ts_login of this Config. + + + :param ts_login: The ts_login of this Config. # noqa: E501 + :type: str + """ + + self._ts_login = ts_login + + @property + def ts_password(self): + """Gets the ts_password of this Config. # noqa: E501 + + + :return: The ts_password of this Config. # noqa: E501 + :rtype: str + """ + return self._ts_password + + @ts_password.setter + def ts_password(self, ts_password): + """Sets the ts_password of this Config. + + + :param ts_password: The ts_password of this Config. # noqa: E501 + :type: str + """ + + self._ts_password = ts_password + + @property + def ts_url(self): + """Gets the ts_url of this Config. # noqa: E501 + + + :return: The ts_url of this Config. # noqa: E501 + :rtype: str + """ + return self._ts_url + + @ts_url.setter + def ts_url(self, ts_url): + """Sets the ts_url of this Config. + + + :param ts_url: The ts_url of this Config. # noqa: E501 + :type: str + """ + + self._ts_url = ts_url + + @property + def uploads_storage(self): + """Gets the uploads_storage of this Config. # noqa: E501 + + + :return: The uploads_storage of this Config. # noqa: E501 + :rtype: str + """ + return self._uploads_storage + + @uploads_storage.setter + def uploads_storage(self, uploads_storage): + """Sets the uploads_storage of this Config. + + + :param uploads_storage: The uploads_storage of this Config. # noqa: E501 + :type: str + """ + + self._uploads_storage = uploads_storage + + @property + def users_validity_is_externally_managed(self): + """Gets the users_validity_is_externally_managed of this Config. # noqa: E501 + + + :return: The users_validity_is_externally_managed of this Config. # noqa: E501 + :rtype: str + """ + return self._users_validity_is_externally_managed + + @users_validity_is_externally_managed.setter + def users_validity_is_externally_managed(self, users_validity_is_externally_managed): + """Sets the users_validity_is_externally_managed of this Config. + + + :param users_validity_is_externally_managed: The users_validity_is_externally_managed of this Config. # noqa: E501 + :type: str + """ + + self._users_validity_is_externally_managed = users_validity_is_externally_managed + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Config, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Config): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/container.py b/vendor/elabapi-python/elabapi_python/models/container.py new file mode 100644 index 0000000..1e43d97 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/container.py @@ -0,0 +1,342 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Container(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'qty_stored': 'str', + 'qty_unit': 'str', + 'storage_id': 'int', + 'item_id': 'int', + 'created_at': 'str', + 'modified_at': 'str', + 'storage_name': 'str', + 'full_path': 'str' + } + + attribute_map = { + 'id': 'id', + 'qty_stored': 'qty_stored', + 'qty_unit': 'qty_unit', + 'storage_id': 'storage_id', + 'item_id': 'item_id', + 'created_at': 'created_at', + 'modified_at': 'modified_at', + 'storage_name': 'storage_name', + 'full_path': 'full_path' + } + + def __init__(self, id=None, qty_stored=None, qty_unit=None, storage_id=None, item_id=None, created_at=None, modified_at=None, storage_name=None, full_path=None): # noqa: E501 + """Container - a model defined in Swagger""" # noqa: E501 + self._id = None + self._qty_stored = None + self._qty_unit = None + self._storage_id = None + self._item_id = None + self._created_at = None + self._modified_at = None + self._storage_name = None + self._full_path = None + self.discriminator = None + if id is not None: + self.id = id + if qty_stored is not None: + self.qty_stored = qty_stored + if qty_unit is not None: + self.qty_unit = qty_unit + if storage_id is not None: + self.storage_id = storage_id + if item_id is not None: + self.item_id = item_id + if created_at is not None: + self.created_at = created_at + if modified_at is not None: + self.modified_at = modified_at + if storage_name is not None: + self.storage_name = storage_name + if full_path is not None: + self.full_path = full_path + + @property + def id(self): + """Gets the id of this Container. # noqa: E501 + + The container link ID # noqa: E501 + + :return: The id of this Container. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Container. + + The container link ID # noqa: E501 + + :param id: The id of this Container. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def qty_stored(self): + """Gets the qty_stored of this Container. # noqa: E501 + + Quantity stored in this container # noqa: E501 + + :return: The qty_stored of this Container. # noqa: E501 + :rtype: str + """ + return self._qty_stored + + @qty_stored.setter + def qty_stored(self, qty_stored): + """Sets the qty_stored of this Container. + + Quantity stored in this container # noqa: E501 + + :param qty_stored: The qty_stored of this Container. # noqa: E501 + :type: str + """ + + self._qty_stored = qty_stored + + @property + def qty_unit(self): + """Gets the qty_unit of this Container. # noqa: E501 + + Unit of the quantity stored # noqa: E501 + + :return: The qty_unit of this Container. # noqa: E501 + :rtype: str + """ + return self._qty_unit + + @qty_unit.setter + def qty_unit(self, qty_unit): + """Sets the qty_unit of this Container. + + Unit of the quantity stored # noqa: E501 + + :param qty_unit: The qty_unit of this Container. # noqa: E501 + :type: str + """ + allowed_values = ["bar", "•", "m", "μL", "mL", "L", "μg", "mg", "g", "kg"] # noqa: E501 + if qty_unit not in allowed_values: + raise ValueError( + "Invalid value for `qty_unit` ({0}), must be one of {1}" # noqa: E501 + .format(qty_unit, allowed_values) + ) + + self._qty_unit = qty_unit + + @property + def storage_id(self): + """Gets the storage_id of this Container. # noqa: E501 + + ID of the storage unit # noqa: E501 + + :return: The storage_id of this Container. # noqa: E501 + :rtype: int + """ + return self._storage_id + + @storage_id.setter + def storage_id(self, storage_id): + """Sets the storage_id of this Container. + + ID of the storage unit # noqa: E501 + + :param storage_id: The storage_id of this Container. # noqa: E501 + :type: int + """ + + self._storage_id = storage_id + + @property + def item_id(self): + """Gets the item_id of this Container. # noqa: E501 + + ID of the entity (experiment or resource) # noqa: E501 + + :return: The item_id of this Container. # noqa: E501 + :rtype: int + """ + return self._item_id + + @item_id.setter + def item_id(self, item_id): + """Sets the item_id of this Container. + + ID of the entity (experiment or resource) # noqa: E501 + + :param item_id: The item_id of this Container. # noqa: E501 + :type: int + """ + + self._item_id = item_id + + @property + def created_at(self): + """Gets the created_at of this Container. # noqa: E501 + + When the container entry was created # noqa: E501 + + :return: The created_at of this Container. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this Container. + + When the container entry was created # noqa: E501 + + :param created_at: The created_at of this Container. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def modified_at(self): + """Gets the modified_at of this Container. # noqa: E501 + + When the container entry was last modified # noqa: E501 + + :return: The modified_at of this Container. # noqa: E501 + :rtype: str + """ + return self._modified_at + + @modified_at.setter + def modified_at(self, modified_at): + """Sets the modified_at of this Container. + + When the container entry was last modified # noqa: E501 + + :param modified_at: The modified_at of this Container. # noqa: E501 + :type: str + """ + + self._modified_at = modified_at + + @property + def storage_name(self): + """Gets the storage_name of this Container. # noqa: E501 + + Name of the storage unit # noqa: E501 + + :return: The storage_name of this Container. # noqa: E501 + :rtype: str + """ + return self._storage_name + + @storage_name.setter + def storage_name(self, storage_name): + """Sets the storage_name of this Container. + + Name of the storage unit # noqa: E501 + + :param storage_name: The storage_name of this Container. # noqa: E501 + :type: str + """ + + self._storage_name = storage_name + + @property + def full_path(self): + """Gets the full_path of this Container. # noqa: E501 + + Full hierarchical path of the storage unit # noqa: E501 + + :return: The full_path of this Container. # noqa: E501 + :rtype: str + """ + return self._full_path + + @full_path.setter + def full_path(self, full_path): + """Sets the full_path of this Container. + + Full hierarchical path of the storage unit # noqa: E501 + + :param full_path: The full_path of this Container. # noqa: E501 + :type: str + """ + + self._full_path = full_path + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Container, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Container): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/containers_subid_body.py b/vendor/elabapi-python/elabapi_python/models/containers_subid_body.py new file mode 100644 index 0000000..c64d67b --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/containers_subid_body.py @@ -0,0 +1,147 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ContainersSubidBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'qty_stored': 'float', + 'qty_unit': 'str' + } + + attribute_map = { + 'qty_stored': 'qty_stored', + 'qty_unit': 'qty_unit' + } + + def __init__(self, qty_stored=None, qty_unit=None): # noqa: E501 + """ContainersSubidBody - a model defined in Swagger""" # noqa: E501 + self._qty_stored = None + self._qty_unit = None + self.discriminator = None + self.qty_stored = qty_stored + if qty_unit is not None: + self.qty_unit = qty_unit + + @property + def qty_stored(self): + """Gets the qty_stored of this ContainersSubidBody. # noqa: E501 + + Quantity stored. # noqa: E501 + + :return: The qty_stored of this ContainersSubidBody. # noqa: E501 + :rtype: float + """ + return self._qty_stored + + @qty_stored.setter + def qty_stored(self, qty_stored): + """Sets the qty_stored of this ContainersSubidBody. + + Quantity stored. # noqa: E501 + + :param qty_stored: The qty_stored of this ContainersSubidBody. # noqa: E501 + :type: float + """ + if qty_stored is None: + raise ValueError("Invalid value for `qty_stored`, must not be `None`") # noqa: E501 + + self._qty_stored = qty_stored + + @property + def qty_unit(self): + """Gets the qty_unit of this ContainersSubidBody. # noqa: E501 + + Unit of the quantity. Defaults to \"unit\" if not provided. # noqa: E501 + + :return: The qty_unit of this ContainersSubidBody. # noqa: E501 + :rtype: str + """ + return self._qty_unit + + @qty_unit.setter + def qty_unit(self, qty_unit): + """Sets the qty_unit of this ContainersSubidBody. + + Unit of the quantity. Defaults to \"unit\" if not provided. # noqa: E501 + + :param qty_unit: The qty_unit of this ContainersSubidBody. # noqa: E501 + :type: str + """ + allowed_values = ["bar", "•", "m", "μL", "mL", "L", "μg", "mg", "g", "kg"] # noqa: E501 + if qty_unit not in allowed_values: + raise ValueError( + "Invalid value for `qty_unit` ({0}), must be one of {1}" # noqa: E501 + .format(qty_unit, allowed_values) + ) + + self._qty_unit = qty_unit + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ContainersSubidBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ContainersSubidBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/containers_subid_body1.py b/vendor/elabapi-python/elabapi_python/models/containers_subid_body1.py new file mode 100644 index 0000000..887bfd8 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/containers_subid_body1.py @@ -0,0 +1,168 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ContainersSubidBody1(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'qty_stored': 'float', + 'qty_unit': 'str', + 'storage_id': 'int' + } + + attribute_map = { + 'qty_stored': 'qty_stored', + 'qty_unit': 'qty_unit', + 'storage_id': 'storage_id' + } + + def __init__(self, qty_stored=None, qty_unit=None, storage_id=None): # noqa: E501 + """ContainersSubidBody1 - a model defined in Swagger""" # noqa: E501 + self._qty_stored = None + self._qty_unit = None + self._storage_id = None + self.discriminator = None + if qty_stored is not None: + self.qty_stored = qty_stored + if qty_unit is not None: + self.qty_unit = qty_unit + if storage_id is not None: + self.storage_id = storage_id + + @property + def qty_stored(self): + """Gets the qty_stored of this ContainersSubidBody1. # noqa: E501 + + New quantity stored. # noqa: E501 + + :return: The qty_stored of this ContainersSubidBody1. # noqa: E501 + :rtype: float + """ + return self._qty_stored + + @qty_stored.setter + def qty_stored(self, qty_stored): + """Sets the qty_stored of this ContainersSubidBody1. + + New quantity stored. # noqa: E501 + + :param qty_stored: The qty_stored of this ContainersSubidBody1. # noqa: E501 + :type: float + """ + + self._qty_stored = qty_stored + + @property + def qty_unit(self): + """Gets the qty_unit of this ContainersSubidBody1. # noqa: E501 + + New unit of the quantity. # noqa: E501 + + :return: The qty_unit of this ContainersSubidBody1. # noqa: E501 + :rtype: str + """ + return self._qty_unit + + @qty_unit.setter + def qty_unit(self, qty_unit): + """Sets the qty_unit of this ContainersSubidBody1. + + New unit of the quantity. # noqa: E501 + + :param qty_unit: The qty_unit of this ContainersSubidBody1. # noqa: E501 + :type: str + """ + + self._qty_unit = qty_unit + + @property + def storage_id(self): + """Gets the storage_id of this ContainersSubidBody1. # noqa: E501 + + New storage unit id. Moves the container to that storage unit. Requires write access on the parent entity and (when `inventory_require_edit_rights=1`) the `can_manage_inventory_locations` permission. # noqa: E501 + + :return: The storage_id of this ContainersSubidBody1. # noqa: E501 + :rtype: int + """ + return self._storage_id + + @storage_id.setter + def storage_id(self, storage_id): + """Sets the storage_id of this ContainersSubidBody1. + + New storage unit id. Moves the container to that storage unit. Requires write access on the parent entity and (when `inventory_require_edit_rights=1`) the `can_manage_inventory_locations` permission. # noqa: E501 + + :param storage_id: The storage_id of this ContainersSubidBody1. # noqa: E501 + :type: int + """ + + self._storage_id = storage_id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ContainersSubidBody1, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ContainersSubidBody1): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/dspace_body.py b/vendor/elabapi-python/elabapi_python/models/dspace_body.py new file mode 100644 index 0000000..e6bc00e --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/dspace_body.py @@ -0,0 +1,142 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DspaceBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'collection': 'str', + 'metadata': 'list[DspaceMetadata]' + } + + attribute_map = { + 'collection': 'collection', + 'metadata': 'metadata' + } + + def __init__(self, collection=None, metadata=None): # noqa: E501 + """DspaceBody - a model defined in Swagger""" # noqa: E501 + self._collection = None + self._metadata = None + self.discriminator = None + self.collection = collection + self.metadata = metadata + + @property + def collection(self): + """Gets the collection of this DspaceBody. # noqa: E501 + + UUID of the DSpace collection to submit to. # noqa: E501 + + :return: The collection of this DspaceBody. # noqa: E501 + :rtype: str + """ + return self._collection + + @collection.setter + def collection(self, collection): + """Sets the collection of this DspaceBody. + + UUID of the DSpace collection to submit to. # noqa: E501 + + :param collection: The collection of this DspaceBody. # noqa: E501 + :type: str + """ + if collection is None: + raise ValueError("Invalid value for `collection`, must not be `None`") # noqa: E501 + + self._collection = collection + + @property + def metadata(self): + """Gets the metadata of this DspaceBody. # noqa: E501 + + Metadata fields to populate the submission. # noqa: E501 + + :return: The metadata of this DspaceBody. # noqa: E501 + :rtype: list[DspaceMetadata] + """ + return self._metadata + + @metadata.setter + def metadata(self, metadata): + """Sets the metadata of this DspaceBody. + + Metadata fields to populate the submission. # noqa: E501 + + :param metadata: The metadata of this DspaceBody. # noqa: E501 + :type: list[DspaceMetadata] + """ + if metadata is None: + raise ValueError("Invalid value for `metadata`, must not be `None`") # noqa: E501 + + self._metadata = metadata + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DspaceBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DspaceBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/dspace_body1.py b/vendor/elabapi-python/elabapi_python/models/dspace_body1.py new file mode 100644 index 0000000..071dcde --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/dspace_body1.py @@ -0,0 +1,169 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DspaceBody1(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'collection': 'str', + 'metadata': 'list[DspaceMetadata1]', + 'entity': 'DspaceEntity' + } + + attribute_map = { + 'collection': 'collection', + 'metadata': 'metadata', + 'entity': 'entity' + } + + def __init__(self, collection=None, metadata=None, entity=None): # noqa: E501 + """DspaceBody1 - a model defined in Swagger""" # noqa: E501 + self._collection = None + self._metadata = None + self._entity = None + self.discriminator = None + self.collection = collection + self.metadata = metadata + self.entity = entity + + @property + def collection(self): + """Gets the collection of this DspaceBody1. # noqa: E501 + + UUID of the collection. # noqa: E501 + + :return: The collection of this DspaceBody1. # noqa: E501 + :rtype: str + """ + return self._collection + + @collection.setter + def collection(self, collection): + """Sets the collection of this DspaceBody1. + + UUID of the collection. # noqa: E501 + + :param collection: The collection of this DspaceBody1. # noqa: E501 + :type: str + """ + if collection is None: + raise ValueError("Invalid value for `collection`, must not be `None`") # noqa: E501 + + self._collection = collection + + @property + def metadata(self): + """Gets the metadata of this DspaceBody1. # noqa: E501 + + DSpace metadata entries. At minimum, dc.title is required by most DSpace configurations. # noqa: E501 + + :return: The metadata of this DspaceBody1. # noqa: E501 + :rtype: list[DspaceMetadata1] + """ + return self._metadata + + @metadata.setter + def metadata(self, metadata): + """Sets the metadata of this DspaceBody1. + + DSpace metadata entries. At minimum, dc.title is required by most DSpace configurations. # noqa: E501 + + :param metadata: The metadata of this DspaceBody1. # noqa: E501 + :type: list[DspaceMetadata1] + """ + if metadata is None: + raise ValueError("Invalid value for `metadata`, must not be `None`") # noqa: E501 + + self._metadata = metadata + + @property + def entity(self): + """Gets the entity of this DspaceBody1. # noqa: E501 + + + :return: The entity of this DspaceBody1. # noqa: E501 + :rtype: DspaceEntity + """ + return self._entity + + @entity.setter + def entity(self, entity): + """Sets the entity of this DspaceBody1. + + + :param entity: The entity of this DspaceBody1. # noqa: E501 + :type: DspaceEntity + """ + if entity is None: + raise ValueError("Invalid value for `entity`, must not be `None`") # noqa: E501 + + self._entity = entity + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DspaceBody1, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DspaceBody1): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/dspace_entity.py b/vendor/elabapi-python/elabapi_python/models/dspace_entity.py new file mode 100644 index 0000000..ffa429f --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/dspace_entity.py @@ -0,0 +1,142 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DspaceEntity(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'type': 'str', + 'id': 'int' + } + + attribute_map = { + 'type': 'type', + 'id': 'id' + } + + def __init__(self, type=None, id=None): # noqa: E501 + """DspaceEntity - a model defined in Swagger""" # noqa: E501 + self._type = None + self._id = None + self.discriminator = None + self.type = type + self.id = id + + @property + def type(self): + """Gets the type of this DspaceEntity. # noqa: E501 + + eLabFTW entity type. # noqa: E501 + + :return: The type of this DspaceEntity. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this DspaceEntity. + + eLabFTW entity type. # noqa: E501 + + :param type: The type of this DspaceEntity. # noqa: E501 + :type: str + """ + if type is None: + raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 + + self._type = type + + @property + def id(self): + """Gets the id of this DspaceEntity. # noqa: E501 + + ID of the entity to export. # noqa: E501 + + :return: The id of this DspaceEntity. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this DspaceEntity. + + ID of the entity to export. # noqa: E501 + + :param id: The id of this DspaceEntity. # noqa: E501 + :type: int + """ + if id is None: + raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DspaceEntity, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DspaceEntity): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/dspace_metadata.py b/vendor/elabapi-python/elabapi_python/models/dspace_metadata.py new file mode 100644 index 0000000..3d626e9 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/dspace_metadata.py @@ -0,0 +1,138 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DspaceMetadata(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'key': 'str', + 'value': 'str' + } + + attribute_map = { + 'key': 'key', + 'value': 'value' + } + + def __init__(self, key=None, value=None): # noqa: E501 + """DspaceMetadata - a model defined in Swagger""" # noqa: E501 + self._key = None + self._value = None + self.discriminator = None + self.key = key + self.value = value + + @property + def key(self): + """Gets the key of this DspaceMetadata. # noqa: E501 + + + :return: The key of this DspaceMetadata. # noqa: E501 + :rtype: str + """ + return self._key + + @key.setter + def key(self, key): + """Sets the key of this DspaceMetadata. + + + :param key: The key of this DspaceMetadata. # noqa: E501 + :type: str + """ + if key is None: + raise ValueError("Invalid value for `key`, must not be `None`") # noqa: E501 + + self._key = key + + @property + def value(self): + """Gets the value of this DspaceMetadata. # noqa: E501 + + + :return: The value of this DspaceMetadata. # noqa: E501 + :rtype: str + """ + return self._value + + @value.setter + def value(self, value): + """Sets the value of this DspaceMetadata. + + + :param value: The value of this DspaceMetadata. # noqa: E501 + :type: str + """ + if value is None: + raise ValueError("Invalid value for `value`, must not be `None`") # noqa: E501 + + self._value = value + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DspaceMetadata, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DspaceMetadata): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/dspace_metadata1.py b/vendor/elabapi-python/elabapi_python/models/dspace_metadata1.py new file mode 100644 index 0000000..37c59fb --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/dspace_metadata1.py @@ -0,0 +1,138 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DspaceMetadata1(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'key': 'str', + 'value': 'str' + } + + attribute_map = { + 'key': 'key', + 'value': 'value' + } + + def __init__(self, key=None, value=None): # noqa: E501 + """DspaceMetadata1 - a model defined in Swagger""" # noqa: E501 + self._key = None + self._value = None + self.discriminator = None + self.key = key + self.value = value + + @property + def key(self): + """Gets the key of this DspaceMetadata1. # noqa: E501 + + + :return: The key of this DspaceMetadata1. # noqa: E501 + :rtype: str + """ + return self._key + + @key.setter + def key(self, key): + """Sets the key of this DspaceMetadata1. + + + :param key: The key of this DspaceMetadata1. # noqa: E501 + :type: str + """ + if key is None: + raise ValueError("Invalid value for `key`, must not be `None`") # noqa: E501 + + self._key = key + + @property + def value(self): + """Gets the value of this DspaceMetadata1. # noqa: E501 + + + :return: The value of this DspaceMetadata1. # noqa: E501 + :rtype: str + """ + return self._value + + @value.setter + def value(self, value): + """Sets the value of this DspaceMetadata1. + + + :param value: The value of this DspaceMetadata1. # noqa: E501 + :type: str + """ + if value is None: + raise ValueError("Invalid value for `value`, must not be `None`") # noqa: E501 + + self._value = value + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DspaceMetadata1, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DspaceMetadata1): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/entity.py b/vendor/elabapi-python/elabapi_python/models/entity.py new file mode 100644 index 0000000..e1b9669 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/entity.py @@ -0,0 +1,1222 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from elabapi_python.models.entity_editable import EntityEditable # noqa: F401,E501 + +class Entity(EntityEditable): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'access_key': 'str', + 'body_html': 'str', + 'category_color': 'str', + 'category_title': 'str', + 'changelog': 'list[Changelog]', + 'comments': 'list[Comment]', + 'compounds_links': 'list[Compound]', + 'created_at': 'str', + 'created_from_id': 'int', + 'created_from_type': 'int', + 'created_from_type_human': 'str', + 'elabid': 'str', + 'exclusive_edit_mode': 'ExclusiveEditMode', + 'experiments_links': 'list[Link]', + 'firstname': 'str', + 'fullname': 'str', + 'hide_main_text': 'int', + 'id': 'int', + 'items_links': 'list[Link]', + 'lastchangeby': 'int', + 'lastname': 'str', + 'locked': 'int', + 'lockedby': 'int', + 'locked_at': 'str', + 'modified_at': 'str', + 'next_step': 'str', + 'orcid': 'str', + 'page': 'str', + 'recent_comment': 'str', + 'related_experiments_links': 'list[Link]', + 'related_items_links': 'list[Link]', + 'sharelink': 'str', + 'status_color': 'str', + 'status_title': 'str', + 'steps': 'list[Step]', + 'tags': 'str', + 'tags_id': 'str', + 'team': 'int', + 'timestamped': 'int', + 'timestampedby': 'int', + 'timestamped_at': 'str', + 'type': 'str', + 'uploads': 'list[Upload]' + } + if hasattr(EntityEditable, "swagger_types"): + swagger_types.update(EntityEditable.swagger_types) + + attribute_map = { + 'access_key': 'access_key', + 'body_html': 'body_html', + 'category_color': 'category_color', + 'category_title': 'category_title', + 'changelog': 'changelog', + 'comments': 'comments', + 'compounds_links': 'compounds_links', + 'created_at': 'created_at', + 'created_from_id': 'created_from_id', + 'created_from_type': 'created_from_type', + 'created_from_type_human': 'created_from_type_human', + 'elabid': 'elabid', + 'exclusive_edit_mode': 'exclusive_edit_mode', + 'experiments_links': 'experiments_links', + 'firstname': 'firstname', + 'fullname': 'fullname', + 'hide_main_text': 'hide_main_text', + 'id': 'id', + 'items_links': 'items_links', + 'lastchangeby': 'lastchangeby', + 'lastname': 'lastname', + 'locked': 'locked', + 'lockedby': 'lockedby', + 'locked_at': 'locked_at', + 'modified_at': 'modified_at', + 'next_step': 'next_step', + 'orcid': 'orcid', + 'page': 'page', + 'recent_comment': 'recent_comment', + 'related_experiments_links': 'related_experiments_links', + 'related_items_links': 'related_items_links', + 'sharelink': 'sharelink', + 'status_color': 'status_color', + 'status_title': 'status_title', + 'steps': 'steps', + 'tags': 'tags', + 'tags_id': 'tags_id', + 'team': 'team', + 'timestamped': 'timestamped', + 'timestampedby': 'timestampedby', + 'timestamped_at': 'timestamped_at', + 'type': 'type', + 'uploads': 'uploads' + } + if hasattr(EntityEditable, "attribute_map"): + attribute_map.update(EntityEditable.attribute_map) + + def __init__(self, access_key=None, body_html=None, category_color=None, category_title=None, changelog=None, comments=None, compounds_links=None, created_at=None, created_from_id=None, created_from_type=None, created_from_type_human=None, elabid=None, exclusive_edit_mode=None, experiments_links=None, firstname=None, fullname=None, hide_main_text=None, id=None, items_links=None, lastchangeby=None, lastname=None, locked=None, lockedby=None, locked_at=None, modified_at=None, next_step=None, orcid=None, page=None, recent_comment=None, related_experiments_links=None, related_items_links=None, sharelink=None, status_color=None, status_title=None, steps=None, tags=None, tags_id=None, team=None, timestamped=None, timestampedby=None, timestamped_at=None, type=None, uploads=None, *args, **kwargs): # noqa: E501 + """Entity - a model defined in Swagger""" # noqa: E501 + self._access_key = None + self._body_html = None + self._category_color = None + self._category_title = None + self._changelog = None + self._comments = None + self._compounds_links = None + self._created_at = None + self._created_from_id = None + self._created_from_type = None + self._created_from_type_human = None + self._elabid = None + self._exclusive_edit_mode = None + self._experiments_links = None + self._firstname = None + self._fullname = None + self._hide_main_text = None + self._id = None + self._items_links = None + self._lastchangeby = None + self._lastname = None + self._locked = None + self._lockedby = None + self._locked_at = None + self._modified_at = None + self._next_step = None + self._orcid = None + self._page = None + self._recent_comment = None + self._related_experiments_links = None + self._related_items_links = None + self._sharelink = None + self._status_color = None + self._status_title = None + self._steps = None + self._tags = None + self._tags_id = None + self._team = None + self._timestamped = None + self._timestampedby = None + self._timestamped_at = None + self._type = None + self._uploads = None + self.discriminator = None + if access_key is not None: + self.access_key = access_key + if body_html is not None: + self.body_html = body_html + if category_color is not None: + self.category_color = category_color + if category_title is not None: + self.category_title = category_title + if changelog is not None: + self.changelog = changelog + if comments is not None: + self.comments = comments + if compounds_links is not None: + self.compounds_links = compounds_links + if created_at is not None: + self.created_at = created_at + if created_from_id is not None: + self.created_from_id = created_from_id + if created_from_type is not None: + self.created_from_type = created_from_type + if created_from_type_human is not None: + self.created_from_type_human = created_from_type_human + if elabid is not None: + self.elabid = elabid + if exclusive_edit_mode is not None: + self.exclusive_edit_mode = exclusive_edit_mode + if experiments_links is not None: + self.experiments_links = experiments_links + if firstname is not None: + self.firstname = firstname + if fullname is not None: + self.fullname = fullname + if hide_main_text is not None: + self.hide_main_text = hide_main_text + if id is not None: + self.id = id + if items_links is not None: + self.items_links = items_links + if lastchangeby is not None: + self.lastchangeby = lastchangeby + if lastname is not None: + self.lastname = lastname + if locked is not None: + self.locked = locked + if lockedby is not None: + self.lockedby = lockedby + if locked_at is not None: + self.locked_at = locked_at + if modified_at is not None: + self.modified_at = modified_at + if next_step is not None: + self.next_step = next_step + if orcid is not None: + self.orcid = orcid + if page is not None: + self.page = page + if recent_comment is not None: + self.recent_comment = recent_comment + if related_experiments_links is not None: + self.related_experiments_links = related_experiments_links + if related_items_links is not None: + self.related_items_links = related_items_links + if sharelink is not None: + self.sharelink = sharelink + if status_color is not None: + self.status_color = status_color + if status_title is not None: + self.status_title = status_title + if steps is not None: + self.steps = steps + if tags is not None: + self.tags = tags + if tags_id is not None: + self.tags_id = tags_id + if team is not None: + self.team = team + if timestamped is not None: + self.timestamped = timestamped + if timestampedby is not None: + self.timestampedby = timestampedby + if timestamped_at is not None: + self.timestamped_at = timestamped_at + if type is not None: + self.type = type + if uploads is not None: + self.uploads = uploads + EntityEditable.__init__(self, *args, **kwargs) + + @property + def access_key(self): + """Gets the access_key of this Entity. # noqa: E501 + + + :return: The access_key of this Entity. # noqa: E501 + :rtype: str + """ + return self._access_key + + @access_key.setter + def access_key(self, access_key): + """Sets the access_key of this Entity. + + + :param access_key: The access_key of this Entity. # noqa: E501 + :type: str + """ + + self._access_key = access_key + + @property + def body_html(self): + """Gets the body_html of this Entity. # noqa: E501 + + + :return: The body_html of this Entity. # noqa: E501 + :rtype: str + """ + return self._body_html + + @body_html.setter + def body_html(self, body_html): + """Sets the body_html of this Entity. + + + :param body_html: The body_html of this Entity. # noqa: E501 + :type: str + """ + + self._body_html = body_html + + @property + def category_color(self): + """Gets the category_color of this Entity. # noqa: E501 + + + :return: The category_color of this Entity. # noqa: E501 + :rtype: str + """ + return self._category_color + + @category_color.setter + def category_color(self, category_color): + """Sets the category_color of this Entity. + + + :param category_color: The category_color of this Entity. # noqa: E501 + :type: str + """ + + self._category_color = category_color + + @property + def category_title(self): + """Gets the category_title of this Entity. # noqa: E501 + + + :return: The category_title of this Entity. # noqa: E501 + :rtype: str + """ + return self._category_title + + @category_title.setter + def category_title(self, category_title): + """Sets the category_title of this Entity. + + + :param category_title: The category_title of this Entity. # noqa: E501 + :type: str + """ + + self._category_title = category_title + + @property + def changelog(self): + """Gets the changelog of this Entity. # noqa: E501 + + + :return: The changelog of this Entity. # noqa: E501 + :rtype: list[Changelog] + """ + return self._changelog + + @changelog.setter + def changelog(self, changelog): + """Sets the changelog of this Entity. + + + :param changelog: The changelog of this Entity. # noqa: E501 + :type: list[Changelog] + """ + + self._changelog = changelog + + @property + def comments(self): + """Gets the comments of this Entity. # noqa: E501 + + + :return: The comments of this Entity. # noqa: E501 + :rtype: list[Comment] + """ + return self._comments + + @comments.setter + def comments(self, comments): + """Sets the comments of this Entity. + + + :param comments: The comments of this Entity. # noqa: E501 + :type: list[Comment] + """ + + self._comments = comments + + @property + def compounds_links(self): + """Gets the compounds_links of this Entity. # noqa: E501 + + + :return: The compounds_links of this Entity. # noqa: E501 + :rtype: list[Compound] + """ + return self._compounds_links + + @compounds_links.setter + def compounds_links(self, compounds_links): + """Sets the compounds_links of this Entity. + + + :param compounds_links: The compounds_links of this Entity. # noqa: E501 + :type: list[Compound] + """ + + self._compounds_links = compounds_links + + @property + def created_at(self): + """Gets the created_at of this Entity. # noqa: E501 + + + :return: The created_at of this Entity. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this Entity. + + + :param created_at: The created_at of this Entity. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def created_from_id(self): + """Gets the created_from_id of this Entity. # noqa: E501 + + Id of the template used to create this entry. # noqa: E501 + + :return: The created_from_id of this Entity. # noqa: E501 + :rtype: int + """ + return self._created_from_id + + @created_from_id.setter + def created_from_id(self, created_from_id): + """Sets the created_from_id of this Entity. + + Id of the template used to create this entry. # noqa: E501 + + :param created_from_id: The created_from_id of this Entity. # noqa: E501 + :type: int + """ + + self._created_from_id = created_from_id + + @property + def created_from_type(self): + """Gets the created_from_type of this Entity. # noqa: E501 + + Type of the entity used to create this entry: template or concrete type if duplicate # noqa: E501 + + :return: The created_from_type of this Entity. # noqa: E501 + :rtype: int + """ + return self._created_from_type + + @created_from_type.setter + def created_from_type(self, created_from_type): + """Sets the created_from_type of this Entity. + + Type of the entity used to create this entry: template or concrete type if duplicate # noqa: E501 + + :param created_from_type: The created_from_type of this Entity. # noqa: E501 + :type: int + """ + + self._created_from_type = created_from_type + + @property + def created_from_type_human(self): + """Gets the created_from_type_human of this Entity. # noqa: E501 + + Human readable version of created_from_type integer. # noqa: E501 + + :return: The created_from_type_human of this Entity. # noqa: E501 + :rtype: str + """ + return self._created_from_type_human + + @created_from_type_human.setter + def created_from_type_human(self, created_from_type_human): + """Sets the created_from_type_human of this Entity. + + Human readable version of created_from_type integer. # noqa: E501 + + :param created_from_type_human: The created_from_type_human of this Entity. # noqa: E501 + :type: str + """ + + self._created_from_type_human = created_from_type_human + + @property + def elabid(self): + """Gets the elabid of this Entity. # noqa: E501 + + + :return: The elabid of this Entity. # noqa: E501 + :rtype: str + """ + return self._elabid + + @elabid.setter + def elabid(self, elabid): + """Sets the elabid of this Entity. + + + :param elabid: The elabid of this Entity. # noqa: E501 + :type: str + """ + + self._elabid = elabid + + @property + def exclusive_edit_mode(self): + """Gets the exclusive_edit_mode of this Entity. # noqa: E501 + + + :return: The exclusive_edit_mode of this Entity. # noqa: E501 + :rtype: ExclusiveEditMode + """ + return self._exclusive_edit_mode + + @exclusive_edit_mode.setter + def exclusive_edit_mode(self, exclusive_edit_mode): + """Sets the exclusive_edit_mode of this Entity. + + + :param exclusive_edit_mode: The exclusive_edit_mode of this Entity. # noqa: E501 + :type: ExclusiveEditMode + """ + + self._exclusive_edit_mode = exclusive_edit_mode + + @property + def experiments_links(self): + """Gets the experiments_links of this Entity. # noqa: E501 + + + :return: The experiments_links of this Entity. # noqa: E501 + :rtype: list[Link] + """ + return self._experiments_links + + @experiments_links.setter + def experiments_links(self, experiments_links): + """Sets the experiments_links of this Entity. + + + :param experiments_links: The experiments_links of this Entity. # noqa: E501 + :type: list[Link] + """ + + self._experiments_links = experiments_links + + @property + def firstname(self): + """Gets the firstname of this Entity. # noqa: E501 + + + :return: The firstname of this Entity. # noqa: E501 + :rtype: str + """ + return self._firstname + + @firstname.setter + def firstname(self, firstname): + """Sets the firstname of this Entity. + + + :param firstname: The firstname of this Entity. # noqa: E501 + :type: str + """ + + self._firstname = firstname + + @property + def fullname(self): + """Gets the fullname of this Entity. # noqa: E501 + + + :return: The fullname of this Entity. # noqa: E501 + :rtype: str + """ + return self._fullname + + @fullname.setter + def fullname(self, fullname): + """Sets the fullname of this Entity. + + + :param fullname: The fullname of this Entity. # noqa: E501 + :type: str + """ + + self._fullname = fullname + + @property + def hide_main_text(self): + """Gets the hide_main_text of this Entity. # noqa: E501 + + Hide the main text of an entry. When applied to templates, this setting also applies to derived entries. # noqa: E501 + + :return: The hide_main_text of this Entity. # noqa: E501 + :rtype: int + """ + return self._hide_main_text + + @hide_main_text.setter + def hide_main_text(self, hide_main_text): + """Sets the hide_main_text of this Entity. + + Hide the main text of an entry. When applied to templates, this setting also applies to derived entries. # noqa: E501 + + :param hide_main_text: The hide_main_text of this Entity. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if hide_main_text not in allowed_values: + raise ValueError( + "Invalid value for `hide_main_text` ({0}), must be one of {1}" # noqa: E501 + .format(hide_main_text, allowed_values) + ) + + self._hide_main_text = hide_main_text + + @property + def id(self): + """Gets the id of this Entity. # noqa: E501 + + + :return: The id of this Entity. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Entity. + + + :param id: The id of this Entity. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def items_links(self): + """Gets the items_links of this Entity. # noqa: E501 + + + :return: The items_links of this Entity. # noqa: E501 + :rtype: list[Link] + """ + return self._items_links + + @items_links.setter + def items_links(self, items_links): + """Sets the items_links of this Entity. + + + :param items_links: The items_links of this Entity. # noqa: E501 + :type: list[Link] + """ + + self._items_links = items_links + + @property + def lastchangeby(self): + """Gets the lastchangeby of this Entity. # noqa: E501 + + + :return: The lastchangeby of this Entity. # noqa: E501 + :rtype: int + """ + return self._lastchangeby + + @lastchangeby.setter + def lastchangeby(self, lastchangeby): + """Sets the lastchangeby of this Entity. + + + :param lastchangeby: The lastchangeby of this Entity. # noqa: E501 + :type: int + """ + + self._lastchangeby = lastchangeby + + @property + def lastname(self): + """Gets the lastname of this Entity. # noqa: E501 + + + :return: The lastname of this Entity. # noqa: E501 + :rtype: str + """ + return self._lastname + + @lastname.setter + def lastname(self, lastname): + """Sets the lastname of this Entity. + + + :param lastname: The lastname of this Entity. # noqa: E501 + :type: str + """ + + self._lastname = lastname + + @property + def locked(self): + """Gets the locked of this Entity. # noqa: E501 + + + :return: The locked of this Entity. # noqa: E501 + :rtype: int + """ + return self._locked + + @locked.setter + def locked(self, locked): + """Sets the locked of this Entity. + + + :param locked: The locked of this Entity. # noqa: E501 + :type: int + """ + + self._locked = locked + + @property + def lockedby(self): + """Gets the lockedby of this Entity. # noqa: E501 + + + :return: The lockedby of this Entity. # noqa: E501 + :rtype: int + """ + return self._lockedby + + @lockedby.setter + def lockedby(self, lockedby): + """Sets the lockedby of this Entity. + + + :param lockedby: The lockedby of this Entity. # noqa: E501 + :type: int + """ + + self._lockedby = lockedby + + @property + def locked_at(self): + """Gets the locked_at of this Entity. # noqa: E501 + + + :return: The locked_at of this Entity. # noqa: E501 + :rtype: str + """ + return self._locked_at + + @locked_at.setter + def locked_at(self, locked_at): + """Sets the locked_at of this Entity. + + + :param locked_at: The locked_at of this Entity. # noqa: E501 + :type: str + """ + + self._locked_at = locked_at + + @property + def modified_at(self): + """Gets the modified_at of this Entity. # noqa: E501 + + + :return: The modified_at of this Entity. # noqa: E501 + :rtype: str + """ + return self._modified_at + + @modified_at.setter + def modified_at(self, modified_at): + """Sets the modified_at of this Entity. + + + :param modified_at: The modified_at of this Entity. # noqa: E501 + :type: str + """ + + self._modified_at = modified_at + + @property + def next_step(self): + """Gets the next_step of this Entity. # noqa: E501 + + + :return: The next_step of this Entity. # noqa: E501 + :rtype: str + """ + return self._next_step + + @next_step.setter + def next_step(self, next_step): + """Sets the next_step of this Entity. + + + :param next_step: The next_step of this Entity. # noqa: E501 + :type: str + """ + + self._next_step = next_step + + @property + def orcid(self): + """Gets the orcid of this Entity. # noqa: E501 + + + :return: The orcid of this Entity. # noqa: E501 + :rtype: str + """ + return self._orcid + + @orcid.setter + def orcid(self, orcid): + """Sets the orcid of this Entity. + + + :param orcid: The orcid of this Entity. # noqa: E501 + :type: str + """ + + self._orcid = orcid + + @property + def page(self): + """Gets the page of this Entity. # noqa: E501 + + + :return: The page of this Entity. # noqa: E501 + :rtype: str + """ + return self._page + + @page.setter + def page(self, page): + """Sets the page of this Entity. + + + :param page: The page of this Entity. # noqa: E501 + :type: str + """ + + self._page = page + + @property + def recent_comment(self): + """Gets the recent_comment of this Entity. # noqa: E501 + + + :return: The recent_comment of this Entity. # noqa: E501 + :rtype: str + """ + return self._recent_comment + + @recent_comment.setter + def recent_comment(self, recent_comment): + """Sets the recent_comment of this Entity. + + + :param recent_comment: The recent_comment of this Entity. # noqa: E501 + :type: str + """ + + self._recent_comment = recent_comment + + @property + def related_experiments_links(self): + """Gets the related_experiments_links of this Entity. # noqa: E501 + + + :return: The related_experiments_links of this Entity. # noqa: E501 + :rtype: list[Link] + """ + return self._related_experiments_links + + @related_experiments_links.setter + def related_experiments_links(self, related_experiments_links): + """Sets the related_experiments_links of this Entity. + + + :param related_experiments_links: The related_experiments_links of this Entity. # noqa: E501 + :type: list[Link] + """ + + self._related_experiments_links = related_experiments_links + + @property + def related_items_links(self): + """Gets the related_items_links of this Entity. # noqa: E501 + + + :return: The related_items_links of this Entity. # noqa: E501 + :rtype: list[Link] + """ + return self._related_items_links + + @related_items_links.setter + def related_items_links(self, related_items_links): + """Sets the related_items_links of this Entity. + + + :param related_items_links: The related_items_links of this Entity. # noqa: E501 + :type: list[Link] + """ + + self._related_items_links = related_items_links + + @property + def sharelink(self): + """Gets the sharelink of this Entity. # noqa: E501 + + + :return: The sharelink of this Entity. # noqa: E501 + :rtype: str + """ + return self._sharelink + + @sharelink.setter + def sharelink(self, sharelink): + """Sets the sharelink of this Entity. + + + :param sharelink: The sharelink of this Entity. # noqa: E501 + :type: str + """ + + self._sharelink = sharelink + + @property + def status_color(self): + """Gets the status_color of this Entity. # noqa: E501 + + + :return: The status_color of this Entity. # noqa: E501 + :rtype: str + """ + return self._status_color + + @status_color.setter + def status_color(self, status_color): + """Sets the status_color of this Entity. + + + :param status_color: The status_color of this Entity. # noqa: E501 + :type: str + """ + + self._status_color = status_color + + @property + def status_title(self): + """Gets the status_title of this Entity. # noqa: E501 + + + :return: The status_title of this Entity. # noqa: E501 + :rtype: str + """ + return self._status_title + + @status_title.setter + def status_title(self, status_title): + """Sets the status_title of this Entity. + + + :param status_title: The status_title of this Entity. # noqa: E501 + :type: str + """ + + self._status_title = status_title + + @property + def steps(self): + """Gets the steps of this Entity. # noqa: E501 + + + :return: The steps of this Entity. # noqa: E501 + :rtype: list[Step] + """ + return self._steps + + @steps.setter + def steps(self, steps): + """Sets the steps of this Entity. + + + :param steps: The steps of this Entity. # noqa: E501 + :type: list[Step] + """ + + self._steps = steps + + @property + def tags(self): + """Gets the tags of this Entity. # noqa: E501 + + + :return: The tags of this Entity. # noqa: E501 + :rtype: str + """ + return self._tags + + @tags.setter + def tags(self, tags): + """Sets the tags of this Entity. + + + :param tags: The tags of this Entity. # noqa: E501 + :type: str + """ + + self._tags = tags + + @property + def tags_id(self): + """Gets the tags_id of this Entity. # noqa: E501 + + + :return: The tags_id of this Entity. # noqa: E501 + :rtype: str + """ + return self._tags_id + + @tags_id.setter + def tags_id(self, tags_id): + """Sets the tags_id of this Entity. + + + :param tags_id: The tags_id of this Entity. # noqa: E501 + :type: str + """ + + self._tags_id = tags_id + + @property + def team(self): + """Gets the team of this Entity. # noqa: E501 + + + :return: The team of this Entity. # noqa: E501 + :rtype: int + """ + return self._team + + @team.setter + def team(self, team): + """Sets the team of this Entity. + + + :param team: The team of this Entity. # noqa: E501 + :type: int + """ + + self._team = team + + @property + def timestamped(self): + """Gets the timestamped of this Entity. # noqa: E501 + + + :return: The timestamped of this Entity. # noqa: E501 + :rtype: int + """ + return self._timestamped + + @timestamped.setter + def timestamped(self, timestamped): + """Sets the timestamped of this Entity. + + + :param timestamped: The timestamped of this Entity. # noqa: E501 + :type: int + """ + + self._timestamped = timestamped + + @property + def timestampedby(self): + """Gets the timestampedby of this Entity. # noqa: E501 + + + :return: The timestampedby of this Entity. # noqa: E501 + :rtype: int + """ + return self._timestampedby + + @timestampedby.setter + def timestampedby(self, timestampedby): + """Sets the timestampedby of this Entity. + + + :param timestampedby: The timestampedby of this Entity. # noqa: E501 + :type: int + """ + + self._timestampedby = timestampedby + + @property + def timestamped_at(self): + """Gets the timestamped_at of this Entity. # noqa: E501 + + + :return: The timestamped_at of this Entity. # noqa: E501 + :rtype: str + """ + return self._timestamped_at + + @timestamped_at.setter + def timestamped_at(self, timestamped_at): + """Sets the timestamped_at of this Entity. + + + :param timestamped_at: The timestamped_at of this Entity. # noqa: E501 + :type: str + """ + + self._timestamped_at = timestamped_at + + @property + def type(self): + """Gets the type of this Entity. # noqa: E501 + + + :return: The type of this Entity. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Entity. + + + :param type: The type of this Entity. # noqa: E501 + :type: str + """ + + self._type = type + + @property + def uploads(self): + """Gets the uploads of this Entity. # noqa: E501 + + + :return: The uploads of this Entity. # noqa: E501 + :rtype: list[Upload] + """ + return self._uploads + + @uploads.setter + def uploads(self, uploads): + """Sets the uploads of this Entity. + + + :param uploads: The uploads of this Entity. # noqa: E501 + :type: list[Upload] + """ + + self._uploads = uploads + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Entity, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Entity): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/entity_and_item_editable.py b/vendor/elabapi-python/elabapi_python/models/entity_and_item_editable.py new file mode 100644 index 0000000..7ee994c --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/entity_and_item_editable.py @@ -0,0 +1,450 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from elabapi_python.models.entity_editable import EntityEditable # noqa: F401,E501 + +class EntityAndItemEditable(EntityEditable): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'is_bookable': 'int', + 'canbook_base': 'float', + 'canbook': 'str', + 'book_max_minutes': 'int', + 'book_max_slots': 'int', + 'book_can_overlap': 'int', + 'book_users_can_in_past': 'int', + 'book_is_cancellable': 'int', + 'book_cancel_minutes': 'int', + 'booking_window_days': 'int', + 'booking_hourly_rate_notax': 'float', + 'booking_hourly_rate_tax': 'float', + 'booking_hourly_rate_currency': 'int' + } + if hasattr(EntityEditable, "swagger_types"): + swagger_types.update(EntityEditable.swagger_types) + + attribute_map = { + 'is_bookable': 'is_bookable', + 'canbook_base': 'canbook_base', + 'canbook': 'canbook', + 'book_max_minutes': 'book_max_minutes', + 'book_max_slots': 'book_max_slots', + 'book_can_overlap': 'book_can_overlap', + 'book_users_can_in_past': 'book_users_can_in_past', + 'book_is_cancellable': 'book_is_cancellable', + 'book_cancel_minutes': 'book_cancel_minutes', + 'booking_window_days': 'booking_window_days', + 'booking_hourly_rate_notax': 'booking_hourly_rate_notax', + 'booking_hourly_rate_tax': 'booking_hourly_rate_tax', + 'booking_hourly_rate_currency': 'booking_hourly_rate_currency' + } + if hasattr(EntityEditable, "attribute_map"): + attribute_map.update(EntityEditable.attribute_map) + + def __init__(self, is_bookable=None, canbook_base=None, canbook=None, book_max_minutes=None, book_max_slots=None, book_can_overlap=None, book_users_can_in_past=None, book_is_cancellable=None, book_cancel_minutes=None, booking_window_days=None, booking_hourly_rate_notax=None, booking_hourly_rate_tax=None, booking_hourly_rate_currency=None, *args, **kwargs): # noqa: E501 + """EntityAndItemEditable - a model defined in Swagger""" # noqa: E501 + self._is_bookable = None + self._canbook_base = None + self._canbook = None + self._book_max_minutes = None + self._book_max_slots = None + self._book_can_overlap = None + self._book_users_can_in_past = None + self._book_is_cancellable = None + self._book_cancel_minutes = None + self._booking_window_days = None + self._booking_hourly_rate_notax = None + self._booking_hourly_rate_tax = None + self._booking_hourly_rate_currency = None + self.discriminator = None + if is_bookable is not None: + self.is_bookable = is_bookable + if canbook_base is not None: + self.canbook_base = canbook_base + if canbook is not None: + self.canbook = canbook + if book_max_minutes is not None: + self.book_max_minutes = book_max_minutes + if book_max_slots is not None: + self.book_max_slots = book_max_slots + if book_can_overlap is not None: + self.book_can_overlap = book_can_overlap + if book_users_can_in_past is not None: + self.book_users_can_in_past = book_users_can_in_past + if book_is_cancellable is not None: + self.book_is_cancellable = book_is_cancellable + if book_cancel_minutes is not None: + self.book_cancel_minutes = book_cancel_minutes + if booking_window_days is not None: + self.booking_window_days = booking_window_days + if booking_hourly_rate_notax is not None: + self.booking_hourly_rate_notax = booking_hourly_rate_notax + if booking_hourly_rate_tax is not None: + self.booking_hourly_rate_tax = booking_hourly_rate_tax + if booking_hourly_rate_currency is not None: + self.booking_hourly_rate_currency = booking_hourly_rate_currency + EntityEditable.__init__(self, *args, **kwargs) + + @property + def is_bookable(self): + """Gets the is_bookable of this EntityAndItemEditable. # noqa: E501 + + + :return: The is_bookable of this EntityAndItemEditable. # noqa: E501 + :rtype: int + """ + return self._is_bookable + + @is_bookable.setter + def is_bookable(self, is_bookable): + """Sets the is_bookable of this EntityAndItemEditable. + + + :param is_bookable: The is_bookable of this EntityAndItemEditable. # noqa: E501 + :type: int + """ + + self._is_bookable = is_bookable + + @property + def canbook_base(self): + """Gets the canbook_base of this EntityAndItemEditable. # noqa: E501 + + Base permission for booking access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :return: The canbook_base of this EntityAndItemEditable. # noqa: E501 + :rtype: float + """ + return self._canbook_base + + @canbook_base.setter + def canbook_base(self, canbook_base): + """Sets the canbook_base of this EntityAndItemEditable. + + Base permission for booking access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :param canbook_base: The canbook_base of this EntityAndItemEditable. # noqa: E501 + :type: float + """ + allowed_values = [10, 20, 30, 40, 50] # noqa: E501 + if canbook_base not in allowed_values: + raise ValueError( + "Invalid value for `canbook_base` ({0}), must be one of {1}" # noqa: E501 + .format(canbook_base, allowed_values) + ) + + self._canbook_base = canbook_base + + @property + def canbook(self): + """Gets the canbook of this EntityAndItemEditable. # noqa: E501 + + + :return: The canbook of this EntityAndItemEditable. # noqa: E501 + :rtype: str + """ + return self._canbook + + @canbook.setter + def canbook(self, canbook): + """Sets the canbook of this EntityAndItemEditable. + + + :param canbook: The canbook of this EntityAndItemEditable. # noqa: E501 + :type: str + """ + + self._canbook = canbook + + @property + def book_max_minutes(self): + """Gets the book_max_minutes of this EntityAndItemEditable. # noqa: E501 + + + :return: The book_max_minutes of this EntityAndItemEditable. # noqa: E501 + :rtype: int + """ + return self._book_max_minutes + + @book_max_minutes.setter + def book_max_minutes(self, book_max_minutes): + """Sets the book_max_minutes of this EntityAndItemEditable. + + + :param book_max_minutes: The book_max_minutes of this EntityAndItemEditable. # noqa: E501 + :type: int + """ + + self._book_max_minutes = book_max_minutes + + @property + def book_max_slots(self): + """Gets the book_max_slots of this EntityAndItemEditable. # noqa: E501 + + + :return: The book_max_slots of this EntityAndItemEditable. # noqa: E501 + :rtype: int + """ + return self._book_max_slots + + @book_max_slots.setter + def book_max_slots(self, book_max_slots): + """Sets the book_max_slots of this EntityAndItemEditable. + + + :param book_max_slots: The book_max_slots of this EntityAndItemEditable. # noqa: E501 + :type: int + """ + + self._book_max_slots = book_max_slots + + @property + def book_can_overlap(self): + """Gets the book_can_overlap of this EntityAndItemEditable. # noqa: E501 + + + :return: The book_can_overlap of this EntityAndItemEditable. # noqa: E501 + :rtype: int + """ + return self._book_can_overlap + + @book_can_overlap.setter + def book_can_overlap(self, book_can_overlap): + """Sets the book_can_overlap of this EntityAndItemEditable. + + + :param book_can_overlap: The book_can_overlap of this EntityAndItemEditable. # noqa: E501 + :type: int + """ + + self._book_can_overlap = book_can_overlap + + @property + def book_users_can_in_past(self): + """Gets the book_users_can_in_past of this EntityAndItemEditable. # noqa: E501 + + + :return: The book_users_can_in_past of this EntityAndItemEditable. # noqa: E501 + :rtype: int + """ + return self._book_users_can_in_past + + @book_users_can_in_past.setter + def book_users_can_in_past(self, book_users_can_in_past): + """Sets the book_users_can_in_past of this EntityAndItemEditable. + + + :param book_users_can_in_past: The book_users_can_in_past of this EntityAndItemEditable. # noqa: E501 + :type: int + """ + + self._book_users_can_in_past = book_users_can_in_past + + @property + def book_is_cancellable(self): + """Gets the book_is_cancellable of this EntityAndItemEditable. # noqa: E501 + + + :return: The book_is_cancellable of this EntityAndItemEditable. # noqa: E501 + :rtype: int + """ + return self._book_is_cancellable + + @book_is_cancellable.setter + def book_is_cancellable(self, book_is_cancellable): + """Sets the book_is_cancellable of this EntityAndItemEditable. + + + :param book_is_cancellable: The book_is_cancellable of this EntityAndItemEditable. # noqa: E501 + :type: int + """ + + self._book_is_cancellable = book_is_cancellable + + @property + def book_cancel_minutes(self): + """Gets the book_cancel_minutes of this EntityAndItemEditable. # noqa: E501 + + + :return: The book_cancel_minutes of this EntityAndItemEditable. # noqa: E501 + :rtype: int + """ + return self._book_cancel_minutes + + @book_cancel_minutes.setter + def book_cancel_minutes(self, book_cancel_minutes): + """Sets the book_cancel_minutes of this EntityAndItemEditable. + + + :param book_cancel_minutes: The book_cancel_minutes of this EntityAndItemEditable. # noqa: E501 + :type: int + """ + + self._book_cancel_minutes = book_cancel_minutes + + @property + def booking_window_days(self): + """Gets the booking_window_days of this EntityAndItemEditable. # noqa: E501 + + How many days in advance users can book an item. 0 means no limit. # noqa: E501 + + :return: The booking_window_days of this EntityAndItemEditable. # noqa: E501 + :rtype: int + """ + return self._booking_window_days + + @booking_window_days.setter + def booking_window_days(self, booking_window_days): + """Sets the booking_window_days of this EntityAndItemEditable. + + How many days in advance users can book an item. 0 means no limit. # noqa: E501 + + :param booking_window_days: The booking_window_days of this EntityAndItemEditable. # noqa: E501 + :type: int + """ + + self._booking_window_days = booking_window_days + + @property + def booking_hourly_rate_notax(self): + """Gets the booking_hourly_rate_notax of this EntityAndItemEditable. # noqa: E501 + + The hourly rate of booked resource, without taxes. # noqa: E501 + + :return: The booking_hourly_rate_notax of this EntityAndItemEditable. # noqa: E501 + :rtype: float + """ + return self._booking_hourly_rate_notax + + @booking_hourly_rate_notax.setter + def booking_hourly_rate_notax(self, booking_hourly_rate_notax): + """Sets the booking_hourly_rate_notax of this EntityAndItemEditable. + + The hourly rate of booked resource, without taxes. # noqa: E501 + + :param booking_hourly_rate_notax: The booking_hourly_rate_notax of this EntityAndItemEditable. # noqa: E501 + :type: float + """ + + self._booking_hourly_rate_notax = booking_hourly_rate_notax + + @property + def booking_hourly_rate_tax(self): + """Gets the booking_hourly_rate_tax of this EntityAndItemEditable. # noqa: E501 + + The hourly rate of booked resource, with taxes. # noqa: E501 + + :return: The booking_hourly_rate_tax of this EntityAndItemEditable. # noqa: E501 + :rtype: float + """ + return self._booking_hourly_rate_tax + + @booking_hourly_rate_tax.setter + def booking_hourly_rate_tax(self, booking_hourly_rate_tax): + """Sets the booking_hourly_rate_tax of this EntityAndItemEditable. + + The hourly rate of booked resource, with taxes. # noqa: E501 + + :param booking_hourly_rate_tax: The booking_hourly_rate_tax of this EntityAndItemEditable. # noqa: E501 + :type: float + """ + + self._booking_hourly_rate_tax = booking_hourly_rate_tax + + @property + def booking_hourly_rate_currency(self): + """Gets the booking_hourly_rate_currency of this EntityAndItemEditable. # noqa: E501 + + The currency of the hourly rate: - 0: CAD - 1: CHF - 2: CNY - 3: DKK - 4: EUR - 5: GBP - 6: JPY - 7: USD - 8: SEK - 9: NOK # noqa: E501 + + :return: The booking_hourly_rate_currency of this EntityAndItemEditable. # noqa: E501 + :rtype: int + """ + return self._booking_hourly_rate_currency + + @booking_hourly_rate_currency.setter + def booking_hourly_rate_currency(self, booking_hourly_rate_currency): + """Sets the booking_hourly_rate_currency of this EntityAndItemEditable. + + The currency of the hourly rate: - 0: CAD - 1: CHF - 2: CNY - 3: DKK - 4: EUR - 5: GBP - 6: JPY - 7: USD - 8: SEK - 9: NOK # noqa: E501 + + :param booking_hourly_rate_currency: The booking_hourly_rate_currency of this EntityAndItemEditable. # noqa: E501 + :type: int + """ + allowed_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # noqa: E501 + if booking_hourly_rate_currency not in allowed_values: + raise ValueError( + "Invalid value for `booking_hourly_rate_currency` ({0}), must be one of {1}" # noqa: E501 + .format(booking_hourly_rate_currency, allowed_values) + ) + + self._booking_hourly_rate_currency = booking_hourly_rate_currency + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityAndItemEditable, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityAndItemEditable): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/entity_duplicate.py b/vendor/elabapi-python/elabapi_python/models/entity_duplicate.py new file mode 100644 index 0000000..e47253e --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/entity_duplicate.py @@ -0,0 +1,168 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityDuplicate(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str', + 'copy_files': 'bool', + 'link_to_original': 'bool' + } + + attribute_map = { + 'action': 'action', + 'copy_files': 'copyFiles', + 'link_to_original': 'linkToOriginal' + } + + def __init__(self, action='duplicate', copy_files=False, link_to_original=True): # noqa: E501 + """EntityDuplicate - a model defined in Swagger""" # noqa: E501 + self._action = None + self._copy_files = None + self._link_to_original = None + self.discriminator = None + if action is not None: + self.action = action + if copy_files is not None: + self.copy_files = copy_files + if link_to_original is not None: + self.link_to_original = link_to_original + + @property + def action(self): + """Gets the action of this EntityDuplicate. # noqa: E501 + + The \"duplicate\" action creates a new entity based from the given entity id. # noqa: E501 + + :return: The action of this EntityDuplicate. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this EntityDuplicate. + + The \"duplicate\" action creates a new entity based from the given entity id. # noqa: E501 + + :param action: The action of this EntityDuplicate. # noqa: E501 + :type: str + """ + + self._action = action + + @property + def copy_files(self): + """Gets the copy_files of this EntityDuplicate. # noqa: E501 + + If \"true\", the action will import the files of the original entity. # noqa: E501 + + :return: The copy_files of this EntityDuplicate. # noqa: E501 + :rtype: bool + """ + return self._copy_files + + @copy_files.setter + def copy_files(self, copy_files): + """Sets the copy_files of this EntityDuplicate. + + If \"true\", the action will import the files of the original entity. # noqa: E501 + + :param copy_files: The copy_files of this EntityDuplicate. # noqa: E501 + :type: bool + """ + + self._copy_files = copy_files + + @property + def link_to_original(self): + """Gets the link_to_original of this EntityDuplicate. # noqa: E501 + + If \"true\", the action will create a link to the original entity. # noqa: E501 + + :return: The link_to_original of this EntityDuplicate. # noqa: E501 + :rtype: bool + """ + return self._link_to_original + + @link_to_original.setter + def link_to_original(self, link_to_original): + """Sets the link_to_original of this EntityDuplicate. + + If \"true\", the action will create a link to the original entity. # noqa: E501 + + :param link_to_original: The link_to_original of this EntityDuplicate. # noqa: E501 + :type: bool + """ + + self._link_to_original = link_to_original + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityDuplicate, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityDuplicate): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/entity_editable.py b/vendor/elabapi-python/elabapi_python/models/entity_editable.py new file mode 100644 index 0000000..b3bf451 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/entity_editable.py @@ -0,0 +1,628 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityEditable(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'body': 'str', + 'bodyappend': 'str', + 'canread_base': 'float', + 'canread': 'str', + 'canwrite_base': 'float', + 'canwrite': 'str', + 'category': 'int', + '_date': 'str', + 'content_type': 'int', + 'custom_id': 'int', + 'metadata': 'Metadata', + 'metadatamerge': 'AllOfentityEditableMetadatamerge', + 'rating': 'int', + 'state': 'int', + 'status': 'int', + 'title': 'str', + 'template': 'int', + 'userid': 'int', + 'team': 'int' + } + + attribute_map = { + 'body': 'body', + 'bodyappend': 'bodyappend', + 'canread_base': 'canread_base', + 'canread': 'canread', + 'canwrite_base': 'canwrite_base', + 'canwrite': 'canwrite', + 'category': 'category', + '_date': 'date', + 'content_type': 'content_type', + 'custom_id': 'custom_id', + 'metadata': 'metadata', + 'metadatamerge': 'metadatamerge', + 'rating': 'rating', + 'state': 'state', + 'status': 'status', + 'title': 'title', + 'template': 'template', + 'userid': 'userid', + 'team': 'team' + } + + def __init__(self, body=None, bodyappend=None, canread_base=None, canread='{"teams": [], "users": [], "teamgroups": []}', canwrite_base=None, canwrite='{"teams": [], "users": [], "teamgroups": []}', category=None, _date=None, content_type=None, custom_id=None, metadata=None, metadatamerge=None, rating=0, state=None, status=None, title='Untitled', template=-1, userid=None, team=None): # noqa: E501 + """EntityEditable - a model defined in Swagger""" # noqa: E501 + self._body = None + self._bodyappend = None + self._canread_base = None + self._canread = None + self._canwrite_base = None + self._canwrite = None + self._category = None + self.__date = None + self._content_type = None + self._custom_id = None + self._metadata = None + self._metadatamerge = None + self._rating = None + self._state = None + self._status = None + self._title = None + self._template = None + self._userid = None + self._team = None + self.discriminator = None + if body is not None: + self.body = body + if bodyappend is not None: + self.bodyappend = bodyappend + if canread_base is not None: + self.canread_base = canread_base + if canread is not None: + self.canread = canread + if canwrite_base is not None: + self.canwrite_base = canwrite_base + if canwrite is not None: + self.canwrite = canwrite + if category is not None: + self.category = category + if _date is not None: + self._date = _date + if content_type is not None: + self.content_type = content_type + if custom_id is not None: + self.custom_id = custom_id + if metadata is not None: + self.metadata = metadata + if metadatamerge is not None: + self.metadatamerge = metadatamerge + if rating is not None: + self.rating = rating + if state is not None: + self.state = state + if status is not None: + self.status = status + if title is not None: + self.title = title + if template is not None: + self.template = template + if userid is not None: + self.userid = userid + if team is not None: + self.team = team + + @property + def body(self): + """Gets the body of this EntityEditable. # noqa: E501 + + The main text content (HTML or Markdown) # noqa: E501 + + :return: The body of this EntityEditable. # noqa: E501 + :rtype: str + """ + return self._body + + @body.setter + def body(self, body): + """Sets the body of this EntityEditable. + + The main text content (HTML or Markdown) # noqa: E501 + + :param body: The body of this EntityEditable. # noqa: E501 + :type: str + """ + + self._body = body + + @property + def bodyappend(self): + """Gets the bodyappend of this EntityEditable. # noqa: E501 + + Append content to the existing entity body instead of replacing it. # noqa: E501 + + :return: The bodyappend of this EntityEditable. # noqa: E501 + :rtype: str + """ + return self._bodyappend + + @bodyappend.setter + def bodyappend(self, bodyappend): + """Sets the bodyappend of this EntityEditable. + + Append content to the existing entity body instead of replacing it. # noqa: E501 + + :param bodyappend: The bodyappend of this EntityEditable. # noqa: E501 + :type: str + """ + + self._bodyappend = bodyappend + + @property + def canread_base(self): + """Gets the canread_base of this EntityEditable. # noqa: E501 + + Base permission for read access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :return: The canread_base of this EntityEditable. # noqa: E501 + :rtype: float + """ + return self._canread_base + + @canread_base.setter + def canread_base(self, canread_base): + """Sets the canread_base of this EntityEditable. + + Base permission for read access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :param canread_base: The canread_base of this EntityEditable. # noqa: E501 + :type: float + """ + allowed_values = [10, 20, 30, 40, 50] # noqa: E501 + if canread_base not in allowed_values: + raise ValueError( + "Invalid value for `canread_base` ({0}), must be one of {1}" # noqa: E501 + .format(canread_base, allowed_values) + ) + + self._canread_base = canread_base + + @property + def canread(self): + """Gets the canread of this EntityEditable. # noqa: E501 + + JSON permissions for reading the entry # noqa: E501 + + :return: The canread of this EntityEditable. # noqa: E501 + :rtype: str + """ + return self._canread + + @canread.setter + def canread(self, canread): + """Sets the canread of this EntityEditable. + + JSON permissions for reading the entry # noqa: E501 + + :param canread: The canread of this EntityEditable. # noqa: E501 + :type: str + """ + + self._canread = canread + + @property + def canwrite_base(self): + """Gets the canwrite_base of this EntityEditable. # noqa: E501 + + Base permission for write access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :return: The canwrite_base of this EntityEditable. # noqa: E501 + :rtype: float + """ + return self._canwrite_base + + @canwrite_base.setter + def canwrite_base(self, canwrite_base): + """Sets the canwrite_base of this EntityEditable. + + Base permission for write access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :param canwrite_base: The canwrite_base of this EntityEditable. # noqa: E501 + :type: float + """ + allowed_values = [10, 20, 30, 40, 50] # noqa: E501 + if canwrite_base not in allowed_values: + raise ValueError( + "Invalid value for `canwrite_base` ({0}), must be one of {1}" # noqa: E501 + .format(canwrite_base, allowed_values) + ) + + self._canwrite_base = canwrite_base + + @property + def canwrite(self): + """Gets the canwrite of this EntityEditable. # noqa: E501 + + JSON permissions for writing the entry # noqa: E501 + + :return: The canwrite of this EntityEditable. # noqa: E501 + :rtype: str + """ + return self._canwrite + + @canwrite.setter + def canwrite(self, canwrite): + """Sets the canwrite of this EntityEditable. + + JSON permissions for writing the entry # noqa: E501 + + :param canwrite: The canwrite of this EntityEditable. # noqa: E501 + :type: str + """ + + self._canwrite = canwrite + + @property + def category(self): + """Gets the category of this EntityEditable. # noqa: E501 + + The experiment category ID # noqa: E501 + + :return: The category of this EntityEditable. # noqa: E501 + :rtype: int + """ + return self._category + + @category.setter + def category(self, category): + """Sets the category of this EntityEditable. + + The experiment category ID # noqa: E501 + + :param category: The category of this EntityEditable. # noqa: E501 + :type: int + """ + + self._category = category + + @property + def _date(self): + """Gets the _date of this EntityEditable. # noqa: E501 + + + :return: The _date of this EntityEditable. # noqa: E501 + :rtype: str + """ + return self.__date + + @_date.setter + def _date(self, _date): + """Sets the _date of this EntityEditable. + + + :param _date: The _date of this EntityEditable. # noqa: E501 + :type: str + """ + + self.__date = _date + + @property + def content_type(self): + """Gets the content_type of this EntityEditable. # noqa: E501 + + Set the content type for main text: - 1: HTML (default) - 2: Markdown If unset, it will use the user's preference value. # noqa: E501 + + :return: The content_type of this EntityEditable. # noqa: E501 + :rtype: int + """ + return self._content_type + + @content_type.setter + def content_type(self, content_type): + """Sets the content_type of this EntityEditable. + + Set the content type for main text: - 1: HTML (default) - 2: Markdown If unset, it will use the user's preference value. # noqa: E501 + + :param content_type: The content_type of this EntityEditable. # noqa: E501 + :type: int + """ + allowed_values = [1, 2] # noqa: E501 + if content_type not in allowed_values: + raise ValueError( + "Invalid value for `content_type` ({0}), must be one of {1}" # noqa: E501 + .format(content_type, allowed_values) + ) + + self._content_type = content_type + + @property + def custom_id(self): + """Gets the custom_id of this EntityEditable. # noqa: E501 + + Cannot be negative. Can be reset with \"0\", null or empty string. # noqa: E501 + + :return: The custom_id of this EntityEditable. # noqa: E501 + :rtype: int + """ + return self._custom_id + + @custom_id.setter + def custom_id(self, custom_id): + """Sets the custom_id of this EntityEditable. + + Cannot be negative. Can be reset with \"0\", null or empty string. # noqa: E501 + + :param custom_id: The custom_id of this EntityEditable. # noqa: E501 + :type: int + """ + + self._custom_id = custom_id + + @property + def metadata(self): + """Gets the metadata of this EntityEditable. # noqa: E501 + + + :return: The metadata of this EntityEditable. # noqa: E501 + :rtype: Metadata + """ + return self._metadata + + @metadata.setter + def metadata(self, metadata): + """Sets the metadata of this EntityEditable. + + + :param metadata: The metadata of this EntityEditable. # noqa: E501 + :type: Metadata + """ + + self._metadata = metadata + + @property + def metadatamerge(self): + """Gets the metadatamerge of this EntityEditable. # noqa: E501 + + Merge incoming metadata into the existing entity metadata. Existing extra fields keep their schema such as type, options, units and description; only their value is updated. Incoming extra fields that do not already exist are added. # noqa: E501 + + :return: The metadatamerge of this EntityEditable. # noqa: E501 + :rtype: AllOfentityEditableMetadatamerge + """ + return self._metadatamerge + + @metadatamerge.setter + def metadatamerge(self, metadatamerge): + """Sets the metadatamerge of this EntityEditable. + + Merge incoming metadata into the existing entity metadata. Existing extra fields keep their schema such as type, options, units and description; only their value is updated. Incoming extra fields that do not already exist are added. # noqa: E501 + + :param metadatamerge: The metadatamerge of this EntityEditable. # noqa: E501 + :type: AllOfentityEditableMetadatamerge + """ + + self._metadatamerge = metadatamerge + + @property + def rating(self): + """Gets the rating of this EntityEditable. # noqa: E501 + + Rating value from 0 to 5 # noqa: E501 + + :return: The rating of this EntityEditable. # noqa: E501 + :rtype: int + """ + return self._rating + + @rating.setter + def rating(self, rating): + """Sets the rating of this EntityEditable. + + Rating value from 0 to 5 # noqa: E501 + + :param rating: The rating of this EntityEditable. # noqa: E501 + :type: int + """ + + self._rating = rating + + @property + def state(self): + """Gets the state of this EntityEditable. # noqa: E501 + + + :return: The state of this EntityEditable. # noqa: E501 + :rtype: int + """ + return self._state + + @state.setter + def state(self, state): + """Sets the state of this EntityEditable. + + + :param state: The state of this EntityEditable. # noqa: E501 + :type: int + """ + + self._state = state + + @property + def status(self): + """Gets the status of this EntityEditable. # noqa: E501 + + Cannot be negative nor empty string. Can be reset with \"0\" and null. # noqa: E501 + + :return: The status of this EntityEditable. # noqa: E501 + :rtype: int + """ + return self._status + + @status.setter + def status(self, status): + """Sets the status of this EntityEditable. + + Cannot be negative nor empty string. Can be reset with \"0\" and null. # noqa: E501 + + :param status: The status of this EntityEditable. # noqa: E501 + :type: int + """ + + self._status = status + + @property + def title(self): + """Gets the title of this EntityEditable. # noqa: E501 + + The title of the entry # noqa: E501 + + :return: The title of this EntityEditable. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this EntityEditable. + + The title of the entry # noqa: E501 + + :param title: The title of this EntityEditable. # noqa: E501 + :type: str + """ + + self._title = title + + @property + def template(self): + """Gets the template of this EntityEditable. # noqa: E501 + + The template id to use, or 0 to use the common team template, or -1 to have an empty body. # noqa: E501 + + :return: The template of this EntityEditable. # noqa: E501 + :rtype: int + """ + return self._template + + @template.setter + def template(self, template): + """Sets the template of this EntityEditable. + + The template id to use, or 0 to use the common team template, or -1 to have an empty body. # noqa: E501 + + :param template: The template of this EntityEditable. # noqa: E501 + :type: int + """ + + self._template = template + + @property + def userid(self): + """Gets the userid of this EntityEditable. # noqa: E501 + + User ID of the entity owner. When transferring ownership, the `team` field should also be provided (optional). # noqa: E501 + + :return: The userid of this EntityEditable. # noqa: E501 + :rtype: int + """ + return self._userid + + @userid.setter + def userid(self, userid): + """Sets the userid of this EntityEditable. + + User ID of the entity owner. When transferring ownership, the `team` field should also be provided (optional). # noqa: E501 + + :param userid: The userid of this EntityEditable. # noqa: E501 + :type: int + """ + + self._userid = userid + + @property + def team(self): + """Gets the team of this EntityEditable. # noqa: E501 + + Optional team context for ownership transfer. If omitted, the requester’s team is used by default. If provided, the API validates that the target user is a member of the specified team. # noqa: E501 + + :return: The team of this EntityEditable. # noqa: E501 + :rtype: int + """ + return self._team + + @team.setter + def team(self, team): + """Sets the team of this EntityEditable. + + Optional team context for ownership transfer. If omitted, the requester’s team is used by default. If provided, the API validates that the target user is a member of the specified team. # noqa: E501 + + :param team: The team of this EntityEditable. # noqa: E501 + :type: int + """ + + self._team = team + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityEditable, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityEditable): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/entity_template.py b/vendor/elabapi-python/elabapi_python/models/entity_template.py new file mode 100644 index 0000000..15555fa --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/entity_template.py @@ -0,0 +1,1222 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from elabapi_python.models.entity_template_editable import EntityTemplateEditable # noqa: F401,E501 + +class EntityTemplate(EntityTemplateEditable): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'access_key': 'str', + 'body_html': 'str', + 'category_color': 'str', + 'category_title': 'str', + 'changelog': 'list[Changelog]', + 'comments': 'list[Comment]', + 'compounds_links': 'list[Compound]', + 'created_at': 'str', + 'created_from_id': 'int', + 'created_from_type': 'int', + 'created_from_type_human': 'str', + 'elabid': 'str', + 'exclusive_edit_mode': 'ExclusiveEditMode', + 'experiments_links': 'list[Link]', + 'firstname': 'str', + 'fullname': 'str', + 'hide_main_text': 'int', + 'id': 'int', + 'items_links': 'list[Link]', + 'lastchangeby': 'int', + 'lastname': 'str', + 'locked': 'int', + 'lockedby': 'int', + 'locked_at': 'str', + 'modified_at': 'str', + 'next_step': 'str', + 'orcid': 'str', + 'page': 'str', + 'recent_comment': 'str', + 'related_experiments_links': 'list[Link]', + 'related_items_links': 'list[Link]', + 'sharelink': 'str', + 'status_color': 'str', + 'status_title': 'str', + 'steps': 'list[Step]', + 'tags': 'str', + 'tags_id': 'str', + 'team': 'int', + 'timestamped': 'int', + 'timestampedby': 'int', + 'timestamped_at': 'str', + 'type': 'str', + 'uploads': 'list[Upload]' + } + if hasattr(EntityTemplateEditable, "swagger_types"): + swagger_types.update(EntityTemplateEditable.swagger_types) + + attribute_map = { + 'access_key': 'access_key', + 'body_html': 'body_html', + 'category_color': 'category_color', + 'category_title': 'category_title', + 'changelog': 'changelog', + 'comments': 'comments', + 'compounds_links': 'compounds_links', + 'created_at': 'created_at', + 'created_from_id': 'created_from_id', + 'created_from_type': 'created_from_type', + 'created_from_type_human': 'created_from_type_human', + 'elabid': 'elabid', + 'exclusive_edit_mode': 'exclusive_edit_mode', + 'experiments_links': 'experiments_links', + 'firstname': 'firstname', + 'fullname': 'fullname', + 'hide_main_text': 'hide_main_text', + 'id': 'id', + 'items_links': 'items_links', + 'lastchangeby': 'lastchangeby', + 'lastname': 'lastname', + 'locked': 'locked', + 'lockedby': 'lockedby', + 'locked_at': 'locked_at', + 'modified_at': 'modified_at', + 'next_step': 'next_step', + 'orcid': 'orcid', + 'page': 'page', + 'recent_comment': 'recent_comment', + 'related_experiments_links': 'related_experiments_links', + 'related_items_links': 'related_items_links', + 'sharelink': 'sharelink', + 'status_color': 'status_color', + 'status_title': 'status_title', + 'steps': 'steps', + 'tags': 'tags', + 'tags_id': 'tags_id', + 'team': 'team', + 'timestamped': 'timestamped', + 'timestampedby': 'timestampedby', + 'timestamped_at': 'timestamped_at', + 'type': 'type', + 'uploads': 'uploads' + } + if hasattr(EntityTemplateEditable, "attribute_map"): + attribute_map.update(EntityTemplateEditable.attribute_map) + + def __init__(self, access_key=None, body_html=None, category_color=None, category_title=None, changelog=None, comments=None, compounds_links=None, created_at=None, created_from_id=None, created_from_type=None, created_from_type_human=None, elabid=None, exclusive_edit_mode=None, experiments_links=None, firstname=None, fullname=None, hide_main_text=None, id=None, items_links=None, lastchangeby=None, lastname=None, locked=None, lockedby=None, locked_at=None, modified_at=None, next_step=None, orcid=None, page=None, recent_comment=None, related_experiments_links=None, related_items_links=None, sharelink=None, status_color=None, status_title=None, steps=None, tags=None, tags_id=None, team=None, timestamped=None, timestampedby=None, timestamped_at=None, type=None, uploads=None, *args, **kwargs): # noqa: E501 + """EntityTemplate - a model defined in Swagger""" # noqa: E501 + self._access_key = None + self._body_html = None + self._category_color = None + self._category_title = None + self._changelog = None + self._comments = None + self._compounds_links = None + self._created_at = None + self._created_from_id = None + self._created_from_type = None + self._created_from_type_human = None + self._elabid = None + self._exclusive_edit_mode = None + self._experiments_links = None + self._firstname = None + self._fullname = None + self._hide_main_text = None + self._id = None + self._items_links = None + self._lastchangeby = None + self._lastname = None + self._locked = None + self._lockedby = None + self._locked_at = None + self._modified_at = None + self._next_step = None + self._orcid = None + self._page = None + self._recent_comment = None + self._related_experiments_links = None + self._related_items_links = None + self._sharelink = None + self._status_color = None + self._status_title = None + self._steps = None + self._tags = None + self._tags_id = None + self._team = None + self._timestamped = None + self._timestampedby = None + self._timestamped_at = None + self._type = None + self._uploads = None + self.discriminator = None + if access_key is not None: + self.access_key = access_key + if body_html is not None: + self.body_html = body_html + if category_color is not None: + self.category_color = category_color + if category_title is not None: + self.category_title = category_title + if changelog is not None: + self.changelog = changelog + if comments is not None: + self.comments = comments + if compounds_links is not None: + self.compounds_links = compounds_links + if created_at is not None: + self.created_at = created_at + if created_from_id is not None: + self.created_from_id = created_from_id + if created_from_type is not None: + self.created_from_type = created_from_type + if created_from_type_human is not None: + self.created_from_type_human = created_from_type_human + if elabid is not None: + self.elabid = elabid + if exclusive_edit_mode is not None: + self.exclusive_edit_mode = exclusive_edit_mode + if experiments_links is not None: + self.experiments_links = experiments_links + if firstname is not None: + self.firstname = firstname + if fullname is not None: + self.fullname = fullname + if hide_main_text is not None: + self.hide_main_text = hide_main_text + if id is not None: + self.id = id + if items_links is not None: + self.items_links = items_links + if lastchangeby is not None: + self.lastchangeby = lastchangeby + if lastname is not None: + self.lastname = lastname + if locked is not None: + self.locked = locked + if lockedby is not None: + self.lockedby = lockedby + if locked_at is not None: + self.locked_at = locked_at + if modified_at is not None: + self.modified_at = modified_at + if next_step is not None: + self.next_step = next_step + if orcid is not None: + self.orcid = orcid + if page is not None: + self.page = page + if recent_comment is not None: + self.recent_comment = recent_comment + if related_experiments_links is not None: + self.related_experiments_links = related_experiments_links + if related_items_links is not None: + self.related_items_links = related_items_links + if sharelink is not None: + self.sharelink = sharelink + if status_color is not None: + self.status_color = status_color + if status_title is not None: + self.status_title = status_title + if steps is not None: + self.steps = steps + if tags is not None: + self.tags = tags + if tags_id is not None: + self.tags_id = tags_id + if team is not None: + self.team = team + if timestamped is not None: + self.timestamped = timestamped + if timestampedby is not None: + self.timestampedby = timestampedby + if timestamped_at is not None: + self.timestamped_at = timestamped_at + if type is not None: + self.type = type + if uploads is not None: + self.uploads = uploads + EntityTemplateEditable.__init__(self, *args, **kwargs) + + @property + def access_key(self): + """Gets the access_key of this EntityTemplate. # noqa: E501 + + + :return: The access_key of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._access_key + + @access_key.setter + def access_key(self, access_key): + """Sets the access_key of this EntityTemplate. + + + :param access_key: The access_key of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._access_key = access_key + + @property + def body_html(self): + """Gets the body_html of this EntityTemplate. # noqa: E501 + + + :return: The body_html of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._body_html + + @body_html.setter + def body_html(self, body_html): + """Sets the body_html of this EntityTemplate. + + + :param body_html: The body_html of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._body_html = body_html + + @property + def category_color(self): + """Gets the category_color of this EntityTemplate. # noqa: E501 + + + :return: The category_color of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._category_color + + @category_color.setter + def category_color(self, category_color): + """Sets the category_color of this EntityTemplate. + + + :param category_color: The category_color of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._category_color = category_color + + @property + def category_title(self): + """Gets the category_title of this EntityTemplate. # noqa: E501 + + + :return: The category_title of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._category_title + + @category_title.setter + def category_title(self, category_title): + """Sets the category_title of this EntityTemplate. + + + :param category_title: The category_title of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._category_title = category_title + + @property + def changelog(self): + """Gets the changelog of this EntityTemplate. # noqa: E501 + + + :return: The changelog of this EntityTemplate. # noqa: E501 + :rtype: list[Changelog] + """ + return self._changelog + + @changelog.setter + def changelog(self, changelog): + """Sets the changelog of this EntityTemplate. + + + :param changelog: The changelog of this EntityTemplate. # noqa: E501 + :type: list[Changelog] + """ + + self._changelog = changelog + + @property + def comments(self): + """Gets the comments of this EntityTemplate. # noqa: E501 + + + :return: The comments of this EntityTemplate. # noqa: E501 + :rtype: list[Comment] + """ + return self._comments + + @comments.setter + def comments(self, comments): + """Sets the comments of this EntityTemplate. + + + :param comments: The comments of this EntityTemplate. # noqa: E501 + :type: list[Comment] + """ + + self._comments = comments + + @property + def compounds_links(self): + """Gets the compounds_links of this EntityTemplate. # noqa: E501 + + + :return: The compounds_links of this EntityTemplate. # noqa: E501 + :rtype: list[Compound] + """ + return self._compounds_links + + @compounds_links.setter + def compounds_links(self, compounds_links): + """Sets the compounds_links of this EntityTemplate. + + + :param compounds_links: The compounds_links of this EntityTemplate. # noqa: E501 + :type: list[Compound] + """ + + self._compounds_links = compounds_links + + @property + def created_at(self): + """Gets the created_at of this EntityTemplate. # noqa: E501 + + + :return: The created_at of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this EntityTemplate. + + + :param created_at: The created_at of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def created_from_id(self): + """Gets the created_from_id of this EntityTemplate. # noqa: E501 + + Id of the template used to create this entry. # noqa: E501 + + :return: The created_from_id of this EntityTemplate. # noqa: E501 + :rtype: int + """ + return self._created_from_id + + @created_from_id.setter + def created_from_id(self, created_from_id): + """Sets the created_from_id of this EntityTemplate. + + Id of the template used to create this entry. # noqa: E501 + + :param created_from_id: The created_from_id of this EntityTemplate. # noqa: E501 + :type: int + """ + + self._created_from_id = created_from_id + + @property + def created_from_type(self): + """Gets the created_from_type of this EntityTemplate. # noqa: E501 + + Type of the entity used to create this entry: template or concrete type if duplicate # noqa: E501 + + :return: The created_from_type of this EntityTemplate. # noqa: E501 + :rtype: int + """ + return self._created_from_type + + @created_from_type.setter + def created_from_type(self, created_from_type): + """Sets the created_from_type of this EntityTemplate. + + Type of the entity used to create this entry: template or concrete type if duplicate # noqa: E501 + + :param created_from_type: The created_from_type of this EntityTemplate. # noqa: E501 + :type: int + """ + + self._created_from_type = created_from_type + + @property + def created_from_type_human(self): + """Gets the created_from_type_human of this EntityTemplate. # noqa: E501 + + Human readable version of created_from_type integer. # noqa: E501 + + :return: The created_from_type_human of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._created_from_type_human + + @created_from_type_human.setter + def created_from_type_human(self, created_from_type_human): + """Sets the created_from_type_human of this EntityTemplate. + + Human readable version of created_from_type integer. # noqa: E501 + + :param created_from_type_human: The created_from_type_human of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._created_from_type_human = created_from_type_human + + @property + def elabid(self): + """Gets the elabid of this EntityTemplate. # noqa: E501 + + + :return: The elabid of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._elabid + + @elabid.setter + def elabid(self, elabid): + """Sets the elabid of this EntityTemplate. + + + :param elabid: The elabid of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._elabid = elabid + + @property + def exclusive_edit_mode(self): + """Gets the exclusive_edit_mode of this EntityTemplate. # noqa: E501 + + + :return: The exclusive_edit_mode of this EntityTemplate. # noqa: E501 + :rtype: ExclusiveEditMode + """ + return self._exclusive_edit_mode + + @exclusive_edit_mode.setter + def exclusive_edit_mode(self, exclusive_edit_mode): + """Sets the exclusive_edit_mode of this EntityTemplate. + + + :param exclusive_edit_mode: The exclusive_edit_mode of this EntityTemplate. # noqa: E501 + :type: ExclusiveEditMode + """ + + self._exclusive_edit_mode = exclusive_edit_mode + + @property + def experiments_links(self): + """Gets the experiments_links of this EntityTemplate. # noqa: E501 + + + :return: The experiments_links of this EntityTemplate. # noqa: E501 + :rtype: list[Link] + """ + return self._experiments_links + + @experiments_links.setter + def experiments_links(self, experiments_links): + """Sets the experiments_links of this EntityTemplate. + + + :param experiments_links: The experiments_links of this EntityTemplate. # noqa: E501 + :type: list[Link] + """ + + self._experiments_links = experiments_links + + @property + def firstname(self): + """Gets the firstname of this EntityTemplate. # noqa: E501 + + + :return: The firstname of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._firstname + + @firstname.setter + def firstname(self, firstname): + """Sets the firstname of this EntityTemplate. + + + :param firstname: The firstname of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._firstname = firstname + + @property + def fullname(self): + """Gets the fullname of this EntityTemplate. # noqa: E501 + + + :return: The fullname of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._fullname + + @fullname.setter + def fullname(self, fullname): + """Sets the fullname of this EntityTemplate. + + + :param fullname: The fullname of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._fullname = fullname + + @property + def hide_main_text(self): + """Gets the hide_main_text of this EntityTemplate. # noqa: E501 + + Hide the main text of an entry. When applied to templates, this setting also applies to derived entries. # noqa: E501 + + :return: The hide_main_text of this EntityTemplate. # noqa: E501 + :rtype: int + """ + return self._hide_main_text + + @hide_main_text.setter + def hide_main_text(self, hide_main_text): + """Sets the hide_main_text of this EntityTemplate. + + Hide the main text of an entry. When applied to templates, this setting also applies to derived entries. # noqa: E501 + + :param hide_main_text: The hide_main_text of this EntityTemplate. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if hide_main_text not in allowed_values: + raise ValueError( + "Invalid value for `hide_main_text` ({0}), must be one of {1}" # noqa: E501 + .format(hide_main_text, allowed_values) + ) + + self._hide_main_text = hide_main_text + + @property + def id(self): + """Gets the id of this EntityTemplate. # noqa: E501 + + + :return: The id of this EntityTemplate. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EntityTemplate. + + + :param id: The id of this EntityTemplate. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def items_links(self): + """Gets the items_links of this EntityTemplate. # noqa: E501 + + + :return: The items_links of this EntityTemplate. # noqa: E501 + :rtype: list[Link] + """ + return self._items_links + + @items_links.setter + def items_links(self, items_links): + """Sets the items_links of this EntityTemplate. + + + :param items_links: The items_links of this EntityTemplate. # noqa: E501 + :type: list[Link] + """ + + self._items_links = items_links + + @property + def lastchangeby(self): + """Gets the lastchangeby of this EntityTemplate. # noqa: E501 + + + :return: The lastchangeby of this EntityTemplate. # noqa: E501 + :rtype: int + """ + return self._lastchangeby + + @lastchangeby.setter + def lastchangeby(self, lastchangeby): + """Sets the lastchangeby of this EntityTemplate. + + + :param lastchangeby: The lastchangeby of this EntityTemplate. # noqa: E501 + :type: int + """ + + self._lastchangeby = lastchangeby + + @property + def lastname(self): + """Gets the lastname of this EntityTemplate. # noqa: E501 + + + :return: The lastname of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._lastname + + @lastname.setter + def lastname(self, lastname): + """Sets the lastname of this EntityTemplate. + + + :param lastname: The lastname of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._lastname = lastname + + @property + def locked(self): + """Gets the locked of this EntityTemplate. # noqa: E501 + + + :return: The locked of this EntityTemplate. # noqa: E501 + :rtype: int + """ + return self._locked + + @locked.setter + def locked(self, locked): + """Sets the locked of this EntityTemplate. + + + :param locked: The locked of this EntityTemplate. # noqa: E501 + :type: int + """ + + self._locked = locked + + @property + def lockedby(self): + """Gets the lockedby of this EntityTemplate. # noqa: E501 + + + :return: The lockedby of this EntityTemplate. # noqa: E501 + :rtype: int + """ + return self._lockedby + + @lockedby.setter + def lockedby(self, lockedby): + """Sets the lockedby of this EntityTemplate. + + + :param lockedby: The lockedby of this EntityTemplate. # noqa: E501 + :type: int + """ + + self._lockedby = lockedby + + @property + def locked_at(self): + """Gets the locked_at of this EntityTemplate. # noqa: E501 + + + :return: The locked_at of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._locked_at + + @locked_at.setter + def locked_at(self, locked_at): + """Sets the locked_at of this EntityTemplate. + + + :param locked_at: The locked_at of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._locked_at = locked_at + + @property + def modified_at(self): + """Gets the modified_at of this EntityTemplate. # noqa: E501 + + + :return: The modified_at of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._modified_at + + @modified_at.setter + def modified_at(self, modified_at): + """Sets the modified_at of this EntityTemplate. + + + :param modified_at: The modified_at of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._modified_at = modified_at + + @property + def next_step(self): + """Gets the next_step of this EntityTemplate. # noqa: E501 + + + :return: The next_step of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._next_step + + @next_step.setter + def next_step(self, next_step): + """Sets the next_step of this EntityTemplate. + + + :param next_step: The next_step of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._next_step = next_step + + @property + def orcid(self): + """Gets the orcid of this EntityTemplate. # noqa: E501 + + + :return: The orcid of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._orcid + + @orcid.setter + def orcid(self, orcid): + """Sets the orcid of this EntityTemplate. + + + :param orcid: The orcid of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._orcid = orcid + + @property + def page(self): + """Gets the page of this EntityTemplate. # noqa: E501 + + + :return: The page of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._page + + @page.setter + def page(self, page): + """Sets the page of this EntityTemplate. + + + :param page: The page of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._page = page + + @property + def recent_comment(self): + """Gets the recent_comment of this EntityTemplate. # noqa: E501 + + + :return: The recent_comment of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._recent_comment + + @recent_comment.setter + def recent_comment(self, recent_comment): + """Sets the recent_comment of this EntityTemplate. + + + :param recent_comment: The recent_comment of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._recent_comment = recent_comment + + @property + def related_experiments_links(self): + """Gets the related_experiments_links of this EntityTemplate. # noqa: E501 + + + :return: The related_experiments_links of this EntityTemplate. # noqa: E501 + :rtype: list[Link] + """ + return self._related_experiments_links + + @related_experiments_links.setter + def related_experiments_links(self, related_experiments_links): + """Sets the related_experiments_links of this EntityTemplate. + + + :param related_experiments_links: The related_experiments_links of this EntityTemplate. # noqa: E501 + :type: list[Link] + """ + + self._related_experiments_links = related_experiments_links + + @property + def related_items_links(self): + """Gets the related_items_links of this EntityTemplate. # noqa: E501 + + + :return: The related_items_links of this EntityTemplate. # noqa: E501 + :rtype: list[Link] + """ + return self._related_items_links + + @related_items_links.setter + def related_items_links(self, related_items_links): + """Sets the related_items_links of this EntityTemplate. + + + :param related_items_links: The related_items_links of this EntityTemplate. # noqa: E501 + :type: list[Link] + """ + + self._related_items_links = related_items_links + + @property + def sharelink(self): + """Gets the sharelink of this EntityTemplate. # noqa: E501 + + + :return: The sharelink of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._sharelink + + @sharelink.setter + def sharelink(self, sharelink): + """Sets the sharelink of this EntityTemplate. + + + :param sharelink: The sharelink of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._sharelink = sharelink + + @property + def status_color(self): + """Gets the status_color of this EntityTemplate. # noqa: E501 + + + :return: The status_color of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._status_color + + @status_color.setter + def status_color(self, status_color): + """Sets the status_color of this EntityTemplate. + + + :param status_color: The status_color of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._status_color = status_color + + @property + def status_title(self): + """Gets the status_title of this EntityTemplate. # noqa: E501 + + + :return: The status_title of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._status_title + + @status_title.setter + def status_title(self, status_title): + """Sets the status_title of this EntityTemplate. + + + :param status_title: The status_title of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._status_title = status_title + + @property + def steps(self): + """Gets the steps of this EntityTemplate. # noqa: E501 + + + :return: The steps of this EntityTemplate. # noqa: E501 + :rtype: list[Step] + """ + return self._steps + + @steps.setter + def steps(self, steps): + """Sets the steps of this EntityTemplate. + + + :param steps: The steps of this EntityTemplate. # noqa: E501 + :type: list[Step] + """ + + self._steps = steps + + @property + def tags(self): + """Gets the tags of this EntityTemplate. # noqa: E501 + + + :return: The tags of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._tags + + @tags.setter + def tags(self, tags): + """Sets the tags of this EntityTemplate. + + + :param tags: The tags of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._tags = tags + + @property + def tags_id(self): + """Gets the tags_id of this EntityTemplate. # noqa: E501 + + + :return: The tags_id of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._tags_id + + @tags_id.setter + def tags_id(self, tags_id): + """Sets the tags_id of this EntityTemplate. + + + :param tags_id: The tags_id of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._tags_id = tags_id + + @property + def team(self): + """Gets the team of this EntityTemplate. # noqa: E501 + + + :return: The team of this EntityTemplate. # noqa: E501 + :rtype: int + """ + return self._team + + @team.setter + def team(self, team): + """Sets the team of this EntityTemplate. + + + :param team: The team of this EntityTemplate. # noqa: E501 + :type: int + """ + + self._team = team + + @property + def timestamped(self): + """Gets the timestamped of this EntityTemplate. # noqa: E501 + + + :return: The timestamped of this EntityTemplate. # noqa: E501 + :rtype: int + """ + return self._timestamped + + @timestamped.setter + def timestamped(self, timestamped): + """Sets the timestamped of this EntityTemplate. + + + :param timestamped: The timestamped of this EntityTemplate. # noqa: E501 + :type: int + """ + + self._timestamped = timestamped + + @property + def timestampedby(self): + """Gets the timestampedby of this EntityTemplate. # noqa: E501 + + + :return: The timestampedby of this EntityTemplate. # noqa: E501 + :rtype: int + """ + return self._timestampedby + + @timestampedby.setter + def timestampedby(self, timestampedby): + """Sets the timestampedby of this EntityTemplate. + + + :param timestampedby: The timestampedby of this EntityTemplate. # noqa: E501 + :type: int + """ + + self._timestampedby = timestampedby + + @property + def timestamped_at(self): + """Gets the timestamped_at of this EntityTemplate. # noqa: E501 + + + :return: The timestamped_at of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._timestamped_at + + @timestamped_at.setter + def timestamped_at(self, timestamped_at): + """Sets the timestamped_at of this EntityTemplate. + + + :param timestamped_at: The timestamped_at of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._timestamped_at = timestamped_at + + @property + def type(self): + """Gets the type of this EntityTemplate. # noqa: E501 + + + :return: The type of this EntityTemplate. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EntityTemplate. + + + :param type: The type of this EntityTemplate. # noqa: E501 + :type: str + """ + + self._type = type + + @property + def uploads(self): + """Gets the uploads of this EntityTemplate. # noqa: E501 + + + :return: The uploads of this EntityTemplate. # noqa: E501 + :rtype: list[Upload] + """ + return self._uploads + + @uploads.setter + def uploads(self, uploads): + """Sets the uploads of this EntityTemplate. + + + :param uploads: The uploads of this EntityTemplate. # noqa: E501 + :type: list[Upload] + """ + + self._uploads = uploads + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityTemplate, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityTemplate): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/entity_template_editable.py b/vendor/elabapi-python/elabapi_python/models/entity_template_editable.py new file mode 100644 index 0000000..e809e3e --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/entity_template_editable.py @@ -0,0 +1,146 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from elabapi_python.models.entity_editable import EntityEditable # noqa: F401,E501 + +class EntityTemplateEditable(EntityEditable): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'canread_is_immutable': 'int', + 'canwrite_is_immutable': 'int' + } + if hasattr(EntityEditable, "swagger_types"): + swagger_types.update(EntityEditable.swagger_types) + + attribute_map = { + 'canread_is_immutable': 'canread_is_immutable', + 'canwrite_is_immutable': 'canwrite_is_immutable' + } + if hasattr(EntityEditable, "attribute_map"): + attribute_map.update(EntityEditable.attribute_map) + + def __init__(self, canread_is_immutable=0, canwrite_is_immutable=0, *args, **kwargs): # noqa: E501 + """EntityTemplateEditable - a model defined in Swagger""" # noqa: E501 + self._canread_is_immutable = None + self._canwrite_is_immutable = None + self.discriminator = None + if canread_is_immutable is not None: + self.canread_is_immutable = canread_is_immutable + if canwrite_is_immutable is not None: + self.canwrite_is_immutable = canwrite_is_immutable + EntityEditable.__init__(self, *args, **kwargs) + + @property + def canread_is_immutable(self): + """Gets the canread_is_immutable of this EntityTemplateEditable. # noqa: E501 + + Set to 1 to prevent further changes to the permissions setting for read access # noqa: E501 + + :return: The canread_is_immutable of this EntityTemplateEditable. # noqa: E501 + :rtype: int + """ + return self._canread_is_immutable + + @canread_is_immutable.setter + def canread_is_immutable(self, canread_is_immutable): + """Sets the canread_is_immutable of this EntityTemplateEditable. + + Set to 1 to prevent further changes to the permissions setting for read access # noqa: E501 + + :param canread_is_immutable: The canread_is_immutable of this EntityTemplateEditable. # noqa: E501 + :type: int + """ + + self._canread_is_immutable = canread_is_immutable + + @property + def canwrite_is_immutable(self): + """Gets the canwrite_is_immutable of this EntityTemplateEditable. # noqa: E501 + + Set to 1 to prevent further changes to the permissions setting for write access # noqa: E501 + + :return: The canwrite_is_immutable of this EntityTemplateEditable. # noqa: E501 + :rtype: int + """ + return self._canwrite_is_immutable + + @canwrite_is_immutable.setter + def canwrite_is_immutable(self, canwrite_is_immutable): + """Sets the canwrite_is_immutable of this EntityTemplateEditable. + + Set to 1 to prevent further changes to the permissions setting for write access # noqa: E501 + + :param canwrite_is_immutable: The canwrite_is_immutable of this EntityTemplateEditable. # noqa: E501 + :type: int + """ + + self._canwrite_is_immutable = canwrite_is_immutable + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityTemplateEditable, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityTemplateEditable): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/error.py b/vendor/elabapi-python/elabapi_python/models/error.py new file mode 100644 index 0000000..1577787 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/error.py @@ -0,0 +1,165 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Error(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'code': 'str', + 'message': 'str', + 'description': 'str' + } + + attribute_map = { + 'code': 'code', + 'message': 'message', + 'description': 'description' + } + + def __init__(self, code=None, message=None, description=None): # noqa: E501 + """Error - a model defined in Swagger""" # noqa: E501 + self._code = None + self._message = None + self._description = None + self.discriminator = None + self.code = code + self.message = message + self.description = description + + @property + def code(self): + """Gets the code of this Error. # noqa: E501 + + + :return: The code of this Error. # noqa: E501 + :rtype: str + """ + return self._code + + @code.setter + def code(self, code): + """Sets the code of this Error. + + + :param code: The code of this Error. # noqa: E501 + :type: str + """ + if code is None: + raise ValueError("Invalid value for `code`, must not be `None`") # noqa: E501 + + self._code = code + + @property + def message(self): + """Gets the message of this Error. # noqa: E501 + + + :return: The message of this Error. # noqa: E501 + :rtype: str + """ + return self._message + + @message.setter + def message(self, message): + """Sets the message of this Error. + + + :param message: The message of this Error. # noqa: E501 + :type: str + """ + if message is None: + raise ValueError("Invalid value for `message`, must not be `None`") # noqa: E501 + + self._message = message + + @property + def description(self): + """Gets the description of this Error. # noqa: E501 + + + :return: The description of this Error. # noqa: E501 + :rtype: str + """ + return self._description + + @description.setter + def description(self, description): + """Sets the description of this Error. + + + :param description: The description of this Error. # noqa: E501 + :type: str + """ + if description is None: + raise ValueError("Invalid value for `description`, must not be `None`") # noqa: E501 + + self._description = description + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Error, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Error): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/event.py b/vendor/elabapi-python/elabapi_python/models/event.py new file mode 100644 index 0000000..15334b0 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/event.py @@ -0,0 +1,726 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Event(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'team': 'int', + 'team_name': 'str', + 'title': 'str', + 'title_only': 'str', + 'book_cancel_minutes': 'int', + 'book_is_cancellable': 'int', + 'canbook': 'int', + 'created_at': 'datetime', + 'modified_at': 'datetime', + 'start': 'datetime', + 'end': 'datetime', + 'event_duration_minutes': 'int', + 'userid': 'int', + 'fullname': 'str', + 'experiment': 'int', + 'experiment_title': 'str', + 'items_id': 'int', + 'item_title': 'str', + 'items_category': 'int', + 'items_category_title': 'str', + 'item_link': 'int', + 'item_link_title': 'str', + 'color': 'str' + } + + attribute_map = { + 'id': 'id', + 'team': 'team', + 'team_name': 'team_name', + 'title': 'title', + 'title_only': 'title_only', + 'book_cancel_minutes': 'book_cancel_minutes', + 'book_is_cancellable': 'book_is_cancellable', + 'canbook': 'canbook', + 'created_at': 'created_at', + 'modified_at': 'modified_at', + 'start': 'start', + 'end': 'end', + 'event_duration_minutes': 'event_duration_minutes', + 'userid': 'userid', + 'fullname': 'fullname', + 'experiment': 'experiment', + 'experiment_title': 'experiment_title', + 'items_id': 'items_id', + 'item_title': 'item_title', + 'items_category': 'items_category', + 'items_category_title': 'items_category_title', + 'item_link': 'item_link', + 'item_link_title': 'item_link_title', + 'color': 'color' + } + + def __init__(self, id=None, team=None, team_name=None, title=None, title_only=None, book_cancel_minutes=None, book_is_cancellable=None, canbook=None, created_at=None, modified_at=None, start=None, end=None, event_duration_minutes=None, userid=None, fullname=None, experiment=None, experiment_title=None, items_id=None, item_title=None, items_category=None, items_category_title=None, item_link=None, item_link_title=None, color=None): # noqa: E501 + """Event - a model defined in Swagger""" # noqa: E501 + self._id = None + self._team = None + self._team_name = None + self._title = None + self._title_only = None + self._book_cancel_minutes = None + self._book_is_cancellable = None + self._canbook = None + self._created_at = None + self._modified_at = None + self._start = None + self._end = None + self._event_duration_minutes = None + self._userid = None + self._fullname = None + self._experiment = None + self._experiment_title = None + self._items_id = None + self._item_title = None + self._items_category = None + self._items_category_title = None + self._item_link = None + self._item_link_title = None + self._color = None + self.discriminator = None + if id is not None: + self.id = id + if team is not None: + self.team = team + if team_name is not None: + self.team_name = team_name + if title is not None: + self.title = title + if title_only is not None: + self.title_only = title_only + if book_cancel_minutes is not None: + self.book_cancel_minutes = book_cancel_minutes + if book_is_cancellable is not None: + self.book_is_cancellable = book_is_cancellable + if canbook is not None: + self.canbook = canbook + if created_at is not None: + self.created_at = created_at + if modified_at is not None: + self.modified_at = modified_at + if start is not None: + self.start = start + if end is not None: + self.end = end + if event_duration_minutes is not None: + self.event_duration_minutes = event_duration_minutes + if userid is not None: + self.userid = userid + if fullname is not None: + self.fullname = fullname + if experiment is not None: + self.experiment = experiment + if experiment_title is not None: + self.experiment_title = experiment_title + if items_id is not None: + self.items_id = items_id + if item_title is not None: + self.item_title = item_title + if items_category is not None: + self.items_category = items_category + if items_category_title is not None: + self.items_category_title = items_category_title + if item_link is not None: + self.item_link = item_link + if item_link_title is not None: + self.item_link_title = item_link_title + if color is not None: + self.color = color + + @property + def id(self): + """Gets the id of this Event. # noqa: E501 + + + :return: The id of this Event. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Event. + + + :param id: The id of this Event. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def team(self): + """Gets the team of this Event. # noqa: E501 + + + :return: The team of this Event. # noqa: E501 + :rtype: int + """ + return self._team + + @team.setter + def team(self, team): + """Sets the team of this Event. + + + :param team: The team of this Event. # noqa: E501 + :type: int + """ + + self._team = team + + @property + def team_name(self): + """Gets the team_name of this Event. # noqa: E501 + + + :return: The team_name of this Event. # noqa: E501 + :rtype: str + """ + return self._team_name + + @team_name.setter + def team_name(self, team_name): + """Sets the team_name of this Event. + + + :param team_name: The team_name of this Event. # noqa: E501 + :type: str + """ + + self._team_name = team_name + + @property + def title(self): + """Gets the title of this Event. # noqa: E501 + + Optional comment added to the event # noqa: E501 + + :return: The title of this Event. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this Event. + + Optional comment added to the event # noqa: E501 + + :param title: The title of this Event. # noqa: E501 + :type: str + """ + + self._title = title + + @property + def title_only(self): + """Gets the title_only of this Event. # noqa: E501 + + Title of the event. # noqa: E501 + + :return: The title_only of this Event. # noqa: E501 + :rtype: str + """ + return self._title_only + + @title_only.setter + def title_only(self, title_only): + """Sets the title_only of this Event. + + Title of the event. # noqa: E501 + + :param title_only: The title_only of this Event. # noqa: E501 + :type: str + """ + + self._title_only = title_only + + @property + def book_cancel_minutes(self): + """Gets the book_cancel_minutes of this Event. # noqa: E501 + + Minutes before start when cancellation is allowed # noqa: E501 + + :return: The book_cancel_minutes of this Event. # noqa: E501 + :rtype: int + """ + return self._book_cancel_minutes + + @book_cancel_minutes.setter + def book_cancel_minutes(self, book_cancel_minutes): + """Sets the book_cancel_minutes of this Event. + + Minutes before start when cancellation is allowed # noqa: E501 + + :param book_cancel_minutes: The book_cancel_minutes of this Event. # noqa: E501 + :type: int + """ + + self._book_cancel_minutes = book_cancel_minutes + + @property + def book_is_cancellable(self): + """Gets the book_is_cancellable of this Event. # noqa: E501 + + Whether the booking can be cancelled (1 = yes, 0 = no) # noqa: E501 + + :return: The book_is_cancellable of this Event. # noqa: E501 + :rtype: int + """ + return self._book_is_cancellable + + @book_is_cancellable.setter + def book_is_cancellable(self, book_is_cancellable): + """Sets the book_is_cancellable of this Event. + + Whether the booking can be cancelled (1 = yes, 0 = no) # noqa: E501 + + :param book_is_cancellable: The book_is_cancellable of this Event. # noqa: E501 + :type: int + """ + + self._book_is_cancellable = book_is_cancellable + + @property + def canbook(self): + """Gets the canbook of this Event. # noqa: E501 + + Whether the event is bookable (1 = yes, 0 = no) # noqa: E501 + + :return: The canbook of this Event. # noqa: E501 + :rtype: int + """ + return self._canbook + + @canbook.setter + def canbook(self, canbook): + """Sets the canbook of this Event. + + Whether the event is bookable (1 = yes, 0 = no) # noqa: E501 + + :param canbook: The canbook of this Event. # noqa: E501 + :type: int + """ + + self._canbook = canbook + + @property + def created_at(self): + """Gets the created_at of this Event. # noqa: E501 + + + :return: The created_at of this Event. # noqa: E501 + :rtype: datetime + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this Event. + + + :param created_at: The created_at of this Event. # noqa: E501 + :type: datetime + """ + + self._created_at = created_at + + @property + def modified_at(self): + """Gets the modified_at of this Event. # noqa: E501 + + + :return: The modified_at of this Event. # noqa: E501 + :rtype: datetime + """ + return self._modified_at + + @modified_at.setter + def modified_at(self, modified_at): + """Sets the modified_at of this Event. + + + :param modified_at: The modified_at of this Event. # noqa: E501 + :type: datetime + """ + + self._modified_at = modified_at + + @property + def start(self): + """Gets the start of this Event. # noqa: E501 + + + :return: The start of this Event. # noqa: E501 + :rtype: datetime + """ + return self._start + + @start.setter + def start(self, start): + """Sets the start of this Event. + + + :param start: The start of this Event. # noqa: E501 + :type: datetime + """ + + self._start = start + + @property + def end(self): + """Gets the end of this Event. # noqa: E501 + + + :return: The end of this Event. # noqa: E501 + :rtype: datetime + """ + return self._end + + @end.setter + def end(self, end): + """Sets the end of this Event. + + + :param end: The end of this Event. # noqa: E501 + :type: datetime + """ + + self._end = end + + @property + def event_duration_minutes(self): + """Gets the event_duration_minutes of this Event. # noqa: E501 + + + :return: The event_duration_minutes of this Event. # noqa: E501 + :rtype: int + """ + return self._event_duration_minutes + + @event_duration_minutes.setter + def event_duration_minutes(self, event_duration_minutes): + """Sets the event_duration_minutes of this Event. + + + :param event_duration_minutes: The event_duration_minutes of this Event. # noqa: E501 + :type: int + """ + + self._event_duration_minutes = event_duration_minutes + + @property + def userid(self): + """Gets the userid of this Event. # noqa: E501 + + + :return: The userid of this Event. # noqa: E501 + :rtype: int + """ + return self._userid + + @userid.setter + def userid(self, userid): + """Sets the userid of this Event. + + + :param userid: The userid of this Event. # noqa: E501 + :type: int + """ + + self._userid = userid + + @property + def fullname(self): + """Gets the fullname of this Event. # noqa: E501 + + Full name of the user who created the event. # noqa: E501 + + :return: The fullname of this Event. # noqa: E501 + :rtype: str + """ + return self._fullname + + @fullname.setter + def fullname(self, fullname): + """Sets the fullname of this Event. + + Full name of the user who created the event. # noqa: E501 + + :param fullname: The fullname of this Event. # noqa: E501 + :type: str + """ + + self._fullname = fullname + + @property + def experiment(self): + """Gets the experiment of this Event. # noqa: E501 + + + :return: The experiment of this Event. # noqa: E501 + :rtype: int + """ + return self._experiment + + @experiment.setter + def experiment(self, experiment): + """Sets the experiment of this Event. + + + :param experiment: The experiment of this Event. # noqa: E501 + :type: int + """ + + self._experiment = experiment + + @property + def experiment_title(self): + """Gets the experiment_title of this Event. # noqa: E501 + + The experiment that has been bound to the event. # noqa: E501 + + :return: The experiment_title of this Event. # noqa: E501 + :rtype: str + """ + return self._experiment_title + + @experiment_title.setter + def experiment_title(self, experiment_title): + """Sets the experiment_title of this Event. + + The experiment that has been bound to the event. # noqa: E501 + + :param experiment_title: The experiment_title of this Event. # noqa: E501 + :type: str + """ + + self._experiment_title = experiment_title + + @property + def items_id(self): + """Gets the items_id of this Event. # noqa: E501 + + ID of the Resource being booked # noqa: E501 + + :return: The items_id of this Event. # noqa: E501 + :rtype: int + """ + return self._items_id + + @items_id.setter + def items_id(self, items_id): + """Sets the items_id of this Event. + + ID of the Resource being booked # noqa: E501 + + :param items_id: The items_id of this Event. # noqa: E501 + :type: int + """ + + self._items_id = items_id + + @property + def item_title(self): + """Gets the item_title of this Event. # noqa: E501 + + + :return: The item_title of this Event. # noqa: E501 + :rtype: str + """ + return self._item_title + + @item_title.setter + def item_title(self, item_title): + """Sets the item_title of this Event. + + + :param item_title: The item_title of this Event. # noqa: E501 + :type: str + """ + + self._item_title = item_title + + @property + def items_category(self): + """Gets the items_category of this Event. # noqa: E501 + + + :return: The items_category of this Event. # noqa: E501 + :rtype: int + """ + return self._items_category + + @items_category.setter + def items_category(self, items_category): + """Sets the items_category of this Event. + + + :param items_category: The items_category of this Event. # noqa: E501 + :type: int + """ + + self._items_category = items_category + + @property + def items_category_title(self): + """Gets the items_category_title of this Event. # noqa: E501 + + + :return: The items_category_title of this Event. # noqa: E501 + :rtype: str + """ + return self._items_category_title + + @items_category_title.setter + def items_category_title(self, items_category_title): + """Sets the items_category_title of this Event. + + + :param items_category_title: The items_category_title of this Event. # noqa: E501 + :type: str + """ + + self._items_category_title = items_category_title + + @property + def item_link(self): + """Gets the item_link of this Event. # noqa: E501 + + + :return: The item_link of this Event. # noqa: E501 + :rtype: int + """ + return self._item_link + + @item_link.setter + def item_link(self, item_link): + """Sets the item_link of this Event. + + + :param item_link: The item_link of this Event. # noqa: E501 + :type: int + """ + + self._item_link = item_link + + @property + def item_link_title(self): + """Gets the item_link_title of this Event. # noqa: E501 + + The item that has been bound to the event. # noqa: E501 + + :return: The item_link_title of this Event. # noqa: E501 + :rtype: str + """ + return self._item_link_title + + @item_link_title.setter + def item_link_title(self, item_link_title): + """Sets the item_link_title of this Event. + + The item that has been bound to the event. # noqa: E501 + + :param item_link_title: The item_link_title of this Event. # noqa: E501 + :type: str + """ + + self._item_link_title = item_link_title + + @property + def color(self): + """Gets the color of this Event. # noqa: E501 + + + :return: The color of this Event. # noqa: E501 + :rtype: str + """ + return self._color + + @color.setter + def color(self, color): + """Sets the color of this Event. + + + :param color: The color of this Event. # noqa: E501 + :type: str + """ + + self._color = color + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Event, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Event): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/event_id_body.py b/vendor/elabapi-python/elabapi_python/models/event_id_body.py new file mode 100644 index 0000000..78d3bd6 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/event_id_body.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EventIdBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """EventIdBody - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EventIdBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EventIdBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/eventid_delta.py b/vendor/elabapi-python/elabapi_python/models/eventid_delta.py new file mode 100644 index 0000000..28107e2 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/eventid_delta.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EventidDelta(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'days': 'int', + 'milliseconds': 'int', + 'months': 'int', + 'years': 'int' + } + + attribute_map = { + 'days': 'days', + 'milliseconds': 'milliseconds', + 'months': 'months', + 'years': 'years' + } + + def __init__(self, days=None, milliseconds=None, months=None, years=None): # noqa: E501 + """EventidDelta - a model defined in Swagger""" # noqa: E501 + self._days = None + self._milliseconds = None + self._months = None + self._years = None + self.discriminator = None + if days is not None: + self.days = days + if milliseconds is not None: + self.milliseconds = milliseconds + if months is not None: + self.months = months + if years is not None: + self.years = years + + @property + def days(self): + """Gets the days of this EventidDelta. # noqa: E501 + + + :return: The days of this EventidDelta. # noqa: E501 + :rtype: int + """ + return self._days + + @days.setter + def days(self, days): + """Sets the days of this EventidDelta. + + + :param days: The days of this EventidDelta. # noqa: E501 + :type: int + """ + + self._days = days + + @property + def milliseconds(self): + """Gets the milliseconds of this EventidDelta. # noqa: E501 + + + :return: The milliseconds of this EventidDelta. # noqa: E501 + :rtype: int + """ + return self._milliseconds + + @milliseconds.setter + def milliseconds(self, milliseconds): + """Sets the milliseconds of this EventidDelta. + + + :param milliseconds: The milliseconds of this EventidDelta. # noqa: E501 + :type: int + """ + + self._milliseconds = milliseconds + + @property + def months(self): + """Gets the months of this EventidDelta. # noqa: E501 + + + :return: The months of this EventidDelta. # noqa: E501 + :rtype: int + """ + return self._months + + @months.setter + def months(self, months): + """Sets the months of this EventidDelta. + + + :param months: The months of this EventidDelta. # noqa: E501 + :type: int + """ + + self._months = months + + @property + def years(self): + """Gets the years of this EventidDelta. # noqa: E501 + + + :return: The years of this EventidDelta. # noqa: E501 + :rtype: int + """ + return self._years + + @years.setter + def years(self, years): + """Sets the years of this EventidDelta. + + + :param years: The years of this EventidDelta. # noqa: E501 + :type: int + """ + + self._years = years + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EventidDelta, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EventidDelta): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/events_id_body.py b/vendor/elabapi-python/elabapi_python/models/events_id_body.py new file mode 100644 index 0000000..8b34b0e --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/events_id_body.py @@ -0,0 +1,168 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EventsIdBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'title': 'str', + 'start': 'datetime', + 'end': 'datetime' + } + + attribute_map = { + 'title': 'title', + 'start': 'start', + 'end': 'end' + } + + def __init__(self, title='Untitled', start=None, end=None): # noqa: E501 + """EventsIdBody - a model defined in Swagger""" # noqa: E501 + self._title = None + self._start = None + self._end = None + self.discriminator = None + if title is not None: + self.title = title + if start is not None: + self.start = start + if end is not None: + self.end = end + + @property + def title(self): + """Gets the title of this EventsIdBody. # noqa: E501 + + A name for this booking slot. # noqa: E501 + + :return: The title of this EventsIdBody. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this EventsIdBody. + + A name for this booking slot. # noqa: E501 + + :param title: The title of this EventsIdBody. # noqa: E501 + :type: str + """ + + self._title = title + + @property + def start(self): + """Gets the start of this EventsIdBody. # noqa: E501 + + ISO 8601 date-time with timezone offset. # noqa: E501 + + :return: The start of this EventsIdBody. # noqa: E501 + :rtype: datetime + """ + return self._start + + @start.setter + def start(self, start): + """Sets the start of this EventsIdBody. + + ISO 8601 date-time with timezone offset. # noqa: E501 + + :param start: The start of this EventsIdBody. # noqa: E501 + :type: datetime + """ + + self._start = start + + @property + def end(self): + """Gets the end of this EventsIdBody. # noqa: E501 + + ISO 8601 date-time with timezone offset. # noqa: E501 + + :return: The end of this EventsIdBody. # noqa: E501 + :rtype: datetime + """ + return self._end + + @end.setter + def end(self, end): + """Sets the end of this EventsIdBody. + + ISO 8601 date-time with timezone offset. # noqa: E501 + + :param end: The end of this EventsIdBody. # noqa: E501 + :type: datetime + """ + + self._end = end + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EventsIdBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EventsIdBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/exclusive_edit_mode.py b/vendor/elabapi-python/elabapi_python/models/exclusive_edit_mode.py new file mode 100644 index 0000000..0bbacf7 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/exclusive_edit_mode.py @@ -0,0 +1,196 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ExclusiveEditMode(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'locked_by': 'int', + 'locked_by_human': 'str', + 'locked_at': 'str', + 'is_stale': 'int' + } + + attribute_map = { + 'locked_by': 'locked_by', + 'locked_by_human': 'locked_by_human', + 'locked_at': 'locked_at', + 'is_stale': 'is_stale' + } + + def __init__(self, locked_by=None, locked_by_human=None, locked_at=None, is_stale=None): # noqa: E501 + """ExclusiveEditMode - a model defined in Swagger""" # noqa: E501 + self._locked_by = None + self._locked_by_human = None + self._locked_at = None + self._is_stale = None + self.discriminator = None + if locked_by is not None: + self.locked_by = locked_by + if locked_by_human is not None: + self.locked_by_human = locked_by_human + if locked_at is not None: + self.locked_at = locked_at + if is_stale is not None: + self.is_stale = is_stale + + @property + def locked_by(self): + """Gets the locked_by of this ExclusiveEditMode. # noqa: E501 + + Userid of the user having exclusive edition rights # noqa: E501 + + :return: The locked_by of this ExclusiveEditMode. # noqa: E501 + :rtype: int + """ + return self._locked_by + + @locked_by.setter + def locked_by(self, locked_by): + """Sets the locked_by of this ExclusiveEditMode. + + Userid of the user having exclusive edition rights # noqa: E501 + + :param locked_by: The locked_by of this ExclusiveEditMode. # noqa: E501 + :type: int + """ + + self._locked_by = locked_by + + @property + def locked_by_human(self): + """Gets the locked_by_human of this ExclusiveEditMode. # noqa: E501 + + Full name of the user having exclusive edition rights # noqa: E501 + + :return: The locked_by_human of this ExclusiveEditMode. # noqa: E501 + :rtype: str + """ + return self._locked_by_human + + @locked_by_human.setter + def locked_by_human(self, locked_by_human): + """Sets the locked_by_human of this ExclusiveEditMode. + + Full name of the user having exclusive edition rights # noqa: E501 + + :param locked_by_human: The locked_by_human of this ExclusiveEditMode. # noqa: E501 + :type: str + """ + + self._locked_by_human = locked_by_human + + @property + def locked_at(self): + """Gets the locked_at of this ExclusiveEditMode. # noqa: E501 + + Time when the exclusive edit mode was created # noqa: E501 + + :return: The locked_at of this ExclusiveEditMode. # noqa: E501 + :rtype: str + """ + return self._locked_at + + @locked_at.setter + def locked_at(self, locked_at): + """Sets the locked_at of this ExclusiveEditMode. + + Time when the exclusive edit mode was created # noqa: E501 + + :param locked_at: The locked_at of this ExclusiveEditMode. # noqa: E501 + :type: str + """ + + self._locked_at = locked_at + + @property + def is_stale(self): + """Gets the is_stale of this ExclusiveEditMode. # noqa: E501 + + Is 1 when the exclusive edit lock is longer than ExclusiveEditMode::EXPIRATION_MINUTES # noqa: E501 + + :return: The is_stale of this ExclusiveEditMode. # noqa: E501 + :rtype: int + """ + return self._is_stale + + @is_stale.setter + def is_stale(self, is_stale): + """Sets the is_stale of this ExclusiveEditMode. + + Is 1 when the exclusive edit lock is longer than ExclusiveEditMode::EXPIRATION_MINUTES # noqa: E501 + + :param is_stale: The is_stale of this ExclusiveEditMode. # noqa: E501 + :type: int + """ + + self._is_stale = is_stale + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ExclusiveEditMode, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ExclusiveEditMode): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/experiment.py b/vendor/elabapi-python/elabapi_python/models/experiment.py new file mode 100644 index 0000000..a3e5a22 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/experiment.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from elabapi_python.models.entity import Entity # noqa: F401,E501 + +class Experiment(Entity): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + if hasattr(Entity, "swagger_types"): + swagger_types.update(Entity.swagger_types) + + attribute_map = { + } + if hasattr(Entity, "attribute_map"): + attribute_map.update(Entity.attribute_map) + + def __init__(self, *args, **kwargs): # noqa: E501 + """Experiment - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + Entity.__init__(self, *args, **kwargs) + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Experiment, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Experiment): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/experiments_links_subid_body.py b/vendor/elabapi-python/elabapi_python/models/experiments_links_subid_body.py new file mode 100644 index 0000000..003b9c0 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/experiments_links_subid_body.py @@ -0,0 +1,118 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ExperimentsLinksSubidBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str' + } + + attribute_map = { + 'action': 'action' + } + + def __init__(self, action=None): # noqa: E501 + """ExperimentsLinksSubidBody - a model defined in Swagger""" # noqa: E501 + self._action = None + self.discriminator = None + if action is not None: + self.action = action + + @property + def action(self): + """Gets the action of this ExperimentsLinksSubidBody. # noqa: E501 + + The `duplicate` action will import the links of that link (inception). # noqa: E501 + + :return: The action of this ExperimentsLinksSubidBody. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this ExperimentsLinksSubidBody. + + The `duplicate` action will import the links of that link (inception). # noqa: E501 + + :param action: The action of this ExperimentsLinksSubidBody. # noqa: E501 + :type: str + """ + allowed_values = ["create", "duplicate"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ExperimentsLinksSubidBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ExperimentsLinksSubidBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/experiments_templates_id_body.py b/vendor/elabapi-python/elabapi_python/models/experiments_templates_id_body.py new file mode 100644 index 0000000..065891a --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/experiments_templates_id_body.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ExperimentsTemplatesIdBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """ExperimentsTemplatesIdBody - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ExperimentsTemplatesIdBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ExperimentsTemplatesIdBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/export.py b/vendor/elabapi-python/elabapi_python/models/export.py new file mode 100644 index 0000000..0cca48b --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/export.py @@ -0,0 +1,578 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Export(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'created_at': 'str', + 'requester_userid': 'int', + 'state': 'int', + 'long_name': 'str', + 'filesize': 'int', + 'modified_at': 'str', + 'real_name': 'str', + 'team': 'int', + 'changelog': 'int', + 'pdfa': 'int', + 'json': 'int', + 'hash': 'str', + 'hash_algo': 'str', + 'experiments': 'int', + 'items': 'int', + 'experiments_templates': 'int', + 'items_types': 'int', + 'format': 'str' + } + + attribute_map = { + 'id': 'id', + 'created_at': 'created_at', + 'requester_userid': 'requester_userid', + 'state': 'state', + 'long_name': 'long_name', + 'filesize': 'filesize', + 'modified_at': 'modified_at', + 'real_name': 'real_name', + 'team': 'team', + 'changelog': 'changelog', + 'pdfa': 'pdfa', + 'json': 'json', + 'hash': 'hash', + 'hash_algo': 'hash_algo', + 'experiments': 'experiments', + 'items': 'items', + 'experiments_templates': 'experiments_templates', + 'items_types': 'items_types', + 'format': 'format' + } + + def __init__(self, id=None, created_at=None, requester_userid=None, state=None, long_name=None, filesize=None, modified_at=None, real_name=None, team=None, changelog=None, pdfa=None, json=None, hash=None, hash_algo=None, experiments=None, items=None, experiments_templates=None, items_types=None, format=None): # noqa: E501 + """Export - a model defined in Swagger""" # noqa: E501 + self._id = None + self._created_at = None + self._requester_userid = None + self._state = None + self._long_name = None + self._filesize = None + self._modified_at = None + self._real_name = None + self._team = None + self._changelog = None + self._pdfa = None + self._json = None + self._hash = None + self._hash_algo = None + self._experiments = None + self._items = None + self._experiments_templates = None + self._items_types = None + self._format = None + self.discriminator = None + if id is not None: + self.id = id + if created_at is not None: + self.created_at = created_at + if requester_userid is not None: + self.requester_userid = requester_userid + if state is not None: + self.state = state + if long_name is not None: + self.long_name = long_name + if filesize is not None: + self.filesize = filesize + if modified_at is not None: + self.modified_at = modified_at + if real_name is not None: + self.real_name = real_name + if team is not None: + self.team = team + if changelog is not None: + self.changelog = changelog + if pdfa is not None: + self.pdfa = pdfa + if json is not None: + self.json = json + if hash is not None: + self.hash = hash + if hash_algo is not None: + self.hash_algo = hash_algo + if experiments is not None: + self.experiments = experiments + if items is not None: + self.items = items + if experiments_templates is not None: + self.experiments_templates = experiments_templates + if items_types is not None: + self.items_types = items_types + if format is not None: + self.format = format + + @property + def id(self): + """Gets the id of this Export. # noqa: E501 + + + :return: The id of this Export. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Export. + + + :param id: The id of this Export. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def created_at(self): + """Gets the created_at of this Export. # noqa: E501 + + + :return: The created_at of this Export. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this Export. + + + :param created_at: The created_at of this Export. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def requester_userid(self): + """Gets the requester_userid of this Export. # noqa: E501 + + + :return: The requester_userid of this Export. # noqa: E501 + :rtype: int + """ + return self._requester_userid + + @requester_userid.setter + def requester_userid(self, requester_userid): + """Sets the requester_userid of this Export. + + + :param requester_userid: The requester_userid of this Export. # noqa: E501 + :type: int + """ + + self._requester_userid = requester_userid + + @property + def state(self): + """Gets the state of this Export. # noqa: E501 + + + :return: The state of this Export. # noqa: E501 + :rtype: int + """ + return self._state + + @state.setter + def state(self, state): + """Sets the state of this Export. + + + :param state: The state of this Export. # noqa: E501 + :type: int + """ + + self._state = state + + @property + def long_name(self): + """Gets the long_name of this Export. # noqa: E501 + + + :return: The long_name of this Export. # noqa: E501 + :rtype: str + """ + return self._long_name + + @long_name.setter + def long_name(self, long_name): + """Sets the long_name of this Export. + + + :param long_name: The long_name of this Export. # noqa: E501 + :type: str + """ + + self._long_name = long_name + + @property + def filesize(self): + """Gets the filesize of this Export. # noqa: E501 + + + :return: The filesize of this Export. # noqa: E501 + :rtype: int + """ + return self._filesize + + @filesize.setter + def filesize(self, filesize): + """Sets the filesize of this Export. + + + :param filesize: The filesize of this Export. # noqa: E501 + :type: int + """ + + self._filesize = filesize + + @property + def modified_at(self): + """Gets the modified_at of this Export. # noqa: E501 + + + :return: The modified_at of this Export. # noqa: E501 + :rtype: str + """ + return self._modified_at + + @modified_at.setter + def modified_at(self, modified_at): + """Sets the modified_at of this Export. + + + :param modified_at: The modified_at of this Export. # noqa: E501 + :type: str + """ + + self._modified_at = modified_at + + @property + def real_name(self): + """Gets the real_name of this Export. # noqa: E501 + + + :return: The real_name of this Export. # noqa: E501 + :rtype: str + """ + return self._real_name + + @real_name.setter + def real_name(self, real_name): + """Sets the real_name of this Export. + + + :param real_name: The real_name of this Export. # noqa: E501 + :type: str + """ + + self._real_name = real_name + + @property + def team(self): + """Gets the team of this Export. # noqa: E501 + + + :return: The team of this Export. # noqa: E501 + :rtype: int + """ + return self._team + + @team.setter + def team(self, team): + """Sets the team of this Export. + + + :param team: The team of this Export. # noqa: E501 + :type: int + """ + + self._team = team + + @property + def changelog(self): + """Gets the changelog of this Export. # noqa: E501 + + + :return: The changelog of this Export. # noqa: E501 + :rtype: int + """ + return self._changelog + + @changelog.setter + def changelog(self, changelog): + """Sets the changelog of this Export. + + + :param changelog: The changelog of this Export. # noqa: E501 + :type: int + """ + + self._changelog = changelog + + @property + def pdfa(self): + """Gets the pdfa of this Export. # noqa: E501 + + + :return: The pdfa of this Export. # noqa: E501 + :rtype: int + """ + return self._pdfa + + @pdfa.setter + def pdfa(self, pdfa): + """Sets the pdfa of this Export. + + + :param pdfa: The pdfa of this Export. # noqa: E501 + :type: int + """ + + self._pdfa = pdfa + + @property + def json(self): + """Gets the json of this Export. # noqa: E501 + + + :return: The json of this Export. # noqa: E501 + :rtype: int + """ + return self._json + + @json.setter + def json(self, json): + """Sets the json of this Export. + + + :param json: The json of this Export. # noqa: E501 + :type: int + """ + + self._json = json + + @property + def hash(self): + """Gets the hash of this Export. # noqa: E501 + + + :return: The hash of this Export. # noqa: E501 + :rtype: str + """ + return self._hash + + @hash.setter + def hash(self, hash): + """Sets the hash of this Export. + + + :param hash: The hash of this Export. # noqa: E501 + :type: str + """ + + self._hash = hash + + @property + def hash_algo(self): + """Gets the hash_algo of this Export. # noqa: E501 + + + :return: The hash_algo of this Export. # noqa: E501 + :rtype: str + """ + return self._hash_algo + + @hash_algo.setter + def hash_algo(self, hash_algo): + """Sets the hash_algo of this Export. + + + :param hash_algo: The hash_algo of this Export. # noqa: E501 + :type: str + """ + + self._hash_algo = hash_algo + + @property + def experiments(self): + """Gets the experiments of this Export. # noqa: E501 + + + :return: The experiments of this Export. # noqa: E501 + :rtype: int + """ + return self._experiments + + @experiments.setter + def experiments(self, experiments): + """Sets the experiments of this Export. + + + :param experiments: The experiments of this Export. # noqa: E501 + :type: int + """ + + self._experiments = experiments + + @property + def items(self): + """Gets the items of this Export. # noqa: E501 + + + :return: The items of this Export. # noqa: E501 + :rtype: int + """ + return self._items + + @items.setter + def items(self, items): + """Sets the items of this Export. + + + :param items: The items of this Export. # noqa: E501 + :type: int + """ + + self._items = items + + @property + def experiments_templates(self): + """Gets the experiments_templates of this Export. # noqa: E501 + + + :return: The experiments_templates of this Export. # noqa: E501 + :rtype: int + """ + return self._experiments_templates + + @experiments_templates.setter + def experiments_templates(self, experiments_templates): + """Sets the experiments_templates of this Export. + + + :param experiments_templates: The experiments_templates of this Export. # noqa: E501 + :type: int + """ + + self._experiments_templates = experiments_templates + + @property + def items_types(self): + """Gets the items_types of this Export. # noqa: E501 + + + :return: The items_types of this Export. # noqa: E501 + :rtype: int + """ + return self._items_types + + @items_types.setter + def items_types(self, items_types): + """Sets the items_types of this Export. + + + :param items_types: The items_types of this Export. # noqa: E501 + :type: int + """ + + self._items_types = items_types + + @property + def format(self): + """Gets the format of this Export. # noqa: E501 + + + :return: The format of this Export. # noqa: E501 + :rtype: str + """ + return self._format + + @format.setter + def format(self, format): + """Sets the format of this Export. + + + :param format: The format of this Export. # noqa: E501 + :type: str + """ + + self._format = format + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Export, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Export): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/exports_body.py b/vendor/elabapi-python/elabapi_python/models/exports_body.py new file mode 100644 index 0000000..92e87d0 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/exports_body.py @@ -0,0 +1,315 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ExportsBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'format': 'str', + 'experiments': 'str', + 'items': 'str', + 'experiments_templates': 'str', + 'items_types': 'str', + 'changelog': 'str', + 'json': 'str', + 'pdfa': 'str' + } + + attribute_map = { + 'format': 'format', + 'experiments': 'experiments', + 'items': 'items', + 'experiments_templates': 'experiments_templates', + 'items_types': 'items_types', + 'changelog': 'changelog', + 'json': 'json', + 'pdfa': 'pdfa' + } + + def __init__(self, format=None, experiments=None, items=None, experiments_templates=None, items_types=None, changelog=None, json=None, pdfa=None): # noqa: E501 + """ExportsBody - a model defined in Swagger""" # noqa: E501 + self._format = None + self._experiments = None + self._items = None + self._experiments_templates = None + self._items_types = None + self._changelog = None + self._json = None + self._pdfa = None + self.discriminator = None + self.format = format + if experiments is not None: + self.experiments = experiments + if items is not None: + self.items = items + if experiments_templates is not None: + self.experiments_templates = experiments_templates + if items_types is not None: + self.items_types = items_types + if changelog is not None: + self.changelog = changelog + if json is not None: + self.json = json + if pdfa is not None: + self.pdfa = pdfa + + @property + def format(self): + """Gets the format of this ExportsBody. # noqa: E501 + + File format for the export # noqa: E501 + + :return: The format of this ExportsBody. # noqa: E501 + :rtype: str + """ + return self._format + + @format.setter + def format(self, format): + """Sets the format of this ExportsBody. + + File format for the export # noqa: E501 + + :param format: The format of this ExportsBody. # noqa: E501 + :type: str + """ + if format is None: + raise ValueError("Invalid value for `format`, must not be `None`") # noqa: E501 + allowed_values = ["csv", "eln", "json", "pdf", "zip"] # noqa: E501 + if format not in allowed_values: + raise ValueError( + "Invalid value for `format` ({0}), must be one of {1}" # noqa: E501 + .format(format, allowed_values) + ) + + self._format = format + + @property + def experiments(self): + """Gets the experiments of this ExportsBody. # noqa: E501 + + Set to \"on\" to include experiments in the export # noqa: E501 + + :return: The experiments of this ExportsBody. # noqa: E501 + :rtype: str + """ + return self._experiments + + @experiments.setter + def experiments(self, experiments): + """Sets the experiments of this ExportsBody. + + Set to \"on\" to include experiments in the export # noqa: E501 + + :param experiments: The experiments of this ExportsBody. # noqa: E501 + :type: str + """ + + self._experiments = experiments + + @property + def items(self): + """Gets the items of this ExportsBody. # noqa: E501 + + Set to \"on\" to include resources in the export # noqa: E501 + + :return: The items of this ExportsBody. # noqa: E501 + :rtype: str + """ + return self._items + + @items.setter + def items(self, items): + """Sets the items of this ExportsBody. + + Set to \"on\" to include resources in the export # noqa: E501 + + :param items: The items of this ExportsBody. # noqa: E501 + :type: str + """ + + self._items = items + + @property + def experiments_templates(self): + """Gets the experiments_templates of this ExportsBody. # noqa: E501 + + Set to \"on\" to include experiments templates in the export # noqa: E501 + + :return: The experiments_templates of this ExportsBody. # noqa: E501 + :rtype: str + """ + return self._experiments_templates + + @experiments_templates.setter + def experiments_templates(self, experiments_templates): + """Sets the experiments_templates of this ExportsBody. + + Set to \"on\" to include experiments templates in the export # noqa: E501 + + :param experiments_templates: The experiments_templates of this ExportsBody. # noqa: E501 + :type: str + """ + + self._experiments_templates = experiments_templates + + @property + def items_types(self): + """Gets the items_types of this ExportsBody. # noqa: E501 + + Set to \"on\" to include resources categories in the export # noqa: E501 + + :return: The items_types of this ExportsBody. # noqa: E501 + :rtype: str + """ + return self._items_types + + @items_types.setter + def items_types(self, items_types): + """Sets the items_types of this ExportsBody. + + Set to \"on\" to include resources categories in the export # noqa: E501 + + :param items_types: The items_types of this ExportsBody. # noqa: E501 + :type: str + """ + + self._items_types = items_types + + @property + def changelog(self): + """Gets the changelog of this ExportsBody. # noqa: E501 + + Set to \"on\" to include the changelog in PDF files # noqa: E501 + + :return: The changelog of this ExportsBody. # noqa: E501 + :rtype: str + """ + return self._changelog + + @changelog.setter + def changelog(self, changelog): + """Sets the changelog of this ExportsBody. + + Set to \"on\" to include the changelog in PDF files # noqa: E501 + + :param changelog: The changelog of this ExportsBody. # noqa: E501 + :type: str + """ + + self._changelog = changelog + + @property + def json(self): + """Gets the json of this ExportsBody. # noqa: E501 + + Set to \"on\" to include a full JSON export in the ZIP archives # noqa: E501 + + :return: The json of this ExportsBody. # noqa: E501 + :rtype: str + """ + return self._json + + @json.setter + def json(self, json): + """Sets the json of this ExportsBody. + + Set to \"on\" to include a full JSON export in the ZIP archives # noqa: E501 + + :param json: The json of this ExportsBody. # noqa: E501 + :type: str + """ + + self._json = json + + @property + def pdfa(self): + """Gets the pdfa of this ExportsBody. # noqa: E501 + + Set to \"on\" to create PDF files with the PDF/A specification # noqa: E501 + + :return: The pdfa of this ExportsBody. # noqa: E501 + :rtype: str + """ + return self._pdfa + + @pdfa.setter + def pdfa(self, pdfa): + """Sets the pdfa of this ExportsBody. + + Set to \"on\" to create PDF files with the PDF/A specification # noqa: E501 + + :param pdfa: The pdfa of this ExportsBody. # noqa: E501 + :type: str + """ + + self._pdfa = pdfa + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ExportsBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ExportsBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/extra_fields_keys.py b/vendor/elabapi-python/elabapi_python/models/extra_fields_keys.py new file mode 100644 index 0000000..2593167 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/extra_fields_keys.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ExtraFieldsKeys(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'extra_fields_key': 'str', + 'frequency': 'int' + } + + attribute_map = { + 'extra_fields_key': 'extra_fields_key', + 'frequency': 'frequency' + } + + def __init__(self, extra_fields_key=None, frequency=None): # noqa: E501 + """ExtraFieldsKeys - a model defined in Swagger""" # noqa: E501 + self._extra_fields_key = None + self._frequency = None + self.discriminator = None + if extra_fields_key is not None: + self.extra_fields_key = extra_fields_key + if frequency is not None: + self.frequency = frequency + + @property + def extra_fields_key(self): + """Gets the extra_fields_key of this ExtraFieldsKeys. # noqa: E501 + + + :return: The extra_fields_key of this ExtraFieldsKeys. # noqa: E501 + :rtype: str + """ + return self._extra_fields_key + + @extra_fields_key.setter + def extra_fields_key(self, extra_fields_key): + """Sets the extra_fields_key of this ExtraFieldsKeys. + + + :param extra_fields_key: The extra_fields_key of this ExtraFieldsKeys. # noqa: E501 + :type: str + """ + + self._extra_fields_key = extra_fields_key + + @property + def frequency(self): + """Gets the frequency of this ExtraFieldsKeys. # noqa: E501 + + + :return: The frequency of this ExtraFieldsKeys. # noqa: E501 + :rtype: int + """ + return self._frequency + + @frequency.setter + def frequency(self, frequency): + """Sets the frequency of this ExtraFieldsKeys. + + + :param frequency: The frequency of this ExtraFieldsKeys. # noqa: E501 + :type: int + """ + + self._frequency = frequency + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ExtraFieldsKeys, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ExtraFieldsKeys): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/favtags_body.py b/vendor/elabapi-python/elabapi_python/models/favtags_body.py new file mode 100644 index 0000000..cbfc2a4 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/favtags_body.py @@ -0,0 +1,112 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class FavtagsBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'tag': 'str' + } + + attribute_map = { + 'tag': 'tag' + } + + def __init__(self, tag=None): # noqa: E501 + """FavtagsBody - a model defined in Swagger""" # noqa: E501 + self._tag = None + self.discriminator = None + if tag is not None: + self.tag = tag + + @property + def tag(self): + """Gets the tag of this FavtagsBody. # noqa: E501 + + An existing tag # noqa: E501 + + :return: The tag of this FavtagsBody. # noqa: E501 + :rtype: str + """ + return self._tag + + @tag.setter + def tag(self, tag): + """Sets the tag of this FavtagsBody. + + An existing tag # noqa: E501 + + :param tag: The tag of this FavtagsBody. # noqa: E501 + :type: str + """ + + self._tag = tag + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(FavtagsBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, FavtagsBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id.py b/vendor/elabapi-python/elabapi_python/models/id.py new file mode 100644 index 0000000..472643d --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Id(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """Id - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Id, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Id): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id1.py b/vendor/elabapi-python/elabapi_python/models/id1.py new file mode 100644 index 0000000..4cbc564 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id1.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Id1(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """Id1 - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Id1, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Id1): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id2.py b/vendor/elabapi-python/elabapi_python/models/id2.py new file mode 100644 index 0000000..8646dea --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id2.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Id2(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """Id2 - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Id2, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Id2): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id3.py b/vendor/elabapi-python/elabapi_python/models/id3.py new file mode 100644 index 0000000..527c86e --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id3.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Id3(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """Id3 - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Id3, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Id3): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id4.py b/vendor/elabapi-python/elabapi_python/models/id4.py new file mode 100644 index 0000000..8b465b2 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id4.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Id4(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """Id4 - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Id4, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Id4): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id_certs_body.py b/vendor/elabapi-python/elabapi_python/models/id_certs_body.py new file mode 100644 index 0000000..cfe92b1 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id_certs_body.py @@ -0,0 +1,147 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdCertsBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'x509': 'str', + 'purpose': 'int' + } + + attribute_map = { + 'x509': 'x509', + 'purpose': 'purpose' + } + + def __init__(self, x509=None, purpose=None): # noqa: E501 + """IdCertsBody - a model defined in Swagger""" # noqa: E501 + self._x509 = None + self._purpose = None + self.discriminator = None + self.x509 = x509 + if purpose is not None: + self.purpose = purpose + + @property + def x509(self): + """Gets the x509 of this IdCertsBody. # noqa: E501 + + PEM representation of the certificate # noqa: E501 + + :return: The x509 of this IdCertsBody. # noqa: E501 + :rtype: str + """ + return self._x509 + + @x509.setter + def x509(self, x509): + """Sets the x509 of this IdCertsBody. + + PEM representation of the certificate # noqa: E501 + + :param x509: The x509 of this IdCertsBody. # noqa: E501 + :type: str + """ + if x509 is None: + raise ValueError("Invalid value for `x509`, must not be `None`") # noqa: E501 + + self._x509 = x509 + + @property + def purpose(self): + """Gets the purpose of this IdCertsBody. # noqa: E501 + + Purpose for this cert: `0` for Signing, `1` for Encryption. # noqa: E501 + + :return: The purpose of this IdCertsBody. # noqa: E501 + :rtype: int + """ + return self._purpose + + @purpose.setter + def purpose(self, purpose): + """Sets the purpose of this IdCertsBody. + + Purpose for this cert: `0` for Signing, `1` for Encryption. # noqa: E501 + + :param purpose: The purpose of this IdCertsBody. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if purpose not in allowed_values: + raise ValueError( + "Invalid value for `purpose` ({0}), must be one of {1}" # noqa: E501 + .format(purpose, allowed_values) + ) + + self._purpose = purpose + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdCertsBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdCertsBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id_comments_body.py b/vendor/elabapi-python/elabapi_python/models/id_comments_body.py new file mode 100644 index 0000000..750b52f --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id_comments_body.py @@ -0,0 +1,111 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdCommentsBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'comment': 'str' + } + + attribute_map = { + 'comment': 'comment' + } + + def __init__(self, comment=None): # noqa: E501 + """IdCommentsBody - a model defined in Swagger""" # noqa: E501 + self._comment = None + self.discriminator = None + self.comment = comment + + @property + def comment(self): + """Gets the comment of this IdCommentsBody. # noqa: E501 + + + :return: The comment of this IdCommentsBody. # noqa: E501 + :rtype: str + """ + return self._comment + + @comment.setter + def comment(self, comment): + """Sets the comment of this IdCommentsBody. + + + :param comment: The comment of this IdCommentsBody. # noqa: E501 + :type: str + """ + if comment is None: + raise ValueError("Invalid value for `comment`, must not be `None`") # noqa: E501 + + self._comment = comment + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdCommentsBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdCommentsBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id_endpoints_body.py b/vendor/elabapi-python/elabapi_python/models/id_endpoints_body.py new file mode 100644 index 0000000..7a7e077 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id_endpoints_body.py @@ -0,0 +1,175 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdEndpointsBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'location': 'str', + 'binding': 'str', + 'is_slo': 'int' + } + + attribute_map = { + 'location': 'location', + 'binding': 'binding', + 'is_slo': 'is_slo' + } + + def __init__(self, location=None, binding=None, is_slo=None): # noqa: E501 + """IdEndpointsBody - a model defined in Swagger""" # noqa: E501 + self._location = None + self._binding = None + self._is_slo = None + self.discriminator = None + self.location = location + if binding is not None: + self.binding = binding + if is_slo is not None: + self.is_slo = is_slo + + @property + def location(self): + """Gets the location of this IdEndpointsBody. # noqa: E501 + + + :return: The location of this IdEndpointsBody. # noqa: E501 + :rtype: str + """ + return self._location + + @location.setter + def location(self, location): + """Sets the location of this IdEndpointsBody. + + + :param location: The location of this IdEndpointsBody. # noqa: E501 + :type: str + """ + if location is None: + raise ValueError("Invalid value for `location`, must not be `None`") # noqa: E501 + + self._location = location + + @property + def binding(self): + """Gets the binding of this IdEndpointsBody. # noqa: E501 + + + :return: The binding of this IdEndpointsBody. # noqa: E501 + :rtype: str + """ + return self._binding + + @binding.setter + def binding(self, binding): + """Sets the binding of this IdEndpointsBody. + + + :param binding: The binding of this IdEndpointsBody. # noqa: E501 + :type: str + """ + allowed_values = ["urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"] # noqa: E501 + if binding not in allowed_values: + raise ValueError( + "Invalid value for `binding` ({0}), must be one of {1}" # noqa: E501 + .format(binding, allowed_values) + ) + + self._binding = binding + + @property + def is_slo(self): + """Gets the is_slo of this IdEndpointsBody. # noqa: E501 + + + :return: The is_slo of this IdEndpointsBody. # noqa: E501 + :rtype: int + """ + return self._is_slo + + @is_slo.setter + def is_slo(self, is_slo): + """Sets the is_slo of this IdEndpointsBody. + + + :param is_slo: The is_slo of this IdEndpointsBody. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_slo not in allowed_values: + raise ValueError( + "Invalid value for `is_slo` ({0}), must be one of {1}" # noqa: E501 + .format(is_slo, allowed_values) + ) + + self._is_slo = is_slo + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdEndpointsBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdEndpointsBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id_experiments_categories_body.py b/vendor/elabapi-python/elabapi_python/models/id_experiments_categories_body.py new file mode 100644 index 0000000..1ce13ee --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id_experiments_categories_body.py @@ -0,0 +1,140 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdExperimentsCategoriesBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'name': 'str', + 'color': 'str' + } + + attribute_map = { + 'name': 'name', + 'color': 'color' + } + + def __init__(self, name=None, color=None): # noqa: E501 + """IdExperimentsCategoriesBody - a model defined in Swagger""" # noqa: E501 + self._name = None + self._color = None + self.discriminator = None + if name is not None: + self.name = name + if color is not None: + self.color = color + + @property + def name(self): + """Gets the name of this IdExperimentsCategoriesBody. # noqa: E501 + + Category name # noqa: E501 + + :return: The name of this IdExperimentsCategoriesBody. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this IdExperimentsCategoriesBody. + + Category name # noqa: E501 + + :param name: The name of this IdExperimentsCategoriesBody. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def color(self): + """Gets the color of this IdExperimentsCategoriesBody. # noqa: E501 + + Hex color without leading \\#. # noqa: E501 + + :return: The color of this IdExperimentsCategoriesBody. # noqa: E501 + :rtype: str + """ + return self._color + + @color.setter + def color(self, color): + """Sets the color of this IdExperimentsCategoriesBody. + + Hex color without leading \\#. # noqa: E501 + + :param color: The color of this IdExperimentsCategoriesBody. # noqa: E501 + :type: str + """ + + self._color = color + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdExperimentsCategoriesBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdExperimentsCategoriesBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id_experiments_status_body.py b/vendor/elabapi-python/elabapi_python/models/id_experiments_status_body.py new file mode 100644 index 0000000..cba5f39 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id_experiments_status_body.py @@ -0,0 +1,140 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdExperimentsStatusBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'name': 'str', + 'color': 'str' + } + + attribute_map = { + 'name': 'name', + 'color': 'color' + } + + def __init__(self, name=None, color=None): # noqa: E501 + """IdExperimentsStatusBody - a model defined in Swagger""" # noqa: E501 + self._name = None + self._color = None + self.discriminator = None + if name is not None: + self.name = name + if color is not None: + self.color = color + + @property + def name(self): + """Gets the name of this IdExperimentsStatusBody. # noqa: E501 + + Status name # noqa: E501 + + :return: The name of this IdExperimentsStatusBody. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this IdExperimentsStatusBody. + + Status name # noqa: E501 + + :param name: The name of this IdExperimentsStatusBody. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def color(self): + """Gets the color of this IdExperimentsStatusBody. # noqa: E501 + + Hex color without leading \\#. # noqa: E501 + + :return: The color of this IdExperimentsStatusBody. # noqa: E501 + :rtype: str + """ + return self._color + + @color.setter + def color(self, color): + """Sets the color of this IdExperimentsStatusBody. + + Hex color without leading \\#. # noqa: E501 + + :param color: The color of this IdExperimentsStatusBody. # noqa: E501 + :type: str + """ + + self._color = color + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdExperimentsStatusBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdExperimentsStatusBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id_items_status_body.py b/vendor/elabapi-python/elabapi_python/models/id_items_status_body.py new file mode 100644 index 0000000..11744f0 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id_items_status_body.py @@ -0,0 +1,140 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdItemsStatusBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'name': 'str', + 'color': 'str' + } + + attribute_map = { + 'name': 'name', + 'color': 'color' + } + + def __init__(self, name=None, color=None): # noqa: E501 + """IdItemsStatusBody - a model defined in Swagger""" # noqa: E501 + self._name = None + self._color = None + self.discriminator = None + if name is not None: + self.name = name + if color is not None: + self.color = color + + @property + def name(self): + """Gets the name of this IdItemsStatusBody. # noqa: E501 + + Status name # noqa: E501 + + :return: The name of this IdItemsStatusBody. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this IdItemsStatusBody. + + Status name # noqa: E501 + + :param name: The name of this IdItemsStatusBody. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def color(self): + """Gets the color of this IdItemsStatusBody. # noqa: E501 + + Hex color without leading \\#. # noqa: E501 + + :return: The color of this IdItemsStatusBody. # noqa: E501 + :rtype: str + """ + return self._color + + @color.setter + def color(self, color): + """Sets the color of this IdItemsStatusBody. + + Hex color without leading \\#. # noqa: E501 + + :param color: The color of this IdItemsStatusBody. # noqa: E501 + :type: str + """ + + self._color = color + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdItemsStatusBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdItemsStatusBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id_resources_categories_body.py b/vendor/elabapi-python/elabapi_python/models/id_resources_categories_body.py new file mode 100644 index 0000000..3153f71 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id_resources_categories_body.py @@ -0,0 +1,140 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdResourcesCategoriesBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'name': 'str', + 'color': 'str' + } + + attribute_map = { + 'name': 'name', + 'color': 'color' + } + + def __init__(self, name=None, color=None): # noqa: E501 + """IdResourcesCategoriesBody - a model defined in Swagger""" # noqa: E501 + self._name = None + self._color = None + self.discriminator = None + if name is not None: + self.name = name + if color is not None: + self.color = color + + @property + def name(self): + """Gets the name of this IdResourcesCategoriesBody. # noqa: E501 + + Category name # noqa: E501 + + :return: The name of this IdResourcesCategoriesBody. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this IdResourcesCategoriesBody. + + Category name # noqa: E501 + + :param name: The name of this IdResourcesCategoriesBody. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def color(self): + """Gets the color of this IdResourcesCategoriesBody. # noqa: E501 + + Hex color without leading \\#. # noqa: E501 + + :return: The color of this IdResourcesCategoriesBody. # noqa: E501 + :rtype: str + """ + return self._color + + @color.setter + def color(self, color): + """Sets the color of this IdResourcesCategoriesBody. + + Hex color without leading \\#. # noqa: E501 + + :param color: The color of this IdResourcesCategoriesBody. # noqa: E501 + :type: str + """ + + self._color = color + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdResourcesCategoriesBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdResourcesCategoriesBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id_steps_body.py b/vendor/elabapi-python/elabapi_python/models/id_steps_body.py new file mode 100644 index 0000000..8d3d8f7 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id_steps_body.py @@ -0,0 +1,112 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdStepsBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'body': 'str' + } + + attribute_map = { + 'body': 'body' + } + + def __init__(self, body=None): # noqa: E501 + """IdStepsBody - a model defined in Swagger""" # noqa: E501 + self._body = None + self.discriminator = None + if body is not None: + self.body = body + + @property + def body(self): + """Gets the body of this IdStepsBody. # noqa: E501 + + The text content of the step. # noqa: E501 + + :return: The body of this IdStepsBody. # noqa: E501 + :rtype: str + """ + return self._body + + @body.setter + def body(self, body): + """Sets the body of this IdStepsBody. + + The text content of the step. # noqa: E501 + + :param body: The body of this IdStepsBody. # noqa: E501 + :type: str + """ + + self._body = body + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdStepsBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdStepsBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id_tags_body.py b/vendor/elabapi-python/elabapi_python/models/id_tags_body.py new file mode 100644 index 0000000..cfce8e8 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id_tags_body.py @@ -0,0 +1,112 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdTagsBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'tag': 'str' + } + + attribute_map = { + 'tag': 'tag' + } + + def __init__(self, tag=None): # noqa: E501 + """IdTagsBody - a model defined in Swagger""" # noqa: E501 + self._tag = None + self.discriminator = None + if tag is not None: + self.tag = tag + + @property + def tag(self): + """Gets the tag of this IdTagsBody. # noqa: E501 + + Tag to add # noqa: E501 + + :return: The tag of this IdTagsBody. # noqa: E501 + :rtype: str + """ + return self._tag + + @tag.setter + def tag(self, tag): + """Sets the tag of this IdTagsBody. + + Tag to add # noqa: E501 + + :param tag: The tag of this IdTagsBody. # noqa: E501 + :type: str + """ + + self._tag = tag + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdTagsBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdTagsBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id_tags_body1.py b/vendor/elabapi-python/elabapi_python/models/id_tags_body1.py new file mode 100644 index 0000000..4515560 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id_tags_body1.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdTagsBody1(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """IdTagsBody1 - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdTagsBody1, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdTagsBody1): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id_teamgroups_body.py b/vendor/elabapi-python/elabapi_python/models/id_teamgroups_body.py new file mode 100644 index 0000000..6d2805d --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id_teamgroups_body.py @@ -0,0 +1,112 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdTeamgroupsBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'name': 'str' + } + + attribute_map = { + 'name': 'name' + } + + def __init__(self, name=None): # noqa: E501 + """IdTeamgroupsBody - a model defined in Swagger""" # noqa: E501 + self._name = None + self.discriminator = None + if name is not None: + self.name = name + + @property + def name(self): + """Gets the name of this IdTeamgroupsBody. # noqa: E501 + + Teamgroup name # noqa: E501 + + :return: The name of this IdTeamgroupsBody. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this IdTeamgroupsBody. + + Teamgroup name # noqa: E501 + + :param name: The name of this IdTeamgroupsBody. # noqa: E501 + :type: str + """ + + self._name = name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdTeamgroupsBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdTeamgroupsBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/id_uploads_body.py b/vendor/elabapi-python/elabapi_python/models/id_uploads_body.py new file mode 100644 index 0000000..0cd9989 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/id_uploads_body.py @@ -0,0 +1,141 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdUploadsBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'file': 'str', + 'comment': 'str' + } + + attribute_map = { + 'file': 'file', + 'comment': 'comment' + } + + def __init__(self, file=None, comment=None): # noqa: E501 + """IdUploadsBody - a model defined in Swagger""" # noqa: E501 + self._file = None + self._comment = None + self.discriminator = None + self.file = file + if comment is not None: + self.comment = comment + + @property + def file(self): + """Gets the file of this IdUploadsBody. # noqa: E501 + + The file to upload. # noqa: E501 + + :return: The file of this IdUploadsBody. # noqa: E501 + :rtype: str + """ + return self._file + + @file.setter + def file(self, file): + """Sets the file of this IdUploadsBody. + + The file to upload. # noqa: E501 + + :param file: The file of this IdUploadsBody. # noqa: E501 + :type: str + """ + if file is None: + raise ValueError("Invalid value for `file`, must not be `None`") # noqa: E501 + + self._file = file + + @property + def comment(self): + """Gets the comment of this IdUploadsBody. # noqa: E501 + + Optional file comment. # noqa: E501 + + :return: The comment of this IdUploadsBody. # noqa: E501 + :rtype: str + """ + return self._comment + + @comment.setter + def comment(self, comment): + """Sets the comment of this IdUploadsBody. + + Optional file comment. # noqa: E501 + + :param comment: The comment of this IdUploadsBody. # noqa: E501 + :type: str + """ + + self._comment = comment + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdUploadsBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdUploadsBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/idp.py b/vendor/elabapi-python/elabapi_python/models/idp.py new file mode 100644 index 0000000..50b26a4 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/idp.py @@ -0,0 +1,426 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Idp(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'name': 'str', + 'entityid': 'str', + 'enabled': 'int', + 'email_attr': 'str', + 'fname_attr': 'str', + 'lname_attr': 'str', + 'team_attr': 'str', + 'orgid_attr': 'str', + 'orcid_attr': 'str', + 'source': 'ModelInt', + 'certs': 'list[IdpCert]', + 'endpoints': 'list[IdpEndpoint]' + } + + attribute_map = { + 'id': 'id', + 'name': 'name', + 'entityid': 'entityid', + 'enabled': 'enabled', + 'email_attr': 'email_attr', + 'fname_attr': 'fname_attr', + 'lname_attr': 'lname_attr', + 'team_attr': 'team_attr', + 'orgid_attr': 'orgid_attr', + 'orcid_attr': 'orcid_attr', + 'source': 'source', + 'certs': 'certs', + 'endpoints': 'endpoints' + } + + def __init__(self, id=None, name=None, entityid=None, enabled=None, email_attr=None, fname_attr=None, lname_attr=None, team_attr=None, orgid_attr=None, orcid_attr=None, source=None, certs=None, endpoints=None): # noqa: E501 + """Idp - a model defined in Swagger""" # noqa: E501 + self._id = None + self._name = None + self._entityid = None + self._enabled = None + self._email_attr = None + self._fname_attr = None + self._lname_attr = None + self._team_attr = None + self._orgid_attr = None + self._orcid_attr = None + self._source = None + self._certs = None + self._endpoints = None + self.discriminator = None + if id is not None: + self.id = id + if name is not None: + self.name = name + if entityid is not None: + self.entityid = entityid + if enabled is not None: + self.enabled = enabled + if email_attr is not None: + self.email_attr = email_attr + if fname_attr is not None: + self.fname_attr = fname_attr + if lname_attr is not None: + self.lname_attr = lname_attr + if team_attr is not None: + self.team_attr = team_attr + if orgid_attr is not None: + self.orgid_attr = orgid_attr + if orcid_attr is not None: + self.orcid_attr = orcid_attr + if source is not None: + self.source = source + if certs is not None: + self.certs = certs + if endpoints is not None: + self.endpoints = endpoints + + @property + def id(self): + """Gets the id of this Idp. # noqa: E501 + + + :return: The id of this Idp. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Idp. + + + :param id: The id of this Idp. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def name(self): + """Gets the name of this Idp. # noqa: E501 + + + :return: The name of this Idp. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Idp. + + + :param name: The name of this Idp. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def entityid(self): + """Gets the entityid of this Idp. # noqa: E501 + + + :return: The entityid of this Idp. # noqa: E501 + :rtype: str + """ + return self._entityid + + @entityid.setter + def entityid(self, entityid): + """Sets the entityid of this Idp. + + + :param entityid: The entityid of this Idp. # noqa: E501 + :type: str + """ + + self._entityid = entityid + + @property + def enabled(self): + """Gets the enabled of this Idp. # noqa: E501 + + + :return: The enabled of this Idp. # noqa: E501 + :rtype: int + """ + return self._enabled + + @enabled.setter + def enabled(self, enabled): + """Sets the enabled of this Idp. + + + :param enabled: The enabled of this Idp. # noqa: E501 + :type: int + """ + + self._enabled = enabled + + @property + def email_attr(self): + """Gets the email_attr of this Idp. # noqa: E501 + + + :return: The email_attr of this Idp. # noqa: E501 + :rtype: str + """ + return self._email_attr + + @email_attr.setter + def email_attr(self, email_attr): + """Sets the email_attr of this Idp. + + + :param email_attr: The email_attr of this Idp. # noqa: E501 + :type: str + """ + + self._email_attr = email_attr + + @property + def fname_attr(self): + """Gets the fname_attr of this Idp. # noqa: E501 + + + :return: The fname_attr of this Idp. # noqa: E501 + :rtype: str + """ + return self._fname_attr + + @fname_attr.setter + def fname_attr(self, fname_attr): + """Sets the fname_attr of this Idp. + + + :param fname_attr: The fname_attr of this Idp. # noqa: E501 + :type: str + """ + + self._fname_attr = fname_attr + + @property + def lname_attr(self): + """Gets the lname_attr of this Idp. # noqa: E501 + + + :return: The lname_attr of this Idp. # noqa: E501 + :rtype: str + """ + return self._lname_attr + + @lname_attr.setter + def lname_attr(self, lname_attr): + """Sets the lname_attr of this Idp. + + + :param lname_attr: The lname_attr of this Idp. # noqa: E501 + :type: str + """ + + self._lname_attr = lname_attr + + @property + def team_attr(self): + """Gets the team_attr of this Idp. # noqa: E501 + + + :return: The team_attr of this Idp. # noqa: E501 + :rtype: str + """ + return self._team_attr + + @team_attr.setter + def team_attr(self, team_attr): + """Sets the team_attr of this Idp. + + + :param team_attr: The team_attr of this Idp. # noqa: E501 + :type: str + """ + + self._team_attr = team_attr + + @property + def orgid_attr(self): + """Gets the orgid_attr of this Idp. # noqa: E501 + + + :return: The orgid_attr of this Idp. # noqa: E501 + :rtype: str + """ + return self._orgid_attr + + @orgid_attr.setter + def orgid_attr(self, orgid_attr): + """Sets the orgid_attr of this Idp. + + + :param orgid_attr: The orgid_attr of this Idp. # noqa: E501 + :type: str + """ + + self._orgid_attr = orgid_attr + + @property + def orcid_attr(self): + """Gets the orcid_attr of this Idp. # noqa: E501 + + + :return: The orcid_attr of this Idp. # noqa: E501 + :rtype: str + """ + return self._orcid_attr + + @orcid_attr.setter + def orcid_attr(self, orcid_attr): + """Sets the orcid_attr of this Idp. + + + :param orcid_attr: The orcid_attr of this Idp. # noqa: E501 + :type: str + """ + + self._orcid_attr = orcid_attr + + @property + def source(self): + """Gets the source of this Idp. # noqa: E501 + + + :return: The source of this Idp. # noqa: E501 + :rtype: ModelInt + """ + return self._source + + @source.setter + def source(self, source): + """Sets the source of this Idp. + + + :param source: The source of this Idp. # noqa: E501 + :type: ModelInt + """ + + self._source = source + + @property + def certs(self): + """Gets the certs of this Idp. # noqa: E501 + + Certificates associated with this IdP. # noqa: E501 + + :return: The certs of this Idp. # noqa: E501 + :rtype: list[IdpCert] + """ + return self._certs + + @certs.setter + def certs(self, certs): + """Sets the certs of this Idp. + + Certificates associated with this IdP. # noqa: E501 + + :param certs: The certs of this Idp. # noqa: E501 + :type: list[IdpCert] + """ + + self._certs = certs + + @property + def endpoints(self): + """Gets the endpoints of this Idp. # noqa: E501 + + Endpoints associated with this IdP. # noqa: E501 + + :return: The endpoints of this Idp. # noqa: E501 + :rtype: list[IdpEndpoint] + """ + return self._endpoints + + @endpoints.setter + def endpoints(self, endpoints): + """Sets the endpoints of this Idp. + + Endpoints associated with this IdP. # noqa: E501 + + :param endpoints: The endpoints of this Idp. # noqa: E501 + :type: list[IdpEndpoint] + """ + + self._endpoints = endpoints + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Idp, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Idp): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/idp_cert.py b/vendor/elabapi-python/elabapi_python/models/idp_cert.py new file mode 100644 index 0000000..5567fa0 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/idp_cert.py @@ -0,0 +1,312 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdpCert(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'x509': 'str', + 'sha256': 'str', + 'purpose': 'int', + 'not_before': 'str', + 'not_after': 'str', + 'created_at': 'str', + 'modified_at': 'str' + } + + attribute_map = { + 'id': 'id', + 'x509': 'x509', + 'sha256': 'sha256', + 'purpose': 'purpose', + 'not_before': 'not_before', + 'not_after': 'not_after', + 'created_at': 'created_at', + 'modified_at': 'modified_at' + } + + def __init__(self, id=None, x509=None, sha256=None, purpose=None, not_before=None, not_after=None, created_at=None, modified_at=None): # noqa: E501 + """IdpCert - a model defined in Swagger""" # noqa: E501 + self._id = None + self._x509 = None + self._sha256 = None + self._purpose = None + self._not_before = None + self._not_after = None + self._created_at = None + self._modified_at = None + self.discriminator = None + self.id = id + self.x509 = x509 + self.sha256 = sha256 + self.purpose = purpose + if not_before is not None: + self.not_before = not_before + if not_after is not None: + self.not_after = not_after + self.created_at = created_at + self.modified_at = modified_at + + @property + def id(self): + """Gets the id of this IdpCert. # noqa: E501 + + + :return: The id of this IdpCert. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this IdpCert. + + + :param id: The id of this IdpCert. # noqa: E501 + :type: int + """ + if id is None: + raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 + + self._id = id + + @property + def x509(self): + """Gets the x509 of this IdpCert. # noqa: E501 + + Base64 encoded DER representation of the X.509 certificate (as stored in the database). # noqa: E501 + + :return: The x509 of this IdpCert. # noqa: E501 + :rtype: str + """ + return self._x509 + + @x509.setter + def x509(self, x509): + """Sets the x509 of this IdpCert. + + Base64 encoded DER representation of the X.509 certificate (as stored in the database). # noqa: E501 + + :param x509: The x509 of this IdpCert. # noqa: E501 + :type: str + """ + if x509 is None: + raise ValueError("Invalid value for `x509`, must not be `None`") # noqa: E501 + + self._x509 = x509 + + @property + def sha256(self): + """Gets the sha256 of this IdpCert. # noqa: E501 + + Hex encoded SHA 256 fingerprint of the certificate. # noqa: E501 + + :return: The sha256 of this IdpCert. # noqa: E501 + :rtype: str + """ + return self._sha256 + + @sha256.setter + def sha256(self, sha256): + """Sets the sha256 of this IdpCert. + + Hex encoded SHA 256 fingerprint of the certificate. # noqa: E501 + + :param sha256: The sha256 of this IdpCert. # noqa: E501 + :type: str + """ + if sha256 is None: + raise ValueError("Invalid value for `sha256`, must not be `None`") # noqa: E501 + + self._sha256 = sha256 + + @property + def purpose(self): + """Gets the purpose of this IdpCert. # noqa: E501 + + Usage of the certificate. 0 for signing, 1 for encryption. # noqa: E501 + + :return: The purpose of this IdpCert. # noqa: E501 + :rtype: int + """ + return self._purpose + + @purpose.setter + def purpose(self, purpose): + """Sets the purpose of this IdpCert. + + Usage of the certificate. 0 for signing, 1 for encryption. # noqa: E501 + + :param purpose: The purpose of this IdpCert. # noqa: E501 + :type: int + """ + if purpose is None: + raise ValueError("Invalid value for `purpose`, must not be `None`") # noqa: E501 + + self._purpose = purpose + + @property + def not_before(self): + """Gets the not_before of this IdpCert. # noqa: E501 + + Validity starting date for certificate # noqa: E501 + + :return: The not_before of this IdpCert. # noqa: E501 + :rtype: str + """ + return self._not_before + + @not_before.setter + def not_before(self, not_before): + """Sets the not_before of this IdpCert. + + Validity starting date for certificate # noqa: E501 + + :param not_before: The not_before of this IdpCert. # noqa: E501 + :type: str + """ + + self._not_before = not_before + + @property + def not_after(self): + """Gets the not_after of this IdpCert. # noqa: E501 + + Validity end date for certificate # noqa: E501 + + :return: The not_after of this IdpCert. # noqa: E501 + :rtype: str + """ + return self._not_after + + @not_after.setter + def not_after(self, not_after): + """Sets the not_after of this IdpCert. + + Validity end date for certificate # noqa: E501 + + :param not_after: The not_after of this IdpCert. # noqa: E501 + :type: str + """ + + self._not_after = not_after + + @property + def created_at(self): + """Gets the created_at of this IdpCert. # noqa: E501 + + Timestamp when the certificate was created. # noqa: E501 + + :return: The created_at of this IdpCert. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this IdpCert. + + Timestamp when the certificate was created. # noqa: E501 + + :param created_at: The created_at of this IdpCert. # noqa: E501 + :type: str + """ + if created_at is None: + raise ValueError("Invalid value for `created_at`, must not be `None`") # noqa: E501 + + self._created_at = created_at + + @property + def modified_at(self): + """Gets the modified_at of this IdpCert. # noqa: E501 + + Timestamp when the certificate was last modified. # noqa: E501 + + :return: The modified_at of this IdpCert. # noqa: E501 + :rtype: str + """ + return self._modified_at + + @modified_at.setter + def modified_at(self, modified_at): + """Sets the modified_at of this IdpCert. + + Timestamp when the certificate was last modified. # noqa: E501 + + :param modified_at: The modified_at of this IdpCert. # noqa: E501 + :type: str + """ + if modified_at is None: + raise ValueError("Invalid value for `modified_at`, must not be `None`") # noqa: E501 + + self._modified_at = modified_at + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdpCert, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdpCert): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/idp_endpoint.py b/vendor/elabapi-python/elabapi_python/models/idp_endpoint.py new file mode 100644 index 0000000..242ef0c --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/idp_endpoint.py @@ -0,0 +1,290 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdpEndpoint(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'is_slo': 'int', + 'binding': 'int', + 'location': 'str', + 'binding_urn': 'str', + 'created_at': 'str', + 'modified_at': 'str' + } + + attribute_map = { + 'id': 'id', + 'is_slo': 'is_slo', + 'binding': 'binding', + 'location': 'location', + 'binding_urn': 'binding_urn', + 'created_at': 'created_at', + 'modified_at': 'modified_at' + } + + def __init__(self, id=None, is_slo=None, binding=None, location=None, binding_urn=None, created_at=None, modified_at=None): # noqa: E501 + """IdpEndpoint - a model defined in Swagger""" # noqa: E501 + self._id = None + self._is_slo = None + self._binding = None + self._location = None + self._binding_urn = None + self._created_at = None + self._modified_at = None + self.discriminator = None + if id is not None: + self.id = id + if is_slo is not None: + self.is_slo = is_slo + if binding is not None: + self.binding = binding + if location is not None: + self.location = location + if binding_urn is not None: + self.binding_urn = binding_urn + if created_at is not None: + self.created_at = created_at + if modified_at is not None: + self.modified_at = modified_at + + @property + def id(self): + """Gets the id of this IdpEndpoint. # noqa: E501 + + + :return: The id of this IdpEndpoint. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this IdpEndpoint. + + + :param id: The id of this IdpEndpoint. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def is_slo(self): + """Gets the is_slo of this IdpEndpoint. # noqa: E501 + + Will be 1 if the endpoint is for SLO (otherwise it means it's SSO) # noqa: E501 + + :return: The is_slo of this IdpEndpoint. # noqa: E501 + :rtype: int + """ + return self._is_slo + + @is_slo.setter + def is_slo(self, is_slo): + """Sets the is_slo of this IdpEndpoint. + + Will be 1 if the endpoint is for SLO (otherwise it means it's SSO) # noqa: E501 + + :param is_slo: The is_slo of this IdpEndpoint. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_slo not in allowed_values: + raise ValueError( + "Invalid value for `is_slo` ({0}), must be one of {1}" # noqa: E501 + .format(is_slo, allowed_values) + ) + + self._is_slo = is_slo + + @property + def binding(self): + """Gets the binding of this IdpEndpoint. # noqa: E501 + + The type of binding: POST or redirect(see SamlBinding enum) # noqa: E501 + + :return: The binding of this IdpEndpoint. # noqa: E501 + :rtype: int + """ + return self._binding + + @binding.setter + def binding(self, binding): + """Sets the binding of this IdpEndpoint. + + The type of binding: POST or redirect(see SamlBinding enum) # noqa: E501 + + :param binding: The binding of this IdpEndpoint. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if binding not in allowed_values: + raise ValueError( + "Invalid value for `binding` ({0}), must be one of {1}" # noqa: E501 + .format(binding, allowed_values) + ) + + self._binding = binding + + @property + def location(self): + """Gets the location of this IdpEndpoint. # noqa: E501 + + Actual URL # noqa: E501 + + :return: The location of this IdpEndpoint. # noqa: E501 + :rtype: str + """ + return self._location + + @location.setter + def location(self, location): + """Sets the location of this IdpEndpoint. + + Actual URL # noqa: E501 + + :param location: The location of this IdpEndpoint. # noqa: E501 + :type: str + """ + + self._location = location + + @property + def binding_urn(self): + """Gets the binding_urn of this IdpEndpoint. # noqa: E501 + + URN corresponding to the `binding` field # noqa: E501 + + :return: The binding_urn of this IdpEndpoint. # noqa: E501 + :rtype: str + """ + return self._binding_urn + + @binding_urn.setter + def binding_urn(self, binding_urn): + """Sets the binding_urn of this IdpEndpoint. + + URN corresponding to the `binding` field # noqa: E501 + + :param binding_urn: The binding_urn of this IdpEndpoint. # noqa: E501 + :type: str + """ + + self._binding_urn = binding_urn + + @property + def created_at(self): + """Gets the created_at of this IdpEndpoint. # noqa: E501 + + Timestamp when the endpoint was created. # noqa: E501 + + :return: The created_at of this IdpEndpoint. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this IdpEndpoint. + + Timestamp when the endpoint was created. # noqa: E501 + + :param created_at: The created_at of this IdpEndpoint. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def modified_at(self): + """Gets the modified_at of this IdpEndpoint. # noqa: E501 + + Timestamp when the endpoint was last modified. # noqa: E501 + + :return: The modified_at of this IdpEndpoint. # noqa: E501 + :rtype: str + """ + return self._modified_at + + @modified_at.setter + def modified_at(self, modified_at): + """Sets the modified_at of this IdpEndpoint. + + Timestamp when the endpoint was last modified. # noqa: E501 + + :param modified_at: The modified_at of this IdpEndpoint. # noqa: E501 + :type: str + """ + + self._modified_at = modified_at + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdpEndpoint, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdpEndpoint): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/idp_source.py b/vendor/elabapi-python/elabapi_python/models/idp_source.py new file mode 100644 index 0000000..777f0fd --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/idp_source.py @@ -0,0 +1,240 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdpSource(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'url': 'str', + 'auto_refresh': 'int', + 'last_fetched_at': 'datetime', + 'idps_count': 'int', + 'idps_count_enabled': 'int' + } + + attribute_map = { + 'id': 'id', + 'url': 'url', + 'auto_refresh': 'auto_refresh', + 'last_fetched_at': 'last_fetched_at', + 'idps_count': 'idps_count', + 'idps_count_enabled': 'idps_count_enabled' + } + + def __init__(self, id=None, url=None, auto_refresh=None, last_fetched_at=None, idps_count=None, idps_count_enabled=None): # noqa: E501 + """IdpSource - a model defined in Swagger""" # noqa: E501 + self._id = None + self._url = None + self._auto_refresh = None + self._last_fetched_at = None + self._idps_count = None + self._idps_count_enabled = None + self.discriminator = None + if id is not None: + self.id = id + if url is not None: + self.url = url + if auto_refresh is not None: + self.auto_refresh = auto_refresh + if last_fetched_at is not None: + self.last_fetched_at = last_fetched_at + if idps_count is not None: + self.idps_count = idps_count + if idps_count_enabled is not None: + self.idps_count_enabled = idps_count_enabled + + @property + def id(self): + """Gets the id of this IdpSource. # noqa: E501 + + + :return: The id of this IdpSource. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this IdpSource. + + + :param id: The id of this IdpSource. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def url(self): + """Gets the url of this IdpSource. # noqa: E501 + + + :return: The url of this IdpSource. # noqa: E501 + :rtype: str + """ + return self._url + + @url.setter + def url(self, url): + """Sets the url of this IdpSource. + + + :param url: The url of this IdpSource. # noqa: E501 + :type: str + """ + + self._url = url + + @property + def auto_refresh(self): + """Gets the auto_refresh of this IdpSource. # noqa: E501 + + + :return: The auto_refresh of this IdpSource. # noqa: E501 + :rtype: int + """ + return self._auto_refresh + + @auto_refresh.setter + def auto_refresh(self, auto_refresh): + """Sets the auto_refresh of this IdpSource. + + + :param auto_refresh: The auto_refresh of this IdpSource. # noqa: E501 + :type: int + """ + + self._auto_refresh = auto_refresh + + @property + def last_fetched_at(self): + """Gets the last_fetched_at of this IdpSource. # noqa: E501 + + + :return: The last_fetched_at of this IdpSource. # noqa: E501 + :rtype: datetime + """ + return self._last_fetched_at + + @last_fetched_at.setter + def last_fetched_at(self, last_fetched_at): + """Sets the last_fetched_at of this IdpSource. + + + :param last_fetched_at: The last_fetched_at of this IdpSource. # noqa: E501 + :type: datetime + """ + + self._last_fetched_at = last_fetched_at + + @property + def idps_count(self): + """Gets the idps_count of this IdpSource. # noqa: E501 + + + :return: The idps_count of this IdpSource. # noqa: E501 + :rtype: int + """ + return self._idps_count + + @idps_count.setter + def idps_count(self, idps_count): + """Sets the idps_count of this IdpSource. + + + :param idps_count: The idps_count of this IdpSource. # noqa: E501 + :type: int + """ + + self._idps_count = idps_count + + @property + def idps_count_enabled(self): + """Gets the idps_count_enabled of this IdpSource. # noqa: E501 + + + :return: The idps_count_enabled of this IdpSource. # noqa: E501 + :rtype: int + """ + return self._idps_count_enabled + + @idps_count_enabled.setter + def idps_count_enabled(self, idps_count_enabled): + """Sets the idps_count_enabled of this IdpSource. + + + :param idps_count_enabled: The idps_count_enabled of this IdpSource. # noqa: E501 + :type: int + """ + + self._idps_count_enabled = idps_count_enabled + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdpSource, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdpSource): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/idps_body.py b/vendor/elabapi-python/elabapi_python/models/idps_body.py new file mode 100644 index 0000000..063c3cf --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/idps_body.py @@ -0,0 +1,311 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdpsBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'name': 'str', + 'entityid': 'str', + 'email_attr': 'str', + 'fname_attr': 'str', + 'lname_attr': 'str', + 'team_attr': 'str', + 'orgid_attr': 'str', + 'orcid_attr': 'str' + } + + attribute_map = { + 'name': 'name', + 'entityid': 'entityid', + 'email_attr': 'email_attr', + 'fname_attr': 'fname_attr', + 'lname_attr': 'lname_attr', + 'team_attr': 'team_attr', + 'orgid_attr': 'orgid_attr', + 'orcid_attr': 'orcid_attr' + } + + def __init__(self, name=None, entityid=None, email_attr=None, fname_attr=None, lname_attr=None, team_attr=None, orgid_attr=None, orcid_attr=None): # noqa: E501 + """IdpsBody - a model defined in Swagger""" # noqa: E501 + self._name = None + self._entityid = None + self._email_attr = None + self._fname_attr = None + self._lname_attr = None + self._team_attr = None + self._orgid_attr = None + self._orcid_attr = None + self.discriminator = None + self.name = name + self.entityid = entityid + self.email_attr = email_attr + if fname_attr is not None: + self.fname_attr = fname_attr + if lname_attr is not None: + self.lname_attr = lname_attr + if team_attr is not None: + self.team_attr = team_attr + if orgid_attr is not None: + self.orgid_attr = orgid_attr + if orcid_attr is not None: + self.orcid_attr = orcid_attr + + @property + def name(self): + """Gets the name of this IdpsBody. # noqa: E501 + + A name for the IDP. # noqa: E501 + + :return: The name of this IdpsBody. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this IdpsBody. + + A name for the IDP. # noqa: E501 + + :param name: The name of this IdpsBody. # noqa: E501 + :type: str + """ + if name is None: + raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 + + self._name = name + + @property + def entityid(self): + """Gets the entityid of this IdpsBody. # noqa: E501 + + Entityid. # noqa: E501 + + :return: The entityid of this IdpsBody. # noqa: E501 + :rtype: str + """ + return self._entityid + + @entityid.setter + def entityid(self, entityid): + """Sets the entityid of this IdpsBody. + + Entityid. # noqa: E501 + + :param entityid: The entityid of this IdpsBody. # noqa: E501 + :type: str + """ + if entityid is None: + raise ValueError("Invalid value for `entityid`, must not be `None`") # noqa: E501 + + self._entityid = entityid + + @property + def email_attr(self): + """Gets the email_attr of this IdpsBody. # noqa: E501 + + What attribute to look for the email. # noqa: E501 + + :return: The email_attr of this IdpsBody. # noqa: E501 + :rtype: str + """ + return self._email_attr + + @email_attr.setter + def email_attr(self, email_attr): + """Sets the email_attr of this IdpsBody. + + What attribute to look for the email. # noqa: E501 + + :param email_attr: The email_attr of this IdpsBody. # noqa: E501 + :type: str + """ + if email_attr is None: + raise ValueError("Invalid value for `email_attr`, must not be `None`") # noqa: E501 + + self._email_attr = email_attr + + @property + def fname_attr(self): + """Gets the fname_attr of this IdpsBody. # noqa: E501 + + What attribute to look for the firstname. # noqa: E501 + + :return: The fname_attr of this IdpsBody. # noqa: E501 + :rtype: str + """ + return self._fname_attr + + @fname_attr.setter + def fname_attr(self, fname_attr): + """Sets the fname_attr of this IdpsBody. + + What attribute to look for the firstname. # noqa: E501 + + :param fname_attr: The fname_attr of this IdpsBody. # noqa: E501 + :type: str + """ + + self._fname_attr = fname_attr + + @property + def lname_attr(self): + """Gets the lname_attr of this IdpsBody. # noqa: E501 + + What attribute to look for the lastname. # noqa: E501 + + :return: The lname_attr of this IdpsBody. # noqa: E501 + :rtype: str + """ + return self._lname_attr + + @lname_attr.setter + def lname_attr(self, lname_attr): + """Sets the lname_attr of this IdpsBody. + + What attribute to look for the lastname. # noqa: E501 + + :param lname_attr: The lname_attr of this IdpsBody. # noqa: E501 + :type: str + """ + + self._lname_attr = lname_attr + + @property + def team_attr(self): + """Gets the team_attr of this IdpsBody. # noqa: E501 + + What attribute to look for the team. # noqa: E501 + + :return: The team_attr of this IdpsBody. # noqa: E501 + :rtype: str + """ + return self._team_attr + + @team_attr.setter + def team_attr(self, team_attr): + """Sets the team_attr of this IdpsBody. + + What attribute to look for the team. # noqa: E501 + + :param team_attr: The team_attr of this IdpsBody. # noqa: E501 + :type: str + """ + + self._team_attr = team_attr + + @property + def orgid_attr(self): + """Gets the orgid_attr of this IdpsBody. # noqa: E501 + + What attribute to look for the internal id. # noqa: E501 + + :return: The orgid_attr of this IdpsBody. # noqa: E501 + :rtype: str + """ + return self._orgid_attr + + @orgid_attr.setter + def orgid_attr(self, orgid_attr): + """Sets the orgid_attr of this IdpsBody. + + What attribute to look for the internal id. # noqa: E501 + + :param orgid_attr: The orgid_attr of this IdpsBody. # noqa: E501 + :type: str + """ + + self._orgid_attr = orgid_attr + + @property + def orcid_attr(self): + """Gets the orcid_attr of this IdpsBody. # noqa: E501 + + What attribute to look for the ORCID. # noqa: E501 + + :return: The orcid_attr of this IdpsBody. # noqa: E501 + :rtype: str + """ + return self._orcid_attr + + @orcid_attr.setter + def orcid_attr(self, orcid_attr): + """Sets the orcid_attr of this IdpsBody. + + What attribute to look for the ORCID. # noqa: E501 + + :param orcid_attr: The orcid_attr of this IdpsBody. # noqa: E501 + :type: str + """ + + self._orcid_attr = orcid_attr + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdpsBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdpsBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/idps_id_body.py b/vendor/elabapi-python/elabapi_python/models/idps_id_body.py new file mode 100644 index 0000000..01af50b --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/idps_id_body.py @@ -0,0 +1,117 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdpsIdBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str' + } + + attribute_map = { + 'action': 'action' + } + + def __init__(self, action=None): # noqa: E501 + """IdpsIdBody - a model defined in Swagger""" # noqa: E501 + self._action = None + self.discriminator = None + self.action = action + + @property + def action(self): + """Gets the action of this IdpsIdBody. # noqa: E501 + + + :return: The action of this IdpsIdBody. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this IdpsIdBody. + + + :param action: The action of this IdpsIdBody. # noqa: E501 + :type: str + """ + if action is None: + raise ValueError("Invalid value for `action`, must not be `None`") # noqa: E501 + allowed_values = ["update"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdpsIdBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdpsIdBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/idps_sources_body.py b/vendor/elabapi-python/elabapi_python/models/idps_sources_body.py new file mode 100644 index 0000000..d7f3540 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/idps_sources_body.py @@ -0,0 +1,113 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdpsSourcesBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'url': 'str' + } + + attribute_map = { + 'url': 'url' + } + + def __init__(self, url=None): # noqa: E501 + """IdpsSourcesBody - a model defined in Swagger""" # noqa: E501 + self._url = None + self.discriminator = None + self.url = url + + @property + def url(self): + """Gets the url of this IdpsSourcesBody. # noqa: E501 + + URL to the public XML metadata file # noqa: E501 + + :return: The url of this IdpsSourcesBody. # noqa: E501 + :rtype: str + """ + return self._url + + @url.setter + def url(self, url): + """Sets the url of this IdpsSourcesBody. + + URL to the public XML metadata file # noqa: E501 + + :param url: The url of this IdpsSourcesBody. # noqa: E501 + :type: str + """ + if url is None: + raise ValueError("Invalid value for `url`, must not be `None`") # noqa: E501 + + self._url = url + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdpsSourcesBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdpsSourcesBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/idps_sources_id_body.py b/vendor/elabapi-python/elabapi_python/models/idps_sources_id_body.py new file mode 100644 index 0000000..52599ab --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/idps_sources_id_body.py @@ -0,0 +1,119 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class IdpsSourcesIdBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str' + } + + attribute_map = { + 'action': 'action' + } + + def __init__(self, action=None): # noqa: E501 + """IdpsSourcesIdBody - a model defined in Swagger""" # noqa: E501 + self._action = None + self.discriminator = None + self.action = action + + @property + def action(self): + """Gets the action of this IdpsSourcesIdBody. # noqa: E501 + + Use `update` to toggle autorefresh, `replace` to load IdPs, `validate` to enable all associated IdPs, `finish` to invalidate all associated IdPs. # noqa: E501 + + :return: The action of this IdpsSourcesIdBody. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this IdpsSourcesIdBody. + + Use `update` to toggle autorefresh, `replace` to load IdPs, `validate` to enable all associated IdPs, `finish` to invalidate all associated IdPs. # noqa: E501 + + :param action: The action of this IdpsSourcesIdBody. # noqa: E501 + :type: str + """ + if action is None: + raise ValueError("Invalid value for `action`, must not be `None`") # noqa: E501 + allowed_values = ["update", "replace", "validate", "finish"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IdpsSourcesIdBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IdpsSourcesIdBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/import_body.py b/vendor/elabapi-python/elabapi_python/models/import_body.py new file mode 100644 index 0000000..7017909 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/import_body.py @@ -0,0 +1,272 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ImportBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'file': 'str', + 'entity_type': 'str', + 'category': 'int', + 'canread_base': 'float', + 'canwrite_base': 'float', + 'owner': 'int' + } + + attribute_map = { + 'file': 'file', + 'entity_type': 'entity_type', + 'category': 'category', + 'canread_base': 'canread_base', + 'canwrite_base': 'canwrite_base', + 'owner': 'owner' + } + + def __init__(self, file=None, entity_type=None, category=None, canread_base=None, canwrite_base=None, owner=None): # noqa: E501 + """ImportBody - a model defined in Swagger""" # noqa: E501 + self._file = None + self._entity_type = None + self._category = None + self._canread_base = None + self._canwrite_base = None + self._owner = None + self.discriminator = None + self.file = file + self.entity_type = entity_type + if category is not None: + self.category = category + if canread_base is not None: + self.canread_base = canread_base + if canwrite_base is not None: + self.canwrite_base = canwrite_base + if owner is not None: + self.owner = owner + + @property + def file(self): + """Gets the file of this ImportBody. # noqa: E501 + + The file to upload. # noqa: E501 + + :return: The file of this ImportBody. # noqa: E501 + :rtype: str + """ + return self._file + + @file.setter + def file(self, file): + """Sets the file of this ImportBody. + + The file to upload. # noqa: E501 + + :param file: The file of this ImportBody. # noqa: E501 + :type: str + """ + if file is None: + raise ValueError("Invalid value for `file`, must not be `None`") # noqa: E501 + + self._file = file + + @property + def entity_type(self): + """Gets the entity_type of this ImportBody. # noqa: E501 + + The target entity type # noqa: E501 + + :return: The entity_type of this ImportBody. # noqa: E501 + :rtype: str + """ + return self._entity_type + + @entity_type.setter + def entity_type(self, entity_type): + """Sets the entity_type of this ImportBody. + + The target entity type # noqa: E501 + + :param entity_type: The entity_type of this ImportBody. # noqa: E501 + :type: str + """ + if entity_type is None: + raise ValueError("Invalid value for `entity_type`, must not be `None`") # noqa: E501 + allowed_values = ["experiments", "items", "experiments_templates", "items_types"] # noqa: E501 + if entity_type not in allowed_values: + raise ValueError( + "Invalid value for `entity_type` ({0}), must be one of {1}" # noqa: E501 + .format(entity_type, allowed_values) + ) + + self._entity_type = entity_type + + @property + def category(self): + """Gets the category of this ImportBody. # noqa: E501 + + The default category ID if no category is defined for a given entry # noqa: E501 + + :return: The category of this ImportBody. # noqa: E501 + :rtype: int + """ + return self._category + + @category.setter + def category(self, category): + """Sets the category of this ImportBody. + + The default category ID if no category is defined for a given entry # noqa: E501 + + :param category: The category of this ImportBody. # noqa: E501 + :type: int + """ + + self._category = category + + @property + def canread_base(self): + """Gets the canread_base of this ImportBody. # noqa: E501 + + Base permission for read access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :return: The canread_base of this ImportBody. # noqa: E501 + :rtype: float + """ + return self._canread_base + + @canread_base.setter + def canread_base(self, canread_base): + """Sets the canread_base of this ImportBody. + + Base permission for read access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :param canread_base: The canread_base of this ImportBody. # noqa: E501 + :type: float + """ + allowed_values = [10, 20, 30, 40, 50] # noqa: E501 + if canread_base not in allowed_values: + raise ValueError( + "Invalid value for `canread_base` ({0}), must be one of {1}" # noqa: E501 + .format(canread_base, allowed_values) + ) + + self._canread_base = canread_base + + @property + def canwrite_base(self): + """Gets the canwrite_base of this ImportBody. # noqa: E501 + + Base permission for write access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :return: The canwrite_base of this ImportBody. # noqa: E501 + :rtype: float + """ + return self._canwrite_base + + @canwrite_base.setter + def canwrite_base(self, canwrite_base): + """Sets the canwrite_base of this ImportBody. + + Base permission for write access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :param canwrite_base: The canwrite_base of this ImportBody. # noqa: E501 + :type: float + """ + allowed_values = [10, 20, 30, 40, 50] # noqa: E501 + if canwrite_base not in allowed_values: + raise ValueError( + "Invalid value for `canwrite_base` ({0}), must be one of {1}" # noqa: E501 + .format(canwrite_base, allowed_values) + ) + + self._canwrite_base = canwrite_base + + @property + def owner(self): + """Gets the owner of this ImportBody. # noqa: E501 + + Userid of future owner of imported data # noqa: E501 + + :return: The owner of this ImportBody. # noqa: E501 + :rtype: int + """ + return self._owner + + @owner.setter + def owner(self, owner): + """Sets the owner of this ImportBody. + + Userid of future owner of imported data # noqa: E501 + + :param owner: The owner of this ImportBody. # noqa: E501 + :type: int + """ + + self._owner = owner + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ImportBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ImportBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response200.py b/vendor/elabapi-python/elabapi_python/models/inline_response200.py new file mode 100644 index 0000000..05e6b9d --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response200.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse200(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """InlineResponse200 - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse200, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse200): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2001.py b/vendor/elabapi-python/elabapi_python/models/inline_response2001.py new file mode 100644 index 0000000..3ba7c34 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2001.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2001(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """InlineResponse2001 - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2001, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2001): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response20010.py b/vendor/elabapi-python/elabapi_python/models/inline_response20010.py new file mode 100644 index 0000000..c64b81f --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response20010.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse20010(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'uuid': 'str', + 'public_url': 'str' + } + + attribute_map = { + 'id': 'id', + 'uuid': 'uuid', + 'public_url': 'publicUrl' + } + + def __init__(self, id=None, uuid=None, public_url=None): # noqa: E501 + """InlineResponse20010 - a model defined in Swagger""" # noqa: E501 + self._id = None + self._uuid = None + self._public_url = None + self.discriminator = None + if id is not None: + self.id = id + if uuid is not None: + self.uuid = uuid + if public_url is not None: + self.public_url = public_url + + @property + def id(self): + """Gets the id of this InlineResponse20010. # noqa: E501 + + + :return: The id of this InlineResponse20010. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this InlineResponse20010. + + + :param id: The id of this InlineResponse20010. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def uuid(self): + """Gets the uuid of this InlineResponse20010. # noqa: E501 + + + :return: The uuid of this InlineResponse20010. # noqa: E501 + :rtype: str + """ + return self._uuid + + @uuid.setter + def uuid(self, uuid): + """Sets the uuid of this InlineResponse20010. + + + :param uuid: The uuid of this InlineResponse20010. # noqa: E501 + :type: str + """ + + self._uuid = uuid + + @property + def public_url(self): + """Gets the public_url of this InlineResponse20010. # noqa: E501 + + + :return: The public_url of this InlineResponse20010. # noqa: E501 + :rtype: str + """ + return self._public_url + + @public_url.setter + def public_url(self, public_url): + """Sets the public_url of this InlineResponse20010. + + + :param public_url: The public_url of this InlineResponse20010. # noqa: E501 + :type: str + """ + + self._public_url = public_url + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse20010, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse20010): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2001_experiments.py b/vendor/elabapi-python/elabapi_python/models/inline_response2001_experiments.py new file mode 100644 index 0000000..5a5bae4 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2001_experiments.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2001Experiments(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'bucket_start': 'date', + 'total': 'int' + } + + attribute_map = { + 'bucket_start': 'bucket_start', + 'total': 'total' + } + + def __init__(self, bucket_start=None, total=None): # noqa: E501 + """InlineResponse2001Experiments - a model defined in Swagger""" # noqa: E501 + self._bucket_start = None + self._total = None + self.discriminator = None + if bucket_start is not None: + self.bucket_start = bucket_start + if total is not None: + self.total = total + + @property + def bucket_start(self): + """Gets the bucket_start of this InlineResponse2001Experiments. # noqa: E501 + + + :return: The bucket_start of this InlineResponse2001Experiments. # noqa: E501 + :rtype: date + """ + return self._bucket_start + + @bucket_start.setter + def bucket_start(self, bucket_start): + """Sets the bucket_start of this InlineResponse2001Experiments. + + + :param bucket_start: The bucket_start of this InlineResponse2001Experiments. # noqa: E501 + :type: date + """ + + self._bucket_start = bucket_start + + @property + def total(self): + """Gets the total of this InlineResponse2001Experiments. # noqa: E501 + + + :return: The total of this InlineResponse2001Experiments. # noqa: E501 + :rtype: int + """ + return self._total + + @total.setter + def total(self, total): + """Sets the total of this InlineResponse2001Experiments. + + + :param total: The total of this InlineResponse2001Experiments. # noqa: E501 + :type: int + """ + + self._total = total + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2001Experiments, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2001Experiments): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2001_items.py b/vendor/elabapi-python/elabapi_python/models/inline_response2001_items.py new file mode 100644 index 0000000..9a71afe --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2001_items.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2001Items(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'bucket_start': 'date', + 'total': 'int' + } + + attribute_map = { + 'bucket_start': 'bucket_start', + 'total': 'total' + } + + def __init__(self, bucket_start=None, total=None): # noqa: E501 + """InlineResponse2001Items - a model defined in Swagger""" # noqa: E501 + self._bucket_start = None + self._total = None + self.discriminator = None + if bucket_start is not None: + self.bucket_start = bucket_start + if total is not None: + self.total = total + + @property + def bucket_start(self): + """Gets the bucket_start of this InlineResponse2001Items. # noqa: E501 + + + :return: The bucket_start of this InlineResponse2001Items. # noqa: E501 + :rtype: date + """ + return self._bucket_start + + @bucket_start.setter + def bucket_start(self, bucket_start): + """Sets the bucket_start of this InlineResponse2001Items. + + + :param bucket_start: The bucket_start of this InlineResponse2001Items. # noqa: E501 + :type: date + """ + + self._bucket_start = bucket_start + + @property + def total(self): + """Gets the total of this InlineResponse2001Items. # noqa: E501 + + + :return: The total of this InlineResponse2001Items. # noqa: E501 + :rtype: int + """ + return self._total + + @total.setter + def total(self, total): + """Sets the total of this InlineResponse2001Items. + + + :param total: The total of this InlineResponse2001Items. # noqa: E501 + :type: int + """ + + self._total = total + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2001Items, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2001Items): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2001_users.py b/vendor/elabapi-python/elabapi_python/models/inline_response2001_users.py new file mode 100644 index 0000000..957b7bf --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2001_users.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2001Users(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'bucket_start': 'date', + 'total': 'int' + } + + attribute_map = { + 'bucket_start': 'bucket_start', + 'total': 'total' + } + + def __init__(self, bucket_start=None, total=None): # noqa: E501 + """InlineResponse2001Users - a model defined in Swagger""" # noqa: E501 + self._bucket_start = None + self._total = None + self.discriminator = None + if bucket_start is not None: + self.bucket_start = bucket_start + if total is not None: + self.total = total + + @property + def bucket_start(self): + """Gets the bucket_start of this InlineResponse2001Users. # noqa: E501 + + + :return: The bucket_start of this InlineResponse2001Users. # noqa: E501 + :rtype: date + """ + return self._bucket_start + + @bucket_start.setter + def bucket_start(self, bucket_start): + """Sets the bucket_start of this InlineResponse2001Users. + + + :param bucket_start: The bucket_start of this InlineResponse2001Users. # noqa: E501 + :type: date + """ + + self._bucket_start = bucket_start + + @property + def total(self): + """Gets the total of this InlineResponse2001Users. # noqa: E501 + + + :return: The total of this InlineResponse2001Users. # noqa: E501 + :rtype: int + """ + return self._total + + @total.setter + def total(self, total): + """Sets the total of this InlineResponse2001Users. + + + :param total: The total of this InlineResponse2001Users. # noqa: E501 + :type: int + """ + + self._total = total + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2001Users, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2001Users): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2002.py b/vendor/elabapi-python/elabapi_python/models/inline_response2002.py new file mode 100644 index 0000000..8bd03e9 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2002.py @@ -0,0 +1,196 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2002(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'allowed_extensions': 'list[str]', + 'max_filesize': 'int', + 'max_upload_size': 'str', + 'max_upload_time': 'int' + } + + attribute_map = { + 'allowed_extensions': 'allowed_extensions', + 'max_filesize': 'max_filesize', + 'max_upload_size': 'max_upload_size', + 'max_upload_time': 'max_upload_time' + } + + def __init__(self, allowed_extensions=None, max_filesize=None, max_upload_size=None, max_upload_time=None): # noqa: E501 + """InlineResponse2002 - a model defined in Swagger""" # noqa: E501 + self._allowed_extensions = None + self._max_filesize = None + self._max_upload_size = None + self._max_upload_time = None + self.discriminator = None + if allowed_extensions is not None: + self.allowed_extensions = allowed_extensions + if max_filesize is not None: + self.max_filesize = max_filesize + if max_upload_size is not None: + self.max_upload_size = max_upload_size + if max_upload_time is not None: + self.max_upload_time = max_upload_time + + @property + def allowed_extensions(self): + """Gets the allowed_extensions of this InlineResponse2002. # noqa: E501 + + allowlist of file extensions accepted for import # noqa: E501 + + :return: The allowed_extensions of this InlineResponse2002. # noqa: E501 + :rtype: list[str] + """ + return self._allowed_extensions + + @allowed_extensions.setter + def allowed_extensions(self, allowed_extensions): + """Sets the allowed_extensions of this InlineResponse2002. + + allowlist of file extensions accepted for import # noqa: E501 + + :param allowed_extensions: The allowed_extensions of this InlineResponse2002. # noqa: E501 + :type: list[str] + """ + + self._allowed_extensions = allowed_extensions + + @property + def max_filesize(self): + """Gets the max_filesize of this InlineResponse2002. # noqa: E501 + + maximum size of an uploaded file in bytes # noqa: E501 + + :return: The max_filesize of this InlineResponse2002. # noqa: E501 + :rtype: int + """ + return self._max_filesize + + @max_filesize.setter + def max_filesize(self, max_filesize): + """Sets the max_filesize of this InlineResponse2002. + + maximum size of an uploaded file in bytes # noqa: E501 + + :param max_filesize: The max_filesize of this InlineResponse2002. # noqa: E501 + :type: int + """ + + self._max_filesize = max_filesize + + @property + def max_upload_size(self): + """Gets the max_upload_size of this InlineResponse2002. # noqa: E501 + + value of MAX_UPLOAD_SIZE env parameter # noqa: E501 + + :return: The max_upload_size of this InlineResponse2002. # noqa: E501 + :rtype: str + """ + return self._max_upload_size + + @max_upload_size.setter + def max_upload_size(self, max_upload_size): + """Sets the max_upload_size of this InlineResponse2002. + + value of MAX_UPLOAD_SIZE env parameter # noqa: E501 + + :param max_upload_size: The max_upload_size of this InlineResponse2002. # noqa: E501 + :type: str + """ + + self._max_upload_size = max_upload_size + + @property + def max_upload_time(self): + """Gets the max_upload_time of this InlineResponse2002. # noqa: E501 + + value of MAX_UPLOAD_TIME env parameter # noqa: E501 + + :return: The max_upload_time of this InlineResponse2002. # noqa: E501 + :rtype: int + """ + return self._max_upload_time + + @max_upload_time.setter + def max_upload_time(self, max_upload_time): + """Sets the max_upload_time of this InlineResponse2002. + + value of MAX_UPLOAD_TIME env parameter # noqa: E501 + + :param max_upload_time: The max_upload_time of this InlineResponse2002. # noqa: E501 + :type: int + """ + + self._max_upload_time = max_upload_time + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2002, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2002): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2003.py b/vendor/elabapi-python/elabapi_python/models/inline_response2003.py new file mode 100644 index 0000000..0d79c2e --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2003.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2003(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'users_id': 'int', + 'tags_id': 'int', + 'tag': 'str' + } + + attribute_map = { + 'users_id': 'users_id', + 'tags_id': 'tags_id', + 'tag': 'tag' + } + + def __init__(self, users_id=None, tags_id=None, tag=None): # noqa: E501 + """InlineResponse2003 - a model defined in Swagger""" # noqa: E501 + self._users_id = None + self._tags_id = None + self._tag = None + self.discriminator = None + if users_id is not None: + self.users_id = users_id + if tags_id is not None: + self.tags_id = tags_id + if tag is not None: + self.tag = tag + + @property + def users_id(self): + """Gets the users_id of this InlineResponse2003. # noqa: E501 + + + :return: The users_id of this InlineResponse2003. # noqa: E501 + :rtype: int + """ + return self._users_id + + @users_id.setter + def users_id(self, users_id): + """Sets the users_id of this InlineResponse2003. + + + :param users_id: The users_id of this InlineResponse2003. # noqa: E501 + :type: int + """ + + self._users_id = users_id + + @property + def tags_id(self): + """Gets the tags_id of this InlineResponse2003. # noqa: E501 + + + :return: The tags_id of this InlineResponse2003. # noqa: E501 + :rtype: int + """ + return self._tags_id + + @tags_id.setter + def tags_id(self, tags_id): + """Sets the tags_id of this InlineResponse2003. + + + :param tags_id: The tags_id of this InlineResponse2003. # noqa: E501 + :type: int + """ + + self._tags_id = tags_id + + @property + def tag(self): + """Gets the tag of this InlineResponse2003. # noqa: E501 + + + :return: The tag of this InlineResponse2003. # noqa: E501 + :rtype: str + """ + return self._tag + + @tag.setter + def tag(self, tag): + """Sets the tag of this InlineResponse2003. + + + :param tag: The tag of this InlineResponse2003. # noqa: E501 + :type: str + """ + + self._tag = tag + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2003, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2003): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2004.py b/vendor/elabapi-python/elabapi_python/models/inline_response2004.py new file mode 100644 index 0000000..7440f33 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2004.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2004(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'query_parameters': 'InlineResponse2004QueryParameters' + } + + attribute_map = { + 'query_parameters': 'query_parameters' + } + + def __init__(self, query_parameters=None): # noqa: E501 + """InlineResponse2004 - a model defined in Swagger""" # noqa: E501 + self._query_parameters = None + self.discriminator = None + if query_parameters is not None: + self.query_parameters = query_parameters + + @property + def query_parameters(self): + """Gets the query_parameters of this InlineResponse2004. # noqa: E501 + + + :return: The query_parameters of this InlineResponse2004. # noqa: E501 + :rtype: InlineResponse2004QueryParameters + """ + return self._query_parameters + + @query_parameters.setter + def query_parameters(self, query_parameters): + """Sets the query_parameters of this InlineResponse2004. + + + :param query_parameters: The query_parameters of this InlineResponse2004. # noqa: E501 + :type: InlineResponse2004QueryParameters + """ + + self._query_parameters = query_parameters + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2004, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2004): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2004_query_parameters.py b/vendor/elabapi-python/elabapi_python/models/inline_response2004_query_parameters.py new file mode 100644 index 0000000..f33fcee --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2004_query_parameters.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2004QueryParameters(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'format': 'list[str]', + 'scope': 'list[str]' + } + + attribute_map = { + 'format': 'format', + 'scope': 'scope' + } + + def __init__(self, format=None, scope=None): # noqa: E501 + """InlineResponse2004QueryParameters - a model defined in Swagger""" # noqa: E501 + self._format = None + self._scope = None + self.discriminator = None + if format is not None: + self.format = format + if scope is not None: + self.scope = scope + + @property + def format(self): + """Gets the format of this InlineResponse2004QueryParameters. # noqa: E501 + + + :return: The format of this InlineResponse2004QueryParameters. # noqa: E501 + :rtype: list[str] + """ + return self._format + + @format.setter + def format(self, format): + """Sets the format of this InlineResponse2004QueryParameters. + + + :param format: The format of this InlineResponse2004QueryParameters. # noqa: E501 + :type: list[str] + """ + + self._format = format + + @property + def scope(self): + """Gets the scope of this InlineResponse2004QueryParameters. # noqa: E501 + + + :return: The scope of this InlineResponse2004QueryParameters. # noqa: E501 + :rtype: list[str] + """ + return self._scope + + @scope.setter + def scope(self, scope): + """Sets the scope of this InlineResponse2004QueryParameters. + + + :param scope: The scope of this InlineResponse2004QueryParameters. # noqa: E501 + :type: list[str] + """ + + self._scope = scope + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2004QueryParameters, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2004QueryParameters): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2005.py b/vendor/elabapi-python/elabapi_python/models/inline_response2005.py new file mode 100644 index 0000000..150fb58 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2005.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2005(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'name': 'str', + 'team': 'int' + } + + attribute_map = { + 'id': 'id', + 'name': 'name', + 'team': 'team' + } + + def __init__(self, id=None, name=None, team=None): # noqa: E501 + """InlineResponse2005 - a model defined in Swagger""" # noqa: E501 + self._id = None + self._name = None + self._team = None + self.discriminator = None + if id is not None: + self.id = id + if name is not None: + self.name = name + if team is not None: + self.team = team + + @property + def id(self): + """Gets the id of this InlineResponse2005. # noqa: E501 + + + :return: The id of this InlineResponse2005. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this InlineResponse2005. + + + :param id: The id of this InlineResponse2005. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def name(self): + """Gets the name of this InlineResponse2005. # noqa: E501 + + + :return: The name of this InlineResponse2005. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this InlineResponse2005. + + + :param name: The name of this InlineResponse2005. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def team(self): + """Gets the team of this InlineResponse2005. # noqa: E501 + + + :return: The team of this InlineResponse2005. # noqa: E501 + :rtype: int + """ + return self._team + + @team.setter + def team(self, team): + """Sets the team of this InlineResponse2005. + + + :param team: The team of this InlineResponse2005. # noqa: E501 + :type: int + """ + + self._team = team + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2005, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2005): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2006.py b/vendor/elabapi-python/elabapi_python/models/inline_response2006.py new file mode 100644 index 0000000..014fcee --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2006.py @@ -0,0 +1,344 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2006(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'real_name': 'str', + 'long_name': 'str', + 'created_at': 'datetime', + 'filesize': 'int', + 'type': 'str', + 'comment': 'str', + 'entity_id': 'int', + 'entity_title': 'str', + 'page': 'str' + } + + attribute_map = { + 'id': 'id', + 'real_name': 'real_name', + 'long_name': 'long_name', + 'created_at': 'created_at', + 'filesize': 'filesize', + 'type': 'type', + 'comment': 'comment', + 'entity_id': 'entity_id', + 'entity_title': 'entity_title', + 'page': 'page' + } + + def __init__(self, id=None, real_name=None, long_name=None, created_at=None, filesize=None, type=None, comment=None, entity_id=None, entity_title=None, page=None): # noqa: E501 + """InlineResponse2006 - a model defined in Swagger""" # noqa: E501 + self._id = None + self._real_name = None + self._long_name = None + self._created_at = None + self._filesize = None + self._type = None + self._comment = None + self._entity_id = None + self._entity_title = None + self._page = None + self.discriminator = None + if id is not None: + self.id = id + if real_name is not None: + self.real_name = real_name + if long_name is not None: + self.long_name = long_name + if created_at is not None: + self.created_at = created_at + if filesize is not None: + self.filesize = filesize + if type is not None: + self.type = type + if comment is not None: + self.comment = comment + if entity_id is not None: + self.entity_id = entity_id + if entity_title is not None: + self.entity_title = entity_title + if page is not None: + self.page = page + + @property + def id(self): + """Gets the id of this InlineResponse2006. # noqa: E501 + + + :return: The id of this InlineResponse2006. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this InlineResponse2006. + + + :param id: The id of this InlineResponse2006. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def real_name(self): + """Gets the real_name of this InlineResponse2006. # noqa: E501 + + + :return: The real_name of this InlineResponse2006. # noqa: E501 + :rtype: str + """ + return self._real_name + + @real_name.setter + def real_name(self, real_name): + """Sets the real_name of this InlineResponse2006. + + + :param real_name: The real_name of this InlineResponse2006. # noqa: E501 + :type: str + """ + + self._real_name = real_name + + @property + def long_name(self): + """Gets the long_name of this InlineResponse2006. # noqa: E501 + + + :return: The long_name of this InlineResponse2006. # noqa: E501 + :rtype: str + """ + return self._long_name + + @long_name.setter + def long_name(self, long_name): + """Sets the long_name of this InlineResponse2006. + + + :param long_name: The long_name of this InlineResponse2006. # noqa: E501 + :type: str + """ + + self._long_name = long_name + + @property + def created_at(self): + """Gets the created_at of this InlineResponse2006. # noqa: E501 + + + :return: The created_at of this InlineResponse2006. # noqa: E501 + :rtype: datetime + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this InlineResponse2006. + + + :param created_at: The created_at of this InlineResponse2006. # noqa: E501 + :type: datetime + """ + + self._created_at = created_at + + @property + def filesize(self): + """Gets the filesize of this InlineResponse2006. # noqa: E501 + + + :return: The filesize of this InlineResponse2006. # noqa: E501 + :rtype: int + """ + return self._filesize + + @filesize.setter + def filesize(self, filesize): + """Sets the filesize of this InlineResponse2006. + + + :param filesize: The filesize of this InlineResponse2006. # noqa: E501 + :type: int + """ + + self._filesize = filesize + + @property + def type(self): + """Gets the type of this InlineResponse2006. # noqa: E501 + + + :return: The type of this InlineResponse2006. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this InlineResponse2006. + + + :param type: The type of this InlineResponse2006. # noqa: E501 + :type: str + """ + + self._type = type + + @property + def comment(self): + """Gets the comment of this InlineResponse2006. # noqa: E501 + + + :return: The comment of this InlineResponse2006. # noqa: E501 + :rtype: str + """ + return self._comment + + @comment.setter + def comment(self, comment): + """Sets the comment of this InlineResponse2006. + + + :param comment: The comment of this InlineResponse2006. # noqa: E501 + :type: str + """ + + self._comment = comment + + @property + def entity_id(self): + """Gets the entity_id of this InlineResponse2006. # noqa: E501 + + + :return: The entity_id of this InlineResponse2006. # noqa: E501 + :rtype: int + """ + return self._entity_id + + @entity_id.setter + def entity_id(self, entity_id): + """Sets the entity_id of this InlineResponse2006. + + + :param entity_id: The entity_id of this InlineResponse2006. # noqa: E501 + :type: int + """ + + self._entity_id = entity_id + + @property + def entity_title(self): + """Gets the entity_title of this InlineResponse2006. # noqa: E501 + + + :return: The entity_title of this InlineResponse2006. # noqa: E501 + :rtype: str + """ + return self._entity_title + + @entity_title.setter + def entity_title(self, entity_title): + """Sets the entity_title of this InlineResponse2006. + + + :param entity_title: The entity_title of this InlineResponse2006. # noqa: E501 + :type: str + """ + + self._entity_title = entity_title + + @property + def page(self): + """Gets the page of this InlineResponse2006. # noqa: E501 + + + :return: The page of this InlineResponse2006. # noqa: E501 + :rtype: str + """ + return self._page + + @page.setter + def page(self, page): + """Sets the page of this InlineResponse2006. + + + :param page: The page of this InlineResponse2006. # noqa: E501 + :type: str + """ + + self._page = page + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2006, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2006): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2007.py b/vendor/elabapi-python/elabapi_python/models/inline_response2007.py new file mode 100644 index 0000000..ed61c51 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2007.py @@ -0,0 +1,240 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2007(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'category': 'int', + 'body': 'object', + 'is_ack': 'int', + 'created_at': 'str', + 'userid': 'int' + } + + attribute_map = { + 'id': 'id', + 'category': 'category', + 'body': 'body', + 'is_ack': 'is_ack', + 'created_at': 'created_at', + 'userid': 'userid' + } + + def __init__(self, id=None, category=None, body=None, is_ack=None, created_at=None, userid=None): # noqa: E501 + """InlineResponse2007 - a model defined in Swagger""" # noqa: E501 + self._id = None + self._category = None + self._body = None + self._is_ack = None + self._created_at = None + self._userid = None + self.discriminator = None + if id is not None: + self.id = id + if category is not None: + self.category = category + if body is not None: + self.body = body + if is_ack is not None: + self.is_ack = is_ack + if created_at is not None: + self.created_at = created_at + if userid is not None: + self.userid = userid + + @property + def id(self): + """Gets the id of this InlineResponse2007. # noqa: E501 + + + :return: The id of this InlineResponse2007. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this InlineResponse2007. + + + :param id: The id of this InlineResponse2007. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def category(self): + """Gets the category of this InlineResponse2007. # noqa: E501 + + + :return: The category of this InlineResponse2007. # noqa: E501 + :rtype: int + """ + return self._category + + @category.setter + def category(self, category): + """Sets the category of this InlineResponse2007. + + + :param category: The category of this InlineResponse2007. # noqa: E501 + :type: int + """ + + self._category = category + + @property + def body(self): + """Gets the body of this InlineResponse2007. # noqa: E501 + + + :return: The body of this InlineResponse2007. # noqa: E501 + :rtype: object + """ + return self._body + + @body.setter + def body(self, body): + """Sets the body of this InlineResponse2007. + + + :param body: The body of this InlineResponse2007. # noqa: E501 + :type: object + """ + + self._body = body + + @property + def is_ack(self): + """Gets the is_ack of this InlineResponse2007. # noqa: E501 + + + :return: The is_ack of this InlineResponse2007. # noqa: E501 + :rtype: int + """ + return self._is_ack + + @is_ack.setter + def is_ack(self, is_ack): + """Sets the is_ack of this InlineResponse2007. + + + :param is_ack: The is_ack of this InlineResponse2007. # noqa: E501 + :type: int + """ + + self._is_ack = is_ack + + @property + def created_at(self): + """Gets the created_at of this InlineResponse2007. # noqa: E501 + + + :return: The created_at of this InlineResponse2007. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this InlineResponse2007. + + + :param created_at: The created_at of this InlineResponse2007. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def userid(self): + """Gets the userid of this InlineResponse2007. # noqa: E501 + + + :return: The userid of this InlineResponse2007. # noqa: E501 + :rtype: int + """ + return self._userid + + @userid.setter + def userid(self, userid): + """Sets the userid of this InlineResponse2007. + + + :param userid: The userid of this InlineResponse2007. # noqa: E501 + :type: int + """ + + self._userid = userid + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2007, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2007): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2008.py b/vendor/elabapi-python/elabapi_python/models/inline_response2008.py new file mode 100644 index 0000000..aa8828d --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2008.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2008(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'content_type': 'int', + 'created_at': 'str', + 'fullname': 'str' + } + + attribute_map = { + 'id': 'id', + 'content_type': 'content_type', + 'created_at': 'created_at', + 'fullname': 'fullname' + } + + def __init__(self, id=None, content_type=None, created_at=None, fullname=None): # noqa: E501 + """InlineResponse2008 - a model defined in Swagger""" # noqa: E501 + self._id = None + self._content_type = None + self._created_at = None + self._fullname = None + self.discriminator = None + if id is not None: + self.id = id + if content_type is not None: + self.content_type = content_type + if created_at is not None: + self.created_at = created_at + if fullname is not None: + self.fullname = fullname + + @property + def id(self): + """Gets the id of this InlineResponse2008. # noqa: E501 + + + :return: The id of this InlineResponse2008. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this InlineResponse2008. + + + :param id: The id of this InlineResponse2008. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def content_type(self): + """Gets the content_type of this InlineResponse2008. # noqa: E501 + + + :return: The content_type of this InlineResponse2008. # noqa: E501 + :rtype: int + """ + return self._content_type + + @content_type.setter + def content_type(self, content_type): + """Sets the content_type of this InlineResponse2008. + + + :param content_type: The content_type of this InlineResponse2008. # noqa: E501 + :type: int + """ + + self._content_type = content_type + + @property + def created_at(self): + """Gets the created_at of this InlineResponse2008. # noqa: E501 + + + :return: The created_at of this InlineResponse2008. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this InlineResponse2008. + + + :param created_at: The created_at of this InlineResponse2008. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def fullname(self): + """Gets the fullname of this InlineResponse2008. # noqa: E501 + + + :return: The fullname of this InlineResponse2008. # noqa: E501 + :rtype: str + """ + return self._fullname + + @fullname.setter + def fullname(self, fullname): + """Sets the fullname of this InlineResponse2008. + + + :param fullname: The fullname of this InlineResponse2008. # noqa: E501 + :type: str + """ + + self._fullname = fullname + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2008, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2008): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2009.py b/vendor/elabapi-python/elabapi_python/models/inline_response2009.py new file mode 100644 index 0000000..7bb2543 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2009.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2009(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """InlineResponse2009 - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2009, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2009): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2009_embedded.py b/vendor/elabapi-python/elabapi_python/models/inline_response2009_embedded.py new file mode 100644 index 0000000..aa1ff44 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2009_embedded.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2009Embedded(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entries': 'list[InlineResponse2009EmbeddedEntries]' + } + + attribute_map = { + 'entries': 'entries' + } + + def __init__(self, entries=None): # noqa: E501 + """InlineResponse2009Embedded - a model defined in Swagger""" # noqa: E501 + self._entries = None + self.discriminator = None + if entries is not None: + self.entries = entries + + @property + def entries(self): + """Gets the entries of this InlineResponse2009Embedded. # noqa: E501 + + + :return: The entries of this InlineResponse2009Embedded. # noqa: E501 + :rtype: list[InlineResponse2009EmbeddedEntries] + """ + return self._entries + + @entries.setter + def entries(self, entries): + """Sets the entries of this InlineResponse2009Embedded. + + + :param entries: The entries of this InlineResponse2009Embedded. # noqa: E501 + :type: list[InlineResponse2009EmbeddedEntries] + """ + + self._entries = entries + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2009Embedded, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2009Embedded): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/inline_response2009_embedded_entries.py b/vendor/elabapi-python/elabapi_python/models/inline_response2009_embedded_entries.py new file mode 100644 index 0000000..3ba6f1d --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/inline_response2009_embedded_entries.py @@ -0,0 +1,169 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InlineResponse2009EmbeddedEntries(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'value': 'str', + 'display': 'str', + 'type': 'str' + } + + attribute_map = { + 'value': 'value', + 'display': 'display', + 'type': 'type' + } + + def __init__(self, value=None, display=None, type=None): # noqa: E501 + """InlineResponse2009EmbeddedEntries - a model defined in Swagger""" # noqa: E501 + self._value = None + self._display = None + self._type = None + self.discriminator = None + self.value = value + self.display = display + self.type = type + + @property + def value(self): + """Gets the value of this InlineResponse2009EmbeddedEntries. # noqa: E501 + + Internal type value. # noqa: E501 + + :return: The value of this InlineResponse2009EmbeddedEntries. # noqa: E501 + :rtype: str + """ + return self._value + + @value.setter + def value(self, value): + """Sets the value of this InlineResponse2009EmbeddedEntries. + + Internal type value. # noqa: E501 + + :param value: The value of this InlineResponse2009EmbeddedEntries. # noqa: E501 + :type: str + """ + if value is None: + raise ValueError("Invalid value for `value`, must not be `None`") # noqa: E501 + + self._value = value + + @property + def display(self): + """Gets the display of this InlineResponse2009EmbeddedEntries. # noqa: E501 + + Human-readable label. # noqa: E501 + + :return: The display of this InlineResponse2009EmbeddedEntries. # noqa: E501 + :rtype: str + """ + return self._display + + @display.setter + def display(self, display): + """Sets the display of this InlineResponse2009EmbeddedEntries. + + Human-readable label. # noqa: E501 + + :param display: The display of this InlineResponse2009EmbeddedEntries. # noqa: E501 + :type: str + """ + if display is None: + raise ValueError("Invalid value for `display`, must not be `None`") # noqa: E501 + + self._display = display + + @property + def type(self): + """Gets the type of this InlineResponse2009EmbeddedEntries. # noqa: E501 + + + :return: The type of this InlineResponse2009EmbeddedEntries. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this InlineResponse2009EmbeddedEntries. + + + :param type: The type of this InlineResponse2009EmbeddedEntries. # noqa: E501 + :type: str + """ + if type is None: + raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InlineResponse2009EmbeddedEntries, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InlineResponse2009EmbeddedEntries): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/instance_body.py b/vendor/elabapi-python/elabapi_python/models/instance_body.py new file mode 100644 index 0000000..cc35494 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/instance_body.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InstanceBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """InstanceBody - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InstanceBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InstanceBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/item.py b/vendor/elabapi-python/elabapi_python/models/item.py new file mode 100644 index 0000000..da108b2 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/item.py @@ -0,0 +1,450 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from elabapi_python.models.entity import Entity # noqa: F401,E501 + +class Item(Entity): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'is_bookable': 'int', + 'canbook_base': 'float', + 'canbook': 'str', + 'book_max_minutes': 'int', + 'book_max_slots': 'int', + 'book_can_overlap': 'int', + 'book_users_can_in_past': 'int', + 'book_is_cancellable': 'int', + 'book_cancel_minutes': 'int', + 'booking_window_days': 'int', + 'booking_hourly_rate_notax': 'float', + 'booking_hourly_rate_tax': 'float', + 'booking_hourly_rate_currency': 'int' + } + if hasattr(Entity, "swagger_types"): + swagger_types.update(Entity.swagger_types) + + attribute_map = { + 'is_bookable': 'is_bookable', + 'canbook_base': 'canbook_base', + 'canbook': 'canbook', + 'book_max_minutes': 'book_max_minutes', + 'book_max_slots': 'book_max_slots', + 'book_can_overlap': 'book_can_overlap', + 'book_users_can_in_past': 'book_users_can_in_past', + 'book_is_cancellable': 'book_is_cancellable', + 'book_cancel_minutes': 'book_cancel_minutes', + 'booking_window_days': 'booking_window_days', + 'booking_hourly_rate_notax': 'booking_hourly_rate_notax', + 'booking_hourly_rate_tax': 'booking_hourly_rate_tax', + 'booking_hourly_rate_currency': 'booking_hourly_rate_currency' + } + if hasattr(Entity, "attribute_map"): + attribute_map.update(Entity.attribute_map) + + def __init__(self, is_bookable=None, canbook_base=None, canbook=None, book_max_minutes=None, book_max_slots=None, book_can_overlap=None, book_users_can_in_past=None, book_is_cancellable=None, book_cancel_minutes=None, booking_window_days=None, booking_hourly_rate_notax=None, booking_hourly_rate_tax=None, booking_hourly_rate_currency=None, *args, **kwargs): # noqa: E501 + """Item - a model defined in Swagger""" # noqa: E501 + self._is_bookable = None + self._canbook_base = None + self._canbook = None + self._book_max_minutes = None + self._book_max_slots = None + self._book_can_overlap = None + self._book_users_can_in_past = None + self._book_is_cancellable = None + self._book_cancel_minutes = None + self._booking_window_days = None + self._booking_hourly_rate_notax = None + self._booking_hourly_rate_tax = None + self._booking_hourly_rate_currency = None + self.discriminator = None + if is_bookable is not None: + self.is_bookable = is_bookable + if canbook_base is not None: + self.canbook_base = canbook_base + if canbook is not None: + self.canbook = canbook + if book_max_minutes is not None: + self.book_max_minutes = book_max_minutes + if book_max_slots is not None: + self.book_max_slots = book_max_slots + if book_can_overlap is not None: + self.book_can_overlap = book_can_overlap + if book_users_can_in_past is not None: + self.book_users_can_in_past = book_users_can_in_past + if book_is_cancellable is not None: + self.book_is_cancellable = book_is_cancellable + if book_cancel_minutes is not None: + self.book_cancel_minutes = book_cancel_minutes + if booking_window_days is not None: + self.booking_window_days = booking_window_days + if booking_hourly_rate_notax is not None: + self.booking_hourly_rate_notax = booking_hourly_rate_notax + if booking_hourly_rate_tax is not None: + self.booking_hourly_rate_tax = booking_hourly_rate_tax + if booking_hourly_rate_currency is not None: + self.booking_hourly_rate_currency = booking_hourly_rate_currency + Entity.__init__(self, *args, **kwargs) + + @property + def is_bookable(self): + """Gets the is_bookable of this Item. # noqa: E501 + + + :return: The is_bookable of this Item. # noqa: E501 + :rtype: int + """ + return self._is_bookable + + @is_bookable.setter + def is_bookable(self, is_bookable): + """Sets the is_bookable of this Item. + + + :param is_bookable: The is_bookable of this Item. # noqa: E501 + :type: int + """ + + self._is_bookable = is_bookable + + @property + def canbook_base(self): + """Gets the canbook_base of this Item. # noqa: E501 + + Base permission for booking access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :return: The canbook_base of this Item. # noqa: E501 + :rtype: float + """ + return self._canbook_base + + @canbook_base.setter + def canbook_base(self, canbook_base): + """Sets the canbook_base of this Item. + + Base permission for booking access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :param canbook_base: The canbook_base of this Item. # noqa: E501 + :type: float + """ + allowed_values = [10, 20, 30, 40, 50] # noqa: E501 + if canbook_base not in allowed_values: + raise ValueError( + "Invalid value for `canbook_base` ({0}), must be one of {1}" # noqa: E501 + .format(canbook_base, allowed_values) + ) + + self._canbook_base = canbook_base + + @property + def canbook(self): + """Gets the canbook of this Item. # noqa: E501 + + + :return: The canbook of this Item. # noqa: E501 + :rtype: str + """ + return self._canbook + + @canbook.setter + def canbook(self, canbook): + """Sets the canbook of this Item. + + + :param canbook: The canbook of this Item. # noqa: E501 + :type: str + """ + + self._canbook = canbook + + @property + def book_max_minutes(self): + """Gets the book_max_minutes of this Item. # noqa: E501 + + + :return: The book_max_minutes of this Item. # noqa: E501 + :rtype: int + """ + return self._book_max_minutes + + @book_max_minutes.setter + def book_max_minutes(self, book_max_minutes): + """Sets the book_max_minutes of this Item. + + + :param book_max_minutes: The book_max_minutes of this Item. # noqa: E501 + :type: int + """ + + self._book_max_minutes = book_max_minutes + + @property + def book_max_slots(self): + """Gets the book_max_slots of this Item. # noqa: E501 + + + :return: The book_max_slots of this Item. # noqa: E501 + :rtype: int + """ + return self._book_max_slots + + @book_max_slots.setter + def book_max_slots(self, book_max_slots): + """Sets the book_max_slots of this Item. + + + :param book_max_slots: The book_max_slots of this Item. # noqa: E501 + :type: int + """ + + self._book_max_slots = book_max_slots + + @property + def book_can_overlap(self): + """Gets the book_can_overlap of this Item. # noqa: E501 + + + :return: The book_can_overlap of this Item. # noqa: E501 + :rtype: int + """ + return self._book_can_overlap + + @book_can_overlap.setter + def book_can_overlap(self, book_can_overlap): + """Sets the book_can_overlap of this Item. + + + :param book_can_overlap: The book_can_overlap of this Item. # noqa: E501 + :type: int + """ + + self._book_can_overlap = book_can_overlap + + @property + def book_users_can_in_past(self): + """Gets the book_users_can_in_past of this Item. # noqa: E501 + + + :return: The book_users_can_in_past of this Item. # noqa: E501 + :rtype: int + """ + return self._book_users_can_in_past + + @book_users_can_in_past.setter + def book_users_can_in_past(self, book_users_can_in_past): + """Sets the book_users_can_in_past of this Item. + + + :param book_users_can_in_past: The book_users_can_in_past of this Item. # noqa: E501 + :type: int + """ + + self._book_users_can_in_past = book_users_can_in_past + + @property + def book_is_cancellable(self): + """Gets the book_is_cancellable of this Item. # noqa: E501 + + + :return: The book_is_cancellable of this Item. # noqa: E501 + :rtype: int + """ + return self._book_is_cancellable + + @book_is_cancellable.setter + def book_is_cancellable(self, book_is_cancellable): + """Sets the book_is_cancellable of this Item. + + + :param book_is_cancellable: The book_is_cancellable of this Item. # noqa: E501 + :type: int + """ + + self._book_is_cancellable = book_is_cancellable + + @property + def book_cancel_minutes(self): + """Gets the book_cancel_minutes of this Item. # noqa: E501 + + + :return: The book_cancel_minutes of this Item. # noqa: E501 + :rtype: int + """ + return self._book_cancel_minutes + + @book_cancel_minutes.setter + def book_cancel_minutes(self, book_cancel_minutes): + """Sets the book_cancel_minutes of this Item. + + + :param book_cancel_minutes: The book_cancel_minutes of this Item. # noqa: E501 + :type: int + """ + + self._book_cancel_minutes = book_cancel_minutes + + @property + def booking_window_days(self): + """Gets the booking_window_days of this Item. # noqa: E501 + + How many days in advance users can book an item. 0 means no limit. # noqa: E501 + + :return: The booking_window_days of this Item. # noqa: E501 + :rtype: int + """ + return self._booking_window_days + + @booking_window_days.setter + def booking_window_days(self, booking_window_days): + """Sets the booking_window_days of this Item. + + How many days in advance users can book an item. 0 means no limit. # noqa: E501 + + :param booking_window_days: The booking_window_days of this Item. # noqa: E501 + :type: int + """ + + self._booking_window_days = booking_window_days + + @property + def booking_hourly_rate_notax(self): + """Gets the booking_hourly_rate_notax of this Item. # noqa: E501 + + The hourly rate of booked resource, without taxes. # noqa: E501 + + :return: The booking_hourly_rate_notax of this Item. # noqa: E501 + :rtype: float + """ + return self._booking_hourly_rate_notax + + @booking_hourly_rate_notax.setter + def booking_hourly_rate_notax(self, booking_hourly_rate_notax): + """Sets the booking_hourly_rate_notax of this Item. + + The hourly rate of booked resource, without taxes. # noqa: E501 + + :param booking_hourly_rate_notax: The booking_hourly_rate_notax of this Item. # noqa: E501 + :type: float + """ + + self._booking_hourly_rate_notax = booking_hourly_rate_notax + + @property + def booking_hourly_rate_tax(self): + """Gets the booking_hourly_rate_tax of this Item. # noqa: E501 + + The hourly rate of booked resource, with taxes. # noqa: E501 + + :return: The booking_hourly_rate_tax of this Item. # noqa: E501 + :rtype: float + """ + return self._booking_hourly_rate_tax + + @booking_hourly_rate_tax.setter + def booking_hourly_rate_tax(self, booking_hourly_rate_tax): + """Sets the booking_hourly_rate_tax of this Item. + + The hourly rate of booked resource, with taxes. # noqa: E501 + + :param booking_hourly_rate_tax: The booking_hourly_rate_tax of this Item. # noqa: E501 + :type: float + """ + + self._booking_hourly_rate_tax = booking_hourly_rate_tax + + @property + def booking_hourly_rate_currency(self): + """Gets the booking_hourly_rate_currency of this Item. # noqa: E501 + + The currency of the hourly rate: - 0: CAD - 1: CHF - 2: CNY - 3: DKK - 4: EUR - 5: GBP - 6: JPY - 7: USD - 8: SEK - 9: NOK # noqa: E501 + + :return: The booking_hourly_rate_currency of this Item. # noqa: E501 + :rtype: int + """ + return self._booking_hourly_rate_currency + + @booking_hourly_rate_currency.setter + def booking_hourly_rate_currency(self, booking_hourly_rate_currency): + """Sets the booking_hourly_rate_currency of this Item. + + The currency of the hourly rate: - 0: CAD - 1: CHF - 2: CNY - 3: DKK - 4: EUR - 5: GBP - 6: JPY - 7: USD - 8: SEK - 9: NOK # noqa: E501 + + :param booking_hourly_rate_currency: The booking_hourly_rate_currency of this Item. # noqa: E501 + :type: int + """ + allowed_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # noqa: E501 + if booking_hourly_rate_currency not in allowed_values: + raise ValueError( + "Invalid value for `booking_hourly_rate_currency` ({0}), must be one of {1}" # noqa: E501 + .format(booking_hourly_rate_currency, allowed_values) + ) + + self._booking_hourly_rate_currency = booking_hourly_rate_currency + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Item, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Item): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/item_editable.py b/vendor/elabapi-python/elabapi_python/models/item_editable.py new file mode 100644 index 0000000..9e66c79 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/item_editable.py @@ -0,0 +1,444 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ItemEditable(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'is_bookable': 'int', + 'canbook_base': 'float', + 'canbook': 'str', + 'book_max_minutes': 'int', + 'book_max_slots': 'int', + 'book_can_overlap': 'int', + 'book_users_can_in_past': 'int', + 'book_is_cancellable': 'int', + 'book_cancel_minutes': 'int', + 'booking_window_days': 'int', + 'booking_hourly_rate_notax': 'float', + 'booking_hourly_rate_tax': 'float', + 'booking_hourly_rate_currency': 'int' + } + + attribute_map = { + 'is_bookable': 'is_bookable', + 'canbook_base': 'canbook_base', + 'canbook': 'canbook', + 'book_max_minutes': 'book_max_minutes', + 'book_max_slots': 'book_max_slots', + 'book_can_overlap': 'book_can_overlap', + 'book_users_can_in_past': 'book_users_can_in_past', + 'book_is_cancellable': 'book_is_cancellable', + 'book_cancel_minutes': 'book_cancel_minutes', + 'booking_window_days': 'booking_window_days', + 'booking_hourly_rate_notax': 'booking_hourly_rate_notax', + 'booking_hourly_rate_tax': 'booking_hourly_rate_tax', + 'booking_hourly_rate_currency': 'booking_hourly_rate_currency' + } + + def __init__(self, is_bookable=None, canbook_base=None, canbook=None, book_max_minutes=None, book_max_slots=None, book_can_overlap=None, book_users_can_in_past=None, book_is_cancellable=None, book_cancel_minutes=None, booking_window_days=None, booking_hourly_rate_notax=None, booking_hourly_rate_tax=None, booking_hourly_rate_currency=None): # noqa: E501 + """ItemEditable - a model defined in Swagger""" # noqa: E501 + self._is_bookable = None + self._canbook_base = None + self._canbook = None + self._book_max_minutes = None + self._book_max_slots = None + self._book_can_overlap = None + self._book_users_can_in_past = None + self._book_is_cancellable = None + self._book_cancel_minutes = None + self._booking_window_days = None + self._booking_hourly_rate_notax = None + self._booking_hourly_rate_tax = None + self._booking_hourly_rate_currency = None + self.discriminator = None + if is_bookable is not None: + self.is_bookable = is_bookable + if canbook_base is not None: + self.canbook_base = canbook_base + if canbook is not None: + self.canbook = canbook + if book_max_minutes is not None: + self.book_max_minutes = book_max_minutes + if book_max_slots is not None: + self.book_max_slots = book_max_slots + if book_can_overlap is not None: + self.book_can_overlap = book_can_overlap + if book_users_can_in_past is not None: + self.book_users_can_in_past = book_users_can_in_past + if book_is_cancellable is not None: + self.book_is_cancellable = book_is_cancellable + if book_cancel_minutes is not None: + self.book_cancel_minutes = book_cancel_minutes + if booking_window_days is not None: + self.booking_window_days = booking_window_days + if booking_hourly_rate_notax is not None: + self.booking_hourly_rate_notax = booking_hourly_rate_notax + if booking_hourly_rate_tax is not None: + self.booking_hourly_rate_tax = booking_hourly_rate_tax + if booking_hourly_rate_currency is not None: + self.booking_hourly_rate_currency = booking_hourly_rate_currency + + @property + def is_bookable(self): + """Gets the is_bookable of this ItemEditable. # noqa: E501 + + + :return: The is_bookable of this ItemEditable. # noqa: E501 + :rtype: int + """ + return self._is_bookable + + @is_bookable.setter + def is_bookable(self, is_bookable): + """Sets the is_bookable of this ItemEditable. + + + :param is_bookable: The is_bookable of this ItemEditable. # noqa: E501 + :type: int + """ + + self._is_bookable = is_bookable + + @property + def canbook_base(self): + """Gets the canbook_base of this ItemEditable. # noqa: E501 + + Base permission for booking access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :return: The canbook_base of this ItemEditable. # noqa: E501 + :rtype: float + """ + return self._canbook_base + + @canbook_base.setter + def canbook_base(self, canbook_base): + """Sets the canbook_base of this ItemEditable. + + Base permission for booking access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :param canbook_base: The canbook_base of this ItemEditable. # noqa: E501 + :type: float + """ + allowed_values = [10, 20, 30, 40, 50] # noqa: E501 + if canbook_base not in allowed_values: + raise ValueError( + "Invalid value for `canbook_base` ({0}), must be one of {1}" # noqa: E501 + .format(canbook_base, allowed_values) + ) + + self._canbook_base = canbook_base + + @property + def canbook(self): + """Gets the canbook of this ItemEditable. # noqa: E501 + + + :return: The canbook of this ItemEditable. # noqa: E501 + :rtype: str + """ + return self._canbook + + @canbook.setter + def canbook(self, canbook): + """Sets the canbook of this ItemEditable. + + + :param canbook: The canbook of this ItemEditable. # noqa: E501 + :type: str + """ + + self._canbook = canbook + + @property + def book_max_minutes(self): + """Gets the book_max_minutes of this ItemEditable. # noqa: E501 + + + :return: The book_max_minutes of this ItemEditable. # noqa: E501 + :rtype: int + """ + return self._book_max_minutes + + @book_max_minutes.setter + def book_max_minutes(self, book_max_minutes): + """Sets the book_max_minutes of this ItemEditable. + + + :param book_max_minutes: The book_max_minutes of this ItemEditable. # noqa: E501 + :type: int + """ + + self._book_max_minutes = book_max_minutes + + @property + def book_max_slots(self): + """Gets the book_max_slots of this ItemEditable. # noqa: E501 + + + :return: The book_max_slots of this ItemEditable. # noqa: E501 + :rtype: int + """ + return self._book_max_slots + + @book_max_slots.setter + def book_max_slots(self, book_max_slots): + """Sets the book_max_slots of this ItemEditable. + + + :param book_max_slots: The book_max_slots of this ItemEditable. # noqa: E501 + :type: int + """ + + self._book_max_slots = book_max_slots + + @property + def book_can_overlap(self): + """Gets the book_can_overlap of this ItemEditable. # noqa: E501 + + + :return: The book_can_overlap of this ItemEditable. # noqa: E501 + :rtype: int + """ + return self._book_can_overlap + + @book_can_overlap.setter + def book_can_overlap(self, book_can_overlap): + """Sets the book_can_overlap of this ItemEditable. + + + :param book_can_overlap: The book_can_overlap of this ItemEditable. # noqa: E501 + :type: int + """ + + self._book_can_overlap = book_can_overlap + + @property + def book_users_can_in_past(self): + """Gets the book_users_can_in_past of this ItemEditable. # noqa: E501 + + + :return: The book_users_can_in_past of this ItemEditable. # noqa: E501 + :rtype: int + """ + return self._book_users_can_in_past + + @book_users_can_in_past.setter + def book_users_can_in_past(self, book_users_can_in_past): + """Sets the book_users_can_in_past of this ItemEditable. + + + :param book_users_can_in_past: The book_users_can_in_past of this ItemEditable. # noqa: E501 + :type: int + """ + + self._book_users_can_in_past = book_users_can_in_past + + @property + def book_is_cancellable(self): + """Gets the book_is_cancellable of this ItemEditable. # noqa: E501 + + + :return: The book_is_cancellable of this ItemEditable. # noqa: E501 + :rtype: int + """ + return self._book_is_cancellable + + @book_is_cancellable.setter + def book_is_cancellable(self, book_is_cancellable): + """Sets the book_is_cancellable of this ItemEditable. + + + :param book_is_cancellable: The book_is_cancellable of this ItemEditable. # noqa: E501 + :type: int + """ + + self._book_is_cancellable = book_is_cancellable + + @property + def book_cancel_minutes(self): + """Gets the book_cancel_minutes of this ItemEditable. # noqa: E501 + + + :return: The book_cancel_minutes of this ItemEditable. # noqa: E501 + :rtype: int + """ + return self._book_cancel_minutes + + @book_cancel_minutes.setter + def book_cancel_minutes(self, book_cancel_minutes): + """Sets the book_cancel_minutes of this ItemEditable. + + + :param book_cancel_minutes: The book_cancel_minutes of this ItemEditable. # noqa: E501 + :type: int + """ + + self._book_cancel_minutes = book_cancel_minutes + + @property + def booking_window_days(self): + """Gets the booking_window_days of this ItemEditable. # noqa: E501 + + How many days in advance users can book an item. 0 means no limit. # noqa: E501 + + :return: The booking_window_days of this ItemEditable. # noqa: E501 + :rtype: int + """ + return self._booking_window_days + + @booking_window_days.setter + def booking_window_days(self, booking_window_days): + """Sets the booking_window_days of this ItemEditable. + + How many days in advance users can book an item. 0 means no limit. # noqa: E501 + + :param booking_window_days: The booking_window_days of this ItemEditable. # noqa: E501 + :type: int + """ + + self._booking_window_days = booking_window_days + + @property + def booking_hourly_rate_notax(self): + """Gets the booking_hourly_rate_notax of this ItemEditable. # noqa: E501 + + The hourly rate of booked resource, without taxes. # noqa: E501 + + :return: The booking_hourly_rate_notax of this ItemEditable. # noqa: E501 + :rtype: float + """ + return self._booking_hourly_rate_notax + + @booking_hourly_rate_notax.setter + def booking_hourly_rate_notax(self, booking_hourly_rate_notax): + """Sets the booking_hourly_rate_notax of this ItemEditable. + + The hourly rate of booked resource, without taxes. # noqa: E501 + + :param booking_hourly_rate_notax: The booking_hourly_rate_notax of this ItemEditable. # noqa: E501 + :type: float + """ + + self._booking_hourly_rate_notax = booking_hourly_rate_notax + + @property + def booking_hourly_rate_tax(self): + """Gets the booking_hourly_rate_tax of this ItemEditable. # noqa: E501 + + The hourly rate of booked resource, with taxes. # noqa: E501 + + :return: The booking_hourly_rate_tax of this ItemEditable. # noqa: E501 + :rtype: float + """ + return self._booking_hourly_rate_tax + + @booking_hourly_rate_tax.setter + def booking_hourly_rate_tax(self, booking_hourly_rate_tax): + """Sets the booking_hourly_rate_tax of this ItemEditable. + + The hourly rate of booked resource, with taxes. # noqa: E501 + + :param booking_hourly_rate_tax: The booking_hourly_rate_tax of this ItemEditable. # noqa: E501 + :type: float + """ + + self._booking_hourly_rate_tax = booking_hourly_rate_tax + + @property + def booking_hourly_rate_currency(self): + """Gets the booking_hourly_rate_currency of this ItemEditable. # noqa: E501 + + The currency of the hourly rate: - 0: CAD - 1: CHF - 2: CNY - 3: DKK - 4: EUR - 5: GBP - 6: JPY - 7: USD - 8: SEK - 9: NOK # noqa: E501 + + :return: The booking_hourly_rate_currency of this ItemEditable. # noqa: E501 + :rtype: int + """ + return self._booking_hourly_rate_currency + + @booking_hourly_rate_currency.setter + def booking_hourly_rate_currency(self, booking_hourly_rate_currency): + """Sets the booking_hourly_rate_currency of this ItemEditable. + + The currency of the hourly rate: - 0: CAD - 1: CHF - 2: CNY - 3: DKK - 4: EUR - 5: GBP - 6: JPY - 7: USD - 8: SEK - 9: NOK # noqa: E501 + + :param booking_hourly_rate_currency: The booking_hourly_rate_currency of this ItemEditable. # noqa: E501 + :type: int + """ + allowed_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # noqa: E501 + if booking_hourly_rate_currency not in allowed_values: + raise ValueError( + "Invalid value for `booking_hourly_rate_currency` ({0}), must be one of {1}" # noqa: E501 + .format(booking_hourly_rate_currency, allowed_values) + ) + + self._booking_hourly_rate_currency = booking_hourly_rate_currency + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ItemEditable, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ItemEditable): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/items_links_subid_body.py b/vendor/elabapi-python/elabapi_python/models/items_links_subid_body.py new file mode 100644 index 0000000..43adceb --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/items_links_subid_body.py @@ -0,0 +1,118 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ItemsLinksSubidBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str' + } + + attribute_map = { + 'action': 'action' + } + + def __init__(self, action=None): # noqa: E501 + """ItemsLinksSubidBody - a model defined in Swagger""" # noqa: E501 + self._action = None + self.discriminator = None + if action is not None: + self.action = action + + @property + def action(self): + """Gets the action of this ItemsLinksSubidBody. # noqa: E501 + + The `duplicate` action will import the links of that link (inception). # noqa: E501 + + :return: The action of this ItemsLinksSubidBody. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this ItemsLinksSubidBody. + + The `duplicate` action will import the links of that link (inception). # noqa: E501 + + :param action: The action of this ItemsLinksSubidBody. # noqa: E501 + :type: str + """ + allowed_values = ["create", "duplicate"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ItemsLinksSubidBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ItemsLinksSubidBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/items_types_id_body.py b/vendor/elabapi-python/elabapi_python/models/items_types_id_body.py new file mode 100644 index 0000000..6dee50e --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/items_types_id_body.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ItemsTypesIdBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """ItemsTypesIdBody - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ItemsTypesIdBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ItemsTypesIdBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/link.py b/vendor/elabapi-python/elabapi_python/models/link.py new file mode 100644 index 0000000..944c117 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/link.py @@ -0,0 +1,422 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Link(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entityid': 'int', + 'title': 'str', + 'is_bookable': 'int', + 'link_state': 'int', + 'category_id': 'int', + 'category_color': 'str', + 'category_title': 'str', + 'status_id': 'int', + 'status_color': 'str', + 'status_title': 'str', + 'custom_id': 'int', + 'page': 'str', + 'type': 'str' + } + + attribute_map = { + 'entityid': 'entityid', + 'title': 'title', + 'is_bookable': 'is_bookable', + 'link_state': 'link_state', + 'category_id': 'category_id', + 'category_color': 'category_color', + 'category_title': 'category_title', + 'status_id': 'status_id', + 'status_color': 'status_color', + 'status_title': 'status_title', + 'custom_id': 'custom_id', + 'page': 'page', + 'type': 'type' + } + + def __init__(self, entityid=None, title=None, is_bookable=None, link_state=None, category_id=None, category_color=None, category_title=None, status_id=None, status_color=None, status_title=None, custom_id=None, page=None, type=None): # noqa: E501 + """Link - a model defined in Swagger""" # noqa: E501 + self._entityid = None + self._title = None + self._is_bookable = None + self._link_state = None + self._category_id = None + self._category_color = None + self._category_title = None + self._status_id = None + self._status_color = None + self._status_title = None + self._custom_id = None + self._page = None + self._type = None + self.discriminator = None + if entityid is not None: + self.entityid = entityid + if title is not None: + self.title = title + if is_bookable is not None: + self.is_bookable = is_bookable + if link_state is not None: + self.link_state = link_state + if category_id is not None: + self.category_id = category_id + if category_color is not None: + self.category_color = category_color + if category_title is not None: + self.category_title = category_title + if status_id is not None: + self.status_id = status_id + if status_color is not None: + self.status_color = status_color + if status_title is not None: + self.status_title = status_title + if custom_id is not None: + self.custom_id = custom_id + if page is not None: + self.page = page + if type is not None: + self.type = type + + @property + def entityid(self): + """Gets the entityid of this Link. # noqa: E501 + + + :return: The entityid of this Link. # noqa: E501 + :rtype: int + """ + return self._entityid + + @entityid.setter + def entityid(self, entityid): + """Sets the entityid of this Link. + + + :param entityid: The entityid of this Link. # noqa: E501 + :type: int + """ + + self._entityid = entityid + + @property + def title(self): + """Gets the title of this Link. # noqa: E501 + + + :return: The title of this Link. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this Link. + + + :param title: The title of this Link. # noqa: E501 + :type: str + """ + + self._title = title + + @property + def is_bookable(self): + """Gets the is_bookable of this Link. # noqa: E501 + + + :return: The is_bookable of this Link. # noqa: E501 + :rtype: int + """ + return self._is_bookable + + @is_bookable.setter + def is_bookable(self, is_bookable): + """Sets the is_bookable of this Link. + + + :param is_bookable: The is_bookable of this Link. # noqa: E501 + :type: int + """ + + self._is_bookable = is_bookable + + @property + def link_state(self): + """Gets the link_state of this Link. # noqa: E501 + + + :return: The link_state of this Link. # noqa: E501 + :rtype: int + """ + return self._link_state + + @link_state.setter + def link_state(self, link_state): + """Sets the link_state of this Link. + + + :param link_state: The link_state of this Link. # noqa: E501 + :type: int + """ + + self._link_state = link_state + + @property + def category_id(self): + """Gets the category_id of this Link. # noqa: E501 + + + :return: The category_id of this Link. # noqa: E501 + :rtype: int + """ + return self._category_id + + @category_id.setter + def category_id(self, category_id): + """Sets the category_id of this Link. + + + :param category_id: The category_id of this Link. # noqa: E501 + :type: int + """ + + self._category_id = category_id + + @property + def category_color(self): + """Gets the category_color of this Link. # noqa: E501 + + + :return: The category_color of this Link. # noqa: E501 + :rtype: str + """ + return self._category_color + + @category_color.setter + def category_color(self, category_color): + """Sets the category_color of this Link. + + + :param category_color: The category_color of this Link. # noqa: E501 + :type: str + """ + + self._category_color = category_color + + @property + def category_title(self): + """Gets the category_title of this Link. # noqa: E501 + + + :return: The category_title of this Link. # noqa: E501 + :rtype: str + """ + return self._category_title + + @category_title.setter + def category_title(self, category_title): + """Sets the category_title of this Link. + + + :param category_title: The category_title of this Link. # noqa: E501 + :type: str + """ + + self._category_title = category_title + + @property + def status_id(self): + """Gets the status_id of this Link. # noqa: E501 + + + :return: The status_id of this Link. # noqa: E501 + :rtype: int + """ + return self._status_id + + @status_id.setter + def status_id(self, status_id): + """Sets the status_id of this Link. + + + :param status_id: The status_id of this Link. # noqa: E501 + :type: int + """ + + self._status_id = status_id + + @property + def status_color(self): + """Gets the status_color of this Link. # noqa: E501 + + + :return: The status_color of this Link. # noqa: E501 + :rtype: str + """ + return self._status_color + + @status_color.setter + def status_color(self, status_color): + """Sets the status_color of this Link. + + + :param status_color: The status_color of this Link. # noqa: E501 + :type: str + """ + + self._status_color = status_color + + @property + def status_title(self): + """Gets the status_title of this Link. # noqa: E501 + + + :return: The status_title of this Link. # noqa: E501 + :rtype: str + """ + return self._status_title + + @status_title.setter + def status_title(self, status_title): + """Sets the status_title of this Link. + + + :param status_title: The status_title of this Link. # noqa: E501 + :type: str + """ + + self._status_title = status_title + + @property + def custom_id(self): + """Gets the custom_id of this Link. # noqa: E501 + + + :return: The custom_id of this Link. # noqa: E501 + :rtype: int + """ + return self._custom_id + + @custom_id.setter + def custom_id(self, custom_id): + """Sets the custom_id of this Link. + + + :param custom_id: The custom_id of this Link. # noqa: E501 + :type: int + """ + + self._custom_id = custom_id + + @property + def page(self): + """Gets the page of this Link. # noqa: E501 + + + :return: The page of this Link. # noqa: E501 + :rtype: str + """ + return self._page + + @page.setter + def page(self, page): + """Sets the page of this Link. + + + :param page: The page of this Link. # noqa: E501 + :type: str + """ + + self._page = page + + @property + def type(self): + """Gets the type of this Link. # noqa: E501 + + + :return: The type of this Link. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Link. + + + :param type: The type of this Link. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Link, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Link): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/metadata.py b/vendor/elabapi-python/elabapi_python/models/metadata.py new file mode 100644 index 0000000..d4587c2 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/metadata.py @@ -0,0 +1,138 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Metadata(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'elabftw': 'MetadataElabftw', + 'extra_fields': 'dict(str, MetadataExtraFields)' + } + + attribute_map = { + 'elabftw': 'elabftw', + 'extra_fields': 'extra_fields' + } + + def __init__(self, elabftw=None, extra_fields=None): # noqa: E501 + """Metadata - a model defined in Swagger""" # noqa: E501 + self._elabftw = None + self._extra_fields = None + self.discriminator = None + if elabftw is not None: + self.elabftw = elabftw + if extra_fields is not None: + self.extra_fields = extra_fields + + @property + def elabftw(self): + """Gets the elabftw of this Metadata. # noqa: E501 + + + :return: The elabftw of this Metadata. # noqa: E501 + :rtype: MetadataElabftw + """ + return self._elabftw + + @elabftw.setter + def elabftw(self, elabftw): + """Sets the elabftw of this Metadata. + + + :param elabftw: The elabftw of this Metadata. # noqa: E501 + :type: MetadataElabftw + """ + + self._elabftw = elabftw + + @property + def extra_fields(self): + """Gets the extra_fields of this Metadata. # noqa: E501 + + See https://doc.elabftw.net/docs/usage/metadata#extra-fields-objects # noqa: E501 + + :return: The extra_fields of this Metadata. # noqa: E501 + :rtype: dict(str, MetadataExtraFields) + """ + return self._extra_fields + + @extra_fields.setter + def extra_fields(self, extra_fields): + """Sets the extra_fields of this Metadata. + + See https://doc.elabftw.net/docs/usage/metadata#extra-fields-objects # noqa: E501 + + :param extra_fields: The extra_fields of this Metadata. # noqa: E501 + :type: dict(str, MetadataExtraFields) + """ + + self._extra_fields = extra_fields + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Metadata, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Metadata): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/metadata_elabftw.py b/vendor/elabapi-python/elabapi_python/models/metadata_elabftw.py new file mode 100644 index 0000000..31cc855 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/metadata_elabftw.py @@ -0,0 +1,112 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class MetadataElabftw(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'extra_fields_groups': 'list[MetadataElabftwExtraFieldsGroups]' + } + + attribute_map = { + 'extra_fields_groups': 'extra_fields_groups' + } + + def __init__(self, extra_fields_groups=None): # noqa: E501 + """MetadataElabftw - a model defined in Swagger""" # noqa: E501 + self._extra_fields_groups = None + self.discriminator = None + if extra_fields_groups is not None: + self.extra_fields_groups = extra_fields_groups + + @property + def extra_fields_groups(self): + """Gets the extra_fields_groups of this MetadataElabftw. # noqa: E501 + + This array stores the custom fields groups # noqa: E501 + + :return: The extra_fields_groups of this MetadataElabftw. # noqa: E501 + :rtype: list[MetadataElabftwExtraFieldsGroups] + """ + return self._extra_fields_groups + + @extra_fields_groups.setter + def extra_fields_groups(self, extra_fields_groups): + """Sets the extra_fields_groups of this MetadataElabftw. + + This array stores the custom fields groups # noqa: E501 + + :param extra_fields_groups: The extra_fields_groups of this MetadataElabftw. # noqa: E501 + :type: list[MetadataElabftwExtraFieldsGroups] + """ + + self._extra_fields_groups = extra_fields_groups + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(MetadataElabftw, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, MetadataElabftw): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/metadata_elabftw_extra_fields_groups.py b/vendor/elabapi-python/elabapi_python/models/metadata_elabftw_extra_fields_groups.py new file mode 100644 index 0000000..d5650a2 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/metadata_elabftw_extra_fields_groups.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class MetadataElabftwExtraFieldsGroups(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'name': 'str' + } + + attribute_map = { + 'id': 'id', + 'name': 'name' + } + + def __init__(self, id=None, name=None): # noqa: E501 + """MetadataElabftwExtraFieldsGroups - a model defined in Swagger""" # noqa: E501 + self._id = None + self._name = None + self.discriminator = None + if id is not None: + self.id = id + if name is not None: + self.name = name + + @property + def id(self): + """Gets the id of this MetadataElabftwExtraFieldsGroups. # noqa: E501 + + + :return: The id of this MetadataElabftwExtraFieldsGroups. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this MetadataElabftwExtraFieldsGroups. + + + :param id: The id of this MetadataElabftwExtraFieldsGroups. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def name(self): + """Gets the name of this MetadataElabftwExtraFieldsGroups. # noqa: E501 + + + :return: The name of this MetadataElabftwExtraFieldsGroups. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this MetadataElabftwExtraFieldsGroups. + + + :param name: The name of this MetadataElabftwExtraFieldsGroups. # noqa: E501 + :type: str + """ + + self._name = name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(MetadataElabftwExtraFieldsGroups, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, MetadataElabftwExtraFieldsGroups): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/metadata_extra_fields.py b/vendor/elabapi-python/elabapi_python/models/metadata_extra_fields.py new file mode 100644 index 0000000..14fccdb --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/metadata_extra_fields.py @@ -0,0 +1,194 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class MetadataExtraFields(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'type': 'str', + 'value': 'str', + 'group_id': 'int', + 'description': 'str' + } + + attribute_map = { + 'type': 'type', + 'value': 'value', + 'group_id': 'group_id', + 'description': 'description' + } + + def __init__(self, type=None, value=None, group_id=None, description=None): # noqa: E501 + """MetadataExtraFields - a model defined in Swagger""" # noqa: E501 + self._type = None + self._value = None + self._group_id = None + self._description = None + self.discriminator = None + if type is not None: + self.type = type + if value is not None: + self.value = value + if group_id is not None: + self.group_id = group_id + if description is not None: + self.description = description + + @property + def type(self): + """Gets the type of this MetadataExtraFields. # noqa: E501 + + + :return: The type of this MetadataExtraFields. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this MetadataExtraFields. + + + :param type: The type of this MetadataExtraFields. # noqa: E501 + :type: str + """ + allowed_values = ["allow_multi_values", "blank_value_on_duplicate", "checkbox", "date", "datetime-local", "description", "email", "experiments", "group_id", "items", "number", "options", "position", "radio", "required", "select", "text", "time", "unit", "url", "users"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + @property + def value(self): + """Gets the value of this MetadataExtraFields. # noqa: E501 + + + :return: The value of this MetadataExtraFields. # noqa: E501 + :rtype: str + """ + return self._value + + @value.setter + def value(self, value): + """Sets the value of this MetadataExtraFields. + + + :param value: The value of this MetadataExtraFields. # noqa: E501 + :type: str + """ + + self._value = value + + @property + def group_id(self): + """Gets the group_id of this MetadataExtraFields. # noqa: E501 + + + :return: The group_id of this MetadataExtraFields. # noqa: E501 + :rtype: int + """ + return self._group_id + + @group_id.setter + def group_id(self, group_id): + """Sets the group_id of this MetadataExtraFields. + + + :param group_id: The group_id of this MetadataExtraFields. # noqa: E501 + :type: int + """ + + self._group_id = group_id + + @property + def description(self): + """Gets the description of this MetadataExtraFields. # noqa: E501 + + + :return: The description of this MetadataExtraFields. # noqa: E501 + :rtype: str + """ + return self._description + + @description.setter + def description(self, description): + """Sets the description of this MetadataExtraFields. + + + :param description: The description of this MetadataExtraFields. # noqa: E501 + :type: str + """ + + self._description = description + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(MetadataExtraFields, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, MetadataExtraFields): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/notification.py b/vendor/elabapi-python/elabapi_python/models/notification.py new file mode 100644 index 0000000..88c0f89 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/notification.py @@ -0,0 +1,292 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Notification(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'category': 'int', + 'is_ack': 'int', + 'created_at': 'str', + 'userid': 'int', + 'send_email': 'int', + 'email_sent_at': 'str', + 'body': 'str' + } + + attribute_map = { + 'id': 'id', + 'category': 'category', + 'is_ack': 'is_ack', + 'created_at': 'created_at', + 'userid': 'userid', + 'send_email': 'send_email', + 'email_sent_at': 'email_sent_at', + 'body': 'body' + } + + def __init__(self, id=None, category=None, is_ack=None, created_at=None, userid=None, send_email=None, email_sent_at=None, body=None): # noqa: E501 + """Notification - a model defined in Swagger""" # noqa: E501 + self._id = None + self._category = None + self._is_ack = None + self._created_at = None + self._userid = None + self._send_email = None + self._email_sent_at = None + self._body = None + self.discriminator = None + if id is not None: + self.id = id + if category is not None: + self.category = category + if is_ack is not None: + self.is_ack = is_ack + if created_at is not None: + self.created_at = created_at + if userid is not None: + self.userid = userid + if send_email is not None: + self.send_email = send_email + if email_sent_at is not None: + self.email_sent_at = email_sent_at + if body is not None: + self.body = body + + @property + def id(self): + """Gets the id of this Notification. # noqa: E501 + + + :return: The id of this Notification. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Notification. + + + :param id: The id of this Notification. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def category(self): + """Gets the category of this Notification. # noqa: E501 + + + :return: The category of this Notification. # noqa: E501 + :rtype: int + """ + return self._category + + @category.setter + def category(self, category): + """Sets the category of this Notification. + + + :param category: The category of this Notification. # noqa: E501 + :type: int + """ + + self._category = category + + @property + def is_ack(self): + """Gets the is_ack of this Notification. # noqa: E501 + + + :return: The is_ack of this Notification. # noqa: E501 + :rtype: int + """ + return self._is_ack + + @is_ack.setter + def is_ack(self, is_ack): + """Sets the is_ack of this Notification. + + + :param is_ack: The is_ack of this Notification. # noqa: E501 + :type: int + """ + + self._is_ack = is_ack + + @property + def created_at(self): + """Gets the created_at of this Notification. # noqa: E501 + + + :return: The created_at of this Notification. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this Notification. + + + :param created_at: The created_at of this Notification. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def userid(self): + """Gets the userid of this Notification. # noqa: E501 + + + :return: The userid of this Notification. # noqa: E501 + :rtype: int + """ + return self._userid + + @userid.setter + def userid(self, userid): + """Sets the userid of this Notification. + + + :param userid: The userid of this Notification. # noqa: E501 + :type: int + """ + + self._userid = userid + + @property + def send_email(self): + """Gets the send_email of this Notification. # noqa: E501 + + + :return: The send_email of this Notification. # noqa: E501 + :rtype: int + """ + return self._send_email + + @send_email.setter + def send_email(self, send_email): + """Sets the send_email of this Notification. + + + :param send_email: The send_email of this Notification. # noqa: E501 + :type: int + """ + + self._send_email = send_email + + @property + def email_sent_at(self): + """Gets the email_sent_at of this Notification. # noqa: E501 + + + :return: The email_sent_at of this Notification. # noqa: E501 + :rtype: str + """ + return self._email_sent_at + + @email_sent_at.setter + def email_sent_at(self, email_sent_at): + """Sets the email_sent_at of this Notification. + + + :param email_sent_at: The email_sent_at of this Notification. # noqa: E501 + :type: str + """ + + self._email_sent_at = email_sent_at + + @property + def body(self): + """Gets the body of this Notification. # noqa: E501 + + + :return: The body of this Notification. # noqa: E501 + :rtype: str + """ + return self._body + + @body.setter + def body(self, body): + """Sets the body of this Notification. + + + :param body: The body of this Notification. # noqa: E501 + :type: str + """ + + self._body = body + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Notification, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Notification): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/notifications_subid_body.py b/vendor/elabapi-python/elabapi_python/models/notifications_subid_body.py new file mode 100644 index 0000000..cd94784 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/notifications_subid_body.py @@ -0,0 +1,118 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class NotificationsSubidBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'is_ack': 'int' + } + + attribute_map = { + 'is_ack': 'is_ack' + } + + def __init__(self, is_ack=None): # noqa: E501 + """NotificationsSubidBody - a model defined in Swagger""" # noqa: E501 + self._is_ack = None + self.discriminator = None + if is_ack is not None: + self.is_ack = is_ack + + @property + def is_ack(self): + """Gets the is_ack of this NotificationsSubidBody. # noqa: E501 + + Acknowledge the notification. `0` for unacknowledging, `1` for acknowledge. # noqa: E501 + + :return: The is_ack of this NotificationsSubidBody. # noqa: E501 + :rtype: int + """ + return self._is_ack + + @is_ack.setter + def is_ack(self, is_ack): + """Sets the is_ack of this NotificationsSubidBody. + + Acknowledge the notification. `0` for unacknowledging, `1` for acknowledge. # noqa: E501 + + :param is_ack: The is_ack of this NotificationsSubidBody. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_ack not in allowed_values: + raise ValueError( + "Invalid value for `is_ack` ({0}), must be one of {1}" # noqa: E501 + .format(is_ack, allowed_values) + ) + + self._is_ack = is_ack + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(NotificationsSubidBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, NotificationsSubidBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/patch_action.py b/vendor/elabapi-python/elabapi_python/models/patch_action.py new file mode 100644 index 0000000..8194817 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/patch_action.py @@ -0,0 +1,179 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PatchAction(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str', + 'passphrase': 'str', + 'meaning': 'int' + } + + attribute_map = { + 'action': 'action', + 'passphrase': 'passphrase', + 'meaning': 'meaning' + } + + def __init__(self, action=None, passphrase=None, meaning=None): # noqa: E501 + """PatchAction - a model defined in Swagger""" # noqa: E501 + self._action = None + self._passphrase = None + self._meaning = None + self.discriminator = None + self.action = action + if passphrase is not None: + self.passphrase = passphrase + if meaning is not None: + self.meaning = meaning + + @property + def action(self): + """Gets the action of this PatchAction. # noqa: E501 + + + :return: The action of this PatchAction. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this PatchAction. + + + :param action: The action of this PatchAction. # noqa: E501 + :type: str + """ + if action is None: + raise ValueError("Invalid value for `action`, must not be `None`") # noqa: E501 + allowed_values = ["bloxberg", "exclusiveeditmode", "forcelock", "forceunlock", "lock", "pin", "sign", "timestamp", "updatemetadatafield", "update"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + @property + def passphrase(self): + """Gets the passphrase of this PatchAction. # noqa: E501 + + The passphrase corresponding to your signature key. Required when action is \"sign\". # noqa: E501 + + :return: The passphrase of this PatchAction. # noqa: E501 + :rtype: str + """ + return self._passphrase + + @passphrase.setter + def passphrase(self, passphrase): + """Sets the passphrase of this PatchAction. + + The passphrase corresponding to your signature key. Required when action is \"sign\". # noqa: E501 + + :param passphrase: The passphrase of this PatchAction. # noqa: E501 + :type: str + """ + + self._passphrase = passphrase + + @property + def meaning(self): + """Gets the meaning of this PatchAction. # noqa: E501 + + Meaning of the signature (required when action is \"sign\"): - 10: Approval - 20: Authorship - 30: Responsibility - 40: Review - 50: Safety # noqa: E501 + + :return: The meaning of this PatchAction. # noqa: E501 + :rtype: int + """ + return self._meaning + + @meaning.setter + def meaning(self, meaning): + """Sets the meaning of this PatchAction. + + Meaning of the signature (required when action is \"sign\"): - 10: Approval - 20: Authorship - 30: Responsibility - 40: Review - 50: Safety # noqa: E501 + + :param meaning: The meaning of this PatchAction. # noqa: E501 + :type: int + """ + allowed_values = [10, 20, 30, 40, 50] # noqa: E501 + if meaning not in allowed_values: + raise ValueError( + "Invalid value for `meaning` ({0}), must be one of {1}" # noqa: E501 + .format(meaning, allowed_values) + ) + + self._meaning = meaning + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PatchAction, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PatchAction): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/revision.py b/vendor/elabapi-python/elabapi_python/models/revision.py new file mode 100644 index 0000000..9bc249a --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/revision.py @@ -0,0 +1,266 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Revision(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'item_id': 'int', + 'body': 'str', + 'body_html': 'str', + 'content_type': 'int', + 'created_at': 'str', + 'userid': 'int' + } + + attribute_map = { + 'id': 'id', + 'item_id': 'item_id', + 'body': 'body', + 'body_html': 'body_html', + 'content_type': 'content_type', + 'created_at': 'created_at', + 'userid': 'userid' + } + + def __init__(self, id=None, item_id=None, body=None, body_html=None, content_type=None, created_at=None, userid=None): # noqa: E501 + """Revision - a model defined in Swagger""" # noqa: E501 + self._id = None + self._item_id = None + self._body = None + self._body_html = None + self._content_type = None + self._created_at = None + self._userid = None + self.discriminator = None + if id is not None: + self.id = id + if item_id is not None: + self.item_id = item_id + if body is not None: + self.body = body + if body_html is not None: + self.body_html = body_html + if content_type is not None: + self.content_type = content_type + if created_at is not None: + self.created_at = created_at + if userid is not None: + self.userid = userid + + @property + def id(self): + """Gets the id of this Revision. # noqa: E501 + + + :return: The id of this Revision. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Revision. + + + :param id: The id of this Revision. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def item_id(self): + """Gets the item_id of this Revision. # noqa: E501 + + + :return: The item_id of this Revision. # noqa: E501 + :rtype: int + """ + return self._item_id + + @item_id.setter + def item_id(self, item_id): + """Sets the item_id of this Revision. + + + :param item_id: The item_id of this Revision. # noqa: E501 + :type: int + """ + + self._item_id = item_id + + @property + def body(self): + """Gets the body of this Revision. # noqa: E501 + + + :return: The body of this Revision. # noqa: E501 + :rtype: str + """ + return self._body + + @body.setter + def body(self, body): + """Sets the body of this Revision. + + + :param body: The body of this Revision. # noqa: E501 + :type: str + """ + + self._body = body + + @property + def body_html(self): + """Gets the body_html of this Revision. # noqa: E501 + + + :return: The body_html of this Revision. # noqa: E501 + :rtype: str + """ + return self._body_html + + @body_html.setter + def body_html(self, body_html): + """Sets the body_html of this Revision. + + + :param body_html: The body_html of this Revision. # noqa: E501 + :type: str + """ + + self._body_html = body_html + + @property + def content_type(self): + """Gets the content_type of this Revision. # noqa: E501 + + + :return: The content_type of this Revision. # noqa: E501 + :rtype: int + """ + return self._content_type + + @content_type.setter + def content_type(self, content_type): + """Sets the content_type of this Revision. + + + :param content_type: The content_type of this Revision. # noqa: E501 + :type: int + """ + + self._content_type = content_type + + @property + def created_at(self): + """Gets the created_at of this Revision. # noqa: E501 + + + :return: The created_at of this Revision. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this Revision. + + + :param created_at: The created_at of this Revision. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def userid(self): + """Gets the userid of this Revision. # noqa: E501 + + + :return: The userid of this Revision. # noqa: E501 + :rtype: int + """ + return self._userid + + @userid.setter + def userid(self, userid): + """Sets the userid of this Revision. + + + :param userid: The userid of this Revision. # noqa: E501 + :type: int + """ + + self._userid = userid + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Revision, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Revision): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/revisions_subid_body.py b/vendor/elabapi-python/elabapi_python/models/revisions_subid_body.py new file mode 100644 index 0000000..66e1327 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/revisions_subid_body.py @@ -0,0 +1,118 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class RevisionsSubidBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str' + } + + attribute_map = { + 'action': 'action' + } + + def __init__(self, action=None): # noqa: E501 + """RevisionsSubidBody - a model defined in Swagger""" # noqa: E501 + self._action = None + self.discriminator = None + if action is not None: + self.action = action + + @property + def action(self): + """Gets the action of this RevisionsSubidBody. # noqa: E501 + + The `replace` action will restore the revision body to the entity. # noqa: E501 + + :return: The action of this RevisionsSubidBody. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this RevisionsSubidBody. + + The `replace` action will restore the revision body to the entity. # noqa: E501 + + :param action: The action of this RevisionsSubidBody. # noqa: E501 + :type: str + """ + allowed_values = ["replace"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(RevisionsSubidBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, RevisionsSubidBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/statuslike.py b/vendor/elabapi-python/elabapi_python/models/statuslike.py new file mode 100644 index 0000000..8ebc80b --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/statuslike.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Statuslike(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'title': 'str', + 'color': 'str' + } + + attribute_map = { + 'id': 'id', + 'title': 'title', + 'color': 'color' + } + + def __init__(self, id=None, title=None, color=None): # noqa: E501 + """Statuslike - a model defined in Swagger""" # noqa: E501 + self._id = None + self._title = None + self._color = None + self.discriminator = None + if id is not None: + self.id = id + if title is not None: + self.title = title + if color is not None: + self.color = color + + @property + def id(self): + """Gets the id of this Statuslike. # noqa: E501 + + + :return: The id of this Statuslike. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Statuslike. + + + :param id: The id of this Statuslike. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def title(self): + """Gets the title of this Statuslike. # noqa: E501 + + + :return: The title of this Statuslike. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this Statuslike. + + + :param title: The title of this Statuslike. # noqa: E501 + :type: str + """ + + self._title = title + + @property + def color(self): + """Gets the color of this Statuslike. # noqa: E501 + + + :return: The color of this Statuslike. # noqa: E501 + :rtype: str + """ + return self._color + + @color.setter + def color(self, color): + """Sets the color of this Statuslike. + + + :param color: The color of this Statuslike. # noqa: E501 + :type: str + """ + + self._color = color + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Statuslike, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Statuslike): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/step.py b/vendor/elabapi-python/elabapi_python/models/step.py new file mode 100644 index 0000000..8986abd --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/step.py @@ -0,0 +1,326 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Step(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'item_id': 'int', + 'body': 'str', + 'ordering': 'int', + 'finished': 'int', + 'finished_time': 'str', + 'deadline': 'str', + 'deadline_notif': 'int', + 'is_immutable': 'int' + } + + attribute_map = { + 'id': 'id', + 'item_id': 'item_id', + 'body': 'body', + 'ordering': 'ordering', + 'finished': 'finished', + 'finished_time': 'finished_time', + 'deadline': 'deadline', + 'deadline_notif': 'deadline_notif', + 'is_immutable': 'is_immutable' + } + + def __init__(self, id=None, item_id=None, body=None, ordering=None, finished=None, finished_time=None, deadline=None, deadline_notif=None, is_immutable=None): # noqa: E501 + """Step - a model defined in Swagger""" # noqa: E501 + self._id = None + self._item_id = None + self._body = None + self._ordering = None + self._finished = None + self._finished_time = None + self._deadline = None + self._deadline_notif = None + self._is_immutable = None + self.discriminator = None + if id is not None: + self.id = id + if item_id is not None: + self.item_id = item_id + if body is not None: + self.body = body + if ordering is not None: + self.ordering = ordering + if finished is not None: + self.finished = finished + if finished_time is not None: + self.finished_time = finished_time + if deadline is not None: + self.deadline = deadline + if deadline_notif is not None: + self.deadline_notif = deadline_notif + if is_immutable is not None: + self.is_immutable = is_immutable + + @property + def id(self): + """Gets the id of this Step. # noqa: E501 + + + :return: The id of this Step. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Step. + + + :param id: The id of this Step. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def item_id(self): + """Gets the item_id of this Step. # noqa: E501 + + + :return: The item_id of this Step. # noqa: E501 + :rtype: int + """ + return self._item_id + + @item_id.setter + def item_id(self, item_id): + """Sets the item_id of this Step. + + + :param item_id: The item_id of this Step. # noqa: E501 + :type: int + """ + + self._item_id = item_id + + @property + def body(self): + """Gets the body of this Step. # noqa: E501 + + + :return: The body of this Step. # noqa: E501 + :rtype: str + """ + return self._body + + @body.setter + def body(self, body): + """Sets the body of this Step. + + + :param body: The body of this Step. # noqa: E501 + :type: str + """ + + self._body = body + + @property + def ordering(self): + """Gets the ordering of this Step. # noqa: E501 + + + :return: The ordering of this Step. # noqa: E501 + :rtype: int + """ + return self._ordering + + @ordering.setter + def ordering(self, ordering): + """Sets the ordering of this Step. + + + :param ordering: The ordering of this Step. # noqa: E501 + :type: int + """ + + self._ordering = ordering + + @property + def finished(self): + """Gets the finished of this Step. # noqa: E501 + + + :return: The finished of this Step. # noqa: E501 + :rtype: int + """ + return self._finished + + @finished.setter + def finished(self, finished): + """Sets the finished of this Step. + + + :param finished: The finished of this Step. # noqa: E501 + :type: int + """ + + self._finished = finished + + @property + def finished_time(self): + """Gets the finished_time of this Step. # noqa: E501 + + + :return: The finished_time of this Step. # noqa: E501 + :rtype: str + """ + return self._finished_time + + @finished_time.setter + def finished_time(self, finished_time): + """Sets the finished_time of this Step. + + + :param finished_time: The finished_time of this Step. # noqa: E501 + :type: str + """ + + self._finished_time = finished_time + + @property + def deadline(self): + """Gets the deadline of this Step. # noqa: E501 + + + :return: The deadline of this Step. # noqa: E501 + :rtype: str + """ + return self._deadline + + @deadline.setter + def deadline(self, deadline): + """Sets the deadline of this Step. + + + :param deadline: The deadline of this Step. # noqa: E501 + :type: str + """ + + self._deadline = deadline + + @property + def deadline_notif(self): + """Gets the deadline_notif of this Step. # noqa: E501 + + + :return: The deadline_notif of this Step. # noqa: E501 + :rtype: int + """ + return self._deadline_notif + + @deadline_notif.setter + def deadline_notif(self, deadline_notif): + """Sets the deadline_notif of this Step. + + + :param deadline_notif: The deadline_notif of this Step. # noqa: E501 + :type: int + """ + + self._deadline_notif = deadline_notif + + @property + def is_immutable(self): + """Gets the is_immutable of this Step. # noqa: E501 + + Only editable via templates. Immutability persists on derived experiments or resources. # noqa: E501 + + :return: The is_immutable of this Step. # noqa: E501 + :rtype: int + """ + return self._is_immutable + + @is_immutable.setter + def is_immutable(self, is_immutable): + """Sets the is_immutable of this Step. + + Only editable via templates. Immutability persists on derived experiments or resources. # noqa: E501 + + :param is_immutable: The is_immutable of this Step. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_immutable not in allowed_values: + raise ValueError( + "Invalid value for `is_immutable` ({0}), must be one of {1}" # noqa: E501 + .format(is_immutable, allowed_values) + ) + + self._is_immutable = is_immutable + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Step, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Step): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/steps_subid_body.py b/vendor/elabapi-python/elabapi_python/models/steps_subid_body.py new file mode 100644 index 0000000..b9b8406 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/steps_subid_body.py @@ -0,0 +1,203 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class StepsSubidBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str', + 'is_immutable': 'int', + 'body': 'str', + 'finished': 'int' + } + + attribute_map = { + 'action': 'action', + 'is_immutable': 'is_immutable', + 'body': 'body', + 'finished': 'finished' + } + + def __init__(self, action=None, is_immutable=None, body=None, finished=None): # noqa: E501 + """StepsSubidBody - a model defined in Swagger""" # noqa: E501 + self._action = None + self._is_immutable = None + self._body = None + self._finished = None + self.discriminator = None + self.action = action + if is_immutable is not None: + self.is_immutable = is_immutable + if body is not None: + self.body = body + if finished is not None: + self.finished = finished + + @property + def action(self): + """Gets the action of this StepsSubidBody. # noqa: E501 + + + :return: The action of this StepsSubidBody. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this StepsSubidBody. + + + :param action: The action of this StepsSubidBody. # noqa: E501 + :type: str + """ + if action is None: + raise ValueError("Invalid value for `action`, must not be `None`") # noqa: E501 + allowed_values = ["finish", "notif", "update"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + @property + def is_immutable(self): + """Gets the is_immutable of this StepsSubidBody. # noqa: E501 + + + :return: The is_immutable of this StepsSubidBody. # noqa: E501 + :rtype: int + """ + return self._is_immutable + + @is_immutable.setter + def is_immutable(self, is_immutable): + """Sets the is_immutable of this StepsSubidBody. + + + :param is_immutable: The is_immutable of this StepsSubidBody. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if is_immutable not in allowed_values: + raise ValueError( + "Invalid value for `is_immutable` ({0}), must be one of {1}" # noqa: E501 + .format(is_immutable, allowed_values) + ) + + self._is_immutable = is_immutable + + @property + def body(self): + """Gets the body of this StepsSubidBody. # noqa: E501 + + The text content of the step. # noqa: E501 + + :return: The body of this StepsSubidBody. # noqa: E501 + :rtype: str + """ + return self._body + + @body.setter + def body(self, body): + """Sets the body of this StepsSubidBody. + + The text content of the step. # noqa: E501 + + :param body: The body of this StepsSubidBody. # noqa: E501 + :type: str + """ + + self._body = body + + @property + def finished(self): + """Gets the finished of this StepsSubidBody. # noqa: E501 + + + :return: The finished of this StepsSubidBody. # noqa: E501 + :rtype: int + """ + return self._finished + + @finished.setter + def finished(self, finished): + """Sets the finished of this StepsSubidBody. + + + :param finished: The finished of this StepsSubidBody. # noqa: E501 + :type: int + """ + + self._finished = finished + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(StepsSubidBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, StepsSubidBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/storage_unit.py b/vendor/elabapi-python/elabapi_python/models/storage_unit.py new file mode 100644 index 0000000..12bd6ce --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/storage_unit.py @@ -0,0 +1,224 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class StorageUnit(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'name': 'str', + 'parent_id': 'int', + 'full_path': 'str', + 'level_depth': 'int' + } + + attribute_map = { + 'id': 'id', + 'name': 'name', + 'parent_id': 'parent_id', + 'full_path': 'full_path', + 'level_depth': 'level_depth' + } + + def __init__(self, id=None, name=None, parent_id=None, full_path=None, level_depth=None): # noqa: E501 + """StorageUnit - a model defined in Swagger""" # noqa: E501 + self._id = None + self._name = None + self._parent_id = None + self._full_path = None + self._level_depth = None + self.discriminator = None + if id is not None: + self.id = id + if name is not None: + self.name = name + if parent_id is not None: + self.parent_id = parent_id + if full_path is not None: + self.full_path = full_path + if level_depth is not None: + self.level_depth = level_depth + + @property + def id(self): + """Gets the id of this StorageUnit. # noqa: E501 + + The storage unit ID # noqa: E501 + + :return: The id of this StorageUnit. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this StorageUnit. + + The storage unit ID # noqa: E501 + + :param id: The id of this StorageUnit. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def name(self): + """Gets the name of this StorageUnit. # noqa: E501 + + Name of the storage unit # noqa: E501 + + :return: The name of this StorageUnit. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this StorageUnit. + + Name of the storage unit # noqa: E501 + + :param name: The name of this StorageUnit. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def parent_id(self): + """Gets the parent_id of this StorageUnit. # noqa: E501 + + ID of the parent storage unit (null for root level) # noqa: E501 + + :return: The parent_id of this StorageUnit. # noqa: E501 + :rtype: int + """ + return self._parent_id + + @parent_id.setter + def parent_id(self, parent_id): + """Sets the parent_id of this StorageUnit. + + ID of the parent storage unit (null for root level) # noqa: E501 + + :param parent_id: The parent_id of this StorageUnit. # noqa: E501 + :type: int + """ + + self._parent_id = parent_id + + @property + def full_path(self): + """Gets the full_path of this StorageUnit. # noqa: E501 + + Full hierarchical path from root to this unit # noqa: E501 + + :return: The full_path of this StorageUnit. # noqa: E501 + :rtype: str + """ + return self._full_path + + @full_path.setter + def full_path(self, full_path): + """Sets the full_path of this StorageUnit. + + Full hierarchical path from root to this unit # noqa: E501 + + :param full_path: The full_path of this StorageUnit. # noqa: E501 + :type: str + """ + + self._full_path = full_path + + @property + def level_depth(self): + """Gets the level_depth of this StorageUnit. # noqa: E501 + + Depth level in the hierarchy (0 for root) # noqa: E501 + + :return: The level_depth of this StorageUnit. # noqa: E501 + :rtype: int + """ + return self._level_depth + + @level_depth.setter + def level_depth(self, level_depth): + """Sets the level_depth of this StorageUnit. + + Depth level in the hierarchy (0 for root) # noqa: E501 + + :param level_depth: The level_depth of this StorageUnit. # noqa: E501 + :type: int + """ + + self._level_depth = level_depth + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(StorageUnit, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, StorageUnit): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/storage_units_body.py b/vendor/elabapi-python/elabapi_python/models/storage_units_body.py new file mode 100644 index 0000000..fe33e63 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/storage_units_body.py @@ -0,0 +1,141 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class StorageUnitsBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'name': 'str', + 'parent_id': 'int' + } + + attribute_map = { + 'name': 'name', + 'parent_id': 'parent_id' + } + + def __init__(self, name=None, parent_id=None): # noqa: E501 + """StorageUnitsBody - a model defined in Swagger""" # noqa: E501 + self._name = None + self._parent_id = None + self.discriminator = None + self.name = name + if parent_id is not None: + self.parent_id = parent_id + + @property + def name(self): + """Gets the name of this StorageUnitsBody. # noqa: E501 + + Name of the storage unit. # noqa: E501 + + :return: The name of this StorageUnitsBody. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this StorageUnitsBody. + + Name of the storage unit. # noqa: E501 + + :param name: The name of this StorageUnitsBody. # noqa: E501 + :type: str + """ + if name is None: + raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 + + self._name = name + + @property + def parent_id(self): + """Gets the parent_id of this StorageUnitsBody. # noqa: E501 + + ID of the parent storage unit. Set to null for a top-level unit. # noqa: E501 + + :return: The parent_id of this StorageUnitsBody. # noqa: E501 + :rtype: int + """ + return self._parent_id + + @parent_id.setter + def parent_id(self, parent_id): + """Sets the parent_id of this StorageUnitsBody. + + ID of the parent storage unit. Set to null for a top-level unit. # noqa: E501 + + :param parent_id: The parent_id of this StorageUnitsBody. # noqa: E501 + :type: int + """ + + self._parent_id = parent_id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(StorageUnitsBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, StorageUnitsBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/storage_units_id_body.py b/vendor/elabapi-python/elabapi_python/models/storage_units_id_body.py new file mode 100644 index 0000000..031ff45 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/storage_units_id_body.py @@ -0,0 +1,140 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class StorageUnitsIdBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'name': 'str', + 'parent_id': 'int' + } + + attribute_map = { + 'name': 'name', + 'parent_id': 'parent_id' + } + + def __init__(self, name=None, parent_id=None): # noqa: E501 + """StorageUnitsIdBody - a model defined in Swagger""" # noqa: E501 + self._name = None + self._parent_id = None + self.discriminator = None + if name is not None: + self.name = name + if parent_id is not None: + self.parent_id = parent_id + + @property + def name(self): + """Gets the name of this StorageUnitsIdBody. # noqa: E501 + + New name for the storage unit. # noqa: E501 + + :return: The name of this StorageUnitsIdBody. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this StorageUnitsIdBody. + + New name for the storage unit. # noqa: E501 + + :param name: The name of this StorageUnitsIdBody. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def parent_id(self): + """Gets the parent_id of this StorageUnitsIdBody. # noqa: E501 + + New parent storage unit id, or `null` to move to the root. Cannot be the unit itself or any of its descendants. # noqa: E501 + + :return: The parent_id of this StorageUnitsIdBody. # noqa: E501 + :rtype: int + """ + return self._parent_id + + @parent_id.setter + def parent_id(self, parent_id): + """Sets the parent_id of this StorageUnitsIdBody. + + New parent storage unit id, or `null` to move to the root. Cannot be the unit itself or any of its descendants. # noqa: E501 + + :param parent_id: The parent_id of this StorageUnitsIdBody. # noqa: E501 + :type: int + """ + + self._parent_id = parent_id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(StorageUnitsIdBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, StorageUnitsIdBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/tag.py b/vendor/elabapi-python/elabapi_python/models/tag.py new file mode 100644 index 0000000..c751eac --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/tag.py @@ -0,0 +1,214 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Tag(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'item_count': 'int', + 'is_favorite': 'int', + 'tag': 'str', + 'team': 'int' + } + + attribute_map = { + 'id': 'id', + 'item_count': 'item_count', + 'is_favorite': 'is_favorite', + 'tag': 'tag', + 'team': 'team' + } + + def __init__(self, id=None, item_count=None, is_favorite=None, tag=None, team=None): # noqa: E501 + """Tag - a model defined in Swagger""" # noqa: E501 + self._id = None + self._item_count = None + self._is_favorite = None + self._tag = None + self._team = None + self.discriminator = None + if id is not None: + self.id = id + if item_count is not None: + self.item_count = item_count + if is_favorite is not None: + self.is_favorite = is_favorite + if tag is not None: + self.tag = tag + if team is not None: + self.team = team + + @property + def id(self): + """Gets the id of this Tag. # noqa: E501 + + + :return: The id of this Tag. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Tag. + + + :param id: The id of this Tag. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def item_count(self): + """Gets the item_count of this Tag. # noqa: E501 + + + :return: The item_count of this Tag. # noqa: E501 + :rtype: int + """ + return self._item_count + + @item_count.setter + def item_count(self, item_count): + """Sets the item_count of this Tag. + + + :param item_count: The item_count of this Tag. # noqa: E501 + :type: int + """ + + self._item_count = item_count + + @property + def is_favorite(self): + """Gets the is_favorite of this Tag. # noqa: E501 + + + :return: The is_favorite of this Tag. # noqa: E501 + :rtype: int + """ + return self._is_favorite + + @is_favorite.setter + def is_favorite(self, is_favorite): + """Sets the is_favorite of this Tag. + + + :param is_favorite: The is_favorite of this Tag. # noqa: E501 + :type: int + """ + + self._is_favorite = is_favorite + + @property + def tag(self): + """Gets the tag of this Tag. # noqa: E501 + + + :return: The tag of this Tag. # noqa: E501 + :rtype: str + """ + return self._tag + + @tag.setter + def tag(self, tag): + """Sets the tag of this Tag. + + + :param tag: The tag of this Tag. # noqa: E501 + :type: str + """ + + self._tag = tag + + @property + def team(self): + """Gets the team of this Tag. # noqa: E501 + + + :return: The team of this Tag. # noqa: E501 + :rtype: int + """ + return self._team + + @team.setter + def team(self, team): + """Sets the team of this Tag. + + + :param team: The team of this Tag. # noqa: E501 + :type: int + """ + + self._team = team + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Tag, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Tag): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/tags_subid_body.py b/vendor/elabapi-python/elabapi_python/models/tags_subid_body.py new file mode 100644 index 0000000..96f829b --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/tags_subid_body.py @@ -0,0 +1,144 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TagsSubidBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str', + 'tag': 'str' + } + + attribute_map = { + 'action': 'action', + 'tag': 'tag' + } + + def __init__(self, action=None, tag=None): # noqa: E501 + """TagsSubidBody - a model defined in Swagger""" # noqa: E501 + self._action = None + self._tag = None + self.discriminator = None + if action is not None: + self.action = action + if tag is not None: + self.tag = tag + + @property + def action(self): + """Gets the action of this TagsSubidBody. # noqa: E501 + + + :return: The action of this TagsSubidBody. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this TagsSubidBody. + + + :param action: The action of this TagsSubidBody. # noqa: E501 + :type: str + """ + allowed_values = ["updatetag"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + @property + def tag(self): + """Gets the tag of this TagsSubidBody. # noqa: E501 + + The content of the tag. # noqa: E501 + + :return: The tag of this TagsSubidBody. # noqa: E501 + :rtype: str + """ + return self._tag + + @tag.setter + def tag(self, tag): + """Sets the tag of this TagsSubidBody. + + The content of the tag. # noqa: E501 + + :param tag: The tag of this TagsSubidBody. # noqa: E501 + :type: str + """ + + self._tag = tag + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TagsSubidBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TagsSubidBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/tags_subid_body1.py b/vendor/elabapi-python/elabapi_python/models/tags_subid_body1.py new file mode 100644 index 0000000..63a032b --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/tags_subid_body1.py @@ -0,0 +1,117 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TagsSubidBody1(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str' + } + + attribute_map = { + 'action': 'action' + } + + def __init__(self, action=None): # noqa: E501 + """TagsSubidBody1 - a model defined in Swagger""" # noqa: E501 + self._action = None + self.discriminator = None + self.action = action + + @property + def action(self): + """Gets the action of this TagsSubidBody1. # noqa: E501 + + + :return: The action of this TagsSubidBody1. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this TagsSubidBody1. + + + :param action: The action of this TagsSubidBody1. # noqa: E501 + :type: str + """ + if action is None: + raise ValueError("Invalid value for `action`, must not be `None`") # noqa: E501 + allowed_values = ["unreference"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TagsSubidBody1, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TagsSubidBody1): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/team.py b/vendor/elabapi-python/elabapi_python/models/team.py new file mode 100644 index 0000000..af91946 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/team.py @@ -0,0 +1,410 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Team(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'name': 'str', + 'user_create_tag': 'int', + 'force_exp_tpl': 'int', + 'force_res_tpl': 'int', + 'created_at': 'str', + 'orgid': 'str', + 'visible': 'int', + 'announcement': 'str', + 'onboarding_email_active': 'int', + 'onboarding_email_body': 'str', + 'onboarding_email_subject': 'str' + } + + attribute_map = { + 'id': 'id', + 'name': 'name', + 'user_create_tag': 'user_create_tag', + 'force_exp_tpl': 'force_exp_tpl', + 'force_res_tpl': 'force_res_tpl', + 'created_at': 'created_at', + 'orgid': 'orgid', + 'visible': 'visible', + 'announcement': 'announcement', + 'onboarding_email_active': 'onboarding_email_active', + 'onboarding_email_body': 'onboarding_email_body', + 'onboarding_email_subject': 'onboarding_email_subject' + } + + def __init__(self, id=None, name=None, user_create_tag=None, force_exp_tpl=0, force_res_tpl=0, created_at=None, orgid=None, visible=None, announcement=None, onboarding_email_active=None, onboarding_email_body=None, onboarding_email_subject=None): # noqa: E501 + """Team - a model defined in Swagger""" # noqa: E501 + self._id = None + self._name = None + self._user_create_tag = None + self._force_exp_tpl = None + self._force_res_tpl = None + self._created_at = None + self._orgid = None + self._visible = None + self._announcement = None + self._onboarding_email_active = None + self._onboarding_email_body = None + self._onboarding_email_subject = None + self.discriminator = None + if id is not None: + self.id = id + if name is not None: + self.name = name + if user_create_tag is not None: + self.user_create_tag = user_create_tag + if force_exp_tpl is not None: + self.force_exp_tpl = force_exp_tpl + if force_res_tpl is not None: + self.force_res_tpl = force_res_tpl + if created_at is not None: + self.created_at = created_at + if orgid is not None: + self.orgid = orgid + if visible is not None: + self.visible = visible + if announcement is not None: + self.announcement = announcement + if onboarding_email_active is not None: + self.onboarding_email_active = onboarding_email_active + if onboarding_email_body is not None: + self.onboarding_email_body = onboarding_email_body + if onboarding_email_subject is not None: + self.onboarding_email_subject = onboarding_email_subject + + @property + def id(self): + """Gets the id of this Team. # noqa: E501 + + + :return: The id of this Team. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Team. + + + :param id: The id of this Team. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def name(self): + """Gets the name of this Team. # noqa: E501 + + + :return: The name of this Team. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Team. + + + :param name: The name of this Team. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def user_create_tag(self): + """Gets the user_create_tag of this Team. # noqa: E501 + + + :return: The user_create_tag of this Team. # noqa: E501 + :rtype: int + """ + return self._user_create_tag + + @user_create_tag.setter + def user_create_tag(self, user_create_tag): + """Sets the user_create_tag of this Team. + + + :param user_create_tag: The user_create_tag of this Team. # noqa: E501 + :type: int + """ + + self._user_create_tag = user_create_tag + + @property + def force_exp_tpl(self): + """Gets the force_exp_tpl of this Team. # noqa: E501 + + Binary toggle to force usage of templates. # noqa: E501 + + :return: The force_exp_tpl of this Team. # noqa: E501 + :rtype: int + """ + return self._force_exp_tpl + + @force_exp_tpl.setter + def force_exp_tpl(self, force_exp_tpl): + """Sets the force_exp_tpl of this Team. + + Binary toggle to force usage of templates. # noqa: E501 + + :param force_exp_tpl: The force_exp_tpl of this Team. # noqa: E501 + :type: int + """ + + self._force_exp_tpl = force_exp_tpl + + @property + def force_res_tpl(self): + """Gets the force_res_tpl of this Team. # noqa: E501 + + Binary toggle to force usage of templates. # noqa: E501 + + :return: The force_res_tpl of this Team. # noqa: E501 + :rtype: int + """ + return self._force_res_tpl + + @force_res_tpl.setter + def force_res_tpl(self, force_res_tpl): + """Sets the force_res_tpl of this Team. + + Binary toggle to force usage of templates. # noqa: E501 + + :param force_res_tpl: The force_res_tpl of this Team. # noqa: E501 + :type: int + """ + + self._force_res_tpl = force_res_tpl + + @property + def created_at(self): + """Gets the created_at of this Team. # noqa: E501 + + + :return: The created_at of this Team. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this Team. + + + :param created_at: The created_at of this Team. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def orgid(self): + """Gets the orgid of this Team. # noqa: E501 + + + :return: The orgid of this Team. # noqa: E501 + :rtype: str + """ + return self._orgid + + @orgid.setter + def orgid(self, orgid): + """Sets the orgid of this Team. + + + :param orgid: The orgid of this Team. # noqa: E501 + :type: str + """ + + self._orgid = orgid + + @property + def visible(self): + """Gets the visible of this Team. # noqa: E501 + + + :return: The visible of this Team. # noqa: E501 + :rtype: int + """ + return self._visible + + @visible.setter + def visible(self, visible): + """Sets the visible of this Team. + + + :param visible: The visible of this Team. # noqa: E501 + :type: int + """ + + self._visible = visible + + @property + def announcement(self): + """Gets the announcement of this Team. # noqa: E501 + + Text shown on top of every page for all users of this team. # noqa: E501 + + :return: The announcement of this Team. # noqa: E501 + :rtype: str + """ + return self._announcement + + @announcement.setter + def announcement(self, announcement): + """Sets the announcement of this Team. + + Text shown on top of every page for all users of this team. # noqa: E501 + + :param announcement: The announcement of this Team. # noqa: E501 + :type: str + """ + + self._announcement = announcement + + @property + def onboarding_email_active(self): + """Gets the onboarding_email_active of this Team. # noqa: E501 + + Do we send onboarding emails to new users? # noqa: E501 + + :return: The onboarding_email_active of this Team. # noqa: E501 + :rtype: int + """ + return self._onboarding_email_active + + @onboarding_email_active.setter + def onboarding_email_active(self, onboarding_email_active): + """Sets the onboarding_email_active of this Team. + + Do we send onboarding emails to new users? # noqa: E501 + + :param onboarding_email_active: The onboarding_email_active of this Team. # noqa: E501 + :type: int + """ + allowed_values = [0, 1] # noqa: E501 + if onboarding_email_active not in allowed_values: + raise ValueError( + "Invalid value for `onboarding_email_active` ({0}), must be one of {1}" # noqa: E501 + .format(onboarding_email_active, allowed_values) + ) + + self._onboarding_email_active = onboarding_email_active + + @property + def onboarding_email_body(self): + """Gets the onboarding_email_body of this Team. # noqa: E501 + + + :return: The onboarding_email_body of this Team. # noqa: E501 + :rtype: str + """ + return self._onboarding_email_body + + @onboarding_email_body.setter + def onboarding_email_body(self, onboarding_email_body): + """Sets the onboarding_email_body of this Team. + + + :param onboarding_email_body: The onboarding_email_body of this Team. # noqa: E501 + :type: str + """ + + self._onboarding_email_body = onboarding_email_body + + @property + def onboarding_email_subject(self): + """Gets the onboarding_email_subject of this Team. # noqa: E501 + + + :return: The onboarding_email_subject of this Team. # noqa: E501 + :rtype: str + """ + return self._onboarding_email_subject + + @onboarding_email_subject.setter + def onboarding_email_subject(self, onboarding_email_subject): + """Sets the onboarding_email_subject of this Team. + + + :param onboarding_email_subject: The onboarding_email_subject of this Team. # noqa: E501 + :type: str + """ + + self._onboarding_email_subject = onboarding_email_subject + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Team, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Team): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/teamgroup.py b/vendor/elabapi-python/elabapi_python/models/teamgroup.py new file mode 100644 index 0000000..9807fb2 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/teamgroup.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Teamgroup(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'name': 'str', + 'users': 'list[TeamgroupUsers]' + } + + attribute_map = { + 'id': 'id', + 'name': 'name', + 'users': 'users' + } + + def __init__(self, id=None, name=None, users=None): # noqa: E501 + """Teamgroup - a model defined in Swagger""" # noqa: E501 + self._id = None + self._name = None + self._users = None + self.discriminator = None + if id is not None: + self.id = id + if name is not None: + self.name = name + if users is not None: + self.users = users + + @property + def id(self): + """Gets the id of this Teamgroup. # noqa: E501 + + + :return: The id of this Teamgroup. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Teamgroup. + + + :param id: The id of this Teamgroup. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def name(self): + """Gets the name of this Teamgroup. # noqa: E501 + + + :return: The name of this Teamgroup. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Teamgroup. + + + :param name: The name of this Teamgroup. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def users(self): + """Gets the users of this Teamgroup. # noqa: E501 + + + :return: The users of this Teamgroup. # noqa: E501 + :rtype: list[TeamgroupUsers] + """ + return self._users + + @users.setter + def users(self, users): + """Sets the users of this Teamgroup. + + + :param users: The users of this Teamgroup. # noqa: E501 + :type: list[TeamgroupUsers] + """ + + self._users = users + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Teamgroup, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Teamgroup): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/teamgroup_users.py b/vendor/elabapi-python/elabapi_python/models/teamgroup_users.py new file mode 100644 index 0000000..d7c076b --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/teamgroup_users.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TeamgroupUsers(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'userid': 'int', + 'fullname': 'str' + } + + attribute_map = { + 'userid': 'userid', + 'fullname': 'fullname' + } + + def __init__(self, userid=None, fullname=None): # noqa: E501 + """TeamgroupUsers - a model defined in Swagger""" # noqa: E501 + self._userid = None + self._fullname = None + self.discriminator = None + if userid is not None: + self.userid = userid + if fullname is not None: + self.fullname = fullname + + @property + def userid(self): + """Gets the userid of this TeamgroupUsers. # noqa: E501 + + + :return: The userid of this TeamgroupUsers. # noqa: E501 + :rtype: int + """ + return self._userid + + @userid.setter + def userid(self, userid): + """Sets the userid of this TeamgroupUsers. + + + :param userid: The userid of this TeamgroupUsers. # noqa: E501 + :type: int + """ + + self._userid = userid + + @property + def fullname(self): + """Gets the fullname of this TeamgroupUsers. # noqa: E501 + + + :return: The fullname of this TeamgroupUsers. # noqa: E501 + :rtype: str + """ + return self._fullname + + @fullname.setter + def fullname(self, fullname): + """Sets the fullname of this TeamgroupUsers. + + + :param fullname: The fullname of this TeamgroupUsers. # noqa: E501 + :type: str + """ + + self._fullname = fullname + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TeamgroupUsers, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TeamgroupUsers): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/teamgroups_subid_body.py b/vendor/elabapi-python/elabapi_python/models/teamgroups_subid_body.py new file mode 100644 index 0000000..60a905d --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/teamgroups_subid_body.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TeamgroupsSubidBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """TeamgroupsSubidBody - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TeamgroupsSubidBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TeamgroupsSubidBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/teams_body.py b/vendor/elabapi-python/elabapi_python/models/teams_body.py new file mode 100644 index 0000000..15499cf --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/teams_body.py @@ -0,0 +1,112 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TeamsBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'name': 'str' + } + + attribute_map = { + 'name': 'name' + } + + def __init__(self, name='New team name'): # noqa: E501 + """TeamsBody - a model defined in Swagger""" # noqa: E501 + self._name = None + self.discriminator = None + if name is not None: + self.name = name + + @property + def name(self): + """Gets the name of this TeamsBody. # noqa: E501 + + Team name. # noqa: E501 + + :return: The name of this TeamsBody. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this TeamsBody. + + Team name. # noqa: E501 + + :param name: The name of this TeamsBody. # noqa: E501 + :type: str + """ + + self._name = name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TeamsBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TeamsBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/teams_id_body.py b/vendor/elabapi-python/elabapi_python/models/teams_id_body.py new file mode 100644 index 0000000..386006d --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/teams_id_body.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TeamsIdBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """TeamsIdBody - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TeamsIdBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TeamsIdBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/todoitem.py b/vendor/elabapi-python/elabapi_python/models/todoitem.py new file mode 100644 index 0000000..679336c --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/todoitem.py @@ -0,0 +1,214 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Todoitem(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'body': 'str', + 'creation_time': 'str', + 'ordering': 'int', + 'userid': 'int' + } + + attribute_map = { + 'id': 'id', + 'body': 'body', + 'creation_time': 'creation_time', + 'ordering': 'ordering', + 'userid': 'userid' + } + + def __init__(self, id=None, body=None, creation_time=None, ordering=None, userid=None): # noqa: E501 + """Todoitem - a model defined in Swagger""" # noqa: E501 + self._id = None + self._body = None + self._creation_time = None + self._ordering = None + self._userid = None + self.discriminator = None + if id is not None: + self.id = id + if body is not None: + self.body = body + if creation_time is not None: + self.creation_time = creation_time + if ordering is not None: + self.ordering = ordering + if userid is not None: + self.userid = userid + + @property + def id(self): + """Gets the id of this Todoitem. # noqa: E501 + + + :return: The id of this Todoitem. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Todoitem. + + + :param id: The id of this Todoitem. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def body(self): + """Gets the body of this Todoitem. # noqa: E501 + + + :return: The body of this Todoitem. # noqa: E501 + :rtype: str + """ + return self._body + + @body.setter + def body(self, body): + """Sets the body of this Todoitem. + + + :param body: The body of this Todoitem. # noqa: E501 + :type: str + """ + + self._body = body + + @property + def creation_time(self): + """Gets the creation_time of this Todoitem. # noqa: E501 + + + :return: The creation_time of this Todoitem. # noqa: E501 + :rtype: str + """ + return self._creation_time + + @creation_time.setter + def creation_time(self, creation_time): + """Sets the creation_time of this Todoitem. + + + :param creation_time: The creation_time of this Todoitem. # noqa: E501 + :type: str + """ + + self._creation_time = creation_time + + @property + def ordering(self): + """Gets the ordering of this Todoitem. # noqa: E501 + + + :return: The ordering of this Todoitem. # noqa: E501 + :rtype: int + """ + return self._ordering + + @ordering.setter + def ordering(self, ordering): + """Sets the ordering of this Todoitem. + + + :param ordering: The ordering of this Todoitem. # noqa: E501 + :type: int + """ + + self._ordering = ordering + + @property + def userid(self): + """Gets the userid of this Todoitem. # noqa: E501 + + + :return: The userid of this Todoitem. # noqa: E501 + :rtype: int + """ + return self._userid + + @userid.setter + def userid(self, userid): + """Sets the userid of this Todoitem. + + + :param userid: The userid of this Todoitem. # noqa: E501 + :type: int + """ + + self._userid = userid + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Todoitem, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Todoitem): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/todolist_body.py b/vendor/elabapi-python/elabapi_python/models/todolist_body.py new file mode 100644 index 0000000..c8a5a41 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/todolist_body.py @@ -0,0 +1,112 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TodolistBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'content': 'str' + } + + attribute_map = { + 'content': 'content' + } + + def __init__(self, content=None): # noqa: E501 + """TodolistBody - a model defined in Swagger""" # noqa: E501 + self._content = None + self.discriminator = None + if content is not None: + self.content = content + + @property + def content(self): + """Gets the content of this TodolistBody. # noqa: E501 + + What to do # noqa: E501 + + :return: The content of this TodolistBody. # noqa: E501 + :rtype: str + """ + return self._content + + @content.setter + def content(self, content): + """Sets the content of this TodolistBody. + + What to do # noqa: E501 + + :param content: The content of this TodolistBody. # noqa: E501 + :type: str + """ + + self._content = content + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TodolistBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TodolistBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/todolist_id_body.py b/vendor/elabapi-python/elabapi_python/models/todolist_id_body.py new file mode 100644 index 0000000..9ed5628 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/todolist_id_body.py @@ -0,0 +1,111 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TodolistIdBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'body': 'str' + } + + attribute_map = { + 'body': 'body' + } + + def __init__(self, body=None): # noqa: E501 + """TodolistIdBody - a model defined in Swagger""" # noqa: E501 + self._body = None + self.discriminator = None + self.body = body + + @property + def body(self): + """Gets the body of this TodolistIdBody. # noqa: E501 + + + :return: The body of this TodolistIdBody. # noqa: E501 + :rtype: str + """ + return self._body + + @body.setter + def body(self, body): + """Sets the body of this TodolistIdBody. + + + :param body: The body of this TodolistIdBody. # noqa: E501 + :type: str + """ + if body is None: + raise ValueError("Invalid value for `body`, must not be `None`") # noqa: E501 + + self._body = body + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TodolistIdBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TodolistIdBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/unfinished_step.py b/vendor/elabapi-python/elabapi_python/models/unfinished_step.py new file mode 100644 index 0000000..c9bb330 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/unfinished_step.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class UnfinishedStep(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'title': 'str', + 'steps': 'list[str]' + } + + attribute_map = { + 'id': 'id', + 'title': 'title', + 'steps': 'steps' + } + + def __init__(self, id=None, title=None, steps=None): # noqa: E501 + """UnfinishedStep - a model defined in Swagger""" # noqa: E501 + self._id = None + self._title = None + self._steps = None + self.discriminator = None + if id is not None: + self.id = id + if title is not None: + self.title = title + if steps is not None: + self.steps = steps + + @property + def id(self): + """Gets the id of this UnfinishedStep. # noqa: E501 + + + :return: The id of this UnfinishedStep. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this UnfinishedStep. + + + :param id: The id of this UnfinishedStep. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def title(self): + """Gets the title of this UnfinishedStep. # noqa: E501 + + + :return: The title of this UnfinishedStep. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this UnfinishedStep. + + + :param title: The title of this UnfinishedStep. # noqa: E501 + :type: str + """ + + self._title = title + + @property + def steps(self): + """Gets the steps of this UnfinishedStep. # noqa: E501 + + + :return: The steps of this UnfinishedStep. # noqa: E501 + :rtype: list[str] + """ + return self._steps + + @steps.setter + def steps(self, steps): + """Sets the steps of this UnfinishedStep. + + + :param steps: The steps of this UnfinishedStep. # noqa: E501 + :type: list[str] + """ + + self._steps = steps + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(UnfinishedStep, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, UnfinishedStep): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/unfinished_steps.py b/vendor/elabapi-python/elabapi_python/models/unfinished_steps.py new file mode 100644 index 0000000..708489e --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/unfinished_steps.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class UnfinishedSteps(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'experiments': 'list[UnfinishedStep]', + 'items': 'list[UnfinishedStep]' + } + + attribute_map = { + 'experiments': 'experiments', + 'items': 'items' + } + + def __init__(self, experiments=None, items=None): # noqa: E501 + """UnfinishedSteps - a model defined in Swagger""" # noqa: E501 + self._experiments = None + self._items = None + self.discriminator = None + if experiments is not None: + self.experiments = experiments + if items is not None: + self.items = items + + @property + def experiments(self): + """Gets the experiments of this UnfinishedSteps. # noqa: E501 + + + :return: The experiments of this UnfinishedSteps. # noqa: E501 + :rtype: list[UnfinishedStep] + """ + return self._experiments + + @experiments.setter + def experiments(self, experiments): + """Sets the experiments of this UnfinishedSteps. + + + :param experiments: The experiments of this UnfinishedSteps. # noqa: E501 + :type: list[UnfinishedStep] + """ + + self._experiments = experiments + + @property + def items(self): + """Gets the items of this UnfinishedSteps. # noqa: E501 + + + :return: The items of this UnfinishedSteps. # noqa: E501 + :rtype: list[UnfinishedStep] + """ + return self._items + + @items.setter + def items(self, items): + """Sets the items of this UnfinishedSteps. + + + :param items: The items of this UnfinishedSteps. # noqa: E501 + :type: list[UnfinishedStep] + """ + + self._items = items + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(UnfinishedSteps, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, UnfinishedSteps): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/upload.py b/vendor/elabapi-python/elabapi_python/models/upload.py new file mode 100644 index 0000000..3cdba20 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/upload.py @@ -0,0 +1,474 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Upload(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'real_name': 'str', + 'long_name': 'str', + 'comment': 'str', + 'item_id': 'int', + 'userid': 'int', + 'type': 'str', + 'created_at': 'str', + 'hash': 'str', + 'hash_algorithm': 'str', + 'storage': 'int', + 'filesize': 'int', + 'state': 'int', + 'immutable': 'int', + 'fullname': 'str' + } + + attribute_map = { + 'id': 'id', + 'real_name': 'real_name', + 'long_name': 'long_name', + 'comment': 'comment', + 'item_id': 'item_id', + 'userid': 'userid', + 'type': 'type', + 'created_at': 'created_at', + 'hash': 'hash', + 'hash_algorithm': 'hash_algorithm', + 'storage': 'storage', + 'filesize': 'filesize', + 'state': 'state', + 'immutable': 'immutable', + 'fullname': 'fullname' + } + + def __init__(self, id=None, real_name=None, long_name=None, comment=None, item_id=None, userid=None, type=None, created_at=None, hash=None, hash_algorithm=None, storage=None, filesize=None, state=None, immutable=None, fullname=None): # noqa: E501 + """Upload - a model defined in Swagger""" # noqa: E501 + self._id = None + self._real_name = None + self._long_name = None + self._comment = None + self._item_id = None + self._userid = None + self._type = None + self._created_at = None + self._hash = None + self._hash_algorithm = None + self._storage = None + self._filesize = None + self._state = None + self._immutable = None + self._fullname = None + self.discriminator = None + if id is not None: + self.id = id + if real_name is not None: + self.real_name = real_name + if long_name is not None: + self.long_name = long_name + if comment is not None: + self.comment = comment + if item_id is not None: + self.item_id = item_id + if userid is not None: + self.userid = userid + if type is not None: + self.type = type + if created_at is not None: + self.created_at = created_at + if hash is not None: + self.hash = hash + if hash_algorithm is not None: + self.hash_algorithm = hash_algorithm + if storage is not None: + self.storage = storage + if filesize is not None: + self.filesize = filesize + if state is not None: + self.state = state + if immutable is not None: + self.immutable = immutable + if fullname is not None: + self.fullname = fullname + + @property + def id(self): + """Gets the id of this Upload. # noqa: E501 + + + :return: The id of this Upload. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Upload. + + + :param id: The id of this Upload. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def real_name(self): + """Gets the real_name of this Upload. # noqa: E501 + + + :return: The real_name of this Upload. # noqa: E501 + :rtype: str + """ + return self._real_name + + @real_name.setter + def real_name(self, real_name): + """Sets the real_name of this Upload. + + + :param real_name: The real_name of this Upload. # noqa: E501 + :type: str + """ + + self._real_name = real_name + + @property + def long_name(self): + """Gets the long_name of this Upload. # noqa: E501 + + + :return: The long_name of this Upload. # noqa: E501 + :rtype: str + """ + return self._long_name + + @long_name.setter + def long_name(self, long_name): + """Sets the long_name of this Upload. + + + :param long_name: The long_name of this Upload. # noqa: E501 + :type: str + """ + + self._long_name = long_name + + @property + def comment(self): + """Gets the comment of this Upload. # noqa: E501 + + + :return: The comment of this Upload. # noqa: E501 + :rtype: str + """ + return self._comment + + @comment.setter + def comment(self, comment): + """Sets the comment of this Upload. + + + :param comment: The comment of this Upload. # noqa: E501 + :type: str + """ + + self._comment = comment + + @property + def item_id(self): + """Gets the item_id of this Upload. # noqa: E501 + + + :return: The item_id of this Upload. # noqa: E501 + :rtype: int + """ + return self._item_id + + @item_id.setter + def item_id(self, item_id): + """Sets the item_id of this Upload. + + + :param item_id: The item_id of this Upload. # noqa: E501 + :type: int + """ + + self._item_id = item_id + + @property + def userid(self): + """Gets the userid of this Upload. # noqa: E501 + + + :return: The userid of this Upload. # noqa: E501 + :rtype: int + """ + return self._userid + + @userid.setter + def userid(self, userid): + """Sets the userid of this Upload. + + + :param userid: The userid of this Upload. # noqa: E501 + :type: int + """ + + self._userid = userid + + @property + def type(self): + """Gets the type of this Upload. # noqa: E501 + + + :return: The type of this Upload. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Upload. + + + :param type: The type of this Upload. # noqa: E501 + :type: str + """ + + self._type = type + + @property + def created_at(self): + """Gets the created_at of this Upload. # noqa: E501 + + + :return: The created_at of this Upload. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this Upload. + + + :param created_at: The created_at of this Upload. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def hash(self): + """Gets the hash of this Upload. # noqa: E501 + + + :return: The hash of this Upload. # noqa: E501 + :rtype: str + """ + return self._hash + + @hash.setter + def hash(self, hash): + """Sets the hash of this Upload. + + + :param hash: The hash of this Upload. # noqa: E501 + :type: str + """ + + self._hash = hash + + @property + def hash_algorithm(self): + """Gets the hash_algorithm of this Upload. # noqa: E501 + + + :return: The hash_algorithm of this Upload. # noqa: E501 + :rtype: str + """ + return self._hash_algorithm + + @hash_algorithm.setter + def hash_algorithm(self, hash_algorithm): + """Sets the hash_algorithm of this Upload. + + + :param hash_algorithm: The hash_algorithm of this Upload. # noqa: E501 + :type: str + """ + + self._hash_algorithm = hash_algorithm + + @property + def storage(self): + """Gets the storage of this Upload. # noqa: E501 + + + :return: The storage of this Upload. # noqa: E501 + :rtype: int + """ + return self._storage + + @storage.setter + def storage(self, storage): + """Sets the storage of this Upload. + + + :param storage: The storage of this Upload. # noqa: E501 + :type: int + """ + + self._storage = storage + + @property + def filesize(self): + """Gets the filesize of this Upload. # noqa: E501 + + + :return: The filesize of this Upload. # noqa: E501 + :rtype: int + """ + return self._filesize + + @filesize.setter + def filesize(self, filesize): + """Sets the filesize of this Upload. + + + :param filesize: The filesize of this Upload. # noqa: E501 + :type: int + """ + + self._filesize = filesize + + @property + def state(self): + """Gets the state of this Upload. # noqa: E501 + + + :return: The state of this Upload. # noqa: E501 + :rtype: int + """ + return self._state + + @state.setter + def state(self, state): + """Sets the state of this Upload. + + + :param state: The state of this Upload. # noqa: E501 + :type: int + """ + + self._state = state + + @property + def immutable(self): + """Gets the immutable of this Upload. # noqa: E501 + + + :return: The immutable of this Upload. # noqa: E501 + :rtype: int + """ + return self._immutable + + @immutable.setter + def immutable(self, immutable): + """Sets the immutable of this Upload. + + + :param immutable: The immutable of this Upload. # noqa: E501 + :type: int + """ + + self._immutable = immutable + + @property + def fullname(self): + """Gets the fullname of this Upload. # noqa: E501 + + + :return: The fullname of this Upload. # noqa: E501 + :rtype: str + """ + return self._fullname + + @fullname.setter + def fullname(self, fullname): + """Sets the fullname of this Upload. + + + :param fullname: The fullname of this Upload. # noqa: E501 + :type: str + """ + + self._fullname = fullname + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Upload, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Upload): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/uploads_subid_body.py b/vendor/elabapi-python/elabapi_python/models/uploads_subid_body.py new file mode 100644 index 0000000..6c42cee --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/uploads_subid_body.py @@ -0,0 +1,141 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class UploadsSubidBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'file': 'str', + 'comment': 'str' + } + + attribute_map = { + 'file': 'file', + 'comment': 'comment' + } + + def __init__(self, file=None, comment=None): # noqa: E501 + """UploadsSubidBody - a model defined in Swagger""" # noqa: E501 + self._file = None + self._comment = None + self.discriminator = None + self.file = file + if comment is not None: + self.comment = comment + + @property + def file(self): + """Gets the file of this UploadsSubidBody. # noqa: E501 + + The file to upload. # noqa: E501 + + :return: The file of this UploadsSubidBody. # noqa: E501 + :rtype: str + """ + return self._file + + @file.setter + def file(self, file): + """Sets the file of this UploadsSubidBody. + + The file to upload. # noqa: E501 + + :param file: The file of this UploadsSubidBody. # noqa: E501 + :type: str + """ + if file is None: + raise ValueError("Invalid value for `file`, must not be `None`") # noqa: E501 + + self._file = file + + @property + def comment(self): + """Gets the comment of this UploadsSubidBody. # noqa: E501 + + Optional file comment. # noqa: E501 + + :return: The comment of this UploadsSubidBody. # noqa: E501 + :rtype: str + """ + return self._comment + + @comment.setter + def comment(self, comment): + """Sets the comment of this UploadsSubidBody. + + Optional file comment. # noqa: E501 + + :param comment: The comment of this UploadsSubidBody. # noqa: E501 + :type: str + """ + + self._comment = comment + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(UploadsSubidBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, UploadsSubidBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/uploads_subid_body1.py b/vendor/elabapi-python/elabapi_python/models/uploads_subid_body1.py new file mode 100644 index 0000000..389f076 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/uploads_subid_body1.py @@ -0,0 +1,200 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class UploadsSubidBody1(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str', + 'real_name': 'str', + 'comment': 'str', + 'state': 'int' + } + + attribute_map = { + 'action': 'action', + 'real_name': 'real_name', + 'comment': 'comment', + 'state': 'state' + } + + def __init__(self, action=None, real_name=None, comment=None, state=None): # noqa: E501 + """UploadsSubidBody1 - a model defined in Swagger""" # noqa: E501 + self._action = None + self._real_name = None + self._comment = None + self._state = None + self.discriminator = None + if action is not None: + self.action = action + if real_name is not None: + self.real_name = real_name + if comment is not None: + self.comment = comment + if state is not None: + self.state = state + + @property + def action(self): + """Gets the action of this UploadsSubidBody1. # noqa: E501 + + + :return: The action of this UploadsSubidBody1. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this UploadsSubidBody1. + + + :param action: The action of this UploadsSubidBody1. # noqa: E501 + :type: str + """ + allowed_values = ["update"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + @property + def real_name(self): + """Gets the real_name of this UploadsSubidBody1. # noqa: E501 + + + :return: The real_name of this UploadsSubidBody1. # noqa: E501 + :rtype: str + """ + return self._real_name + + @real_name.setter + def real_name(self, real_name): + """Sets the real_name of this UploadsSubidBody1. + + + :param real_name: The real_name of this UploadsSubidBody1. # noqa: E501 + :type: str + """ + + self._real_name = real_name + + @property + def comment(self): + """Gets the comment of this UploadsSubidBody1. # noqa: E501 + + + :return: The comment of this UploadsSubidBody1. # noqa: E501 + :rtype: str + """ + return self._comment + + @comment.setter + def comment(self, comment): + """Sets the comment of this UploadsSubidBody1. + + + :param comment: The comment of this UploadsSubidBody1. # noqa: E501 + :type: str + """ + + self._comment = comment + + @property + def state(self): + """Gets the state of this UploadsSubidBody1. # noqa: E501 + + + :return: The state of this UploadsSubidBody1. # noqa: E501 + :rtype: int + """ + return self._state + + @state.setter + def state(self, state): + """Sets the state of this UploadsSubidBody1. + + + :param state: The state of this UploadsSubidBody1. # noqa: E501 + :type: int + """ + allowed_values = [1, 2, 3] # noqa: E501 + if state not in allowed_values: + raise ValueError( + "Invalid value for `state` ({0}), must be one of {1}" # noqa: E501 + .format(state, allowed_values) + ) + + self._state = state + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(UploadsSubidBody1, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, UploadsSubidBody1): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/users.py b/vendor/elabapi-python/elabapi_python/models/users.py new file mode 100644 index 0000000..da3844d --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/users.py @@ -0,0 +1,294 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Users(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'userid': 'int', + 'firstname': 'str', + 'lastname': 'str', + 'initials': 'str', + 'email': 'str', + 'fullname': 'str', + 'orcid': 'str', + 'sig_pubkey': 'str' + } + + attribute_map = { + 'userid': 'userid', + 'firstname': 'firstname', + 'lastname': 'lastname', + 'initials': 'initials', + 'email': 'email', + 'fullname': 'fullname', + 'orcid': 'orcid', + 'sig_pubkey': 'sig_pubkey' + } + + def __init__(self, userid=None, firstname=None, lastname=None, initials=None, email=None, fullname=None, orcid=None, sig_pubkey=None): # noqa: E501 + """Users - a model defined in Swagger""" # noqa: E501 + self._userid = None + self._firstname = None + self._lastname = None + self._initials = None + self._email = None + self._fullname = None + self._orcid = None + self._sig_pubkey = None + self.discriminator = None + if userid is not None: + self.userid = userid + if firstname is not None: + self.firstname = firstname + if lastname is not None: + self.lastname = lastname + if initials is not None: + self.initials = initials + if email is not None: + self.email = email + if fullname is not None: + self.fullname = fullname + if orcid is not None: + self.orcid = orcid + if sig_pubkey is not None: + self.sig_pubkey = sig_pubkey + + @property + def userid(self): + """Gets the userid of this Users. # noqa: E501 + + + :return: The userid of this Users. # noqa: E501 + :rtype: int + """ + return self._userid + + @userid.setter + def userid(self, userid): + """Sets the userid of this Users. + + + :param userid: The userid of this Users. # noqa: E501 + :type: int + """ + + self._userid = userid + + @property + def firstname(self): + """Gets the firstname of this Users. # noqa: E501 + + + :return: The firstname of this Users. # noqa: E501 + :rtype: str + """ + return self._firstname + + @firstname.setter + def firstname(self, firstname): + """Sets the firstname of this Users. + + + :param firstname: The firstname of this Users. # noqa: E501 + :type: str + """ + + self._firstname = firstname + + @property + def lastname(self): + """Gets the lastname of this Users. # noqa: E501 + + + :return: The lastname of this Users. # noqa: E501 + :rtype: str + """ + return self._lastname + + @lastname.setter + def lastname(self, lastname): + """Sets the lastname of this Users. + + + :param lastname: The lastname of this Users. # noqa: E501 + :type: str + """ + + self._lastname = lastname + + @property + def initials(self): + """Gets the initials of this Users. # noqa: E501 + + + :return: The initials of this Users. # noqa: E501 + :rtype: str + """ + return self._initials + + @initials.setter + def initials(self, initials): + """Sets the initials of this Users. + + + :param initials: The initials of this Users. # noqa: E501 + :type: str + """ + + self._initials = initials + + @property + def email(self): + """Gets the email of this Users. # noqa: E501 + + + :return: The email of this Users. # noqa: E501 + :rtype: str + """ + return self._email + + @email.setter + def email(self, email): + """Sets the email of this Users. + + + :param email: The email of this Users. # noqa: E501 + :type: str + """ + + self._email = email + + @property + def fullname(self): + """Gets the fullname of this Users. # noqa: E501 + + + :return: The fullname of this Users. # noqa: E501 + :rtype: str + """ + return self._fullname + + @fullname.setter + def fullname(self, fullname): + """Sets the fullname of this Users. + + + :param fullname: The fullname of this Users. # noqa: E501 + :type: str + """ + + self._fullname = fullname + + @property + def orcid(self): + """Gets the orcid of this Users. # noqa: E501 + + + :return: The orcid of this Users. # noqa: E501 + :rtype: str + """ + return self._orcid + + @orcid.setter + def orcid(self, orcid): + """Sets the orcid of this Users. + + + :param orcid: The orcid of this Users. # noqa: E501 + :type: str + """ + + self._orcid = orcid + + @property + def sig_pubkey(self): + """Gets the sig_pubkey of this Users. # noqa: E501 + + Public signature key (minisign format) # noqa: E501 + + :return: The sig_pubkey of this Users. # noqa: E501 + :rtype: str + """ + return self._sig_pubkey + + @sig_pubkey.setter + def sig_pubkey(self, sig_pubkey): + """Sets the sig_pubkey of this Users. + + Public signature key (minisign format) # noqa: E501 + + :param sig_pubkey: The sig_pubkey of this Users. # noqa: E501 + :type: str + """ + + self._sig_pubkey = sig_pubkey + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Users, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Users): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/users_body.py b/vendor/elabapi-python/elabapi_python/models/users_body.py new file mode 100644 index 0000000..7fe5e18 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/users_body.py @@ -0,0 +1,289 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class UsersBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'firstname': 'str', + 'lastname': 'str', + 'email': 'str', + 'team': 'int', + 'valid_until': 'str', + 'orgid': 'str', + 'usergroup': 'int' + } + + attribute_map = { + 'firstname': 'firstname', + 'lastname': 'lastname', + 'email': 'email', + 'team': 'team', + 'valid_until': 'valid_until', + 'orgid': 'orgid', + 'usergroup': 'usergroup' + } + + def __init__(self, firstname=None, lastname=None, email=None, team=None, valid_until=None, orgid=None, usergroup=None): # noqa: E501 + """UsersBody - a model defined in Swagger""" # noqa: E501 + self._firstname = None + self._lastname = None + self._email = None + self._team = None + self._valid_until = None + self._orgid = None + self._usergroup = None + self.discriminator = None + self.firstname = firstname + self.lastname = lastname + self.email = email + if team is not None: + self.team = team + if valid_until is not None: + self.valid_until = valid_until + if orgid is not None: + self.orgid = orgid + if usergroup is not None: + self.usergroup = usergroup + + @property + def firstname(self): + """Gets the firstname of this UsersBody. # noqa: E501 + + User's first name. # noqa: E501 + + :return: The firstname of this UsersBody. # noqa: E501 + :rtype: str + """ + return self._firstname + + @firstname.setter + def firstname(self, firstname): + """Sets the firstname of this UsersBody. + + User's first name. # noqa: E501 + + :param firstname: The firstname of this UsersBody. # noqa: E501 + :type: str + """ + if firstname is None: + raise ValueError("Invalid value for `firstname`, must not be `None`") # noqa: E501 + + self._firstname = firstname + + @property + def lastname(self): + """Gets the lastname of this UsersBody. # noqa: E501 + + User's last name. # noqa: E501 + + :return: The lastname of this UsersBody. # noqa: E501 + :rtype: str + """ + return self._lastname + + @lastname.setter + def lastname(self, lastname): + """Sets the lastname of this UsersBody. + + User's last name. # noqa: E501 + + :param lastname: The lastname of this UsersBody. # noqa: E501 + :type: str + """ + if lastname is None: + raise ValueError("Invalid value for `lastname`, must not be `None`") # noqa: E501 + + self._lastname = lastname + + @property + def email(self): + """Gets the email of this UsersBody. # noqa: E501 + + User's email address. # noqa: E501 + + :return: The email of this UsersBody. # noqa: E501 + :rtype: str + """ + return self._email + + @email.setter + def email(self, email): + """Sets the email of this UsersBody. + + User's email address. # noqa: E501 + + :param email: The email of this UsersBody. # noqa: E501 + :type: str + """ + if email is None: + raise ValueError("Invalid value for `email`, must not be `None`") # noqa: E501 + + self._email = email + + @property + def team(self): + """Gets the team of this UsersBody. # noqa: E501 + + The team id. # noqa: E501 + + :return: The team of this UsersBody. # noqa: E501 + :rtype: int + """ + return self._team + + @team.setter + def team(self, team): + """Sets the team of this UsersBody. + + The team id. # noqa: E501 + + :param team: The team of this UsersBody. # noqa: E501 + :type: int + """ + + self._team = team + + @property + def valid_until(self): + """Gets the valid_until of this UsersBody. # noqa: E501 + + Date in the YYYY-MM-DD format for account expiration date. # noqa: E501 + + :return: The valid_until of this UsersBody. # noqa: E501 + :rtype: str + """ + return self._valid_until + + @valid_until.setter + def valid_until(self, valid_until): + """Sets the valid_until of this UsersBody. + + Date in the YYYY-MM-DD format for account expiration date. # noqa: E501 + + :param valid_until: The valid_until of this UsersBody. # noqa: E501 + :type: str + """ + + self._valid_until = valid_until + + @property + def orgid(self): + """Gets the orgid of this UsersBody. # noqa: E501 + + Internal id. # noqa: E501 + + :return: The orgid of this UsersBody. # noqa: E501 + :rtype: str + """ + return self._orgid + + @orgid.setter + def orgid(self, orgid): + """Sets the orgid of this UsersBody. + + Internal id. # noqa: E501 + + :param orgid: The orgid of this UsersBody. # noqa: E501 + :type: str + """ + + self._orgid = orgid + + @property + def usergroup(self): + """Gets the usergroup of this UsersBody. # noqa: E501 + + Which permissions level the user will get? `1` is Sysadmin, `2` is Admin, `4` is user (default) # noqa: E501 + + :return: The usergroup of this UsersBody. # noqa: E501 + :rtype: int + """ + return self._usergroup + + @usergroup.setter + def usergroup(self, usergroup): + """Sets the usergroup of this UsersBody. + + Which permissions level the user will get? `1` is Sysadmin, `2` is Admin, `4` is user (default) # noqa: E501 + + :param usergroup: The usergroup of this UsersBody. # noqa: E501 + :type: int + """ + allowed_values = [1, 2, 4] # noqa: E501 + if usergroup not in allowed_values: + raise ValueError( + "Invalid value for `usergroup` ({0}), must be one of {1}" # noqa: E501 + .format(usergroup, allowed_values) + ) + + self._usergroup = usergroup + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(UsersBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, UsersBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/users_full.py b/vendor/elabapi-python/elabapi_python/models/users_full.py new file mode 100644 index 0000000..a7ef470 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/users_full.py @@ -0,0 +1,482 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from elabapi_python.models.users import Users # noqa: F401,E501 + +class UsersFull(Users): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'created_at': 'str', + 'validated': 'int', + 'valid_until': 'str', + 'last_login': 'str', + 'orgid': 'str', + 'auth_service': 'int', + 'is_sysadmin': 'int', + 'default_read': 'str', + 'default_read_base': 'float', + 'default_read_base_human': 'str', + 'default_write': 'str', + 'default_write_base': 'float', + 'default_write_base_human': 'str', + 'teams': 'list[UsersFullTeams]' + } + if hasattr(Users, "swagger_types"): + swagger_types.update(Users.swagger_types) + + attribute_map = { + 'created_at': 'created_at', + 'validated': 'validated', + 'valid_until': 'valid_until', + 'last_login': 'last_login', + 'orgid': 'orgid', + 'auth_service': 'auth_service', + 'is_sysadmin': 'is_sysadmin', + 'default_read': 'default_read', + 'default_read_base': 'default_read_base', + 'default_read_base_human': 'default_read_base_human', + 'default_write': 'default_write', + 'default_write_base': 'default_write_base', + 'default_write_base_human': 'default_write_base_human', + 'teams': 'teams' + } + if hasattr(Users, "attribute_map"): + attribute_map.update(Users.attribute_map) + + def __init__(self, created_at=None, validated=None, valid_until=None, last_login=None, orgid=None, auth_service=None, is_sysadmin=0, default_read='{"teams": [], "users": [], "teamgroups": []}', default_read_base=None, default_read_base_human=None, default_write='{"teams": [], "users": [], "teamgroups": []}', default_write_base=None, default_write_base_human=None, teams=None, *args, **kwargs): # noqa: E501 + """UsersFull - a model defined in Swagger""" # noqa: E501 + self._created_at = None + self._validated = None + self._valid_until = None + self._last_login = None + self._orgid = None + self._auth_service = None + self._is_sysadmin = None + self._default_read = None + self._default_read_base = None + self._default_read_base_human = None + self._default_write = None + self._default_write_base = None + self._default_write_base_human = None + self._teams = None + self.discriminator = None + if created_at is not None: + self.created_at = created_at + if validated is not None: + self.validated = validated + if valid_until is not None: + self.valid_until = valid_until + if last_login is not None: + self.last_login = last_login + if orgid is not None: + self.orgid = orgid + if auth_service is not None: + self.auth_service = auth_service + if is_sysadmin is not None: + self.is_sysadmin = is_sysadmin + if default_read is not None: + self.default_read = default_read + if default_read_base is not None: + self.default_read_base = default_read_base + if default_read_base_human is not None: + self.default_read_base_human = default_read_base_human + if default_write is not None: + self.default_write = default_write + if default_write_base is not None: + self.default_write_base = default_write_base + if default_write_base_human is not None: + self.default_write_base_human = default_write_base_human + if teams is not None: + self.teams = teams + Users.__init__(self, *args, **kwargs) + + @property + def created_at(self): + """Gets the created_at of this UsersFull. # noqa: E501 + + Account creation timestamp. # noqa: E501 + + :return: The created_at of this UsersFull. # noqa: E501 + :rtype: str + """ + return self._created_at + + @created_at.setter + def created_at(self, created_at): + """Sets the created_at of this UsersFull. + + Account creation timestamp. # noqa: E501 + + :param created_at: The created_at of this UsersFull. # noqa: E501 + :type: str + """ + + self._created_at = created_at + + @property + def validated(self): + """Gets the validated of this UsersFull. # noqa: E501 + + + :return: The validated of this UsersFull. # noqa: E501 + :rtype: int + """ + return self._validated + + @validated.setter + def validated(self, validated): + """Sets the validated of this UsersFull. + + + :param validated: The validated of this UsersFull. # noqa: E501 + :type: int + """ + + self._validated = validated + + @property + def valid_until(self): + """Gets the valid_until of this UsersFull. # noqa: E501 + + + :return: The valid_until of this UsersFull. # noqa: E501 + :rtype: str + """ + return self._valid_until + + @valid_until.setter + def valid_until(self, valid_until): + """Sets the valid_until of this UsersFull. + + + :param valid_until: The valid_until of this UsersFull. # noqa: E501 + :type: str + """ + + self._valid_until = valid_until + + @property + def last_login(self): + """Gets the last_login of this UsersFull. # noqa: E501 + + Last time a full authentication happened. # noqa: E501 + + :return: The last_login of this UsersFull. # noqa: E501 + :rtype: str + """ + return self._last_login + + @last_login.setter + def last_login(self, last_login): + """Sets the last_login of this UsersFull. + + Last time a full authentication happened. # noqa: E501 + + :param last_login: The last_login of this UsersFull. # noqa: E501 + :type: str + """ + + self._last_login = last_login + + @property + def orgid(self): + """Gets the orgid of this UsersFull. # noqa: E501 + + Internal organization id used to match user with something other than email. # noqa: E501 + + :return: The orgid of this UsersFull. # noqa: E501 + :rtype: str + """ + return self._orgid + + @orgid.setter + def orgid(self, orgid): + """Sets the orgid of this UsersFull. + + Internal organization id used to match user with something other than email. # noqa: E501 + + :param orgid: The orgid of this UsersFull. # noqa: E501 + :type: str + """ + + self._orgid = orgid + + @property + def auth_service(self): + """Gets the auth_service of this UsersFull. # noqa: E501 + + What mechanism was used to login, see AuthType Enum. # noqa: E501 + + :return: The auth_service of this UsersFull. # noqa: E501 + :rtype: int + """ + return self._auth_service + + @auth_service.setter + def auth_service(self, auth_service): + """Sets the auth_service of this UsersFull. + + What mechanism was used to login, see AuthType Enum. # noqa: E501 + + :param auth_service: The auth_service of this UsersFull. # noqa: E501 + :type: int + """ + + self._auth_service = auth_service + + @property + def is_sysadmin(self): + """Gets the is_sysadmin of this UsersFull. # noqa: E501 + + + :return: The is_sysadmin of this UsersFull. # noqa: E501 + :rtype: int + """ + return self._is_sysadmin + + @is_sysadmin.setter + def is_sysadmin(self, is_sysadmin): + """Sets the is_sysadmin of this UsersFull. + + + :param is_sysadmin: The is_sysadmin of this UsersFull. # noqa: E501 + :type: int + """ + + self._is_sysadmin = is_sysadmin + + @property + def default_read(self): + """Gets the default_read of this UsersFull. # noqa: E501 + + + :return: The default_read of this UsersFull. # noqa: E501 + :rtype: str + """ + return self._default_read + + @default_read.setter + def default_read(self, default_read): + """Sets the default_read of this UsersFull. + + + :param default_read: The default_read of this UsersFull. # noqa: E501 + :type: str + """ + + self._default_read = default_read + + @property + def default_read_base(self): + """Gets the default_read_base of this UsersFull. # noqa: E501 + + Base permission for default read access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :return: The default_read_base of this UsersFull. # noqa: E501 + :rtype: float + """ + return self._default_read_base + + @default_read_base.setter + def default_read_base(self, default_read_base): + """Sets the default_read_base of this UsersFull. + + Base permission for default read access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :param default_read_base: The default_read_base of this UsersFull. # noqa: E501 + :type: float + """ + allowed_values = [10, 20, 30, 40, 50] # noqa: E501 + if default_read_base not in allowed_values: + raise ValueError( + "Invalid value for `default_read_base` ({0}), must be one of {1}" # noqa: E501 + .format(default_read_base, allowed_values) + ) + + self._default_read_base = default_read_base + + @property + def default_read_base_human(self): + """Gets the default_read_base_human of this UsersFull. # noqa: E501 + + Default read base permission as human readable value # noqa: E501 + + :return: The default_read_base_human of this UsersFull. # noqa: E501 + :rtype: str + """ + return self._default_read_base_human + + @default_read_base_human.setter + def default_read_base_human(self, default_read_base_human): + """Sets the default_read_base_human of this UsersFull. + + Default read base permission as human readable value # noqa: E501 + + :param default_read_base_human: The default_read_base_human of this UsersFull. # noqa: E501 + :type: str + """ + + self._default_read_base_human = default_read_base_human + + @property + def default_write(self): + """Gets the default_write of this UsersFull. # noqa: E501 + + + :return: The default_write of this UsersFull. # noqa: E501 + :rtype: str + """ + return self._default_write + + @default_write.setter + def default_write(self, default_write): + """Sets the default_write of this UsersFull. + + + :param default_write: The default_write of this UsersFull. # noqa: E501 + :type: str + """ + + self._default_write = default_write + + @property + def default_write_base(self): + """Gets the default_write_base of this UsersFull. # noqa: E501 + + Base permission for default write access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :return: The default_write_base of this UsersFull. # noqa: E501 + :rtype: float + """ + return self._default_write_base + + @default_write_base.setter + def default_write_base(self, default_write_base): + """Sets the default_write_base of this UsersFull. + + Base permission for default write access: - 10: Owner only - 20: Owner + Admins - 30: Team members - 40: Everyone with an account - 50: Everyone including anonymous users # noqa: E501 + + :param default_write_base: The default_write_base of this UsersFull. # noqa: E501 + :type: float + """ + allowed_values = [10, 20, 30, 40, 50] # noqa: E501 + if default_write_base not in allowed_values: + raise ValueError( + "Invalid value for `default_write_base` ({0}), must be one of {1}" # noqa: E501 + .format(default_write_base, allowed_values) + ) + + self._default_write_base = default_write_base + + @property + def default_write_base_human(self): + """Gets the default_write_base_human of this UsersFull. # noqa: E501 + + Default write base permission as human readable value # noqa: E501 + + :return: The default_write_base_human of this UsersFull. # noqa: E501 + :rtype: str + """ + return self._default_write_base_human + + @default_write_base_human.setter + def default_write_base_human(self, default_write_base_human): + """Sets the default_write_base_human of this UsersFull. + + Default write base permission as human readable value # noqa: E501 + + :param default_write_base_human: The default_write_base_human of this UsersFull. # noqa: E501 + :type: str + """ + + self._default_write_base_human = default_write_base_human + + @property + def teams(self): + """Gets the teams of this UsersFull. # noqa: E501 + + + :return: The teams of this UsersFull. # noqa: E501 + :rtype: list[UsersFullTeams] + """ + return self._teams + + @teams.setter + def teams(self, teams): + """Sets the teams of this UsersFull. + + + :param teams: The teams of this UsersFull. # noqa: E501 + :type: list[UsersFullTeams] + """ + + self._teams = teams + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(UsersFull, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, UsersFull): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/users_full_teams.py b/vendor/elabapi-python/elabapi_python/models/users_full_teams.py new file mode 100644 index 0000000..71462a3 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/users_full_teams.py @@ -0,0 +1,214 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class UsersFullTeams(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'name': 'str', + 'is_admin': 'int', + 'is_owner': 'int', + 'is_archived': 'int' + } + + attribute_map = { + 'id': 'id', + 'name': 'name', + 'is_admin': 'is_admin', + 'is_owner': 'is_owner', + 'is_archived': 'is_archived' + } + + def __init__(self, id=None, name=None, is_admin=None, is_owner=None, is_archived=None): # noqa: E501 + """UsersFullTeams - a model defined in Swagger""" # noqa: E501 + self._id = None + self._name = None + self._is_admin = None + self._is_owner = None + self._is_archived = None + self.discriminator = None + if id is not None: + self.id = id + if name is not None: + self.name = name + if is_admin is not None: + self.is_admin = is_admin + if is_owner is not None: + self.is_owner = is_owner + if is_archived is not None: + self.is_archived = is_archived + + @property + def id(self): + """Gets the id of this UsersFullTeams. # noqa: E501 + + + :return: The id of this UsersFullTeams. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this UsersFullTeams. + + + :param id: The id of this UsersFullTeams. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def name(self): + """Gets the name of this UsersFullTeams. # noqa: E501 + + + :return: The name of this UsersFullTeams. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this UsersFullTeams. + + + :param name: The name of this UsersFullTeams. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def is_admin(self): + """Gets the is_admin of this UsersFullTeams. # noqa: E501 + + + :return: The is_admin of this UsersFullTeams. # noqa: E501 + :rtype: int + """ + return self._is_admin + + @is_admin.setter + def is_admin(self, is_admin): + """Sets the is_admin of this UsersFullTeams. + + + :param is_admin: The is_admin of this UsersFullTeams. # noqa: E501 + :type: int + """ + + self._is_admin = is_admin + + @property + def is_owner(self): + """Gets the is_owner of this UsersFullTeams. # noqa: E501 + + + :return: The is_owner of this UsersFullTeams. # noqa: E501 + :rtype: int + """ + return self._is_owner + + @is_owner.setter + def is_owner(self, is_owner): + """Sets the is_owner of this UsersFullTeams. + + + :param is_owner: The is_owner of this UsersFullTeams. # noqa: E501 + :type: int + """ + + self._is_owner = is_owner + + @property + def is_archived(self): + """Gets the is_archived of this UsersFullTeams. # noqa: E501 + + + :return: The is_archived of this UsersFullTeams. # noqa: E501 + :rtype: int + """ + return self._is_archived + + @is_archived.setter + def is_archived(self, is_archived): + """Sets the is_archived of this UsersFullTeams. + + + :param is_archived: The is_archived of this UsersFullTeams. # noqa: E501 + :type: int + """ + + self._is_archived = is_archived + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(UsersFullTeams, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, UsersFullTeams): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/models/users_id_body.py b/vendor/elabapi-python/elabapi_python/models/users_id_body.py new file mode 100644 index 0000000..9822367 --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/models/users_id_body.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class UsersIdBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """UsersIdBody - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(UsersIdBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, UsersIdBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/vendor/elabapi-python/elabapi_python/rest.py b/vendor/elabapi-python/elabapi_python/rest.py new file mode 100644 index 0000000..c6aa9ac --- /dev/null +++ b/vendor/elabapi-python/elabapi_python/rest.py @@ -0,0 +1,317 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import io +import json +import logging +import re +import ssl + +import certifi +# python 2 and python 3 compatibility library +import six +from six.moves.urllib.parse import urlencode + +try: + import urllib3 +except ImportError: + raise ImportError('Swagger python client requires urllib3.') + + +logger = logging.getLogger(__name__) + + +class RESTResponse(io.IOBase): + + def __init__(self, resp): + self.urllib3_response = resp + self.status = resp.status + self.reason = resp.reason + self.data = resp.data + + def getheaders(self): + """Returns a dictionary of the response headers.""" + return self.urllib3_response.headers + + def getheader(self, name, default=None): + """Returns a given response header.""" + return self.urllib3_response.headers.get(name, default) + + +class RESTClientObject(object): + + def __init__(self, configuration, pools_size=4, maxsize=None): + # urllib3.PoolManager will pass all kw parameters to connectionpool + # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501 + # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501 + # maxsize is the number of requests to host that are allowed in parallel # noqa: E501 + # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501 + + # cert_reqs + if configuration.verify_ssl: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + + # ca_certs + if configuration.ssl_ca_cert: + ca_certs = configuration.ssl_ca_cert + else: + # if not set certificate file, use Mozilla's root certificates. + ca_certs = certifi.where() + + addition_pool_args = {} + if configuration.assert_hostname is not None: + addition_pool_args['assert_hostname'] = configuration.assert_hostname # noqa: E501 + + if maxsize is None: + if configuration.connection_pool_maxsize is not None: + maxsize = configuration.connection_pool_maxsize + else: + maxsize = 4 + + # https pool manager + if configuration.proxy: + self.pool_manager = urllib3.ProxyManager( + num_pools=pools_size, + maxsize=maxsize, + cert_reqs=cert_reqs, + ca_certs=ca_certs, + cert_file=configuration.cert_file, + key_file=configuration.key_file, + proxy_url=configuration.proxy, + **addition_pool_args + ) + else: + self.pool_manager = urllib3.PoolManager( + num_pools=pools_size, + maxsize=maxsize, + cert_reqs=cert_reqs, + ca_certs=ca_certs, + cert_file=configuration.cert_file, + key_file=configuration.key_file, + **addition_pool_args + ) + + def request(self, method, url, query_params=None, headers=None, + body=None, post_params=None, _preload_content=True, + _request_timeout=None): + """Perform requests. + + :param method: http request method + :param url: http request url + :param query_params: query parameters in the url + :param headers: http request headers + :param body: request json body, for `application/json` + :param post_params: request post parameters, + `application/x-www-form-urlencoded` + and `multipart/form-data` + :param _preload_content: if False, the urllib3.HTTPResponse object will + be returned without reading/decoding response + data. Default is True. + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + """ + method = method.upper() + assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT', + 'PATCH', 'OPTIONS'] + + if post_params and body: + raise ValueError( + "body parameter cannot be used with post_params parameter." + ) + + post_params = post_params or {} + headers = headers or {} + + timeout = None + if _request_timeout: + if isinstance(_request_timeout, (int, ) if six.PY3 else (int, long)): # noqa: E501,F821 + timeout = urllib3.Timeout(total=_request_timeout) + elif (isinstance(_request_timeout, tuple) and + len(_request_timeout) == 2): + timeout = urllib3.Timeout( + connect=_request_timeout[0], read=_request_timeout[1]) + + if 'Content-Type' not in headers: + headers['Content-Type'] = 'application/json' + + try: + # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` + if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']: + if query_params: + url += '?' + urlencode(query_params) + if re.search('json', headers['Content-Type'], re.IGNORECASE): + request_body = '{}' + if body is not None: + request_body = json.dumps(body) + r = self.pool_manager.request( + method, url, + body=request_body, + preload_content=_preload_content, + timeout=timeout, + headers=headers) + elif headers['Content-Type'] == 'application/x-www-form-urlencoded': # noqa: E501 + r = self.pool_manager.request( + method, url, + fields=post_params, + encode_multipart=False, + preload_content=_preload_content, + timeout=timeout, + headers=headers) + elif headers['Content-Type'] == 'multipart/form-data': + # must del headers['Content-Type'], or the correct + # Content-Type which generated by urllib3 will be + # overwritten. + del headers['Content-Type'] + r = self.pool_manager.request( + method, url, + fields=post_params, + encode_multipart=True, + preload_content=_preload_content, + timeout=timeout, + headers=headers) + # Pass a `string` parameter directly in the body to support + # other content types than Json when `body` argument is + # provided in serialized form + elif isinstance(body, str): + request_body = body + r = self.pool_manager.request( + method, url, + body=request_body, + preload_content=_preload_content, + timeout=timeout, + headers=headers) + else: + # Cannot generate the request from given parameters + msg = """Cannot prepare a request message for provided + arguments. Please check that your arguments match + declared content type.""" + raise ApiException(status=0, reason=msg) + # For `GET`, `HEAD` + else: + r = self.pool_manager.request(method, url, + fields=query_params, + preload_content=_preload_content, + timeout=timeout, + headers=headers) + except urllib3.exceptions.SSLError as e: + msg = "{0}\n{1}".format(type(e).__name__, str(e)) + raise ApiException(status=0, reason=msg) + + if _preload_content: + r = RESTResponse(r) + + # log response body + logger.debug("response body: %s", r.data) + + if not 200 <= r.status <= 299: + raise ApiException(http_resp=r) + + return r + + def GET(self, url, headers=None, query_params=None, _preload_content=True, + _request_timeout=None): + return self.request("GET", url, + headers=headers, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + query_params=query_params) + + def HEAD(self, url, headers=None, query_params=None, _preload_content=True, + _request_timeout=None): + return self.request("HEAD", url, + headers=headers, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + query_params=query_params) + + def OPTIONS(self, url, headers=None, query_params=None, post_params=None, + body=None, _preload_content=True, _request_timeout=None): + return self.request("OPTIONS", url, + headers=headers, + query_params=query_params, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + + def DELETE(self, url, headers=None, query_params=None, body=None, + _preload_content=True, _request_timeout=None): + return self.request("DELETE", url, + headers=headers, + query_params=query_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + + def POST(self, url, headers=None, query_params=None, post_params=None, + body=None, _preload_content=True, _request_timeout=None): + return self.request("POST", url, + headers=headers, + query_params=query_params, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + + def PUT(self, url, headers=None, query_params=None, post_params=None, + body=None, _preload_content=True, _request_timeout=None): + return self.request("PUT", url, + headers=headers, + query_params=query_params, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + + def PATCH(self, url, headers=None, query_params=None, post_params=None, + body=None, _preload_content=True, _request_timeout=None): + return self.request("PATCH", url, + headers=headers, + query_params=query_params, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + + +class ApiException(Exception): + + def __init__(self, status=None, reason=None, http_resp=None): + if http_resp: + self.status = http_resp.status + self.reason = http_resp.reason + self.body = http_resp.data + self.headers = http_resp.getheaders() + else: + self.status = status + self.reason = reason + self.body = None + self.headers = None + + def __str__(self): + """Custom error messages for exception""" + error_message = "({0})\n"\ + "Reason: {1}\n".format(self.status, self.reason) + if self.headers: + error_message += "HTTP response headers: {0}\n".format( + self.headers) + + if self.body: + error_message += "HTTP response body: {0}\n".format(self.body) + + return error_message diff --git a/vendor/elabapi-python/setup.cfg b/vendor/elabapi-python/setup.cfg new file mode 100644 index 0000000..8bfd5a1 --- /dev/null +++ b/vendor/elabapi-python/setup.cfg @@ -0,0 +1,4 @@ +[egg_info] +tag_build = +tag_date = 0 + diff --git a/vendor/elabapi-python/setup.py b/vendor/elabapi-python/setup.py new file mode 100644 index 0000000..8ab3c92 --- /dev/null +++ b/vendor/elabapi-python/setup.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from setuptools import setup, find_packages # noqa: H301 + +NAME = "elabapi-python" +VERSION = "5.6.1" +# To install the library, run the following +# +# python setup.py install +# +# prerequisite: setuptools +# http://pypi.python.org/pypi/setuptools + +REQUIRES = ["urllib3 >= 1.15", "six >= 1.10", "certifi", "python-dateutil"] + +setup( + name=NAME, + version=VERSION, + description="eLabFTW REST API v2 Documentation", + author_email="", + url="https://github.com/elabftw/elabapi-python", + keywords=["Swagger", "eLabFTW REST API v2 Documentation"], + install_requires=REQUIRES, + packages=find_packages(), + include_package_data=True, + long_description="""\ + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + """ +) diff --git a/vendor/elabapi-python/test/__init__.py b/vendor/elabapi-python/test/__init__.py new file mode 100644 index 0000000..576f56f --- /dev/null +++ b/vendor/elabapi-python/test/__init__.py @@ -0,0 +1 @@ +# coding: utf-8 \ No newline at end of file diff --git a/vendor/elabapi-python/test/test_all_ofentity_editable_metadatamerge.py b/vendor/elabapi-python/test/test_all_ofentity_editable_metadatamerge.py new file mode 100644 index 0000000..6398f51 --- /dev/null +++ b/vendor/elabapi-python/test/test_all_ofentity_editable_metadatamerge.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.all_ofentity_editable_metadatamerge import AllOfentityEditableMetadatamerge # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestAllOfentityEditableMetadatamerge(unittest.TestCase): + """AllOfentityEditableMetadatamerge unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testAllOfentityEditableMetadatamerge(self): + """Test AllOfentityEditableMetadatamerge""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.all_ofentity_editable_metadatamerge.AllOfentityEditableMetadatamerge() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_any_ofuploads_subid_body1.py b/vendor/elabapi-python/test/test_any_ofuploads_subid_body1.py new file mode 100644 index 0000000..9c123f5 --- /dev/null +++ b/vendor/elabapi-python/test/test_any_ofuploads_subid_body1.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.any_ofuploads_subid_body1 import AnyOfuploadsSubidBody1 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestAnyOfuploadsSubidBody1(unittest.TestCase): + """AnyOfuploadsSubidBody1 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testAnyOfuploadsSubidBody1(self): + """Test AnyOfuploadsSubidBody1""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.any_ofuploads_subid_body1.AnyOfuploadsSubidBody1() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_api_keys_api.py b/vendor/elabapi-python/test/test_api_keys_api.py new file mode 100644 index 0000000..cbda4a5 --- /dev/null +++ b/vendor/elabapi-python/test/test_api_keys_api.py @@ -0,0 +1,54 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.api_keys_api import ApiKeysApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestApiKeysApi(unittest.TestCase): + """ApiKeysApi unit test stubs""" + + def setUp(self): + self.api = ApiKeysApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_apikey(self): + """Test case for delete_apikey + + Delete an API key. # noqa: E501 + """ + pass + + def test_get_apikeys(self): + """Test case for get_apikeys + + Read API keys # noqa: E501 + """ + pass + + def test_post_apikeys(self): + """Test case for post_apikeys + + Create an API key # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_apikey.py b/vendor/elabapi-python/test/test_apikey.py new file mode 100644 index 0000000..7db9c26 --- /dev/null +++ b/vendor/elabapi-python/test/test_apikey.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.apikey import Apikey # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestApikey(unittest.TestCase): + """Apikey unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testApikey(self): + """Test Apikey""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.apikey.Apikey() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_apikeys_body.py b/vendor/elabapi-python/test/test_apikeys_body.py new file mode 100644 index 0000000..2037483 --- /dev/null +++ b/vendor/elabapi-python/test/test_apikeys_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.apikeys_body import ApikeysBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestApikeysBody(unittest.TestCase): + """ApikeysBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testApikeysBody(self): + """Test ApikeysBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.apikeys_body.ApikeysBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_branding_api.py b/vendor/elabapi-python/test/test_branding_api.py new file mode 100644 index 0000000..5296d2f --- /dev/null +++ b/vendor/elabapi-python/test/test_branding_api.py @@ -0,0 +1,47 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.branding_api import BrandingApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestBrandingApi(unittest.TestCase): + """BrandingApi unit test stubs""" + + def setUp(self): + self.api = BrandingApi() # noqa: E501 + + def tearDown(self): + pass + + def test_get_instance_branding(self): + """Test case for get_instance_branding + + Read a branding asset as a binary file. # noqa: E501 + """ + pass + + def test_post_instance_branding(self): + """Test case for post_instance_branding + + Update a branding asset. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_branding_id_body.py b/vendor/elabapi-python/test/test_branding_id_body.py new file mode 100644 index 0000000..7ca5155 --- /dev/null +++ b/vendor/elabapi-python/test/test_branding_id_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.branding_id_body import BrandingIdBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestBrandingIdBody(unittest.TestCase): + """BrandingIdBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testBrandingIdBody(self): + """Test BrandingIdBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.branding_id_body.BrandingIdBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_changelog.py b/vendor/elabapi-python/test/test_changelog.py new file mode 100644 index 0000000..2735e36 --- /dev/null +++ b/vendor/elabapi-python/test/test_changelog.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.changelog import Changelog # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestChangelog(unittest.TestCase): + """Changelog unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testChangelog(self): + """Test Changelog""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.changelog.Changelog() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_comment.py b/vendor/elabapi-python/test/test_comment.py new file mode 100644 index 0000000..de675c8 --- /dev/null +++ b/vendor/elabapi-python/test/test_comment.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.comment import Comment # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestComment(unittest.TestCase): + """Comment unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testComment(self): + """Test Comment""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.comment.Comment() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_comments_api.py b/vendor/elabapi-python/test/test_comments_api.py new file mode 100644 index 0000000..3b59b24 --- /dev/null +++ b/vendor/elabapi-python/test/test_comments_api.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.comments_api import CommentsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestCommentsApi(unittest.TestCase): + """CommentsApi unit test stubs""" + + def setUp(self): + self.api = CommentsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_entity_comment(self): + """Test case for delete_entity_comment + + Delete an entity comment. # noqa: E501 + """ + pass + + def test_patch_entity_comment(self): + """Test case for patch_entity_comment + + Modify an entity comment. # noqa: E501 + """ + pass + + def test_post_entity_comments(self): + """Test case for post_entity_comments + + Create a comment. # noqa: E501 + """ + pass + + def test_read_entity_comment(self): + """Test case for read_entity_comment + + Read a comment of that entity. # noqa: E501 + """ + pass + + def test_read_entity_comments(self): + """Test case for read_entity_comments + + Read all comments of that entity. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_compound.py b/vendor/elabapi-python/test/test_compound.py new file mode 100644 index 0000000..384f6df --- /dev/null +++ b/vendor/elabapi-python/test/test_compound.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.compound import Compound # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestCompound(unittest.TestCase): + """Compound unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testCompound(self): + """Test Compound""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.compound.Compound() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_compound_create_request.py b/vendor/elabapi-python/test/test_compound_create_request.py new file mode 100644 index 0000000..9f5cb74 --- /dev/null +++ b/vendor/elabapi-python/test/test_compound_create_request.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.compound_create_request import CompoundCreateRequest # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestCompoundCreateRequest(unittest.TestCase): + """CompoundCreateRequest unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testCompoundCreateRequest(self): + """Test CompoundCreateRequest""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.compound_create_request.CompoundCreateRequest() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_compound_duplicate_request.py b/vendor/elabapi-python/test/test_compound_duplicate_request.py new file mode 100644 index 0000000..a66b2b4 --- /dev/null +++ b/vendor/elabapi-python/test/test_compound_duplicate_request.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.compound_duplicate_request import CompoundDuplicateRequest # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestCompoundDuplicateRequest(unittest.TestCase): + """CompoundDuplicateRequest unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testCompoundDuplicateRequest(self): + """Test CompoundDuplicateRequest""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.compound_duplicate_request.CompoundDuplicateRequest() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_compounds_api.py b/vendor/elabapi-python/test/test_compounds_api.py new file mode 100644 index 0000000..94f349a --- /dev/null +++ b/vendor/elabapi-python/test/test_compounds_api.py @@ -0,0 +1,61 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.compounds_api import CompoundsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestCompoundsApi(unittest.TestCase): + """CompoundsApi unit test stubs""" + + def setUp(self): + self.api = CompoundsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_compound(self): + """Test case for delete_compound + + Soft-delete a compound # noqa: E501 + """ + pass + + def test_get_compound(self): + """Test case for get_compound + + Get a single compound # noqa: E501 + """ + pass + + def test_get_compounds(self): + """Test case for get_compounds + + Read compounds # noqa: E501 + """ + pass + + def test_post_compounds(self): + """Test case for post_compounds + + Create or import a compound # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_compounds_body.py b/vendor/elabapi-python/test/test_compounds_body.py new file mode 100644 index 0000000..88a6fa4 --- /dev/null +++ b/vendor/elabapi-python/test/test_compounds_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.compounds_body import CompoundsBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestCompoundsBody(unittest.TestCase): + """CompoundsBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testCompoundsBody(self): + """Test CompoundsBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.compounds_body.CompoundsBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_compounds_links_subid_body.py b/vendor/elabapi-python/test/test_compounds_links_subid_body.py new file mode 100644 index 0000000..33b88e8 --- /dev/null +++ b/vendor/elabapi-python/test/test_compounds_links_subid_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.compounds_links_subid_body import CompoundsLinksSubidBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestCompoundsLinksSubidBody(unittest.TestCase): + """CompoundsLinksSubidBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testCompoundsLinksSubidBody(self): + """Test CompoundsLinksSubidBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.compounds_links_subid_body.CompoundsLinksSubidBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_config.py b/vendor/elabapi-python/test/test_config.py new file mode 100644 index 0000000..0fe2634 --- /dev/null +++ b/vendor/elabapi-python/test/test_config.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.config import Config # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestConfig(unittest.TestCase): + """Config unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testConfig(self): + """Test Config""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.config.Config() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_config_api.py b/vendor/elabapi-python/test/test_config_api.py new file mode 100644 index 0000000..fbffcc0 --- /dev/null +++ b/vendor/elabapi-python/test/test_config_api.py @@ -0,0 +1,54 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.config_api import ConfigApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestConfigApi(unittest.TestCase): + """ConfigApi unit test stubs""" + + def setUp(self): + self.api = ConfigApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_config(self): + """Test case for delete_config + + Reset the config to default values # noqa: E501 + """ + pass + + def test_get_config(self): + """Test case for get_config + + Read the config # noqa: E501 + """ + pass + + def test_patch_config(self): + """Test case for patch_config + + Modify the config # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_container.py b/vendor/elabapi-python/test/test_container.py new file mode 100644 index 0000000..fa8a416 --- /dev/null +++ b/vendor/elabapi-python/test/test_container.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.container import Container # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestContainer(unittest.TestCase): + """Container unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testContainer(self): + """Test Container""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.container.Container() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_containers_api.py b/vendor/elabapi-python/test/test_containers_api.py new file mode 100644 index 0000000..3224dae --- /dev/null +++ b/vendor/elabapi-python/test/test_containers_api.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.containers_api import ContainersApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestContainersApi(unittest.TestCase): + """ContainersApi unit test stubs""" + + def setUp(self): + self.api = ContainersApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_container(self): + """Test case for delete_container + + Delete a container. # noqa: E501 + """ + pass + + def test_patch_container(self): + """Test case for patch_container + + Modify a container. # noqa: E501 + """ + pass + + def test_post_container(self): + """Test case for post_container + + Create a container for this entity. # noqa: E501 + """ + pass + + def test_read_container(self): + """Test case for read_container + + Read a container. # noqa: E501 + """ + pass + + def test_read_containers(self): + """Test case for read_containers + + Read all containers for this entity. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_containers_subid_body.py b/vendor/elabapi-python/test/test_containers_subid_body.py new file mode 100644 index 0000000..53566a1 --- /dev/null +++ b/vendor/elabapi-python/test/test_containers_subid_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.containers_subid_body import ContainersSubidBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestContainersSubidBody(unittest.TestCase): + """ContainersSubidBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testContainersSubidBody(self): + """Test ContainersSubidBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.containers_subid_body.ContainersSubidBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_containers_subid_body1.py b/vendor/elabapi-python/test/test_containers_subid_body1.py new file mode 100644 index 0000000..1471aa9 --- /dev/null +++ b/vendor/elabapi-python/test/test_containers_subid_body1.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.containers_subid_body1 import ContainersSubidBody1 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestContainersSubidBody1(unittest.TestCase): + """ContainersSubidBody1 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testContainersSubidBody1(self): + """Test ContainersSubidBody1""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.containers_subid_body1.ContainersSubidBody1() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_custom_fields_keys_api.py b/vendor/elabapi-python/test/test_custom_fields_keys_api.py new file mode 100644 index 0000000..37628ed --- /dev/null +++ b/vendor/elabapi-python/test/test_custom_fields_keys_api.py @@ -0,0 +1,40 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.custom_fields_keys_api import CustomFieldsKeysApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestCustomFieldsKeysApi(unittest.TestCase): + """CustomFieldsKeysApi unit test stubs""" + + def setUp(self): + self.api = CustomFieldsKeysApi() # noqa: E501 + + def tearDown(self): + pass + + def test_custom_fields_keys(self): + """Test case for custom_fields_keys + + Read custom fields keys. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_d_space_api.py b/vendor/elabapi-python/test/test_d_space_api.py new file mode 100644 index 0000000..3f35609 --- /dev/null +++ b/vendor/elabapi-python/test/test_d_space_api.py @@ -0,0 +1,54 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.d_space_api import DSpaceApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestDSpaceApi(unittest.TestCase): + """DSpaceApi unit test stubs""" + + def setUp(self): + self.api = DSpaceApi() # noqa: E501 + + def tearDown(self): + pass + + def test_dspace_create(self): + """Test case for dspace_create + + Create a new DSpace workspace item. # noqa: E501 + """ + pass + + def test_dspace_read(self): + """Test case for dspace_read + + Read DSpace information. # noqa: E501 + """ + pass + + def test_dspace_submit(self): + """Test case for dspace_submit + + Submit an eLabFTW entry to DSpace. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_dspace_body.py b/vendor/elabapi-python/test/test_dspace_body.py new file mode 100644 index 0000000..b7de155 --- /dev/null +++ b/vendor/elabapi-python/test/test_dspace_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.dspace_body import DspaceBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestDspaceBody(unittest.TestCase): + """DspaceBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testDspaceBody(self): + """Test DspaceBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.dspace_body.DspaceBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_dspace_body1.py b/vendor/elabapi-python/test/test_dspace_body1.py new file mode 100644 index 0000000..3f8e423 --- /dev/null +++ b/vendor/elabapi-python/test/test_dspace_body1.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.dspace_body1 import DspaceBody1 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestDspaceBody1(unittest.TestCase): + """DspaceBody1 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testDspaceBody1(self): + """Test DspaceBody1""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.dspace_body1.DspaceBody1() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_dspace_entity.py b/vendor/elabapi-python/test/test_dspace_entity.py new file mode 100644 index 0000000..caa3f4c --- /dev/null +++ b/vendor/elabapi-python/test/test_dspace_entity.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.dspace_entity import DspaceEntity # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestDspaceEntity(unittest.TestCase): + """DspaceEntity unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testDspaceEntity(self): + """Test DspaceEntity""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.dspace_entity.DspaceEntity() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_dspace_metadata.py b/vendor/elabapi-python/test/test_dspace_metadata.py new file mode 100644 index 0000000..a1f7ecb --- /dev/null +++ b/vendor/elabapi-python/test/test_dspace_metadata.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.dspace_metadata import DspaceMetadata # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestDspaceMetadata(unittest.TestCase): + """DspaceMetadata unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testDspaceMetadata(self): + """Test DspaceMetadata""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.dspace_metadata.DspaceMetadata() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_dspace_metadata1.py b/vendor/elabapi-python/test/test_dspace_metadata1.py new file mode 100644 index 0000000..3bfec8f --- /dev/null +++ b/vendor/elabapi-python/test/test_dspace_metadata1.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.dspace_metadata1 import DspaceMetadata1 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestDspaceMetadata1(unittest.TestCase): + """DspaceMetadata1 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testDspaceMetadata1(self): + """Test DspaceMetadata1""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.dspace_metadata1.DspaceMetadata1() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_entity.py b/vendor/elabapi-python/test/test_entity.py new file mode 100644 index 0000000..80853ad --- /dev/null +++ b/vendor/elabapi-python/test/test_entity.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.entity import Entity # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestEntity(unittest.TestCase): + """Entity unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testEntity(self): + """Test Entity""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.entity.Entity() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_entity_and_item_editable.py b/vendor/elabapi-python/test/test_entity_and_item_editable.py new file mode 100644 index 0000000..9cc5f4d --- /dev/null +++ b/vendor/elabapi-python/test/test_entity_and_item_editable.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.entity_and_item_editable import EntityAndItemEditable # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestEntityAndItemEditable(unittest.TestCase): + """EntityAndItemEditable unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testEntityAndItemEditable(self): + """Test EntityAndItemEditable""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.entity_and_item_editable.EntityAndItemEditable() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_entity_duplicate.py b/vendor/elabapi-python/test/test_entity_duplicate.py new file mode 100644 index 0000000..cf563c5 --- /dev/null +++ b/vendor/elabapi-python/test/test_entity_duplicate.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.entity_duplicate import EntityDuplicate # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestEntityDuplicate(unittest.TestCase): + """EntityDuplicate unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testEntityDuplicate(self): + """Test EntityDuplicate""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.entity_duplicate.EntityDuplicate() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_entity_editable.py b/vendor/elabapi-python/test/test_entity_editable.py new file mode 100644 index 0000000..1fb20f8 --- /dev/null +++ b/vendor/elabapi-python/test/test_entity_editable.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.entity_editable import EntityEditable # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestEntityEditable(unittest.TestCase): + """EntityEditable unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testEntityEditable(self): + """Test EntityEditable""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.entity_editable.EntityEditable() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_entity_template.py b/vendor/elabapi-python/test/test_entity_template.py new file mode 100644 index 0000000..fd71d2e --- /dev/null +++ b/vendor/elabapi-python/test/test_entity_template.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.entity_template import EntityTemplate # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestEntityTemplate(unittest.TestCase): + """EntityTemplate unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testEntityTemplate(self): + """Test EntityTemplate""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.entity_template.EntityTemplate() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_entity_template_editable.py b/vendor/elabapi-python/test/test_entity_template_editable.py new file mode 100644 index 0000000..bea3b45 --- /dev/null +++ b/vendor/elabapi-python/test/test_entity_template_editable.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.entity_template_editable import EntityTemplateEditable # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestEntityTemplateEditable(unittest.TestCase): + """EntityTemplateEditable unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testEntityTemplateEditable(self): + """Test EntityTemplateEditable""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.entity_template_editable.EntityTemplateEditable() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_error.py b/vendor/elabapi-python/test/test_error.py new file mode 100644 index 0000000..fa3b51c --- /dev/null +++ b/vendor/elabapi-python/test/test_error.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.error import Error # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestError(unittest.TestCase): + """Error unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testError(self): + """Test Error""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.error.Error() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_event.py b/vendor/elabapi-python/test/test_event.py new file mode 100644 index 0000000..0a3522e --- /dev/null +++ b/vendor/elabapi-python/test/test_event.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.event import Event # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestEvent(unittest.TestCase): + """Event unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testEvent(self): + """Test Event""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.event.Event() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_event_id_body.py b/vendor/elabapi-python/test/test_event_id_body.py new file mode 100644 index 0000000..f1b8b9d --- /dev/null +++ b/vendor/elabapi-python/test/test_event_id_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.event_id_body import EventIdBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestEventIdBody(unittest.TestCase): + """EventIdBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testEventIdBody(self): + """Test EventIdBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.event_id_body.EventIdBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_eventid_delta.py b/vendor/elabapi-python/test/test_eventid_delta.py new file mode 100644 index 0000000..0a7772e --- /dev/null +++ b/vendor/elabapi-python/test/test_eventid_delta.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.eventid_delta import EventidDelta # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestEventidDelta(unittest.TestCase): + """EventidDelta unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testEventidDelta(self): + """Test EventidDelta""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.eventid_delta.EventidDelta() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_events_api.py b/vendor/elabapi-python/test/test_events_api.py new file mode 100644 index 0000000..a821b81 --- /dev/null +++ b/vendor/elabapi-python/test/test_events_api.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.events_api import EventsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestEventsApi(unittest.TestCase): + """EventsApi unit test stubs""" + + def setUp(self): + self.api = EventsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_event(self): + """Test case for delete_event + + Delete a booking slot. # noqa: E501 + """ + pass + + def test_patch_event(self): + """Test case for patch_event + + Modify a booking slot. # noqa: E501 + """ + pass + + def test_post_events(self): + """Test case for post_events + + Create an event for the item specified as id. # noqa: E501 + """ + pass + + def test_read_event(self): + """Test case for read_event + + Read a booking slot. # noqa: E501 + """ + pass + + def test_read_events(self): + """Test case for read_events + + Read all events in the team. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_events_id_body.py b/vendor/elabapi-python/test/test_events_id_body.py new file mode 100644 index 0000000..3d03213 --- /dev/null +++ b/vendor/elabapi-python/test/test_events_id_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.events_id_body import EventsIdBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestEventsIdBody(unittest.TestCase): + """EventsIdBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testEventsIdBody(self): + """Test EventsIdBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.events_id_body.EventsIdBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_exclusive_edit_mode.py b/vendor/elabapi-python/test/test_exclusive_edit_mode.py new file mode 100644 index 0000000..e9737a0 --- /dev/null +++ b/vendor/elabapi-python/test/test_exclusive_edit_mode.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.exclusive_edit_mode import ExclusiveEditMode # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestExclusiveEditMode(unittest.TestCase): + """ExclusiveEditMode unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testExclusiveEditMode(self): + """Test ExclusiveEditMode""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.exclusive_edit_mode.ExclusiveEditMode() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_experiment.py b/vendor/elabapi-python/test/test_experiment.py new file mode 100644 index 0000000..a90f39c --- /dev/null +++ b/vendor/elabapi-python/test/test_experiment.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.experiment import Experiment # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestExperiment(unittest.TestCase): + """Experiment unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testExperiment(self): + """Test Experiment""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.experiment.Experiment() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_experiments_api.py b/vendor/elabapi-python/test/test_experiments_api.py new file mode 100644 index 0000000..ba738d0 --- /dev/null +++ b/vendor/elabapi-python/test/test_experiments_api.py @@ -0,0 +1,75 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.experiments_api import ExperimentsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestExperimentsApi(unittest.TestCase): + """ExperimentsApi unit test stubs""" + + def setUp(self): + self.api = ExperimentsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_experiment(self): + """Test case for delete_experiment + + Delete an experiment. # noqa: E501 + """ + pass + + def test_get_experiment(self): + """Test case for get_experiment + + Read an experiment # noqa: E501 + """ + pass + + def test_patch_experiment(self): + """Test case for patch_experiment + + Modify an experiment # noqa: E501 + """ + pass + + def test_post_experiment(self): + """Test case for post_experiment + + Create an experiment # noqa: E501 + """ + pass + + def test_post_experiment_by_id(self): + """Test case for post_experiment_by_id + + Duplicate an experiment with its ID # noqa: E501 + """ + pass + + def test_read_experiments(self): + """Test case for read_experiments + + Read all experiments that are accessible # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_experiments_categories_api.py b/vendor/elabapi-python/test/test_experiments_categories_api.py new file mode 100644 index 0000000..f7fcc05 --- /dev/null +++ b/vendor/elabapi-python/test/test_experiments_categories_api.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.experiments_categories_api import ExperimentsCategoriesApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestExperimentsCategoriesApi(unittest.TestCase): + """ExperimentsCategoriesApi unit test stubs""" + + def setUp(self): + self.api = ExperimentsCategoriesApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_expcat(self): + """Test case for delete_expcat + + Delete a category. # noqa: E501 + """ + pass + + def test_patch_expcat(self): + """Test case for patch_expcat + + Modify a category. # noqa: E501 + """ + pass + + def test_post_team_one_expcat(self): + """Test case for post_team_one_expcat + + Create a new category for experiments. # noqa: E501 + """ + pass + + def test_read_team_experiments_categories(self): + """Test case for read_team_experiments_categories + + Read experiments categories of a team. # noqa: E501 + """ + pass + + def test_read_team_one_expcat(self): + """Test case for read_team_one_expcat + + Read a category. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_experiments_links_subid_body.py b/vendor/elabapi-python/test/test_experiments_links_subid_body.py new file mode 100644 index 0000000..e9d687a --- /dev/null +++ b/vendor/elabapi-python/test/test_experiments_links_subid_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.experiments_links_subid_body import ExperimentsLinksSubidBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestExperimentsLinksSubidBody(unittest.TestCase): + """ExperimentsLinksSubidBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testExperimentsLinksSubidBody(self): + """Test ExperimentsLinksSubidBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.experiments_links_subid_body.ExperimentsLinksSubidBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_experiments_status_api.py b/vendor/elabapi-python/test/test_experiments_status_api.py new file mode 100644 index 0000000..4426813 --- /dev/null +++ b/vendor/elabapi-python/test/test_experiments_status_api.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.experiments_status_api import ExperimentsStatusApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestExperimentsStatusApi(unittest.TestCase): + """ExperimentsStatusApi unit test stubs""" + + def setUp(self): + self.api = ExperimentsStatusApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_expstatus(self): + """Test case for delete_expstatus + + Delete a status. # noqa: E501 + """ + pass + + def test_patch_expstatus(self): + """Test case for patch_expstatus + + Modify a status. # noqa: E501 + """ + pass + + def test_post_team_one_expstatus(self): + """Test case for post_team_one_expstatus + + Create a new experiments status. # noqa: E501 + """ + pass + + def test_read_team_experiments_status(self): + """Test case for read_team_experiments_status + + Read experiments status of a team. # noqa: E501 + """ + pass + + def test_read_team_one_expstatus(self): + """Test case for read_team_one_expstatus + + Read a status. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_experiments_templates_api.py b/vendor/elabapi-python/test/test_experiments_templates_api.py new file mode 100644 index 0000000..4977fb5 --- /dev/null +++ b/vendor/elabapi-python/test/test_experiments_templates_api.py @@ -0,0 +1,75 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.experiments_templates_api import ExperimentsTemplatesApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestExperimentsTemplatesApi(unittest.TestCase): + """ExperimentsTemplatesApi unit test stubs""" + + def setUp(self): + self.api = ExperimentsTemplatesApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_experiment_template(self): + """Test case for delete_experiment_template + + Delete an experiment template. # noqa: E501 + """ + pass + + def test_get_experiment_template(self): + """Test case for get_experiment_template + + Read an experiment template # noqa: E501 + """ + pass + + def test_patch_experiment_template(self): + """Test case for patch_experiment_template + + Modify an experiment template # noqa: E501 + """ + pass + + def test_post_experiment_template(self): + """Test case for post_experiment_template + + Create an experiment template # noqa: E501 + """ + pass + + def test_post_experiment_template_by_id(self): + """Test case for post_experiment_template_by_id + + Duplicate an experiment template with its ID # noqa: E501 + """ + pass + + def test_read_experiments_templates(self): + """Test case for read_experiments_templates + + Read all experiments_templates that are accessible # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_experiments_templates_id_body.py b/vendor/elabapi-python/test/test_experiments_templates_id_body.py new file mode 100644 index 0000000..4306443 --- /dev/null +++ b/vendor/elabapi-python/test/test_experiments_templates_id_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.experiments_templates_id_body import ExperimentsTemplatesIdBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestExperimentsTemplatesIdBody(unittest.TestCase): + """ExperimentsTemplatesIdBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testExperimentsTemplatesIdBody(self): + """Test ExperimentsTemplatesIdBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.experiments_templates_id_body.ExperimentsTemplatesIdBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_export.py b/vendor/elabapi-python/test/test_export.py new file mode 100644 index 0000000..709ada4 --- /dev/null +++ b/vendor/elabapi-python/test/test_export.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.export import Export # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestExport(unittest.TestCase): + """Export unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testExport(self): + """Test Export""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.export.Export() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_exports_api.py b/vendor/elabapi-python/test/test_exports_api.py new file mode 100644 index 0000000..9d88d71 --- /dev/null +++ b/vendor/elabapi-python/test/test_exports_api.py @@ -0,0 +1,61 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.exports_api import ExportsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestExportsApi(unittest.TestCase): + """ExportsApi unit test stubs""" + + def setUp(self): + self.api = ExportsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_export(self): + """Test case for delete_export + + Remove an export request and its associated file # noqa: E501 + """ + pass + + def test_post_export(self): + """Test case for post_export + + Register an export request # noqa: E501 + """ + pass + + def test_read_export(self): + """Test case for read_export + + Get export # noqa: E501 + """ + pass + + def test_readall_exports(self): + """Test case for readall_exports + + List exports # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_exports_body.py b/vendor/elabapi-python/test/test_exports_body.py new file mode 100644 index 0000000..8e00af8 --- /dev/null +++ b/vendor/elabapi-python/test/test_exports_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.exports_body import ExportsBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestExportsBody(unittest.TestCase): + """ExportsBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testExportsBody(self): + """Test ExportsBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.exports_body.ExportsBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_extra_fields_keys.py b/vendor/elabapi-python/test/test_extra_fields_keys.py new file mode 100644 index 0000000..10d8622 --- /dev/null +++ b/vendor/elabapi-python/test/test_extra_fields_keys.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.extra_fields_keys import ExtraFieldsKeys # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestExtraFieldsKeys(unittest.TestCase): + """ExtraFieldsKeys unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testExtraFieldsKeys(self): + """Test ExtraFieldsKeys""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.extra_fields_keys.ExtraFieldsKeys() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_favorite_tags_api.py b/vendor/elabapi-python/test/test_favorite_tags_api.py new file mode 100644 index 0000000..a05cbb3 --- /dev/null +++ b/vendor/elabapi-python/test/test_favorite_tags_api.py @@ -0,0 +1,54 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.favorite_tags_api import FavoriteTagsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestFavoriteTagsApi(unittest.TestCase): + """FavoriteTagsApi unit test stubs""" + + def setUp(self): + self.api = FavoriteTagsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_favtag(self): + """Test case for delete_favtag + + Unfavorite a tag. # noqa: E501 + """ + pass + + def test_post_favtags(self): + """Test case for post_favtags + + Add a tag as favorite. # noqa: E501 + """ + pass + + def test_read_favtags(self): + """Test case for read_favtags + + Read all favorite tags for the user. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_favtags_body.py b/vendor/elabapi-python/test/test_favtags_body.py new file mode 100644 index 0000000..d0458d0 --- /dev/null +++ b/vendor/elabapi-python/test/test_favtags_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.favtags_body import FavtagsBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestFavtagsBody(unittest.TestCase): + """FavtagsBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testFavtagsBody(self): + """Test FavtagsBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.favtags_body.FavtagsBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id.py b/vendor/elabapi-python/test/test_id.py new file mode 100644 index 0000000..e248625 --- /dev/null +++ b/vendor/elabapi-python/test/test_id.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id import Id # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestId(unittest.TestCase): + """Id unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testId(self): + """Test Id""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id.Id() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id1.py b/vendor/elabapi-python/test/test_id1.py new file mode 100644 index 0000000..9c8c325 --- /dev/null +++ b/vendor/elabapi-python/test/test_id1.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id1 import Id1 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestId1(unittest.TestCase): + """Id1 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testId1(self): + """Test Id1""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id1.Id1() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id2.py b/vendor/elabapi-python/test/test_id2.py new file mode 100644 index 0000000..976a0c0 --- /dev/null +++ b/vendor/elabapi-python/test/test_id2.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id2 import Id2 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestId2(unittest.TestCase): + """Id2 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testId2(self): + """Test Id2""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id2.Id2() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id3.py b/vendor/elabapi-python/test/test_id3.py new file mode 100644 index 0000000..c1eb68d --- /dev/null +++ b/vendor/elabapi-python/test/test_id3.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id3 import Id3 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestId3(unittest.TestCase): + """Id3 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testId3(self): + """Test Id3""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id3.Id3() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id4.py b/vendor/elabapi-python/test/test_id4.py new file mode 100644 index 0000000..47e02e2 --- /dev/null +++ b/vendor/elabapi-python/test/test_id4.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id4 import Id4 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestId4(unittest.TestCase): + """Id4 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testId4(self): + """Test Id4""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id4.Id4() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id_certs_body.py b/vendor/elabapi-python/test/test_id_certs_body.py new file mode 100644 index 0000000..c73b7a7 --- /dev/null +++ b/vendor/elabapi-python/test/test_id_certs_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id_certs_body import IdCertsBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdCertsBody(unittest.TestCase): + """IdCertsBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdCertsBody(self): + """Test IdCertsBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id_certs_body.IdCertsBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id_comments_body.py b/vendor/elabapi-python/test/test_id_comments_body.py new file mode 100644 index 0000000..2318ac1 --- /dev/null +++ b/vendor/elabapi-python/test/test_id_comments_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id_comments_body import IdCommentsBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdCommentsBody(unittest.TestCase): + """IdCommentsBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdCommentsBody(self): + """Test IdCommentsBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id_comments_body.IdCommentsBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id_endpoints_body.py b/vendor/elabapi-python/test/test_id_endpoints_body.py new file mode 100644 index 0000000..77722ea --- /dev/null +++ b/vendor/elabapi-python/test/test_id_endpoints_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id_endpoints_body import IdEndpointsBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdEndpointsBody(unittest.TestCase): + """IdEndpointsBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdEndpointsBody(self): + """Test IdEndpointsBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id_endpoints_body.IdEndpointsBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id_experiments_categories_body.py b/vendor/elabapi-python/test/test_id_experiments_categories_body.py new file mode 100644 index 0000000..93049fc --- /dev/null +++ b/vendor/elabapi-python/test/test_id_experiments_categories_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id_experiments_categories_body import IdExperimentsCategoriesBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdExperimentsCategoriesBody(unittest.TestCase): + """IdExperimentsCategoriesBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdExperimentsCategoriesBody(self): + """Test IdExperimentsCategoriesBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id_experiments_categories_body.IdExperimentsCategoriesBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id_experiments_status_body.py b/vendor/elabapi-python/test/test_id_experiments_status_body.py new file mode 100644 index 0000000..13d7786 --- /dev/null +++ b/vendor/elabapi-python/test/test_id_experiments_status_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id_experiments_status_body import IdExperimentsStatusBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdExperimentsStatusBody(unittest.TestCase): + """IdExperimentsStatusBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdExperimentsStatusBody(self): + """Test IdExperimentsStatusBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id_experiments_status_body.IdExperimentsStatusBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id_items_status_body.py b/vendor/elabapi-python/test/test_id_items_status_body.py new file mode 100644 index 0000000..6987f81 --- /dev/null +++ b/vendor/elabapi-python/test/test_id_items_status_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id_items_status_body import IdItemsStatusBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdItemsStatusBody(unittest.TestCase): + """IdItemsStatusBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdItemsStatusBody(self): + """Test IdItemsStatusBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id_items_status_body.IdItemsStatusBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id_resources_categories_body.py b/vendor/elabapi-python/test/test_id_resources_categories_body.py new file mode 100644 index 0000000..8d922da --- /dev/null +++ b/vendor/elabapi-python/test/test_id_resources_categories_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id_resources_categories_body import IdResourcesCategoriesBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdResourcesCategoriesBody(unittest.TestCase): + """IdResourcesCategoriesBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdResourcesCategoriesBody(self): + """Test IdResourcesCategoriesBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id_resources_categories_body.IdResourcesCategoriesBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id_steps_body.py b/vendor/elabapi-python/test/test_id_steps_body.py new file mode 100644 index 0000000..6c605cf --- /dev/null +++ b/vendor/elabapi-python/test/test_id_steps_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id_steps_body import IdStepsBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdStepsBody(unittest.TestCase): + """IdStepsBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdStepsBody(self): + """Test IdStepsBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id_steps_body.IdStepsBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id_tags_body.py b/vendor/elabapi-python/test/test_id_tags_body.py new file mode 100644 index 0000000..3ceb0d3 --- /dev/null +++ b/vendor/elabapi-python/test/test_id_tags_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id_tags_body import IdTagsBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdTagsBody(unittest.TestCase): + """IdTagsBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdTagsBody(self): + """Test IdTagsBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id_tags_body.IdTagsBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id_tags_body1.py b/vendor/elabapi-python/test/test_id_tags_body1.py new file mode 100644 index 0000000..c30257c --- /dev/null +++ b/vendor/elabapi-python/test/test_id_tags_body1.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id_tags_body1 import IdTagsBody1 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdTagsBody1(unittest.TestCase): + """IdTagsBody1 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdTagsBody1(self): + """Test IdTagsBody1""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id_tags_body1.IdTagsBody1() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id_teamgroups_body.py b/vendor/elabapi-python/test/test_id_teamgroups_body.py new file mode 100644 index 0000000..3687a3f --- /dev/null +++ b/vendor/elabapi-python/test/test_id_teamgroups_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id_teamgroups_body import IdTeamgroupsBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdTeamgroupsBody(unittest.TestCase): + """IdTeamgroupsBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdTeamgroupsBody(self): + """Test IdTeamgroupsBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id_teamgroups_body.IdTeamgroupsBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_id_uploads_body.py b/vendor/elabapi-python/test/test_id_uploads_body.py new file mode 100644 index 0000000..f3414ae --- /dev/null +++ b/vendor/elabapi-python/test/test_id_uploads_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.id_uploads_body import IdUploadsBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdUploadsBody(unittest.TestCase): + """IdUploadsBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdUploadsBody(self): + """Test IdUploadsBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.id_uploads_body.IdUploadsBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_idp.py b/vendor/elabapi-python/test/test_idp.py new file mode 100644 index 0000000..38d4124 --- /dev/null +++ b/vendor/elabapi-python/test/test_idp.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.idp import Idp # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdp(unittest.TestCase): + """Idp unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdp(self): + """Test Idp""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.idp.Idp() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_idp_cert.py b/vendor/elabapi-python/test/test_idp_cert.py new file mode 100644 index 0000000..19e30b7 --- /dev/null +++ b/vendor/elabapi-python/test/test_idp_cert.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.idp_cert import IdpCert # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdpCert(unittest.TestCase): + """IdpCert unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdpCert(self): + """Test IdpCert""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.idp_cert.IdpCert() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_idp_endpoint.py b/vendor/elabapi-python/test/test_idp_endpoint.py new file mode 100644 index 0000000..b155f48 --- /dev/null +++ b/vendor/elabapi-python/test/test_idp_endpoint.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.idp_endpoint import IdpEndpoint # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdpEndpoint(unittest.TestCase): + """IdpEndpoint unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdpEndpoint(self): + """Test IdpEndpoint""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.idp_endpoint.IdpEndpoint() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_idp_source.py b/vendor/elabapi-python/test/test_idp_source.py new file mode 100644 index 0000000..7b65e21 --- /dev/null +++ b/vendor/elabapi-python/test/test_idp_source.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.idp_source import IdpSource # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdpSource(unittest.TestCase): + """IdpSource unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdpSource(self): + """Test IdpSource""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.idp_source.IdpSource() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_idps_api.py b/vendor/elabapi-python/test/test_idps_api.py new file mode 100644 index 0000000..925875a --- /dev/null +++ b/vendor/elabapi-python/test/test_idps_api.py @@ -0,0 +1,124 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.idps_api import IdpsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdpsApi(unittest.TestCase): + """IdpsApi unit test stubs""" + + def setUp(self): + self.api = IdpsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_idp(self): + """Test case for delete_idp + + Delete an idp. # noqa: E501 + """ + pass + + def test_delete_idp_cert(self): + """Test case for delete_idp_cert + + Delete an idp cert. # noqa: E501 + """ + pass + + def test_delete_idp_endpoint(self): + """Test case for delete_idp_endpoint + + Delete an idp endpoint. # noqa: E501 + """ + pass + + def test_patch_idp(self): + """Test case for patch_idp + + Actions on an idp. # noqa: E501 + """ + pass + + def test_post_idp(self): + """Test case for post_idp + + Create an idp. # noqa: E501 + """ + pass + + def test_post_idp_cert(self): + """Test case for post_idp_cert + + Add a cert to this IdP. # noqa: E501 + """ + pass + + def test_post_idp_endpoint(self): + """Test case for post_idp_endpoint + + Add an endpoint to this IdP. # noqa: E501 + """ + pass + + def test_read_idp(self): + """Test case for read_idp + + Read an idp. # noqa: E501 + """ + pass + + def test_read_idp_cert(self): + """Test case for read_idp_cert + + Read a cert for an IdP. # noqa: E501 + """ + pass + + def test_read_idp_certs(self): + """Test case for read_idp_certs + + Read all certs for an IdP. # noqa: E501 + """ + pass + + def test_read_idp_endpoint(self): + """Test case for read_idp_endpoint + + Read an endpoint for an IdP. # noqa: E501 + """ + pass + + def test_read_idp_endpoints(self): + """Test case for read_idp_endpoints + + Read all endpoints for an IdP. # noqa: E501 + """ + pass + + def test_read_idps(self): + """Test case for read_idps + + Read all IDPs. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_idps_body.py b/vendor/elabapi-python/test/test_idps_body.py new file mode 100644 index 0000000..194feda --- /dev/null +++ b/vendor/elabapi-python/test/test_idps_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.idps_body import IdpsBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdpsBody(unittest.TestCase): + """IdpsBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdpsBody(self): + """Test IdpsBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.idps_body.IdpsBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_idps_id_body.py b/vendor/elabapi-python/test/test_idps_id_body.py new file mode 100644 index 0000000..781287d --- /dev/null +++ b/vendor/elabapi-python/test/test_idps_id_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.idps_id_body import IdpsIdBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdpsIdBody(unittest.TestCase): + """IdpsIdBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdpsIdBody(self): + """Test IdpsIdBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.idps_id_body.IdpsIdBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_idps_sources_api.py b/vendor/elabapi-python/test/test_idps_sources_api.py new file mode 100644 index 0000000..bcd0ea8 --- /dev/null +++ b/vendor/elabapi-python/test/test_idps_sources_api.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.idps_sources_api import IdpsSourcesApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdpsSourcesApi(unittest.TestCase): + """IdpsSourcesApi unit test stubs""" + + def setUp(self): + self.api = IdpsSourcesApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_idps_source(self): + """Test case for delete_idps_source + + Delete an idp source. # noqa: E501 + """ + pass + + def test_patch_idps_source(self): + """Test case for patch_idps_source + + Patch an idp source. # noqa: E501 + """ + pass + + def test_post_idp_source(self): + """Test case for post_idp_source + + Create an idp source. # noqa: E501 + """ + pass + + def test_read_idps_source(self): + """Test case for read_idps_source + + Read an IdPs source # noqa: E501 + """ + pass + + def test_read_idps_sources(self): + """Test case for read_idps_sources + + Read all IDPs sources # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_idps_sources_body.py b/vendor/elabapi-python/test/test_idps_sources_body.py new file mode 100644 index 0000000..8fcfc8c --- /dev/null +++ b/vendor/elabapi-python/test/test_idps_sources_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.idps_sources_body import IdpsSourcesBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdpsSourcesBody(unittest.TestCase): + """IdpsSourcesBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdpsSourcesBody(self): + """Test IdpsSourcesBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.idps_sources_body.IdpsSourcesBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_idps_sources_id_body.py b/vendor/elabapi-python/test/test_idps_sources_id_body.py new file mode 100644 index 0000000..6dc4463 --- /dev/null +++ b/vendor/elabapi-python/test/test_idps_sources_id_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.idps_sources_id_body import IdpsSourcesIdBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestIdpsSourcesIdBody(unittest.TestCase): + """IdpsSourcesIdBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testIdpsSourcesIdBody(self): + """Test IdpsSourcesIdBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.idps_sources_id_body.IdpsSourcesIdBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_import_api.py b/vendor/elabapi-python/test/test_import_api.py new file mode 100644 index 0000000..ccf81fa --- /dev/null +++ b/vendor/elabapi-python/test/test_import_api.py @@ -0,0 +1,47 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.import_api import ImportApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestImportApi(unittest.TestCase): + """ImportApi unit test stubs""" + + def setUp(self): + self.api = ImportApi() # noqa: E501 + + def tearDown(self): + pass + + def test_post_import(self): + """Test case for post_import + + Send a file to import # noqa: E501 + """ + pass + + def test_read_import(self): + """Test case for read_import + + Get information about this endpoint # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_import_body.py b/vendor/elabapi-python/test/test_import_body.py new file mode 100644 index 0000000..56f9529 --- /dev/null +++ b/vendor/elabapi-python/test/test_import_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.import_body import ImportBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestImportBody(unittest.TestCase): + """ImportBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testImportBody(self): + """Test ImportBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.import_body.ImportBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_info_api.py b/vendor/elabapi-python/test/test_info_api.py new file mode 100644 index 0000000..62b36ee --- /dev/null +++ b/vendor/elabapi-python/test/test_info_api.py @@ -0,0 +1,40 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.info_api import InfoApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInfoApi(unittest.TestCase): + """InfoApi unit test stubs""" + + def setUp(self): + self.api = InfoApi() # noqa: E501 + + def tearDown(self): + pass + + def test_get_info(self): + """Test case for get_info + + Get information about the instance. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response200.py b/vendor/elabapi-python/test/test_inline_response200.py new file mode 100644 index 0000000..4d0731d --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response200.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response200 import InlineResponse200 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse200(unittest.TestCase): + """InlineResponse200 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse200(self): + """Test InlineResponse200""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response200.InlineResponse200() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2001.py b/vendor/elabapi-python/test/test_inline_response2001.py new file mode 100644 index 0000000..5de80b8 --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2001.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2001 import InlineResponse2001 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2001(unittest.TestCase): + """InlineResponse2001 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2001(self): + """Test InlineResponse2001""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2001.InlineResponse2001() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response20010.py b/vendor/elabapi-python/test/test_inline_response20010.py new file mode 100644 index 0000000..9c074ec --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response20010.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response20010 import InlineResponse20010 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse20010(unittest.TestCase): + """InlineResponse20010 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse20010(self): + """Test InlineResponse20010""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response20010.InlineResponse20010() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2001_experiments.py b/vendor/elabapi-python/test/test_inline_response2001_experiments.py new file mode 100644 index 0000000..bcd5b85 --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2001_experiments.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2001_experiments import InlineResponse2001Experiments # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2001Experiments(unittest.TestCase): + """InlineResponse2001Experiments unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2001Experiments(self): + """Test InlineResponse2001Experiments""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2001_experiments.InlineResponse2001Experiments() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2001_items.py b/vendor/elabapi-python/test/test_inline_response2001_items.py new file mode 100644 index 0000000..0e444a4 --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2001_items.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2001_items import InlineResponse2001Items # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2001Items(unittest.TestCase): + """InlineResponse2001Items unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2001Items(self): + """Test InlineResponse2001Items""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2001_items.InlineResponse2001Items() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2001_users.py b/vendor/elabapi-python/test/test_inline_response2001_users.py new file mode 100644 index 0000000..6ab9e56 --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2001_users.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2001_users import InlineResponse2001Users # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2001Users(unittest.TestCase): + """InlineResponse2001Users unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2001Users(self): + """Test InlineResponse2001Users""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2001_users.InlineResponse2001Users() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2002.py b/vendor/elabapi-python/test/test_inline_response2002.py new file mode 100644 index 0000000..797f60f --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2002.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2002 import InlineResponse2002 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2002(unittest.TestCase): + """InlineResponse2002 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2002(self): + """Test InlineResponse2002""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2002.InlineResponse2002() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2003.py b/vendor/elabapi-python/test/test_inline_response2003.py new file mode 100644 index 0000000..92d41fc --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2003.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2003 import InlineResponse2003 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2003(unittest.TestCase): + """InlineResponse2003 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2003(self): + """Test InlineResponse2003""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2003.InlineResponse2003() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2004.py b/vendor/elabapi-python/test/test_inline_response2004.py new file mode 100644 index 0000000..3019f78 --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2004.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2004 import InlineResponse2004 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2004(unittest.TestCase): + """InlineResponse2004 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2004(self): + """Test InlineResponse2004""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2004.InlineResponse2004() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2004_query_parameters.py b/vendor/elabapi-python/test/test_inline_response2004_query_parameters.py new file mode 100644 index 0000000..5645767 --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2004_query_parameters.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2004_query_parameters import InlineResponse2004QueryParameters # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2004QueryParameters(unittest.TestCase): + """InlineResponse2004QueryParameters unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2004QueryParameters(self): + """Test InlineResponse2004QueryParameters""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2004_query_parameters.InlineResponse2004QueryParameters() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2005.py b/vendor/elabapi-python/test/test_inline_response2005.py new file mode 100644 index 0000000..dbbbe25 --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2005.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2005 import InlineResponse2005 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2005(unittest.TestCase): + """InlineResponse2005 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2005(self): + """Test InlineResponse2005""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2005.InlineResponse2005() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2006.py b/vendor/elabapi-python/test/test_inline_response2006.py new file mode 100644 index 0000000..b8fccb0 --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2006.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2006 import InlineResponse2006 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2006(unittest.TestCase): + """InlineResponse2006 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2006(self): + """Test InlineResponse2006""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2006.InlineResponse2006() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2007.py b/vendor/elabapi-python/test/test_inline_response2007.py new file mode 100644 index 0000000..20fae55 --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2007.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2007 import InlineResponse2007 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2007(unittest.TestCase): + """InlineResponse2007 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2007(self): + """Test InlineResponse2007""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2007.InlineResponse2007() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2008.py b/vendor/elabapi-python/test/test_inline_response2008.py new file mode 100644 index 0000000..abd5953 --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2008.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2008 import InlineResponse2008 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2008(unittest.TestCase): + """InlineResponse2008 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2008(self): + """Test InlineResponse2008""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2008.InlineResponse2008() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2009.py b/vendor/elabapi-python/test/test_inline_response2009.py new file mode 100644 index 0000000..49036d1 --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2009.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2009 import InlineResponse2009 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2009(unittest.TestCase): + """InlineResponse2009 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2009(self): + """Test InlineResponse2009""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2009.InlineResponse2009() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2009_embedded.py b/vendor/elabapi-python/test/test_inline_response2009_embedded.py new file mode 100644 index 0000000..6ddae6c --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2009_embedded.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2009_embedded import InlineResponse2009Embedded # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2009Embedded(unittest.TestCase): + """InlineResponse2009Embedded unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2009Embedded(self): + """Test InlineResponse2009Embedded""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2009_embedded.InlineResponse2009Embedded() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_inline_response2009_embedded_entries.py b/vendor/elabapi-python/test/test_inline_response2009_embedded_entries.py new file mode 100644 index 0000000..7dd5833 --- /dev/null +++ b/vendor/elabapi-python/test/test_inline_response2009_embedded_entries.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.inline_response2009_embedded_entries import InlineResponse2009EmbeddedEntries # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInlineResponse2009EmbeddedEntries(unittest.TestCase): + """InlineResponse2009EmbeddedEntries unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInlineResponse2009EmbeddedEntries(self): + """Test InlineResponse2009EmbeddedEntries""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.inline_response2009_embedded_entries.InlineResponse2009EmbeddedEntries() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_instance_api.py b/vendor/elabapi-python/test/test_instance_api.py new file mode 100644 index 0000000..12d54a5 --- /dev/null +++ b/vendor/elabapi-python/test/test_instance_api.py @@ -0,0 +1,40 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.instance_api import InstanceApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInstanceApi(unittest.TestCase): + """InstanceApi unit test stubs""" + + def setUp(self): + self.api = InstanceApi() # noqa: E501 + + def tearDown(self): + pass + + def test_post_instance(self): + """Test case for post_instance + + Run an instance level action. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_instance_body.py b/vendor/elabapi-python/test/test_instance_body.py new file mode 100644 index 0000000..ef40c63 --- /dev/null +++ b/vendor/elabapi-python/test/test_instance_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.instance_body import InstanceBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestInstanceBody(unittest.TestCase): + """InstanceBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testInstanceBody(self): + """Test InstanceBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.instance_body.InstanceBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_item.py b/vendor/elabapi-python/test/test_item.py new file mode 100644 index 0000000..b88f0fd --- /dev/null +++ b/vendor/elabapi-python/test/test_item.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.item import Item # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestItem(unittest.TestCase): + """Item unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testItem(self): + """Test Item""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.item.Item() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_item_editable.py b/vendor/elabapi-python/test/test_item_editable.py new file mode 100644 index 0000000..6c399b6 --- /dev/null +++ b/vendor/elabapi-python/test/test_item_editable.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.item_editable import ItemEditable # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestItemEditable(unittest.TestCase): + """ItemEditable unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testItemEditable(self): + """Test ItemEditable""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.item_editable.ItemEditable() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_items_api.py b/vendor/elabapi-python/test/test_items_api.py new file mode 100644 index 0000000..9c26869 --- /dev/null +++ b/vendor/elabapi-python/test/test_items_api.py @@ -0,0 +1,75 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.items_api import ItemsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestItemsApi(unittest.TestCase): + """ItemsApi unit test stubs""" + + def setUp(self): + self.api = ItemsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_item(self): + """Test case for delete_item + + Delete an item. # noqa: E501 + """ + pass + + def test_get_item(self): + """Test case for get_item + + Read an item # noqa: E501 + """ + pass + + def test_patch_item(self): + """Test case for patch_item + + Modify an item # noqa: E501 + """ + pass + + def test_post_item(self): + """Test case for post_item + + Create an item # noqa: E501 + """ + pass + + def test_post_item_by_id(self): + """Test case for post_item_by_id + + Duplicate an item with its ID # noqa: E501 + """ + pass + + def test_read_items(self): + """Test case for read_items + + Read all items that are accessible # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_items_links_subid_body.py b/vendor/elabapi-python/test/test_items_links_subid_body.py new file mode 100644 index 0000000..d37164c --- /dev/null +++ b/vendor/elabapi-python/test/test_items_links_subid_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.items_links_subid_body import ItemsLinksSubidBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestItemsLinksSubidBody(unittest.TestCase): + """ItemsLinksSubidBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testItemsLinksSubidBody(self): + """Test ItemsLinksSubidBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.items_links_subid_body.ItemsLinksSubidBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_items_types__resources_templates_api.py b/vendor/elabapi-python/test/test_items_types__resources_templates_api.py new file mode 100644 index 0000000..269d525 --- /dev/null +++ b/vendor/elabapi-python/test/test_items_types__resources_templates_api.py @@ -0,0 +1,75 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.items_types__resources_templates_api import ItemsTypesResourcesTemplatesApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestItemsTypesResourcesTemplatesApi(unittest.TestCase): + """ItemsTypesResourcesTemplatesApi unit test stubs""" + + def setUp(self): + self.api = ItemsTypesResourcesTemplatesApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_items_type(self): + """Test case for delete_items_type + + Delete a resource template. # noqa: E501 + """ + pass + + def test_get_items_type(self): + """Test case for get_items_type + + Read a resource template # noqa: E501 + """ + pass + + def test_patch_items_type(self): + """Test case for patch_items_type + + Modify a resource template # noqa: E501 + """ + pass + + def test_post_items_types(self): + """Test case for post_items_types + + Create a resource template # noqa: E501 + """ + pass + + def test_post_items_types_by_id(self): + """Test case for post_items_types_by_id + + Duplicate a resource template with its ID # noqa: E501 + """ + pass + + def test_read_items_types(self): + """Test case for read_items_types + + Read all resources templates that are accessible # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_items_types_id_body.py b/vendor/elabapi-python/test/test_items_types_id_body.py new file mode 100644 index 0000000..d1f4cd5 --- /dev/null +++ b/vendor/elabapi-python/test/test_items_types_id_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.items_types_id_body import ItemsTypesIdBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestItemsTypesIdBody(unittest.TestCase): + """ItemsTypesIdBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testItemsTypesIdBody(self): + """Test ItemsTypesIdBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.items_types_id_body.ItemsTypesIdBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_link.py b/vendor/elabapi-python/test/test_link.py new file mode 100644 index 0000000..71628e2 --- /dev/null +++ b/vendor/elabapi-python/test/test_link.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.link import Link # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestLink(unittest.TestCase): + """Link unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testLink(self): + """Test Link""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.link.Link() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_links_to_compounds_api.py b/vendor/elabapi-python/test/test_links_to_compounds_api.py new file mode 100644 index 0000000..43756d7 --- /dev/null +++ b/vendor/elabapi-python/test/test_links_to_compounds_api.py @@ -0,0 +1,54 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.links_to_compounds_api import LinksToCompoundsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestLinksToCompoundsApi(unittest.TestCase): + """LinksToCompoundsApi unit test stubs""" + + def setUp(self): + self.api = LinksToCompoundsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_entity_compounds_link(self): + """Test case for delete_entity_compounds_link + + Delete a compound link. # noqa: E501 + """ + pass + + def test_post_entity_compounds_links(self): + """Test case for post_entity_compounds_links + + Link an entity to a compound. # noqa: E501 + """ + pass + + def test_read_entity_compounds_links(self): + """Test case for read_entity_compounds_links + + Read all compounds links of that entity. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_links_to_experiments_api.py b/vendor/elabapi-python/test/test_links_to_experiments_api.py new file mode 100644 index 0000000..87da021 --- /dev/null +++ b/vendor/elabapi-python/test/test_links_to_experiments_api.py @@ -0,0 +1,54 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.links_to_experiments_api import LinksToExperimentsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestLinksToExperimentsApi(unittest.TestCase): + """LinksToExperimentsApi unit test stubs""" + + def setUp(self): + self.api = LinksToExperimentsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_entity_experiments_link(self): + """Test case for delete_entity_experiments_link + + Delete an experiment link. # noqa: E501 + """ + pass + + def test_post_entity_experiments_links(self): + """Test case for post_entity_experiments_links + + Create or import a link. # noqa: E501 + """ + pass + + def test_read_entity_experiments_links(self): + """Test case for read_entity_experiments_links + + Read all experiments links of that entity. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_links_to_items_api.py b/vendor/elabapi-python/test/test_links_to_items_api.py new file mode 100644 index 0000000..45d7675 --- /dev/null +++ b/vendor/elabapi-python/test/test_links_to_items_api.py @@ -0,0 +1,54 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.links_to_items_api import LinksToItemsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestLinksToItemsApi(unittest.TestCase): + """LinksToItemsApi unit test stubs""" + + def setUp(self): + self.api = LinksToItemsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_entitiy_items_link(self): + """Test case for delete_entitiy_items_link + + Delete an item link. # noqa: E501 + """ + pass + + def test_post_entity_items_links(self): + """Test case for post_entity_items_links + + Create or import a link. # noqa: E501 + """ + pass + + def test_read_entity_items_links(self): + """Test case for read_entity_items_links + + Read all items links of that entity. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_metadata.py b/vendor/elabapi-python/test/test_metadata.py new file mode 100644 index 0000000..d839086 --- /dev/null +++ b/vendor/elabapi-python/test/test_metadata.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.metadata import Metadata # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestMetadata(unittest.TestCase): + """Metadata unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testMetadata(self): + """Test Metadata""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.metadata.Metadata() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_metadata_elabftw.py b/vendor/elabapi-python/test/test_metadata_elabftw.py new file mode 100644 index 0000000..3c616a8 --- /dev/null +++ b/vendor/elabapi-python/test/test_metadata_elabftw.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.metadata_elabftw import MetadataElabftw # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestMetadataElabftw(unittest.TestCase): + """MetadataElabftw unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testMetadataElabftw(self): + """Test MetadataElabftw""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.metadata_elabftw.MetadataElabftw() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_metadata_elabftw_extra_fields_groups.py b/vendor/elabapi-python/test/test_metadata_elabftw_extra_fields_groups.py new file mode 100644 index 0000000..43991fb --- /dev/null +++ b/vendor/elabapi-python/test/test_metadata_elabftw_extra_fields_groups.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.metadata_elabftw_extra_fields_groups import MetadataElabftwExtraFieldsGroups # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestMetadataElabftwExtraFieldsGroups(unittest.TestCase): + """MetadataElabftwExtraFieldsGroups unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testMetadataElabftwExtraFieldsGroups(self): + """Test MetadataElabftwExtraFieldsGroups""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.metadata_elabftw_extra_fields_groups.MetadataElabftwExtraFieldsGroups() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_metadata_extra_fields.py b/vendor/elabapi-python/test/test_metadata_extra_fields.py new file mode 100644 index 0000000..686f89e --- /dev/null +++ b/vendor/elabapi-python/test/test_metadata_extra_fields.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.metadata_extra_fields import MetadataExtraFields # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestMetadataExtraFields(unittest.TestCase): + """MetadataExtraFields unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testMetadataExtraFields(self): + """Test MetadataExtraFields""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.metadata_extra_fields.MetadataExtraFields() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_notification.py b/vendor/elabapi-python/test/test_notification.py new file mode 100644 index 0000000..21c3900 --- /dev/null +++ b/vendor/elabapi-python/test/test_notification.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.notification import Notification # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestNotification(unittest.TestCase): + """Notification unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testNotification(self): + """Test Notification""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.notification.Notification() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_notifications_api.py b/vendor/elabapi-python/test/test_notifications_api.py new file mode 100644 index 0000000..398ca2f --- /dev/null +++ b/vendor/elabapi-python/test/test_notifications_api.py @@ -0,0 +1,61 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.notifications_api import NotificationsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestNotificationsApi(unittest.TestCase): + """NotificationsApi unit test stubs""" + + def setUp(self): + self.api = NotificationsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_notifications(self): + """Test case for delete_notifications + + Delete all notifications of the user. # noqa: E501 + """ + pass + + def test_patch_notification(self): + """Test case for patch_notification + + Update the acknowledgment status of a notification. # noqa: E501 + """ + pass + + def test_read_notification(self): + """Test case for read_notification + + Read a notification. # noqa: E501 + """ + pass + + def test_read_notifications(self): + """Test case for read_notifications + + Read notifications of a user. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_notifications_subid_body.py b/vendor/elabapi-python/test/test_notifications_subid_body.py new file mode 100644 index 0000000..b9ffc5a --- /dev/null +++ b/vendor/elabapi-python/test/test_notifications_subid_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.notifications_subid_body import NotificationsSubidBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestNotificationsSubidBody(unittest.TestCase): + """NotificationsSubidBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testNotificationsSubidBody(self): + """Test NotificationsSubidBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.notifications_subid_body.NotificationsSubidBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_patch_action.py b/vendor/elabapi-python/test/test_patch_action.py new file mode 100644 index 0000000..683a302 --- /dev/null +++ b/vendor/elabapi-python/test/test_patch_action.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.patch_action import PatchAction # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestPatchAction(unittest.TestCase): + """PatchAction unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testPatchAction(self): + """Test PatchAction""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.patch_action.PatchAction() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_reports_api.py b/vendor/elabapi-python/test/test_reports_api.py new file mode 100644 index 0000000..bd318e7 --- /dev/null +++ b/vendor/elabapi-python/test/test_reports_api.py @@ -0,0 +1,40 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.reports_api import ReportsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestReportsApi(unittest.TestCase): + """ReportsApi unit test stubs""" + + def setUp(self): + self.api = ReportsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_get_reports(self): + """Test case for get_reports + + Get usage reports # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_resources_categories_api.py b/vendor/elabapi-python/test/test_resources_categories_api.py new file mode 100644 index 0000000..17ee58c --- /dev/null +++ b/vendor/elabapi-python/test/test_resources_categories_api.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.resources_categories_api import ResourcesCategoriesApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestResourcesCategoriesApi(unittest.TestCase): + """ResourcesCategoriesApi unit test stubs""" + + def setUp(self): + self.api = ResourcesCategoriesApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_rescat(self): + """Test case for delete_rescat + + Delete a category. # noqa: E501 + """ + pass + + def test_patch_rescat(self): + """Test case for patch_rescat + + Modify a category. # noqa: E501 + """ + pass + + def test_post_team_one_rescat(self): + """Test case for post_team_one_rescat + + Create a new category for resources. # noqa: E501 + """ + pass + + def test_read_team_one_rescat(self): + """Test case for read_team_one_rescat + + Read a category. # noqa: E501 + """ + pass + + def test_read_team_resources_categories(self): + """Test case for read_team_resources_categories + + Read resources categories of a team. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_resources_status_api.py b/vendor/elabapi-python/test/test_resources_status_api.py new file mode 100644 index 0000000..222e38f --- /dev/null +++ b/vendor/elabapi-python/test/test_resources_status_api.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.resources_status_api import ResourcesStatusApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestResourcesStatusApi(unittest.TestCase): + """ResourcesStatusApi unit test stubs""" + + def setUp(self): + self.api = ResourcesStatusApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_resstatus(self): + """Test case for delete_resstatus + + Delete a status. # noqa: E501 + """ + pass + + def test_patch_resstatus(self): + """Test case for patch_resstatus + + Modify a status. # noqa: E501 + """ + pass + + def test_post_team_one_resstat(self): + """Test case for post_team_one_resstat + + Create a new status for resources. # noqa: E501 + """ + pass + + def test_read_team_items_status(self): + """Test case for read_team_items_status + + Read resources status of a team. # noqa: E501 + """ + pass + + def test_read_team_one_resstatus(self): + """Test case for read_team_one_resstatus + + Read a status. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_revision.py b/vendor/elabapi-python/test/test_revision.py new file mode 100644 index 0000000..a1e8bdc --- /dev/null +++ b/vendor/elabapi-python/test/test_revision.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.revision import Revision # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestRevision(unittest.TestCase): + """Revision unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testRevision(self): + """Test Revision""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.revision.Revision() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_revisions_api.py b/vendor/elabapi-python/test/test_revisions_api.py new file mode 100644 index 0000000..afb6451 --- /dev/null +++ b/vendor/elabapi-python/test/test_revisions_api.py @@ -0,0 +1,54 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.revisions_api import RevisionsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestRevisionsApi(unittest.TestCase): + """RevisionsApi unit test stubs""" + + def setUp(self): + self.api = RevisionsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_patch_entity_revision(self): + """Test case for patch_entity_revision + + Restore a revision. # noqa: E501 + """ + pass + + def test_read_entity_revision(self): + """Test case for read_entity_revision + + Read a revision of that entity. # noqa: E501 + """ + pass + + def test_read_entity_revisions(self): + """Test case for read_entity_revisions + + Read all revisions of that entity. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_revisions_subid_body.py b/vendor/elabapi-python/test/test_revisions_subid_body.py new file mode 100644 index 0000000..c322fed --- /dev/null +++ b/vendor/elabapi-python/test/test_revisions_subid_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.revisions_subid_body import RevisionsSubidBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestRevisionsSubidBody(unittest.TestCase): + """RevisionsSubidBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testRevisionsSubidBody(self): + """Test RevisionsSubidBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.revisions_subid_body.RevisionsSubidBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_statuslike.py b/vendor/elabapi-python/test/test_statuslike.py new file mode 100644 index 0000000..5ee9904 --- /dev/null +++ b/vendor/elabapi-python/test/test_statuslike.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.statuslike import Statuslike # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestStatuslike(unittest.TestCase): + """Statuslike unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testStatuslike(self): + """Test Statuslike""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.statuslike.Statuslike() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_step.py b/vendor/elabapi-python/test/test_step.py new file mode 100644 index 0000000..4550ca1 --- /dev/null +++ b/vendor/elabapi-python/test/test_step.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.step import Step # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestStep(unittest.TestCase): + """Step unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testStep(self): + """Test Step""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.step.Step() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_steps_api.py b/vendor/elabapi-python/test/test_steps_api.py new file mode 100644 index 0000000..518a34b --- /dev/null +++ b/vendor/elabapi-python/test/test_steps_api.py @@ -0,0 +1,61 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.steps_api import StepsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestStepsApi(unittest.TestCase): + """StepsApi unit test stubs""" + + def setUp(self): + self.api = StepsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_step(self): + """Test case for delete_step + + Delete a step. # noqa: E501 + """ + pass + + def test_patch_step(self): + """Test case for patch_step + + Actions on a step. # noqa: E501 + """ + pass + + def test_post_step(self): + """Test case for post_step + + Create a step. # noqa: E501 + """ + pass + + def test_read_steps(self): + """Test case for read_steps + + Read all steps of that entity. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_steps_subid_body.py b/vendor/elabapi-python/test/test_steps_subid_body.py new file mode 100644 index 0000000..a076a7c --- /dev/null +++ b/vendor/elabapi-python/test/test_steps_subid_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.steps_subid_body import StepsSubidBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestStepsSubidBody(unittest.TestCase): + """StepsSubidBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testStepsSubidBody(self): + """Test StepsSubidBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.steps_subid_body.StepsSubidBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_storage_unit.py b/vendor/elabapi-python/test/test_storage_unit.py new file mode 100644 index 0000000..4ad6975 --- /dev/null +++ b/vendor/elabapi-python/test/test_storage_unit.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.storage_unit import StorageUnit # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestStorageUnit(unittest.TestCase): + """StorageUnit unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testStorageUnit(self): + """Test StorageUnit""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.storage_unit.StorageUnit() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_storage_units_api.py b/vendor/elabapi-python/test/test_storage_units_api.py new file mode 100644 index 0000000..799b30b --- /dev/null +++ b/vendor/elabapi-python/test/test_storage_units_api.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.storage_units_api import StorageUnitsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestStorageUnitsApi(unittest.TestCase): + """StorageUnitsApi unit test stubs""" + + def setUp(self): + self.api = StorageUnitsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_storage_unit(self): + """Test case for delete_storage_unit + + Delete a storage unit. # noqa: E501 + """ + pass + + def test_patch_storage_unit(self): + """Test case for patch_storage_unit + + Modify a storage unit. # noqa: E501 + """ + pass + + def test_post_storage_unit(self): + """Test case for post_storage_unit + + Create a new storage unit. # noqa: E501 + """ + pass + + def test_read_storage_unit(self): + """Test case for read_storage_unit + + Read a storage unit. # noqa: E501 + """ + pass + + def test_read_storage_units(self): + """Test case for read_storage_units + + Read all containers, or the storage unit hierarchy when `?hierarchy=true`. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_storage_units_body.py b/vendor/elabapi-python/test/test_storage_units_body.py new file mode 100644 index 0000000..db9b1bc --- /dev/null +++ b/vendor/elabapi-python/test/test_storage_units_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.storage_units_body import StorageUnitsBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestStorageUnitsBody(unittest.TestCase): + """StorageUnitsBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testStorageUnitsBody(self): + """Test StorageUnitsBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.storage_units_body.StorageUnitsBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_storage_units_id_body.py b/vendor/elabapi-python/test/test_storage_units_id_body.py new file mode 100644 index 0000000..1600e0f --- /dev/null +++ b/vendor/elabapi-python/test/test_storage_units_id_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.storage_units_id_body import StorageUnitsIdBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestStorageUnitsIdBody(unittest.TestCase): + """StorageUnitsIdBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testStorageUnitsIdBody(self): + """Test StorageUnitsIdBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.storage_units_id_body.StorageUnitsIdBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_tag.py b/vendor/elabapi-python/test/test_tag.py new file mode 100644 index 0000000..481901c --- /dev/null +++ b/vendor/elabapi-python/test/test_tag.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.tag import Tag # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTag(unittest.TestCase): + """Tag unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testTag(self): + """Test Tag""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.tag.Tag() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_tags_api.py b/vendor/elabapi-python/test/test_tags_api.py new file mode 100644 index 0000000..28bfb11 --- /dev/null +++ b/vendor/elabapi-python/test/test_tags_api.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.tags_api import TagsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTagsApi(unittest.TestCase): + """TagsApi unit test stubs""" + + def setUp(self): + self.api = TagsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_tag(self): + """Test case for delete_tag + + Delete all tags. # noqa: E501 + """ + pass + + def test_patch_tag(self): + """Test case for patch_tag + + Actions on a tag (like removing it from the entity). # noqa: E501 + """ + pass + + def test_post_tag(self): + """Test case for post_tag + + Create a tag. # noqa: E501 + """ + pass + + def test_read_tag(self): + """Test case for read_tag + + Read a tag. # noqa: E501 + """ + pass + + def test_read_tags(self): + """Test case for read_tags + + Read all tags of that entity. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_tags_subid_body.py b/vendor/elabapi-python/test/test_tags_subid_body.py new file mode 100644 index 0000000..93efb33 --- /dev/null +++ b/vendor/elabapi-python/test/test_tags_subid_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.tags_subid_body import TagsSubidBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTagsSubidBody(unittest.TestCase): + """TagsSubidBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testTagsSubidBody(self): + """Test TagsSubidBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.tags_subid_body.TagsSubidBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_tags_subid_body1.py b/vendor/elabapi-python/test/test_tags_subid_body1.py new file mode 100644 index 0000000..a3510eb --- /dev/null +++ b/vendor/elabapi-python/test/test_tags_subid_body1.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.tags_subid_body1 import TagsSubidBody1 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTagsSubidBody1(unittest.TestCase): + """TagsSubidBody1 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testTagsSubidBody1(self): + """Test TagsSubidBody1""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.tags_subid_body1.TagsSubidBody1() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_team.py b/vendor/elabapi-python/test/test_team.py new file mode 100644 index 0000000..1bb5ea3 --- /dev/null +++ b/vendor/elabapi-python/test/test_team.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.team import Team # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTeam(unittest.TestCase): + """Team unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testTeam(self): + """Test Team""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.team.Team() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_team_tags_api.py b/vendor/elabapi-python/test/test_team_tags_api.py new file mode 100644 index 0000000..c516b5c --- /dev/null +++ b/vendor/elabapi-python/test/test_team_tags_api.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.team_tags_api import TeamTagsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTeamTagsApi(unittest.TestCase): + """TeamTagsApi unit test stubs""" + + def setUp(self): + self.api = TeamTagsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_team_tag(self): + """Test case for delete_team_tag + + Delete a tag. # noqa: E501 + """ + pass + + def test_patch_team_tag(self): + """Test case for patch_team_tag + + Actions on a tag. # noqa: E501 + """ + pass + + def test_post_team_tag(self): + """Test case for post_team_tag + + Create a tag in the team. # noqa: E501 + """ + pass + + def test_read_team_tag(self): + """Test case for read_team_tag + + Read a tag. # noqa: E501 + """ + pass + + def test_read_team_tags(self): + """Test case for read_team_tags + + Read all tags for the team. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_teamgroup.py b/vendor/elabapi-python/test/test_teamgroup.py new file mode 100644 index 0000000..4b08bc6 --- /dev/null +++ b/vendor/elabapi-python/test/test_teamgroup.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.teamgroup import Teamgroup # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTeamgroup(unittest.TestCase): + """Teamgroup unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testTeamgroup(self): + """Test Teamgroup""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.teamgroup.Teamgroup() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_teamgroup_users.py b/vendor/elabapi-python/test/test_teamgroup_users.py new file mode 100644 index 0000000..9b90382 --- /dev/null +++ b/vendor/elabapi-python/test/test_teamgroup_users.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.teamgroup_users import TeamgroupUsers # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTeamgroupUsers(unittest.TestCase): + """TeamgroupUsers unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testTeamgroupUsers(self): + """Test TeamgroupUsers""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.teamgroup_users.TeamgroupUsers() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_teamgroups_api.py b/vendor/elabapi-python/test/test_teamgroups_api.py new file mode 100644 index 0000000..78df247 --- /dev/null +++ b/vendor/elabapi-python/test/test_teamgroups_api.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.teamgroups_api import TeamgroupsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTeamgroupsApi(unittest.TestCase): + """TeamgroupsApi unit test stubs""" + + def setUp(self): + self.api = TeamgroupsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_teamgroup(self): + """Test case for delete_teamgroup + + Delete a teamgroup. # noqa: E501 + """ + pass + + def test_patch_teamgroup(self): + """Test case for patch_teamgroup + + Modify a teamgroup. # noqa: E501 + """ + pass + + def test_post_teamgroups(self): + """Test case for post_teamgroups + + Create a new teamgroup. # noqa: E501 + """ + pass + + def test_read_team_teamgroups(self): + """Test case for read_team_teamgroups + + Read teamgroups of a team. # noqa: E501 + """ + pass + + def test_read_teamgroup(self): + """Test case for read_teamgroup + + Read a teamgroup. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_teamgroups_subid_body.py b/vendor/elabapi-python/test/test_teamgroups_subid_body.py new file mode 100644 index 0000000..258d112 --- /dev/null +++ b/vendor/elabapi-python/test/test_teamgroups_subid_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.teamgroups_subid_body import TeamgroupsSubidBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTeamgroupsSubidBody(unittest.TestCase): + """TeamgroupsSubidBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testTeamgroupsSubidBody(self): + """Test TeamgroupsSubidBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.teamgroups_subid_body.TeamgroupsSubidBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_teams_api.py b/vendor/elabapi-python/test/test_teams_api.py new file mode 100644 index 0000000..2506414 --- /dev/null +++ b/vendor/elabapi-python/test/test_teams_api.py @@ -0,0 +1,61 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.teams_api import TeamsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTeamsApi(unittest.TestCase): + """TeamsApi unit test stubs""" + + def setUp(self): + self.api = TeamsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_patch_team(self): + """Test case for patch_team + + Actions on a team. # noqa: E501 + """ + pass + + def test_post_teams(self): + """Test case for post_teams + + Create a new team. # noqa: E501 + """ + pass + + def test_read_team(self): + """Test case for read_team + + Read a team. Requires Admin permissions. # noqa: E501 + """ + pass + + def test_read_teams(self): + """Test case for read_teams + + Read all teams. Requires Sysadmin permissions. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_teams_body.py b/vendor/elabapi-python/test/test_teams_body.py new file mode 100644 index 0000000..a46af1c --- /dev/null +++ b/vendor/elabapi-python/test/test_teams_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.teams_body import TeamsBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTeamsBody(unittest.TestCase): + """TeamsBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testTeamsBody(self): + """Test TeamsBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.teams_body.TeamsBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_teams_id_body.py b/vendor/elabapi-python/test/test_teams_id_body.py new file mode 100644 index 0000000..23f820f --- /dev/null +++ b/vendor/elabapi-python/test/test_teams_id_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.teams_id_body import TeamsIdBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTeamsIdBody(unittest.TestCase): + """TeamsIdBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testTeamsIdBody(self): + """Test TeamsIdBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.teams_id_body.TeamsIdBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_todoitem.py b/vendor/elabapi-python/test/test_todoitem.py new file mode 100644 index 0000000..8610ec8 --- /dev/null +++ b/vendor/elabapi-python/test/test_todoitem.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.todoitem import Todoitem # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTodoitem(unittest.TestCase): + """Todoitem unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testTodoitem(self): + """Test Todoitem""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.todoitem.Todoitem() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_todolist_api.py b/vendor/elabapi-python/test/test_todolist_api.py new file mode 100644 index 0000000..7f9fde8 --- /dev/null +++ b/vendor/elabapi-python/test/test_todolist_api.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.todolist_api import TodolistApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTodolistApi(unittest.TestCase): + """TodolistApi unit test stubs""" + + def setUp(self): + self.api = TodolistApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_todoitem(self): + """Test case for delete_todoitem + + Delete a todoitem. # noqa: E501 + """ + pass + + def test_patch_todoitem(self): + """Test case for patch_todoitem + + Actions on a todoitem. # noqa: E501 + """ + pass + + def test_post_todolist(self): + """Test case for post_todolist + + Create a todo item # noqa: E501 + """ + pass + + def test_read_todoitem(self): + """Test case for read_todoitem + + Read a todo entry. # noqa: E501 + """ + pass + + def test_read_todolist(self): + """Test case for read_todolist + + Read all todoitems. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_todolist_body.py b/vendor/elabapi-python/test/test_todolist_body.py new file mode 100644 index 0000000..86303fe --- /dev/null +++ b/vendor/elabapi-python/test/test_todolist_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.todolist_body import TodolistBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTodolistBody(unittest.TestCase): + """TodolistBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testTodolistBody(self): + """Test TodolistBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.todolist_body.TodolistBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_todolist_id_body.py b/vendor/elabapi-python/test/test_todolist_id_body.py new file mode 100644 index 0000000..dcb1586 --- /dev/null +++ b/vendor/elabapi-python/test/test_todolist_id_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.todolist_id_body import TodolistIdBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestTodolistIdBody(unittest.TestCase): + """TodolistIdBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testTodolistIdBody(self): + """Test TodolistIdBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.todolist_id_body.TodolistIdBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_unfinished_step.py b/vendor/elabapi-python/test/test_unfinished_step.py new file mode 100644 index 0000000..974664d --- /dev/null +++ b/vendor/elabapi-python/test/test_unfinished_step.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.unfinished_step import UnfinishedStep # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestUnfinishedStep(unittest.TestCase): + """UnfinishedStep unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testUnfinishedStep(self): + """Test UnfinishedStep""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.unfinished_step.UnfinishedStep() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_unfinished_steps.py b/vendor/elabapi-python/test/test_unfinished_steps.py new file mode 100644 index 0000000..33f6eb8 --- /dev/null +++ b/vendor/elabapi-python/test/test_unfinished_steps.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.unfinished_steps import UnfinishedSteps # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestUnfinishedSteps(unittest.TestCase): + """UnfinishedSteps unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testUnfinishedSteps(self): + """Test UnfinishedSteps""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.unfinished_steps.UnfinishedSteps() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_unfinished_steps_api.py b/vendor/elabapi-python/test/test_unfinished_steps_api.py new file mode 100644 index 0000000..c588e7f --- /dev/null +++ b/vendor/elabapi-python/test/test_unfinished_steps_api.py @@ -0,0 +1,40 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.unfinished_steps_api import UnfinishedStepsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestUnfinishedStepsApi(unittest.TestCase): + """UnfinishedStepsApi unit test stubs""" + + def setUp(self): + self.api = UnfinishedStepsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_read_unfinished_steps(self): + """Test case for read_unfinished_steps + + Read all unfinished steps. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_upload.py b/vendor/elabapi-python/test/test_upload.py new file mode 100644 index 0000000..3756e19 --- /dev/null +++ b/vendor/elabapi-python/test/test_upload.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.upload import Upload # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestUpload(unittest.TestCase): + """Upload unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testUpload(self): + """Test Upload""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.upload.Upload() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_uploads_api.py b/vendor/elabapi-python/test/test_uploads_api.py new file mode 100644 index 0000000..89db18a --- /dev/null +++ b/vendor/elabapi-python/test/test_uploads_api.py @@ -0,0 +1,75 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.uploads_api import UploadsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestUploadsApi(unittest.TestCase): + """UploadsApi unit test stubs""" + + def setUp(self): + self.api = UploadsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_delete_upload(self): + """Test case for delete_upload + + Delete an upload. # noqa: E501 + """ + pass + + def test_patch_upload(self): + """Test case for patch_upload + + Modify attributes such as \"real_name\", \"comment\" or \"state\" of an upload. # noqa: E501 + """ + pass + + def test_post_upload(self): + """Test case for post_upload + + Create an upload. # noqa: E501 + """ + pass + + def test_post_upload_replace(self): + """Test case for post_upload_replace + + Replace an existing uploaded file. The existing file will be archived and the new one will be added. # noqa: E501 + """ + pass + + def test_read_upload(self): + """Test case for read_upload + + Read an upload. # noqa: E501 + """ + pass + + def test_read_uploads(self): + """Test case for read_uploads + + Read attached files of that entity. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_uploads_subid_body.py b/vendor/elabapi-python/test/test_uploads_subid_body.py new file mode 100644 index 0000000..2df0ae6 --- /dev/null +++ b/vendor/elabapi-python/test/test_uploads_subid_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.uploads_subid_body import UploadsSubidBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestUploadsSubidBody(unittest.TestCase): + """UploadsSubidBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testUploadsSubidBody(self): + """Test UploadsSubidBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.uploads_subid_body.UploadsSubidBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_uploads_subid_body1.py b/vendor/elabapi-python/test/test_uploads_subid_body1.py new file mode 100644 index 0000000..126bbcb --- /dev/null +++ b/vendor/elabapi-python/test/test_uploads_subid_body1.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.uploads_subid_body1 import UploadsSubidBody1 # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestUploadsSubidBody1(unittest.TestCase): + """UploadsSubidBody1 unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testUploadsSubidBody1(self): + """Test UploadsSubidBody1""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.uploads_subid_body1.UploadsSubidBody1() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_user_uploads_api.py b/vendor/elabapi-python/test/test_user_uploads_api.py new file mode 100644 index 0000000..37c68f1 --- /dev/null +++ b/vendor/elabapi-python/test/test_user_uploads_api.py @@ -0,0 +1,40 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.user_uploads_api import UserUploadsApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestUserUploadsApi(unittest.TestCase): + """UserUploadsApi unit test stubs""" + + def setUp(self): + self.api = UserUploadsApi() # noqa: E501 + + def tearDown(self): + pass + + def test_read_user_uploads(self): + """Test case for read_user_uploads + + Read attached files from a user # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_users.py b/vendor/elabapi-python/test/test_users.py new file mode 100644 index 0000000..1daaa3f --- /dev/null +++ b/vendor/elabapi-python/test/test_users.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.users import Users # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestUsers(unittest.TestCase): + """Users unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testUsers(self): + """Test Users""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.users.Users() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_users_api.py b/vendor/elabapi-python/test/test_users_api.py new file mode 100644 index 0000000..7b9f744 --- /dev/null +++ b/vendor/elabapi-python/test/test_users_api.py @@ -0,0 +1,61 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.api.users_api import UsersApi # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestUsersApi(unittest.TestCase): + """UsersApi unit test stubs""" + + def setUp(self): + self.api = UsersApi() # noqa: E501 + + def tearDown(self): + pass + + def test_patch_user(self): + """Test case for patch_user + + Modify a user. # noqa: E501 + """ + pass + + def test_post_user(self): + """Test case for post_user + + Create a new user. # noqa: E501 + """ + pass + + def test_read_user(self): + """Test case for read_user + + Read information of a user. # noqa: E501 + """ + pass + + def test_read_users(self): + """Test case for read_users + + Read users from instance. # noqa: E501 + """ + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_users_body.py b/vendor/elabapi-python/test/test_users_body.py new file mode 100644 index 0000000..48012ae --- /dev/null +++ b/vendor/elabapi-python/test/test_users_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.users_body import UsersBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestUsersBody(unittest.TestCase): + """UsersBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testUsersBody(self): + """Test UsersBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.users_body.UsersBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_users_full.py b/vendor/elabapi-python/test/test_users_full.py new file mode 100644 index 0000000..e9292c6 --- /dev/null +++ b/vendor/elabapi-python/test/test_users_full.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.users_full import UsersFull # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestUsersFull(unittest.TestCase): + """UsersFull unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testUsersFull(self): + """Test UsersFull""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.users_full.UsersFull() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_users_full_teams.py b/vendor/elabapi-python/test/test_users_full_teams.py new file mode 100644 index 0000000..3046d5f --- /dev/null +++ b/vendor/elabapi-python/test/test_users_full_teams.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.users_full_teams import UsersFullTeams # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestUsersFullTeams(unittest.TestCase): + """UsersFullTeams unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testUsersFullTeams(self): + """Test UsersFullTeams""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.users_full_teams.UsersFullTeams() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/vendor/elabapi-python/test/test_users_id_body.py b/vendor/elabapi-python/test/test_users_id_body.py new file mode 100644 index 0000000..0434fdb --- /dev/null +++ b/vendor/elabapi-python/test/test_users_id_body.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +""" + eLabFTW REST API v2 Documentation + + This document describes all available endpoints and methods for eLabFTW's API version 2. # noqa: E501 + + OpenAPI spec version: 2.0.0 + + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import unittest + +import elabapi_python +from elabapi_python.models.users_id_body import UsersIdBody # noqa: E501 +from elabapi_python.rest import ApiException + + +class TestUsersIdBody(unittest.TestCase): + """UsersIdBody unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testUsersIdBody(self): + """Test UsersIdBody""" + # FIXME: construct object with mandatory attributes with example values + # model = elabapi_python.models.users_id_body.UsersIdBody() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main()

u<(Xom2>>gpK~QY;%qbLE?R8m!iAj$f;eqaXMqLQUZ7|KEU^Bu1^TP#Pt)?6>cm|LO&>6d0`w!;MSu02 zI}cJaV<&BYbU>Z^ew}mfch0?6&w@doz}Nfh@4xeNfsijSVSQdR^6al5@*znPN>YxL z^R(lXlR5>AyH2~Pi-m6LW+6v87J8_Mg-x`Hgil=^ow2^L-;@U~dGa1h6M+mvwGRQe{w(f%tlWT0Mzb!gJq+XuS@wsn zAG~_7?BD#TWAm*;A0N8iywowYcdTXS7?r<2?C)a&B>lh0+K9S3o|LC9?VI#9Yy%d=ZsUV-yme`Ql5g0?S6?T^1N8Y*exQL= z0BA531R6?(Xm}Q|1DFUFj4fldJD+?yP z3kc~}DHxX`Rc5G^kMn#|p8lqGfge%80BM4p$!cs6V-9(#01A_vkMoVO<)1t^ z*pPD8?}HtP%a%w9OX2=vAFFAje+sNf&PE`XvayA=YqHv1v_+l7jj-ke*T7xdk;%}S zVo0VqWce$5@w}p!ChR5Ug;_Hv2*+V7LNsR|OCiM7Qiy3r$_MT2xutkWh3zurpuI-c z3vM#@v6Q`PmTI=jE)H0+7W52OlpxJuj+i4lIG115+rbWeR=>Qo!jP7)V%+5evf%F&mf8<{Zw0GnEAZNCSh| zOw+}Zm{v*!O>YHnqaXuEm4aAQl$@BC-c_>;;O;>Ecjxtusx&Q&=~;=YxEjViAb=!y z9J*VTbJO)Un0YE2R^gZJr^G=b>VE>cLaH9pvUkya&9@@-F1jChJF8yO)(#ngl`a7@ zI#zlIFx;}jvV&Hzp$#he9}Nsw2KL_{*ncl^YH8r~qWil4s{dZJx9sh+i|)pj21e>j zRyra1z}vpk7sIf7rKcZ5VWnd;hHWb?I03%O6U?|4w(~c3LNc_{wh4mZ%H|%dz3F*~ z47^t9KXSkS$Ws3sfA{Tj|0w47!pb(VepX`J7u~juzAZ0Rwp=N@qQS6vO<-9T{vtD>JKQ5eu z7W8sfg|^rXhiKGjb$2j{1e3ooC*?{q+9Yd|O#KAhUvWNxURwgE!o#tlLtLd3qPd+} z19}qpP_IOXAgym))c{Zgae>vJ#p(!uphr;>iB`f}%Hb{dyjxy$)zEk_R)>IoNZyLn zT-3%csD+Ty->!0eZ6gHzncu6NSb$I4kil5Csj}J=l0+wW%?CAYV^J%z42?i8+UBB> z;bL>L4a1A=o5_hWLP}t6i#-#rq-_{#H5<>gHa?W2KfLC%xR!yQ&+Z1(;Y!-ZqE@wW z+gjge&lBP&0-15t9XV_>Q|qT@sDQ^dw;K2U|CGlKcv#~@V;OvH9yidmTHiGu!)fCz z@N_H|q@WXo?gOIxM*#v(7}km65nB(y(PEStF%1k>#M*{-j!Olb>B~YP{N+{p8aCnq zO{`uHU`Eh@A2Ux6rkEWxlXu+o6jtIGp6Cvdb)w>)!*jK9YCue&=YVMNr-lJT+3xRx zGj98`KV0#5!tc34}3Qq%aIM0$d+wVhN?><6u=~@I%AS+uJtrRoPQ7yEgXQjn4 z0Kfm4ojEyzUIt*bq?Oc0@XovtvwTn(rzKf{6UC^MQ^6*gNIwP6144bvTBv7@UjX^T zAVh;D{ul^Tv$oD_0f3R~2d^Lem&SPT zQTT)K&zgQ7{AuuEB>uz&dmUW8ox83buLQcwf$rY~hMs##*Oo?5Vm1x`H2g5KqhZtk z&F1}4&HutnWH@eshgQook01ch!sRU7Lr=*@AMefdj@4U#Rg2G1Hl~NSo_TmZ<#5kEZ_kS$fIb%U@V*O? z)gbUSwh6RZ`&nDF-hZ2MfVIp*O}I0r??7niq|Y{tGzFPZ2kjWenbhCiQCu&*1mxFP z(gOr^ZaoqD;2iNt=&uMn?+eT#jh1(fE(yo++|c=wrT!cA@Kxsq%T18rMgSa%dV2t^ z@T=X}3RuIwdofCpHoWJxZ!rtb38y{E5F4cd+PtC<*M!UN1CVXPbyIs9x z!r4pUX2G>^8wnRQ%Nl?DANKQ z=ugXVRh6K!R-y%?il$tGO#s@B#cT+;RD*p1_nOA_JFhzg6#E`v4BZ7pcfm2Af|rXI z)XZ_=YvbrHyi@QP6I=~FdMmWEZxwJI)|Erw>aFk<)&2oSRKE`dlqW#Io$>d=k9ik; z)@ z(cgw!KJOm*MbEv~_`OJcrM3MAU-gqf_(d>s!>DYN=@7yDyaL?lB_Y1{vt*hvw6B3~ zSv90lu))|b`@X^P$ZAp-rktRLU!lubl5*{LB<)+bTEp5sAgsp$CvI*b&9n_|ivX`Z z*)(3U)@g$bP4W?*fdmHgaQ+GbdITVJ@DvJRHfPwBCDZyzo>3&>-;11 ztG)#Ubd4wLnin}Vj)$%vx;b*|?5(qpq8%Td`QS_?I#iAhEt_vByUQK%Poux;{H(Lw zak%OtE%7RGwuJsYwC-y9#_&?8yULN^dN7)imPO+!V%427-rh1D!###NmU5)_~PXCIQ$m0^BnqhDtf1o}mb{%umDX(zSA+GQKf0Vb#@HP|veB zQXw^RS{Px+lq9Q|;LoKJ!Vl%b-21#)p(jos z*Zs@|u`0%@8;ECJg=;NytxudC+%X3hwN+WPnqc)k+$OU=#HtbE@&C!>A5K1THgmf$ ze|;5W)orYlwn=HkRYdjI-1q~fRauo>z13NS6KDdI3`6KXk0@F1G#X zId^7Ail#S78}vdtb06oPd(OS*o_o)^d|XxKAdotLa^a<49w6jXEa=IsWgZiTkhcg& zB*HPAVVXH(kPIy5jnhWSNWUh@M89UqOurV%LcdnYO20PAM!$B+4qwx>wvKIU>at1)1gJahAW#$Kw2ATwnz;noPvR z6x54Rc2!8NB%(6Al#p0$h%Q;BFGwPq->A_k?)pg#$TR>A`Isgti4 z!&(t&rUJ>UiY*+DiLq2TtkjiGUqG+k3&YBO0I!l9+xd~LHCOMueeu@Cb<^w4(rj(x z?WtQ+>!xqpAEWG%!puPd^K|9|ka>%QND#i|snQB`f|9NE1%*^v5@9p2(O3lc5ieb3 z6H9DrMF3q=r;uF{_$a7(z;BSyW+_&!!p}(6P?nJgR`OtzV;Odoimo*55W3i~5Bt;t zc$GYG*JRzD8Fy#a-J5auZrXaK8fch_6c!drs2o(pvyk~JA_jFk3jOr-qIXDBD>?ye zaRQcOu(;(y2mD4Vvs4EJ6e9=$6)3b~68Tj@u||a@J{?cV$RJn>br$ReVU_yIlh6<7 z@@@c6%t6*YkZ}*ZSG(mN-L#F;>F}GRDnON72%HFT86>cp1hyt<8L|Re<_L#Z6VY@W z^R96CQksuzE$(o5DJIFOcuW+;L^v$%LIU*&(Do~J;V^EKSR~A+QeZa0?8xEpJwk`4 zGD)}rDd>QV>;>>G@|nqGZu`t-F!%k&W-uRTRCL6Qz<(j>`}pxqs46o%RcLa+)R@}f zNPtTA<{~41Ocv9!?e-S&#kr)a zWrKg0;=wfG-&O}i0^n}w+mGBQi8c;%}(mw0fuz8r?1zl=V$-0TA zSx*T@1?wi7U<{i+eDPZt15~0ihG?FxTR;t=DTrEAmiCY#twuBt5YYm3P^Zh%qMMFT zp(O-Yj4r?q86%)R&>Q!DSz1*2tI#4EXAPV|G(taAqq0>#JB>VO-7_u!bxX%pnHOm4eL6r98AfN$Y>h17`|YDvjp1%)rSn z%Yu{&uO#FY?%#)~hkmPK7t^cZWFirl73(VhvK(6z6ng|Q;nbHETZ9i|N!BWtVsSyS zT@LUULfU$G(=v89+|zOo`nf`luoG(-}j2wMw|7%D?p zm%vQ0@ytFLKR^Sp0I40HLp@~$Q%1uMz@ID01@@_c#UL|=CaW!R~9q@O* zu{qo5&oug9oBCyA^V?P5sal`PTWE7<*4deB=*%_@WEuuuJH2fojk|AOf8+X_f3$x3 zLF?{Kn=j{V%sRU>_&1mv9Lo-#%M6~|bhT~n9>}=%KX7_q8_l^}vhKkQ{vFTxy0X5} zjBoUo^?|SXrd1oKE$eK%&vs?m!4KKNJh8V|=X{;H#@#tzN3N-zcG{ou?awtmlWpqH zH1*S(zKpN$ksEM9mYThfc0q1^;uo&g?RwJQon;Sx$R5lS+ZT~~R0SycYNX(X9Hl_d zgb1EhdP37gP3c`YpQ$M=z0hb_1p~!|7>;=sYNKFK8;HP!ECmw*+c;z{l)ywUAYGa` zL(!86S&lI}7E)meHF~BBwQvI#?ID|v&Hp*jEZibOwuOSB{=KFdbg5{72bo!Cv9wSy z$Abp_CQ=v;E*T32(^JW)?ja!?XBuWi`|Rirz6u8I37W9g7x3~zQ^=;z3TGa9kr2N5 zOO0s3DS(l!_~mTF2GP#hL#Ah8-FT?t93c~D#{;1aOfKid)jGxSaFYue3$np>3K=-p zLIX6?6f)|(p!w;8<3cnn6pVN!!wtr^3P(aNN-!&Uuey&}7=0MHtQH+1^CBE13k5?S zWGO2<0L*d03xyt}lD`|=yQ2#&yyy)%Le>z>3+EoTh|bx+(s|`PbgtpL_m!wwxLq1O z@30l<{aJxt4W+jS=)r8*zbe(*9aO_5dSqUBMwjaeJz`-r^Z#i+dbm2#wSfK(O`Ij< z;_8PDu%o}q92+(68*q+6->ii-hVyJeHyb46)U``=E}*TZDF}K{p17uvGdNOSONc%L z5O47T#?dD+WWzDT2=wH^Dsau1i-HZBWmr;_GUVi1h8d92*-6?V3e3jP(>|oVc)lxAE)5;Hkah($+ zh?T6;I0JaOa=_sjN%9iEs)bV2kcZx^Rq7~k#Fw>0jox@EEl5|xl$Jcg(h^HcLJE9O zHYQS^w4{UPW|mRZYIUlMi713&Fe(DvvM)gZfW@j_8u7WnCzJ75gkBf=vF(E1EeThz z0xx=RtSn)v*Fi4}Wnc%*m;0_Zg4$5>a3& zoRoxkf{%vbmXm@|&j=e^Vo&mMS?JYgh6a32&(F^VbYQ)gNXd7B?@Yg@8Vzct^!G2&ZDJ z0*o-iY8h4*QYjn(V{j>q;c1uwc4~=Dh{DrHg!}NKAhB?Pyc~-P(Ox!|qN1`OQ7Vz* z<2tFQlhBxeu~KY=7a>?EC$KvY3muc#?o>J%7yJ+rc{+*i;?1^~&YNEs4R!}y+l{9t z=M~fG$*~E=GBJ5}a(+@V&CPQ2ig7M9ubAh?=EqMf*4erFso5EBZ5Y+FsAb5Mm`EW@ zX<1tzwnRINm;nqBnyJ_i;f@1gJpd2!W(C16tHvY7yZGpuYh2Z#zWJ+3Va-#%4g6;5 zBvLqq;533M1d{+1W>hiZR#`J#yAJU-6SAwg%XCw*YV%6NCTs1b1614-C;eu{vJ?~I zQCab*`y^c03{ntB=MdmUX04{sQrsrC1^* z0vrMwS(XFrTpYrN0vlNoA{RkD`4oFKk(P=W>?)s%to(j*u!-WpQk2!UE}MdB$7mXy z7HU)nB0Te$FO$@IZQ#1&+WzZnyY%fxt=9;x*$=j5E`ar+>F%PA8Ls zq&U98$J4^3BqbmplVc(Tc*KYRo?Pr@P`y7ms2Cv(u9)HpaaqFSPqEIcTNAVhwO%oT z#gfqXR1A^;aa4hqA}fkx>eS3^aB_T%o0R6T(Hu>$CS?iFN5!hmIgFB$6xUcXHu-Wy zNUHvrpl88X<+!sdYZkP0Jn(^YBH_i12ALE~Jb__ype`(?m(}=^V1-EZHfFr`&=$sq0at`tlNZ49$mcjzdVG zx$7?fzA@uFx>0??wlJ``)&@ zyE5K=o34Ei+@5vYZ?~I?ry=WZ&$!#O?w*Xh=P@zZhjQMQthXcM?RaP6?ym2j%61NB zItPCkdB6Rym$tme*2jU&2LGNh;~m^|4gOc&3|)RF=7WZGr?XO|iB5x7Pd5(W&=nb)4Gz(v5LtSoU59DoQQ#{b{} zYuExIedCNY4p{e0su_?WFQpJ%!dgbcy?W0=ZHSb_dOT8Sqg23^kr8!|s~a3CDz#5+ za5&ii16pMCKxiEQ#w)MAa%XbmV6JmtuJ0KB`G;VcJT0(Hp2Gm_ht+V%*Cgo#3@lwk z@Ct(K0G{9-an$#x(g=3|?<2oL{GH67+!+5t=55eTPiT_qGGX+PzRf&+nJ`dm0q@NW zOJ!4+3hx!L8pSn`prW`C)QVHt?%66X8AV4^U+g0zd%A&Emk&p&V4t-s*JscwBm2cA zoZ66a7W_lG?t|Jww(reX(S@{ly7I(g?@|{MB0Ysvh-;x6_l0v|hPg1oOjy;Kz{?ff zyNWYW(8l5WJ#i#c+`WUxE1Jt|de*?C>4?t1+(;E>@dR2!(bSD+v zjG~)$(Z5DDI0@rRe~f_Y@t+`1Pc9>3RnTO-OPfLK%GOZR_)a)+PYHd>+RB`29POz!xE-a5%lF}cxky?Bb5W^!YbzrnsL zgUDM1{tL;V7L9~i0m1z!v=`Xxv&Kv6aUK(nf<3F?_rSL)vs9)_Ml z&BytAm3-o?g;$rXuP5W{S)X`)dS{`r{q5@Sz$3})Q@Q5OY;%96xqqv9|N6wY&pz<6 zh>W1IMMc<+_3D`e^a}~OqRUndweU+ZrqVSDE>9H~r_zEHqJkKeExo2_Lw0Ll9$Ynu z^&6ftUWJ}|e3C}`k-DuQMIlp0-S`yh6?&FYXW&#dt#yp2 zLeGui8^aXuNVat}(>nTr>F4&J*|%EHWL#&~pMT(P*|fD#m4huo_XrgSAF!y1aMzxh z0gFPN_DXj64aD4opaVhC$gW@!0ooxM38Im8nAy)8o#s{*5u5!D3d{=prceEG%TgMm zlGN8`bbU(f9~0-tr21pbI6fuSpAyHvk>0$?$c!-`o4k1k zaqP<4eIMF=caCh?J72YITdJAk%*_M0hi?sU6U=Y#Sv4|UH!p7!{BB>cHZiR?hd(Fq u`ECB3jo4}+&H&{8)d3#==$7O7rs+8HF~V;wBZ=L0^U5w=mxA%*}3V{D=sFks24RBkqlH8LBdT~+VO#1D{1 z$V22E@+7X>+~g{EsiJb1i%j>9ti?47E+77x`MP^%)ZODx*=(AruchCA{OPt*f8wC^ zbw!I$|0Wpwm6cd2AsA0UVh;5cafNq57wIl>m3Koo>8s)z?|~lD-6F|TkRp9eq27$My&M)??wkS?`^0rV z36rFAVv0}0H0gdZ!)IZZ^njS-^Ds|(P%Q98SR_3pmiRI(lO7f;d=*wnkBA#Q4|&p~ z;wE2%HPT~Zoo~Pf>2Yz37ob3TLVU$HVUzTAahugomVO#UuV09+RFE+x!VUAw4gi@*UVAy&#_PUDzePD4z2@*dx6p_W28V zL3&wy%ZpGXy&^alAV{x@m;4pHB7H*~@YnE~bY8sSZ{aQJo8pj{pftx$*7ECrVJhSk z=Q;bG@70=tw48dwgFsECcN&h6XTJKQMww?|yA{Vh(ZgM@UYBm5S9{g4;Wgcg9;bFa zx9Vs%s|JDXxDxd0&~DQYy!yT)YZbp8BK5q~u#aUFAhmbecHg)6b3=j?3pgH|*|h_C z;(;Tz`{CGHDX@d4o*#?Nmu0@ZQZoL-1U=|AuSr|KNrf#bP4a{5rljyie~{qijiUaZ9Lu=h}&I)2+*vJ}YH#pFtX z2lk0Pa-G&q_Ox#>Q=q;AnF=YbB2hDipqwt9>k`N7*-Q8No3~Dj4m?bQpn{^9Mzsx zrQ&NJSG^JJe8#|6EFY_qoMt+0P*SlH(~Hc4!I5m&Fo9VFH@*O>)YY|3HhpMgI#t}c zsyS8j#OIJ-|3VB^l~FGslYTTYU4#mOErOr{gq93`tGaVofodIu4k9{fKpoXah!{d* zu@j-21Chf>ni3>x+Qf`>jHmh%5u-?$^54vhX;VvqR)eN(%p+#{6n*U5ge)LpI=OnIv7K8@ z?B|3oB5KOzi)>%&w5>pO_jXY%BWCJih()gg1zbVSw0-2FJ*^^Q%H}}7A>`-=Ql`so zUOX*U`%3ain?B)Y^yHAsn+Tc8wyEA7D^9KV;vDvbKqpZUM2Uw?Nc5{Zzl{F7#ht&m0E4?=b)WDi4D4B1`Mk3)7CG9I!wA-fl{ zry(nZY@3#pP*$5EJ0|{B$ad&kVFw}G51I0&RwI-9!piCR+3_8)8$zE?Z>54coH AA^-pY literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/api_keys_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/api_keys_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52475834e3de76d1a43b0f042779208c2a8ad8bf GIT binary patch literal 9573 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/branding_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/branding_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4306d7644a9b895b4cfaa8f2a0825763523029e GIT binary patch literal 8491 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 B#MS@+ literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/comments_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/comments_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8173ceb6ede19b49d46884fa724a86fc95e775c GIT binary patch literal 18616 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/compounds_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/compounds_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f509f442268b4ccbb30ee8c24a8c7b18f85c87f GIT binary patch literal 13271 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/config_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/config_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad518d34a56d6cfdba6f21c36a3f6f2b0841e891 GIT binary patch literal 8804 zcmeHN&2!tv6$khMksv9`qNxvBvNw`#iH=1|mgS^$EXN;`9XnA{fowIgXHbY-QnW~b zS%9*YOLFLR^})-rFC3%dJ3wXW%&a=U-fF8)BF*X`y2-bd2X;FJYMuK`r4l zTC&|;rXU9gRQl_4w`-XXAH zXa^YCFSsJiHI}%kc?lV^lr z{n5ww7c3EY9xMc>GMdY6of#dQF{Z>j;QjOo~l|(_UerU>+0pS!U-t3bngA zW{sVRg2|xP;NcC4Y17(Khv8CjAxo&^t5h{Y#$3E8Yw?VvN%89nSyW3>8pknsSysC) zE-85^ErGWw#Jma0MoP=zZF03J+C`{|r%h9fa2YEt8y->2%Xv){jn3LTh*j_Hr$g8a z;$24fg)6@PFM0?5uy5s(9y$1%;1=9x(zW?Ofd-@xep|l;0RhRTARHlT!6LJb?cfeQ z1m}c(ci6hYNS)A@nQgSKT?66j8U;P)*%R!+@6bkeq#OsCs9P$*BWAIR?RRg^9f2QZ za8@c8G_)iY$`H6sVP`s?6|kr%Ez-zF>av_(Ad0M%Rdg|#d;<~u7If7h_^R4sD5;q3 zA>etbRfnUfRKSvoQHeUX*-Qjor;?`#p{s1 ztZsQZtE@Q*^(cc|ye^TPYPhH_l?EG(oA_x}U|WBqyY9x@Dh8pgdI`k4%w~i+I=aHG z2Zt)2Vcoaq{lv}0>f(lPpyC_QL){yp<99>HE1}6xmq4uhC+~-QH^L|GhEG(&FMrkr zVkHU9RxXnusM{6+;J;P`oCP1g#l#uvhdcT{TlIa!v}oaYY>Qg_wAA6M>$pOVW*)VC zfJr$8Hx25lmJoBXk73F%x6;(y*^>}jQafZiZ?%uWrCcMRsoEa1 zb3)2RGr((*N_-5A6Eu36QAXzA*9P|Sz}X9D9?m|YP4+|l)6Ca&%m$inKvD3-YgSCb zx6IB&)T`Z_P$#5cM5?C zJF~TDQF~h{PH6v05b{@0dgn)#znY@^*+^%EMm3=>VRVQkf(we2q4`(?Yy@}g>?dmZ zB38;8F#*i!3jjGJ8I@&x1E3qlXp49m)^13tBxgcNG;~NEqDzsTbhl-znQuF!QmK$n zn}9QZO;u!rJCjc1l4iIyWf9BYw%IGW!JVIabt*ZPT;mPbypmZqd?iKIL^J)XhC7=t zVATk~Dp68o6^q((2^#?bQwt(2i&|dJsr4BWh;N4U)46u06<7k&6!40GS&NdUu6Yd( zh6PB&;0g*X5vt)-^EV7{Uc&@_Mb+>oLH!gV3NZnUu@|rmC=nN6MZ-jttSNZt@B0S{F2j zEG|hzv~1#|*0O5}#ULtVGrF)e9OfEB!t}9+TdXWiPW=K^l!CB@g{F_`>RI7+Pv?fG zx8mu&{ru;i!?n_SGkMyks?{`I@V&L#6@sHyh1Jjj(X+3aY z-H*1M?BKvkV0EG5IRL67&)xPyw_xb~cW%D30ZVCcNcV?VZ|MGR-QT18d-Xkide5NV z`J5ivuSbUTuD;)0`{3H0efPRX^ug#SiH{TOvFUq*7xezYkKX+7&Gq5LXXo$rpQ#t` z^`F!ajBWNa9mAVUd&f8k@A$v3xj#hIdDYC?fZ^yDiUr+%zz`Eq*ptVXR=OisPc;|q1fDDq z_|on{U_JTF5X!!g15_X?o&#YxFH9v3&YDk>&~I9DgoNSZ zl2(ZM52-S4S5#Tscc99+M^I%R*$)J}^CY}22_6i@8cUzQD+0~CjX>i~s(xqsZ71q% zdvBjfzxf|QzwJb-1%&o(^jpxxQWVlR9YW0ufIQo&zUBih>Rm!d1D4uJL(Kz#e%oVW zsZQz6Gn@^Z^1&0pQ$Nh)NDhLpv_@f*yGLP->97HZz3qpLNm;)UN^&)zGWQ#2lIJdx z^Dqtzltp>+JRQ_gDn_V?Q4yztvfE@7gb~@!jioK+CP7EWXe;_n`)Fu)f$BN5b0Tkg z|9^v~>P_%x;HCC6-TkX`-w!ht(?`cCygUA6;2rGOtp4ntZ=W7Pce*}|tz3RQRTUli zQ*bS~F+5uto~?0NQOae>70;p8T-NpP0}w`8%OmI}3hac#eyl7NG3>|kqF7Wi@? z79~xCe=WeSzY0BRLNvKGi}0k|L4*p*W~ z*4{X$%wGcr+0@oFOvCe%Wui$k2dcog8I|(5n@*NxA8;Pl^>8o44t>dZw>XCN{ey{r R!~N97j<0eL8G1G+{4af-lJNil literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/containers_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/containers_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a651894b32c1590a8a48a2d67d5b962899942f9e GIT binary patch literal 19647 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 QP~`cs2LmrT_O*}pFaJ{cZ2$lO literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/d_space_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/d_space_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fef5cf01ec65a5705e2bd5bc9f76b3d8b6f68e08 GIT binary patch literal 10290 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/events_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/events_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..602aa5612b65c679d215a9ea50a93bc8740f1dd5 GIT binary patch literal 15417 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/experiments_categories_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/experiments_categories_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f09a8a12374be2a912d96451b8b3e4b6abdeba27 GIT binary patch literal 16945 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 literal 0 HcmV?d00001 diff --git a/vendor/elabapi-python/elabapi_python/api/__pycache__/experiments_status_api.cpython-313.pyc b/vendor/elabapi-python/elabapi_python/api/__pycache__/experiments_status_api.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e0f99a235546a64be2fad1c5dcd749a376683c2 GIT binary patch literal 16890 zcmeHPU2GfIl^*_zB8R3#TECX;vHT;ckwpK>w$iAPWyyAID~^VAjkwKtM2;ld)C_ZH zXjdwV_GzIY=vKiZSanYnlFJ@@Tr4qy4?@g$tQ z&+rUkco*-!;CjtX+#H^JE_jHC{(6ZQe!Ulbulb3eW7?S>hWB+cy#GfH$32D}5}5P! zH!S^UP`W72OeTKFO;7L%ZtU`T?$#0RjFQSPNU|ns8AT2T6Z09BOPB9)X-Q3y%#5UR zVm8Z(x5P|VoXJX@B&TyqM%LiIoaPoJZC**M+^j;l@*{dx!@fjRFv}eo;y7*}Co6A@ zBizLCLx+RG*K?ALub}3n6nD$e8v(^bLx+OFvyv+3hp(Ih z43s%#)Q=(E<%`E}!O8o~j~L>Dig)uasAxA-aue_EWNx^K5385>c|XVoz5!%_4}fgs z8$ky7Ajl9O0?G0$$S@xUxr5&UGQvkl6MT$jedokaauUg4&8s|AeqM#Q`fD3Jdg+6y z*Ao*X9Q_ihtf;CSd=fFQDIAo}tQJn2m$-5@a9H$8Dtv?-QRaxaFcb`)QJ~T_PD*Dq zn!&KQAj*08po>GnX=!$=^&6Z@RjLYW49~HhJ^mhu_nD+C1?~Ep3oht!y!