Are u using websocket or http? On Jun 15, 2016 17:09, "Marko Rodriguez" <[email protected]> wrote:
> Dar. > > >>> g.V().name.toList() > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > File > "/Users/marko/software/tinkerpop/gremlin-variant/src/main/jython/gremlin_python/gremlin_python.py", > line 107, in toList > return list(iter(self)) > File > "/Users/marko/software/tinkerpop/gremlin-variant/src/main/jython/gremlin_python/gremlin_python.py", > line 110, in next > self.results = > self.remote_connection.submit(self.translator.script_engine, > self.translator.traversal_script, self.bindings) > File > "/Library/Python/2.7/site-packages/gremlinclient/tornado_client/remote_connection.py", > line 20, in submit > results = self._loop.run_sync(lambda: > File "/Library/Python/2.7/site-packages/tornado/ioloop.py", line 453, in > run_sync > return future_cell[0].result() > File "/Library/Python/2.7/site-packages/tornado/concurrent.py", line > 232, in result > raise_exc_info(self._exc_info) > File "/Library/Python/2.7/site-packages/tornado/gen.py", line 1014, in > run > yielded = self.gen.throw(*exc_info) > File > "/Library/Python/2.7/site-packages/gremlinclient/tornado_client/remote_connection.py", > line 27, in _execute > conn = yield self._pool.acquire() > File "/Library/Python/2.7/site-packages/tornado/gen.py", line 1008, in > run > value = future.result() > File "/Library/Python/2.7/site-packages/tornado/concurrent.py", line > 232, in result > raise_exc_info(self._exc_info) > File "<string>", line 3, in raise_exc_info > tornado.httpclient.HTTPError: HTTP 400: Bad Request > > > > > > On Jun 15, 2016, at 5:36 PM, David Brown <[email protected]> wrote: > > > > Nice Leif! > > > > I just added very basic support for the RemoteConnection interface in > > gremlinclient: > > > > > http://gremlinclient.readthedocs.io/en/latest/usage.html#the-remoteconnection-object > > > > It needs more tests etc., but it seems to be working well. If you want > > to try it out, you can pip install gremlinclient from github: > > > > pip install git+https://github.com/davebshow/gremlinclient.git > > > > More tomorrow... > > > > On Wed, Jun 15, 2016 at 7:17 PM, Leifur Halldor Asgeirsson > > <[email protected]> wrote: > >> Thanks! I'll submit my PR in the morning. > >> > >> ________________________________________ > >> From: Marko Rodriguez <[email protected]> > >> Sent: June 15, 2016 6:13 PM > >> To: [email protected] > >> Subject: Re: gremlin_python GLV > >> > >> Hi, > >> > >> That is a really good idea. > >> > >> Want to do a PR to the branch or do you want me to just take your > notes/gist and make it happen? > >> > >> Marko. > >> > >> http://markorodriguez.com > >> > >> > >> > >>> On Jun 15, 2016, at 3:55 PM, Leifur Halldor Asgeirsson < > [email protected]> wrote: > >>> > >>> Hi all, > >>> I have a couple of suggestions for the GLV. > >>> > >>> Firstly, it would be useful to be able to inject arbitrary > expressions, such as static constructors. For example, in an application > that I'm currently working on, I use Titan's Geoshape property type. I > would like to be able to call one of the static constructors on the > Geoshape class in a script, passing it bound parameters. Something like > >>> > >>> "g.V().has('location', geoWithin(Geoshape.circle(lat, lon, radius)))" > >>> with bound parameters {'lat': 45, 'lon': 45, 'radius': '10'} > >>> > >>> I took an initial stab at this today, and this is what I came up with: > >>> https://gist.github.com/leifurhauks/5a843379183123dbed1134a92691a335 > >>> > >>> With those changes, I can use that static constructor in a traversal > as follows: > >>> > >>>>>> translator = GroovyTranslator('g') > >>>>>> g = PythonGraphTraversalSource(translator) > >>>>>> t = g.V().has('location', RawExpression('Geoshape.point(', B('lat', > 45), ', ', B('lon', 45), ')')) > >>>>>> str(t) > >>> 'g.V().has("location", Geoshape.point(lat, lon))' > >>>>>> t.bindings > >>> {'lon': 45, 'lat': 45} > >>> > >>> That raw expression isn't very readable, but a simple helper class can > fix that: > >>> > >>> class Geoshape(object): > >>> @staticmethod > >>> def point(latitude, longitude, symbols=('lat', 'lon')): > >>> return RawExpression( > >>> 'Geoshape.point(', B(symbols[0], latitude), ', ', > B(symbols[1], longitude), ')') > >>> > >>> Now I can rewrite the previous traversal to be much clearer: > >>> > >>> t = g.V().has('location', Geoshape.point(45, 45)) > >>> > >>> > >>> If this seems like a reasonable approach, I would be happy to submit a > PR. > >>> > >>> > >>> I have one other suggestion, but this one is tiny. Because most of the > steps on PythonGraphTraversal have the same implementation, it would be > possible to specify that implementation once in a function factory, like > this: > >>> > >>> def simple_step(name): > >>> def step_method(self, *args): > >>> self.translator.addStep(self, name, *args) > >>> for arg in args: > >>> if type(arg) is B: > >>> self.bindings[arg.symbol] = arg.value > >>> return self > >>> return step_method > >>> > >>> Then, on PythonGraphTraversal, all the step methods that use that > implementation could be declared like this: > >>> > >>> class PythonGraphTraversal(object): > >>> def __init__(self, translator, remote_connection=None): > >>> # elided ... > >>> # top methods elided > >>> has = simple_step('has') > >>> hasId = simple_step('hasId') > >>> hasKey = smple_step('hasKey') > >>> # and so on... > >>> > >>> > >>> ________________________________________ > >>> From: David Brown <[email protected]> > >>> Sent: June 15, 2016 3:23 PM > >>> To: [email protected] > >>> Subject: Re: gremlin_python GLV > >>> > >>> Ok Stephen I will. I can't claim to be an expert (especially when it > >>> comes to the Java ecosystem), but I will definitely take a look. > >>> > >>> Also, Marko, Python doesn't really have primitives as such. The built > >>> in function isinstance should work for everything in gremlin_python > >>> e.g. ``isinstance(var, bool)``. I can take a look at this when I make > >>> a PR if you'd like, but it really isn't a huge deal anyway. > >>> > >>> On Wed, Jun 15, 2016 at 3:16 PM, Stephen Mallette < > [email protected]> wrote: > >>>> David, it would also be great to get your feedback on the > >>>> packaging/deployment approach we have so far. I have some basic > figured out > >>>> for deployment to pypi over maven via twine, but it could use an > experts > >>>> eye. You probably don't need to check that part out now as you are > already > >>>> have some other stuff to look at, but I just wanted to mention that > so that > >>>> it was in your mind for later. Thanks for your help on this. > >>>> > >>>> On Wed, Jun 15, 2016 at 3:02 PM, Marko Rodriguez < > [email protected]> > >>>> wrote: > >>>> > >>>>> Hello, > >>>>> > >>>>>> I was reading through the gremlin_python GLV code this morning, and > >>>>>> overall it looks like it should work pretty smoothly. Thanks for > doing > >>>>>> this Marko, really cool work! I just wanted to comment on a few > things > >>>>>> that popped out at me on my first reading.The major issue I see is > >>>>>> that it is not currently Python 2/3 compatible. This is due to two > >>>>>> things: > >>>>> > >>>>> Cool! Thank you for taking your time to review the work. > >>>>> > >>>>>> 1. The way iterators are implemented in Python 2/3 is different. > This > >>>>>> problem could be remedied by adding a method to > >>>>>> ``PythonGraphTraversal``, something like: > >>>>>> > >>>>>> def __next__(self): > >>>>>> return self.next() > >>>>>> > >>>>>> then, in the ``next`` method, changing line 113 to > >>>>>> ``next(self.results)``, should take care of this problem. > >>>>> > >>>>> Updated. > >>>>> > >>>>>> 2. The ``GroovyTranslator`` class checks for type ``long``, this no > >>>>>> longer exists in Python 3. Determining what to submit as a Long > might > >>>>>> require some discussion, but this could be easily fixed by adding > >>>>>> something like: > >>>>>> > >>>>>> import sys > >>>>>> if sys.version_info.major > 2: > >>>>>> long = int > >>>>>> > >>>>>> to the top of the file. > >>>>> > >>>>> Updated. > >>>>> > >>>>>> > >>>>>> Other than this, there are some minor details that could be cleaned > >>>>>> up. Particularly: > >>>>>> > >>>>>> 1. Using ``isinstance`` instead of ``type`` to perform type > checking. > >>>>>> This will recognize subclasses and is the most Pythonic way to do > >>>>>> this. > >>>>> > >>>>> Seems isinstance() isn’t a method on primitives — only objects. > Thus, the > >>>>> code got complex. Left it with type(). > >>>>> > >>>>>> > >>>>>> 2. Formatting - indents, and line spacing. Typically, Python methods > >>>>>> are separated by a single line, and indents use four spaces. This is > >>>>>> really just cosmetic for readability. > >>>>> > >>>>> Uh. The problem is that the source code is auto-generated from > >>>>> GremlinPythonGenerator. If you want to tweak, please do so: > >>>>> > >>>>> > >>>>> > https://github.com/apache/tinkerpop/blob/TINKERPOP-1278/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/python/GremlinPythonGenerator.groovy > >>>>> < > >>>>> > https://github.com/apache/tinkerpop/blob/TINKERPOP-1278/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/python/GremlinPythonGenerator.groovy > >>>>>> > >>>>> > >>>>> > >>>>>> 3. CamelCase vs. underscores. I understand that to emulate Gremlin, > >>>>>> the traversal methods etc. should use CamelCase. But I wonder if the > >>>>>> helper classes (Translators) should use the Python convention of > using > >>>>>> underscores to name methods. Python class names use camel case by > >>>>>> convention. > >>>>> > >>>>> > >>>>> I haven’t changed it. If you feel we should, please do. And yes, I > think > >>>>> its good to keep the Gremlin step names camelCase. For Gremlin-Ruby, > we > >>>>> will do out_e() style. > >>>>> > >>>>>> Finally, the implementation of the B class may need some work, but > >>>>>> we'll have to play around with it a bit to figure out how the best > >>>>>> approach to doing this. > >>>>> > >>>>> > >>>>> Yea, thats all wrong. I overdosed on the introspection and then > Kuppitz > >>>>> was like “Why not just have it as….” (something much simpler — which > I > >>>>> forget what it was now). > >>>>> > >>>>>> I'm sure there are more improvements, but I just wanted to get a > >>>>>> conversation going. I would be happy to make a PR with some of these > >>>>>> changes. > >>>>> > >>>>> That’d be awesome. Its in TINKERPOP-1278 branch. In > gremlin-variant/test > >>>>> you will see PythonProcessStandardTest and > PythonProcessComputerTest. Those > >>>>> verify that the compilation is valid for all the standard and > computer > >>>>> tests. > >>>>> > >>>>>> Also, gremlinclient will soon support the RemoteConnection > interface, > >>>>>> I'll send out a link to the docs once I get everything up and > running. > >>>>> > >>>>> So cool. Please do review the Python RemoteConnection class as > again, I > >>>>> just improv’d it. > >>>>> > >>>>> Thanks again David, > >>>>> Marko. > >>>>> > >>>>> http://markorodriguez.com > >>> > >>> > >>> > >>> -- > >>> David M. Brown > >>> R.A. CulturePlex Lab, Western University > >> > > > > > > > > -- > > David M. Brown > > R.A. CulturePlex Lab, Western University > >
