Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit b3db051

Browse files
author
Troy Larson
committedOct 4, 2018
Add inflection
1 parent 01c54d1 commit b3db051

File tree

4 files changed

+39
-14
lines changed

4 files changed

+39
-14
lines changed
 

‎Pipfile

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ setuptools-git = "*"
1111
twine = "*"
1212
graph-runner = {editable = true, path = "."}
1313
"jinja2" = "*"
14+
inflection = "*"
1415

1516
[dev-packages]
1617

‎graph_entity/__init__.py

+36-9
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
from graph_runner import GraphRunner
2-
from gremlin_python.process.traversal import T
32
import importlib
4-
import uuid
5-
from jinja2 import Environment, BaseLoader
3+
import inflection
4+
65

76
class GraphEntity:
87
def __init__(self, **kwargs):
98
self.g = kwargs.get('Traversal')
109
self.gr = GraphRunner(Traversal=kwargs.get('Traversal'), Entity=self)
1110
self.id = kwargs.get('Id')
11+
self.friendly_id = kwargs.get('FriendlyId')
12+
self.logger = kwargs.get('Logger')
1213
self.rule_order = kwargs.get('RuleOrder', {})
1314
self.exec_properties = kwargs.get('ExecProperties')
15+
node_properties = kwargs.get('NodeProperties', {})
16+
for prop in node_properties:
17+
self.__dict__[prop] = node_properties[prop][0]
18+
self.properties = kwargs.get('Properties') + ['friendly_id']
1419

1520
def full_self(self):
1621
return type(self).__module__ + "." + self.__class__.__qualname__
@@ -50,16 +55,39 @@ def update_code(self, **kwargs):
5055
self.g.V(id).properties(property).drop().iterate()
5156
self.g.V(id).property(property, code).next()
5257

58+
def from_node_f(self, friendly_id):
59+
self.logger.debug('Loading node {}'.format(id))
60+
v = self.g.V().has('friendly_id', friendly_id)
61+
if v.has_next():
62+
return self.from_node(v.id)
63+
5364
def from_node(self, id):
65+
self.logger.debug('Loading node {}'.format(id))
5466
if self.gr.property_exists(Id=id, Property='gr_type')[1]:
5567
module_name, class_name = self.get_property('gr_type', id).rsplit(".", 1)
68+
self.logger.debug('Found node, type={}.{}'.format(module_name, class_name))
5669
cls = getattr(importlib.import_module(module_name), class_name)
57-
return cls(Id=id, Traversal=self.g)
70+
properties = self.g.V(id).valueMap(False).toList()[0]
71+
self.logger.debug('Properties={}'.format(properties))
72+
return cls(Id=id,
73+
Traversal=self.g,
74+
NodeProperties=properties,
75+
Logger=self.logger)
5876

59-
def add_node(self):
60-
id = str(uuid.uuid4())
61-
self.id = id
62-
return self.g.addV().property(T.id, self.id).property('gr_type', self.full_self())
77+
def add_node(self, **kwargs):
78+
properties = kwargs.get('Properties')
79+
v = self.g.addV().property('gr_type', self.full_self())
80+
self.logger.debug('Creating node')
81+
self.logger.debug('Expected Properties: {}'.format(self.properties))
82+
self.logger.debug('Actual Properties: {}'.format(properties))
83+
for prop in self.properties:
84+
prop_u = inflection.underscore(prop)
85+
properties_u = {inflection.underscore(k): v for k, v in properties.items()}
86+
self.logger.debug('Checking {}'.format(prop_u))
87+
if prop_u in properties_u:
88+
self.logger.debug('Adding property {}:{}'.format(prop_u, properties_u[prop_u]))
89+
v.property(prop_u, properties_u[prop_u])
90+
return v
6391

6492
def add_ruled_edge(self, name, to_id, rule):
6593
self.g.V(self.id).addE(name).drop().iterate()
@@ -92,7 +120,6 @@ def next_node_by_rules(self):
92120
if result:
93121
return self.g.V(self.id).outE(rule)
94122

95-
96123
def get_property(self, name, id=None):
97124
if id is None:
98125
id = self.id

‎setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
author_email="troylar@gmail.com",
1414
description="Run your graphs in code",
1515
long_description=long_description,
16-
install_requires=["gremlinpython", 'jinja2'],
16+
install_requires=["gremlinpython", 'jinja2', 'inflection'],
1717
long_description_content_type="text/markdown",
1818
url="https://github.com/troylar/graph-runner",
1919
packages=["graph_runner", "graph_entity", 'entities', 'snippets'],

‎snippets/node_test.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
1-
from gremlin_python import statics
21
from gremlin_python.structure.graph import Graph
3-
from gremlin_python.process.graph_traversal import __
4-
from gremlin_python.process.strategies import *
52
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection
63
from graph_entity import GraphEntity
74
from entities import EventEntity, PersonEntity
85
import os
96

107
graph = Graph()
118

12-
g = graph.traversal().withRemote(DriverRemoteConnection(os.environ.get('CONN_STR'),'g'))
9+
g = graph.traversal().withRemote(DriverRemoteConnection(os.environ.get('CONN_STR'), 'g'))
1310

1411
# We're going to add an entity to the graph
1512
first_event = EventEntity(Traversal=g)

0 commit comments

Comments
 (0)