diff --git a/.eslintignore b/.eslintignore index 6524a88895f..e85939183ee 100644 --- a/.eslintignore +++ b/.eslintignore @@ -25,7 +25,6 @@ storybook-static api/** update-server/** robot-server/** -notify-server/** shared-data/python/** hardware-testing/** diff --git a/.github/workflows/g-code-testing-lint-test.yaml b/.github/workflows/g-code-testing-lint-test.yaml index 6dd00712076..6c1c231ff61 100644 --- a/.github/workflows/g-code-testing-lint-test.yaml +++ b/.github/workflows/g-code-testing-lint-test.yaml @@ -1,5 +1,5 @@ # This workflow runs test and lint on branch pushes that touch the -# notify-server project or its dependencies +# g-code-testing project or its dependencies name: 'G-Code Testing Lint & Test' diff --git a/.github/workflows/notify-server-lint-test.yaml b/.github/workflows/notify-server-lint-test.yaml index 1f5b7c3fee1..e69de29bb2d 100644 --- a/.github/workflows/notify-server-lint-test.yaml +++ b/.github/workflows/notify-server-lint-test.yaml @@ -1,70 +0,0 @@ -# This workflow runs test and lint on branch pushes that touch the -# notify-server project or its dependencies - -name: 'Notify server lint/test' - -on: - # Most of the time, we run on pull requests, which lets us handle external PRs - push: - paths: - - 'Makefile' - - 'notify-server/**/*' - - '.github/workflows/notify-server-lint-test.yaml' - - 'api/**/*' - - 'hardware/**/*' - - 'scripts/**/*.mk' - - 'scripts/**/*.py' - - '.github/actions/python/**/*' - branches: - - 'edge' - - 'release' - - '*hotfix*' - tags-ignore: - - '*' - pull_request: - paths: - - 'Makefile' - - 'notify-server/**/*' - - 'api/**/*' - - 'hardware/**/*' - - 'scripts/**/*.mk' - - 'scripts/**/*.py' - - '.github/actions/python/**/*' - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}-${{ github.ref_name != 'edge' || github.run_id}}-${{ github.ref_type != 'tag' || github.run_id }} - cancel-in-progress: true - -defaults: - run: - shell: bash - -jobs: - lint-test: - name: 'notify server package linting and tests' - timeout-minutes: 20 - runs-on: 'ubuntu-22.04' - steps: - - uses: 'actions/checkout@v3' - with: - fetch-depth: 0 - - uses: 'actions/setup-node@v3' - with: - node-version: '16' - - uses: 'actions/setup-python@v4' - with: - python-version: '3.10' - - - uses: './.github/actions/python/setup' - with: - project: 'notify-server' - - name: Lint - run: make -C notify-server lint - - name: Test - run: make -C notify-server test-cov - - name: 'Upload coverage report' - uses: 'codecov/codecov-action@v3' - with: - files: ./notify-server/coverage.xml - flags: notify-server diff --git a/.github/workflows/robot-server-lint-test.yaml b/.github/workflows/robot-server-lint-test.yaml index ed41189bbca..b82d769ffc6 100644 --- a/.github/workflows/robot-server-lint-test.yaml +++ b/.github/workflows/robot-server-lint-test.yaml @@ -14,7 +14,6 @@ on: - 'server-utils/**/*' - '!shared-data/js/**/*' - 'robot-server/**/*' - - 'notify-server/**/*' - 'scripts/**/*.mk' - 'scripts/**/*.py' - '.github/workflows/robot-server-lint-test.yaml' @@ -34,7 +33,6 @@ on: - 'server-utils/**/*' - '!shared-data/js/**/*' - 'robot-server/**/*' - - 'notify-server/**/*' - 'scripts/**/*.mk' - 'scripts/**/*.py' - '.github/workflows/robot-server-lint-test.yaml' diff --git a/.gitignore b/.gitignore index 084de769a00..bbd1d9bbf80 100755 --- a/.gitignore +++ b/.gitignore @@ -126,7 +126,6 @@ calibrations/ api/pyproject.toml robot-server/pyproject.toml update-server/pyproject.toml -notify-server/pyproject.toml shared-data/python/pyproject.toml hardware/pyproject.toml @@ -135,7 +134,6 @@ hardware/pyproject.toml # file api/LICENSE update-server/LICENSE -notify-server/LICENSE shared-data/python/LICENSE shared-data/LICENSE robot-server/LICENSE diff --git a/Config.in b/Config.in index d477c20edab..6c607c38e30 100644 --- a/Config.in +++ b/Config.in @@ -3,7 +3,6 @@ source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/api/Config.in" source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/update-server/Config.in" source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/robot-server/Config.in" source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/shared-data/python/Config.in" -source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/notify-server/Config.in" source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/system-server/Config.in" source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/server-utils/Config.in" -source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/hardware/Config.in" \ No newline at end of file +source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/hardware/Config.in" diff --git a/Dockerfile b/Dockerfile index 60bd111736c..213b2420a6f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,16 +14,11 @@ COPY api/setup.py api/setup.py COPY api/pypi-readme.rst api/pypi-readme.rst COPY api/src/opentrons api/src/opentrons -COPY notify-server/setup.py notify-server/setup.py -COPY notify-server/README.rst notify-server/README.rst -COPY notify-server/notify_server notify-server/notify_server - COPY robot-server/setup.py robot-server/setup.py COPY robot-server/robot_server robot-server/robot_server RUN cd shared-data/python && python3 setup.py bdist_wheel -d /dist/ RUN cd api && python3 setup.py bdist_wheel -d /dist/ -RUN cd notify-server && python3 setup.py bdist_wheel -d /dist/ RUN cd robot-server && python3 setup.py bdist_wheel -d /dist/ FROM base diff --git a/Makefile b/Makefile index ed86d48cca9..03c88d4ad68 100755 --- a/Makefile +++ b/Makefile @@ -13,7 +13,6 @@ COMPONENTS_DIR := components DISCOVERY_CLIENT_DIR := discovery-client G_CODE_TESTING_DIR := g-code-testing LABWARE_LIBRARY_DIR := labware-library -NOTIFY_SERVER_DIR := notify-server PROTOCOL_DESIGNER_DIR := protocol-designer SHARED_DATA_DIR := shared-data UPDATE_SERVER_DIR := update-server @@ -26,7 +25,7 @@ HARDWARE_DIR := hardware USB_BRIDGE_DIR := usb-bridge NODE_USB_BRIDGE_CLIENT_DIR := usb-bridge/node-client -PYTHON_DIRS := $(API_DIR) $(UPDATE_SERVER_DIR) $(NOTIFY_SERVER_DIR) $(ROBOT_SERVER_DIR) $(SERVER_UTILS_DIR) $(SHARED_DATA_DIR)/python $(G_CODE_TESTING_DIR) $(HARDWARE_DIR) $(USB_BRIDGE_DIR) +PYTHON_DIRS := $(API_DIR) $(UPDATE_SERVER_DIR) $(ROBOT_SERVER_DIR) $(SERVER_UTILS_DIR) $(SHARED_DATA_DIR)/python $(G_CODE_TESTING_DIR) $(HARDWARE_DIR) $(USB_BRIDGE_DIR) # This may be set as an environment variable (and is by CI tasks that upload # to test pypi) to add a .dev extension to the python package versions. If @@ -140,8 +139,6 @@ push: sleep 1 $(MAKE) -C $(SERVER_UTILS_DIR) push sleep 1 - $(MAKE) -C $(NOTIFY_SERVER_DIR) push - sleep 1 $(MAKE) -C $(SYSTEM_SERVER_DIR) push sleep 1 $(MAKE) -C $(ROBOT_SERVER_DIR) push @@ -156,7 +153,6 @@ push-ot3: $(MAKE) -C $(HARDWARE_DIR) push-no-restart-ot3 $(MAKE) -C $(API_DIR) push-no-restart-ot3 $(MAKE) -C $(SERVER_UTILS_DIR) push-ot3 - $(MAKE) -C $(NOTIFY_SERVER_DIR) push-ot3 $(MAKE) -C $(ROBOT_SERVER_DIR) push-ot3 $(MAKE) -C $(SYSTEM_SERVER_DIR) push-ot3 $(MAKE) -C $(UPDATE_SERVER_DIR) push-ot3 @@ -193,7 +189,6 @@ test-py: test-py-windows $(MAKE) -C $(UPDATE_SERVER_DIR) test $(MAKE) -C $(ROBOT_SERVER_DIR) test $(MAKE) -C $(SERVER_UTILS_DIR) test - $(MAKE) -C $(NOTIFY_SERVER_DIR) test $(MAKE) -C $(G_CODE_TESTING_DIR) test $(MAKE) -C $(USB_BRIDGE_DIR) test diff --git a/api/release-notes.md b/api/release-notes.md index 378558b4124..3a580da4fba 100644 --- a/api/release-notes.md +++ b/api/release-notes.md @@ -11,6 +11,11 @@ log][]. For a list of currently known issues, please see the [Opentrons issue tr ### HTTP API - In the `/runs/commands`, `/maintenance_runs/commands`, and `/protocols` endpoints, the `dispense` command will now return an error if you try to dispense more than you've aspirated, instead of silently clamping. +- The `/notifications/subscribe` WebSocket endpoint has been removed. See https://github.com/Opentrons/opentrons/pull/14280 for details. + +### Other Changes + +- The `notify_server` Python package has been removed. See https://github.com/Opentrons/opentrons/pull/14280 for details. --- diff --git a/external.mk b/external.mk index 1faab2133d6..1bbeb17a781 100644 --- a/external.mk +++ b/external.mk @@ -3,7 +3,6 @@ include $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)/api/buildroot.mk include $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)/update-server/buildroot.mk include $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)/robot-server/buildroot.mk include $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)/shared-data/python/buildroot.mk -include $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)/notify-server/buildroot.mk include $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)/system-server/buildroot.mk include $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)/server-utils/buildroot.mk include $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)/hardware/buildroot.mk diff --git a/g-code-testing/Pipfile b/g-code-testing/Pipfile index 026ca783dd5..2e6b4a1720b 100644 --- a/g-code-testing/Pipfile +++ b/g-code-testing/Pipfile @@ -5,7 +5,6 @@ name = "pypi" [packages] opentrons = { editable = true, path = "./../api" } -notify-server = { editable = true, path = "./../notify-server" } robot-server = { editable = true, path = "./../robot-server" } server-utils = { editable = true, path = "./../server-utils" } opentrons-shared-data = { editable = true, path = "../shared-data/python" } diff --git a/g-code-testing/Pipfile.lock b/g-code-testing/Pipfile.lock index 805f05c5385..c2277bd2000 100644 --- a/g-code-testing/Pipfile.lock +++ b/g-code-testing/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "791f7b071facb00499fae66b09d598083b98076e85ec26f7c1484d1130e700f9" + "sha256": "7154f080cb358736d8d99282591f1d23e5614eeae4e3c2a076f0b0b0dd6dff60" }, "pipfile-spec": 6, "requires": { @@ -50,11 +50,11 @@ }, "attrs": { "hashes": [ - "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" + "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], "markers": "python_version >= '3.7'", - "version": "==23.1.0" + "version": "==23.2.0" }, "click": { "hashes": [ @@ -76,69 +76,6 @@ "editable": true, "path": "." }, - "greenlet": { - "hashes": [ - "sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174", - "sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd", - "sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa", - "sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a", - "sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec", - "sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565", - "sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d", - "sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c", - "sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234", - "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d", - "sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546", - "sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2", - "sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74", - "sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de", - "sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd", - "sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9", - "sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3", - "sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846", - "sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2", - "sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353", - "sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8", - "sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166", - "sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206", - "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b", - "sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d", - "sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe", - "sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997", - "sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445", - "sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0", - "sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96", - "sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884", - "sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6", - "sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1", - "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619", - "sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94", - "sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4", - "sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1", - "sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63", - "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd", - "sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a", - "sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376", - "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57", - "sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16", - "sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e", - "sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc", - "sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a", - "sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c", - "sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5", - "sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a", - "sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72", - "sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9", - "sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9", - "sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e", - "sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8", - "sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65", - "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064", - "sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36" - ], - "markers": "python_version >= '3' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", - "version": "==3.0.1" - }, "h11": { "hashes": [ "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", @@ -162,54 +99,51 @@ ], "version": "==3.0.2" }, - "notify-server": { - "editable": true, - "path": "./../notify-server" - }, "numpy": { "hashes": [ - "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a", - "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6", - "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2", - "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79", - "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9", - "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919", - "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d", - "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060", - "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75", - "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f", - "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe", - "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167", - "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef", - "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75", - "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3", - "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7", - "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7", - "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d", - "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b", - "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186", - "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0", - "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1", - "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6", - "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e", - "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523", - "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36", - "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841", - "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818", - "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00", - "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80", - "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440", - "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210", - "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8", - "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea", - "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec", - "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841" + "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd", + "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b", + "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e", + "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f", + "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f", + "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178", + "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3", + "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4", + "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e", + "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0", + "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00", + "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419", + "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4", + "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6", + "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166", + "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b", + "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3", + "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf", + "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2", + "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2", + "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36", + "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03", + "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce", + "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6", + "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13", + "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5", + "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e", + "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485", + "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137", + "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374", + "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58", + "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b", + "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb", + "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b", + "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda", + "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511" ], "markers": "python_version >= '3.9'", - "version": "==1.26.2" + "version": "==1.26.3" }, "opentrons": { "editable": true, + "markers": "python_version >= '3.7'", "path": "./../api" }, "opentrons-hardware": { @@ -221,6 +155,12 @@ "markers": "python_version >= '3.7'", "path": "../shared-data/python" }, + "paho-mqtt": { + "hashes": [ + "sha256:2a8291c81623aec00372b5a85558a372c747cbca8e9934dfe218638b8eefc26f" + ], + "version": "==1.6.1" + }, "pydantic": { "hashes": [ "sha256:1061c6ee6204f4f5a27133126854948e3b3d51fcc16ead2e5d04378c199b2f44", @@ -322,44 +262,6 @@ ], "version": "==0.0.5" }, - "pyzmq": { - "hashes": [ - "sha256:00dca814469436455399660247d74045172955459c0bd49b54a540ce4d652185", - "sha256:046b92e860914e39612e84fa760fc3f16054d268c11e0e25dcb011fb1bc6a075", - "sha256:09d24a80ccb8cbda1af6ed8eb26b005b6743e58e9290566d2a6841f4e31fa8e0", - "sha256:0a422fc290d03958899743db091f8154958410fc76ce7ee0ceb66150f72c2c97", - "sha256:18189fc59ff5bf46b7ccf5a65c1963326dbfc85a2bc73e9f4a90a40322b992c8", - "sha256:276ad604bffd70992a386a84bea34883e696a6b22e7378053e5d3227321d9702", - "sha256:296540a065c8c21b26d63e3cea2d1d57902373b16e4256afe46422691903a438", - "sha256:29d51279060d0a70f551663bc592418bcad7f4be4eea7b324f6dd81de05cb4c1", - "sha256:36ab114021c0cab1a423fe6689355e8f813979f2c750968833b318c1fa10a0fd", - "sha256:3fa6debf4bf9412e59353defad1f8035a1e68b66095a94ead8f7a61ae90b2675", - "sha256:5120c64646e75f6db20cc16b9a94203926ead5d633de9feba4f137004241221d", - "sha256:59f1e54627483dcf61c663941d94c4af9bf4163aec334171686cdaee67974fe5", - "sha256:5d9fc809aa8d636e757e4ced2302569d6e60e9b9c26114a83f0d9d6519c40493", - "sha256:654d3e06a4edc566b416c10293064732516cf8871a4522e0a2ba00cc2a2e600c", - "sha256:720d2b6083498a9281eaee3f2927486e9fe02cd16d13a844f2e95217f243efea", - "sha256:73483a2caaa0264ac717af33d6fb3f143d8379e60a422730ee8d010526ce1913", - "sha256:8a6ada5a3f719bf46a04ba38595073df8d6b067316c011180102ba2a1925f5b5", - "sha256:8b66b94fe6243d2d1d89bca336b2424399aac57932858b9a30309803ffc28112", - "sha256:949a219493a861c263b75a16588eadeeeab08f372e25ff4a15a00f73dfe341f4", - "sha256:99cc0e339a731c6a34109e5c4072aaa06d8e32c0b93dc2c2d90345dd45fa196c", - "sha256:a7e7f930039ee0c4c26e4dfee015f20bd6919cd8b97c9cd7afbde2923a5167b6", - "sha256:ab0d01148d13854de716786ca73701012e07dff4dfbbd68c4e06d8888743526e", - "sha256:b1dd4cf4c5e09cbeef0aee83f3b8af1e9986c086a8927b261c042655607571e8", - "sha256:c1a31cd42905b405530e92bdb70a8a56f048c8a371728b8acf9d746ecd4482c0", - "sha256:c20dd60b9428f532bc59f2ef6d3b1029a28fc790d408af82f871a7db03e722ff", - "sha256:c36ffe1e5aa35a1af6a96640d723d0d211c5f48841735c2aa8d034204e87eb87", - "sha256:c40fbb2b9933369e994b837ee72193d6a4c35dfb9a7c573257ef7ff28961272c", - "sha256:c6d653bab76b3925c65d4ac2ddbdffe09710f3f41cc7f177299e8c4498adb04a", - "sha256:d46fb17f5693244de83e434648b3dbb4f4b0fec88415d6cbab1c1452b6f2ae17", - "sha256:e36f12f503511d72d9bdfae11cadbadca22ff632ff67c1b5459f69756a029c19", - "sha256:f1a25a61495b6f7bb986accc5b597a3541d9bd3ef0016f50be16dbb32025b302", - "sha256:fa411b1d8f371d3a49d31b0789eb6da2537dadbb2aef74a43aa99a78195c3f76" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==19.0.2" - }, "robot-server": { "editable": true, "path": "./../robot-server" @@ -370,11 +272,11 @@ }, "setuptools": { "hashes": [ - "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2", - "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6" + "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", + "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" ], "markers": "python_version >= '3.8'", - "version": "==69.0.2" + "version": "==69.0.3" }, "six": { "hashes": [ @@ -450,11 +352,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", - "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" ], "markers": "python_version >= '3.8'", - "version": "==4.8.0" + "version": "==4.9.0" }, "uvicorn": { "hashes": [ @@ -475,85 +377,85 @@ "develop": { "aiohttp": { "hashes": [ - "sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f", - "sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c", - "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af", - "sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4", - "sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a", - "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489", - "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213", - "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01", - "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5", - "sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361", - "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26", - "sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0", - "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4", - "sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8", - "sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1", - "sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7", - "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6", - "sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a", - "sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd", - "sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4", - "sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499", - "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183", - "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544", - "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821", - "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501", - "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f", - "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe", - "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f", - "sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672", - "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5", - "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2", - "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57", - "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87", - "sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0", - "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f", - "sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7", - "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed", - "sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70", - "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0", - "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f", - "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d", - "sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f", - "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d", - "sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431", - "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff", - "sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf", - "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83", - "sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690", - "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587", - "sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e", - "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb", - "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3", - "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66", - "sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014", - "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35", - "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f", - "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0", - "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449", - "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23", - "sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5", - "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd", - "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4", - "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b", - "sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558", - "sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd", - "sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766", - "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a", - "sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636", - "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d", - "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590", - "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e", - "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d", - "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c", - "sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28", - "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065", - "sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca" + "sha256:017a21b0df49039c8f46ca0971b3a7fdc1f56741ab1240cb90ca408049766168", + "sha256:039df344b45ae0b34ac885ab5b53940b174530d4dd8a14ed8b0e2155b9dddccb", + "sha256:055ce4f74b82551678291473f66dc9fb9048a50d8324278751926ff0ae7715e5", + "sha256:06a9b2c8837d9a94fae16c6223acc14b4dfdff216ab9b7202e07a9a09541168f", + "sha256:07b837ef0d2f252f96009e9b8435ec1fef68ef8b1461933253d318748ec1acdc", + "sha256:0ed621426d961df79aa3b963ac7af0d40392956ffa9be022024cd16297b30c8c", + "sha256:0fa43c32d1643f518491d9d3a730f85f5bbaedcbd7fbcae27435bb8b7a061b29", + "sha256:1f5a71d25cd8106eab05f8704cd9167b6e5187bcdf8f090a66c6d88b634802b4", + "sha256:1f5cd333fcf7590a18334c90f8c9147c837a6ec8a178e88d90a9b96ea03194cc", + "sha256:27468897f628c627230dba07ec65dc8d0db566923c48f29e084ce382119802bc", + "sha256:298abd678033b8571995650ccee753d9458dfa0377be4dba91e4491da3f2be63", + "sha256:2c895a656dd7e061b2fd6bb77d971cc38f2afc277229ce7dd3552de8313a483e", + "sha256:361a1026c9dd4aba0109e4040e2aecf9884f5cfe1b1b1bd3d09419c205e2e53d", + "sha256:363afe77cfcbe3a36353d8ea133e904b108feea505aa4792dad6585a8192c55a", + "sha256:38a19bc3b686ad55804ae931012f78f7a534cce165d089a2059f658f6c91fa60", + "sha256:38f307b41e0bea3294a9a2a87833191e4bcf89bb0365e83a8be3a58b31fb7f38", + "sha256:3e59c23c52765951b69ec45ddbbc9403a8761ee6f57253250c6e1536cacc758b", + "sha256:4b4af9f25b49a7be47c0972139e59ec0e8285c371049df1a63b6ca81fdd216a2", + "sha256:504b6981675ace64c28bf4a05a508af5cde526e36492c98916127f5a02354d53", + "sha256:50fca156d718f8ced687a373f9e140c1bb765ca16e3d6f4fe116e3df7c05b2c5", + "sha256:522a11c934ea660ff8953eda090dcd2154d367dec1ae3c540aff9f8a5c109ab4", + "sha256:52df73f14ed99cee84865b95a3d9e044f226320a87af208f068ecc33e0c35b96", + "sha256:595f105710293e76b9dc09f52e0dd896bd064a79346234b521f6b968ffdd8e58", + "sha256:59c26c95975f26e662ca78fdf543d4eeaef70e533a672b4113dd888bd2423caa", + "sha256:5bce0dc147ca85caa5d33debc4f4d65e8e8b5c97c7f9f660f215fa74fc49a321", + "sha256:5eafe2c065df5401ba06821b9a054d9cb2848867f3c59801b5d07a0be3a380ae", + "sha256:5ed3e046ea7b14938112ccd53d91c1539af3e6679b222f9469981e3dac7ba1ce", + "sha256:5fe9ce6c09668063b8447f85d43b8d1c4e5d3d7e92c63173e6180b2ac5d46dd8", + "sha256:648056db9a9fa565d3fa851880f99f45e3f9a771dd3ff3bb0c048ea83fb28194", + "sha256:69361bfdca5468c0488d7017b9b1e5ce769d40b46a9f4a2eed26b78619e9396c", + "sha256:6b0e029353361f1746bac2e4cc19b32f972ec03f0f943b390c4ab3371840aabf", + "sha256:6b88f9386ff1ad91ace19d2a1c0225896e28815ee09fc6a8932fded8cda97c3d", + "sha256:770d015888c2a598b377bd2f663adfd947d78c0124cfe7b959e1ef39f5b13869", + "sha256:7943c414d3a8d9235f5f15c22ace69787c140c80b718dcd57caaade95f7cd93b", + "sha256:7cf5c9458e1e90e3c390c2639f1017a0379a99a94fdfad3a1fd966a2874bba52", + "sha256:7f46acd6a194287b7e41e87957bfe2ad1ad88318d447caf5b090012f2c5bb528", + "sha256:82e6aa28dd46374f72093eda8bcd142f7771ee1eb9d1e223ff0fa7177a96b4a5", + "sha256:835a55b7ca49468aaaac0b217092dfdff370e6c215c9224c52f30daaa735c1c1", + "sha256:84871a243359bb42c12728f04d181a389718710129b36b6aad0fc4655a7647d4", + "sha256:8aacb477dc26797ee089721536a292a664846489c49d3ef9725f992449eda5a8", + "sha256:8e2c45c208c62e955e8256949eb225bd8b66a4c9b6865729a786f2aa79b72e9d", + "sha256:90842933e5d1ff760fae6caca4b2b3edba53ba8f4b71e95dacf2818a2aca06f7", + "sha256:938a9653e1e0c592053f815f7028e41a3062e902095e5a7dc84617c87267ebd5", + "sha256:939677b61f9d72a4fa2a042a5eee2a99a24001a67c13da113b2e30396567db54", + "sha256:9d3c9b50f19704552f23b4eaea1fc082fdd82c63429a6506446cbd8737823da3", + "sha256:a6fe5571784af92b6bc2fda8d1925cccdf24642d49546d3144948a6a1ed58ca5", + "sha256:a78ed8a53a1221393d9637c01870248a6f4ea5b214a59a92a36f18151739452c", + "sha256:ab40e6251c3873d86ea9b30a1ac6d7478c09277b32e14745d0d3c6e76e3c7e29", + "sha256:abf151955990d23f84205286938796c55ff11bbfb4ccfada8c9c83ae6b3c89a3", + "sha256:acef0899fea7492145d2bbaaaec7b345c87753168589cc7faf0afec9afe9b747", + "sha256:b40670ec7e2156d8e57f70aec34a7216407848dfe6c693ef131ddf6e76feb672", + "sha256:b791a3143681a520c0a17e26ae7465f1b6f99461a28019d1a2f425236e6eedb5", + "sha256:b955ed993491f1a5da7f92e98d5dad3c1e14dc175f74517c4e610b1f2456fb11", + "sha256:ba39e9c8627edc56544c8628cc180d88605df3892beeb2b94c9bc857774848ca", + "sha256:bca77a198bb6e69795ef2f09a5f4c12758487f83f33d63acde5f0d4919815768", + "sha256:c3452ea726c76e92f3b9fae4b34a151981a9ec0a4847a627c43d71a15ac32aa6", + "sha256:c46956ed82961e31557b6857a5ca153c67e5476972e5f7190015018760938da2", + "sha256:c7c8b816c2b5af5c8a436df44ca08258fc1a13b449393a91484225fcb7545533", + "sha256:cd73265a9e5ea618014802ab01babf1940cecb90c9762d8b9e7d2cc1e1969ec6", + "sha256:dad46e6f620574b3b4801c68255492e0159d1712271cc99d8bdf35f2043ec266", + "sha256:dc9b311743a78043b26ffaeeb9715dc360335e5517832f5a8e339f8a43581e4d", + "sha256:df822ee7feaaeffb99c1a9e5e608800bd8eda6e5f18f5cfb0dc7eeb2eaa6bbec", + "sha256:e083c285857b78ee21a96ba1eb1b5339733c3563f72980728ca2b08b53826ca5", + "sha256:e5e46b578c0e9db71d04c4b506a2121c0cb371dd89af17a0586ff6769d4c58c1", + "sha256:e99abf0bba688259a496f966211c49a514e65afa9b3073a1fcee08856e04425b", + "sha256:ee43080e75fc92bf36219926c8e6de497f9b247301bbf88c5c7593d931426679", + "sha256:f033d80bc6283092613882dfe40419c6a6a1527e04fc69350e87a9df02bbc283", + "sha256:f1088fa100bf46e7b398ffd9904f4808a0612e1d966b4aa43baa535d1b6341eb", + "sha256:f56455b0c2c7cc3b0c584815264461d07b177f903a04481dfc33e08a89f0c26b", + "sha256:f59dfe57bb1ec82ac0698ebfcdb7bcd0e99c255bd637ff613760d5f33e7c81b3", + "sha256:f7217af2e14da0856e082e96ff637f14ae45c10a5714b63c77f26d8884cf1051", + "sha256:f734e38fd8666f53da904c52a23ce517f1b07722118d750405af7e4123933511", + "sha256:f95511dd5d0e05fd9728bac4096319f80615aaef4acbecb35a990afebe953b0e", + "sha256:fdd215b7b7fd4a53994f238d0f46b7ba4ac4c0adb12452beee724ddd0743ae5d", + "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542", + "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f" ], "markers": "python_version >= '3.8'", - "version": "==3.9.1" + "version": "==3.9.3" }, "aiosignal": { "hashes": [ @@ -573,11 +475,11 @@ }, "attrs": { "hashes": [ - "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" + "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], "markers": "python_version >= '3.7'", - "version": "==23.1.0" + "version": "==23.2.0" }, "black": { "hashes": [ @@ -619,61 +521,61 @@ }, "coverage": { "hashes": [ - "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1", - "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63", - "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9", - "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312", - "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3", - "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb", - "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25", - "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92", - "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda", - "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148", - "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6", - "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216", - "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a", - "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640", - "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836", - "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c", - "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f", - "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2", - "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901", - "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed", - "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a", - "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074", - "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc", - "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84", - "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083", - "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f", - "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c", - "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c", - "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637", - "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2", - "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82", - "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f", - "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce", - "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef", - "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f", - "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611", - "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c", - "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76", - "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9", - "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce", - "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9", - "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf", - "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf", - "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9", - "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6", - "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2", - "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a", - "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a", - "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf", - "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738", - "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a", - "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4" + "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61", + "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1", + "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7", + "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7", + "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75", + "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd", + "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35", + "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04", + "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6", + "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042", + "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166", + "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1", + "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d", + "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c", + "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66", + "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70", + "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1", + "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676", + "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630", + "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a", + "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74", + "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad", + "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19", + "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6", + "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448", + "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018", + "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218", + "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756", + "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54", + "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45", + "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628", + "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968", + "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d", + "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25", + "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60", + "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950", + "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06", + "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295", + "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b", + "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c", + "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc", + "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74", + "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1", + "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee", + "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011", + "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156", + "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766", + "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5", + "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581", + "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016", + "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c", + "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3" ], "markers": "python_version >= '3.8'", - "version": "==7.3.2" + "version": "==7.4.1" }, "decoy": { "hashes": [ @@ -746,70 +648,86 @@ }, "frozenlist": { "hashes": [ - "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6", - "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01", - "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251", - "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9", - "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b", - "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87", - "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf", - "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f", - "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0", - "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2", - "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b", - "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc", - "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c", - "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467", - "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9", - "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1", - "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a", - "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79", - "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167", - "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300", - "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf", - "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea", - "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2", - "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab", - "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3", - "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb", - "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087", - "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc", - "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8", - "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62", - "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f", - "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326", - "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c", - "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431", - "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963", - "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7", - "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef", - "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3", - "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956", - "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781", - "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472", - "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc", - "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839", - "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672", - "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3", - "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503", - "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d", - "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8", - "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b", - "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc", - "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f", - "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559", - "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b", - "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95", - "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb", - "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963", - "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919", - "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f", - "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3", - "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1", - "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e" + "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7", + "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98", + "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad", + "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5", + "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae", + "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e", + "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a", + "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701", + "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d", + "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6", + "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6", + "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106", + "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75", + "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868", + "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a", + "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0", + "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1", + "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826", + "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec", + "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6", + "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950", + "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19", + "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0", + "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8", + "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a", + "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09", + "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86", + "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c", + "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5", + "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b", + "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b", + "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d", + "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0", + "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea", + "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776", + "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a", + "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897", + "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7", + "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09", + "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9", + "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe", + "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd", + "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742", + "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09", + "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0", + "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932", + "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1", + "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a", + "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49", + "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d", + "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7", + "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480", + "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89", + "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e", + "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b", + "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82", + "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb", + "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068", + "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8", + "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b", + "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb", + "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2", + "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11", + "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b", + "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc", + "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0", + "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497", + "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17", + "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0", + "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2", + "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439", + "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5", + "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac", + "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825", + "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887", + "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced", + "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74" ], "markers": "python_version >= '3.8'", - "version": "==1.4.0" + "version": "==1.4.1" }, "idna": { "hashes": [ @@ -972,11 +890,11 @@ }, "pathspec": { "hashes": [ - "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", - "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3" + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" ], - "markers": "python_version >= '3.7'", - "version": "==0.11.2" + "markers": "python_version >= '3.8'", + "version": "==0.12.1" }, "platformdirs": { "hashes": [ @@ -988,11 +906,11 @@ }, "pluggy": { "hashes": [ - "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12", - "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7" + "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", + "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be" ], "markers": "python_version >= '3.8'", - "version": "==1.3.0" + "version": "==1.4.0" }, "py": { "hashes": [ @@ -1028,12 +946,12 @@ }, "pytest": { "hashes": [ - "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac", - "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5" + "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", + "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==7.4.3" + "version": "==7.4.4" }, "pytest-aiohttp": { "hashes": [ @@ -1086,11 +1004,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", - "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" ], "markers": "python_version >= '3.8'", - "version": "==4.8.0" + "version": "==4.9.0" }, "yarl": { "hashes": [ diff --git a/g-code-testing/setup.py b/g-code-testing/setup.py index debfc643fa2..dac801d5d39 100644 --- a/g-code-testing/setup.py +++ b/g-code-testing/setup.py @@ -52,7 +52,6 @@ def get_version(): INSTALL_REQUIRES = [ f"opentrons=={VERSION}", f"robot-server=={VERSION}", - f"notify-server=={VERSION}", ] diff --git a/notify-server/.flake8 b/notify-server/.flake8 deleted file mode 100644 index cc6c8e5661c..00000000000 --- a/notify-server/.flake8 +++ /dev/null @@ -1,11 +0,0 @@ -[flake8] - -extend-ignore = - # defer formatting concerns to black - # E203: space around `:` operator - # E501: maximum line length - E203, - E501, - # do not require type annotations for self nor cls - ANN101, - ANN102 diff --git a/notify-server/Config.in b/notify-server/Config.in deleted file mode 100644 index 44cb238b6cd..00000000000 --- a/notify-server/Config.in +++ /dev/null @@ -1,13 +0,0 @@ -config BR2_PACKAGE_PYTHON_OPENTRONS_NOTIFY_SERVER - bool "python-opentrons-notify-server" - depends on BR2_PACKAGE_PYTHON3 - select BR2_PACKAGE_PYTHON_OPENTRONS_API # runtime - select BR2_PACKAGE_PYTHON_OPENTRONS_SHARED_DATA # runtime - select BR2_PACKAGE_PYTHON_PYDANTIC # runtime - select BR2_PACKAGE_PYTHON_PYZMQ # runtime - select BR2_PACKAGE_PYTHON_TYPING_EXTENSIONS # runtime - - help - Opentrons notification server for OT2 robot. - - https://opentrons.com diff --git a/notify-server/Makefile b/notify-server/Makefile deleted file mode 100755 index 6588592fb96..00000000000 --- a/notify-server/Makefile +++ /dev/null @@ -1,155 +0,0 @@ -# opentrons notify server makefile - -include ../scripts/push.mk -include ../scripts/python.mk - -# using bash instead of /bin/bash in SHELL prevents macOS optimizing away our PATH update -SHELL := bash - -# add yarn CLI dev deps to PATH (for cross platform POSIX commands via shx) -# and also make an explicit version for shx for use in the shell function, -# where PATH won’t be propagated -PATH := $(shell cd .. && yarn bin):$(PATH) -SHX := npx shx - -# Path of source package -SRC_PATH = notify_server - -ot_project := $(OPENTRONS_PROJECT) -project_rs_default = $(if $(ot_project),$(ot_project),robot-stack) -project_ot3_default = $(if $(ot_project),$(ot_project),ot3) - - -# Find the version of the wheel from git using a helper script. We -# use python here so we can use the same version normalization that will be -# used to create the wheel. -wheel_file = dist/$(call python_get_wheelname,notify-server,$(project_rs_default),notify_server,$(BUILD_NUMBER)) - -# Find the version of the sdist from git using a helper script. We -# use python here so we can use the same version normalization that will be -# used to create the sdist. -sdist_file = dist/$(call python_get_sdistname,notify-server,$(project_ot3_default),notify_server) - -# Find the branch, sha, version that will be used to update the VERSION.json file -version_file = $(call python_get_git_version,notify-server,$(project_ot3_default),notify_server) - -# These variables can be overriden when make is invoked to customize the -# behavior of pytest. For instance, -# make test tests=tests/opentrons/tools/test_qc_scripts.py would run only the -# specified test -tests ?= tests -cov_opts ?= --cov=$(SRC_PATH) --cov-report term-missing:skip-covered --cov-report xml:coverage.xml -test_opts ?= - -# Host key location for robot -ssh_key ?= $(default_ssh_key) -# Pubkey location for buildroot robot to install with install-key -br_ssh_pubkey ?= $(ssh_key).pub -# Other SSH args for robot -ssh_opts ?= $(default_ssh_opts) - -# Source discovery -# For the python sources -ot_py_sources := $(filter %.py,$(shell $(SHX) find $(SRC_PATH))) -ot_sources := $(ot_py_sources) - -# Defined separately than the clean target so the wheel file doesn’t have to -# depend on a PHONY target -clean_cmd = $(SHX) rm -rf build dist .coverage coverage.xml '*.egg-info' '**/__pycache__' '**/*.pyc' 'notify_server/**/.mypy_cache' - -.PHONY: all -all: clean wheel - -.PHONY: setup -setup: - $(pipenv) sync $(pipenv_opts) - $(pipenv) run pip freeze - -.PHONY: setup-ot2 -setup-ot2: - $(pipenv) sync $(pipenv_opts) - $(pipenv) run pip uninstall -y python-can - $(pipenv) run pip freeze - -.PHONY: clean -clean: - $(clean_cmd) - -.PHONY: teardown -teardown: - $(pipenv) --rm - -$(wheel_file): export OPENTRONS_PROJECT=$(project_rs_default) -$(wheel_file): setup.py $(ot_sources) - $(clean_cmd) - $(python) setup.py $(wheel_opts) bdist_wheel --universal - $(SHX) rm -rf build - $(SHX) ls dist - -.PHONY: wheel -wheel: $(wheel_file) - -$(sdist_file): export OPENTRONS_PROJECT=$(project_ot3_default) -$(sdist_file): setup.py $(ot_sources) - $(clean_cmd) - $(python) setup.py sdist - $(SHX) rm -rf build - $(SHX) ls dist - -.PHONY: sdist -sdist: $(sdist_file) - -.PHONY: test -test: - $(pytest) $(tests) $(test_opts) - -.PHONY: test-cov -test-cov: - $(pytest) $(tests) $(test_opts) $(cov_opts) - -.PHONY: lint -lint: $(ot_py_sources) - $(python) -m mypy $(SRC_PATH) $(tests) - $(python) -m black --check notify_server tests setup.py - $(python) -m flake8 $(SRC_PATH) $(tests) - -.PHONY: format -format: - $(python) -m black notify_server tests setup.py - -.PHONY: dev -dev: export OT_NOTIFY_SERVER_PRODUCTION := 0 -dev: - $(python) -m notify_server.main - -.PHONY: local-shell -local-shell: - $(python) shell - -.PHONY: push -push: wheel - $(call push-python-package,$(host),$(ssh_key),$(ssh_opts),$(wheel_file)) - $(call push-systemd-unit,$(host),$(ssh_key),$(ssh_opts),./opentrons-notify-server.service) - $(call restart-service,$(host),$(ssh_key),$(ssh_opts),opentrons-notify-server) - - -.PHONY: push-no-restart-ot3 -push-no-restart-ot3: sdist - $(call push-python-sdist,$(host),$(ssh_key),$(ssh_opts),$(sdist_file),"/opt/opentrons-robot-server","notify_server",,,$(version_file)) - - -.PHONY: push-ot3 -push-ot3: push-no-restart-ot3 - $(call restart-server,$(host),$(ssh_key),$(ssh_opts),"opentrons-notify-server") - - -.PHONY: install-key -install-key: - curl -X POST $(host):31950/server/ssh_keys\ - -H "Content-Type: application/json"\ - -d "{\"key\":\"$(shell cat $(br_ssh_pubkey))\"}" - -# User must currently specify host, e.g.: `make term host=169.254.202.176` -.PHONY: term -term: - ssh $(if $(ssh_key),-i $(ssh_key)) $(ssh_opts) root@$(host) diff --git a/notify-server/Pipfile b/notify-server/Pipfile deleted file mode 100644 index 24518fa3fc4..00000000000 --- a/notify-server/Pipfile +++ /dev/null @@ -1,30 +0,0 @@ -[[source]] -name = "pypi" -url = "https://pypi.org/simple/" -verify_ssl = true - -[requires] -python_version = "3.10" - -[packages] -notify-server = { editable = true, path = "." } -opentrons = { editable = true, path = "../api" } -opentrons-shared-data = { editable = true, path = "../shared-data/python" } -opentrons-hardware = { editable = true, path = "./../hardware" } -typing-extensions = ">=4.0.0,<5" - -[dev-packages] -flake8 = "~=3.9.0" -flake8-annotations = "~=2.6.2" -flake8-docstrings = "~=1.6.0" -mock = "~=4.0.3" -mypy = "==0.981" -pytest = "==7.1.1" -pytest-cov = "==2.10.1" -pytest-asyncio = "==0.16.0" -pytest-xdist = "~=2.5.0" -# pytest dependencies on windows, spec'd here to force lockfile inclusion -# https://github.com/pypa/pipenv/issues/4408#issuecomment-668324177 -atomicwrites = { version = "==1.4.0", markers="sys_platform =='win32'" } -colorama = { version = "==0.4.4", markers = "sys_platform=='win32'" } -black = "==22.3.0" diff --git a/notify-server/Pipfile.lock b/notify-server/Pipfile.lock deleted file mode 100644 index fa41c21a2f5..00000000000 --- a/notify-server/Pipfile.lock +++ /dev/null @@ -1,633 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "ff9059328973547458cf7c1edae2c3171f50e25ed83f236e0b1ec6f3a1f53baa" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.10" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple/", - "verify_ssl": true - } - ] - }, - "default": { - "aionotify": { - "hashes": [ - "sha256:385e1becfaac2d9f4326673033d53912ef9565b6febdedbec593ee966df392c6", - "sha256:64b702ad0eb115034533f9f62730a9253b79f5ff0fbf3d100c392124cdf12507" - ], - "version": "==0.2.0" - }, - "anyio": { - "hashes": [ - "sha256:413adf95f93886e442aea925f3ee43baa5a765a64a0f52c6081894f9992fdd0b", - "sha256:cb29b9c70620506a9a8f87a309591713446953302d7d995344d0d7c6c0c9a7be" - ], - "markers": "python_full_version >= '3.6.2'", - "version": "==3.6.1" - }, - "attrs": { - "hashes": [ - "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" - ], - "markers": "python_version >= '3.7'", - "version": "==23.1.0" - }, - "click": { - "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" - ], - "markers": "python_version >= '3.7'", - "version": "==8.1.7" - }, - "idna": { - "hashes": [ - "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", - "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" - ], - "markers": "python_version >= '3.5'", - "version": "==3.6" - }, - "jsonschema": { - "hashes": [ - "sha256:5f9c0a719ca2ce14c5de2fd350a64fd2d13e8539db29836a86adc990bb1a068f", - "sha256:8d4a2b7b6c2237e0199c8ea1a6d3e05bf118e289ae2b9d7ba444182a2959560d" - ], - "version": "==3.0.2" - }, - "notify-server": { - "editable": true, - "path": "." - }, - "numpy": { - "hashes": [ - "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a", - "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6", - "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2", - "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79", - "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9", - "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919", - "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d", - "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060", - "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75", - "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f", - "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe", - "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167", - "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef", - "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75", - "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3", - "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7", - "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7", - "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d", - "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b", - "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186", - "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0", - "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1", - "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6", - "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e", - "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523", - "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36", - "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841", - "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818", - "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00", - "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80", - "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440", - "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210", - "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8", - "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea", - "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec", - "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841" - ], - "markers": "python_version >= '3.9'", - "version": "==1.26.2" - }, - "opentrons": { - "editable": true, - "path": "../api" - }, - "opentrons-hardware": { - "editable": true, - "path": "./../hardware" - }, - "opentrons-shared-data": { - "editable": true, - "markers": "python_version >= '3.7'", - "path": "../shared-data/python" - }, - "pydantic": { - "hashes": [ - "sha256:1061c6ee6204f4f5a27133126854948e3b3d51fcc16ead2e5d04378c199b2f44", - "sha256:19b5686387ea0d1ea52ecc4cffb71abb21702c5e5b2ac626fd4dbaa0834aa49d", - "sha256:2bd446bdb7755c3a94e56d7bdfd3ee92396070efa8ef3a34fab9579fe6aa1d84", - "sha256:328558c9f2eed77bd8fffad3cef39dbbe3edc7044517f4625a769d45d4cf7555", - "sha256:32e0b4fb13ad4db4058a7c3c80e2569adbd810c25e6ca3bbd8b2a9cc2cc871d7", - "sha256:3ee0d69b2a5b341fc7927e92cae7ddcfd95e624dfc4870b32a85568bd65e6131", - "sha256:4aafd4e55e8ad5bd1b19572ea2df546ccace7945853832bb99422a79c70ce9b8", - "sha256:4b3946f87e5cef3ba2e7bd3a4eb5a20385fe36521d6cc1ebf3c08a6697c6cfb3", - "sha256:4de71c718c9756d679420c69f216776c2e977459f77e8f679a4a961dc7304a56", - "sha256:5565a49effe38d51882cb7bac18bda013cdb34d80ac336428e8908f0b72499b0", - "sha256:5803ad846cdd1ed0d97eb00292b870c29c1f03732a010e66908ff48a762f20e4", - "sha256:5da164119602212a3fe7e3bc08911a89db4710ae51444b4224c2382fd09ad453", - "sha256:615661bfc37e82ac677543704437ff737418e4ea04bef9cf11c6d27346606044", - "sha256:78a4d6bdfd116a559aeec9a4cfe77dda62acc6233f8b56a716edad2651023e5e", - "sha256:7d0f183b305629765910eaad707800d2f47c6ac5bcfb8c6397abdc30b69eeb15", - "sha256:7ead3cd020d526f75b4188e0a8d71c0dbbe1b4b6b5dc0ea775a93aca16256aeb", - "sha256:84d76ecc908d917f4684b354a39fd885d69dd0491be175f3465fe4b59811c001", - "sha256:8cb0bc509bfb71305d7a59d00163d5f9fc4530f0881ea32c74ff4f74c85f3d3d", - "sha256:91089b2e281713f3893cd01d8e576771cd5bfdfbff5d0ed95969f47ef6d676c3", - "sha256:9c9e04a6cdb7a363d7cb3ccf0efea51e0abb48e180c0d31dca8d247967d85c6e", - "sha256:a8c5360a0297a713b4123608a7909e6869e1b56d0e96eb0d792c27585d40757f", - "sha256:afacf6d2a41ed91fc631bade88b1d319c51ab5418870802cedb590b709c5ae3c", - "sha256:b34ba24f3e2d0b39b43f0ca62008f7ba962cff51efa56e64ee25c4af6eed987b", - "sha256:bd67cb2c2d9602ad159389c29e4ca964b86fa2f35c2faef54c3eb28b4efd36c8", - "sha256:c0f5e142ef8217019e3eef6ae1b6b55f09a7a15972958d44fbd228214cede567", - "sha256:cdb4272678db803ddf94caa4f94f8672e9a46bae4a44f167095e4d06fec12979", - "sha256:d70916235d478404a3fa8c997b003b5f33aeac4686ac1baa767234a0f8ac2326", - "sha256:d8ce3fb0841763a89322ea0432f1f59a2d3feae07a63ea2c958b2315e1ae8adb", - "sha256:e0b214e57623a535936005797567231a12d0da0c29711eb3514bc2b3cd008d0f", - "sha256:e631c70c9280e3129f071635b81207cad85e6c08e253539467e4ead0e5b219aa", - "sha256:e78578f0c7481c850d1c969aca9a65405887003484d24f6110458fb02cca7747", - "sha256:f0ca86b525264daa5f6b192f216a0d1e860b7383e3da1c65a1908f9c02f42801", - "sha256:f1a68f4f65a9ee64b6ccccb5bf7e17db07caebd2730109cb8a95863cfa9c4e55", - "sha256:fafe841be1103f340a24977f61dee76172e4ae5f647ab9e7fd1e1fca51524f08", - "sha256:ff68fc85355532ea77559ede81f35fff79a6a5543477e168ab3a381887caea76" - ], - "markers": "python_full_version >= '3.6.1'", - "version": "==1.9.2" - }, - "pyrsistent": { - "hashes": [ - "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", - "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", - "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", - "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34", - "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca", - "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", - "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", - "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", - "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714", - "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf", - "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", - "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", - "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", - "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d", - "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054", - "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", - "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7", - "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423", - "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce", - "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", - "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", - "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0", - "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f", - "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", - "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce", - "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", - "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", - "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86", - "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f", - "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b", - "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98", - "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022" - ], - "markers": "python_version >= '3.8'", - "version": "==0.20.0" - }, - "pyserial": { - "hashes": [ - "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb", - "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0" - ], - "version": "==3.5" - }, - "pyzmq": { - "hashes": [ - "sha256:00dca814469436455399660247d74045172955459c0bd49b54a540ce4d652185", - "sha256:046b92e860914e39612e84fa760fc3f16054d268c11e0e25dcb011fb1bc6a075", - "sha256:09d24a80ccb8cbda1af6ed8eb26b005b6743e58e9290566d2a6841f4e31fa8e0", - "sha256:0a422fc290d03958899743db091f8154958410fc76ce7ee0ceb66150f72c2c97", - "sha256:18189fc59ff5bf46b7ccf5a65c1963326dbfc85a2bc73e9f4a90a40322b992c8", - "sha256:276ad604bffd70992a386a84bea34883e696a6b22e7378053e5d3227321d9702", - "sha256:296540a065c8c21b26d63e3cea2d1d57902373b16e4256afe46422691903a438", - "sha256:29d51279060d0a70f551663bc592418bcad7f4be4eea7b324f6dd81de05cb4c1", - "sha256:36ab114021c0cab1a423fe6689355e8f813979f2c750968833b318c1fa10a0fd", - "sha256:3fa6debf4bf9412e59353defad1f8035a1e68b66095a94ead8f7a61ae90b2675", - "sha256:5120c64646e75f6db20cc16b9a94203926ead5d633de9feba4f137004241221d", - "sha256:59f1e54627483dcf61c663941d94c4af9bf4163aec334171686cdaee67974fe5", - "sha256:5d9fc809aa8d636e757e4ced2302569d6e60e9b9c26114a83f0d9d6519c40493", - "sha256:654d3e06a4edc566b416c10293064732516cf8871a4522e0a2ba00cc2a2e600c", - "sha256:720d2b6083498a9281eaee3f2927486e9fe02cd16d13a844f2e95217f243efea", - "sha256:73483a2caaa0264ac717af33d6fb3f143d8379e60a422730ee8d010526ce1913", - "sha256:8a6ada5a3f719bf46a04ba38595073df8d6b067316c011180102ba2a1925f5b5", - "sha256:8b66b94fe6243d2d1d89bca336b2424399aac57932858b9a30309803ffc28112", - "sha256:949a219493a861c263b75a16588eadeeeab08f372e25ff4a15a00f73dfe341f4", - "sha256:99cc0e339a731c6a34109e5c4072aaa06d8e32c0b93dc2c2d90345dd45fa196c", - "sha256:a7e7f930039ee0c4c26e4dfee015f20bd6919cd8b97c9cd7afbde2923a5167b6", - "sha256:ab0d01148d13854de716786ca73701012e07dff4dfbbd68c4e06d8888743526e", - "sha256:b1dd4cf4c5e09cbeef0aee83f3b8af1e9986c086a8927b261c042655607571e8", - "sha256:c1a31cd42905b405530e92bdb70a8a56f048c8a371728b8acf9d746ecd4482c0", - "sha256:c20dd60b9428f532bc59f2ef6d3b1029a28fc790d408af82f871a7db03e722ff", - "sha256:c36ffe1e5aa35a1af6a96640d723d0d211c5f48841735c2aa8d034204e87eb87", - "sha256:c40fbb2b9933369e994b837ee72193d6a4c35dfb9a7c573257ef7ff28961272c", - "sha256:c6d653bab76b3925c65d4ac2ddbdffe09710f3f41cc7f177299e8c4498adb04a", - "sha256:d46fb17f5693244de83e434648b3dbb4f4b0fec88415d6cbab1c1452b6f2ae17", - "sha256:e36f12f503511d72d9bdfae11cadbadca22ff632ff67c1b5459f69756a029c19", - "sha256:f1a25a61495b6f7bb986accc5b597a3541d9bd3ef0016f50be16dbb32025b302", - "sha256:fa411b1d8f371d3a49d31b0789eb6da2537dadbb2aef74a43aa99a78195c3f76" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==19.0.2" - }, - "setuptools": { - "hashes": [ - "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2", - "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6" - ], - "markers": "python_version >= '3.8'", - "version": "==69.0.2" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.16.0" - }, - "sniffio": { - "hashes": [ - "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", - "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" - ], - "markers": "python_version >= '3.7'", - "version": "==1.3.0" - }, - "typing-extensions": { - "hashes": [ - "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", - "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==4.8.0" - } - }, - "develop": { - "atomicwrites": { - "hashes": [ - "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197", - "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a" - ], - "markers": "sys_platform == 'win32'", - "version": "==1.4.0" - }, - "attrs": { - "hashes": [ - "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" - ], - "markers": "python_version >= '3.7'", - "version": "==23.1.0" - }, - "black": { - "hashes": [ - "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b", - "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176", - "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09", - "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a", - "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015", - "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79", - "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb", - "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20", - "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464", - "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968", - "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82", - "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21", - "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0", - "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265", - "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b", - "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a", - "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72", - "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce", - "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0", - "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a", - "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163", - "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad", - "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d" - ], - "index": "pypi", - "markers": "python_full_version >= '3.6.2'", - "version": "==22.3.0" - }, - "click": { - "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" - ], - "markers": "python_version >= '3.7'", - "version": "==8.1.7" - }, - "colorama": { - "hashes": [ - "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", - "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2" - ], - "markers": "sys_platform == 'win32'", - "version": "==0.4.4" - }, - "coverage": { - "hashes": [ - "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1", - "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63", - "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9", - "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312", - "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3", - "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb", - "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25", - "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92", - "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda", - "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148", - "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6", - "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216", - "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a", - "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640", - "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836", - "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c", - "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f", - "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2", - "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901", - "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed", - "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a", - "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074", - "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc", - "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84", - "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083", - "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f", - "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c", - "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c", - "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637", - "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2", - "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82", - "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f", - "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce", - "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef", - "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f", - "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611", - "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c", - "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76", - "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9", - "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce", - "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9", - "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf", - "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf", - "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9", - "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6", - "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2", - "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a", - "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a", - "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf", - "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738", - "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a", - "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4" - ], - "markers": "python_version >= '3.8'", - "version": "==7.3.2" - }, - "execnet": { - "hashes": [ - "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41", - "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.2" - }, - "flake8": { - "hashes": [ - "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b", - "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907" - ], - "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==3.9.2" - }, - "flake8-annotations": { - "hashes": [ - "sha256:0d6cd2e770b5095f09689c9d84cc054c51b929c41a68969ea1beb4b825cac515", - "sha256:d10c4638231f8a50c0a597c4efce42bd7b7d85df4f620a0ddaca526138936a4f" - ], - "index": "pypi", - "markers": "python_full_version >= '3.6.1' and python_full_version < '4.0.0'", - "version": "==2.6.2" - }, - "flake8-docstrings": { - "hashes": [ - "sha256:99cac583d6c7e32dd28bbfbef120a7c0d1b6dde4adb5a9fd441c4227a6534bde", - "sha256:9fe7c6a306064af8e62a055c2f61e9eb1da55f84bb39caef2b84ce53708ac34b" - ], - "index": "pypi", - "version": "==1.6.0" - }, - "iniconfig": { - "hashes": [ - "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", - "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.0" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, - "mock": { - "hashes": [ - "sha256:122fcb64ee37cfad5b3f48d7a7d51875d7031aaf3d8be7c42e2bee25044eee62", - "sha256:7d3fbbde18228f4ff2f1f119a45cdffa458b4c0dee32eb4d2bb2f82554bac7bc" - ], - "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==4.0.3" - }, - "mypy": { - "hashes": [ - "sha256:06e1eac8d99bd404ed8dd34ca29673c4346e76dd8e612ea507763dccd7e13c7a", - "sha256:2ee3dbc53d4df7e6e3b1c68ac6a971d3a4fb2852bf10a05fda228721dd44fae1", - "sha256:4bc460e43b7785f78862dab78674e62ec3cd523485baecfdf81a555ed29ecfa0", - "sha256:64e1f6af81c003f85f0dfed52db632817dabb51b65c0318ffbf5ff51995bbb08", - "sha256:6e35d764784b42c3e256848fb8ed1d4292c9fc0098413adb28d84974c095b279", - "sha256:6ee196b1d10b8b215e835f438e06965d7a480f6fe016eddbc285f13955cca659", - "sha256:756fad8b263b3ba39e4e204ee53042671b660c36c9017412b43af210ddee7b08", - "sha256:77f8fcf7b4b3cc0c74fb33ae54a4cd00bb854d65645c48beccf65fa10b17882c", - "sha256:794f385653e2b749387a42afb1e14c2135e18daeb027e0d97162e4b7031210f8", - "sha256:8ad21d4c9d3673726cf986ea1d0c9fb66905258709550ddf7944c8f885f208be", - "sha256:8e8e49aa9cc23aa4c926dc200ce32959d3501c4905147a66ce032f05cb5ecb92", - "sha256:9f362470a3480165c4c6151786b5379351b790d56952005be18bdbdd4c7ce0ae", - "sha256:a16a0145d6d7d00fbede2da3a3096dcc9ecea091adfa8da48fa6a7b75d35562d", - "sha256:ad77c13037d3402fbeffda07d51e3f228ba078d1c7096a73759c9419ea031bf4", - "sha256:b6ede64e52257931315826fdbfc6ea878d89a965580d1a65638ef77cb551f56d", - "sha256:c9e0efb95ed6ca1654951bd5ec2f3fa91b295d78bf6527e026529d4aaa1e0c30", - "sha256:ce65f70b14a21fdac84c294cde75e6dbdabbcff22975335e20827b3b94bdbf49", - "sha256:d1debb09043e1f5ee845fa1e96d180e89115b30e47c5d3ce53bc967bab53f62d", - "sha256:e178eaffc3c5cd211a87965c8c0df6da91ed7d258b5fc72b8e047c3771317ddb", - "sha256:e1acf62a8c4f7c092462c738aa2c2489e275ed386320c10b2e9bff31f6f7e8d6", - "sha256:e53773073c864d5f5cec7f3fc72fbbcef65410cde8cc18d4f7242dea60dac52e", - "sha256:eb3978b191b9fa0488524bb4ffedf2c573340e8c2b4206fc191d44c7093abfb7", - "sha256:f64d2ce043a209a297df322eb4054dfbaa9de9e8738291706eaafda81ab2b362", - "sha256:fa38f82f53e1e7beb45557ff167c177802ba7b387ad017eab1663d567017c8ee" - ], - "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==0.981" - }, - "mypy-extensions": { - "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" - }, - "packaging": { - "hashes": [ - "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", - "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" - ], - "markers": "python_version >= '3.7'", - "version": "==23.2" - }, - "pathspec": { - "hashes": [ - "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", - "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3" - ], - "markers": "python_version >= '3.7'", - "version": "==0.11.2" - }, - "platformdirs": { - "hashes": [ - "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380", - "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420" - ], - "markers": "python_version >= '3.8'", - "version": "==4.1.0" - }, - "pluggy": { - "hashes": [ - "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12", - "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7" - ], - "markers": "python_version >= '3.8'", - "version": "==1.3.0" - }, - "py": { - "hashes": [ - "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", - "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.11.0" - }, - "pycodestyle": { - "hashes": [ - "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068", - "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.7.0" - }, - "pydocstyle": { - "hashes": [ - "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019", - "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1" - ], - "markers": "python_version >= '3.6'", - "version": "==6.3.0" - }, - "pyflakes": { - "hashes": [ - "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3", - "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.3.1" - }, - "pytest": { - "hashes": [ - "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63", - "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea" - ], - "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==7.1.1" - }, - "pytest-asyncio": { - "hashes": [ - "sha256:5f2a21273c47b331ae6aa5b36087047b4899e40f03f18397c0e65fa5cca54e9b", - "sha256:7496c5977ce88c34379df64a66459fe395cd05543f0a2f837016e7144391fcfb" - ], - "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==0.16.0" - }, - "pytest-cov": { - "hashes": [ - "sha256:45ec2d5182f89a81fc3eb29e3d1ed3113b9e9a873bcddb2a71faaab066110191", - "sha256:47bd0ce14056fdd79f93e1713f88fad7bdcc583dcd7783da86ef2f085a0bb88e" - ], - "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==2.10.1" - }, - "pytest-forked": { - "hashes": [ - "sha256:4dafd46a9a600f65d822b8f605133ecf5b3e1941ebb3588e943b4e3eb71a5a3f", - "sha256:810958f66a91afb1a1e2ae83089d8dc1cd2437ac96b12963042fbb9fb4d16af0" - ], - "markers": "python_version >= '3.7'", - "version": "==1.6.0" - }, - "pytest-xdist": { - "hashes": [ - "sha256:4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf", - "sha256:6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65" - ], - "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==2.5.0" - }, - "snowballstemmer": { - "hashes": [ - "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", - "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" - ], - "version": "==2.2.0" - }, - "tomli": { - "hashes": [ - "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", - "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" - ], - "markers": "python_version < '3.11'", - "version": "==2.0.1" - }, - "typing-extensions": { - "hashes": [ - "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", - "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==4.8.0" - } - } -} diff --git a/notify-server/README.rst b/notify-server/README.rst deleted file mode 100644 index db44c101e2d..00000000000 --- a/notify-server/README.rst +++ /dev/null @@ -1,114 +0,0 @@ -===================== -Notification Server -===================== - -Introduction ------------- -The notification server is a pub/sub service for the OT2. - - -Development Environment ------------------------------------ -- `pipenv `_ is the package manager. -- ``make setup`` will setup the project. -- ``make setup-ot2`` will setup the project as it is on the OT2. -- ``make test`` will run the unit tests. -- ``make lint`` will run type checking and linting. -- ``make dev`` will run the server application locally in dev mode. - -Project -------- -``notify_server`` is the root package and contains the following subpackages. - -server -=============== -The ``server`` package contains the server application. - -clients -======= -The ``clients`` package has two client implementations: a subscriber and a publisher. - -Asyncio Publisher Client Example -........................ - -.. code-block:: python - - from datetime import datetime - from notify_server.models.event import Event - from notify_server.models.payload_type import UserData - from notify_server.clients.publisher import create - - async def run(): - # Create the async publisher client - pub = create("ipc:///tmp/notify-server") - - # Create a data event - my_event = Event( - createdOn=datetime.now(), - publisher="my_publisher", - data=UserData(data={ - "whatever_i_want": True - }) - ) - - # Publish an event - await pub.send(topic="topic", event=my_event) - -Publisher Client Example -........................ - -.. code-block:: python - - from datetime import datetime - from notify_server.models.event import Event - from notify_server.models.payload_type import UserData - from notify_server.clients.publisher import create - - def run(): - # Create the async publisher client - pub = create("ipc:///tmp/notify-server") - - # Create a data event - my_event = Event( - createdOn=datetime.now(), - publisher="my_publisher", - data=UserData(data={ - "whatever_i_want": True - }) - ) - - # Publish an event - pub.send_nowait(topic="topic", event=my_event) - - -Subscriber Client Example -......................... - -.. code-block:: python - - from notify_server.clients.subscriber import create - - async def run(): - # Create the async subscriber client. - subscriber = create("tcp://localhost:5555", - ["topic"]) - - # Use the async iterator interface to wait for events. - async for e in subscriber: - print(f"{e.event.createdOn}: topic={e.topic}, " - f"publisher={e.event.publisher}, data={e.event.data}") - - -Subscriber Application -...................... -The ``notify_server.app_sub`` script is a useful application. It prints events from any number of topics to stdout. - -To start from the command line: - -.. code-block:: bash - - python -m notify_server.app_sub -s tcp://localhost:5555 topic1 topic2 - -models -======= -The ``models`` package defines event models. diff --git a/notify-server/buildroot.mk b/notify-server/buildroot.mk deleted file mode 100644 index e4c27962a70..00000000000 --- a/notify-server/buildroot.mk +++ /dev/null @@ -1,42 +0,0 @@ -################################################################################ -# -# python-opentrons-notify-server -# -################################################################################ - - -define OTNOTIFYSERVER_CALL_PBU - $(shell python $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)/scripts/python_build_utils.py notify-server $(or $(OPENTRONS_PROJECT),robot-stack) $(1)) -endef - -PYTHON_OPENTRONS_NOTIFY_SERVER_VERSION = $(call OTNOTIFYSERVER_CALL_PBU,get_version) -PYTHON_OPENTRONS_NOTIFY_SERVER_LICENSE = Apache-2 -PYTHON_OPENTRONS_NOTIFY_SERVER_LICENSE_FILES = $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)/LICENSE -PYTHON_OPENTRONS_NOTIFY_SERVER_SETUP_TYPE = setuptools -PYTHON_OPENTRONS_NOTIFY_SERVER_SITE_METHOD = local -PYTHON_OPENTRONS_NOTIFY_SERVER_SITE = $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH) -PYTHON_OPENTRONS_NOTIFY_SERVER_SUBDIR = notify-server -PYTHON_OPENTRONS_NOTIFY_SERVER_POST_INSTALL_TARGET_HOOKS = PYTHON_OPENTRONS_NOTIFY_SERVER_INSTALL_VERSION -PYTHON_OPENTRONS_NOTIFY_SERVER_SERVICE_FILE_NAME=opentrons-notify-server.service - -define PYTHON_OPENTRONS_NOTIFY_SERVER_INSTALL_VERSION - echo '$(call OTNOTIFYSERVER_CALL_PBU,dump_br_version)' > $(BINARIES_DIR)/opentrons-notify-server-version.json -endef - -ot_notify_server_name := python-opentrons-notify-server - -define PYTHON_OPENTRONS_NOTIFY_SERVER_INSTALL_INIT_SYSTEMD - $(INSTALL) -D -m 0644 $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)/notify-server/$(PYTHON_OPENTRONS_NOTIFY_SERVER_SERVICE_FILE_NAME) \ - $(TARGET_DIR)/etc/systemd/system/$(PYTHON_OPENTRONS_NOTIFY_SERVER_SERVICE_FILE_NAME) - - mkdir -p $(TARGET_DIR)/etc/systemd/system/opentrons.target.wants - - ln -sf ../$(PYTHON_OPENTRONS_NOTIFY_SERVER_SERVICE_FILE_NAME) \ - $(TARGET_DIR)/etc/systemd/system/opentrons.target.wants/$(PYTHON_OPENTRONS_NOTIFY_SERVER_SERVICE_FILE_NAME) -endef -export OPENTRONS_GIT_DIR=$(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH) - -# Calling inner-python-package directly instead of using python-package macro -# because our directory layout doesn’t conform to buildroot’s expectation of -# having the directory name be the package name -$(eval $(call inner-python-package,$(ot_notify_server_name),$(call UPPERCASE,$(ot_notify_server_name)),$(call UPPERCASE,$(ot_notify_server_name)),target)) diff --git a/notify-server/mypy.ini b/notify-server/mypy.ini deleted file mode 100644 index ca00171ad28..00000000000 --- a/notify-server/mypy.ini +++ /dev/null @@ -1,13 +0,0 @@ -[mypy] -files = notify_server,tests -follow_imports = silent -disallow_untyped_defs = True -warn_redundant_casts = True -warn_unused_ignores = True -warn_return_any = True -warn_unreachable = True -strict_equality = True -show_error_codes = True - -[mypy-tests.*] -disallow_untyped_defs = False diff --git a/notify-server/notify_server/__init__.py b/notify-server/notify_server/__init__.py deleted file mode 100644 index 30684af468a..00000000000 --- a/notify-server/notify_server/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Notify Server Package.""" diff --git a/notify-server/notify_server/app_sub.py b/notify-server/notify_server/app_sub.py deleted file mode 100644 index a6182eb0a0a..00000000000 --- a/notify-server/notify_server/app_sub.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Subscriber client application.""" -import asyncio -import argparse -from typing import List - -from notify_server.clients.subscriber import create - - -async def run(host_address: str, topics: List[str]) -> None: - """Run the subscriber client.""" - print(f"Connecting to {host_address} for topics '{topics}'") - sub = create(host_address, topics) - async for e in sub: - print( - f"{e.event.createdOn}: topic={e.topic}, " - f"publisher={e.event.publisher}, data={e.event.data}" - ) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - prog="opentrons-subscriber", - description="Opentrons notify-server subscriber client", - ) - parser.add_argument( - "-s", - "--server-address", - required=True, - help="The address of the notify-server, for " "example tcp://localhost:5555", - ) - parser.add_argument( - "topics", nargs="+", help="At least one topic that will be subscribed to." - ) - args = parser.parse_args() - asyncio.run(run(host_address=args.server_address, topics=args.topics)) diff --git a/notify-server/notify_server/clients/__init__.py b/notify-server/notify_server/clients/__init__.py deleted file mode 100644 index c79b5afaf2f..00000000000 --- a/notify-server/notify_server/clients/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Clients package.""" diff --git a/notify-server/notify_server/clients/publisher.py b/notify-server/notify_server/clients/publisher.py deleted file mode 100644 index 9fa1477a757..00000000000 --- a/notify-server/notify_server/clients/publisher.py +++ /dev/null @@ -1,42 +0,0 @@ -"""A publisher client.""" -from __future__ import annotations - -import logging -from asyncio import Future -from typing import Any - -from notify_server.clients.serdes import to_frames -from notify_server.models.event import Event -from notify_server.network.connection import create_push, Connection - -log = logging.getLogger(__name__) - - -def create(host_address: str) -> Publisher: - """ - Construct a publisher. - - :param host_address: uri to connect to. - """ - return Publisher(connection=create_push(host_address)) - - -class Publisher: - """Publisher class.""" - - def __init__(self, connection: Connection) -> None: - """Construct a Publisher.""" - self._connection = connection - - async def send(self, topic: str, event: Event) -> None: - """Publish an event to a topic.""" - await self.send_nowait(topic=topic, event=event) - - def send_nowait(self, topic: str, event: Event) -> Future[Any]: - """Publish an event to a topic without waiting for completion.""" - frames = to_frames(topic=topic, event=event) - return self._connection.send_multipart(frames) - - def close(self) -> None: - """Close the connection.""" - self._connection.close() diff --git a/notify-server/notify_server/clients/serdes.py b/notify-server/notify_server/clients/serdes.py deleted file mode 100644 index 0727327840e..00000000000 --- a/notify-server/notify_server/clients/serdes.py +++ /dev/null @@ -1,65 +0,0 @@ -"""Methods and types for serializing and deserializing frames.""" -from __future__ import annotations - -from typing import List - -from pydantic import BaseModel - -from notify_server.models.event import Event - - -class MalformedFrames(Exception): - """Exception raised on badly formed frames.""" - - pass - - -class FrameEncodingError(Exception): - """Exception raise on encoding error.""" - - pass - - -def to_frames(topic: str, event: Event) -> List[bytes]: - """ - Create zmq frames from members. - - :raises: FrameEncodingError - """ - try: - event_json = event.json() - except (ValueError, TypeError) as e: - # Could not serialize event to json. - raise FrameEncodingError() from e - - return [ - bytes(v, "utf-8") - for v in ( - topic, - event_json, - ) - ] - - -class TopicEvent(BaseModel): - """An event received by a topic subscriber.""" - - topic: str - event: Event - - -def from_frames(frames: List[bytes]) -> TopicEvent: - """ - Create an object from a zmq frame. - - The frame must have two entries: a topic, a json serialized Event - object. - - :raises: MalformedFrame - """ - try: - return TopicEvent( - topic=frames[0].decode("utf-8"), event=Event.parse_raw((frames[1])) - ) - except (ValueError, IndexError, AttributeError) as e: - raise MalformedFrames() from e diff --git a/notify-server/notify_server/clients/subscriber.py b/notify-server/notify_server/clients/subscriber.py deleted file mode 100644 index 7e4add7f7e8..00000000000 --- a/notify-server/notify_server/clients/subscriber.py +++ /dev/null @@ -1,46 +0,0 @@ -"""Subscriber client.""" -from __future__ import annotations - -import logging -import typing - -from notify_server.clients.serdes import TopicEvent, from_frames -from notify_server.network.connection import create_subscriber, Connection - -log = logging.getLogger(__name__) - - -def create(host_address: str, topics: typing.Sequence[str]) -> Subscriber: - """ - Create a subscriber. - - :param host_address: The server notify_server address - :param topics: The topics to subscribe to. - :return: A Subscriber instance. - """ - return Subscriber(create_subscriber(host_address, topics)) - - -class Subscriber: - """Async Subscriber class.""" - - def __init__(self, connection: Connection) -> None: - """Construct.""" - self._connection = connection - - def close(self) -> None: - """Stop the subscriber task.""" - self._connection.close() - - async def next_event(self) -> TopicEvent: - """Get next event.""" - s = await self._connection.recv_multipart() - return from_frames(s) - - def __aiter__(self) -> "Subscriber": - """Create an async iterator.""" - return self - - async def __anext__(self) -> TopicEvent: - """Get next event.""" - return await self.next_event() diff --git a/notify-server/notify_server/logging.py b/notify-server/notify_server/logging.py deleted file mode 100644 index ca777c3c1ef..00000000000 --- a/notify-server/notify_server/logging.py +++ /dev/null @@ -1,71 +0,0 @@ -"""Logging configuration.""" - -import logging -from logging.config import dictConfig -from typing import Dict, Any - - -def initialize_logging(production: bool) -> None: - """Initialize logging.""" - if production: - c = _production_log_config() - else: - c = _dev_log_config() - dictConfig(c) - - -def _production_log_config() -> Dict[str, Any]: - """Log configuration for robot deployment.""" - lvl = logging.INFO - return { - "version": 1, - "disable_existing_loggers": False, - "formatters": { - "message_only": {"format": "%(message)s"}, - }, - "handlers": { - "notify_server": { - "class": "systemd.journal.JournalHandler", - "level": lvl, - "formatter": "message_only", - "SYSLOG_IDENTIFIER": "opentrons-notify-server", - } - }, - "loggers": { - "notify_server": { - "handlers": ["notify_server"], - "level": lvl, - "propagate": False, - }, - }, - "root": {"handlers": ["notify_server"], "level": lvl}, - } - - -def _dev_log_config() -> Dict[str, Any]: - """Log configuration for local dev deployment.""" - lvl = logging.DEBUG - return { - "version": 1, - "disable_existing_loggers": False, - "formatters": { - "basic": { - "format": "%(asctime)s %(name)s %(levelname)s [Line %(lineno)s] %(message)s" - }, - }, - "handlers": { - "notify_server": { - "class": "logging.StreamHandler", - "level": lvl, - "formatter": "basic", - } - }, - "loggers": { - "notify_server": { - "handlers": ["notify_server"], - "level": lvl, - "propagate": False, - }, - }, - "root": {"handlers": ["notify_server"], "level": lvl}, - } diff --git a/notify-server/notify_server/main.py b/notify-server/notify_server/main.py deleted file mode 100644 index c572ebd725b..00000000000 --- a/notify-server/notify_server/main.py +++ /dev/null @@ -1,23 +0,0 @@ -"""The main entry point of the server application.""" - -import logging -import asyncio -from . import server - -from notify_server.logging import initialize_logging -from notify_server.settings import Settings - - -log = logging.getLogger(__name__) - - -async def run() -> None: - """Entry point for the application.""" - settings = Settings() - initialize_logging(settings.production) - log.info(settings) - await server.run(settings) - - -if __name__ == "__main__": - asyncio.run(run()) diff --git a/notify-server/notify_server/models/__init__.py b/notify-server/notify_server/models/__init__.py deleted file mode 100644 index f255d535c93..00000000000 --- a/notify-server/notify_server/models/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""The notify server model package.""" diff --git a/notify-server/notify_server/models/event.py b/notify-server/notify_server/models/event.py deleted file mode 100644 index 25a190a93ec..00000000000 --- a/notify-server/notify_server/models/event.py +++ /dev/null @@ -1,15 +0,0 @@ -"""The Event model.""" - -from datetime import datetime - -from pydantic import BaseModel, Field - -from notify_server.models.payload_type import PayloadType - - -class Event(BaseModel): - """The type of published events.""" - - createdOn: datetime = Field(..., description="When this event was created") - publisher: str = Field(..., description="Creator of this event") - data: PayloadType = Field(..., description="Payload of the event") diff --git a/notify-server/notify_server/models/hardware_event/__init__.py b/notify-server/notify_server/models/hardware_event/__init__.py deleted file mode 100644 index cfd885a975a..00000000000 --- a/notify-server/notify_server/models/hardware_event/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -"""Definitions of hardware event payloads.""" -from typing import Union - -from .door_state import DoorStatePayload - - -HardwareEventPayload = Union[DoorStatePayload] - -__all__ = ["HardwareEventPayload", "DoorStatePayload"] diff --git a/notify-server/notify_server/models/hardware_event/door_state.py b/notify-server/notify_server/models/hardware_event/door_state.py deleted file mode 100644 index c931f7cdee1..00000000000 --- a/notify-server/notify_server/models/hardware_event/door_state.py +++ /dev/null @@ -1,14 +0,0 @@ -"""Model the door state event.""" -from opentrons.hardware_control.types import DoorState -from typing_extensions import Literal - -from pydantic import BaseModel - -from notify_server.models.hardware_event.names import HardwareEventName - - -class DoorStatePayload(BaseModel): - """The payload in a "door_state" event.""" - - event: Literal[HardwareEventName.DOOR_STATE] = HardwareEventName.DOOR_STATE - state: DoorState diff --git a/notify-server/notify_server/models/hardware_event/names.py b/notify-server/notify_server/models/hardware_event/names.py deleted file mode 100644 index b3e42291455..00000000000 --- a/notify-server/notify_server/models/hardware_event/names.py +++ /dev/null @@ -1,8 +0,0 @@ -"""The hardware event names.""" -from enum import Enum - - -class HardwareEventName(str, Enum): - """The hardware event name enumeration.""" - - DOOR_STATE = "door_state" diff --git a/notify-server/notify_server/models/payload_type.py b/notify-server/notify_server/models/payload_type.py deleted file mode 100644 index 59516c5039b..00000000000 --- a/notify-server/notify_server/models/payload_type.py +++ /dev/null @@ -1,20 +0,0 @@ -"""The definition of payload types.""" -from typing import Union, Dict, Any -from typing_extensions import Literal - -from pydantic import BaseModel - -from notify_server.models.hardware_event import HardwareEventPayload - - -class UserData(BaseModel): - """Flexible user defined data.""" - - type: Literal["UserData"] = "UserData" - data: Dict[Any, Any] - - -PayloadType = Union[ - UserData, - HardwareEventPayload, -] diff --git a/notify-server/notify_server/models/topics.py b/notify-server/notify_server/models/topics.py deleted file mode 100644 index 146f3cfbbdb..00000000000 --- a/notify-server/notify_server/models/topics.py +++ /dev/null @@ -1,8 +0,0 @@ -"""Event topics.""" -import enum - - -class RobotEventTopics(str, enum.Enum): - """All robot-server event topics.""" - - HARDWARE_EVENTS = "hardware_events" diff --git a/notify-server/notify_server/network/__init__.py b/notify-server/notify_server/network/__init__.py deleted file mode 100644 index 93d814eaf90..00000000000 --- a/notify-server/notify_server/network/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Network package.""" diff --git a/notify-server/notify_server/network/connection.py b/notify-server/notify_server/network/connection.py deleted file mode 100644 index d46dae5124f..00000000000 --- a/notify-server/notify_server/network/connection.py +++ /dev/null @@ -1,84 +0,0 @@ -"""Connection module.""" -from __future__ import annotations - -import logging -from asyncio import Future -from typing import List, Any, Sequence - -import zmq # type: ignore -from zmq.asyncio import Context # type: ignore -from zmq.asyncio import Socket - - -log = logging.getLogger(__name__) - - -def create_pull(address: str) -> Connection: - """Create a PULL server connection.""" - ctx = Context.instance() - sock = ctx.socket(zmq.PULL) - - log.info("Puller binding to %s", address) - sock.bind(address) - - return Connection(sock) - - -def create_push(address: str) -> Connection: - """Create a PUSH client connection.""" - ctx = Context.instance() - sock = ctx.socket(zmq.PUSH) - - log.info("Pusher connecting to %s", address) - sock.connect(address) - - return Connection(sock) - - -def create_publisher(address: str) -> Connection: - """Create a PUB client connection.""" - ctx = Context.instance() - sock = ctx.socket(zmq.PUB) - - log.info("Publisher binding to %s", address) - sock.bind(address) - - return Connection(sock) - - -def create_subscriber(address: str, topics: Sequence[str]) -> Connection: - """Create a SUB client connection.""" - ctx = Context.instance() - sock = ctx.socket(zmq.SUB) - - log.info("Subscriber connecting to %s", address) - sock.connect(address) - - log.info("Subscribing to %s", topics) - for t in topics: - sock.subscribe(t) - - return Connection(sock) - - -class Connection: - """Wrapper for a connected zmq socket.""" - - def __init__(self, socket: Socket) -> None: - """Construct.""" - self._socket = socket - - def send_multipart(self, frames: List[bytes]) -> Future[Any]: - """Send a multipart message.""" - # Type ignore is due to zmq not providing type annotation. - return self._socket.send_multipart(frames) # type: ignore - - def recv_multipart(self) -> Future[Any]: - """Recv a multipart message.""" - # Type ignore is due to zmq not providing type annotation. - return self._socket.recv_multipart() # type: ignore - - def close(self) -> None: - """Close the socket.""" - log.debug("Closing socket") - self._socket.close() diff --git a/notify-server/notify_server/py.typed b/notify-server/notify_server/py.typed deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/notify-server/notify_server/server/__init__.py b/notify-server/notify_server/server/__init__.py deleted file mode 100644 index aad056b8425..00000000000 --- a/notify-server/notify_server/server/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Server package initialization.""" - -from .server import run - -__all__ = ["run"] diff --git a/notify-server/notify_server/server/server.py b/notify-server/notify_server/server/server.py deleted file mode 100644 index 28eb627b4de..00000000000 --- a/notify-server/notify_server/server/server.py +++ /dev/null @@ -1,68 +0,0 @@ -"""Server execution functions.""" - -import logging -import asyncio -from asyncio import Queue - -from notify_server.network.connection import create_publisher, create_pull, Connection -from notify_server.settings import Settings - -log = logging.getLogger(__name__) - - -async def _publisher_server_task(connection: Connection, queue: Queue) -> None: - """ - Run a task that reads multipart messages: topic, data. - - This is the publisher server. Clients connect using zmq.PUSH pattern and - send messages to topics. Each topic, data pair is enqueued in queue. - - :param connection: The network connection. - :param queue: Queue for received messages. - :return: None - """ - try: - while True: - m = await connection.recv_multipart() - log.debug("Event: %s", m) - await queue.put(m) - except asyncio.CancelledError: - log.exception("Done") - finally: - connection.close() - - -async def _subscriber_server_task(connection: Connection, queue: Queue) -> None: - """ - Run a task that publishes messages to subscribers. - - :param connection: The network connection. - :param queue: The queue of multipart messages to send - :return: None - """ - try: - while True: - s = await queue.get() - log.debug("Publishing: %s", s) - await connection.send_multipart(s) - except asyncio.CancelledError: - log.exception("Done") - finally: - connection.close() - - -async def run(settings: Settings) -> None: - """Run the server tasks. Will not return.""" - queue: Queue = Queue() - - subtask = asyncio.create_task( - _subscriber_server_task( - create_publisher(settings.subscriber_address.connection_string()), queue - ) - ) - pubtask = asyncio.create_task( - _publisher_server_task( - create_pull(settings.publisher_address.connection_string()), queue - ) - ) - await asyncio.gather(subtask, pubtask) diff --git a/notify-server/notify_server/settings.py b/notify-server/notify_server/settings.py deleted file mode 100644 index 5081f697af4..00000000000 --- a/notify-server/notify_server/settings.py +++ /dev/null @@ -1,39 +0,0 @@ -"""Settings class.""" - -from typing_extensions import Literal -from pydantic import BaseSettings, BaseModel, Field - - -class ServerBindAddress(BaseModel): - """A bind address for server zmq socket.""" - - scheme: Literal["ipc", "tcp"] - host: str = "*" - port: int = 5555 - path: str = "/tmp/notify-server" - - def connection_string(self) -> str: - """Create the connection string.""" - if self.scheme == "ipc": - remainder = self.path - else: - remainder = f"{self.host}:{self.port}" - return f"{self.scheme}://{remainder}" - - -class Settings(BaseSettings): - """Application Settings.""" - - publisher_address: ServerBindAddress = ServerBindAddress(scheme="ipc") - subscriber_address: ServerBindAddress = ServerBindAddress(scheme="tcp") - - production: bool = Field( - True, - description="Whether this the application is running in a " - "development environment", - ) - - class Config: - """Configuration for settings class.""" - - env_prefix = "OT_NOTIFY_SERVER_" diff --git a/notify-server/opentrons-notify-server.service b/notify-server/opentrons-notify-server.service deleted file mode 100644 index 3ef14a863e3..00000000000 --- a/notify-server/opentrons-notify-server.service +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=Opentrons Notification Server - -[Service] -ExecStart=python -m notify_server.main -Restart=on-failure - -[Install] -WantedBy=opentrons-robot-server.service diff --git a/notify-server/pytest.ini b/notify-server/pytest.ini deleted file mode 100644 index d91f130ad60..00000000000 --- a/notify-server/pytest.ini +++ /dev/null @@ -1,3 +0,0 @@ -[pytest] -addopts = --strict-markers -markers = env_var: marker used by settings unit test diff --git a/notify-server/setup.py b/notify-server/setup.py deleted file mode 100644 index 5cb1cb8e06e..00000000000 --- a/notify-server/setup.py +++ /dev/null @@ -1,85 +0,0 @@ -# Inspired by: -# https://hynek.me/articles/sharing-your-labor-of-love-pypi-quick-and-dirty/ -import sys -import codecs -import os -import os.path -from setuptools import setup, find_packages - -HERE = os.path.abspath(os.path.dirname(__file__)) -sys.path.append(os.path.join(HERE, "..", "scripts")) - -from python_build_utils import normalize_version - - -def get_version(): - buildno = os.getenv("BUILD_NUMBER") - project = os.getenv("OPENTRONS_PROJECT", "robot-stack") - git_dir = os.getenv("OPENTRONS_GIT_DIR", None) - if buildno: - normalize_opts = {"extra_tag": buildno} - else: - normalize_opts = {} - return normalize_version( - "notify-server", project, git_dir=git_dir, **normalize_opts - ) - - -VERSION = get_version() - -DISTNAME = "notify_server" -LICENSE = "Apache 2.0" -AUTHOR = "Opentrons" -EMAIL = "engineering@opentrons.com" -URL = "https://github.com/Opentrons/opentrons" -DOWNLOAD_URL = "" -CLASSIFIERS = [ - "Development Status :: 5 - Production/Stable", - "Environment :: Console", - "Operating System :: OS Independent", - "Intended Audience :: Science/Research", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", - "Topic :: Scientific/Engineering", -] -KEYWORDS = ["robots", "protocols", "synbio", "pcr", "automation", "lab"] -DESCRIPTION = "A pub sub system for the Opentrons OT2" -PACKAGES = find_packages(where=".", exclude=["tests.*", "tests"]) -INSTALL_REQUIRES = [ - f"opentrons=={VERSION}", - f"opentrons-shared-data=={VERSION}", - "pyzmq==19.0.2", - "pydantic==1.9.2", -] - - -def read(*parts): - """ - Build an absolute path from *parts* and and return the contents of the - resulting file. Assume UTF-8 encoding. - """ - with codecs.open(os.path.join(HERE, *parts), "rb", "utf-8") as f: - return f.read() - - -if __name__ == "__main__": - setup( - python_requires=">=3.7", - name=DISTNAME, - description=DESCRIPTION, - license=LICENSE, - url=URL, - version=VERSION, - author=AUTHOR, - author_email=EMAIL, - maintainer=AUTHOR, - maintainer_email=EMAIL, - keywords=KEYWORDS, - long_description=read("README.rst"), - packages=PACKAGES, - zip_safe=False, - classifiers=CLASSIFIERS, - install_requires=INSTALL_REQUIRES, - include_package_data=True, - ) diff --git a/notify-server/tests/__init__.py b/notify-server/tests/__init__.py deleted file mode 100644 index 46816ddf5e7..00000000000 --- a/notify-server/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Tests package.""" diff --git a/notify-server/tests/conftest.py b/notify-server/tests/conftest.py deleted file mode 100644 index c498acd2694..00000000000 --- a/notify-server/tests/conftest.py +++ /dev/null @@ -1,16 +0,0 @@ -"""Pytest conf.""" -from datetime import datetime -import pytest - -from notify_server.models.event import Event -from notify_server.models.payload_type import UserData - - -@pytest.fixture -def event() -> Event: - """Event fixture.""" - return Event( - createdOn=datetime(2000, 1, 1), - publisher="pub", - data=UserData(data={"val1": 1, "val2": 2}), - ) diff --git a/notify-server/tests/integration/__init__.py b/notify-server/tests/integration/__init__.py deleted file mode 100644 index c66cd71b7e1..00000000000 --- a/notify-server/tests/integration/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Integration tests package.""" diff --git a/notify-server/tests/integration/conftest.py b/notify-server/tests/integration/conftest.py deleted file mode 100644 index ad8ceb82bfc..00000000000 --- a/notify-server/tests/integration/conftest.py +++ /dev/null @@ -1,45 +0,0 @@ -"""Integration test fixtures.""" - -import json -from asyncio import Task -from os import environ -import asyncio -from typing import AsyncGenerator - -import pytest - -from notify_server.settings import Settings - - -@pytest.fixture(scope="session") -def integration_environment() -> None: - """Set up the settings environment.""" - # Set up the publisher and server addresses. - environ["OT_NOTIFY_SERVER_publisher_address"] = json.dumps( - {"scheme": "tcp", "host": "127.0.0.1", "port": 5555} - ) - environ["OT_NOTIFY_SERVER_subscriber_address"] = json.dumps( - {"scheme": "tcp", "host": "127.0.0.1", "port": 5556} - ) - # Set production to false - environ["OT_NOTIFY_SERVER_production"] = "false" - - -@pytest.fixture(scope="session") -def settings(integration_environment: None) -> Settings: - """Create Settings.""" - return Settings() - - -@pytest.fixture -async def server_fixture(integration_environment: None) -> AsyncGenerator[Task, None]: - """Server fixture.""" - from notify_server.main import run - - task = asyncio.create_task(run()) - yield task - task.cancel() - try: - await task - except asyncio.CancelledError: - pass diff --git a/notify-server/tests/integration/test_pub_sub.py b/notify-server/tests/integration/test_pub_sub.py deleted file mode 100644 index 393c87d0fd7..00000000000 --- a/notify-server/tests/integration/test_pub_sub.py +++ /dev/null @@ -1,79 +0,0 @@ -"""Pub sub integration tests.""" -from asyncio import Task, sleep -from typing import AsyncGenerator, Tuple - -import pytest - -from notify_server.clients import publisher, subscriber -from notify_server.models.event import Event -from notify_server.settings import Settings - -pytestmark = pytest.mark.asyncio - -TOPICS = "topic1", "topic2" - - -@pytest.fixture -async def two_publishers( - settings: Settings, -) -> AsyncGenerator[Tuple[publisher.Publisher, publisher.Publisher], None]: - """Create two publishers.""" - pub1 = publisher.create(settings.publisher_address.connection_string()) - pub2 = publisher.create(settings.publisher_address.connection_string()) - yield pub1, pub2 - pub1.close() - pub2.close() - - -@pytest.fixture -async def subscriber_all_topics( - settings: Settings, -) -> AsyncGenerator[subscriber.Subscriber, None]: - """Create subscriber for all topics.""" - sub = subscriber.create(settings.subscriber_address.connection_string(), TOPICS) - yield sub - sub.close() - - -@pytest.fixture -async def subscriber_first_topic( - settings: Settings, -) -> AsyncGenerator[subscriber.Subscriber, None]: - """Create subscriber for first topic.""" - sub = subscriber.create( - settings.subscriber_address.connection_string(), (TOPICS[0],) - ) - yield sub - sub.close() - - -async def test_two_pub_two_sub_two_topics( - server_fixture: Task, - two_publishers: Tuple[publisher.Publisher, publisher.Publisher], - subscriber_all_topics: subscriber.Subscriber, - subscriber_first_topic: subscriber.Subscriber, - event: Event, -) -> None: - """Test that two publishers reaches two subscribers of different topics.""" - # TODO AL 2020-10-29: Super hacky sleep to wait for server task to get - # started. - # This test freezes in CI only. My theory is that there is a race - # condition. The server is not ready in time to get the first events. - await sleep(0.1) - - pub1, pub2 = two_publishers - - await pub1.send("topic1", event) - await pub2.send("topic2", event) - - e = await subscriber_first_topic.next_event() - assert e.topic == "topic1" - assert e.event == event - - e = await subscriber_all_topics.next_event() - assert e.topic == "topic1" - assert e.event == event - - e = await subscriber_all_topics.next_event() - assert e.topic == "topic2" - assert e.event == event diff --git a/notify-server/tests/unit/__init__.py b/notify-server/tests/unit/__init__.py deleted file mode 100644 index ea3f8b923c2..00000000000 --- a/notify-server/tests/unit/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Unit tests package.""" diff --git a/notify-server/tests/unit/clients/__init__.py b/notify-server/tests/unit/clients/__init__.py deleted file mode 100644 index e9df70eca23..00000000000 --- a/notify-server/tests/unit/clients/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Unit tests for clients package.""" diff --git a/notify-server/tests/unit/clients/test_serdes.py b/notify-server/tests/unit/clients/test_serdes.py deleted file mode 100644 index 323ae3263d0..00000000000 --- a/notify-server/tests/unit/clients/test_serdes.py +++ /dev/null @@ -1,34 +0,0 @@ -"""Unit tests for queue_entry module.""" -from typing import List - -import pytest -from notify_server.clients.serdes import ( - TopicEvent, - MalformedFrames, - to_frames, - from_frames, -) -from notify_server.models.event import Event - - -def test_to_frames(event: Event) -> None: - """Test that to_frames method creates a list of byte frames.""" - assert to_frames(topic="topic", event=event) == [ - b"topic", - event.json().encode("utf-8"), - ] - - -@pytest.mark.parametrize( - argnames=["frames"], argvalues=[[[]], [[b"a", b"{"]], [[b"a", b"{}"]]] -) -def test_entry_from_frames_fail(frames: List[bytes]) -> None: - """Test that an exception is raised on bad message.""" - with pytest.raises(MalformedFrames): - from_frames(frames) - - -def test_entry_from_frames(event: Event) -> None: - """Test that an object is created from_frames.""" - entry = from_frames([b"topic", event.json().encode("utf-8")]) - assert entry == TopicEvent(topic="topic", event=event) diff --git a/notify-server/tests/unit/models/__init__.py b/notify-server/tests/unit/models/__init__.py deleted file mode 100644 index cf750387603..00000000000 --- a/notify-server/tests/unit/models/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Unit tests for models package.""" diff --git a/notify-server/tests/unit/models/test_event.py b/notify-server/tests/unit/models/test_event.py deleted file mode 100644 index 76b0f628c91..00000000000 --- a/notify-server/tests/unit/models/test_event.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Unit tests for Event module.""" -from datetime import datetime -from typing import Dict, Any - -import pytest - -from notify_server.models.event import Event -from notify_server.models.payload_type import UserData - - -@pytest.mark.parametrize( - argnames=["data"], - argvalues=[ - # Empty - [{}], - # Unknown type - [{"type": "UserDataBoo"}], - # Missing Data - [{"type": "UserData"}], - # Wrong Types - [{"type": "UserData", "data": "Hello"}], - ], -) -def test_bad_data_attribute(data: Dict[str, Any]) -> None: - """Test that invalid data attribute will cause a validation error.""" - event = {"createdOn": datetime.now().isoformat(), "publisher": "pub", "data": data} - with pytest.raises(ValueError): - Event(**event) - - -@pytest.mark.parametrize( - argnames=["data", "expected"], - argvalues=[ - [ - {"type": "UserData", "data": {"val1": 123, "val2": "egg"}}, - UserData(data={"val1": 123, "val2": "egg"}), - ], - ], -) -def test_good_data(data: Dict[str, Any], expected: Event) -> None: - """Test that the data member is validated correctly.""" - event = {"createdOn": datetime.now().isoformat(), "publisher": "pub", "data": data} - assert expected == Event(**event).data diff --git a/notify-server/tests/unit/server/__init__.py b/notify-server/tests/unit/server/__init__.py deleted file mode 100644 index bd9da251801..00000000000 --- a/notify-server/tests/unit/server/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Server package unit tests.""" diff --git a/notify-server/tests/unit/test_logging.py b/notify-server/tests/unit/test_logging.py deleted file mode 100644 index ab6c82fdc19..00000000000 --- a/notify-server/tests/unit/test_logging.py +++ /dev/null @@ -1,48 +0,0 @@ -"""Logging config unit tests.""" -from typing import Generator -from unittest.mock import patch, MagicMock -import pytest -from notify_server import logging - - -@pytest.fixture -def patch_production_log_config() -> Generator[MagicMock, None, None]: - """Patch _production_log_config.""" - with patch.object(logging, "_production_log_config") as p: - yield p - - -@pytest.fixture -def patch_dev_log_config() -> Generator[MagicMock, None, None]: - """Patch _dev_log_config.""" - with patch.object(logging, "_dev_log_config") as p: - yield p - - -@pytest.fixture -def patch_dictconfig() -> Generator[MagicMock, None, None]: - """Patch dictConfig.""" - with patch.object(logging, "dictConfig") as p: - yield p - - -def test_prod( - patch_dictconfig: MagicMock, - patch_dev_log_config: MagicMock, - patch_production_log_config: MagicMock, -) -> None: - """Test that the correct log function is called.""" - logging.initialize_logging(True) - patch_dev_log_config.assert_not_called() - patch_production_log_config.assert_called_once() - - -def test_dev( - patch_dictconfig: MagicMock, - patch_dev_log_config: MagicMock, - patch_production_log_config: MagicMock, -) -> None: - """Test that the correct log function is called.""" - logging.initialize_logging(False) - patch_dev_log_config.assert_called_once() - patch_production_log_config.assert_not_called() diff --git a/notify-server/tests/unit/test_settings.py b/notify-server/tests/unit/test_settings.py deleted file mode 100644 index ebd8077f83a..00000000000 --- a/notify-server/tests/unit/test_settings.py +++ /dev/null @@ -1,71 +0,0 @@ -"""Settings unit tests.""" - -import json -import os -from typing import Generator, Dict, cast -from unittest.mock import patch, MagicMock -import pytest -from _pytest.fixtures import FixtureRequest - -from notify_server.settings import Settings, ServerBindAddress - - -@pytest.fixture -def envvar_patch() -> Generator[Dict[str, str], None, None]: - """Patch os.environ.""" - with patch.object(os, "environ", new=cast(Dict[str, str], dict())) as p: - yield p - - -@pytest.fixture -def port() -> int: - """Port fixture.""" - return 4444 - - -@pytest.fixture -def scheme() -> str: - """Scheme fixture.""" - return "ipc" - - -@pytest.fixture -def server_address_override( - request: FixtureRequest, envvar_patch: MagicMock, port: int, scheme: str -) -> None: - """Fixture that overrides a server address environment variable.""" - marker = request.node.get_closest_marker("env_var") - obj = {"scheme": scheme, "port": port} - envvar_patch[marker.args[0]] = json.dumps(obj) - - -@pytest.mark.env_var("OT_NOTIFY_SERVER_publisher_address") -def test_override_publisher_address( - server_address_override: None, port: int, scheme: str -) -> None: - """Test environment var override.""" - s = Settings() - assert s.publisher_address.port == port - assert s.publisher_address.scheme == scheme - - -@pytest.mark.env_var("OT_NOTIFY_SERVER_subscriber_address") -def test_override_subscriber_address( - server_address_override: None, port: int, scheme: str -) -> None: - """Test environment var override.""" - s = Settings() - assert s.subscriber_address.port == port - assert s.subscriber_address.scheme == scheme - - -@pytest.mark.parametrize( - argnames=["address", "expected"], - argvalues=[ - [ServerBindAddress(scheme="tcp", port=1234), "tcp://*:1234"], - [ServerBindAddress(scheme="ipc", path="/afile"), "ipc:///afile"], - ], -) -def test_connection_string(address: ServerBindAddress, expected: str) -> None: - """Test creation of zmq host address from settings.""" - assert address.connection_string() == expected diff --git a/robot-server/Config.in b/robot-server/Config.in index fbef2f4fad5..b829d640d9b 100644 --- a/robot-server/Config.in +++ b/robot-server/Config.in @@ -3,7 +3,6 @@ config BR2_PACKAGE_PYTHON_OPENTRONS_ROBOT_SERVER depends on BR2_PACKAGE_PYTHON3 select BR2_PACKAGE_PYTHON_OPENTRONS_API # runtime select BR2_PACKAGE_PYTHON_OPENTRONS_SHARED_DATA # runtime - select BR2_PACKAGE_PYTHON_OPENTRONS_NOTIFY_SERVER # runtime select BR2_PACKAGE_PYTHON_OPENTRONS_SERVER_UTILS # runtime select BR2_PACKAGE_PYTHON_ANYIO # runtime select BR2_PACKAGE_PYTHON_FASTAPI # runtime diff --git a/robot-server/Pipfile b/robot-server/Pipfile index 2d0c7a5b9c8..0007a8f0da3 100755 --- a/robot-server/Pipfile +++ b/robot-server/Pipfile @@ -55,6 +55,5 @@ aiosqlite = "==0.17.0" opentrons-hardware = {editable = true, path='../hardware', extras=['FLEX']} opentrons = { editable = true, path = "../api"} opentrons-shared-data = { editable = true, path = "../shared-data/python" } -notify-server = { editable = true, path = "../notify-server"} server-utils = {editable = true, path = "./../server-utils"} robot-server = { editable = true, path = "."} diff --git a/robot-server/Pipfile.lock b/robot-server/Pipfile.lock index cc6ce23bb39..f932e667400 100644 --- a/robot-server/Pipfile.lock +++ b/robot-server/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "0c772d3b51c68a7e5ca13e69d2f7ce9360f2a2d37c562f3856dd2be5d382e5ad" + "sha256": "b54ccd56fbeba707cb1a93b887360d66ea97ab72b01beb64ce3ac1139f871c05" }, "pipfile-spec": 6, "requires": { @@ -161,10 +161,6 @@ "markers": "platform_system != 'Windows'", "version": "==1.0.7" }, - "notify-server": { - "editable": true, - "path": "../notify-server" - }, "numpy": { "hashes": [ "sha256:004f0efcb2fe1c0bd6ae1fcfc69cc8b6bf2407e0f18be308612007a0762b4089", @@ -339,44 +335,6 @@ "index": "pypi", "version": "==0.0.5" }, - "pyzmq": { - "hashes": [ - "sha256:00dca814469436455399660247d74045172955459c0bd49b54a540ce4d652185", - "sha256:046b92e860914e39612e84fa760fc3f16054d268c11e0e25dcb011fb1bc6a075", - "sha256:09d24a80ccb8cbda1af6ed8eb26b005b6743e58e9290566d2a6841f4e31fa8e0", - "sha256:0a422fc290d03958899743db091f8154958410fc76ce7ee0ceb66150f72c2c97", - "sha256:18189fc59ff5bf46b7ccf5a65c1963326dbfc85a2bc73e9f4a90a40322b992c8", - "sha256:276ad604bffd70992a386a84bea34883e696a6b22e7378053e5d3227321d9702", - "sha256:296540a065c8c21b26d63e3cea2d1d57902373b16e4256afe46422691903a438", - "sha256:29d51279060d0a70f551663bc592418bcad7f4be4eea7b324f6dd81de05cb4c1", - "sha256:36ab114021c0cab1a423fe6689355e8f813979f2c750968833b318c1fa10a0fd", - "sha256:3fa6debf4bf9412e59353defad1f8035a1e68b66095a94ead8f7a61ae90b2675", - "sha256:5120c64646e75f6db20cc16b9a94203926ead5d633de9feba4f137004241221d", - "sha256:59f1e54627483dcf61c663941d94c4af9bf4163aec334171686cdaee67974fe5", - "sha256:5d9fc809aa8d636e757e4ced2302569d6e60e9b9c26114a83f0d9d6519c40493", - "sha256:654d3e06a4edc566b416c10293064732516cf8871a4522e0a2ba00cc2a2e600c", - "sha256:720d2b6083498a9281eaee3f2927486e9fe02cd16d13a844f2e95217f243efea", - "sha256:73483a2caaa0264ac717af33d6fb3f143d8379e60a422730ee8d010526ce1913", - "sha256:8a6ada5a3f719bf46a04ba38595073df8d6b067316c011180102ba2a1925f5b5", - "sha256:8b66b94fe6243d2d1d89bca336b2424399aac57932858b9a30309803ffc28112", - "sha256:949a219493a861c263b75a16588eadeeeab08f372e25ff4a15a00f73dfe341f4", - "sha256:99cc0e339a731c6a34109e5c4072aaa06d8e32c0b93dc2c2d90345dd45fa196c", - "sha256:a7e7f930039ee0c4c26e4dfee015f20bd6919cd8b97c9cd7afbde2923a5167b6", - "sha256:ab0d01148d13854de716786ca73701012e07dff4dfbbd68c4e06d8888743526e", - "sha256:b1dd4cf4c5e09cbeef0aee83f3b8af1e9986c086a8927b261c042655607571e8", - "sha256:c1a31cd42905b405530e92bdb70a8a56f048c8a371728b8acf9d746ecd4482c0", - "sha256:c20dd60b9428f532bc59f2ef6d3b1029a28fc790d408af82f871a7db03e722ff", - "sha256:c36ffe1e5aa35a1af6a96640d723d0d211c5f48841735c2aa8d034204e87eb87", - "sha256:c40fbb2b9933369e994b837ee72193d6a4c35dfb9a7c573257ef7ff28961272c", - "sha256:c6d653bab76b3925c65d4ac2ddbdffe09710f3f41cc7f177299e8c4498adb04a", - "sha256:d46fb17f5693244de83e434648b3dbb4f4b0fec88415d6cbab1c1452b6f2ae17", - "sha256:e36f12f503511d72d9bdfae11cadbadca22ff632ff67c1b5459f69756a029c19", - "sha256:f1a25a61495b6f7bb986accc5b597a3541d9bd3ef0016f50be16dbb32025b302", - "sha256:fa411b1d8f371d3a49d31b0789eb6da2537dadbb2aef74a43aa99a78195c3f76" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==19.0.2" - }, "robot-server": { "editable": true, "path": "." diff --git a/robot-server/mypy.ini b/robot-server/mypy.ini index 6464e2fe358..859a9f56eb7 100644 --- a/robot-server/mypy.ini +++ b/robot-server/mypy.ini @@ -10,7 +10,6 @@ exclude = (?x)( robot | service/labware | service/legacy - | service/notifications | service/pipette_offset | service/session | service/tip_length diff --git a/robot-server/robot_server/hardware.py b/robot-server/robot_server/hardware.py index 760580fcef2..be07ae99af6 100644 --- a/robot-server/robot_server/hardware.py +++ b/robot-server/robot_server/hardware.py @@ -5,7 +5,6 @@ from fastapi import Depends, status from typing import ( Callable, - Union, TYPE_CHECKING, cast, Awaitable, @@ -30,21 +29,12 @@ from opentrons.util.helpers import utc_now from opentrons.hardware_control import ThreadManagedHardware, HardwareControlAPI, API from opentrons.hardware_control.simulator_setup import load_simulator_thread_manager -from opentrons.hardware_control.types import ( - HardwareEvent, - DoorStateNotification, - StatusBarState, -) +from opentrons.hardware_control.types import StatusBarState from opentrons.protocols.api_support.deck_type import ( guess_from_global_config as guess_deck_type_from_global_config, ) from opentrons.protocol_engine import DeckType -from notify_server.clients import publisher -from notify_server.settings import Settings as NotifyServerSettings -from notify_server.models import event, topics -from notify_server.models.hardware_event import DoorStatePayload - from server_utils.fastapi_utils.app_state import ( AppState, AppStateAccessor, @@ -85,9 +75,6 @@ _postinit_task_accessor = AppStateAccessor["asyncio.Task[None]"]( "hardware_postinit_task" ) -_event_unsubscribe_accessor = AppStateAccessor[Callable[[], None]]( - "hardware_event_unsubscribe" -) _firmware_update_manager_accessor = AppStateAccessor[FirmwareUpdateManager]( "firmware_update_manager" ) @@ -122,12 +109,10 @@ async def clean_up_hardware(app_state: AppState) -> None: """Shutdown the HardwareAPI singleton and remove it from global state.""" initialize_task = _init_task_accessor.get_from(app_state) thread_manager = _hw_api_accessor.get_from(app_state) - unsubscribe_from_events = _event_unsubscribe_accessor.get_from(app_state) postinit_task = _postinit_task_accessor.get_from(app_state) _init_task_accessor.set_on(app_state, None) _postinit_task_accessor.set_on(app_state, None) _hw_api_accessor.set_on(app_state, None) - _event_unsubscribe_accessor.set_on(app_state, None) if initialize_task is not None: initialize_task.cancel() @@ -138,9 +123,6 @@ async def clean_up_hardware(app_state: AppState) -> None: postinit_task.cancel() await asyncio.gather(postinit_task, return_exceptions=True) - if unsubscribe_from_events is not None: - unsubscribe_from_events() - if thread_manager is not None: thread_manager.clean_up() @@ -519,7 +501,6 @@ async def _initialize_hardware_api( app_state, app_settings, systemd_available ) - _initialize_event_watchers(app_state, hardware) _hw_api_accessor.set_on(app_state, hardware) for callback in callbacks: @@ -559,32 +540,3 @@ async def _initialize_hardware_api( # should be removed, log.exception("Exception during hardware background initialization.") raise - - -# TODO(mc, 2021-09-01): if we're ever going to actually use the notification -# server, this logic needs to be in its own unit and not tucked away here in -# test-less wrapper module -def _initialize_event_watchers( - app_state: AppState, - hardware_api: ThreadManagedHardware, -) -> None: - """Initialize notification publishing for hardware events.""" - notify_server_settings = NotifyServerSettings() - hw_event_publisher = publisher.create( - notify_server_settings.publisher_address.connection_string() - ) - - def _publish_hardware_event(hw_event: Union[str, HardwareEvent]) -> None: - if isinstance(hw_event, DoorStateNotification): - payload = DoorStatePayload(state=hw_event.new_state) - else: - return - - topic = topics.RobotEventTopics.HARDWARE_EVENTS - hw_event_publisher.send_nowait( - topic, - event.Event(createdOn=utc_now(), publisher=__name__, data=payload), - ) - - unsubscribe = hardware_api.register_callback(_publish_hardware_event) - _event_unsubscribe_accessor.set_on(app_state, unsubscribe) diff --git a/robot-server/robot_server/router.py b/robot-server/robot_server/router.py index 76449fb220a..4739c4d84ce 100644 --- a/robot-server/robot_server/router.py +++ b/robot-server/robot_server/router.py @@ -16,7 +16,6 @@ from .runs import runs_router from .service.labware.router import router as labware_router from .service.legacy.routers import legacy_routes -from .service.notifications.router import router as notifications_router from .service.pipette_offset.router import router as pip_os_router from .service.session.router import router as deprecated_session_router from .service.tip_length.router import router as tl_router @@ -113,12 +112,6 @@ dependencies=[Depends(check_version_header)], ) -router.include_router( - router=notifications_router, - tags=["Notification Server Management"], - dependencies=[Depends(check_version_header)], -) - router.include_router( router=system_router, tags=["System Control"], diff --git a/robot-server/robot_server/service/notifications/__init__.py b/robot-server/robot_server/service/notifications/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/robot-server/robot_server/service/notifications/handle_subscriber.py b/robot-server/robot_server/service/notifications/handle_subscriber.py deleted file mode 100644 index a6dc9129963..00000000000 --- a/robot-server/robot_server/service/notifications/handle_subscriber.py +++ /dev/null @@ -1,46 +0,0 @@ -"""Websocket subscriber handler functions.""" -import asyncio -import logging -from asyncio import CancelledError -from typing import List - -from starlette.websockets import WebSocket, WebSocketDisconnect - -from notify_server.clients.serdes import TopicEvent -from notify_server.clients.subscriber import Subscriber, create - -from robot_server.settings import get_settings - -log = logging.getLogger(__name__) - - -async def handle_socket(websocket: WebSocket, topics: List[str]) -> None: - """Handle a websocket connection.""" - subscriber = create(get_settings().notification_server_subscriber_address, topics) - await asyncio.gather( - receive(websocket, subscriber), route_events(websocket, subscriber) - ) - - -async def receive(websocket: WebSocket, subscriber: Subscriber) -> None: - """Read data from websocket. Will exit on websocket disconnect.""" - try: - while True: - await websocket.receive_json() - except WebSocketDisconnect: - log.info("Websocket subscriber disconnected.") - subscriber.close() - - -async def send(websocket: WebSocket, entry: TopicEvent) -> None: - """Send entry to web socket.""" - await websocket.send_text(entry.json()) - - -async def route_events(websocket: WebSocket, subscriber: Subscriber) -> None: - """Route events from subscriber to websocket.""" - try: - async for entry in subscriber: - await send(websocket, entry) - except CancelledError: - log.exception("Connection to notify-server closed.") diff --git a/robot-server/robot_server/service/notifications/router.py b/robot-server/robot_server/service/notifications/router.py deleted file mode 100644 index 66a391bb3c7..00000000000 --- a/robot-server/robot_server/service/notifications/router.py +++ /dev/null @@ -1,14 +0,0 @@ -from typing import List - -from fastapi import APIRouter, Query -from starlette.websockets import WebSocket -from robot_server.service.notifications import handle_subscriber - -router = APIRouter() - - -@router.websocket("/notifications/subscribe") -async def handle_subscribe(websocket: WebSocket, topic: List[str] = Query(...)): - """Accept a websocket connection.""" - await websocket.accept() - await handle_subscriber.handle_socket(websocket, topic) diff --git a/robot-server/setup.py b/robot-server/setup.py index 65940912c05..079c8858ea0 100755 --- a/robot-server/setup.py +++ b/robot-server/setup.py @@ -54,7 +54,6 @@ def get_version(): INSTALL_REQUIRES = [ f"opentrons=={VERSION}", f"opentrons-shared-data=={VERSION}", - f"notify-server=={VERSION}", f"server-utils=={VERSION}", "anyio==3.6.1", "fastapi==0.68.1", diff --git a/robot-server/tests/service/notifications/__init__.py b/robot-server/tests/service/notifications/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/robot-server/tests/service/notifications/conftest.py b/robot-server/tests/service/notifications/conftest.py deleted file mode 100644 index 604000b834e..00000000000 --- a/robot-server/tests/service/notifications/conftest.py +++ /dev/null @@ -1,29 +0,0 @@ -from datetime import datetime -from typing import AsyncIterator - -import pytest -from notify_server.clients.serdes import TopicEvent -from notify_server.models.event import Event -from notify_server.models.payload_type import UserData - - -@pytest.fixture -def topic_event() -> TopicEvent: - return TopicEvent( - topic="some_topic", - event=Event( - createdOn=datetime(2020, 1, 1), - publisher="some_one", - data=UserData(data={"val1": 1, "val2": "2"}), - ), - ) - - -@pytest.fixture -def mock_subscriber(topic_event: TopicEvent) -> AsyncIterator[TopicEvent]: - """A mock subscriber.""" - - async def _f() -> AsyncIterator[TopicEvent]: - yield topic_event - - return _f() diff --git a/robot-server/tests/service/notifications/test_handle_subscriber.py b/robot-server/tests/service/notifications/test_handle_subscriber.py deleted file mode 100644 index 5e4e6897ad6..00000000000 --- a/robot-server/tests/service/notifications/test_handle_subscriber.py +++ /dev/null @@ -1,48 +0,0 @@ -from typing import AsyncIterator - -import pytest -from mock import MagicMock, patch, DEFAULT -from notify_server.clients.serdes import TopicEvent -from starlette.websockets import WebSocket -from robot_server.service.notifications import handle_subscriber -from robot_server.settings import get_settings - - -@pytest.fixture -def mock_socket() -> MagicMock: - """A mock websocket.""" - return MagicMock(spec=WebSocket) - - -async def test_create_subscriber(mock_socket: MagicMock) -> None: - """Test that a subscriber is created correctly.""" - # Why two patch calls? `create` is the name of an arg to `patch.multiple`. - with patch( - "robot_server.service.notifications.handle_subscriber.create" - ) as mock_create: - with patch.multiple( - handle_subscriber, route_events=DEFAULT, receive=DEFAULT - ) as values: - await handle_subscriber.handle_socket(mock_socket, ["a", "b"]) - mock_create.assert_called_once_with( - get_settings().notification_server_subscriber_address, ["a", "b"] - ) - values["route_events"].assert_called_once() - values["receive"].assert_called_once() - - -async def test_route_events( - mock_socket: MagicMock, - mock_subscriber: AsyncIterator[TopicEvent], - topic_event: TopicEvent, -) -> None: - """Test that an event is read from subscriber and sent to websocket.""" - with patch.object(handle_subscriber, "send") as mock_send: - await handle_subscriber.route_events(mock_socket, mock_subscriber) - mock_send.assert_called_once_with(mock_socket, topic_event) - - -async def test_send_entry(topic_event: TopicEvent, mock_socket: MagicMock) -> None: - """Test that entry is sent as json.""" - await handle_subscriber.send(mock_socket, topic_event) - mock_socket.send_text.assert_called_once_with(topic_event.json()) diff --git a/robot-server/tests/service/notifications/test_router.py b/robot-server/tests/service/notifications/test_router.py deleted file mode 100644 index fb41ae7d6e1..00000000000 --- a/robot-server/tests/service/notifications/test_router.py +++ /dev/null @@ -1,38 +0,0 @@ -from typing import AsyncIterator - -from mock import patch - -import pytest -from notify_server.clients.serdes import TopicEvent -from starlette.testclient import TestClient -from starlette.websockets import WebSocketDisconnect - -from robot_server.service.notifications import handle_subscriber - - -def test_subscribe(api_client: TestClient): - """Test that a connection can be established and topics discovered.""" - with patch.object(handle_subscriber, "handle_socket") as m: - api_client.websocket_connect("/notifications/subscribe?topic=a&topic=b&topic=c") - m.assert_called_once() - assert m.call_args[0][1] == ["a", "b", "c"] - - -def test_subscribe_no_topic(api_client: TestClient): - """Test that query string must contain topic list.""" - with pytest.raises(WebSocketDisconnect): - api_client.websocket_connect("/notifications/subscribe") - - -def test_integration( - api_client: TestClient, - mock_subscriber: AsyncIterator[TopicEvent], - topic_event: TopicEvent, -) -> None: - """Test receiving a single event.""" - with patch.object(handle_subscriber, "create", return_value=mock_subscriber): - sock = api_client.websocket_connect("/notifications/subscribe?topic=t") - event = sock.receive() - assert event["text"] == topic_event.json() - assert event["type"] == "websocket.send" - sock.close() diff --git a/scripts/python_build_utils.py b/scripts/python_build_utils.py index 486c2c2360e..d55ece0e0c8 100644 --- a/scripts/python_build_utils.py +++ b/scripts/python_build_utils.py @@ -27,7 +27,6 @@ 'update-server': PackageEntry('update_server'), 'robot-server': PackageEntry('robot_server'), 'shared-data': PackageEntry('shared_data'), - 'notify-server': PackageEntry('notify_server'), 'hardware': PackageEntry('opentrons_hardware'), 'hardware-testing': PackageEntry('hardware_testing'), 'usb-bridge': PackageEntry('usb_bridge'),