diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..dd61d09c --- /dev/null +++ b/.env.example @@ -0,0 +1,9 @@ +MPT_API_BASE_URL=https://api.example.com/ + +MPT_API_TOKEN=idt:TKN-4138-9324:... +MPT_API_TOKEN_CLIENT=idt:TKN... +MPT_API_TOKEN_OPERATIONS=idt:TKN-4138-9324:... +MPT_API_TOKEN_VENDOR=idt:TKN-8857-1729:... +RP_API_KEY="pytest_Ox... +RP_ENDPOINT="https://reportportal.example.com" +RP_LAUNCH="dev-env" diff --git a/.env.sample b/.env.sample deleted file mode 100644 index 6ef8147c..00000000 --- a/.env.sample +++ /dev/null @@ -1,2 +0,0 @@ -MPT_API_BASE_URL=https://api... -MPT_API_TOKEN=idt:TKN-... diff --git a/README.md b/README.md index c5d1302c..48d911c6 100644 --- a/README.md +++ b/README.md @@ -1 +1,68 @@ # mpt-api-python-client + +A Python client for interacting with the MPT API. + +## Installation + +Install as a uv dependency: + +```bash +uv add mpt-api-client +cp .env.example .env +``` + +## Usage + +```python +from mpt_api_client import MPTClient + +#client = MPTClient(api_key=os.getenv("MPT_API_KEY"), base_url=os.getenv("MPT_API_URL")) +client = MPTClient() # Will get the api_key and base_url from the environment variables + +for product in client.catalog.products.iterate(): + print(product.name) +``` + +## Async Usage + +```python +import asyncio +from mpt_api_client import AsyncMPTClient + +async def main(): + # client = AsyncMPTClient(api_key=os.getenv("MPT_API_KEY"), base_url=os.getenv("MPT_API_URL")) + client = AsyncMPTClient() # Will get the api_key and base_url from the environment variables + async for product in client.catalog.products.iterate(): + print(product.name) + +asyncio.run(main()) +``` + +## Development + +Clone the repository and install dependencies: + +```bash +git clone https://github.com/albertsola/mpt-api-python-client.git +cd mpt-api-python-client +uv add -r requirements.txt +``` + +## Testing + +Run all validations with: + +```bash +docker compose run --rm app_test +``` + +Run pytest with: + +```bash +pytest tests/unit +pytest tests/e2e +pytest tests/seed +``` +## License + +MIT diff --git a/mpt_api_client/resources/catalog/products.py b/mpt_api_client/resources/catalog/products.py index cece131f..21a04614 100644 --- a/mpt_api_client/resources/catalog/products.py +++ b/mpt_api_client/resources/catalog/products.py @@ -113,7 +113,7 @@ def documents(self, product_id: str) -> DocumentService: http_client=self.http_client, endpoint_params={"product_id": product_id} ) - def product_parameters(self, product_id: str) -> ParametersService: + def parameters(self, product_id: str) -> ParametersService: # noqa: WPS110 """Return product_parameters service.""" return ParametersService( http_client=self.http_client, endpoint_params={"product_id": product_id} @@ -191,7 +191,7 @@ def documents(self, product_id: str) -> AsyncDocumentService: http_client=self.http_client, endpoint_params={"product_id": product_id} ) - def product_parameters(self, product_id: str) -> AsyncParametersService: + def parameters(self, product_id: str) -> AsyncParametersService: # noqa: WPS110 """Return product_parameters service.""" return AsyncParametersService( http_client=self.http_client, endpoint_params={"product_id": product_id} diff --git a/seed/catalog/product_parameters.py b/seed/catalog/product_parameters.py index 8549d38e..98ba7ef4 100644 --- a/seed/catalog/product_parameters.py +++ b/seed/catalog/product_parameters.py @@ -27,9 +27,7 @@ async def get_parameter( except ValueError: logger.debug("Loading parameter: %s", parameter_id) product_id = context.get_string("catalog.product.id") - parameter = await mpt_vendor.catalog.products.product_parameters(product_id).get( - parameter_id - ) + parameter = await mpt_vendor.catalog.products.parameters(product_id).get(parameter_id) context.set_resource(namespace, parameter) return parameter @@ -72,9 +70,7 @@ async def create_parameter( if not product_id: raise ValueError("Product id is required.") parameter_data = build_parameter(context=context) - parameter = await mpt_vendor.catalog.products.product_parameters(product_id).create( - parameter_data - ) + parameter = await mpt_vendor.catalog.products.parameters(product_id).create(parameter_data) logger.debug("Parameter created: %s", parameter.id) context[f"{namespace}.id"] = parameter.id context.set_resource(namespace, parameter) diff --git a/tests/seed/catalog/test_product_parameters.py b/tests/seed/catalog/test_product_parameters.py index 7d1de6b9..2544b703 100644 --- a/tests/seed/catalog/test_product_parameters.py +++ b/tests/seed/catalog/test_product_parameters.py @@ -39,7 +39,7 @@ async def test_get_parameter( context["catalog.product.id"] = "product-123" service = AsyncMock(spec=AsyncParametersService) service.get.return_value = parameter - vendor_client.catalog.products.product_parameters.return_value = service + vendor_client.catalog.products.parameters.return_value = service fetched_parameter = await get_parameter(context=context, mpt_vendor=vendor_client) @@ -67,7 +67,7 @@ async def test_get_or_create_parameter_create_new( ) -> None: context["catalog.product.id"] = "product-123" parameters_service.create.return_value = parameter - vendor_client.catalog.products.product_parameters.return_value = parameters_service + vendor_client.catalog.products.parameters.return_value = parameters_service with ( patch("seed.catalog.product_parameters.get_parameter", return_value=None), @@ -96,7 +96,7 @@ async def test_create_parameter_success( context["catalog.parameter_group.id"] = "group-123" service = AsyncMock(spec=AsyncParametersService) service.create.return_value = parameter - vendor_client.catalog.products.product_parameters.return_value = service + vendor_client.catalog.products.parameters.return_value = service created = await create_parameter(context=context, mpt_vendor=vendor_client) diff --git a/tests/unit/resources/catalog/test_products.py b/tests/unit/resources/catalog/test_products.py index f68d65e5..6d159aaf 100644 --- a/tests/unit/resources/catalog/test_products.py +++ b/tests/unit/resources/catalog/test_products.py @@ -66,7 +66,7 @@ def test_async_mixins_present(async_products_service, method): ("parameter_groups", ParameterGroupsService), ("media", MediaService), ("documents", DocumentService), - ("product_parameters", ParametersService), + ("parameters", ParametersService), ("templates", TemplatesService), ("terms", TermService), ], @@ -85,7 +85,7 @@ def test_property_services(products_service, service_method, expected_service_cl ("parameter_groups", AsyncParameterGroupsService), ("media", AsyncMediaService), ("documents", AsyncDocumentService), - ("product_parameters", AsyncParametersService), + ("parameters", AsyncParametersService), ("templates", AsyncTemplatesService), ("terms", AsyncTermService), ],