Skip to content

Commit

Permalink
Merge pull request #35 from bis-med-it/org_types
Browse files Browse the repository at this point in the history
Add DataProvider and DataConsumer classes
  • Loading branch information
sosna committed May 14, 2024
2 parents 02d7fbe + bbca1ea commit e5f8fc4
Show file tree
Hide file tree
Showing 16 changed files with 199 additions and 181 deletions.
11 changes: 6 additions & 5 deletions src/pysdmx/fmr/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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:
Expand All @@ -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:
Expand Down Expand Up @@ -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:
Expand All @@ -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:
Expand Down
36 changes: 22 additions & 14 deletions src/pysdmx/fmr/fusion/dataflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"}):
Expand All @@ -21,11 +27,13 @@ class FusionDataflowRef(Struct, frozen=True, rename={"agency": "agencyId"}):
def to_model(self) -> DataflowRef:
"""Converts a FusionDataflowRef to a standard dataflow ref."""
return DataflowRef(
self.id,
self.agency,
self.names[0].value if self.names else None,
self.descriptions[0].value if self.descriptions else None,
self.version,
id=self.id,
agency=self.agency,
name=self.names[0].value if self.names else None,
description=(
self.descriptions[0].value if self.descriptions else None
),
version=self.version,
)


Expand Down Expand Up @@ -64,7 +72,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(
Expand All @@ -74,12 +82,12 @@ def to_model(
)
)[0]
return DataflowInfo(
df.id,
components,
Organisation(df.agency),
df.names[0].value,
df.descriptions[0].value if df.descriptions else None,
df.version,
prvs,
id=df.id,
components=components,
agency=Agency(df.agency),
name=df.names[0].value,
description=df.descriptions[0].value if df.descriptions else None,
version=df.version,
providers=prvs,
dsd_ref=df.dataStructureRef,
)
57 changes: 43 additions & 14 deletions src/pysdmx/fmr/fusion/org.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -40,32 +40,57 @@ def to_model(self) -> Contact:
)


class FusionOrg(Struct, frozen=True):
class FusionAgency(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) -> 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(oid, self.names[0].value, d, c)
return Agency(
id=oid, name=self.names[0].value, description=d, contacts=c
)
else:
return Organisation(oid, self.names[0].value, d)
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
)


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]

Expand All @@ -75,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()

Expand All @@ -90,15 +115,15 @@ 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)
return DataflowRef(a.id, a.agency, version=a.version)
return DataflowRef(id=a.id, agency=a.agency, version=a.version)

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)
Expand All @@ -108,8 +133,12 @@ def to_model(
paprs[pr].add(df)
prvs = [o.to_model() for o in self.items]
return [
Organisation(
p.id, p.name, p.description, p.contacts, list(paprs[p.id])
DataProvider(
id=p.id,
name=p.name,
description=p.description,
contacts=p.contacts,
dataflows=list(paprs[p.id]),
)
for p in prvs
]
Expand All @@ -123,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)
34 changes: 20 additions & 14 deletions src/pysdmx/fmr/sdmx/dataflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"}):
Expand All @@ -20,11 +26,11 @@ class JsonDataflowRef(Struct, frozen=True, rename={"agency": "agencyID"}):
def to_model(self) -> DataflowRef:
"""Converts a JsonDataflowRef to a standard dataflow ref."""
return DataflowRef(
self.id,
self.agency,
self.name,
self.description,
self.version,
id=self.id,
agency=self.agency,
name=self.name,
description=self.description,
version=self.version,
)


Expand Down Expand Up @@ -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(
Expand All @@ -69,13 +75,13 @@ def to_model(
)
)[0]
return DataflowInfo(
df.id,
components,
Organisation(df.agency),
df.name,
df.description,
df.version,
prvs,
id=df.id,
components=components,
agency=Agency(df.agency),
name=df.name,
description=df.description,
version=df.version,
providers=prvs,
dsd_ref=df.structure,
)

Expand Down
30 changes: 18 additions & 12 deletions src/pysdmx/fmr/sdmx/org.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,22 @@
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)
return DataflowRef(a.id, a.agency, version=a.version)
return DataflowRef(id=a.id, agency=a.agency, version=a.version)

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)
Expand All @@ -30,8 +30,12 @@ def to_model(
pr = pa.dataProvider[pa.dataProvider.rindex(".") + 1 :]
paprs[pr].add(df)
return [
Organisation(
p.id, p.name, p.description, p.contacts, list(paprs[p.id])
DataProvider(
id=p.id,
name=p.name,
description=p.description,
contacts=p.contacts,
dataflows=list(paprs[p.id]),
)
for p in self.dataProviders
]
Expand All @@ -45,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)

Expand All @@ -55,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()

Expand All @@ -64,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):
Expand All @@ -78,11 +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(oid, a.name, a.description, a.contacts)
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)
Expand Down
Loading

0 comments on commit e5f8fc4

Please sign in to comment.