diff options
| -rw-r--r-- | CHANGELOG.rst | 2 | ||||
| -rw-r--r-- | docs/field_types.rst | 2 | ||||
| -rw-r--r-- | lesana/types.py | 15 | ||||
| -rw-r--r-- | tests/test_types.py | 20 | 
4 files changed, 39 insertions, 0 deletions
| diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c566e16..04a8463 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -5,6 +5,8 @@  Unreleased  ========== +* New data type: geo (for Geo URIs) +  0.8.1  ===== diff --git a/docs/field_types.rst b/docs/field_types.rst index 81e86ab..91eda44 100644 --- a/docs/field_types.rst +++ b/docs/field_types.rst @@ -24,6 +24,8 @@ file:      .  url:      . +geo: +    A Geo URI.  list:      .  yaml: diff --git a/lesana/types.py b/lesana/types.py index 3e9450a..83d12ba 100644 --- a/lesana/types.py +++ b/lesana/types.py @@ -341,6 +341,21 @@ class LesanaURL(LesanaString):      name = 'url' +class LesanaGeo(LesanaString): +    """ +    A Geo URI +    """ +    name = 'geo' + +    def load(self, data): +        data = super().load(data) +        if data and not data.startswith("geo:"): +            raise LesanaValueError("{} does not look like a geo URI".format( +                data +            )) +        return data + +  class LesanaYAML(LesanaType):      """      Free YAML contents (no structure is enforced) diff --git a/tests/test_types.py b/tests/test_types.py index 32340d5..21a6d52 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -415,6 +415,26 @@ class testTypes(unittest.TestCase):          v = checker.auto("http://example.org")          self.assertEqual(v, "http://example.org") +    def test_geo(self): +        checker = types.LesanaGeo(self._get_field_def('geo'), {}) + +        v = checker.empty() +        self.assertEqual(v, "") + +        v = checker.load("geo:45.81483,9.07524?z=17") +        self.assertEqual(v, "geo:45.81483,9.07524?z=17") + +        v = checker.load(None) +        self.assertEqual(v, None) + +        # TODO: improve check for invalid Geo URIs +        for u in ("http://example.org",): +            with self.assertRaises(types.LesanaValueError): +                checker.load(u) + +        v = checker.auto("geo:45.81483,9.07524?z=17") +        self.assertEqual(v, "geo:45.81483,9.07524?z=17") +      def test_yaml(self):          checker = types.LesanaYAML(self._get_field_def('yaml'), {}) | 
