From b930305df517328c7a41a2cc8340231b8c7c40b7 Mon Sep 17 00:00:00 2001 From: Robert Segal Date: Mon, 22 Sep 2025 09:41:28 -0600 Subject: [PATCH] Added units of measure endpoints --- .gitignore | 3 ++ mpt_api_client/resources/catalog/catalog.py | 14 +++++++ .../resources/catalog/units_of_measure.py | 42 +++++++++++++++++++ tests/resources/catalog/test_catalog.py | 6 +++ .../catalog/test_units_of_measure.py | 26 ++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 mpt_api_client/resources/catalog/units_of_measure.py create mode 100644 tests/resources/catalog/test_units_of_measure.py diff --git a/.gitignore b/.gitignore index 312e49fa..be768412 100644 --- a/.gitignore +++ b/.gitignore @@ -167,3 +167,6 @@ cython_debug/ # ruff cache .ruff_cache .idea + +# VS Code dev container +.devcontainer/ diff --git a/mpt_api_client/resources/catalog/catalog.py b/mpt_api_client/resources/catalog/catalog.py index 4bfe366c..203fd30b 100644 --- a/mpt_api_client/resources/catalog/catalog.py +++ b/mpt_api_client/resources/catalog/catalog.py @@ -10,6 +10,10 @@ PriceListsService, ) from mpt_api_client.resources.catalog.products import AsyncProductsService, ProductsService +from mpt_api_client.resources.catalog.units_of_measure import ( + AsyncUnitsOfMeasureService, + UnitsOfMeasureService, +) class Catalog: @@ -38,6 +42,11 @@ def products(self) -> ProductsService: """Products service.""" return ProductsService(http_client=self.http_client) + @property + def units_of_measure(self) -> UnitsOfMeasureService: + """Units of Measure service.""" + return UnitsOfMeasureService(http_client=self.http_client) + @property def items(self) -> ItemsService: # noqa: WPS110 """Items service.""" @@ -70,6 +79,11 @@ def products(self) -> AsyncProductsService: """Products service.""" return AsyncProductsService(http_client=self.http_client) + @property + def units_of_measure(self) -> AsyncUnitsOfMeasureService: + """Units of Measure service.""" + return AsyncUnitsOfMeasureService(http_client=self.http_client) + @property def items(self) -> AsyncItemsService: # noqa: WPS110 """Items service.""" diff --git a/mpt_api_client/resources/catalog/units_of_measure.py b/mpt_api_client/resources/catalog/units_of_measure.py new file mode 100644 index 00000000..9a3bfc0f --- /dev/null +++ b/mpt_api_client/resources/catalog/units_of_measure.py @@ -0,0 +1,42 @@ +from mpt_api_client.http import AsyncService, Service +from mpt_api_client.http.mixins import ( + AsyncCreateMixin, + AsyncDeleteMixin, + AsyncUpdateMixin, + CreateMixin, + DeleteMixin, + UpdateMixin, +) +from mpt_api_client.models import Model + + +class UnitOfMeasure(Model): + """Unit of Measure resource.""" + + +class UnitsOfMeasureServiceConfig: + """Units of Measure service configuration.""" + + _endpoint = "/public/v1/catalog/units-of-measure" + _model_class = UnitOfMeasure + _collection_key = "data" + + +class UnitsOfMeasureService( + CreateMixin[UnitOfMeasure], + DeleteMixin, + UpdateMixin[UnitOfMeasure], + Service[UnitOfMeasure], + UnitsOfMeasureServiceConfig, +): + """Units of Measure service.""" + + +class AsyncUnitsOfMeasureService( + AsyncCreateMixin[UnitOfMeasure], + AsyncDeleteMixin, + AsyncUpdateMixin[UnitOfMeasure], + AsyncService[UnitOfMeasure], + UnitsOfMeasureServiceConfig, +): + """Units of Measure service.""" diff --git a/tests/resources/catalog/test_catalog.py b/tests/resources/catalog/test_catalog.py index ba197d3c..3fefed1e 100644 --- a/tests/resources/catalog/test_catalog.py +++ b/tests/resources/catalog/test_catalog.py @@ -12,6 +12,10 @@ PriceListsService, ) from mpt_api_client.resources.catalog.products import AsyncProductsService, ProductsService +from mpt_api_client.resources.catalog.units_of_measure import ( + AsyncUnitsOfMeasureService, + UnitsOfMeasureService, +) @pytest.fixture @@ -31,6 +35,7 @@ def async_catalog(async_http_client): ("listings", ListingsService), ("price_lists", PriceListsService), ("products", ProductsService), + ("units_of_measure", UnitsOfMeasureService), ("items", ItemsService), ], ) @@ -49,6 +54,7 @@ def test_catalog_properties(catalog, property_name, expected_service_class): ("listings", AsyncListingsService), ("price_lists", AsyncPriceListsService), ("products", AsyncProductsService), + ("units_of_measure", AsyncUnitsOfMeasureService), ("items", AsyncItemsService), ], ) diff --git a/tests/resources/catalog/test_units_of_measure.py b/tests/resources/catalog/test_units_of_measure.py new file mode 100644 index 00000000..5eb54582 --- /dev/null +++ b/tests/resources/catalog/test_units_of_measure.py @@ -0,0 +1,26 @@ +import pytest + +from mpt_api_client.resources.catalog.units_of_measure import ( + AsyncUnitsOfMeasureService, + UnitsOfMeasureService, +) + + +@pytest.fixture +def units_of_measure_service(http_client): + return UnitsOfMeasureService(http_client=http_client) + + +@pytest.fixture +def async_units_of_measure_service(async_http_client): + return AsyncUnitsOfMeasureService(http_client=async_http_client) + + +@pytest.mark.parametrize("method", ["get", "create", "update", "delete"]) +def test_mixins_present(units_of_measure_service, method): + assert hasattr(units_of_measure_service, method) + + +@pytest.mark.parametrize("method", ["get", "create", "update", "delete"]) +def test_async_mixins_present(async_units_of_measure_service, method): + assert hasattr(async_units_of_measure_service, method)