updated pattern for defining anonymous dsl traversals
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/404ee8ce Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/404ee8ce Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/404ee8ce Branch: refs/heads/tp32-glv Commit: 404ee8ced4165d188799f6904ff5aed7ca7adee3 Parents: a96544f Author: davebshow <[email protected]> Authored: Thu May 11 12:02:45 2017 -0400 Committer: Stephen Mallette <[email protected]> Committed: Tue May 16 11:02:31 2017 -0400 ---------------------------------------------------------------------- .../python/GraphTraversalSourceGenerator.groovy | 15 +- .../gremlin_python/process/graph_traversal.py | 555 ++++++++++--------- .../src/main/jython/tests/process/test_dsl.py | 23 +- 3 files changed, 299 insertions(+), 294 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/404ee8ce/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy b/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy index c2e733f..086b8ea 100644 --- a/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy +++ b/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy @@ -162,11 +162,12 @@ under the License. //////////////////////// pythonClass.append( """class __(object): - @staticmethod - def start(): + graph_traversal = GraphTraversal + @classmethod + def start(cls): return GraphTraversal(None, None, Bytecode()) - @staticmethod - def __(*args): + @classmethod + def __(cls, *args): return __.inject(*args) """) __.class.getMethods(). @@ -178,9 +179,9 @@ under the License. sort { a, b -> a <=> b }. forEach { method -> pythonClass.append( - """ @staticmethod - def ${method}(*args): - return GraphTraversal(None, None, Bytecode()).${method}(*args) + """ @classmethod + def ${method}(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).${method}(*args) """) }; pythonClass.append("\n\n") http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/404ee8ce/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py b/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py index ef49443..1c940aa 100644 --- a/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py +++ b/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py @@ -396,285 +396,286 @@ class GraphTraversal(Traversal): class __(object): - @staticmethod - def start(): + graph_traversal = GraphTraversal + @classmethod + def start(cls): return GraphTraversal(None, None, Bytecode()) - @staticmethod - def __(*args): + @classmethod + def __(cls, *args): return __.inject(*args) - @staticmethod - def V(*args): - return GraphTraversal(None, None, Bytecode()).V(*args) - @staticmethod - def addE(*args): - return GraphTraversal(None, None, Bytecode()).addE(*args) - @staticmethod - def addInE(*args): - return GraphTraversal(None, None, Bytecode()).addInE(*args) - @staticmethod - def addOutE(*args): - return GraphTraversal(None, None, Bytecode()).addOutE(*args) - @staticmethod - def addV(*args): - return GraphTraversal(None, None, Bytecode()).addV(*args) - @staticmethod - def aggregate(*args): - return GraphTraversal(None, None, Bytecode()).aggregate(*args) - @staticmethod - def and_(*args): - return GraphTraversal(None, None, Bytecode()).and_(*args) - @staticmethod - def as_(*args): - return GraphTraversal(None, None, Bytecode()).as_(*args) - @staticmethod - def barrier(*args): - return GraphTraversal(None, None, Bytecode()).barrier(*args) - @staticmethod - def both(*args): - return GraphTraversal(None, None, Bytecode()).both(*args) - @staticmethod - def bothE(*args): - return GraphTraversal(None, None, Bytecode()).bothE(*args) - @staticmethod - def bothV(*args): - return GraphTraversal(None, None, Bytecode()).bothV(*args) - @staticmethod - def branch(*args): - return GraphTraversal(None, None, Bytecode()).branch(*args) - @staticmethod - def cap(*args): - return GraphTraversal(None, None, Bytecode()).cap(*args) - @staticmethod - def choose(*args): - return GraphTraversal(None, None, Bytecode()).choose(*args) - @staticmethod - def coalesce(*args): - return GraphTraversal(None, None, Bytecode()).coalesce(*args) - @staticmethod - def coin(*args): - return GraphTraversal(None, None, Bytecode()).coin(*args) - @staticmethod - def constant(*args): - return GraphTraversal(None, None, Bytecode()).constant(*args) - @staticmethod - def count(*args): - return GraphTraversal(None, None, Bytecode()).count(*args) - @staticmethod - def cyclicPath(*args): - return GraphTraversal(None, None, Bytecode()).cyclicPath(*args) - @staticmethod - def dedup(*args): - return GraphTraversal(None, None, Bytecode()).dedup(*args) - @staticmethod - def drop(*args): - return GraphTraversal(None, None, Bytecode()).drop(*args) - @staticmethod - def emit(*args): - return GraphTraversal(None, None, Bytecode()).emit(*args) - @staticmethod - def filter(*args): - return GraphTraversal(None, None, Bytecode()).filter(*args) - @staticmethod - def flatMap(*args): - return GraphTraversal(None, None, Bytecode()).flatMap(*args) - @staticmethod - def fold(*args): - return GraphTraversal(None, None, Bytecode()).fold(*args) - @staticmethod - def group(*args): - return GraphTraversal(None, None, Bytecode()).group(*args) - @staticmethod - def groupCount(*args): - return GraphTraversal(None, None, Bytecode()).groupCount(*args) - @staticmethod - def groupV3d0(*args): - return GraphTraversal(None, None, Bytecode()).groupV3d0(*args) - @staticmethod - def has(*args): - return GraphTraversal(None, None, Bytecode()).has(*args) - @staticmethod - def hasId(*args): - return GraphTraversal(None, None, Bytecode()).hasId(*args) - @staticmethod - def hasKey(*args): - return GraphTraversal(None, None, Bytecode()).hasKey(*args) - @staticmethod - def hasLabel(*args): - return GraphTraversal(None, None, Bytecode()).hasLabel(*args) - @staticmethod - def hasNot(*args): - return GraphTraversal(None, None, Bytecode()).hasNot(*args) - @staticmethod - def hasValue(*args): - return GraphTraversal(None, None, Bytecode()).hasValue(*args) - @staticmethod - def id(*args): - return GraphTraversal(None, None, Bytecode()).id(*args) - @staticmethod - def identity(*args): - return GraphTraversal(None, None, Bytecode()).identity(*args) - @staticmethod - def inE(*args): - return GraphTraversal(None, None, Bytecode()).inE(*args) - @staticmethod - def inV(*args): - return GraphTraversal(None, None, Bytecode()).inV(*args) - @staticmethod - def in_(*args): - return GraphTraversal(None, None, Bytecode()).in_(*args) - @staticmethod - def inject(*args): - return GraphTraversal(None, None, Bytecode()).inject(*args) - @staticmethod - def is_(*args): - return GraphTraversal(None, None, Bytecode()).is_(*args) - @staticmethod - def key(*args): - return GraphTraversal(None, None, Bytecode()).key(*args) - @staticmethod - def label(*args): - return GraphTraversal(None, None, Bytecode()).label(*args) - @staticmethod - def limit(*args): - return GraphTraversal(None, None, Bytecode()).limit(*args) - @staticmethod - def local(*args): - return GraphTraversal(None, None, Bytecode()).local(*args) - @staticmethod - def loops(*args): - return GraphTraversal(None, None, Bytecode()).loops(*args) - @staticmethod - def map(*args): - return GraphTraversal(None, None, Bytecode()).map(*args) - @staticmethod - def mapKeys(*args): - return GraphTraversal(None, None, Bytecode()).mapKeys(*args) - @staticmethod - def mapValues(*args): - return GraphTraversal(None, None, Bytecode()).mapValues(*args) - @staticmethod - def match(*args): - return GraphTraversal(None, None, Bytecode()).match(*args) - @staticmethod - def max(*args): - return GraphTraversal(None, None, Bytecode()).max(*args) - @staticmethod - def mean(*args): - return GraphTraversal(None, None, Bytecode()).mean(*args) - @staticmethod - def min(*args): - return GraphTraversal(None, None, Bytecode()).min(*args) - @staticmethod - def not_(*args): - return GraphTraversal(None, None, Bytecode()).not_(*args) - @staticmethod - def optional(*args): - return GraphTraversal(None, None, Bytecode()).optional(*args) - @staticmethod - def or_(*args): - return GraphTraversal(None, None, Bytecode()).or_(*args) - @staticmethod - def order(*args): - return GraphTraversal(None, None, Bytecode()).order(*args) - @staticmethod - def otherV(*args): - return GraphTraversal(None, None, Bytecode()).otherV(*args) - @staticmethod - def out(*args): - return GraphTraversal(None, None, Bytecode()).out(*args) - @staticmethod - def outE(*args): - return GraphTraversal(None, None, Bytecode()).outE(*args) - @staticmethod - def outV(*args): - return GraphTraversal(None, None, Bytecode()).outV(*args) - @staticmethod - def path(*args): - return GraphTraversal(None, None, Bytecode()).path(*args) - @staticmethod - def project(*args): - return GraphTraversal(None, None, Bytecode()).project(*args) - @staticmethod - def properties(*args): - return GraphTraversal(None, None, Bytecode()).properties(*args) - @staticmethod - def property(*args): - return GraphTraversal(None, None, Bytecode()).property(*args) - @staticmethod - def propertyMap(*args): - return GraphTraversal(None, None, Bytecode()).propertyMap(*args) - @staticmethod - def range(*args): - return GraphTraversal(None, None, Bytecode()).range(*args) - @staticmethod - def repeat(*args): - return GraphTraversal(None, None, Bytecode()).repeat(*args) - @staticmethod - def sack(*args): - return GraphTraversal(None, None, Bytecode()).sack(*args) - @staticmethod - def sample(*args): - return GraphTraversal(None, None, Bytecode()).sample(*args) - @staticmethod - def select(*args): - return GraphTraversal(None, None, Bytecode()).select(*args) - @staticmethod - def sideEffect(*args): - return GraphTraversal(None, None, Bytecode()).sideEffect(*args) - @staticmethod - def simplePath(*args): - return GraphTraversal(None, None, Bytecode()).simplePath(*args) - @staticmethod - def store(*args): - return GraphTraversal(None, None, Bytecode()).store(*args) - @staticmethod - def subgraph(*args): - return GraphTraversal(None, None, Bytecode()).subgraph(*args) - @staticmethod - def sum(*args): - return GraphTraversal(None, None, Bytecode()).sum(*args) - @staticmethod - def tail(*args): - return GraphTraversal(None, None, Bytecode()).tail(*args) - @staticmethod - def timeLimit(*args): - return GraphTraversal(None, None, Bytecode()).timeLimit(*args) - @staticmethod - def times(*args): - return GraphTraversal(None, None, Bytecode()).times(*args) - @staticmethod - def to(*args): - return GraphTraversal(None, None, Bytecode()).to(*args) - @staticmethod - def toE(*args): - return GraphTraversal(None, None, Bytecode()).toE(*args) - @staticmethod - def toV(*args): - return GraphTraversal(None, None, Bytecode()).toV(*args) - @staticmethod - def tree(*args): - return GraphTraversal(None, None, Bytecode()).tree(*args) - @staticmethod - def unfold(*args): - return GraphTraversal(None, None, Bytecode()).unfold(*args) - @staticmethod - def union(*args): - return GraphTraversal(None, None, Bytecode()).union(*args) - @staticmethod - def until(*args): - return GraphTraversal(None, None, Bytecode()).until(*args) - @staticmethod - def value(*args): - return GraphTraversal(None, None, Bytecode()).value(*args) - @staticmethod - def valueMap(*args): - return GraphTraversal(None, None, Bytecode()).valueMap(*args) - @staticmethod - def values(*args): - return GraphTraversal(None, None, Bytecode()).values(*args) - @staticmethod - def where(*args): - return GraphTraversal(None, None, Bytecode()).where(*args) + @classmethod + def V(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).V(*args) + @classmethod + def addE(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).addE(*args) + @classmethod + def addInE(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).addInE(*args) + @classmethod + def addOutE(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).addOutE(*args) + @classmethod + def addV(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).addV(*args) + @classmethod + def aggregate(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).aggregate(*args) + @classmethod + def and_(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).and_(*args) + @classmethod + def as_(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).as_(*args) + @classmethod + def barrier(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).barrier(*args) + @classmethod + def both(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).both(*args) + @classmethod + def bothE(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).bothE(*args) + @classmethod + def bothV(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).bothV(*args) + @classmethod + def branch(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).branch(*args) + @classmethod + def cap(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).cap(*args) + @classmethod + def choose(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).choose(*args) + @classmethod + def coalesce(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).coalesce(*args) + @classmethod + def coin(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).coin(*args) + @classmethod + def constant(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).constant(*args) + @classmethod + def count(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).count(*args) + @classmethod + def cyclicPath(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).cyclicPath(*args) + @classmethod + def dedup(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).dedup(*args) + @classmethod + def drop(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).drop(*args) + @classmethod + def emit(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).emit(*args) + @classmethod + def filter(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).filter(*args) + @classmethod + def flatMap(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).flatMap(*args) + @classmethod + def fold(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).fold(*args) + @classmethod + def group(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).group(*args) + @classmethod + def groupCount(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).groupCount(*args) + @classmethod + def groupV3d0(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).groupV3d0(*args) + @classmethod + def has(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).has(*args) + @classmethod + def hasId(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).hasId(*args) + @classmethod + def hasKey(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).hasKey(*args) + @classmethod + def hasLabel(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).hasLabel(*args) + @classmethod + def hasNot(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).hasNot(*args) + @classmethod + def hasValue(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).hasValue(*args) + @classmethod + def id(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).id(*args) + @classmethod + def identity(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).identity(*args) + @classmethod + def inE(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).inE(*args) + @classmethod + def inV(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).inV(*args) + @classmethod + def in_(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).in_(*args) + @classmethod + def inject(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).inject(*args) + @classmethod + def is_(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).is_(*args) + @classmethod + def key(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).key(*args) + @classmethod + def label(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).label(*args) + @classmethod + def limit(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).limit(*args) + @classmethod + def local(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).local(*args) + @classmethod + def loops(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).loops(*args) + @classmethod + def map(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).map(*args) + @classmethod + def mapKeys(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).mapKeys(*args) + @classmethod + def mapValues(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).mapValues(*args) + @classmethod + def match(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).match(*args) + @classmethod + def max(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).max(*args) + @classmethod + def mean(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).mean(*args) + @classmethod + def min(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).min(*args) + @classmethod + def not_(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).not_(*args) + @classmethod + def optional(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).optional(*args) + @classmethod + def or_(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).or_(*args) + @classmethod + def order(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).order(*args) + @classmethod + def otherV(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).otherV(*args) + @classmethod + def out(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).out(*args) + @classmethod + def outE(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).outE(*args) + @classmethod + def outV(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).outV(*args) + @classmethod + def path(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).path(*args) + @classmethod + def project(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).project(*args) + @classmethod + def properties(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).properties(*args) + @classmethod + def property(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).property(*args) + @classmethod + def propertyMap(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).propertyMap(*args) + @classmethod + def range(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).range(*args) + @classmethod + def repeat(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).repeat(*args) + @classmethod + def sack(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).sack(*args) + @classmethod + def sample(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).sample(*args) + @classmethod + def select(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).select(*args) + @classmethod + def sideEffect(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).sideEffect(*args) + @classmethod + def simplePath(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).simplePath(*args) + @classmethod + def store(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).store(*args) + @classmethod + def subgraph(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).subgraph(*args) + @classmethod + def sum(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).sum(*args) + @classmethod + def tail(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).tail(*args) + @classmethod + def timeLimit(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).timeLimit(*args) + @classmethod + def times(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).times(*args) + @classmethod + def to(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).to(*args) + @classmethod + def toE(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).toE(*args) + @classmethod + def toV(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).toV(*args) + @classmethod + def tree(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).tree(*args) + @classmethod + def unfold(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).unfold(*args) + @classmethod + def union(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).union(*args) + @classmethod + def until(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).until(*args) + @classmethod + def value(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).value(*args) + @classmethod + def valueMap(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).valueMap(*args) + @classmethod + def values(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).values(*args) + @classmethod + def where(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).where(*args) def V(*args): http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/404ee8ce/gremlin-python/src/main/jython/tests/process/test_dsl.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/tests/process/test_dsl.py b/gremlin-python/src/main/jython/tests/process/test_dsl.py index 0652cbb..5ec79ca 100644 --- a/gremlin-python/src/main/jython/tests/process/test_dsl.py +++ b/gremlin-python/src/main/jython/tests/process/test_dsl.py @@ -18,7 +18,7 @@ under the License. ''' import pytest -from gremlin_python.process.traversal import (Bytecode, P) +from gremlin_python.process.traversal import Bytecode, P from gremlin_python.process.graph_traversal import ( GraphTraversalSource, GraphTraversal) from gremlin_python.process.graph_traversal import __ as AnonymousTraversal @@ -39,17 +39,20 @@ class SocialTraversal(GraphTraversal): return self.outE("created").count().is_(P.gte(number)) class __(AnonymousTraversal): - @staticmethod - def knows(*args): - return SocialTraversal(None, None, Bytecode()).knows(*args) - @staticmethod - def youngestFriendsAge(*args): - return SocialTraversal(None, None, Bytecode()).youngestFriendsAge(*args) + graph_traversal = SocialTraversal - @staticmethod - def createdAtLeast(*args): - return SocialTraversal(None, None, Bytecode()).createdAtLeast(*args) + @classmethod + def knows(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).knows(*args) + + @classmethod + def youngestFriendsAge(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).youngestFriendsAge(*args) + + @classmethod + def createdAtLeast(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).createdAtLeast(*args) class SocialTraversalSource(GraphTraversalSource):
