From 374507ead6c95fcb20a29a50ec645deec4b57b0f Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Fri, 3 May 2024 14:42:03 +0200 Subject: [PATCH] Use more concrete types --- src/pysdmx/fmr/__init__.py | 11 ++++---- src/pysdmx/fmr/fusion/dataflow.py | 12 ++++++--- src/pysdmx/fmr/fusion/org.py | 45 ++++++++++++++++++++++--------- src/pysdmx/fmr/sdmx/dataflow.py | 12 ++++++--- src/pysdmx/fmr/sdmx/org.py | 20 +++++++------- 5 files changed, 67 insertions(+), 33 deletions(-) diff --git a/src/pysdmx/fmr/__init__.py b/src/pysdmx/fmr/__init__.py index ec405c6..c9d17ec 100644 --- a/src/pysdmx/fmr/__init__.py +++ b/src/pysdmx/fmr/__init__.py @@ -19,15 +19,16 @@ from pysdmx.fmr.reader import Deserializer from pysdmx.fmr.sdmx import deserializers as sdmx_deserializers from pysdmx.model import ( + Agency, CategoryScheme, Codelist, ConceptScheme, DataflowInfo, + DataProvider, Hierarchy, HierarchyAssociation, MetadataReport, MultiRepresentationMap, - Organisation, RepresentationMap, Schema, StructureMap, @@ -247,7 +248,7 @@ def __get_hierarchies_for_pra( out = self.__fetch(super()._url("ha_pra", agency, pra, version)) return super()._out(out, self.deser.hier_assoc) - def get_agencies(self, agency: str) -> Sequence[Organisation]: + def get_agencies(self, agency: str) -> Sequence[Agency]: """Get the list of **sub-agencies** for the supplied agency. Args: @@ -264,7 +265,7 @@ def get_providers( self, agency: str, with_flows: bool = False, - ) -> Sequence[Organisation]: + ) -> Sequence[DataProvider]: """Get the list of **data providers** for the supplied agency. Args: @@ -579,7 +580,7 @@ async def __get_hierarchies_for_pra( out = await self.__fetch(super()._url("ha_pra", agency, pra, version)) return super()._out(out, self.deser.hier_assoc) - async def get_agencies(self, agency: str) -> Sequence[Organisation]: + async def get_agencies(self, agency: str) -> Sequence[Agency]: """Get the list of **sub-agencies** for the supplied agency. Args: @@ -594,7 +595,7 @@ async def get_agencies(self, agency: str) -> Sequence[Organisation]: async def get_providers( self, agency: str, with_flows: bool = False - ) -> Sequence[Organisation]: + ) -> Sequence[DataProvider]: """Get the list of **data providers** for the supplied agency. Args: diff --git a/src/pysdmx/fmr/fusion/dataflow.py b/src/pysdmx/fmr/fusion/dataflow.py index 4a557a3..0a217b4 100644 --- a/src/pysdmx/fmr/fusion/dataflow.py +++ b/src/pysdmx/fmr/fusion/dataflow.py @@ -6,7 +6,13 @@ from pysdmx.fmr.fusion.core import FusionString from pysdmx.fmr.fusion.org import FusionProviderScheme -from pysdmx.model import Components, DataflowInfo, DataflowRef, Organisation +from pysdmx.model import ( + Agency, + Components, + DataflowInfo, + DataflowRef, + DataProvider, +) class FusionDataflowRef(Struct, frozen=True, rename={"agency": "agencyId"}): @@ -64,7 +70,7 @@ def to_model( self, components: Components, agency: str, id_: str, version: str ) -> DataflowInfo: """Returns the requested dataflow details.""" - prvs: List[Organisation] = [] + prvs: List[DataProvider] = [] for dps in self.DataProviderScheme: prvs.extend(dps.to_model([])) df = list( @@ -76,7 +82,7 @@ def to_model( return DataflowInfo( df.id, components, - Organisation(df.agency), + Agency(df.agency), df.names[0].value, df.descriptions[0].value if df.descriptions else None, df.version, diff --git a/src/pysdmx/fmr/fusion/org.py b/src/pysdmx/fmr/fusion/org.py index f4b1bc5..79998e3 100644 --- a/src/pysdmx/fmr/fusion/org.py +++ b/src/pysdmx/fmr/fusion/org.py @@ -6,7 +6,7 @@ from msgspec import Struct from pysdmx.fmr.fusion.core import FusionString -from pysdmx.model import Contact, DataflowRef, Organisation +from pysdmx.model import Agency, Contact, DataflowRef, DataProvider from pysdmx.util import parse_urn @@ -40,7 +40,7 @@ def to_model(self) -> Contact: ) -class FusionOrg(Struct, frozen=True): +class FusionAgency(Struct, frozen=True): """Fusion-JSON payload for an organisation.""" id: str @@ -48,17 +48,38 @@ class FusionOrg(Struct, frozen=True): descriptions: Optional[Sequence[FusionString]] = None contacts: Sequence[FusionContact] = () - def to_model(self, owner: Optional[str] = None) -> Organisation: + def to_model(self, owner: Optional[str] = None) -> Agency: """Converts a FusionOrg to a standard Organisation.""" d = self.descriptions[0].value if self.descriptions else None c = [c.to_model() for c in self.contacts] oid = f"{owner}.{self.id}" if owner and owner != "SDMX" else self.id if c: - return Organisation( + return Agency( id=oid, name=self.names[0].value, description=d, contacts=c ) else: - return Organisation( + return Agency(id=oid, name=self.names[0].value, description=d) + + +class FusionProvider(Struct, frozen=True): + """Fusion-JSON payload for an organisation.""" + + id: str + names: Sequence[FusionString] + descriptions: Optional[Sequence[FusionString]] = None + contacts: Sequence[FusionContact] = () + + def to_model(self, owner: Optional[str] = None) -> DataProvider: + """Converts a FusionOrg to a standard Organisation.""" + d = self.descriptions[0].value if self.descriptions else None + c = [c.to_model() for c in self.contacts] + oid = f"{owner}.{self.id}" if owner and owner != "SDMX" else self.id + if c: + return DataProvider( + id=oid, name=self.names[0].value, description=d, contacts=c + ) + else: + return DataProvider( id=oid, name=self.names[0].value, description=d ) @@ -67,9 +88,9 @@ class FusionAgencyScheme(Struct, frozen=True): """Fusion-JSON payload for an agency scheme.""" agencyId: str - items: Sequence[FusionOrg] + items: Sequence[FusionAgency] - def to_model(self) -> Sequence[Organisation]: + def to_model(self) -> Sequence[Agency]: """Converts a FusionAgencyScheme to a list of Organisations.""" return [o.to_model(self.agencyId) for o in self.items] @@ -79,7 +100,7 @@ class FusionAgencyMessage(Struct, frozen=True): AgencyScheme: Sequence[FusionAgencyScheme] - def to_model(self) -> Sequence[Organisation]: + def to_model(self) -> Sequence[Agency]: """Returns the requested list of agencies.""" return self.AgencyScheme[0].to_model() @@ -94,7 +115,7 @@ class FusionProvisionAgreement(Struct, frozen=True): class FusionProviderScheme(Struct, frozen=True): """Fusion-JSON payload for a data provider scheme.""" - items: Sequence[FusionOrg] + items: Sequence[FusionProvider] def __get_df_ref(self, ref: str) -> DataflowRef: a = parse_urn(ref) @@ -102,7 +123,7 @@ def __get_df_ref(self, ref: str) -> DataflowRef: def to_model( self, pas: Sequence[FusionProvisionAgreement] - ) -> Sequence[Organisation]: + ) -> Sequence[DataProvider]: """Converts a FusionProviderScheme to a list of Organisations.""" if pas: paprs: Dict[str, Set[DataflowRef]] = defaultdict(set) @@ -112,7 +133,7 @@ def to_model( paprs[pr].add(df) prvs = [o.to_model() for o in self.items] return [ - Organisation( + DataProvider( id=p.id, name=p.name, description=p.description, @@ -131,6 +152,6 @@ class FusionProviderMessage(Struct, frozen=True): DataProviderScheme: Sequence[FusionProviderScheme] ProvisionAgreement: Sequence[FusionProvisionAgreement] = () - def to_model(self) -> Sequence[Organisation]: + def to_model(self) -> Sequence[DataProvider]: """Returns the requested list of providers.""" return self.DataProviderScheme[0].to_model(self.ProvisionAgreement) diff --git a/src/pysdmx/fmr/sdmx/dataflow.py b/src/pysdmx/fmr/sdmx/dataflow.py index 2db98ad..61ea1ca 100644 --- a/src/pysdmx/fmr/sdmx/dataflow.py +++ b/src/pysdmx/fmr/sdmx/dataflow.py @@ -5,7 +5,13 @@ from msgspec import Struct from pysdmx.fmr.sdmx.org import JsonDataProviderScheme -from pysdmx.model import Components, DataflowInfo, DataflowRef, Organisation +from pysdmx.model import ( + Agency, + Components, + DataflowInfo, + DataflowRef, + DataProvider, +) class JsonDataflowRef(Struct, frozen=True, rename={"agency": "agencyID"}): @@ -59,7 +65,7 @@ def to_model( self, components: Components, agency: str, id_: str, version: str ) -> DataflowInfo: """Returns the requested dataflow details.""" - prvs: List[Organisation] = [] + prvs: List[DataProvider] = [] for dps in self.dataProviderSchemes: prvs.extend(dps.dataProviders) df = list( @@ -71,7 +77,7 @@ def to_model( return DataflowInfo( df.id, components, - Organisation(df.agency), + Agency(df.agency), df.name, df.description, df.version, diff --git a/src/pysdmx/fmr/sdmx/org.py b/src/pysdmx/fmr/sdmx/org.py index bdd0f87..1039a66 100644 --- a/src/pysdmx/fmr/sdmx/org.py +++ b/src/pysdmx/fmr/sdmx/org.py @@ -6,14 +6,14 @@ from msgspec import Struct from pysdmx.fmr.sdmx.pa import JsonProvisionAgreement -from pysdmx.model import DataflowRef, Organisation +from pysdmx.model import Agency, DataflowRef, DataProvider from pysdmx.util import parse_urn class JsonDataProviderScheme(Struct, frozen=True): """SDMX-JSON payload for a data provider scheme.""" - dataProviders: Sequence[Organisation] + dataProviders: Sequence[DataProvider] def __get_df_ref(self, ref: str) -> DataflowRef: a = parse_urn(ref) @@ -21,7 +21,7 @@ def __get_df_ref(self, ref: str) -> DataflowRef: def to_model( self, pas: Sequence[JsonProvisionAgreement] - ) -> Sequence[Organisation]: + ) -> Sequence[DataProvider]: """Converts a JsonDataProviderScheme to a list of Organisations.""" if pas: paprs: Dict[str, Set[DataflowRef]] = defaultdict(set) @@ -30,7 +30,7 @@ def to_model( pr = pa.dataProvider[pa.dataProvider.rindex(".") + 1 :] paprs[pr].add(df) return [ - Organisation( + DataProvider( id=p.id, name=p.name, description=p.description, @@ -49,7 +49,7 @@ class JsonDataProviderSchemes(Struct, frozen=True): dataProviderSchemes: Sequence[JsonDataProviderScheme] provisionAgreements: Sequence[JsonProvisionAgreement] = () - def to_model(self) -> Sequence[Organisation]: + def to_model(self) -> Sequence[DataProvider]: """Converts a JsonDataProviderSchemes to a list of Organisations.""" return self.dataProviderSchemes[0].to_model(self.provisionAgreements) @@ -59,7 +59,7 @@ class JsonProviderMessage(Struct, frozen=True): data: JsonDataProviderSchemes - def to_model(self) -> Sequence[Organisation]: + def to_model(self) -> Sequence[DataProvider]: """Returns the requested list of providers.""" return self.data.to_model() @@ -68,7 +68,7 @@ class JsonAgencyScheme(Struct, frozen=True): """SDMX-JSON payload for an agency scheme.""" agencyID: str - agencies: Sequence[Organisation] + agencies: Sequence[Agency] class JsonAgencySchemes(Struct, frozen=True): @@ -82,13 +82,13 @@ class JsonAgencyMessage(Struct, frozen=True): data: JsonAgencySchemes - def __add_owner(self, owner: str, a: Organisation) -> Organisation: + def __add_owner(self, owner: str, a: Agency) -> Agency: oid = f"{owner}.{a.id}" if owner != "SDMX" else a.id - return Organisation( + return Agency( id=oid, name=a.name, description=a.description, contacts=a.contacts ) - def to_model(self) -> Sequence[Organisation]: + def to_model(self) -> Sequence[Agency]: """Returns the requested list of agencies.""" return [ self.__add_owner(self.data.agencySchemes[0].agencyID, a)