From bab9450441f7cc03e20b094b40721b951ff03be2 Mon Sep 17 00:00:00 2001
From: Leifur Halldor Asgeirsson <lasgeirsson@zerofail.com>
Date: Tue, 4 Oct 2016 12:12:12 -0400
Subject: [PATCH] implement app.register_from_module

---
 goblin/app.py            | 13 ++++++++++---
 tests/register_models.py | 21 +++++++++++++++++++++
 tests/test_app.py        | 22 ++++++++++++++++++++++
 3 files changed, 53 insertions(+), 3 deletions(-)
 create mode 100644 tests/register_models.py

diff --git a/goblin/app.py b/goblin/app.py
index 89d05ca..c46d691 100644
--- a/goblin/app.py
+++ b/goblin/app.py
@@ -18,9 +18,9 @@
 """Goblin application class and class constructor"""
 
 import collections
+import importlib
 import logging
 
-from gremlin_python import process
 from goblin import driver, element, session
 
 
@@ -120,8 +120,15 @@ class Goblin:
         """
         self._cluster.config_from_json(filename)
 
-    def register_from_module(self, modulename):
-        raise NotImplementedError
+    def register_from_module(self, module, *, package=None):
+        if isinstance(module, str):
+            module = importlib.import_module(module, package)
+        elements = list()
+        for item_name in dir(module):
+            item = getattr(module, item_name)
+            if isinstance(item, element.ElementMeta):
+                elements.append(item)
+        self.register(*elements)
 
     async def session(self, *, use_session=False, processor='', op='eval',
                       aliases=None):
diff --git a/tests/register_models.py b/tests/register_models.py
new file mode 100644
index 0000000..6a6eb78
--- /dev/null
+++ b/tests/register_models.py
@@ -0,0 +1,21 @@
+from goblin import element
+
+
+class TestRegisterVertex1(element.Vertex):
+    pass
+
+
+class TestRegisterVertex2(element.Vertex):
+    pass
+
+
+class TestRegisterEdge1(element.Edge):
+    pass
+
+
+class TestRegisterEdge2(element.Edge):
+    pass
+
+
+class NotAModelShouldNotBeRegistered:
+    pass
diff --git a/tests/test_app.py b/tests/test_app.py
index 89067f1..73f8237 100644
--- a/tests/test_app.py
+++ b/tests/test_app.py
@@ -17,11 +17,33 @@
 
 import pytest
 
+import goblin
 from goblin import element
 from goblin.driver import serializer
 from gremlin_python import process
 
 
+def test_register_from_module(app):
+    import register_models
+    app.register_from_module(register_models)
+    vertices, edges = app._vertices.values(), app._edges.values()
+    assert register_models.TestRegisterVertex1 in vertices
+    assert register_models.TestRegisterVertex2 in vertices
+    assert register_models.TestRegisterEdge1 in edges
+    assert register_models.TestRegisterEdge2 in edges
+
+
+def test_register_from_module_string(app):
+    app.register_from_module('register_models', package=__package__)
+    vertices, edges = app._vertices.values(), app._edges.values()
+
+    import register_models
+    assert register_models.TestRegisterVertex1 in vertices
+    assert register_models.TestRegisterVertex2 in vertices
+    assert register_models.TestRegisterEdge1 in edges
+    assert register_models.TestRegisterEdge2 in edges
+
+
 @pytest.mark.asyncio
 async def test_registry(app, person, place, knows, lives_in):
     assert len(app.vertices) ==  2
-- 
GitLab