From 95e76c3ab9c86a996583b02019162036af650cd5 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 20 Sep 2024 14:52:35 +0500 Subject: [PATCH] bsdd classes - typing for not required attributes --- src/bsdd/bsdd.py | 482 ++++++++++++++++++------------------- src/bsdd/pyproject.toml | 5 +- src/bsdd/yml_to_classes.py | 4 +- 3 files changed, 246 insertions(+), 245 deletions(-) diff --git a/src/bsdd/bsdd.py b/src/bsdd/bsdd.py index 4ab9a72b4b..d770b3c38b 100644 --- a/src/bsdd/bsdd.py +++ b/src/bsdd/bsdd.py @@ -24,6 +24,7 @@ import requests import webbrowser import http.server from typing import TypedDict, Literal, Optional +from typing_extensions import NotRequired __version__ = version = "0.0.0" @@ -31,9 +32,6 @@ __version__ = version = "0.0.0" Status = Literal["Preview", "Active", "Inactive"] ClassTypes = Literal["Class", "GroupOfProperties", "AlternativeUse", "Material"] -# NOTE: Some values in TypedDicts are actually not guaranteed to be provided -# and should be typed with NotRequired. - # Use yml_to_classes.py to update classes. class DictionaryContractV1(TypedDict): @@ -46,33 +44,33 @@ class DictionaryContractV1(TypedDict): defaultLanguageCode: str isLatestVersion: bool isVerified: bool - license: str - licenseUrl: str - qualityAssuranceProcedure: str - qualityAssuranceProcedureUrl: str - status: str - moreInfoUrl: str - releaseDate: str - lastUpdatedUtc: str - availableLanguages: list[CodeNameDto] + license: NotRequired[str] + licenseUrl: NotRequired[str] + qualityAssuranceProcedure: NotRequired[str] + qualityAssuranceProcedureUrl: NotRequired[str] + status: NotRequired[str] + moreInfoUrl: NotRequired[str] + releaseDate: NotRequired[str] + lastUpdatedUtc: NotRequired[str] + availableLanguages: NotRequired[list[CodeNameDto]] class DictionaryResponseContractV1(TypedDict): - totalCount: int - offset: int - count: int - dictionaries: list[DictionaryContractV1] + totalCount: NotRequired[int] + offset: NotRequired[int] + count: NotRequired[int] + dictionaries: NotRequired[list[DictionaryContractV1]] class ClassListItemContractV1(TypedDict): - uri: str - code: str - name: str - classType: str - referenceCode: str - parentClassCode: str - descriptionPart: str - children: list[ClassListItemContractV1] + uri: NotRequired[str] + code: NotRequired[str] + name: NotRequired[str] + classType: NotRequired[str] + referenceCode: NotRequired[str] + parentClassCode: NotRequired[str] + descriptionPart: NotRequired[str] + children: NotRequired[list[ClassListItemContractV1]] class DictionaryClassesResponseContractV1(TypedDict): @@ -85,25 +83,25 @@ class DictionaryClassesResponseContractV1(TypedDict): defaultLanguageCode: str isLatestVersion: bool isVerified: bool - license: str - licenseUrl: str - qualityAssuranceProcedure: str - qualityAssuranceProcedureUrl: str - status: str - moreInfoUrl: str - releaseDate: str - lastUpdatedUtc: str - classes: list[ClassListItemContractV1] - classesTotalCount: int - classesOffset: int - classesCount: int + license: NotRequired[str] + licenseUrl: NotRequired[str] + qualityAssuranceProcedure: NotRequired[str] + qualityAssuranceProcedureUrl: NotRequired[str] + status: NotRequired[str] + moreInfoUrl: NotRequired[str] + releaseDate: NotRequired[str] + lastUpdatedUtc: NotRequired[str] + classes: NotRequired[list[ClassListItemContractV1]] + classesTotalCount: NotRequired[int] + classesOffset: NotRequired[int] + classesCount: NotRequired[int] class PropertyListItemContractV1(TypedDict): - uri: str - code: str - name: str - descriptionPart: str + uri: NotRequired[str] + code: NotRequired[str] + name: NotRequired[str] + descriptionPart: NotRequired[str] class DictionaryPropertiesResponseContractV1(TypedDict): @@ -116,234 +114,234 @@ class DictionaryPropertiesResponseContractV1(TypedDict): defaultLanguageCode: str isLatestVersion: bool isVerified: bool - license: str - licenseUrl: str - qualityAssuranceProcedure: str - qualityAssuranceProcedureUrl: str - status: str - moreInfoUrl: str - releaseDate: str - lastUpdatedUtc: str - properties: list[PropertyListItemContractV1] - propertiesTotalCount: int - propertiesOffset: int - propertiesCount: int + license: NotRequired[str] + licenseUrl: NotRequired[str] + qualityAssuranceProcedure: NotRequired[str] + qualityAssuranceProcedureUrl: NotRequired[str] + status: NotRequired[str] + moreInfoUrl: NotRequired[str] + releaseDate: NotRequired[str] + lastUpdatedUtc: NotRequired[str] + properties: NotRequired[list[PropertyListItemContractV1]] + propertiesTotalCount: NotRequired[int] + propertiesOffset: NotRequired[int] + propertiesCount: NotRequired[int] class ClassReferenceContractV1(TypedDict): uri: str - name: str - code: str + name: NotRequired[str] + code: NotRequired[str] class ClassPropertyValueContractV1(TypedDict): - uri: str - code: str + uri: NotRequired[str] + code: NotRequired[str] value: str - description: str - sortNumber: int + description: NotRequired[str] + sortNumber: NotRequired[int] class ClassPropertyContractV1(TypedDict): name: str - uri: str - description: str - definition: str - dataType: str - dimension: str - dimensionLength: int - dimensionMass: int - dimensionTime: int - dimensionElectricCurrent: int - dimensionThermodynamicTemperature: int - dimensionAmountOfSubstance: int - dimensionLuminousIntensity: int - dynamicParameterPropertyCodes: list[str] - example: str - isDynamic: bool - isRequired: bool - isWritable: bool - maxExclusive: float - maxInclusive: float - minExclusive: float - minInclusive: float - pattern: str - physicalQuantity: str - allowedValues: list[ClassPropertyValueContractV1] - predefinedValue: str - propertyCode: str - propertyDictionaryName: str - propertyDictionaryUri: str - propertyUri: str - propertySet: str - propertyStatus: str - propertyValueKind: str - symbol: str - units: list[str] - qudtCodes: list[str] + uri: NotRequired[str] + description: NotRequired[str] + definition: NotRequired[str] + dataType: NotRequired[str] + dimension: NotRequired[str] + dimensionLength: NotRequired[int] + dimensionMass: NotRequired[int] + dimensionTime: NotRequired[int] + dimensionElectricCurrent: NotRequired[int] + dimensionThermodynamicTemperature: NotRequired[int] + dimensionAmountOfSubstance: NotRequired[int] + dimensionLuminousIntensity: NotRequired[int] + dynamicParameterPropertyCodes: NotRequired[list[str]] + example: NotRequired[str] + isDynamic: NotRequired[bool] + isRequired: NotRequired[bool] + isWritable: NotRequired[bool] + maxExclusive: NotRequired[float] + maxInclusive: NotRequired[float] + minExclusive: NotRequired[float] + minInclusive: NotRequired[float] + pattern: NotRequired[str] + physicalQuantity: NotRequired[str] + allowedValues: NotRequired[list[ClassPropertyValueContractV1]] + predefinedValue: NotRequired[str] + propertyCode: NotRequired[str] + propertyDictionaryName: NotRequired[str] + propertyDictionaryUri: NotRequired[str] + propertyUri: NotRequired[str] + propertySet: NotRequired[str] + propertyStatus: NotRequired[str] + propertyValueKind: NotRequired[str] + symbol: NotRequired[str] + units: NotRequired[list[str]] + qudtCodes: NotRequired[list[str]] class PropertyContractV4(TypedDict): - dictionaryUri: str + dictionaryUri: NotRequired[str] activationDateUtc: str code: str - creatorLanguageCode: str - countriesOfUse: list[str] - countryOfOrigin: str - deActivationDateUtc: str - definition: str - deprecationExplanation: str - description: str - documentReference: str + creatorLanguageCode: NotRequired[str] + countriesOfUse: NotRequired[list[str]] + countryOfOrigin: NotRequired[str] + deActivationDateUtc: NotRequired[str] + definition: NotRequired[str] + deprecationExplanation: NotRequired[str] + description: NotRequired[str] + documentReference: NotRequired[str] name: str uri: str - replacedObjectCodes: list[str] - replacingObjectCodes: list[str] - revisionDateUtc: str - revisionNumber: int + replacedObjectCodes: NotRequired[list[str]] + replacingObjectCodes: NotRequired[list[str]] + revisionDateUtc: NotRequired[str] + revisionNumber: NotRequired[int] status: str - subdivisionsOfUse: list[str] - uid: str + subdivisionsOfUse: NotRequired[list[str]] + uid: NotRequired[str] versionDateUtc: str - versionNumber: int - visualRepresentationUri: str - connectedPropertyCodes: list[str] - dataType: str - dimension: str - dimensionLength: int - dimensionMass: int - dimensionTime: int - dimensionElectricCurrent: int - dimensionThermodynamicTemperature: int - dimensionAmountOfSubstance: int - dimensionLuminousIntensity: int - dynamicParameterPropertyCodes: list[str] - example: str - isDynamic: bool - maxExclusive: float - maxInclusive: float - methodOfMeasurement: str - minExclusive: float - minInclusive: float - pattern: str - physicalQuantity: str - allowedValues: list[PropertyValueContractV4] - propertyValueKind: str - propertyRelations: list[PropertyRelationContractV4] - textFormat: str - units: list[str] - qudtCodes: list[str] - propertyClasses: list[PropertyClassContractV4] + versionNumber: NotRequired[int] + visualRepresentationUri: NotRequired[str] + connectedPropertyCodes: NotRequired[list[str]] + dataType: NotRequired[str] + dimension: NotRequired[str] + dimensionLength: NotRequired[int] + dimensionMass: NotRequired[int] + dimensionTime: NotRequired[int] + dimensionElectricCurrent: NotRequired[int] + dimensionThermodynamicTemperature: NotRequired[int] + dimensionAmountOfSubstance: NotRequired[int] + dimensionLuminousIntensity: NotRequired[int] + dynamicParameterPropertyCodes: NotRequired[list[str]] + example: NotRequired[str] + isDynamic: NotRequired[bool] + maxExclusive: NotRequired[float] + maxInclusive: NotRequired[float] + methodOfMeasurement: NotRequired[str] + minExclusive: NotRequired[float] + minInclusive: NotRequired[float] + pattern: NotRequired[str] + physicalQuantity: NotRequired[str] + allowedValues: NotRequired[list[PropertyValueContractV4]] + propertyValueKind: NotRequired[str] + propertyRelations: NotRequired[list[PropertyRelationContractV4]] + textFormat: NotRequired[str] + units: NotRequired[list[str]] + qudtCodes: NotRequired[list[str]] + propertyClasses: NotRequired[list[PropertyClassContractV4]] class PropertyValueContractV4(TypedDict): - uri: str - code: str + uri: NotRequired[str] + code: NotRequired[str] value: str - description: str - sortNumber: int + description: NotRequired[str] + sortNumber: NotRequired[int] class PropertyRelationContractV4(TypedDict): - uri: str - relationType: str - relatedPropertyUri: str - relatedPropertyName: str + uri: NotRequired[str] + relationType: NotRequired[str] + relatedPropertyUri: NotRequired[str] + relatedPropertyName: NotRequired[str] class PropertyClassContractV4(TypedDict): - uri: str - code: str + uri: NotRequired[str] + code: NotRequired[str] name: str - definition: str - description: str - propertySet: str + definition: NotRequired[str] + description: NotRequired[str] + propertySet: NotRequired[str] class ClassRelationContractV1(TypedDict): - uri: str + uri: NotRequired[str] relationType: str relatedClassUri: str - relatedClassName: str - fraction: float + relatedClassName: NotRequired[str] + fraction: NotRequired[float] class TextSearchResponseContractV1(TypedDict): - totalCount: int - offset: int - count: int - classes: list[TextSearchResponseClassContractV1] - dictionaries: list[TextSearchResponseDictionaryContractV1] - properties: list[TextSearchResponsePropertyContractV1] + totalCount: NotRequired[int] + offset: NotRequired[int] + count: NotRequired[int] + classes: NotRequired[list[TextSearchResponseClassContractV1]] + dictionaries: NotRequired[list[TextSearchResponseDictionaryContractV1]] + properties: NotRequired[list[TextSearchResponsePropertyContractV1]] class TextSearchResponseClassContractV1(TypedDict): - dictionaryUri: str - dictionaryName: str - name: str - referenceCode: str - uri: str - classType: str - description: str - parentClassName: str - relatedIfcEntityNames: list[str] + dictionaryUri: NotRequired[str] + dictionaryName: NotRequired[str] + name: NotRequired[str] + referenceCode: NotRequired[str] + uri: NotRequired[str] + classType: NotRequired[str] + description: NotRequired[str] + parentClassName: NotRequired[str] + relatedIfcEntityNames: NotRequired[list[str]] class TextSearchResponseDictionaryContractV1(TypedDict): - uri: str - name: str + uri: NotRequired[str] + name: NotRequired[str] class TextSearchResponsePropertyContractV1(TypedDict): - dictionaryUri: str - dictionaryName: str - uri: str - name: str - description: str + dictionaryUri: NotRequired[str] + dictionaryName: NotRequired[str] + uri: NotRequired[str] + name: NotRequired[str] + description: NotRequired[str] class ClassContractV1(TypedDict): - dictionaryUri: str + dictionaryUri: NotRequired[str] activationDateUtc: str code: str - creatorLanguageCode: str - countriesOfUse: list[str] - countryOfOrigin: str - deActivationDateUtc: str - definition: str - deprecationExplanation: str - description: str - documentReference: str + creatorLanguageCode: NotRequired[str] + countriesOfUse: NotRequired[list[str]] + countryOfOrigin: NotRequired[str] + deActivationDateUtc: NotRequired[str] + definition: NotRequired[str] + deprecationExplanation: NotRequired[str] + description: NotRequired[str] + documentReference: NotRequired[str] name: str uri: str - replacedObjectCodes: list[str] - replacingObjectCodes: list[str] - revisionDateUtc: str - revisionNumber: int + replacedObjectCodes: NotRequired[list[str]] + replacingObjectCodes: NotRequired[list[str]] + revisionDateUtc: NotRequired[str] + revisionNumber: NotRequired[int] status: str - subdivisionsOfUse: list[str] - uid: str + subdivisionsOfUse: NotRequired[list[str]] + uid: NotRequired[str] versionDateUtc: str - versionNumber: int - visualRepresentationUri: str - classType: str - referenceCode: str - synonyms: list[str] - relatedIfcEntityNames: list[str] - parentClassReference: ClassReferenceContractV1 - classProperties: list[ClassPropertyContractV1] - classRelations: list[ClassRelationContractV1] - childClassReferences: list[ClassReferenceContractV1] - reverseClassRelations: list[ClassReverseRelationContractV1] - hierarchy: list[HierarchyItemContractV1] + versionNumber: NotRequired[int] + visualRepresentationUri: NotRequired[str] + classType: NotRequired[str] + referenceCode: NotRequired[str] + synonyms: NotRequired[list[str]] + relatedIfcEntityNames: NotRequired[list[str]] + parentClassReference: NotRequired[ClassReferenceContractV1] + classProperties: NotRequired[list[ClassPropertyContractV1]] + classRelations: NotRequired[list[ClassRelationContractV1]] + childClassReferences: NotRequired[list[ClassReferenceContractV1]] + reverseClassRelations: NotRequired[list[ClassReverseRelationContractV1]] + hierarchy: NotRequired[list[HierarchyItemContractV1]] class ClassReverseRelationContractV1(TypedDict): relationType: str classUri: str - className: str - fraction: float - dictionaryUri: str + className: NotRequired[str] + fraction: NotRequired[float] + dictionaryUri: NotRequired[str] class HierarchyItemContractV1(TypedDict): @@ -354,49 +352,49 @@ class HierarchyItemContractV1(TypedDict): class SearchInDictionaryResponseContractV1(TypedDict): - totalCount: int - offset: int - count: int - dictionary: DictionarySearchResultContractV1 + totalCount: NotRequired[int] + offset: NotRequired[int] + count: NotRequired[int] + dictionary: NotRequired[DictionarySearchResultContractV1] class DictionarySearchResultContractV1(TypedDict): - name: str - uri: str - classes: list[ClassSearchResultContractV1] + name: NotRequired[str] + uri: NotRequired[str] + classes: NotRequired[list[ClassSearchResultContractV1]] class ClassSearchResultContractV1(TypedDict): - name: str - uri: str - referenceCode: str - classType: str - definition: str - synonyms: list[str] + name: NotRequired[str] + uri: NotRequired[str] + referenceCode: NotRequired[str] + classType: NotRequired[str] + definition: NotRequired[str] + synonyms: NotRequired[list[str]] class ClassSearchResponseContractV1(TypedDict): - totalCount: int - offset: int - count: int - classes: list[ClassSearchResponseClassContractV1] + totalCount: NotRequired[int] + offset: NotRequired[int] + count: NotRequired[int] + classes: NotRequired[list[ClassSearchResponseClassContractV1]] class ClassSearchResponseClassContractV1(TypedDict): - dictionaryUri: str - dictionaryName: str - name: str - referenceCode: str - uri: str - classType: str - description: str - parentClassName: str - relatedIfcEntityNames: list[str] + dictionaryUri: NotRequired[str] + dictionaryName: NotRequired[str] + name: NotRequired[str] + referenceCode: NotRequired[str] + uri: NotRequired[str] + classType: NotRequired[str] + description: NotRequired[str] + parentClassName: NotRequired[str] + relatedIfcEntityNames: NotRequired[list[str]] class CountryContractV1(TypedDict): - code: str - name: str + code: NotRequired[str] + name: NotRequired[str] class LanguageContractV1(TypedDict): @@ -405,21 +403,21 @@ class LanguageContractV1(TypedDict): class ReferenceDocumentContractV1(TypedDict): - title: str - name: str - date: str + title: NotRequired[str] + name: NotRequired[str] + date: NotRequired[str] class UnitContractV1(TypedDict): - code: str - name: str - symbol: str - qudtUri: str + code: NotRequired[str] + name: NotRequired[str] + symbol: NotRequired[str] + qudtUri: NotRequired[str] class CodeNameDto(TypedDict): - code: str - name: str + code: NotRequired[str] + name: NotRequired[str] class OAuthReceiver(http.server.BaseHTTPRequestHandler): diff --git a/src/bsdd/pyproject.toml b/src/bsdd/pyproject.toml index c648a82d32..0a9df5cb79 100644 --- a/src/bsdd/pyproject.toml +++ b/src/bsdd/pyproject.toml @@ -23,7 +23,10 @@ classifiers = [ "Programming Language :: Python :: Implementation :: PyPy", "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", ] -dependencies = ["requests"] +dependencies = [ + "requests", + "typing-extensions", +] [project.optional-dependencies] dev = [ diff --git a/src/bsdd/yml_to_classes.py b/src/bsdd/yml_to_classes.py index 659b943699..ba53917051 100644 --- a/src/bsdd/yml_to_classes.py +++ b/src/bsdd/yml_to_classes.py @@ -59,8 +59,8 @@ if __name__ == "__main__": props_str = "" for prop_name, prop_data in props.items(): python_type = get_python_type(prop_data) - # if prop_name not in required: - # python_type = f"NotRequired[{python_type}]" + if prop_name not in required: + python_type = f"NotRequired[{python_type}]" props_str += f" {prop_name}: {python_type}\n" class_strings[class_header] = props_str