SRserves85 / avro-to-python

Light tool for compiling avro schema files (.avsc) to python classes
MIT License
25 stars 19 forks source link

Add support for GeoJSON #35

Closed fmiguelez closed 3 months ago

fmiguelez commented 4 months ago

GeoJSON geometries are not supported. Consider following test definition (record with array of GeoJson geometries):

{
    "type": "record",
    "name": "RecordWithGeometries",
    "namespace": "records",
    "fields": [
        {
            "name": "geometries",
            "type": [
                "null",
                {
                    "type": "array",
                    "items": [
                        {
                            "name": "Point",
                            "type": "record",
                            "fields": [
                                {
                                    "name": "bbox",
                                    "type": [
                                        "null",
                                        {
                                            "type": "array",
                                            "items": {
                                                "type": "double",
                                                "name": null
                                            },
                                            "java-class": "[D"
                                        }
                                    ],
                                    "default": null
                                },
                                {
                                    "name": "coordinates",
                                    "type": {
                                        "type": "array",
                                        "items": {
                                            "type": "double",
                                            "name": null
                                        },
                                        "java-class": "[D"
                                    }
                                },
                                {
                                    "name": "type",
                                    "type": "string"
                                }
                            ]
                        },
                        {
                            "type": "record",
                            "name": "LineString",
                            "fields": [
                                {
                                    "name": "bbox",
                                    "type": [
                                        "null",
                                        {
                                            "type": "array",
                                            "items": {
                                                "type": "double",
                                                "name": null
                                            },
                                            "java-class": "[D"
                                        }
                                    ],
                                    "default": null
                                },
                                {
                                    "name": "coordinates",
                                    "type": {
                                        "type": "array",
                                        "items": {
                                            "type": "array",
                                            "items": {
                                                "type": "double",
                                                "name": null
                                            },
                                            "java-class": "[D"
                                        },
                                        "java-class": "[[D"
                                    }
                                },
                                {
                                    "name": "type",
                                    "type": "string"
                                }
                            ]
                        }
                    ],
                    "default": null
                }
            ],
            "default": null
        }
    ]
}

Generated class is invalid as thsi is the code generated for set_geometries method:

    def set_geometries(self, value: Union[None, list]) -> None:
        if isinstance(value, type(None)):
            self.geometries = None

        elif isinstance(value, list):
            self.geometries = []
            for element in value:  // Invalid empty loop 
        else:
            raise TypeError("field 'geometries' should be in (None, list)")