From a15d730acdbeb030789f2fd4e3b1e0da3c7ddb83 Mon Sep 17 00:00:00 2001 From: Jussi Vatjus-Anttila Date: Tue, 23 Jan 2024 12:59:24 +0200 Subject: [PATCH] add requirements when suitable resource not found (#211) note: drop python 3.7 support --- .circleci/config.yml | 14 ++------------ lockable/lockable.py | 9 ++++++--- setup.py | 2 +- tests/test_Lockable.py | 4 ++-- 4 files changed, 11 insertions(+), 18 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a42ca55..a48ac2d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,10 +8,6 @@ workflows: version: 2 test: jobs: - - test-37: - filters: - tags: - only: /.*/ - test-38: filters: tags: @@ -29,7 +25,6 @@ workflows: - test-310 - test-39 - test-38 - - test-37 filters: tags: only: /^v.*/ @@ -58,9 +53,9 @@ commands: key: deps1-{{ .Branch }}-{{ checksum "setup.py" }} jobs: - test-37: &test-template + test-38: &test-template docker: - - image: circleci/python:3.7 + - image: circleci/python:3.8 working_directory: ~/lockable steps: - setup @@ -86,11 +81,6 @@ jobs: path: junit destination: juni - test-38: - <<: *test-template - docker: - - image: circleci/python:3.8 - test-39: <<: *test-template docker: diff --git a/lockable/lockable.py b/lockable/lockable.py index fd87bd1..c2246ff 100644 --- a/lockable/lockable.py +++ b/lockable/lockable.py @@ -173,7 +173,8 @@ def _lock(self, requirements, timeout_s, retry_interval=1) -> Allocation: """ Lock resource """ local_resources = filter_(self.resource_list, requirements) random.shuffle(local_resources) - ResourceNotFound.invariant(local_resources, "Suitable resource not available") + ResourceNotFound.invariant(local_resources, + f"Suitable resource not available, {requirements=}") return self._lock_some(requirements, local_resources, timeout_s, retry_interval)[0] def _lock_many(self, requirements, timeout_s, retry_interval=1) -> [Allocation]: @@ -181,12 +182,14 @@ def _lock_many(self, requirements, timeout_s, retry_interval=1) -> [Allocation]: local_resources = [] for req in requirements: resources = filter_(self.resource_list, req) - ResourceNotFound.invariant(resources, "Suitable resource not available") + ResourceNotFound.invariant(resources, + f"Suitable resource not available, {requirements=}") local_resources += resources # Unique resources by id local_resources = list({v['id']: v for v in local_resources}.values()) ResourceNotFound.invariant( - len(local_resources) >= len(requirements), "Suitable resource not available") + len(local_resources) >= len(requirements), + f"Suitable resource not available, {requirements=}") random.shuffle(local_resources) return self._lock_some(requirements, local_resources, timeout_s, retry_interval) diff --git a/setup.py b/setup.py index 93b024f..9f288e9 100644 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ ], packages=find_packages(exclude=['tests']), keywords="py.test pytest lockable resource", - python_requires='>=3.7, <4', + python_requires='>=3.8, <4', entry_points={ 'console_scripts': [ 'lockable = lockable.cli:main' diff --git a/tests/test_Lockable.py b/tests/test_Lockable.py index ef44c73..0aacd3d 100644 --- a/tests/test_Lockable.py +++ b/tests/test_Lockable.py @@ -83,8 +83,8 @@ def test_invalid_constructor(self): def test_lock_require_resources_json_loaded(self): lockable = Lockable() with self.assertRaises(ResourceNotFound) as error: - lockable.lock({}) - self.assertEqual(str(error.exception), 'Suitable resource not available') + lockable.lock({"hostname": "test"}) + self.assertEqual(str(error.exception), "Suitable resource not available, requirements={'hostname': 'test', 'online': True}") def test_constructor_file_not_found(self): with TemporaryDirectory() as tmpdirname: