grumlin 0.10.1 → 0.11.0

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: 2306eba516eebd5d53ac7e8e77acd5d7b2fcb7ad3579e9abc734210aec20ce29
4
- data.tar.gz: ebd72733ea3f6ac4554044a00aac252f6a14997664a7b95ebdba01d082e4c8cd
3
+ metadata.gz: 0f0edafd4d46b787eb3f8e0ec4032948bdb4de865e4de3199606fb470dc16ef3
4
+ data.tar.gz: f23ba59dfb18dabe70fc860c38ea4c1777214b4a37e04771b24210d90f449612
5
5
  SHA512:
6
- metadata.gz: bda5181c00cabc8d69fdaa891a81943527dabfaa69ce70babbba6c1f11efc83b6f942d23d6aaf792d580f842ca7f64971986def6e1cfc1e6d4d3626da05efa1b
7
- data.tar.gz: 212fbac76d50dfe281e574604ffbb82e8008937d777c279575a05468ee0f063faa6f0a8fa1417e8ea40e96f72b1b9f1f61c9e881e7c9b800d25964ce3ad7932a
6
+ metadata.gz: 4629a25995953c6617a45721d7082baee59b76425636f6a4536308220bae3e7cb72b571317102339b1888c0e430dbe73320c12f44518940f45c67db829a9a265
7
+ data.tar.gz: fae1a56f95150f82da47a886da5e4b4a7ab0f725f66e68af61f6456c9a2f1af2cefc580ebf793cba612f0ceeda0b782361476a38511019062cc1534ad98fdb3c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- grumlin (0.10.1)
4
+ grumlin (0.11.0)
5
5
  async-pool (~> 0.3)
6
6
  async-websocket (~> 0.19)
7
7
  oj (~> 3.12)
@@ -3,7 +3,7 @@
3
3
  module Grumlin
4
4
  # Incapsulates logic of converting step chains and step arguments to queries that can be sent to the server
5
5
  # and to human readable strings.
6
- class Bytecode
6
+ class Bytecode < TypedValue
7
7
  class NoneStep
8
8
  def to_bytecode
9
9
  ["none"]
@@ -13,6 +13,8 @@ module Grumlin
13
13
  NONE_STEP = NoneStep.new
14
14
 
15
15
  def initialize(step, no_return: false)
16
+ super(type: "Bytecode")
17
+
16
18
  @step = step
17
19
  @no_return = no_return
18
20
  end
@@ -22,27 +24,12 @@ module Grumlin
22
24
  end
23
25
  alias to_s inspect
24
26
 
25
- def to_query
26
- {
27
- requestId: SecureRandom.uuid,
28
- op: "bytecode",
29
- processor: "traversal",
30
- args: {
31
- gremlin: to_bytecode,
32
- aliases: { g: :g }
33
- }
34
- }
35
- end
36
-
37
27
  def to_readable_bytecode
38
28
  @to_readable_bytecode ||= steps.map { |s| serialize_arg(s, serialization_method: :to_readable_bytecode) }
39
29
  end
40
30
 
41
- def to_bytecode
42
- @to_bytecode ||= {
43
- "@type": "g:Bytecode",
44
- "@value": { step: (steps + (@no_return ? [NONE_STEP] : [])).map { |s| serialize_arg(s) } }
45
- }
31
+ def value
32
+ { step: (steps + (@no_return ? [NONE_STEP] : [])).map { |s| serialize_arg(s) } }
46
33
  end
47
34
 
48
35
  private
@@ -97,7 +97,7 @@ module Grumlin
97
97
  def write(bytecode)
98
98
  raise NotConnectedError unless connected?
99
99
 
100
- request = bytecode.to_query
100
+ request = to_query(bytecode.to_bytecode)
101
101
  channel = @request_dispatcher.add_request(request)
102
102
  @transport.write(request)
103
103
 
@@ -120,5 +120,17 @@ module Grumlin
120
120
  def build_transport
121
121
  Transport.new(@url, parent: @parent, **@client_options)
122
122
  end
123
+
124
+ def to_query(bytecode)
125
+ {
126
+ requestId: SecureRandom.uuid,
127
+ op: "bytecode",
128
+ processor: "traversal",
129
+ args: {
130
+ gremlin: bytecode,
131
+ aliases: { g: :g }
132
+ }
133
+ }
134
+ end
123
135
  end
124
136
  end
data/lib/grumlin/order.rb CHANGED
@@ -9,7 +9,7 @@ module Grumlin
9
9
  name = "@#{step}"
10
10
  return instance_variable_get(name) if instance_variable_defined?(name)
11
11
 
12
- instance_variable_set(name, TypedValue.new("Order", step))
12
+ instance_variable_set(name, TypedValue.new(type: "Order", value: step))
13
13
  end
14
14
  end
15
15
  end
data/lib/grumlin/p.rb CHANGED
@@ -3,12 +3,40 @@
3
3
  module Grumlin
4
4
  module P
5
5
  module P
6
- %w[within].each do |step|
7
- define_method step do |*args|
8
- { # TODO: replace with a TypedValue?
9
- "@type": "g:P",
10
- "@value": { predicate: "within", value: { "@type": "g:List", "@value": args } }
11
- }
6
+ class Predicate < TypedValue
7
+ def initialize(name, args:, arg_type: nil)
8
+ super(type: "P")
9
+ @name = name
10
+ @args = args
11
+ @arg_type = arg_type
12
+ end
13
+
14
+ def value
15
+ @value ||=
16
+ {
17
+ predicate: @name,
18
+ value: TypedValue.new(type: @arg_type, value: @args).to_bytecode
19
+ }
20
+ end
21
+ end
22
+
23
+ # TODO: support more predicates
24
+ %w[eq neq].each do |predicate|
25
+ define_method predicate do |*args|
26
+ Predicate.new(predicate, args: args[0])
27
+ end
28
+ end
29
+
30
+ %w[within without].each do |predicate|
31
+ define_method predicate do |*args|
32
+ args = if args.count == 1 && args[0].is_a?(Array)
33
+ args[0]
34
+ elsif args.count == 1 && args[0].is_a?(Set)
35
+ args[0].to_a
36
+ else
37
+ args.to_a
38
+ end
39
+ Predicate.new(predicate, args: args, arg_type: "List")
12
40
  end
13
41
  end
14
42
  end
data/lib/grumlin/pop.rb CHANGED
@@ -9,7 +9,7 @@ module Grumlin
9
9
  name = "@#{step}"
10
10
  return instance_variable_get(name) if instance_variable_defined?(name)
11
11
 
12
- instance_variable_set(name, TypedValue.new("Pop", step))
12
+ instance_variable_set(name, TypedValue.new(type: "Pop", value: step))
13
13
  end
14
14
  end
15
15
  end
data/lib/grumlin/t.rb CHANGED
@@ -9,7 +9,7 @@ module Grumlin
9
9
  name = "@#{step}"
10
10
  return instance_variable_get(name) if instance_variable_defined?(name)
11
11
 
12
- instance_variable_set(name, TypedValue.new("T", step))
12
+ instance_variable_set(name, TypedValue.new(type: "T", value: step))
13
13
  end
14
14
  end
15
15
  end
@@ -1,19 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Grumlin
4
- # TODO: find a better name
5
4
  class TypedValue
6
- def initialize(type, value)
5
+ attr_reader :type, :value
6
+
7
+ def initialize(type: nil, value: nil)
7
8
  @type = type
8
9
  @value = value
9
10
  end
10
11
 
11
12
  def to_bytecode
12
- @to_bytecode ||= { "@type": "g:#{@type}", "@value": @value }
13
+ @to_bytecode ||= if type.nil?
14
+ value
15
+ else
16
+ {
17
+ "@type": "g:#{type}",
18
+ "@value": value
19
+ }
20
+ end
13
21
  end
14
22
 
15
23
  def inspect
16
- "<#{@type}.#{@value}>"
24
+ "<#{type}.#{value}>"
17
25
  end
18
26
  alias to_s inspect
19
27
  alias to_readable_bytecode inspect
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Grumlin
4
- VERSION = "0.10.1"
4
+ VERSION = "0.11.0"
5
5
  end
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.10.1
4
+ version: 0.11.0
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-09-13 00:00:00.000000000 Z
11
+ date: 2021-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async-pool