diff --git a/.release.json b/.release.json index 646ab9c..9d7d265 100644 --- a/.release.json +++ b/.release.json @@ -1,9 +1,9 @@ { "source": { "repo_url": "https://github.com/onfido/onfido-openapi-spec", - "short_sha": "4b15a26", - "long_sha": "4b15a26d432dcb9c3788cece0a46b5157b2e8b99", - "version": "v5.1.0" + "short_sha": "7e25a63", + "long_sha": "7e25a6309b60d2433a634d4dbde59f589b0468ec", + "version": "v5.2.0" }, - "release": "v5.1.0" + "release": "v5.2.0" } diff --git a/onfido/__init__.py b/onfido/__init__.py index 4af6236..0f7c2a5 100644 --- a/onfido/__init__.py +++ b/onfido/__init__.py @@ -14,7 +14,7 @@ """ # noqa: E501 -__version__ = "5.1.0" +__version__ = "5.2.0" # import apis into sdk package from onfido.api.default_api import DefaultApi @@ -242,6 +242,8 @@ from onfido.models.repeat_attempts_list import RepeatAttemptsList from onfido.models.repeat_attempts_list_repeat_attempts_inner import RepeatAttemptsListRepeatAttemptsInner from onfido.models.report import Report +from onfido.models.report_configuration import ReportConfiguration +from onfido.models.report_configuration_facial_similarity import ReportConfigurationFacialSimilarity from onfido.models.report_document import ReportDocument from onfido.models.report_name import ReportName from onfido.models.report_result import ReportResult diff --git a/onfido/api_client.py b/onfido/api_client.py index b61d978..4d05df6 100644 --- a/onfido/api_client.py +++ b/onfido/api_client.py @@ -90,7 +90,7 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = 'onfido-python/5.1.0' + self.user_agent = 'onfido-python/5.2.0' self.client_side_validation = configuration.client_side_validation def __enter__(self): diff --git a/onfido/configuration.py b/onfido/configuration.py index 3d3de9b..9826099 100644 --- a/onfido/configuration.py +++ b/onfido/configuration.py @@ -501,7 +501,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: v3.6\n"\ - "SDK Package Version: 5.1.0".\ + "SDK Package Version: 5.2.0".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/onfido/models/__init__.py b/onfido/models/__init__.py index eaca986..78ebc04 100644 --- a/onfido/models/__init__.py +++ b/onfido/models/__init__.py @@ -225,6 +225,8 @@ from onfido.models.repeat_attempts_list import RepeatAttemptsList from onfido.models.repeat_attempts_list_repeat_attempts_inner import RepeatAttemptsListRepeatAttemptsInner from onfido.models.report import Report +from onfido.models.report_configuration import ReportConfiguration +from onfido.models.report_configuration_facial_similarity import ReportConfigurationFacialSimilarity from onfido.models.report_document import ReportDocument from onfido.models.report_name import ReportName from onfido.models.report_result import ReportResult diff --git a/onfido/models/check_builder.py b/onfido/models/check_builder.py index 53ef38b..851bfb3 100644 --- a/onfido/models/check_builder.py +++ b/onfido/models/check_builder.py @@ -19,6 +19,7 @@ from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictStr from typing import Any, ClassVar, Dict, List, Optional +from onfido.models.report_configuration import ReportConfiguration from onfido.models.report_name import ReportName from onfido.models.us_driving_licence_builder import UsDrivingLicenceBuilder from typing import Optional, Set @@ -41,8 +42,9 @@ class CheckBuilder(BaseModel): sub_result: Optional[StrictStr] = Field(default=None, description="Triggers responses for particular sub-results for sandbox Document reports.") consider: Optional[List[ReportName]] = Field(default=None, description="Array of names of particular reports to return consider as their results. This is a feature available in sandbox testing") us_driving_licence: Optional[UsDrivingLicenceBuilder] = None + report_configuration: Optional[ReportConfiguration] = None additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = ["webhook_ids", "applicant_id", "applicant_provides_data", "tags", "redirect_uri", "privacy_notices_read_consent_given", "report_names", "document_ids", "asynchronous", "suppress_form_emails", "sub_result", "consider", "us_driving_licence"] + __properties: ClassVar[List[str]] = ["webhook_ids", "applicant_id", "applicant_provides_data", "tags", "redirect_uri", "privacy_notices_read_consent_given", "report_names", "document_ids", "asynchronous", "suppress_form_emails", "sub_result", "consider", "us_driving_licence", "report_configuration"] model_config = ConfigDict( populate_by_name=True, @@ -88,6 +90,9 @@ def to_dict(self) -> Dict[str, Any]: # override the default output from pydantic by calling `to_dict()` of us_driving_licence if self.us_driving_licence: _dict['us_driving_licence'] = self.us_driving_licence.to_dict() + # override the default output from pydantic by calling `to_dict()` of report_configuration + if self.report_configuration: + _dict['report_configuration'] = self.report_configuration.to_dict() # puts key-value pairs in additional_properties in the top level if self.additional_properties is not None: for _key, _value in self.additional_properties.items(): @@ -117,7 +122,8 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "suppress_form_emails": obj.get("suppress_form_emails"), "sub_result": obj.get("sub_result"), "consider": obj.get("consider"), - "us_driving_licence": UsDrivingLicenceBuilder.from_dict(obj["us_driving_licence"]) if obj.get("us_driving_licence") is not None else None + "us_driving_licence": UsDrivingLicenceBuilder.from_dict(obj["us_driving_licence"]) if obj.get("us_driving_licence") is not None else None, + "report_configuration": ReportConfiguration.from_dict(obj["report_configuration"]) if obj.get("report_configuration") is not None else None }) # store additional fields in additional_properties for _key in obj.keys(): diff --git a/onfido/models/check_request.py b/onfido/models/check_request.py index d19c62c..ffd37ac 100644 --- a/onfido/models/check_request.py +++ b/onfido/models/check_request.py @@ -19,6 +19,7 @@ from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictStr from typing import Any, ClassVar, Dict, List, Optional +from onfido.models.report_configuration import ReportConfiguration from onfido.models.report_name import ReportName from onfido.models.us_driving_licence_builder import UsDrivingLicenceBuilder from typing import Optional, Set @@ -36,8 +37,9 @@ class CheckRequest(BaseModel): sub_result: Optional[StrictStr] = Field(default=None, description="Triggers responses for particular sub-results for sandbox Document reports.") consider: Optional[List[ReportName]] = Field(default=None, description="Array of names of particular reports to return consider as their results. This is a feature available in sandbox testing") us_driving_licence: Optional[UsDrivingLicenceBuilder] = None + report_configuration: Optional[ReportConfiguration] = None additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = ["report_names", "document_ids", "applicant_provides_data", "asynchronous", "suppress_form_emails", "sub_result", "consider", "us_driving_licence"] + __properties: ClassVar[List[str]] = ["report_names", "document_ids", "applicant_provides_data", "asynchronous", "suppress_form_emails", "sub_result", "consider", "us_driving_licence", "report_configuration"] model_config = ConfigDict( populate_by_name=True, @@ -83,6 +85,9 @@ def to_dict(self) -> Dict[str, Any]: # override the default output from pydantic by calling `to_dict()` of us_driving_licence if self.us_driving_licence: _dict['us_driving_licence'] = self.us_driving_licence.to_dict() + # override the default output from pydantic by calling `to_dict()` of report_configuration + if self.report_configuration: + _dict['report_configuration'] = self.report_configuration.to_dict() # puts key-value pairs in additional_properties in the top level if self.additional_properties is not None: for _key, _value in self.additional_properties.items(): @@ -107,7 +112,8 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "suppress_form_emails": obj.get("suppress_form_emails"), "sub_result": obj.get("sub_result"), "consider": obj.get("consider"), - "us_driving_licence": UsDrivingLicenceBuilder.from_dict(obj["us_driving_licence"]) if obj.get("us_driving_licence") is not None else None + "us_driving_licence": UsDrivingLicenceBuilder.from_dict(obj["us_driving_licence"]) if obj.get("us_driving_licence") is not None else None, + "report_configuration": ReportConfiguration.from_dict(obj["report_configuration"]) if obj.get("report_configuration") is not None else None }) # store additional fields in additional_properties for _key in obj.keys(): diff --git a/onfido/models/report_configuration.py b/onfido/models/report_configuration.py new file mode 100644 index 0000000..52568d5 --- /dev/null +++ b/onfido/models/report_configuration.py @@ -0,0 +1,119 @@ +# coding: utf-8 + +""" + Onfido API v3.6 + + The Onfido API (v3.6) + + The version of the OpenAPI document: v3.6 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict +from typing import Any, ClassVar, Dict, List, Optional +from onfido.models.report_configuration_facial_similarity import ReportConfigurationFacialSimilarity +from typing import Optional, Set +from typing_extensions import Self + +class ReportConfiguration(BaseModel): + """ + Defines configuration options for facial similarity checks used to distinguish between onboarding and reverification scenarios. + """ # noqa: E501 + facial_similarity_photo: Optional[ReportConfigurationFacialSimilarity] = None + facial_similarity_photo_fully_auto: Optional[ReportConfigurationFacialSimilarity] = None + facial_similarity_video: Optional[ReportConfigurationFacialSimilarity] = None + facial_similarity_motion: Optional[ReportConfigurationFacialSimilarity] = None + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["facial_similarity_photo", "facial_similarity_photo_fully_auto", "facial_similarity_video", "facial_similarity_motion"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ReportConfiguration from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + excluded_fields: Set[str] = set([ + "additional_properties", + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of facial_similarity_photo + if self.facial_similarity_photo: + _dict['facial_similarity_photo'] = self.facial_similarity_photo.to_dict() + # override the default output from pydantic by calling `to_dict()` of facial_similarity_photo_fully_auto + if self.facial_similarity_photo_fully_auto: + _dict['facial_similarity_photo_fully_auto'] = self.facial_similarity_photo_fully_auto.to_dict() + # override the default output from pydantic by calling `to_dict()` of facial_similarity_video + if self.facial_similarity_video: + _dict['facial_similarity_video'] = self.facial_similarity_video.to_dict() + # override the default output from pydantic by calling `to_dict()` of facial_similarity_motion + if self.facial_similarity_motion: + _dict['facial_similarity_motion'] = self.facial_similarity_motion.to_dict() + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ReportConfiguration from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "facial_similarity_photo": ReportConfigurationFacialSimilarity.from_dict(obj["facial_similarity_photo"]) if obj.get("facial_similarity_photo") is not None else None, + "facial_similarity_photo_fully_auto": ReportConfigurationFacialSimilarity.from_dict(obj["facial_similarity_photo_fully_auto"]) if obj.get("facial_similarity_photo_fully_auto") is not None else None, + "facial_similarity_video": ReportConfigurationFacialSimilarity.from_dict(obj["facial_similarity_video"]) if obj.get("facial_similarity_video") is not None else None, + "facial_similarity_motion": ReportConfigurationFacialSimilarity.from_dict(obj["facial_similarity_motion"]) if obj.get("facial_similarity_motion") is not None else None + }) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj + + diff --git a/onfido/models/report_configuration_facial_similarity.py b/onfido/models/report_configuration_facial_similarity.py new file mode 100644 index 0000000..994d805 --- /dev/null +++ b/onfido/models/report_configuration_facial_similarity.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + Onfido API v3.6 + + The Onfido API (v3.6) + + The version of the OpenAPI document: v3.6 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self + +class ReportConfigurationFacialSimilarity(BaseModel): + """ + ReportConfigurationFacialSimilarity + """ # noqa: E501 + use_case: Optional[StrictStr] = Field(default=None, description="You should set it to \"reverification\" on a post-onboarding scenario (e.g. ongoing authentication). ") + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["use_case"] + + @field_validator('use_case') + def use_case_validate_enum(cls, value): + """Validates the enum""" + if value is None: + return value + + if value not in set(['onboarding', 'reverification', 'unknown_default_open_api']): + raise ValueError("must be one of enum values ('onboarding', 'reverification', 'unknown_default_open_api')") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ReportConfigurationFacialSimilarity from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + excluded_fields: Set[str] = set([ + "additional_properties", + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ReportConfigurationFacialSimilarity from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "use_case": obj.get("use_case") + }) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj + + diff --git a/poetry.lock b/poetry.lock index 732e2bc..42ad3a2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -147,15 +147,18 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.2.2" +version = "1.3.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, + {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, + {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, ] +[package.dependencies] +typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} + [package.extras] test = ["pytest (>=6)"] diff --git a/pyproject.toml b/pyproject.toml index 629ff85..895725d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "onfido-python" -version = "5.1.0" +version = "5.2.0" description = "Python library for the Onfido API" authors = ["OpenAPI Generator Community "] license = "MIT" diff --git a/setup.py b/setup.py index a4d8929..01e28f1 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "onfido-python" -VERSION = "5.1.0" +VERSION = "5.2.0" PYTHON_REQUIRES = ">= 3.8" REQUIRES = [ "urllib3 >= 1.25.3, < 3.0.0", diff --git a/tests/conftest.py b/tests/conftest.py index baf1a46..ab1b852 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -86,6 +86,7 @@ def create_check( applicant_id=None, document_ids=None, report_names=None, + report_configuration=None ): if check_builder is None: return onfido_api.create_check( @@ -94,6 +95,7 @@ def create_check( document_ids=document_ids, report_names=report_names, privacy_notices_read_consent_given=True, + report_configuration=report_configuration, ) ) diff --git a/tests/test_report_schemas.py b/tests/test_report_schemas.py index fcce68a..0de78e6 100644 --- a/tests/test_report_schemas.py +++ b/tests/test_report_schemas.py @@ -69,6 +69,11 @@ def test_schema_of_facial_similarity_report_is_valid( applicant_id=applicant_id, document_ids=[document_id], report_names=[ReportName.FACIAL_SIMILARITY_PHOTO], + report_configuration={ + 'facial_similarity_photo': { + 'use_case': 'reverification' + } + }, ).report_ids[0] facial_similarity_report = repeat_request_until_status_changes(