grumlin 0.13.0 → 0.14.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 45c3b3317c8b96d763dd2de25de3744646994370dce29f2bc70f1b8c2725b119
4
- data.tar.gz: a8dce9eb4e0c9dc55383ed62d35a18e3a67fd63baf5d6f36cdf45196d36e49ef
3
+ metadata.gz: 2d54992de5df5f10f004557bc7a7d86ec5558c104663bf36904838e843d38b4d
4
+ data.tar.gz: e2e5cca5ad4cc034b991760db13c9a41d780609895ea38e236ef384bfa9df8f4
5
5
  SHA512:
6
- metadata.gz: cae50acbded8f08e2d48ecda7f002c4ec1312ae1b5aac09b803580061d06e0befe4c8480213f1702421c1580105fc599e61b0b67d929635e82d24f9a9f402fcc
7
- data.tar.gz: 8feb97c5edd5e9327fdfbf8bb6539028c09981a330917717e0eeeb3b40a74d1c00eb214cc2ce0b9669d341f4b32d8971a3f715130e77c1395bf2f27301aa04bc
6
+ metadata.gz: 9a1f23141609f072193fa4a624ae63263200daebb72b4f2c0759e738325409546365f962117d36dbb8baf1c6df5ebd9a60f5c53453f7827cfd8cc90d450afa0e
7
+ data.tar.gz: c6bd3b5f1f0b02173931f8189c0dca7fdcb5c11bfc6c4f8fdb34065a8d90a55ecb4118cf50f080c3c490ed1e2afda9035716fafc4679c6f606ad74ccc955d5f3
@@ -22,7 +22,7 @@ jobs:
22
22
  runs-on: ubuntu-latest
23
23
  strategy:
24
24
  matrix:
25
- ruby: [2.6, 2.7, 3.0]
25
+ ruby: [2.7, 3.0]
26
26
  steps:
27
27
  - uses: actions/checkout@v2
28
28
 
data/.rspec CHANGED
@@ -1,3 +1,2 @@
1
- --format documentation
2
1
  --color
3
2
  --require spec_helper
data/.rubocop.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.6
2
+ TargetRubyVersion: 2.7
3
3
  NewCops: enable
4
4
  SuggestExtensions: false
5
5
 
data/.tool-versions CHANGED
@@ -1 +1 @@
1
- ruby 2.6.6
1
+ ruby 2.7.5
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## [0.14.2] - 2021-12-12
2
+
3
+ - Better exceptions
4
+ - Add `choose` step
5
+ - Add `__.hasNot`, `__.is`, `__.select`
6
+
7
+ ## [0.14.0] - 2021-12-07
8
+
9
+ - Add initial support for [configuration steps](https://tinkerpop.apache.org/docs/current/reference/#configuration-steps)
10
+ - Add the `withSideEffect` configuration step
11
+ - Fix passing keyword arguments to regular steps
12
+ - *Drop support for ruby 2.6*
13
+
1
14
  ## [0.13.0] - 2021-12-03
2
15
 
3
16
  - Add `Shortcuts` and `Repository`
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- grumlin (0.13.0)
4
+ grumlin (0.14.2)
5
5
  async-pool (~> 0.3)
6
6
  async-websocket (~> 0.19)
7
7
  oj (~> 3.12)
@@ -60,16 +60,20 @@ GEM
60
60
  rexml
61
61
  kramdown-parser-gfm (1.1.0)
62
62
  kramdown (~> 2.0)
63
+ mini_portile2 (2.5.3)
63
64
  minitest (5.14.4)
64
65
  nio4r (2.5.8)
66
+ nokogiri (1.11.7)
67
+ mini_portile2 (~> 2.5.0)
68
+ racc (~> 1.4)
65
69
  nokogiri (1.11.7-x86_64-linux)
66
70
  racc (~> 1.4)
67
71
  oj (3.13.9)
68
72
  overcommit (0.57.0)
69
73
  childprocess (>= 0.6.3, < 5)
70
74
  iniparse (~> 1.4)
71
- parallel (1.20.1)
72
- parser (3.0.1.1)
75
+ parallel (1.21.0)
76
+ parser (3.0.3.2)
73
77
  ast (~> 2.4.1)
74
78
  protocol-hpack (1.4.2)
75
79
  protocol-http (0.22.5)
@@ -84,7 +88,7 @@ GEM
84
88
  racc (1.5.2)
85
89
  rainbow (3.0.0)
86
90
  rake (13.0.3)
87
- regexp_parser (2.1.1)
91
+ regexp_parser (2.2.0)
88
92
  reverse_markdown (2.0.0)
89
93
  nokogiri
90
94
  rexml (3.2.5)
@@ -105,23 +109,22 @@ GEM
105
109
  diff-lcs (>= 1.2.0, < 2.0)
106
110
  rspec-support (~> 3.10.0)
107
111
  rspec-support (3.10.2)
108
- rubocop (1.16.1)
112
+ rubocop (1.23.0)
109
113
  parallel (~> 1.10)
110
114
  parser (>= 3.0.0.0)
111
115
  rainbow (>= 2.2.2, < 4.0)
112
116
  regexp_parser (>= 1.8, < 3.0)
113
117
  rexml
114
- rubocop-ast (>= 1.7.0, < 2.0)
118
+ rubocop-ast (>= 1.12.0, < 2.0)
115
119
  ruby-progressbar (~> 1.7)
116
120
  unicode-display_width (>= 1.4.0, < 3.0)
117
- rubocop-ast (1.7.0)
121
+ rubocop-ast (1.14.0)
118
122
  parser (>= 3.0.1.1)
119
- rubocop-performance (1.11.3)
123
+ rubocop-performance (1.12.0)
120
124
  rubocop (>= 1.7.0, < 2.0)
121
125
  rubocop-ast (>= 0.4.0)
122
- rubocop-rspec (2.3.0)
123
- rubocop (~> 1.0)
124
- rubocop-ast (>= 1.1.0)
126
+ rubocop-rspec (2.6.0)
127
+ rubocop (~> 1.19)
125
128
  ruby-progressbar (1.11.0)
126
129
  simplecov (0.21.2)
127
130
  docile (~> 1.1)
@@ -149,11 +152,12 @@ GEM
149
152
  timers (4.3.3)
150
153
  tzinfo (2.0.4)
151
154
  concurrent-ruby (~> 1.0)
152
- unicode-display_width (2.0.0)
155
+ unicode-display_width (2.1.0)
153
156
  yard (0.9.26)
154
157
  zeitwerk (2.4.2)
155
158
 
156
159
  PLATFORMS
160
+ ruby
157
161
  x86_64-linux
158
162
 
159
163
  DEPENDENCIES
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
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
16
16
 
17
17
  spec.homepage = "https://github.com/zhulik/grumlin"
18
18
  spec.license = "MIT"
19
- spec.required_ruby_version = Gem::Requirement.new(">= 2.6.0")
19
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
20
20
 
21
21
  spec.metadata["homepage_uri"] = spec.homepage
22
22
  spec.metadata["source_code_uri"] = "https://github.com/zhulik/grumlin"
@@ -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
@@ -2,38 +2,46 @@
2
2
 
3
3
  module Grumlin
4
4
  class AnonymousStep
5
- attr_reader :name, :args, :previous_step
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
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 select sideEffect skip tail to unfold union until valueMap
11
11
  values where with].freeze
12
12
 
13
- def initialize(name, *args, previous_step: nil)
13
+ def initialize(name, *args, configuration_steps: [], previous_step: nil, **params)
14
14
  @name = name
15
15
  @previous_step = previous_step
16
16
  @args = args
17
+ @params = params
18
+ @configuration_steps = configuration_steps
17
19
  end
18
20
 
19
21
  SUPPORTED_STEPS.each do |step|
20
- define_method(step) do |*args|
21
- step(step, args)
22
+ define_method(step) do |*args, **params|
23
+ step(step, *args, **params)
22
24
  end
23
25
  end
24
26
 
25
- def step(name, args)
26
- self.class.new(name, *args, previous_step: self)
27
+ def step(name, *args, **params)
28
+ self.class.new(name, *args, previous_step: self, configuration_steps: configuration_steps, **params)
27
29
  end
28
30
 
29
31
  def inspect
30
32
  bytecode.inspect
31
33
  end
32
34
 
33
- alias to_s inspect
35
+ def to_s
36
+ inspect
37
+ end
34
38
 
35
39
  def bytecode(no_return: false)
36
40
  @bytecode ||= Bytecode.new(self, no_return: no_return)
37
41
  end
42
+
43
+ def args
44
+ [*@args, @params.any? ? arg.params : nil].compact
45
+ end
38
46
  end
39
47
  end
@@ -20,22 +20,30 @@ module Grumlin
20
20
  end
21
21
 
22
22
  def inspect
23
- to_readable_bytecode.to_s
23
+ configuration_steps = @step.configuration_steps.map do |s|
24
+ serialize_arg(s, serialization_method: :to_readable_bytecode)
25
+ end
26
+ "#{configuration_steps.any? ? configuration_steps : nil}#{to_readable_bytecode}"
27
+ end
28
+
29
+ def to_s
30
+ inspect
24
31
  end
25
- alias to_s inspect
26
32
 
27
33
  def to_readable_bytecode
28
34
  @to_readable_bytecode ||= steps.map { |s| serialize_arg(s, serialization_method: :to_readable_bytecode) }
29
35
  end
30
36
 
31
37
  def value
32
- { step: (steps + (@no_return ? [NONE_STEP] : [])).map { |s| serialize_arg(s) } }
38
+ @value ||= { step: (steps + (@no_return ? [NONE_STEP] : [])).map { |s| serialize_arg(s) } }.tap do |v|
39
+ v.merge!(source: @step.configuration_steps.map { |s| serialize_arg(s) }) if @step.configuration_steps.any?
40
+ end
33
41
  end
34
42
 
35
43
  private
36
44
 
37
45
  # Serializes step or a step argument to either an executable query or a human readable string representation
38
- # depending on the `serialization_method` parameter. I should be either `:to_readable_bytecode` for human readable
46
+ # depending on the `serialization_method` parameter. It should be either `:to_readable_bytecode` for human readable
39
47
  # representation or `:to_bytecode` for query.
40
48
  def serialize_arg(arg, serialization_method: :to_bytecode)
41
49
  return arg.public_send(serialization_method) if arg.respond_to?(serialization_method)
@@ -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
@@ -4,13 +4,13 @@ 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 count drop fold has hasLabel hasNot id in inE inV is label out outE outV project
8
+ repeat select timeLimit unfold valueMap values].freeze
9
9
 
10
10
  class << self
11
11
  SUPPORTED_STEPS.each do |step|
12
- define_method step do |*args|
13
- AnonymousStep.new(step, *args)
12
+ define_method step do |*args, **params|
13
+ AnonymousStep.new(step, *args, **params)
14
14
  end
15
15
  end
16
16
  end
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
@@ -13,12 +13,12 @@ module Grumlin
13
13
  @parent = parent
14
14
  end
15
15
 
16
- def method_missing(name, *args)
17
- return @parent.public_send(name, *args) if %i[__ g].include?(name) && !@parent.nil?
16
+ def method_missing(name, *args, **params)
17
+ return @parent.public_send(name, *args, **params) if %i[__ g].include?(name) && !@parent.nil?
18
18
 
19
- return wrap_result(@object.public_send(name, *args)) if @object.respond_to?(name)
19
+ return wrap_result(@object.public_send(name, *args, **params)) if @object.respond_to?(name)
20
20
 
21
- return wrap_result(instance_exec(*args, &@shortcuts[name])) if @shortcuts.key?(name)
21
+ return wrap_result(instance_exec(*args, **params, &@shortcuts[name])) if @shortcuts.key?(name)
22
22
 
23
23
  super
24
24
  end
@@ -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
@@ -5,13 +5,13 @@ module Grumlin
5
5
  module Properties
6
6
  extend Grumlin::Shortcuts
7
7
 
8
- shortcut :props do |props = {}|
8
+ shortcut :props do |*_args, **props|
9
9
  props.reduce(self) do |tt, (prop, value)|
10
10
  tt.property(prop, value)
11
11
  end
12
12
  end
13
13
 
14
- shortcut :hasAll do |props = {}|
14
+ shortcut :hasAll do |*, **props|
15
15
  props.reduce(self) do |tt, (prop, value)|
16
16
  tt.has(prop, value)
17
17
  end
@@ -10,6 +10,7 @@ module Grumlin
10
10
 
11
11
  def self.extended(base)
12
12
  base.include(InstanceMethods)
13
+ base.include(Grumlin::Expressions)
13
14
  end
14
15
 
15
16
  def inherited(subclass)
data/lib/grumlin/step.rb CHANGED
@@ -4,8 +4,8 @@ module Grumlin
4
4
  class Step < AnonymousStep
5
5
  attr_reader :client
6
6
 
7
- def initialize(pool, name, *args, previous_step: nil)
8
- super(name, *args, previous_step: previous_step)
7
+ def initialize(pool, name, *args, configuration_steps: [], previous_step: nil, **params)
8
+ super(name, *args, previous_step: previous_step, configuration_steps: configuration_steps, **params)
9
9
  @pool = pool
10
10
  end
11
11
 
@@ -36,8 +36,8 @@ module Grumlin
36
36
  end
37
37
  end
38
38
 
39
- def step(step_name, args)
40
- self.class.new(@pool, step_name, *args, previous_step: self)
39
+ def step(step_name, *args, **params)
40
+ self.class.new(@pool, step_name, *args, previous_step: self, configuration_steps: @configuration_steps, **params)
41
41
  end
42
42
  end
43
43
  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,13 +5,32 @@ module Grumlin
5
5
  # TODO: add other start steps
6
6
  SUPPORTED_STEPS = %i[E V addE addV].freeze
7
7
 
8
- def initialize(pool = Grumlin.default_pool)
8
+ CONFIGURATION_STEPS = %i[withSideEffect].freeze
9
+
10
+ attr_reader :configuration_steps
11
+
12
+ def initialize(pool = Grumlin.default_pool, configuration_steps: [])
9
13
  @pool = pool
14
+ @configuration_steps = configuration_steps
15
+ end
16
+
17
+ def inspect
18
+ "#<#{self.class}>"
19
+ end
20
+
21
+ def to_s
22
+ inspect
23
+ end
24
+
25
+ CONFIGURATION_STEPS.each do |step|
26
+ define_method step do |*args, **params|
27
+ self.class.new(@pool, configuration_steps: @configuration_steps + [AnonymousStep.new(step, *args, **params)])
28
+ end
10
29
  end
11
30
 
12
31
  SUPPORTED_STEPS.each do |step|
13
- define_method step do |*args|
14
- Step.new(@pool, step, *args)
32
+ define_method step do |*args, **params|
33
+ Step.new(@pool, step, *args, configuration_steps: @configuration_steps, **params)
15
34
  end
16
35
  end
17
36
  end
@@ -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.13.0"
4
+ VERSION = "0.14.2"
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.13.0
4
+ version: 0.14.2
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-05 00:00:00.000000000 Z
11
+ date: 2021-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async-pool
@@ -130,9 +130,7 @@ homepage: https://github.com/zhulik/grumlin
130
130
  licenses:
131
131
  - MIT
132
132
  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
133
+ rubygems_mfa_required: 'true'
136
134
  post_install_message:
137
135
  rdoc_options: []
138
136
  require_paths:
@@ -141,7 +139,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
141
139
  requirements:
142
140
  - - ">="
143
141
  - !ruby/object:Gem::Version
144
- version: 2.6.0
142
+ version: 2.7.0
145
143
  required_rubygems_version: !ruby/object:Gem::Requirement
146
144
  requirements:
147
145
  - - ">="