Преглед на файлове

added yaml loader for person class

Fabian Peter Hammerle преди 4 години
родител
ревизия
ecfca36c84
променени са 6 файла, в които са добавени 63 реда и са изтрити 0 реда
  1. 4 0
      .pylintrc
  2. 3 0
      README.md
  3. 9 0
      conftest.py
  4. 39 0
      family_tree_yaml/yaml.py
  5. 4 0
      tests/persons/erika-mustermann.yml
  6. 4 0
      tests/persons/max-mustermann.yml

+ 4 - 0
.pylintrc

@@ -0,0 +1,4 @@
+[MESSAGES CONTROL]
+
+disable=bad-continuation,
+        missing-docstring

+ 3 - 0
README.md

@@ -0,0 +1,3 @@
+```sh
+sudo apt-get install python3-yaml
+```

+ 9 - 0
conftest.py

@@ -0,0 +1,9 @@
+import os
+import pathlib
+
+import pytest
+
+
+@pytest.fixture(autouse=True)
+def working_dir():
+    os.chdir(pathlib.Path(__file__).parent.joinpath("tests"))

+ 39 - 0
family_tree_yaml/yaml.py

@@ -0,0 +1,39 @@
+import pathlib
+import typing
+
+import yaml
+from family_tree_yaml import Person
+
+
+class _YamlLoader(yaml.SafeLoader):
+
+    # pylint: disable=too-many-ancestors
+
+    def __init__(self, stream):
+        super().__init__(stream)
+        self.add_constructor("!person", self._construct_person)
+
+    @staticmethod
+    def _construct_person(
+        loader: "_YamlLoader", node: yaml.nodes.MappingNode
+    ) -> Person:
+        (person_attrs,) = loader.construct_yaml_map(node)
+        person = Person(person_attrs["identifier"])
+        if "name" in person_attrs:
+            person.name = person_attrs["name"]
+        if "birth_date" in person_attrs:
+            person.birth_date = person_attrs["birth_date"]
+        return person
+
+
+def read(yaml_path: typing.Union[str, pathlib.Path]) -> Person:
+    """
+    >>> read('persons/max-mustermann.yml')
+    Person(max-mustermann, Max Mustermann, *1976-02-01)
+    >>> read('persons/erika-mustermann.yml')
+    Person(erika-mustermann, Erika Mustermann, *1957-08-12)
+    """
+    if isinstance(yaml_path, str):
+        return read(pathlib.Path(yaml_path))
+    with yaml_path.open("r") as yaml_file:
+        return yaml.load(yaml_file, Loader=_YamlLoader)

+ 4 - 0
tests/persons/erika-mustermann.yml

@@ -0,0 +1,4 @@
+!person
+identifier: erika-mustermann
+name: Erika Mustermann
+birth_date: 1957-08-12

+ 4 - 0
tests/persons/max-mustermann.yml

@@ -0,0 +1,4 @@
+!person
+identifier: max-mustermann
+name: Max Mustermann
+birth_date: 1976-02-01