Skip to content

Commit

Permalink
Add support for GEO-Link version 1.2.2
Browse files Browse the repository at this point in the history
  • Loading branch information
kdeininger committed Oct 13, 2021
1 parent 3e41166 commit feabe2e
Show file tree
Hide file tree
Showing 7 changed files with 178 additions and 11 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ Changelog
2.0.1 (current dev)
-------------------

Supported GEO-Link API versions: v1.0.0, v1.1.0, v1.1.1, v1.2.0, v1.2.1, v1.2.2 (default)

- Add support for GEO-Link API version 1.2.2 (new attribute "index")
- Dependency updates

2.0.0
Expand Down
9 changes: 8 additions & 1 deletion geolink_formatter/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class Document(object):
def __init__(self, files, id=None, category=None, doctype=None, federal_level=None, authority=None,
authority_url=None, title=None, number=None, abbreviation=None, instance=None, type=None,
subtype=None, decree_date=None, enactment_date=None, abrogation_date=None, cycle=None,
municipality=None):
municipality=None, index=None):
"""Creates a new document instance.
Args:
Expand All @@ -34,6 +34,7 @@ def __init__(self, files, id=None, category=None, doctype=None, federal_level=No
abrogation_date (datetime.date): The date of abrogation.
cycle (str): The document cycle.
municipality (str): The municipality concerned by this document.
index (int): The document's index for sorting.
Raises:
TypeError: Raised on missing argument or invalid argument type.
Expand Down Expand Up @@ -87,6 +88,7 @@ def __init__(self, files, id=None, category=None, doctype=None, federal_level=No
self._abrogation_date = abrogation_date
self._cycle = cycle
self._municipality = municipality
self._index = None if index is None else int(index)

@property
def files(self):
Expand Down Expand Up @@ -178,6 +180,11 @@ def municipality(self):
"""str: The municipality concerned by this document (since v1.2.1)."""
return self._municipality

@property
def index(self):
"""int: The document's index for sorting (since v1.2.2)."""
return self._index


class File(object):
def __init__(self, category=None, href=None, title=None, description=None):
Expand Down
17 changes: 8 additions & 9 deletions geolink_formatter/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

import pkg_resources
import requests
import sys
from lxml.etree import XMLSchema, DTD, DocumentInvalid
from defusedxml.lxml import fromstring
from geolink_formatter.entity import Document, File
Expand All @@ -27,13 +26,16 @@ class SCHEMA(object):
V1_2_1 = '1.2.1'
"""str: geoLink schema version 1.2.1"""

V1_2_2 = '1.2.2'
"""str: geoLink schema version 1.2.2"""


class XML(object):

_date_format = '%Y-%m-%d'
"""str: Format of date values in XML."""

def __init__(self, host_url=None, version='1.2.1', dtd_validation=False, xsd_validation=True):
def __init__(self, host_url=None, version='1.2.2', dtd_validation=False, xsd_validation=True):
"""Create a new XML parser instance containing the geoLink XSD for validation.
Args:
Expand All @@ -52,12 +54,8 @@ def __init__(self, host_url=None, version='1.2.1', dtd_validation=False, xsd_val
self._xsd_validation = xsd_validation
xsd = pkg_resources.resource_filename('geolink_formatter', 'schema/v{0}.xsd'.format(version))
if self._xsd_validation:
if sys.version_info.major > 2:
with open(xsd, encoding='utf-8') as f:
self._schema = XMLSchema(fromstring(f.read()))
else:
with open(xsd) as f:
self._schema = XMLSchema(fromstring(f.read()))
with open(xsd, encoding='utf-8') as f:
self._schema = XMLSchema(fromstring(f.read()))

@property
def host_url(self):
Expand Down Expand Up @@ -156,7 +154,8 @@ def from_string(self, xml):
enactment_date=enactment_date,
abrogation_date=abrogation_date,
cycle=document_el.attrib.get('cycle'),
municipality=document_el.attrib.get('municipality')
municipality=document_el.attrib.get('municipality'),
index=document_el.attrib.get('index')
))

return documents
Expand Down
97 changes: 97 additions & 0 deletions geolink_formatter/schema/v1.2.2.xsd
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="geolinks">
<xs:complexType>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="document">
<xs:complexType>
<xs:sequence>
<xs:element name="file" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="category">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="main"/>
<xs:enumeration value="additional"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="description" type="xs:string"/>
<xs:attribute name="href" type="xs:string"/>
<xs:attribute name="title" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:string"/>
<xs:attribute name="category">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="main"/>
<xs:enumeration value="related"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="doctype">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="edict"/>
<xs:enumeration value="decree"/>
<xs:enumeration value="notice"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="federal_level">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="A livello intercantonale"/>
<xs:enumeration value="Bezirk"/>
<xs:enumeration value="Bund"/>
<xs:enumeration value="Canton"/>
<xs:enumeration value="Cantone"/>
<xs:enumeration value="Chantun"/>
<xs:enumeration value="Commune"/>
<xs:enumeration value="Comune"/>
<xs:enumeration value="Confédération"/>
<xs:enumeration value="Confederazione"/>
<xs:enumeration value="Confederaziun"/>
<xs:enumeration value="Fürstentum"/>
<xs:enumeration value="Gemeinde"/>
<xs:enumeration value="Intercantonal"/>
<xs:enumeration value="Interchantunal"/>
<xs:enumeration value="Interkantonal"/>
<xs:enumeration value="Kanton"/>
<xs:enumeration value="Vischnanca"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="language">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="de"/>
<xs:enumeration value="fr"/>
<xs:enumeration value="it"/>
<xs:enumeration value="rm"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="authority" type="xs:string"/>
<xs:attribute name="authority_url" type="xs:string"/>
<xs:attribute name="cycle" type="xs:string"/>
<xs:attribute name="title" type="xs:string"/>
<xs:attribute name="number" type="xs:string"/>
<xs:attribute name="abbreviation" type="xs:string"/>
<xs:attribute name="instance" type="xs:string"/>
<xs:attribute name="type" type="xs:string"/>
<xs:attribute name="subtype" type="xs:string"/>
<xs:attribute name="decree_date" type="xs:string"/>
<xs:attribute name="enactment_date" type="xs:string"/>
<xs:attribute name="abrogation_date" type="xs:string"/>
<xs:attribute name="approval_date" type="xs:string"/>
<xs:attribute name="publication_date" type="xs:string"/>
<xs:attribute name="municipality" type="xs:string"/>
<xs:attribute name="index" type="xs:integer"/>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
45 changes: 45 additions & 0 deletions tests/resources/geolink_v1.2.2.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<geolinks>
<document authority="Bauverwaltung Gemeinde" authority_url="http%3A%2F%2Fwww.zihlschlacht-sitterdorf.ch"
category="main" doctype="decree" enactment_date="2001-03-27"
federal_level="Gemeinde" id="1500" instance="DBU" subtype="Gestaltungsplan"
title="Tiefkühllager" type="Sondernutzungsplan" decree_date="2001-03-15" number="1A"
abbreviation="abbr" municipality="Testgemeinde">
<file category="main" href="/api/attachments/4735" title="2918-E-1.pdf" description="2918-E-1.pdf"></file>
<file category="additional" href="/api/attachments/4736" title="2918-P-1.pdf" description="Plan 1"></file>
<file category="additional" href="/api/attachments/4737" title="2918-P-2.pdf" description="Plan 2"></file>
<file category="additional" href="/api/attachments/4738" title="2918-P-3.pdf" description="Plan 3"></file>
<file category="additional" href="/api/attachments/4739" title="2918-S-1.pdf" description=""></file>

</document>
<document authority="Staatskanzlei Kanton Thurgau" authority_url="http%3A%2F%2Fwww.staatskanzlei.tg.ch"
category="related" decree_date="2011-12-21" doctype="edict" enactment_date="2017-04-01"
federal_level="Kanton" id="4782" title="Planungs- und Baugesetz">
<file category="main"
href="http://www.rechtsbuch.tg.ch/frontend/versions/pdf_file_with_annex/1379?locale=de"
description="700.pdf"
title="700.pdf"></file>

</document>
<document authority="Bundeskanzlei" authority_url="https%3A%2F%2Fwww.bk.admin.ch" category="related"
doctype="edict" enactment_date="2016-01-01" federal_level="Bund" id="4776"
title="Bundesgesetz über die Raumplanung"
index="1">
<file category="main" href="http://www.lexfind.ch/dtah/136884/2" description="700.de.pdf" title="700.de.pdf"></file>

</document>
<document authority="Staatskanzlei Kanton Thurgau" authority_url="http%3A%2F%2Fwww.staatskanzlei.tg.ch"
category="related" decree_date="2012-09-18" doctype="edict" enactment_date="2016-11-05"
federal_level="Kanton" id="4783"
title="Verordnung des Regierungsrates zum Planungs- und Baugesetz und zur Interkantonalen Vereinbarung über die Harmonisierung der Baubegriffe"
index="2">
<file category="main"
href="http://www.rechtsbuch.tg.ch/frontend/versions/pdf_file_with_annex/1319?locale=de"
description="700.1.pdf"
title="700.1.pdf"></file>

</document>
<document category="related" doctype="notice" id="4" title="Beispiel Hinweis Dokument" index="3">
<file category="main" href="/api/attachments/5101" description="example_notice.pdf" title="example_notice.pdf"></file>
</document>
</geolinks>
6 changes: 5 additions & 1 deletion tests/test_entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def test_document():
enactment_date=date, federal_level='testlevel', authority='Authority',
authority_url='http://my.link.to/authority', type='testtype', subtype='testsubtype',
decree_date=date, instance='INST', number='123', abbreviation='abbr', abrogation_date=date,
cycle='cycle')
cycle='cycle', municipality='Test Municipality', index=1)
assert isinstance(d, Document)
assert d.id == '1'
assert d.title == 'Test'
Expand All @@ -50,6 +50,8 @@ def test_document():
assert d.abbreviation == 'abbr'
assert d.abrogation_date == date
assert d.cycle == 'cycle'
assert d.municipality == 'Test Municipality'
assert d.index == 1


def test_document_empty():
Expand All @@ -72,6 +74,8 @@ def test_document_empty():
assert d.abbreviation is None
assert d.abrogation_date is None
assert d.cycle is None
assert d.municipality is None
assert d.index is None


def test_document_invalid_decree_date():
Expand Down
12 changes: 12 additions & 0 deletions tests/test_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,18 @@ def test_schema_version_1_2_1():
assert documents[1].municipality is None


def test_schema_version_1_2_2():
with requests_mock.mock() as m:
with open('tests/resources/geolink_v1.2.2.xml', 'rb') as f:
m.get('http://oereblex.test.com/api/geolinks/1500.xml', content=f.read())
documents = XML(version=SCHEMA.V1_2_2).from_url('http://oereblex.test.com/api/geolinks/1500.xml')
assert len(documents) == 5
assert documents[0].index is None
assert documents[-3].index == 1
assert documents[-2].index == 2
assert documents[-1].index == 3


def test_default_version_with_locale():
with requests_mock.mock() as m:
with open('tests/resources/geolink_v1.2.1.xml', 'rb') as f:
Expand Down

0 comments on commit feabe2e

Please sign in to comment.