grumlin 0.22.4 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/.rubocop.yml +9 -9
  4. data/Gemfile.lock +10 -8
  5. data/README.md +102 -141
  6. data/Rakefile +1 -1
  7. data/bin/console +18 -3
  8. data/doc/middlewares.md +97 -0
  9. data/grumlin.gemspec +1 -0
  10. data/lib/async/channel.rb +54 -56
  11. data/lib/grumlin/benchmark/repository.rb +10 -14
  12. data/lib/grumlin/client.rb +92 -112
  13. data/lib/grumlin/config.rb +30 -15
  14. data/lib/grumlin/dummy_transaction.rb +13 -15
  15. data/lib/grumlin/edge.rb +18 -20
  16. data/lib/grumlin/expressions/cardinality.rb +5 -9
  17. data/lib/grumlin/expressions/column.rb +5 -9
  18. data/lib/grumlin/expressions/expression.rb +7 -11
  19. data/lib/grumlin/expressions/operator.rb +5 -9
  20. data/lib/grumlin/expressions/order.rb +5 -9
  21. data/lib/grumlin/expressions/p.rb +27 -31
  22. data/lib/grumlin/expressions/pop.rb +5 -9
  23. data/lib/grumlin/expressions/scope.rb +5 -9
  24. data/lib/grumlin/expressions/t.rb +5 -9
  25. data/lib/grumlin/expressions/text_p.rb +5 -9
  26. data/lib/grumlin/expressions/with_options.rb +17 -21
  27. data/lib/grumlin/features/feature_list.rb +8 -12
  28. data/lib/grumlin/features/neptune_features.rb +5 -9
  29. data/lib/grumlin/features/tinkergraph_features.rb +5 -9
  30. data/lib/grumlin/features.rb +8 -10
  31. data/lib/grumlin/middlewares/apply_shortcuts.rb +8 -0
  32. data/lib/grumlin/middlewares/build_query.rb +20 -0
  33. data/lib/grumlin/middlewares/builder.rb +15 -0
  34. data/lib/grumlin/middlewares/cast_results.rb +7 -0
  35. data/lib/grumlin/middlewares/find_blocklisted_steps.rb +14 -0
  36. data/lib/grumlin/middlewares/find_mutating_steps.rb +9 -0
  37. data/lib/grumlin/middlewares/middleware.rb +11 -0
  38. data/lib/grumlin/middlewares/run_query.rb +7 -0
  39. data/lib/grumlin/middlewares/serialize_to_bytecode.rb +9 -0
  40. data/lib/grumlin/middlewares/serialize_to_steps.rb +8 -0
  41. data/lib/grumlin/path.rb +11 -13
  42. data/lib/grumlin/property.rb +14 -16
  43. data/lib/grumlin/query_validators/blocklisted_steps_validator.rb +22 -0
  44. data/lib/grumlin/query_validators/validator.rb +36 -0
  45. data/lib/grumlin/repository/error_handling_strategy.rb +36 -40
  46. data/lib/grumlin/repository/instance_methods.rb +115 -118
  47. data/lib/grumlin/repository.rb +82 -58
  48. data/lib/grumlin/request_dispatcher.rb +55 -57
  49. data/lib/grumlin/request_error_factory.rb +53 -55
  50. data/lib/grumlin/shortcut.rb +19 -21
  51. data/lib/grumlin/shortcuts/properties.rb +12 -16
  52. data/lib/grumlin/shortcuts/storage.rb +67 -74
  53. data/lib/grumlin/shortcuts/upserts.rb +18 -22
  54. data/lib/grumlin/shortcuts.rb +23 -25
  55. data/lib/grumlin/shortcuts_applyer.rb +27 -29
  56. data/lib/grumlin/step.rb +92 -0
  57. data/lib/grumlin/step_data.rb +12 -14
  58. data/lib/grumlin/steppable.rb +24 -22
  59. data/lib/grumlin/steps.rb +51 -54
  60. data/lib/grumlin/steps_serializers/bytecode.rb +53 -56
  61. data/lib/grumlin/steps_serializers/human_readable_bytecode.rb +17 -21
  62. data/lib/grumlin/steps_serializers/serializer.rb +7 -11
  63. data/lib/grumlin/steps_serializers/string.rb +26 -30
  64. data/lib/grumlin/test/rspec/db_cleaner_context.rb +8 -12
  65. data/lib/grumlin/test/rspec/gremlin_context.rb +18 -16
  66. data/lib/grumlin/test/rspec.rb +1 -5
  67. data/lib/grumlin/transaction.rb +26 -27
  68. data/lib/grumlin/transport.rb +71 -73
  69. data/lib/grumlin/traversal_start.rb +31 -33
  70. data/lib/grumlin/traversal_strategies/options_strategy.rb +3 -7
  71. data/lib/grumlin/traverser.rb +5 -7
  72. data/lib/grumlin/typed_value.rb +11 -13
  73. data/lib/grumlin/typing.rb +70 -72
  74. data/lib/grumlin/version.rb +1 -1
  75. data/lib/grumlin/vertex.rb +14 -16
  76. data/lib/grumlin/vertex_property.rb +14 -16
  77. data/lib/grumlin/with_extension.rb +17 -19
  78. data/lib/grumlin.rb +23 -19
  79. metadata +32 -6
  80. data/lib/grumlin/action.rb +0 -92
  81. data/lib/grumlin/sugar.rb +0 -15
@@ -1,20 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Grumlin
4
- class StepData
5
- attr_reader :name, :args, :params
3
+ class Grumlin::StepData
4
+ attr_reader :name, :args, :params
6
5
 
7
- def initialize(name, args: [], params: {})
8
- @name = name
9
- @args = args
10
- @params = params
11
- end
6
+ def initialize(name, args: [], params: {})
7
+ @name = name
8
+ @args = args
9
+ @params = params
10
+ end
12
11
 
13
- def ==(other)
14
- self.class == other.class &&
15
- @name == other.name &&
16
- @args == other.args &&
17
- @params == other.params
18
- end
12
+ def ==(other)
13
+ self.class == other.class &&
14
+ @name == other.name &&
15
+ @args == other.args &&
16
+ @params == other.params
19
17
  end
20
18
  end
@@ -1,36 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Grumlin
4
- class Steppable
5
- extend Forwardable
3
+ class Grumlin::Steppable
4
+ extend Forwardable
6
5
 
7
- attr_reader :session_id
6
+ attr_reader :session_id
8
7
 
9
- START_STEPS = Grumlin.definitions.dig(:steps, :start).map(&:to_sym).freeze
10
- REGULAR_STEPS = Grumlin.definitions.dig(:steps, :regular).map(&:to_sym).freeze
11
- CONFIGURATION_STEPS = Grumlin.definitions.dig(:steps, :configuration).map(&:to_sym).freeze
8
+ START_STEPS = Grumlin.definitions.dig(:steps, :start).map(&:to_sym).freeze
9
+ REGULAR_STEPS = Grumlin.definitions.dig(:steps, :regular).map(&:to_sym).freeze
10
+ CONFIGURATION_STEPS = Grumlin.definitions.dig(:steps, :configuration).map(&:to_sym).freeze
12
11
 
13
- ALL_STEPS = START_STEPS + CONFIGURATION_STEPS + REGULAR_STEPS
12
+ ALL_STEPS = START_STEPS + CONFIGURATION_STEPS + REGULAR_STEPS
14
13
 
15
- def initialize(pool: Grumlin.default_pool, session_id: nil)
16
- @pool = pool
17
- @session_id = session_id
14
+ def initialize(pool: nil, session_id: nil, middlewares: Grumlin.default_middlewares)
15
+ @pool = pool
16
+ @session_id = session_id
18
17
 
19
- return if respond_to?(:shortcuts)
18
+ @middlewares = middlewares
20
19
 
21
- raise "steppable must not be initialized directly, use Grumlin::Shortcuts::Storage#g or #__ instead"
22
- end
20
+ return if respond_to?(:shortcuts)
23
21
 
24
- ALL_STEPS.each do |step|
25
- define_method step do |*args, **params|
26
- shortcuts.action_class.new(step, args: args, params: params, previous_step: self, session_id: @session_id)
27
- end
28
- end
22
+ raise "steppable must not be initialized directly, use Grumlin::Shortcuts::Storage#g or #__ instead"
23
+ end
29
24
 
30
- def step(name, *args, **params)
31
- shortcuts.action_class.new(name, args: args, params: params, previous_step: self, session_id: @session_id)
25
+ ALL_STEPS.each do |step|
26
+ define_method step do |*args, **params|
27
+ shortcuts.step_class.new(step, args: args, params: params, previous_step: self,
28
+ session_id: @session_id, pool: @pool, middlewares: @middlewares)
32
29
  end
30
+ end
33
31
 
34
- def_delegator :shortcuts, :__
32
+ def step(name, *args, **params)
33
+ shortcuts.step_class.new(name, args: args, params: params, previous_step: self,
34
+ session_id: @session_id, pool: @pool, middlewares: @middlewares)
35
35
  end
36
+
37
+ def_delegator :shortcuts, :__
36
38
  end
data/lib/grumlin/steps.rb CHANGED
@@ -1,79 +1,76 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Grumlin
4
- class Steps
5
- CONFIGURATION_STEPS = Action::CONFIGURATION_STEPS
6
- ALL_STEPS = Action::ALL_STEPS
3
+ class Grumlin::Steps
4
+ CONFIGURATION_STEPS = Grumlin::Step::CONFIGURATION_STEPS
5
+ ALL_STEPS = Grumlin::Step::ALL_STEPS
7
6
 
8
- def self.from(action)
9
- raise ArgumentError, "expected: #{Action}, given: #{action.class}" unless action.is_a?(Action)
7
+ def self.from(step)
8
+ raise ArgumentError, "expected: #{Grumlin::Step}, given: #{step.class}" unless step.is_a?(Grumlin::Step)
10
9
 
11
- shortcuts = action.shortcuts
12
- actions = []
13
-
14
- until action.nil? || action.is_a?(TraversalStart)
15
- actions.unshift(action)
16
- action = action.previous_step
17
- end
18
-
19
- new(shortcuts).tap do |chain|
20
- actions.each do |act|
21
- chain.add(act.name, args: act.args, params: act.params)
22
- end
10
+ new(step.shortcuts).tap do |chain|
11
+ until step.nil? || step.is_a?(Grumlin::TraversalStart)
12
+ chain.add(step.name, args: step.args, params: step.params, to: :begin)
13
+ step = step.previous_step
23
14
  end
24
15
  end
16
+ end
25
17
 
26
- attr_reader :configuration_steps, :steps, :shortcuts
18
+ attr_reader :configuration_steps, :steps, :shortcuts
27
19
 
28
- def initialize(shortcuts, configuration_steps: [], steps: [])
29
- @shortcuts = shortcuts
30
- @configuration_steps = configuration_steps
31
- @steps = steps
20
+ def initialize(shortcuts, configuration_steps: [], steps: [])
21
+ @shortcuts = shortcuts
22
+ @configuration_steps = configuration_steps
23
+ @steps = steps
24
+ end
25
+
26
+ def add(name, args: [], params: {}, to: :end)
27
+ if CONFIGURATION_STEPS.include?(name) || name.to_sym == :tx
28
+ return add_configuration_step(name, args: args, params: params, to: to)
32
29
  end
33
30
 
34
- def add(name, args: [], params: {})
35
- if CONFIGURATION_STEPS.include?(name) || name.to_sym == :tx
36
- return add_configuration_step(name, args: args, params: params)
37
- end
31
+ Grumlin::StepData.new(name, args: cast_arguments(args), params: params).tap do |step|
32
+ next @steps << step if to == :end
33
+ next @steps.unshift(step) if to == :begin
38
34
 
39
- StepData.new(name, args: cast_arguments(args), params: params).tap do |step|
40
- @steps << step
41
- end
35
+ raise ArgumentError, "'to:' must be either :begin or :end, given: '#{to}'"
42
36
  end
37
+ end
43
38
 
44
- def uses_shortcuts?
45
- shortcuts?(@configuration_steps) || shortcuts?(@steps)
46
- end
39
+ def uses_shortcuts?
40
+ shortcuts?(@configuration_steps) || shortcuts?(@steps)
41
+ end
47
42
 
48
- def ==(other)
49
- self.class == other.class &&
50
- @shortcuts == other.shortcuts &&
51
- @configuration_steps == other.configuration_steps &&
52
- @steps == other.steps
53
- end
43
+ def ==(other)
44
+ self.class == other.class &&
45
+ @shortcuts == other.shortcuts &&
46
+ @configuration_steps == other.configuration_steps &&
47
+ @steps == other.steps
48
+ end
54
49
 
55
- # TODO: add #bytecode, to_s, inspect
50
+ # TODO: add #bytecode, to_s, inspect
56
51
 
57
- private
52
+ private
58
53
 
59
- def shortcuts?(steps_ary)
60
- steps_ary.any? do |step|
61
- @shortcuts.known?(step.name) || step.args.any? do |arg|
62
- arg.is_a?(Steps) ? arg.uses_shortcuts? : false
63
- end
54
+ def shortcuts?(steps_ary)
55
+ steps_ary.any? do |step|
56
+ @shortcuts.known?(step.name) || step.args.any? do |arg|
57
+ arg.is_a?(Grumlin::Steps) ? arg.uses_shortcuts? : false
64
58
  end
65
59
  end
60
+ end
66
61
 
67
- def add_configuration_step(name, args: [], params: {})
68
- raise ArgumentError, "cannot use configuration steps after start step was used" unless @steps.empty?
62
+ def add_configuration_step(name, args: [], params: {}, to: :end)
63
+ raise ArgumentError, "cannot use configuration steps after start step was used" if @steps.any? && to == :end
69
64
 
70
- StepData.new(name, args: cast_arguments(args), params: params).tap do |step|
71
- @configuration_steps << step
72
- end
73
- end
65
+ Grumlin::StepData.new(name, args: cast_arguments(args), params: params).tap do |step|
66
+ next @configuration_steps << step if to == :end
67
+ next @configuration_steps.unshift(step) if to == :begin
74
68
 
75
- def cast_arguments(arguments)
76
- arguments.map { |arg| arg.is_a?(Action) ? Steps.from(arg) : arg }
69
+ raise ArgumentError, "to must be either :begin or :end, given: '#{to}'"
77
70
  end
78
71
  end
72
+
73
+ def cast_arguments(arguments)
74
+ arguments.map { |arg| arg.is_a?(Grumlin::Step) ? Grumlin::Steps.from(arg) : arg }
75
+ end
79
76
  end
@@ -1,72 +1,69 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Grumlin
4
- module StepsSerializers
5
- class Bytecode < Serializer
6
- # constructor params: no_return: true|false, default false
7
- # TODO: add pretty
3
+ class Grumlin::StepsSerializers::Bytecode < Grumlin::StepsSerializers::Serializer
4
+ # constructor params: no_return: true|false, default false
5
+ # TODO: add pretty
8
6
 
9
- NONE_STEP = StepData.new("none")
7
+ NONE_STEP = Grumlin::StepData.new("none")
10
8
 
11
- def serialize
12
- steps = ShortcutsApplyer.call(@steps)
13
- no_return = @params.fetch(:no_return, false)
14
- {}.tap do |result|
15
- result[:step] = serialize_steps(steps.steps + (no_return ? [NONE_STEP] : [])) if steps.steps.any?
16
- result[:source] = serialize_steps(steps.configuration_steps) if steps.configuration_steps.any?
17
- end
18
- end
9
+ def serialize
10
+ steps = Grumlin::ShortcutsApplyer.call(@steps)
11
+ no_return = @params.fetch(:no_return, false)
12
+ {}.tap do |result|
13
+ result[:step] = serialize_steps(steps.steps + (no_return ? [NONE_STEP] : [])) if steps.steps.any?
14
+ result[:source] = serialize_steps(steps.configuration_steps) if steps.configuration_steps.any?
15
+ end
16
+ end
19
17
 
20
- private
18
+ private
21
19
 
22
- def serialize_steps(steps)
23
- steps.map { |s| serialize_step(s) }
24
- end
20
+ def serialize_steps(steps)
21
+ steps.map { |s| serialize_step(s) }
22
+ end
25
23
 
26
- def serialize_step(step)
27
- [step.name].tap do |result|
28
- step.args.each do |arg|
29
- result << serialize_arg(arg)
30
- end
31
- result << step.params if step.params.any?
32
- end
24
+ def serialize_step(step)
25
+ [step.name].tap do |result|
26
+ step.args.each do |arg|
27
+ result << serialize_arg(arg)
33
28
  end
29
+ result << step.params if step.params.any?
30
+ end
31
+ end
34
32
 
35
- def serialize_arg(arg)
36
- return serialize_typed_value(arg) if arg.is_a?(TypedValue)
37
- return serialize_predicate(arg) if arg.is_a?(Expressions::P::Predicate)
38
- return arg.value if arg.is_a?(Expressions::WithOptions)
33
+ def serialize_arg(arg)
34
+ return serialize_typed_value(arg) if arg.is_a?(Grumlin::TypedValue)
35
+ return serialize_predicate(arg) if arg.is_a?(Grumlin::Expressions::P::Predicate)
36
+ return arg.value if arg.is_a?(Grumlin::Expressions::WithOptions)
39
37
 
40
- return arg unless arg.is_a?(Steps)
38
+ return arg unless arg.is_a?(Grumlin::Steps)
41
39
 
42
- { :@type => "g:Bytecode", :@value => Bytecode.new(arg, **@params.merge(no_return: false)).serialize }
43
- end
40
+ { :@type => "g:Bytecode",
41
+ :@value => Grumlin::StepsSerializers::Bytecode.new(arg, **@params.merge(no_return: false)).serialize }
42
+ end
44
43
 
45
- def serialize_typed_value(value)
46
- return value.value if value.type.nil?
44
+ def serialize_typed_value(value)
45
+ return value.value if value.type.nil?
47
46
 
48
- {
49
- "@type": "g:#{value.type}",
50
- "@value": value.value
51
- }
52
- end
47
+ {
48
+ "@type": "g:#{value.type}",
49
+ "@value": value.value
50
+ }
51
+ end
53
52
 
54
- def serialize_predicate(value)
55
- {
56
- "@type": "g:#{value.namespace}",
57
- "@value": {
58
- predicate: value.name,
59
- value: if value.type.nil?
60
- value.value
61
- else
62
- {
63
- "@type": "g:#{value.type}",
64
- "@value": value.value
65
- }
66
- end
67
- }
68
- }
69
- end
70
- end
53
+ def serialize_predicate(value)
54
+ {
55
+ "@type": "g:#{value.namespace}",
56
+ "@value": {
57
+ predicate: value.name,
58
+ value: if value.type.nil?
59
+ value.value
60
+ else
61
+ {
62
+ "@type": "g:#{value.type}",
63
+ "@value": value.value
64
+ }
65
+ end
66
+ }
67
+ }
71
68
  end
72
69
  end
@@ -1,30 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Grumlin
4
- module StepsSerializers
5
- class HumanReadableBytecode < Bytecode
6
- def serialize
7
- steps = ShortcutsApplyer.call(@steps)
8
- [steps.configuration_steps, steps.steps].map do |stps|
9
- stps.map { |s| serialize_step(s) }
10
- end
11
- end
3
+ class Grumlin::StepsSerializers::HumanReadableBytecode < Grumlin::StepsSerializers::Bytecode
4
+ def serialize
5
+ steps = Grumlin::ShortcutsApplyer.call(@steps)
6
+ [steps.configuration_steps, steps.steps].map do |stps|
7
+ stps.map { |s| serialize_step(s) }
8
+ end
9
+ end
12
10
 
13
- private
11
+ private
14
12
 
15
- def serialize_arg(arg)
16
- return arg.to_s if arg.is_a?(TypedValue)
17
- return serialize_predicate(arg) if arg.is_a?(Expressions::P::Predicate)
18
- return arg.value if arg.is_a?(Expressions::WithOptions)
13
+ def serialize_arg(arg)
14
+ return arg.to_s if arg.is_a?(Grumlin::TypedValue)
15
+ return serialize_predicate(arg) if arg.is_a?(Grumlin::Expressions::P::Predicate)
16
+ return arg.value if arg.is_a?(Grumlin::Expressions::WithOptions)
19
17
 
20
- return arg unless arg.is_a?(Steps)
18
+ return arg unless arg.is_a?(Grumlin::Steps)
21
19
 
22
- HumanReadableBytecode.new(arg, **@params.merge(no_return: false)).serialize[1]
23
- end
20
+ Grumlin::StepsSerializers::HumanReadableBytecode.new(arg, **@params.merge(no_return: false)).serialize[1]
21
+ end
24
22
 
25
- def serialize_predicate(arg)
26
- "#{arg.name}(#{arg.value})"
27
- end
28
- end
23
+ def serialize_predicate(arg)
24
+ "#{arg.name}(#{arg.value})"
29
25
  end
30
26
  end
@@ -1,16 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Grumlin
4
- module StepsSerializers
5
- class Serializer
6
- def initialize(steps, **params)
7
- @steps = steps
8
- @params = params
9
- end
3
+ class Grumlin::StepsSerializers::Serializer
4
+ def initialize(steps, **params)
5
+ @steps = steps
6
+ @params = params
7
+ end
10
8
 
11
- def serialize
12
- raise NotImplementedError
13
- end
14
- end
9
+ def serialize
10
+ raise NotImplementedError
15
11
  end
16
12
  end
@@ -1,43 +1,39 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Grumlin
4
- module StepsSerializers
5
- class String < Serializer
6
- # constructor params: apply_shortcuts: true|false, default: false
7
- # constructor params: anonymous: true|false, default: false
8
- # TODO: add pretty
3
+ class Grumlin::StepsSerializers::String < Grumlin::StepsSerializers::Serializer
4
+ # constructor params: apply_shortcuts: true|false, default: false
5
+ # constructor params: anonymous: true|false, default: false
6
+ # TODO: add pretty
9
7
 
10
- def serialize
11
- steps = @params[:apply_shortcuts] ? ShortcutsApplyer.call(@steps) : @steps
8
+ def serialize
9
+ steps = @params[:apply_shortcuts] ? Grumlin::ShortcutsApplyer.call(@steps) : @steps
12
10
 
13
- steps = [steps.configuration_steps, steps.steps].map do |stps|
14
- stps.map { |step| serialize_step(step) }
15
- end
11
+ steps = [steps.configuration_steps, steps.steps].map do |stps|
12
+ stps.map { |step| serialize_step(step) }
13
+ end
16
14
 
17
- "#{prefix}.#{(steps[0] + steps[1]).join(".")}"
18
- end
15
+ "#{prefix}.#{(steps[0] + steps[1]).join(".")}"
16
+ end
19
17
 
20
- private
18
+ private
21
19
 
22
- def serialize_step(step)
23
- "#{step.name}(#{(step.args + [step.params.any? ? step.params : nil].compact).map do |a|
24
- serialize_arg(a)
25
- end.join(", ")})"
26
- end
20
+ def serialize_step(step)
21
+ "#{step.name}(#{(step.args + [step.params.any? ? step.params : nil].compact).map do |a|
22
+ serialize_arg(a)
23
+ end.join(", ")})"
24
+ end
27
25
 
28
- def prefix
29
- @prefix ||= @params[:anonymous] ? "__" : "g"
30
- end
26
+ def prefix
27
+ @prefix ||= @params[:anonymous] ? "__" : "g"
28
+ end
31
29
 
32
- def serialize_arg(arg)
33
- return "\"#{arg}\"" if arg.is_a?(::String) || arg.is_a?(Symbol)
34
- return "#{arg.type}.#{arg.value}" if arg.is_a?(Grumlin::TypedValue)
35
- return arg.to_s if arg.is_a?(Grumlin::Expressions::WithOptions)
30
+ def serialize_arg(arg)
31
+ return "\"#{arg}\"" if arg.is_a?(::String) || arg.is_a?(Symbol)
32
+ return "#{arg.type}.#{arg.value}" if arg.is_a?(Grumlin::TypedValue)
33
+ return arg.to_s if arg.is_a?(Grumlin::Expressions::WithOptions)
36
34
 
37
- return arg unless arg.is_a?(Steps)
35
+ return arg unless arg.is_a?(Grumlin::Steps)
38
36
 
39
- StepsSerializers::String.new(arg, anonymous: true, **@params).serialize
40
- end
41
- end
37
+ Grumlin::StepsSerializers::String.new(arg, anonymous: true, **@params).serialize
42
38
  end
43
39
  end
@@ -1,19 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Grumlin
4
- module Test
5
- module RSpec
6
- module DBCleanerContext
7
- end
3
+ module Grumlin::Test::RSpec
4
+ module DBCleanerContext
5
+ end
8
6
 
9
- ::RSpec.shared_context DBCleanerContext do
10
- include DBCleanerContext
7
+ ::RSpec.shared_context DBCleanerContext do
8
+ include DBCleanerContext
11
9
 
12
- before do
13
- g.E.drop.iterate
14
- g.V.drop.iterate
15
- end
16
- end
10
+ before do
11
+ g.E.drop.iterate
12
+ g.V.drop.iterate
17
13
  end
18
14
  end
19
15
  end
@@ -1,25 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Grumlin
4
- module Test
5
- module RSpec
6
- module GremlinContext
7
- end
3
+ module Grumlin::Test::RSpec
4
+ module GremlinContext
5
+ end
8
6
 
9
- ::RSpec.shared_context GremlinContext do
10
- include GremlinContext
11
- include Grumlin::Sugar
7
+ ::RSpec.shared_context GremlinContext do
8
+ include GremlinContext
9
+ include Grumlin::Expressions
12
10
 
13
- before do
14
- Grumlin::Expressions.constants.each do |tool|
15
- stub_const(tool.to_s, Grumlin::Expressions.const_get(tool))
16
- end
17
- end
11
+ [:__, :g].each do |name|
12
+ define_method(name) do |cuts = Grumlin::Shortcuts::Storage.empty|
13
+ cuts.send(name)
14
+ end
15
+ end
18
16
 
19
- after do
20
- Grumlin.close
21
- end
17
+ before do
18
+ Grumlin::Expressions.constants.each do |tool|
19
+ stub_const(tool.to_s, Grumlin::Expressions.const_get(tool))
22
20
  end
23
21
  end
22
+
23
+ after do
24
+ Grumlin.close
25
+ end
24
26
  end
25
27
  end
@@ -3,9 +3,5 @@
3
3
  require "grumlin/test/rspec/db_cleaner_context"
4
4
  require "grumlin/test/rspec/gremlin_context"
5
5
 
6
- module Grumlin
7
- module Test
8
- module RSpec
9
- end
10
- end
6
+ module Grumlin::Test::RSpec
11
7
  end
@@ -1,39 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Grumlin
4
- class Transaction
5
- attr_reader :session_id
3
+ class Grumlin::Transaction
4
+ attr_reader :session_id
6
5
 
7
- include Console
6
+ include Console
8
7
 
9
- COMMIT = Grumlin::Repository.new.g.step(:tx, :commit).bytecode
10
- ROLLBACK = Grumlin::Repository.new.g.step(:tx, :rollback).bytecode
8
+ COMMIT = Grumlin::Repository.new.g.step(:tx, :commit)
9
+ ROLLBACK = Grumlin::Repository.new.g.step(:tx, :rollback)
11
10
 
12
- def initialize(traversal_start_class, pool: Grumlin.default_pool)
13
- @traversal_start_class = traversal_start_class
14
- @pool = pool
15
-
16
- @session_id = SecureRandom.uuid
17
- end
11
+ def initialize(traversal_start_class, pool:, middlewares:)
12
+ @traversal_start_class = traversal_start_class
13
+ @pool = pool
14
+ @session_id = SecureRandom.uuid
15
+ @middlewares = middlewares
16
+ end
18
17
 
19
- def begin
20
- @traversal_start_class.new(session_id: @session_id)
21
- end
18
+ def begin
19
+ @traversal_start_class.new(session_id: @session_id)
20
+ end
22
21
 
23
- def commit
24
- finalize(COMMIT)
25
- end
22
+ def commit
23
+ finalize(COMMIT)
24
+ end
26
25
 
27
- def rollback
28
- finalize(ROLLBACK)
29
- end
26
+ def rollback
27
+ finalize(ROLLBACK)
28
+ end
30
29
 
31
- private
30
+ private
32
31
 
33
- def finalize(action)
34
- @pool.acquire do |client|
35
- client.write(action, session_id: @session_id)
36
- end
37
- end
32
+ def finalize(step)
33
+ @middlewares.call(traversal: step,
34
+ need_results: false,
35
+ session_id: @session_id,
36
+ pool: @pool)
38
37
  end
39
38
  end