grumlin 0.14.0 → 0.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -0
- data/Gemfile.lock +12 -13
- data/README.md +2 -1
- data/grumlin.gemspec +3 -0
- data/lib/grumlin/anonymous_step.rb +7 -5
- data/lib/grumlin/bytecode.rb +4 -1
- data/lib/grumlin/client.rb +5 -2
- data/lib/grumlin/edge.rb +4 -1
- data/lib/grumlin/expressions/{tool.rb → expression.rb} +2 -2
- data/lib/grumlin/expressions/operator.rb +15 -0
- data/lib/grumlin/expressions/order.rb +5 -3
- data/lib/grumlin/expressions/pop.rb +5 -3
- data/lib/grumlin/expressions/scope.rb +5 -3
- data/lib/grumlin/expressions/t.rb +5 -3
- data/lib/grumlin/expressions/u.rb +2 -2
- data/lib/grumlin/path.rb +4 -1
- data/lib/grumlin/request_dispatcher.rb +8 -4
- data/lib/grumlin/shortcut_proxy.rb +3 -1
- data/lib/grumlin/shortcuts.rb +1 -1
- data/lib/grumlin/transport.rb +1 -1
- data/lib/grumlin/traversal.rb +8 -2
- data/lib/grumlin/typed_value.rb +8 -2
- data/lib/grumlin/version.rb +1 -1
- data/lib/grumlin/vertex.rb +4 -1
- data/lib/grumlin.rb +2 -0
- metadata +5 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 02a213b95f80992accf37eecb32684369e2e8a1582d10be4014e5c59b8381ec3
|
|
4
|
+
data.tar.gz: ddf854b45f388d9a1c6e4a557e715c9d4363f2ae1c44503969e7d4c819537c1e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 812636c84d1cffaf7bfb5b9c549b3d5c2fca7999b98c395e3cc9fa95701fe73ad0d91e159ba70c672e9bc5671119efd2f6ba65313e6c1e3c8d98e96e64cedc41
|
|
7
|
+
data.tar.gz: 1863a834265130e9f14cc48d720f638825d86f1a12c70f3d77da4dd18fe835bf7ab0eedcc374ab51bdc0ec007b4c1af8e2f0798b03bd6d2c1fde71d5d544f9bb
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
## [0.14.4] - 2021-12-17
|
|
2
|
+
|
|
3
|
+
- `Grumlin::Repository.shorcuts_from` do not raise `ArgumentError` when importing an already existing shortcut
|
|
4
|
+
pointing to the same block. This fixes importing shortcuts from another repository.
|
|
5
|
+
|
|
6
|
+
## [0.14.2] - 2021-12-13
|
|
7
|
+
|
|
8
|
+
- Fix `Module` bloating
|
|
9
|
+
- Add `Operator` expressions
|
|
10
|
+
- Add `__.coalesce` and `__.constant`
|
|
11
|
+
- Add steps: `sum`, `sack`
|
|
12
|
+
- Add configuration steps: `withSack`
|
|
13
|
+
- Rename `Grumlin::Expressions::Tool` to `Grumlin::Expressions::Expression`
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
## [0.14.2] - 2021-12-12
|
|
17
|
+
|
|
18
|
+
- Better exceptions
|
|
19
|
+
- Add `choose` step
|
|
20
|
+
- Add `__.hasNot`, `__.is`, `__.select`
|
|
21
|
+
|
|
1
22
|
## [0.14.0] - 2021-12-07
|
|
2
23
|
|
|
3
24
|
- Add initial support for [configuration steps](https://tinkerpop.apache.org/docs/current/reference/#configuration-steps)
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
grumlin (0.14.
|
|
4
|
+
grumlin (0.14.4)
|
|
5
5
|
async-pool (~> 0.3)
|
|
6
6
|
async-websocket (~> 0.19)
|
|
7
7
|
oj (~> 3.12)
|
|
@@ -68,12 +68,12 @@ GEM
|
|
|
68
68
|
racc (~> 1.4)
|
|
69
69
|
nokogiri (1.11.7-x86_64-linux)
|
|
70
70
|
racc (~> 1.4)
|
|
71
|
-
oj (3.13.
|
|
71
|
+
oj (3.13.10)
|
|
72
72
|
overcommit (0.57.0)
|
|
73
73
|
childprocess (>= 0.6.3, < 5)
|
|
74
74
|
iniparse (~> 1.4)
|
|
75
|
-
parallel (1.
|
|
76
|
-
parser (3.0.
|
|
75
|
+
parallel (1.21.0)
|
|
76
|
+
parser (3.0.3.2)
|
|
77
77
|
ast (~> 2.4.1)
|
|
78
78
|
protocol-hpack (1.4.2)
|
|
79
79
|
protocol-http (0.22.5)
|
|
@@ -88,7 +88,7 @@ GEM
|
|
|
88
88
|
racc (1.5.2)
|
|
89
89
|
rainbow (3.0.0)
|
|
90
90
|
rake (13.0.3)
|
|
91
|
-
regexp_parser (2.
|
|
91
|
+
regexp_parser (2.2.0)
|
|
92
92
|
reverse_markdown (2.0.0)
|
|
93
93
|
nokogiri
|
|
94
94
|
rexml (3.2.5)
|
|
@@ -109,23 +109,22 @@ GEM
|
|
|
109
109
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
110
110
|
rspec-support (~> 3.10.0)
|
|
111
111
|
rspec-support (3.10.2)
|
|
112
|
-
rubocop (1.
|
|
112
|
+
rubocop (1.23.0)
|
|
113
113
|
parallel (~> 1.10)
|
|
114
114
|
parser (>= 3.0.0.0)
|
|
115
115
|
rainbow (>= 2.2.2, < 4.0)
|
|
116
116
|
regexp_parser (>= 1.8, < 3.0)
|
|
117
117
|
rexml
|
|
118
|
-
rubocop-ast (>= 1.
|
|
118
|
+
rubocop-ast (>= 1.12.0, < 2.0)
|
|
119
119
|
ruby-progressbar (~> 1.7)
|
|
120
120
|
unicode-display_width (>= 1.4.0, < 3.0)
|
|
121
|
-
rubocop-ast (1.
|
|
121
|
+
rubocop-ast (1.14.0)
|
|
122
122
|
parser (>= 3.0.1.1)
|
|
123
|
-
rubocop-performance (1.
|
|
123
|
+
rubocop-performance (1.12.0)
|
|
124
124
|
rubocop (>= 1.7.0, < 2.0)
|
|
125
125
|
rubocop-ast (>= 0.4.0)
|
|
126
|
-
rubocop-rspec (2.
|
|
127
|
-
rubocop (~> 1.
|
|
128
|
-
rubocop-ast (>= 1.1.0)
|
|
126
|
+
rubocop-rspec (2.6.0)
|
|
127
|
+
rubocop (~> 1.19)
|
|
129
128
|
ruby-progressbar (1.11.0)
|
|
130
129
|
simplecov (0.21.2)
|
|
131
130
|
docile (~> 1.1)
|
|
@@ -153,7 +152,7 @@ GEM
|
|
|
153
152
|
timers (4.3.3)
|
|
154
153
|
tzinfo (2.0.4)
|
|
155
154
|
concurrent-ruby (~> 1.0)
|
|
156
|
-
unicode-display_width (2.
|
|
155
|
+
unicode-display_width (2.1.0)
|
|
157
156
|
yard (0.9.26)
|
|
158
157
|
zeitwerk (2.4.2)
|
|
159
158
|
|
data/README.md
CHANGED
|
@@ -241,7 +241,8 @@ config.include_context(Grumlin::Test::RSpec::DBCleanerContext) # Cleans the data
|
|
|
241
241
|
...
|
|
242
242
|
```
|
|
243
243
|
|
|
244
|
-
It is highly recommended to use `Grumlin::Sugar` and not trying to use lower level APIs
|
|
244
|
+
It is highly recommended to use `Grumlin::Sugar` or `Grumlin::Repository` and not trying to use lower level APIs
|
|
245
|
+
as they are subject to change.
|
|
245
246
|
|
|
246
247
|
## Development
|
|
247
248
|
|
data/grumlin.gemspec
CHANGED
|
@@ -5,10 +5,10 @@ module Grumlin
|
|
|
5
5
|
attr_reader :name, :previous_step, :configuration_steps
|
|
6
6
|
|
|
7
7
|
# TODO: add other steps
|
|
8
|
-
SUPPORTED_STEPS = %i[E V addE addV and as both bothE by coalesce count dedup drop elementMap emit fold from
|
|
9
|
-
groupCount has hasId hasLabel hasNot id in inE inV is label limit not or order out outE
|
|
10
|
-
project property range repeat select sideEffect skip tail to unfold union until
|
|
11
|
-
values where with].freeze
|
|
8
|
+
SUPPORTED_STEPS = %i[E V addE addV and as both bothE by choose coalesce count dedup drop elementMap emit fold from
|
|
9
|
+
group groupCount has hasId hasLabel hasNot id in inE inV is label limit not or order out outE
|
|
10
|
+
path project property range repeat sack select sideEffect skip sum tail to unfold union until
|
|
11
|
+
valueMap values where with].freeze
|
|
12
12
|
|
|
13
13
|
def initialize(name, *args, configuration_steps: [], previous_step: nil, **params)
|
|
14
14
|
@name = name
|
|
@@ -32,7 +32,9 @@ module Grumlin
|
|
|
32
32
|
bytecode.inspect
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
def to_s
|
|
36
|
+
inspect
|
|
37
|
+
end
|
|
36
38
|
|
|
37
39
|
def bytecode(no_return: false)
|
|
38
40
|
@bytecode ||= Bytecode.new(self, no_return: no_return)
|
data/lib/grumlin/bytecode.rb
CHANGED
|
@@ -25,7 +25,10 @@ module Grumlin
|
|
|
25
25
|
end
|
|
26
26
|
"#{configuration_steps.any? ? configuration_steps : nil}#{to_readable_bytecode}"
|
|
27
27
|
end
|
|
28
|
-
|
|
28
|
+
|
|
29
|
+
def to_s
|
|
30
|
+
inspect
|
|
31
|
+
end
|
|
29
32
|
|
|
30
33
|
def to_readable_bytecode
|
|
31
34
|
@to_readable_bytecode ||= steps.map { |s| serialize_arg(s, serialization_method: :to_readable_bytecode) }
|
data/lib/grumlin/client.rb
CHANGED
|
@@ -51,7 +51,7 @@ module Grumlin
|
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
def connect
|
|
54
|
-
raise
|
|
54
|
+
raise ClientClosedError if @closed
|
|
55
55
|
|
|
56
56
|
@transport = build_transport
|
|
57
57
|
response_channel = @transport.connect
|
|
@@ -113,10 +113,13 @@ module Grumlin
|
|
|
113
113
|
"<#{self.class} url=#{@url} connected=#{connected?}>"
|
|
114
114
|
end
|
|
115
115
|
|
|
116
|
-
|
|
116
|
+
def to_s
|
|
117
|
+
inspect
|
|
118
|
+
end
|
|
117
119
|
|
|
118
120
|
private
|
|
119
121
|
|
|
122
|
+
# This might be overridden in successors
|
|
120
123
|
def build_transport
|
|
121
124
|
Transport.new(@url, parent: @parent, **@client_options)
|
|
122
125
|
end
|
data/lib/grumlin/edge.rb
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
module Grumlin
|
|
4
4
|
module Expressions
|
|
5
|
-
module
|
|
5
|
+
module Expression
|
|
6
6
|
def define_steps(steps, tool_name)
|
|
7
7
|
steps.each do |step|
|
|
8
|
-
|
|
8
|
+
define_method step do
|
|
9
9
|
name = "@#{step}"
|
|
10
10
|
return instance_variable_get(name) if instance_variable_defined?(name)
|
|
11
11
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Grumlin
|
|
4
|
+
module Expressions
|
|
5
|
+
module Operator
|
|
6
|
+
SUPPORTED_STEPS = %i[addAll and assign div max min minus mult or sum].freeze
|
|
7
|
+
|
|
8
|
+
class << self
|
|
9
|
+
extend Expression
|
|
10
|
+
|
|
11
|
+
define_steps(SUPPORTED_STEPS, "Operator")
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
module Grumlin
|
|
4
4
|
module Expressions
|
|
5
5
|
module Order
|
|
6
|
-
extend Tool
|
|
7
|
-
|
|
8
6
|
SUPPORTED_STEPS = %i[asc desc].freeze
|
|
9
7
|
|
|
10
|
-
|
|
8
|
+
class << self
|
|
9
|
+
extend Expression
|
|
10
|
+
|
|
11
|
+
define_steps(SUPPORTED_STEPS, "Order")
|
|
12
|
+
end
|
|
11
13
|
end
|
|
12
14
|
end
|
|
13
15
|
end
|
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
module Grumlin
|
|
4
4
|
module Expressions
|
|
5
5
|
module Pop
|
|
6
|
-
extend Tool
|
|
7
|
-
|
|
8
6
|
SUPPORTED_STEPS = %i[all first last mixed].freeze
|
|
9
7
|
|
|
10
|
-
|
|
8
|
+
class << self
|
|
9
|
+
extend Expression
|
|
10
|
+
|
|
11
|
+
define_steps(SUPPORTED_STEPS, "Pop")
|
|
12
|
+
end
|
|
11
13
|
end
|
|
12
14
|
end
|
|
13
15
|
end
|
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
module Grumlin
|
|
4
4
|
module Expressions
|
|
5
5
|
module Scope
|
|
6
|
-
extend Tool
|
|
7
|
-
|
|
8
6
|
SUPPORTED_STEPS = %i[local].freeze
|
|
9
7
|
|
|
10
|
-
|
|
8
|
+
class << self
|
|
9
|
+
extend Expression
|
|
10
|
+
|
|
11
|
+
define_steps(SUPPORTED_STEPS, "Scope")
|
|
12
|
+
end
|
|
11
13
|
end
|
|
12
14
|
end
|
|
13
15
|
end
|
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
module Grumlin
|
|
4
4
|
module Expressions
|
|
5
5
|
module T
|
|
6
|
-
extend Tool
|
|
7
|
-
|
|
8
6
|
SUPPORTED_STEPS = %i[id label].freeze
|
|
9
7
|
|
|
10
|
-
|
|
8
|
+
class << self
|
|
9
|
+
extend Expression
|
|
10
|
+
|
|
11
|
+
define_steps(SUPPORTED_STEPS, "T")
|
|
12
|
+
end
|
|
11
13
|
end
|
|
12
14
|
end
|
|
13
15
|
end
|
|
@@ -4,8 +4,8 @@ module Grumlin
|
|
|
4
4
|
module Expressions
|
|
5
5
|
module U
|
|
6
6
|
# TODO: add other start steps
|
|
7
|
-
SUPPORTED_STEPS = %i[V addV count drop fold has hasLabel id in inE inV label out outE
|
|
8
|
-
timeLimit unfold valueMap values].freeze
|
|
7
|
+
SUPPORTED_STEPS = %i[V addV coalesce constant count drop fold has hasLabel hasNot id in inE inV is label out outE
|
|
8
|
+
outV project repeat select timeLimit unfold valueMap values].freeze
|
|
9
9
|
|
|
10
10
|
class << self
|
|
11
11
|
SUPPORTED_STEPS.each do |step|
|
data/lib/grumlin/path.rb
CHANGED
|
@@ -22,14 +22,18 @@ module Grumlin
|
|
|
22
22
|
498 => ClientSideError
|
|
23
23
|
}.freeze
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
class DispatcherError < Grumlin::Error; end
|
|
26
|
+
|
|
27
|
+
class RequestAlreadyAddedError < DispatcherError; end
|
|
28
|
+
|
|
29
|
+
class UnknownRequestError < DispatcherError; end
|
|
26
30
|
|
|
27
31
|
def initialize
|
|
28
32
|
@requests = {}
|
|
29
33
|
end
|
|
30
34
|
|
|
31
35
|
def add_request(request)
|
|
32
|
-
raise
|
|
36
|
+
raise RequestAlreadyAddedError if @requests.key?(request[:requestId])
|
|
33
37
|
|
|
34
38
|
Async::Channel.new.tap do |channel|
|
|
35
39
|
@requests[request[:requestId]] = { request: request, result: [], channel: channel }
|
|
@@ -40,7 +44,7 @@ module Grumlin
|
|
|
40
44
|
# TODO: sometimes response does not include requestID, no idea how to handle it so far.
|
|
41
45
|
def add_response(response) # rubocop:disable Metrics/AbcSize
|
|
42
46
|
request_id = response[:requestId]
|
|
43
|
-
raise
|
|
47
|
+
raise UnknownRequestError unless ongoing_request?(request_id)
|
|
44
48
|
|
|
45
49
|
request = @requests[request_id]
|
|
46
50
|
|
|
@@ -61,7 +65,7 @@ module Grumlin
|
|
|
61
65
|
end
|
|
62
66
|
|
|
63
67
|
def close_request(request_id)
|
|
64
|
-
raise
|
|
68
|
+
raise UnknownRequestError unless ongoing_request?(request_id)
|
|
65
69
|
|
|
66
70
|
request = @requests.delete(request_id)
|
|
67
71
|
request[:channel].close
|
|
@@ -43,7 +43,9 @@ module Grumlin
|
|
|
43
43
|
private
|
|
44
44
|
|
|
45
45
|
def wrap_result(result)
|
|
46
|
-
|
|
46
|
+
if result.is_a?(AnonymousStep) || result.is_a?(Traversal)
|
|
47
|
+
return self.class.new(result, @shortcuts, parent: @parent)
|
|
48
|
+
end
|
|
47
49
|
|
|
48
50
|
result
|
|
49
51
|
end
|
data/lib/grumlin/shortcuts.rb
CHANGED
|
@@ -23,7 +23,7 @@ module Grumlin
|
|
|
23
23
|
# TODO: blocklist of names to avoid conflicts with standard methods?
|
|
24
24
|
raise ArgumentError, "cannot use names of standard gremlin steps" if Grumlin.supported_steps.include?(name)
|
|
25
25
|
|
|
26
|
-
raise ArgumentError, "shortcut '#{name}' already exists" if shortcuts.key?(name)
|
|
26
|
+
raise ArgumentError, "shortcut '#{name}' already exists" if shortcuts.key?(name) && shortcuts[name] != block
|
|
27
27
|
|
|
28
28
|
shortcuts[name] = block
|
|
29
29
|
end
|
data/lib/grumlin/transport.rb
CHANGED
|
@@ -23,7 +23,7 @@ module Grumlin
|
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
def connect
|
|
26
|
-
raise
|
|
26
|
+
raise ClientClosedError if @closed
|
|
27
27
|
raise AlreadyConnectedError if connected?
|
|
28
28
|
|
|
29
29
|
@connection = Async::WebSocket::Client.connect(Async::HTTP::Endpoint.parse(@url), **@client_options)
|
data/lib/grumlin/traversal.rb
CHANGED
|
@@ -5,7 +5,7 @@ module Grumlin
|
|
|
5
5
|
# TODO: add other start steps
|
|
6
6
|
SUPPORTED_STEPS = %i[E V addE addV].freeze
|
|
7
7
|
|
|
8
|
-
CONFIGURATION_STEPS = %i[withSideEffect].freeze
|
|
8
|
+
CONFIGURATION_STEPS = %i[withSack withSideEffect].freeze
|
|
9
9
|
|
|
10
10
|
attr_reader :configuration_steps
|
|
11
11
|
|
|
@@ -14,7 +14,13 @@ module Grumlin
|
|
|
14
14
|
@configuration_steps = configuration_steps
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
def inspect
|
|
18
|
+
"#<#{self.class}>"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def to_s
|
|
22
|
+
inspect
|
|
23
|
+
end
|
|
18
24
|
|
|
19
25
|
CONFIGURATION_STEPS.each do |step|
|
|
20
26
|
define_method step do |*args, **params|
|
data/lib/grumlin/typed_value.rb
CHANGED
data/lib/grumlin/version.rb
CHANGED
data/lib/grumlin/vertex.rb
CHANGED
data/lib/grumlin.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: grumlin
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.14.
|
|
4
|
+
version: 0.14.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Gleb Sinyavskiy
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-12-
|
|
11
|
+
date: 2021-12-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: async-pool
|
|
@@ -101,12 +101,13 @@ files:
|
|
|
101
101
|
- lib/grumlin/bytecode.rb
|
|
102
102
|
- lib/grumlin/client.rb
|
|
103
103
|
- lib/grumlin/edge.rb
|
|
104
|
+
- lib/grumlin/expressions/expression.rb
|
|
105
|
+
- lib/grumlin/expressions/operator.rb
|
|
104
106
|
- lib/grumlin/expressions/order.rb
|
|
105
107
|
- lib/grumlin/expressions/p.rb
|
|
106
108
|
- lib/grumlin/expressions/pop.rb
|
|
107
109
|
- lib/grumlin/expressions/scope.rb
|
|
108
110
|
- lib/grumlin/expressions/t.rb
|
|
109
|
-
- lib/grumlin/expressions/tool.rb
|
|
110
111
|
- lib/grumlin/expressions/u.rb
|
|
111
112
|
- lib/grumlin/expressions/with_options.rb
|
|
112
113
|
- lib/grumlin/path.rb
|
|
@@ -130,9 +131,7 @@ homepage: https://github.com/zhulik/grumlin
|
|
|
130
131
|
licenses:
|
|
131
132
|
- MIT
|
|
132
133
|
metadata:
|
|
133
|
-
|
|
134
|
-
source_code_uri: https://github.com/zhulik/grumlin
|
|
135
|
-
changelog_uri: https://github.com/zhulik/grumlin/blob/master/CHANGELOG.md
|
|
134
|
+
rubygems_mfa_required: 'true'
|
|
136
135
|
post_install_message:
|
|
137
136
|
rdoc_options: []
|
|
138
137
|
require_paths:
|