From d85c2e3bbcbeb4222e2ee45b98b69345662a9aa6 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 12 Sep 2023 23:06:21 +0200 Subject: [PATCH] Update version --- internal/geoparquet/geoparquet.go | 2 +- internal/geoparquet/geoparquet_test.go | 26 ++++++ .../testdata/cases/example-v1.0.0.parquet | Bin 0 -> 33430 bytes .../releases/v1.0.0/schema.json | 81 ++++++++++++++++++ .../validator/testdata/all-pass/input.json | 2 +- internal/validator/validator_test.go | 2 +- 6 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 internal/testdata/cases/example-v1.0.0.parquet create mode 100644 internal/testdata/schema/geoparquet.org/releases/v1.0.0/schema.json diff --git a/internal/geoparquet/geoparquet.go b/internal/geoparquet/geoparquet.go index 7d16342..3761b63 100644 --- a/internal/geoparquet/geoparquet.go +++ b/internal/geoparquet/geoparquet.go @@ -28,7 +28,7 @@ import ( ) const ( - Version = "1.0.0-beta.1" + Version = "1.0.0" MetadataKey = "geo" EncodingWKB = "WKB" EncodingWKT = "WKT" diff --git a/internal/geoparquet/geoparquet_test.go b/internal/geoparquet/geoparquet_test.go index 5c613c4..2469a42 100644 --- a/internal/geoparquet/geoparquet_test.go +++ b/internal/geoparquet/geoparquet_test.go @@ -87,6 +87,32 @@ func TestGetMetadataV100Beta1(t *testing.T) { assert.Equal(t, "WGS 84 (CRS84)", col.CRS.Name) } +func TestGetMetadataV1(t *testing.T) { + fixturePath := "../testdata/cases/example-v1.0.0.parquet" + info, statErr := os.Stat(fixturePath) + require.NoError(t, statErr) + + input, openErr := os.Open(fixturePath) + require.NoError(t, openErr) + + file, fileErr := parquet.OpenFile(input, info.Size()) + require.NoError(t, fileErr) + + metadata, geoErr := geoparquet.GetMetadata(file) + require.NoError(t, geoErr) + + assert.Equal(t, "geometry", metadata.PrimaryColumn) + assert.Equal(t, "1.0.0", metadata.Version) + require.Len(t, metadata.Columns, 1) + + col := metadata.Columns[metadata.PrimaryColumn] + assert.Equal(t, "WKB", col.Encoding) + geomTypes := col.GetGeometryTypes() + assert.Len(t, geomTypes, 2) + assert.Contains(t, geomTypes, "Polygon") + assert.Contains(t, geomTypes, "MultiPolygon") +} + func TestRowReaderV040(t *testing.T) { fixturePath := "../testdata/cases/example-v0.4.0.parquet" info, statErr := os.Stat(fixturePath) diff --git a/internal/testdata/cases/example-v1.0.0.parquet b/internal/testdata/cases/example-v1.0.0.parquet new file mode 100644 index 0000000000000000000000000000000000000000..1959005937273dd5e0be84be0dc6fc26e135d014 GIT binary patch literal 33430 zcmV*QKwrO5K~gal1{J*80u{iU0u`jV{%||Z+~>N^IoG+)b)MJroMaifp*iy1 z(W4m*hQ)y-c5G)c3~ ziy=12uNif8VHnghqBrW)8e&-NnbRhMFxb53hQ6w-5$;n6m0kM59S%-$NQ;~ zYT_{P9?`pd!as&+{P?_!0)0SBjkIe`&Q8rv)U;T;B(8fIR5onwS4H(uR2O@zU%iQUSZb&b)arrM{$ zHVo!%|L0FOI}B#1Ol?-4X^h9NnJP`u4}(`DwjWC=F~Z8r{?}v8!XVvv zl4M)35lYMdtK3iqgVC|{X>&+?7#iHr-Y6Vuh@rNMYJN#!xWIE{)3W5hEyMrx+<(gd zX{q%4e=9d-Fc>YYA9qi50)&UrpU>rKsTcRL6dZsd{82ZwyQ5q*blr)?jgFAai8^zr zYB*jv5`Rk z&jZ7p07t`uaqlN!vF6&3M6na#mWpmY|4A5?QPHhe<^(VxUjrK!sbzo6astMIK>gcw znrLzNWvXM26QKU&6aBJU7$raR&CA_R&|KkmeMg@bM(k+R+J4;$v?i|0NVA-Z%G32$ zrhj(=(bGwZ!N${Zn{m~^4oL~7O$Js(dGy_KdYV`*r1CLt87h`IRb9FnqoR_26ml# ztYaZ|g!Hwc^TG{hU{l4KMYRr&(70+=jb`)=Y}mf>=&z#=u!Ftx&XZG;~hC07xFmIlbfYR5ZNQ zGS4I!Ajiu|WlYRe>>wu(%TNbswlbC#HfdwrJ(EX~TkIk6q>}Tjb=r7qf`cSP&mNxJ z>*PclYUA%YliZ@O*ukRQ7Y?eYv{1|P(NVg5U8#O4T~Nd95ulW>DRuPN`zGUNGSX0|D?Y~t*I@klgr9Y+?K?K?}GigXZkq(VoFOXWd_TdqV@$g7~-|F z?@sghW^mqb>S`NhBNSHj;Fo?=0I<4aHPi@;I=-yah%^JG?#mM^7)JPNM1%E(g=SDa zef#93Bor(_#}n8~4ROYY5}a1MX1fLHp`i zxaa=%-giajpgc9-U?oEzx%+elx;HF<(d~Aye6$`iHa=@;8D<5{oQ&kse`esFh8{dT z(F)Lcf7h>ST@(es9;^4-3L=8a$Jv%4WVrnZI5OTE)JLl;{M@CD@yav1-f3Ec@=%A+(nH$F zQ0iDWqQDxY$7^7v()_|&!5YM

QTu|xX|np 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 literal 0 HcmV?d00001 diff --git a/internal/testdata/schema/geoparquet.org/releases/v1.0.0/schema.json b/internal/testdata/schema/geoparquet.org/releases/v1.0.0/schema.json new file mode 100644 index 0000000..b416090 --- /dev/null +++ b/internal/testdata/schema/geoparquet.org/releases/v1.0.0/schema.json @@ -0,0 +1,81 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "GeoParquet", + "description": "Parquet metadata included in the geo field.", + "type": "object", + "required": ["version", "primary_column", "columns"], + "properties": { + "version": { + "type": "string", + "const": "1.0.0" + }, + "primary_column": { + "type": "string", + "minLength": 1 + }, + "columns": { + "type": "object", + "minProperties": 1, + "patternProperties": { + ".+": { + "type": "object", + "required": ["encoding", "geometry_types"], + "properties": { + "encoding": { + "type": "string", + "const": "WKB" + }, + "geometry_types": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^(GeometryCollection|(Multi)?(Point|LineString|Polygon))( Z)?$" + } + }, + "crs": { + "oneOf": [ + { + "$ref": "https://proj.org/schemas/v0.5/projjson.schema.json" + }, + { + "type": "null" + } + ] + }, + "edges": { + "type": "string", + "enum": ["planar", "spherical"] + }, + "orientation": { + "type": "string", + "const": "counterclockwise" + }, + "bbox": { + "type": "array", + "items": { + "type": "number" + }, + "oneOf": [ + { + "description": "2D bbox consisting of (xmin, ymin, xmax, ymax)", + "minItems": 4, + "maxItems": 4 + }, + { + "description": "3D bbox consisting of (xmin, ymin, zmin, xmax, ymax, zmax)", + "minItems": 6, + "maxItems": 6 + } + ] + }, + "epoch": { + "type": "number" + } + } + } + }, + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/internal/validator/testdata/all-pass/input.json b/internal/validator/testdata/all-pass/input.json index 555dc20..bd46555 100644 --- a/internal/validator/testdata/all-pass/input.json +++ b/internal/validator/testdata/all-pass/input.json @@ -1,6 +1,6 @@ { "metadata": { - "version": "1.0.0-beta.1", + "version": "1.0.0", "primary_column": "geometry", "columns": { "geometry": { diff --git a/internal/validator/validator_test.go b/internal/validator/validator_test.go index 1d59839..8b33886 100644 --- a/internal/validator/validator_test.go +++ b/internal/validator/validator_test.go @@ -112,7 +112,7 @@ func (s *Suite) TearDownSuite() { jsonschema.Loaders["https"] = s.originalHttpsLoader } -func (s *Suite) XTestValidCases() { +func (s *Suite) TestValidCases() { cases := []string{ "example-v1.0.0-beta.1.parquet", }