grumlin 0.14.0 → 0.14.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e353294814ba425473eb717892ea994d686dd25eec4db78cd0c15102f68a7e53
4
- data.tar.gz: 672458be5666e00f34386e632a8a902e3271ad91160b1b2d4bd2235d3789abd9
3
+ metadata.gz: 02a213b95f80992accf37eecb32684369e2e8a1582d10be4014e5c59b8381ec3
4
+ data.tar.gz: ddf854b45f388d9a1c6e4a557e715c9d4363f2ae1c44503969e7d4c819537c1e
5
5
  SHA512:
6
- metadata.gz: cc64a8dacf4dc2384e0d3da380cb0b62f534e603e49f67f537f0c1e46feb549c8098d8580c1d9d96edf0f3b145b777ae26206025086e52ee86ca37e526d53f8a
7
- data.tar.gz: 4c2ae1909426dc7c89a41feecb2e7a917daa33f8adb7330229691fa7e49585b1b1e24fca7773026e998f7a738b701d8457e50fcaf8ca3c9e271a71b698ea26e6
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.0)
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.9)
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.20.1)
76
- parser (3.0.1.1)
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.1.1)
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.16.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.7.0, < 2.0)
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.7.0)
121
+ rubocop-ast (1.14.0)
122
122
  parser (>= 3.0.1.1)
123
- rubocop-performance (1.11.3)
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.3.0)
127
- rubocop (~> 1.0)
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.0.0)
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 as they are subject to change.
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
@@ -31,4 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_dependency "async-websocket", "~> 0.19"
32
32
  spec.add_dependency "oj", "~> 3.12"
33
33
  spec.add_dependency "zeitwerk", "~> 2.4"
34
+ spec.metadata = {
35
+ "rubygems_mfa_required" => "true"
36
+ }
34
37
  end
@@ -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 group
9
- groupCount has hasId hasLabel hasNot id in inE inV is label limit not or order out outE path
10
- project property range repeat select sideEffect skip tail to unfold union until valueMap
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
- alias to_s inspect
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)
@@ -25,7 +25,10 @@ module Grumlin
25
25
  end
26
26
  "#{configuration_steps.any? ? configuration_steps : nil}#{to_readable_bytecode}"
27
27
  end
28
- alias to_s inspect
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) }
@@ -51,7 +51,7 @@ module Grumlin
51
51
  end
52
52
 
53
53
  def connect
54
- raise "ClientClosed" if @closed
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
- alias to_s inspect
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
@@ -20,6 +20,9 @@ module Grumlin
20
20
  def inspect
21
21
  "e[#{@id}][#{@outV}-#{@label}->#{@inV}]"
22
22
  end
23
- alias to_s inspect
23
+
24
+ def to_s
25
+ inspect
26
+ end
24
27
  end
25
28
  end
@@ -2,10 +2,10 @@
2
2
 
3
3
  module Grumlin
4
4
  module Expressions
5
- module Tool
5
+ module Expression
6
6
  def define_steps(steps, tool_name)
7
7
  steps.each do |step|
8
- self.class.define_method step do
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
- define_steps(SUPPORTED_STEPS, "Order")
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
- define_steps(SUPPORTED_STEPS, "Pop")
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
- define_steps(SUPPORTED_STEPS, "Scope")
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
- define_steps(SUPPORTED_STEPS, "T")
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 outV project repeat
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
@@ -12,6 +12,9 @@ module Grumlin
12
12
  def inspect
13
13
  "p[#{@objects}]"
14
14
  end
15
- alias to_s inspect
15
+
16
+ def to_s
17
+ inspect
18
+ end
16
19
  end
17
20
  end
@@ -22,14 +22,18 @@ module Grumlin
22
22
  498 => ClientSideError
23
23
  }.freeze
24
24
 
25
- include Console
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 "ERROR" if @requests.key?(request[:requestId])
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 "ERROR" unless ongoing_request?(request_id)
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 "ERROR" unless ongoing_request?(request_id)
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
- return self.class.new(result, @shortcuts, parent: @parent) if result.is_a?(AnonymousStep)
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
@@ -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
@@ -23,7 +23,7 @@ module Grumlin
23
23
  end
24
24
 
25
25
  def connect
26
- raise "ClientClosed" if @closed
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)
@@ -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
- alias inspect to_s
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|
@@ -23,7 +23,13 @@ module Grumlin
23
23
  def inspect
24
24
  "<#{type}.#{value}>"
25
25
  end
26
- alias to_s inspect
27
- alias to_readable_bytecode inspect
26
+
27
+ def to_s
28
+ inspect
29
+ end
30
+
31
+ def to_readable_bytecode
32
+ inspect
33
+ end
28
34
  end
29
35
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Grumlin
4
- VERSION = "0.14.0"
4
+ VERSION = "0.14.4"
5
5
  end
@@ -16,6 +16,9 @@ module Grumlin
16
16
  def inspect
17
17
  "v[#{@id}]"
18
18
  end
19
- alias to_s inspect
19
+
20
+ def to_s
21
+ inspect
22
+ end
20
23
  end
21
24
  end
data/lib/grumlin.rb CHANGED
@@ -43,6 +43,8 @@ module Grumlin
43
43
 
44
44
  class AlreadyConnectedError < ConnectionStatusError; end
45
45
 
46
+ class ClientClosedError < ConnectionStatusError; end
47
+
46
48
  class ProtocolError < Error; end
47
49
 
48
50
  class UnknownResponseStatus < ProtocolError
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.0
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-08 00:00:00.000000000 Z
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
- homepage_uri: https://github.com/zhulik/grumlin
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: