diff --git a/CHANGELOG.md b/CHANGELOG.md index 07cae85..71a3d33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.24.2] - 2022-08-10 + +### Added + +- Adds `patch.estimates.create_ecommerce_estimate` method + ## [1.24.0] - 2022-07-22 ### Added diff --git a/README.md b/README.md index 3ca9e7e..1a1c24d 100644 --- a/README.md +++ b/README.md @@ -137,20 +137,24 @@ patch.estimates.create_mass_estimate(mass_g=mass_g, project_id=project_id) # Create a flight estimate distance_m = 1_000_000 # Pass in the distance traveled in meters -patch.estimates.create_mass_estimate(distance_m=distance_m) +patch.estimates.create_flight_estimate(distance_m=distance_m) -# Create a shipping estimate +# Create an ecommerce estimate distance_m = 1_000_000 # Pass in the distance traveled in meters transportation_method = "rail" package_mass_g = 5000 -patch.estimates.create_mass_estimate(distance_m=distance_m, transportation_method=transportation_method, package_mass_g=package_mass_g) +patch.estimates.create_ecommerce_estimate( + distance_m=distance_m, + transportation_method=transportation_method, + package_mass_g=package_mass_g +) # Create a vehicle estimate distance_m = 1_000_000 # Pass in the distance traveled in meters make = "Toyota" model = "Corolla" year = 1995 -patch.estimates.create_mass_estimate(distance_m=distance_m, make=make, model=model, year=year) +patch.estimates.create_vehicle_estimate(distance_m=distance_m, make=make, model=model, year=year) # Create a bitcoin estimate transaction_value_btc_sats = 1000 # [Optional] Pass in the transaction value in satoshis diff --git a/patch_api/__init__.py b/patch_api/__init__.py index d8e3b13..7564077 100644 --- a/patch_api/__init__.py +++ b/patch_api/__init__.py @@ -15,7 +15,7 @@ from __future__ import absolute_import -__version__ = "1.24.1" +__version__ = "1.24.2" # import ApiClient from patch_api.api_client import ApiClient diff --git a/patch_api/api/estimates_api.py b/patch_api/api/estimates_api.py index 0285685..c72d325 100644 --- a/patch_api/api/estimates_api.py +++ b/patch_api/api/estimates_api.py @@ -464,6 +464,196 @@ def create_bitcoin_estimate_with_http_info( collection_formats=collection_formats, ) + def create_ecommerce_estimate( + self, create_ecommerce_estimate_request={}, **kwargs + ): # noqa: E501 + """Create an e-commerce estimate given the distance traveled in meters, package weight, and transportation method. # noqa: E501 + + Creates a e-commerce estimate for the amount of CO2 to be compensated. An order in the `draft` state may be created based on the parameters. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.create_ecommerce_estimate(create_ecommerce_estimate_request, async_req=True) + >>> result = thread.get() + + :param async_req bool: execute request asynchronously + :param CreateEcommerceEstimateRequest create_ecommerce_estimate_request: (required) + :param _preload_content: if False, the urllib3.HTTPResponse object will + be returned without reading/decoding response + data. Default is True. + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :return: EstimateResponse + If the method is called asynchronously, + returns the request thread. + """ + kwargs["_return_http_data_only"] = True + return self.create_ecommerce_estimate_with_http_info( + create_ecommerce_estimate_request, **kwargs + ) # noqa: E501 + + def create_ecommerce_estimate_with_http_info( + self, create_ecommerce_estimate_request, **kwargs + ): # noqa: E501 + """Create an e-commerce estimate given the distance traveled in meters, package weight, and transportation method. # noqa: E501 + + Creates a e-commerce estimate for the amount of CO2 to be compensated. An order in the `draft` state may be created based on the parameters. # noqa: E501 + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.create_ecommerce_estimate_with_http_info(create_ecommerce_estimate_request, async_req=True) + >>> result = thread.get() + + :param async_req bool: execute request asynchronously + :param CreateEcommerceEstimateRequest create_ecommerce_estimate_request: (required) + :param _return_http_data_only: response data without head status code + and headers + :param _preload_content: if False, the urllib3.HTTPResponse object will + be returned without reading/decoding response + data. Default is True. + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :return: tuple(EstimateResponse, status_code(int), headers(HTTPHeaderDict)) + If the method is called asynchronously, + returns the request thread. + """ + + local_var_params = locals() + + all_params = ["create_ecommerce_estimate_request"] # noqa: E501 + all_params.append("async_req") + all_params.append("_return_http_data_only") + all_params.append("_preload_content") + all_params.append("_request_timeout") + all_params.append("mass_g") + all_params.append("total_price_cents_usd") + all_params.append("project_id") + all_params.append("metadata") + all_params.append("distance_m") + all_params.append("transportation_method") + all_params.append("package_mass_g") + all_params.append("create_order") + all_params.append("make") + all_params.append("model") + all_params.append("year") + all_params.append("transaction_value_btc_sats") + all_params.append("transaction_value_eth_gwei") + all_params.append("gas_used") + all_params.append("transaction_value_btc_sats") + all_params.append("average_daily_balance_btc_sats") + all_params.append("average_daily_balance_eth_gwei") + all_params.append("timestamp") + all_params.append("origin_airport") + all_params.append("destination_airport") + all_params.append("aircraft_code") + all_params.append("cabin_class") + all_params.append("passenger_count") + all_params.append("state") + all_params.append("country_code") + all_params.append("city") + all_params.append("region") + all_params.append("star_rating") + all_params.append("number_of_nights") + all_params.append("number_of_rooms") + all_params.append("vintage_year") + all_params.append("total_price") + all_params.append("currency") + all_params.append("amount") + all_params.append("unit") + all_params.append("issued_to") + all_params.append("cargo_type") + all_params.append("container_size_code") + all_params.append("destination_country_code") + all_params.append("destination_locode") + all_params.append("destination_postal_code") + all_params.append("emissions_scope") + all_params.append("freight_mass_g") + all_params.append("freight_volume_cubic_m") + all_params.append("fuel_type") + all_params.append("number_of_containers") + all_params.append("origin_country_code") + all_params.append("origin_locode") + all_params.append("origin_postal_code") + all_params.append("truck_weight_t") + all_params.append("vessel_imo") + + for key, val in six.iteritems(local_var_params["kwargs"]): + if key not in all_params: + raise ApiTypeError( + "Got an unexpected keyword argument '%s'" + " to method create_ecommerce_estimate" % key + ) + local_var_params[key] = val + del local_var_params["kwargs"] + # verify the required parameter 'create_ecommerce_estimate_request' is set + if ( + "create_ecommerce_estimate_request" not in local_var_params + or local_var_params["create_ecommerce_estimate_request"] is None + ): + raise ApiValueError( + "Missing the required parameter `create_ecommerce_estimate_request` when calling `create_ecommerce_estimate`" + ) # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + # do not add duplicate keys to query_params list + existing_keys = [] + for param in query_params: + existing_keys.append(param[0]) + + for key in kwargs: + if key not in existing_keys: + query_params.append([key, kwargs.get(key)]) + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if "create_ecommerce_estimate_request" in local_var_params: + body_params = local_var_params["create_ecommerce_estimate_request"] + # HTTP header `Accept` + header_params["Accept"] = self.api_client.select_header_accept( + ["application/json"] + ) # noqa: E501 + + # HTTP header `Content-Type` + header_params[ + "Content-Type" + ] = self.api_client.select_header_content_type( # noqa: E501 + ["application/json"] + ) # noqa: E501 + + # Authentication setting + auth_settings = ["bearer_auth"] # noqa: E501 + + return self.api_client.call_api( + "/v1/estimates/ecommerce", + "POST", + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type="EstimateResponse", # noqa: E501 + auth_settings=auth_settings, + async_req=local_var_params.get("async_req"), + _return_http_data_only=local_var_params.get( + "_return_http_data_only" + ), # noqa: E501 + _preload_content=local_var_params.get("_preload_content", True), + _request_timeout=local_var_params.get("_request_timeout"), + collection_formats=collection_formats, + ) + def create_ethereum_estimate( self, create_ethereum_estimate_request={}, **kwargs ): # noqa: E501 diff --git a/patch_api/api_client.py b/patch_api/api_client.py index 7e55e87..9f192ab 100644 --- a/patch_api/api_client.py +++ b/patch_api/api_client.py @@ -91,7 +91,7 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = "patch-python/1.24.1" + self.user_agent = "patch-python/1.24.2" def __del__(self): if self._pool: diff --git a/patch_api/configuration.py b/patch_api/configuration.py index b5577cf..1d8f234 100644 --- a/patch_api/configuration.py +++ b/patch_api/configuration.py @@ -341,7 +341,7 @@ def to_debug_report(self): "OS: {env}\n" "Python Version: {pyversion}\n" "Version of the API: v1\n" - "SDK Package Version: 1.24.1".format( + "SDK Package Version: 1.24.2".format( env=sys.platform, pyversion=sys.version ) ) diff --git a/patch_api/models/__init__.py b/patch_api/models/__init__.py index da4e6ce..5d9c584 100644 --- a/patch_api/models/__init__.py +++ b/patch_api/models/__init__.py @@ -22,6 +22,9 @@ from patch_api.models.create_bitcoin_estimate_request import ( CreateBitcoinEstimateRequest, ) +from patch_api.models.create_ecommerce_estimate_request import ( + CreateEcommerceEstimateRequest, +) from patch_api.models.create_ethereum_estimate_request import ( CreateEthereumEstimateRequest, ) diff --git a/patch_api/models/create_air_shipping_estimate_request.py b/patch_api/models/create_air_shipping_estimate_request.py index a791288..5f410fe 100644 --- a/patch_api/models/create_air_shipping_estimate_request.py +++ b/patch_api/models/create_air_shipping_estimate_request.py @@ -62,7 +62,7 @@ def __init__( aircraft_code=None, aircraft_type="unknown", freight_mass_g=None, - emissions_scope="wtw", + emissions_scope="ttw", project_id=None, create_order=False, local_vars_configuration=None, diff --git a/patch_api/models/create_ecommerce_estimate_request.py b/patch_api/models/create_ecommerce_estimate_request.py new file mode 100644 index 0000000..c38ae7c --- /dev/null +++ b/patch_api/models/create_ecommerce_estimate_request.py @@ -0,0 +1,292 @@ +# coding: utf-8 + +""" + Patch API V1 + + The core API used to integrate with Patch's service # noqa: E501 + + The version of the OpenAPI document: v1 + Contact: engineering@usepatch.com + Generated by: https://openapi-generator.tech +""" + + +import pprint +import re # noqa: F401 + +import six + +from patch_api.configuration import Configuration + + +class CreateEcommerceEstimateRequest(object): + """NOTE: This class is auto generated by OpenAPI Generator. + Ref: https://openapi-generator.tech + + Do not edit the class manually. + """ + + """ + Attributes: + openapi_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + openapi_types = { + "distance_m": "int", + "package_mass_g": "int", + "transportation_method": "str", + "project_id": "str", + "create_order": "bool", + } + + attribute_map = { + "distance_m": "distance_m", + "package_mass_g": "package_mass_g", + "transportation_method": "transportation_method", + "project_id": "project_id", + "create_order": "create_order", + } + + def __init__( + self, + distance_m=None, + package_mass_g=None, + transportation_method=None, + project_id=None, + create_order=False, + local_vars_configuration=None, + ): # noqa: E501 + """CreateEcommerceEstimateRequest - a model defined in OpenAPI""" # noqa: E501 + if local_vars_configuration is None: + local_vars_configuration = Configuration() + self.local_vars_configuration = local_vars_configuration + + self._distance_m = None + self._package_mass_g = None + self._transportation_method = None + self._project_id = None + self._create_order = None + self.discriminator = None + + self.distance_m = distance_m + self.package_mass_g = package_mass_g + self.transportation_method = transportation_method + self.project_id = project_id + self.create_order = create_order + + @property + def distance_m(self): + """Gets the distance_m of this CreateEcommerceEstimateRequest. # noqa: E501 + + + :return: The distance_m of this CreateEcommerceEstimateRequest. # noqa: E501 + :rtype: int + """ + return self._distance_m + + @distance_m.setter + def distance_m(self, distance_m): + """Sets the distance_m of this CreateEcommerceEstimateRequest. + + + :param distance_m: The distance_m of this CreateEcommerceEstimateRequest. # noqa: E501 + :type: int + """ + if ( + self.local_vars_configuration.client_side_validation and distance_m is None + ): # noqa: E501 + raise ValueError( + "Invalid value for `distance_m`, must not be `None`" + ) # noqa: E501 + if ( + self.local_vars_configuration.client_side_validation + and distance_m is not None + and distance_m > 400000000 + ): # noqa: E501 + raise ValueError( + "Invalid value for `distance_m`, must be a value less than or equal to `400000000`" + ) # noqa: E501 + if ( + self.local_vars_configuration.client_side_validation + and distance_m is not None + and distance_m < 0 + ): # noqa: E501 + raise ValueError( + "Invalid value for `distance_m`, must be a value greater than or equal to `0`" + ) # noqa: E501 + + self._distance_m = distance_m + + @property + def package_mass_g(self): + """Gets the package_mass_g of this CreateEcommerceEstimateRequest. # noqa: E501 + + + :return: The package_mass_g of this CreateEcommerceEstimateRequest. # noqa: E501 + :rtype: int + """ + return self._package_mass_g + + @package_mass_g.setter + def package_mass_g(self, package_mass_g): + """Sets the package_mass_g of this CreateEcommerceEstimateRequest. + + + :param package_mass_g: The package_mass_g of this CreateEcommerceEstimateRequest. # noqa: E501 + :type: int + """ + if ( + self.local_vars_configuration.client_side_validation + and package_mass_g is None + ): # noqa: E501 + raise ValueError( + "Invalid value for `package_mass_g`, must not be `None`" + ) # noqa: E501 + if ( + self.local_vars_configuration.client_side_validation + and package_mass_g is not None + and package_mass_g > 2000000000 + ): # noqa: E501 + raise ValueError( + "Invalid value for `package_mass_g`, must be a value less than or equal to `2000000000`" + ) # noqa: E501 + if ( + self.local_vars_configuration.client_side_validation + and package_mass_g is not None + and package_mass_g < 0 + ): # noqa: E501 + raise ValueError( + "Invalid value for `package_mass_g`, must be a value greater than or equal to `0`" + ) # noqa: E501 + + self._package_mass_g = package_mass_g + + @property + def transportation_method(self): + """Gets the transportation_method of this CreateEcommerceEstimateRequest. # noqa: E501 + + + :return: The transportation_method of this CreateEcommerceEstimateRequest. # noqa: E501 + :rtype: str + """ + return self._transportation_method + + @transportation_method.setter + def transportation_method(self, transportation_method): + """Sets the transportation_method of this CreateEcommerceEstimateRequest. + + + :param transportation_method: The transportation_method of this CreateEcommerceEstimateRequest. # noqa: E501 + :type: str + """ + if ( + self.local_vars_configuration.client_side_validation + and transportation_method is None + ): # noqa: E501 + raise ValueError( + "Invalid value for `transportation_method`, must not be `None`" + ) # noqa: E501 + allowed_values = ["air", "rail", "road", "sea"] # noqa: E501 + if ( + self.local_vars_configuration.client_side_validation + and transportation_method not in allowed_values + ): # noqa: E501 + raise ValueError( + "Invalid value for `transportation_method` ({0}), must be one of {1}".format( # noqa: E501 + transportation_method, allowed_values + ) + ) + + self._transportation_method = transportation_method + + @property + def project_id(self): + """Gets the project_id of this CreateEcommerceEstimateRequest. # noqa: E501 + + + :return: The project_id of this CreateEcommerceEstimateRequest. # noqa: E501 + :rtype: str + """ + return self._project_id + + @project_id.setter + def project_id(self, project_id): + """Sets the project_id of this CreateEcommerceEstimateRequest. + + + :param project_id: The project_id of this CreateEcommerceEstimateRequest. # noqa: E501 + :type: str + """ + + self._project_id = project_id + + @property + def create_order(self): + """Gets the create_order of this CreateEcommerceEstimateRequest. # noqa: E501 + + + :return: The create_order of this CreateEcommerceEstimateRequest. # noqa: E501 + :rtype: bool + """ + return self._create_order + + @create_order.setter + def create_order(self, create_order): + """Sets the create_order of this CreateEcommerceEstimateRequest. + + + :param create_order: The create_order of this CreateEcommerceEstimateRequest. # noqa: E501 + :type: bool + """ + + self._create_order = create_order + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.openapi_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list( + map(lambda x: x.to_dict() if hasattr(x, "to_dict") else x, value) + ) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict( + map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") + else item, + value.items(), + ) + ) + else: + result[attr] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, CreateEcommerceEstimateRequest): + return False + + return self.to_dict() == other.to_dict() + + def __ne__(self, other): + """Returns true if both objects are not equal""" + if not isinstance(other, CreateEcommerceEstimateRequest): + return True + + return self.to_dict() != other.to_dict() diff --git a/patch_api/models/create_rail_shipping_estimate_request.py b/patch_api/models/create_rail_shipping_estimate_request.py index 3966b4b..be84474 100644 --- a/patch_api/models/create_rail_shipping_estimate_request.py +++ b/patch_api/models/create_rail_shipping_estimate_request.py @@ -71,7 +71,7 @@ def __init__( origin_postal_code=None, fuel_type="default", freight_mass_g=None, - emissions_scope="wtw", + emissions_scope="ttw", project_id=None, create_order=False, local_vars_configuration=None, diff --git a/patch_api/models/create_road_shipping_estimate_request.py b/patch_api/models/create_road_shipping_estimate_request.py index 5133ba6..6163dfa 100644 --- a/patch_api/models/create_road_shipping_estimate_request.py +++ b/patch_api/models/create_road_shipping_estimate_request.py @@ -79,7 +79,7 @@ def __init__( origin_postal_code=None, cargo_type="average_mixed", container_size_code=None, - emissions_scope="wtw", + emissions_scope="ttw", freight_mass_g=None, fuel_type="diesel", number_of_containers=None, diff --git a/patch_api/models/create_sea_shipping_estimate_request.py b/patch_api/models/create_sea_shipping_estimate_request.py index fa99f77..1ea0c6a 100644 --- a/patch_api/models/create_sea_shipping_estimate_request.py +++ b/patch_api/models/create_sea_shipping_estimate_request.py @@ -76,7 +76,7 @@ def __init__( origin_locode=None, origin_postal_code=None, container_size_code=None, - emissions_scope="wtw", + emissions_scope="ttw", freight_mass_g=None, freight_volume_cubic_m=None, number_of_containers=None, diff --git a/setup.py b/setup.py index d34d1bc..572d46f 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ from setuptools import setup, find_packages # noqa: H301 NAME = "patch-api" -VERSION = "1.24.1" +VERSION = "1.24.2" # To install the library, run the following # # python setup.py install diff --git a/test/test_estimates_api.py b/test/test_estimates_api.py index f0ddce7..81c44b3 100644 --- a/test/test_estimates_api.py +++ b/test/test_estimates_api.py @@ -195,6 +195,27 @@ def test_create_hotel_estimate(self): estimate.data.mass_g, 15_000 ) # not setting an exact value since this is changing daily + def test_create_and_retrieve_ecommerce_estimate(self): + """Test case for create_ecommerce_estimate + + Create an estimate based on the shipping distance, transportation method, and package mass # noqa: E501 + """ + distance_m = 10000000 + package_mass_g = 1000 + transportation_method = "sea" + estimate = self.api.create_ecommerce_estimate( + distance_m=distance_m, + package_mass_g=package_mass_g, + transportation_method=transportation_method, + create_order=False, + ) + self.assertEqual(estimate.data.order, None) + self.assertEqual(estimate.data.type, "ecommerce") + self.assertGreater(estimate.data.mass_g, 200) + + retrieved_estimate = self.api.retrieve_estimate(id=estimate.data.id) + self.assertTrue(retrieved_estimate) + def test_create_air_shipping_estimate_airport_iatas(self): """Test case for create_air_shipping_estimate