oarepo-runtime 1.5.66__py3-none-any.whl → 1.5.68__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- oarepo_runtime/info/check.py +0 -1
- oarepo_runtime/info/views.py +16 -4
- oarepo_runtime/resources/json_serializer.py +27 -0
- oarepo_runtime/services/schema/marshmallow_to_json_schema.py +72 -0
- {oarepo_runtime-1.5.66.dist-info → oarepo_runtime-1.5.68.dist-info}/METADATA +1 -1
- {oarepo_runtime-1.5.66.dist-info → oarepo_runtime-1.5.68.dist-info}/RECORD +13 -8
- tests/marshmallow_to_json/__init__.py +0 -0
- tests/marshmallow_to_json/test_datacite_ui_schema.py +1410 -0
- tests/marshmallow_to_json/test_simple_schema.py +52 -0
- {oarepo_runtime-1.5.66.dist-info → oarepo_runtime-1.5.68.dist-info}/LICENSE +0 -0
- {oarepo_runtime-1.5.66.dist-info → oarepo_runtime-1.5.68.dist-info}/WHEEL +0 -0
- {oarepo_runtime-1.5.66.dist-info → oarepo_runtime-1.5.68.dist-info}/entry_points.txt +0 -0
- {oarepo_runtime-1.5.66.dist-info → oarepo_runtime-1.5.68.dist-info}/top_level.txt +0 -0
    
        oarepo_runtime/info/check.py
    CHANGED
    
    
    
        oarepo_runtime/info/views.py
    CHANGED
    
    | @@ -105,6 +105,7 @@ class InfoResource(Resource): | |
| 105 105 | 
             
                        if model_data.get("type") != "model":
         | 
| 106 106 | 
             
                            continue
         | 
| 107 107 |  | 
| 108 | 
            +
                        resource_config_class = self._get_resource_config_class(model_data)
         | 
| 108 109 | 
             
                        service = self._get_service(model_data)
         | 
| 109 110 | 
             
                        service_class = self._get_service_class(model_data)
         | 
| 110 111 | 
             
                        if not service or type(service) != service_class:
         | 
| @@ -143,7 +144,7 @@ class InfoResource(Resource): | |
| 143 144 | 
             
                                "links": links,
         | 
| 144 145 | 
             
                                # TODO: we also need to get previous schema versions here if we support
         | 
| 145 146 | 
             
                                # multiple version of the same schema at the same time
         | 
| 146 | 
            -
                                " | 
| 147 | 
            +
                                "accept": self._get_model_accept_types(service, resource_config_class),
         | 
| 147 148 | 
             
                            }
         | 
| 148 149 | 
             
                        )
         | 
| 149 150 | 
             
                    self.call_components("model", data=data)
         | 
| @@ -273,16 +274,27 @@ class InfoResource(Resource): | |
| 273 274 | 
             
                        logger.exception("Failed to get model model endpoint")
         | 
| 274 275 | 
             
                        return None
         | 
| 275 276 |  | 
| 276 | 
            -
                def  | 
| 277 | 
            +
                def _get_model_accept_types(self, service, resource_config):
         | 
| 277 278 | 
             
                    try:
         | 
| 278 279 | 
             
                        record_cls = service.config.record_cls
         | 
| 279 280 | 
             
                        schema = getattr(record_cls, "schema", None)
         | 
| 280 | 
            -
                         | 
| 281 | 
            -
             | 
| 281 | 
            +
                        accept_types = []
         | 
| 282 | 
            +
                        for accept_type, handler in resource_config.response_handlers.items():
         | 
| 283 | 
            +
                            curr_item = {'accept': accept_type}
         | 
| 284 | 
            +
                            if handler.serializer is not None and hasattr(handler.serializer, "info"):
         | 
| 285 | 
            +
                                curr_item.update(handler.serializer.info(service))
         | 
| 286 | 
            +
                            accept_types.append(curr_item)
         | 
| 287 | 
            +
             | 
| 288 | 
            +
                        return accept_types
         | 
| 282 289 | 
             
                    except:  # NOSONAR noqa
         | 
| 283 290 | 
             
                        logger.exception("Failed to get model schemas")
         | 
| 284 291 | 
             
                    return {}
         | 
| 285 292 |  | 
| 293 | 
            +
             | 
| 294 | 
            +
                def _get_resource_config_class(self, model_data):
         | 
| 295 | 
            +
                    model_class = model_data['resource-config']['class']
         | 
| 296 | 
            +
                    return obj_or_import_string(model_class)()
         | 
| 297 | 
            +
             | 
| 286 298 | 
             
                def _get_service(self, model_data):
         | 
| 287 299 | 
             
                    service_id = model_data["service-config"]["service-id"]
         | 
| 288 300 | 
             
                    try:
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            from flask import url_for
         | 
| 2 | 
            +
            from flask_resources import JSONSerializer as FlaskJSONSerializer
         | 
| 3 | 
            +
            from invenio_records_resources.services import Service
         | 
| 4 | 
            +
             | 
| 5 | 
            +
             | 
| 6 | 
            +
            class JSONSerializer(FlaskJSONSerializer):
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def info(self, service:Service) -> dict:
         | 
| 9 | 
            +
                    ret = {'description': "Invenio RDM JSON Serialization",
         | 
| 10 | 
            +
                            'name': "JSON Serialization"
         | 
| 11 | 
            +
                           }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                    schema_value = service.config.record_cls.schema.value
         | 
| 14 | 
            +
                    if schema_value:
         | 
| 15 | 
            +
                        ret['schema'] = schema_value
         | 
| 16 | 
            +
                        if schema_value.startswith("local://"):
         | 
| 17 | 
            +
                            schema_value = schema_value.replace("local://", "")
         | 
| 18 | 
            +
                            ret['schema_url'] = url_for(
         | 
| 19 | 
            +
                                "oarepo_runtime_info.schema",
         | 
| 20 | 
            +
                                schema= schema_value,
         | 
| 21 | 
            +
                                _external=True,
         | 
| 22 | 
            +
                            )
         | 
| 23 | 
            +
                        elif schema_value.startwith("http://") or schema_value.startwith("https://"):
         | 
| 24 | 
            +
                            ret['schema_url'] = schema_value
         | 
| 25 | 
            +
             | 
| 26 | 
            +
             | 
| 27 | 
            +
                    return ret
         | 
| @@ -0,0 +1,72 @@ | |
| 1 | 
            +
            from marshmallow import Schema, fields
         | 
| 2 | 
            +
            from oarepo_runtime.services.schema.ui import (
         | 
| 3 | 
            +
                LocalizedEDTFTime,
         | 
| 4 | 
            +
                LocalizedDateTime,
         | 
| 5 | 
            +
                LocalizedEDTF,
         | 
| 6 | 
            +
                LocalizedEDTFInterval,
         | 
| 7 | 
            +
                LocalizedEDTFTimeInterval,
         | 
| 8 | 
            +
                LocalizedTime
         | 
| 9 | 
            +
            )
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            field_type_converters = {
         | 
| 12 | 
            +
                fields.String : lambda field: {"type" : "string"},
         | 
| 13 | 
            +
                fields.Integer: lambda field: {"type": "integer"},
         | 
| 14 | 
            +
                fields.Float: lambda field: {"type": "number"},
         | 
| 15 | 
            +
                fields.Boolean: lambda field: {"type": "boolean"},
         | 
| 16 | 
            +
                fields.List: lambda field: {
         | 
| 17 | 
            +
                    "type": "array",
         | 
| 18 | 
            +
                    "items": convert_field_to_json_schema(field.inner)
         | 
| 19 | 
            +
                },
         | 
| 20 | 
            +
                fields.Nested: lambda field: {
         | 
| 21 | 
            +
                    "type": "object",
         | 
| 22 | 
            +
                    "properties": marshmallow_to_json_schema(field.schema)["properties"]
         | 
| 23 | 
            +
                },
         | 
| 24 | 
            +
                fields.Raw: lambda field: {
         | 
| 25 | 
            +
                    "type": "object",
         | 
| 26 | 
            +
                    'additionalProperties' : True
         | 
| 27 | 
            +
                },
         | 
| 28 | 
            +
                LocalizedEDTFTime: lambda field: {
         | 
| 29 | 
            +
                    "type": "string",
         | 
| 30 | 
            +
                    "format": "date-time",
         | 
| 31 | 
            +
                },
         | 
| 32 | 
            +
                LocalizedDateTime: lambda field: {
         | 
| 33 | 
            +
                    "type": "string",
         | 
| 34 | 
            +
                    "format": "date-time",
         | 
| 35 | 
            +
                },
         | 
| 36 | 
            +
                LocalizedTime: lambda field: {
         | 
| 37 | 
            +
                    "type": "string",
         | 
| 38 | 
            +
                    "format": "time",
         | 
| 39 | 
            +
                },
         | 
| 40 | 
            +
                LocalizedEDTF: lambda field: {
         | 
| 41 | 
            +
                    "type": "string",
         | 
| 42 | 
            +
                    "format": "date",
         | 
| 43 | 
            +
                },
         | 
| 44 | 
            +
                LocalizedEDTFInterval: lambda field: {
         | 
| 45 | 
            +
                    "type": "string",
         | 
| 46 | 
            +
                    "format": "date-time",
         | 
| 47 | 
            +
                },
         | 
| 48 | 
            +
                LocalizedEDTFTimeInterval: lambda field: {
         | 
| 49 | 
            +
                    "type": "string",
         | 
| 50 | 
            +
                    "format": "date-time",
         | 
| 51 | 
            +
                }
         | 
| 52 | 
            +
            }
         | 
| 53 | 
            +
             | 
| 54 | 
            +
            def marshmallow_to_json_schema(schema:Schema) -> dict:
         | 
| 55 | 
            +
                json_schema = {
         | 
| 56 | 
            +
                    'type': 'object',
         | 
| 57 | 
            +
                    'properties': {}
         | 
| 58 | 
            +
                }
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                for field_name, field in schema.fields.items():
         | 
| 61 | 
            +
                    json_schema["properties"][field_name] = convert_field_to_json_schema(field)
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                return json_schema
         | 
| 64 | 
            +
             | 
| 65 | 
            +
             | 
| 66 | 
            +
            def convert_field_to_json_schema(field:fields) -> dict:
         | 
| 67 | 
            +
                for field_type in type(field).mro():
         | 
| 68 | 
            +
                    if field_type in field_type_converters:
         | 
| 69 | 
            +
                        return field_type_converters[field_type](field)
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                # no converter found, just string
         | 
| 72 | 
            +
                return {"type":"string"}
         | 
| @@ -42,8 +42,8 @@ oarepo_runtime/datastreams/writers/validation_errors.py,sha256=wOCXdniR6so_4Expd | |
| 42 42 | 
             
            oarepo_runtime/datastreams/writers/yaml.py,sha256=XchUJHQ58E2Mfgs8elImXbL38jFtI8Hfoye6yaR0gKI,1482
         | 
| 43 43 | 
             
            oarepo_runtime/i18n/__init__.py,sha256=h0knW_HwiyIt5TBHfdGqN7_BBYfpz1Fw6zhVy0C28fM,111
         | 
| 44 44 | 
             
            oarepo_runtime/info/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 45 | 
            -
            oarepo_runtime/info/check.py,sha256= | 
| 46 | 
            -
            oarepo_runtime/info/views.py,sha256= | 
| 45 | 
            +
            oarepo_runtime/info/check.py,sha256=6O5Wjsdorx4eqiBiPU3z33XhCiwPTO_FGkzMDK7UH6I,3049
         | 
| 46 | 
            +
            oarepo_runtime/info/views.py,sha256=q9PG46aM-1ihaVxJGjfcD5HvJWanM28gMefao8FIQk4,12440
         | 
| 47 47 | 
             
            oarepo_runtime/records/__init__.py,sha256=3vzRsAPxl4d5QOnGyls-vUg4E6PunmR4ACObtacMAIQ,1038
         | 
| 48 48 | 
             
            oarepo_runtime/records/dumpers/__init__.py,sha256=OmzNhLdMNKibmCksnj9eTX9xPBG30dziiK3j3bAAp3k,233
         | 
| 49 49 | 
             
            oarepo_runtime/records/dumpers/edtf_interval.py,sha256=YCShZAoqBQYaxVilEVotS-jXZsxxoXO67yu2urhkaMA,1198
         | 
| @@ -68,6 +68,7 @@ oarepo_runtime/records/systemfields/selectors.py,sha256=Q9jE1smSN3heT2LIpK_jB6bI | |
| 68 68 | 
             
            oarepo_runtime/records/systemfields/synthetic.py,sha256=UustvhzcDGuaNZLDeHbWwshoxQR-qRIuHDCct5RXmrI,4287
         | 
| 69 69 | 
             
            oarepo_runtime/resources/__init__.py,sha256=v8BGrOTu_FjKzd0eozV7Q4GoGxyfybsL2cI-tbP5Pys,185
         | 
| 70 70 | 
             
            oarepo_runtime/resources/file_resource.py,sha256=Ta3bFce7l0xwqkkOMOEu9mxbB8BbKj5HUHRHmidhnl8,414
         | 
| 71 | 
            +
            oarepo_runtime/resources/json_serializer.py,sha256=82_-xQEtxKaPakv8R1oBAFbGnxskF_Ve4tcfcy4PetI,963
         | 
| 71 72 | 
             
            oarepo_runtime/resources/localized_ui_json_serializer.py,sha256=3V9cJaG_e1PMXKVX_wKfBp1LmbeForwHyBNYdyha4uQ,1878
         | 
| 72 73 | 
             
            oarepo_runtime/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 73 74 | 
             
            oarepo_runtime/services/components.py,sha256=zaZroTqzV5fz8yVAtRFLbbkTT9iD_dx9jFYANm3JIfI,3285
         | 
| @@ -106,6 +107,7 @@ oarepo_runtime/services/schema/i18n.py,sha256=NACu0SqXWuuwKVpBZdz4K8tVfBaCEI9Ypc | |
| 106 107 | 
             
            oarepo_runtime/services/schema/i18n_ui.py,sha256=MnEDW0gcZPvEODbJ6XzldxNCJ2suhfmdHQ4wkcAG6zA,2179
         | 
| 107 108 | 
             
            oarepo_runtime/services/schema/i18n_validation.py,sha256=fyMTi2Rw-KiHv7c7HN61zGxRVa9sAjAEEkAL5wUyKNo,236
         | 
| 108 109 | 
             
            oarepo_runtime/services/schema/marshmallow.py,sha256=LmcSxvbZ9jIhkNHCqqxt1SA2UNijoDmIzqli1MkoTrE,1153
         | 
| 110 | 
            +
            oarepo_runtime/services/schema/marshmallow_to_json_schema.py,sha256=VYLnVWHOoaxWCD_gqJO8-8u1SbaPEFBjDZ5HGgGr0Ow,2027
         | 
| 109 111 | 
             
            oarepo_runtime/services/schema/oneofschema.py,sha256=GnWH4Or_G5M0NgSmCoqMI6PBrJg5AC9RHrcB5QDKRq0,6661
         | 
| 110 112 | 
             
            oarepo_runtime/services/schema/polymorphic.py,sha256=bAbUoTIeDBiJPYPhpLEKKZekEdkHlpqkmNxk1hN3PDw,564
         | 
| 111 113 | 
             
            oarepo_runtime/services/schema/ui.py,sha256=xQgW-zLyZoHldGw47uVtXQj-5LexVNKTholyq4MiBZo,3777
         | 
| @@ -120,10 +122,13 @@ oarepo_runtime/translations/en/LC_MESSAGES/messages.po,sha256=rZ2PGvkcJbmuwrWeFX | |
| 120 122 | 
             
            oarepo_runtime/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 121 123 | 
             
            oarepo_runtime/utils/functools.py,sha256=gKS9YZtlIYcDvdNA9cmYO00yjiXBYV1jg8VpcRUyQyg,1324
         | 
| 122 124 | 
             
            oarepo_runtime/utils/path.py,sha256=V1NVyk3m12_YLbj7QHYvUpE1wScO78bYsX1LOLeXDkI,3108
         | 
| 125 | 
            +
            tests/marshmallow_to_json/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 126 | 
            +
            tests/marshmallow_to_json/test_datacite_ui_schema.py,sha256=82iLj8nW45lZOUewpWbLX3mpSkpa9lxo-vK-Qtv_1bU,48552
         | 
| 127 | 
            +
            tests/marshmallow_to_json/test_simple_schema.py,sha256=izZN9p0v6kovtSZ6AdxBYmK_c6ZOti2_z_wPT_zXIr0,1500
         | 
| 123 128 | 
             
            tests/pkg_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 124 | 
            -
            oarepo_runtime-1.5. | 
| 125 | 
            -
            oarepo_runtime-1.5. | 
| 126 | 
            -
            oarepo_runtime-1.5. | 
| 127 | 
            -
            oarepo_runtime-1.5. | 
| 128 | 
            -
            oarepo_runtime-1.5. | 
| 129 | 
            -
            oarepo_runtime-1.5. | 
| 129 | 
            +
            oarepo_runtime-1.5.68.dist-info/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
         | 
| 130 | 
            +
            oarepo_runtime-1.5.68.dist-info/METADATA,sha256=wGz7WMd-5Hw2XeQV-s5bEJyosJ9wbO-eKW0GdetW_uY,4720
         | 
| 131 | 
            +
            oarepo_runtime-1.5.68.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
         | 
| 132 | 
            +
            oarepo_runtime-1.5.68.dist-info/entry_points.txt,sha256=0cschM0RHc6UJ1uudhu4EP0hrVStPGpgMO-XEDGRtY4,430
         | 
| 133 | 
            +
            oarepo_runtime-1.5.68.dist-info/top_level.txt,sha256=bHhlkT1_RQC4IkfTQCqA3iN4KCB6cSFQlsXpQMSP-bE,21
         | 
| 134 | 
            +
            oarepo_runtime-1.5.68.dist-info/RECORD,,
         | 
| 
            File without changes
         |