skalarsystems / fhirzeug

A Python FHIR specification parser and class generator
Apache License 2.0
17 stars 1 forks source link

ValidationError must be thrown if resourceType doesn't exists, not KeyError #44

Closed Wauplin closed 4 years ago

Wauplin commented 4 years ago

Plan is :

To reproduce issue :

issue.json

{
  "resourceType": "HealthcareService",
  "id": "example",
  "contained": [
    {
      "resourceType": "",
      "id": "DenBurg",
      "description": "Großraum Denburg",
      "mode": "instance",
      "physicalType": {
        "coding": [
          {
            "code": "area",
            "display": "Area"
          }
        ]
      }
    }
  ]
}

script.py

import json
from pathlib import Path
from pydantic_fhir import r4

data = json.load(Path("issue.json").open())
r4.from_dict(data)

Stacktrace :

Traceback (most recent call last):
  File "script.py", line 8, in <module>
    r4.from_dict(data)
  File "/home/projects/skalar/fhirzeug/pydantic-fhir/pydantic_fhir/r4.py", line 54302, in from_dict
    return RESOURCE_TYPE_MAP[dict_["resourceType"]](**dict_)
  File "/home/.cache/pypoetry/virtualenvs/pydantic-fhir-XG3S17Ik-py3.6/lib/python3.6/site-packages/pydantic/main.py", line 344, in __init__
    values, fields_set, validation_error = validate_model(__pydantic_self__.__class__, data)
  File "/home/.cache/pypoetry/virtualenvs/pydantic-fhir-XG3S17Ik-py3.6/lib/python3.6/site-packages/pydantic/main.py", line 900, in validate_model
    v_, errors_ = field.validate(value, values, loc=field.alias, cls=cls_)
  File "/home/.cache/pypoetry/virtualenvs/pydantic-fhir-XG3S17Ik-py3.6/lib/python3.6/site-packages/pydantic/fields.py", line 575, in validate
    v, errors = self._validate_sequence_like(v, values, loc, cls)
  File "/home/.cache/pypoetry/virtualenvs/pydantic-fhir-XG3S17Ik-py3.6/lib/python3.6/site-packages/pydantic/fields.py", line 606, in _validate_sequence_like
    r, ee = self._validate_singleton(v_, values, v_loc, cls)
  File "/home/.cache/pypoetry/virtualenvs/pydantic-fhir-XG3S17Ik-py3.6/lib/python3.6/site-packages/pydantic/fields.py", line 712, in _validate_singleton
    value, error = field.validate(v, values, loc=loc, cls=cls)
  File "/home/.cache/pypoetry/virtualenvs/pydantic-fhir-XG3S17Ik-py3.6/lib/python3.6/site-packages/pydantic/fields.py", line 564, in validate
    v, errors = self._validate_singleton(v, values, loc, cls)
  File "/home/.cache/pypoetry/virtualenvs/pydantic-fhir-XG3S17Ik-py3.6/lib/python3.6/site-packages/pydantic/fields.py", line 719, in _validate_singleton
    return self._apply_validators(v, values, loc, cls, self.validators)
  File "/home/.cache/pypoetry/virtualenvs/pydantic-fhir-XG3S17Ik-py3.6/lib/python3.6/site-packages/pydantic/fields.py", line 726, in _apply_validators
    v = validator(cls, v, values, self, self.model_config)
  File "/home/.cache/pypoetry/virtualenvs/pydantic-fhir-XG3S17Ik-py3.6/lib/python3.6/site-packages/pydantic/class_validators.py", line 278, in <lambda>
    return lambda cls, v, values, field, config: validator(cls, v)
  File "/home/projects/skalar/fhirzeug/pydantic-fhir/pydantic_fhir/r4.py", line 8519, in resource_factory
    return from_dict(value)
  File "/home/projects/skalar/fhirzeug/pydantic-fhir/pydantic_fhir/r4.py", line 54302, in from_dict
    return RESOURCE_TYPE_MAP[dict_["resourceType"]](**dict_)
KeyError: 'resourceType'