grumlin 0.13.0 → 0.14.2

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: 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
  - - ">="