grumlin 0.23.0 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +9 -9
  3. data/Gemfile.lock +1 -1
  4. data/README.md +94 -141
  5. data/Rakefile +1 -1
  6. data/bin/console +18 -3
  7. data/doc/middlewares.md +49 -10
  8. data/lib/async/channel.rb +54 -56
  9. data/lib/grumlin/benchmark/repository.rb +10 -14
  10. data/lib/grumlin/client.rb +93 -95
  11. data/lib/grumlin/config.rb +33 -33
  12. data/lib/grumlin/dummy_transaction.rb +13 -15
  13. data/lib/grumlin/edge.rb +18 -20
  14. data/lib/grumlin/expressions/cardinality.rb +5 -9
  15. data/lib/grumlin/expressions/column.rb +5 -9
  16. data/lib/grumlin/expressions/expression.rb +7 -11
  17. data/lib/grumlin/expressions/operator.rb +5 -9
  18. data/lib/grumlin/expressions/order.rb +5 -9
  19. data/lib/grumlin/expressions/p.rb +27 -31
  20. data/lib/grumlin/expressions/pop.rb +5 -9
  21. data/lib/grumlin/expressions/scope.rb +5 -9
  22. data/lib/grumlin/expressions/t.rb +5 -9
  23. data/lib/grumlin/expressions/text_p.rb +5 -9
  24. data/lib/grumlin/expressions/with_options.rb +17 -21
  25. data/lib/grumlin/features/feature_list.rb +8 -12
  26. data/lib/grumlin/features/neptune_features.rb +5 -9
  27. data/lib/grumlin/features/tinkergraph_features.rb +5 -9
  28. data/lib/grumlin/features.rb +8 -10
  29. data/lib/grumlin/middlewares/apply_shortcuts.rb +4 -8
  30. data/lib/grumlin/middlewares/build_query.rb +16 -20
  31. data/lib/grumlin/middlewares/builder.rb +15 -0
  32. data/lib/grumlin/middlewares/cast_results.rb +3 -7
  33. data/lib/grumlin/middlewares/find_blocklisted_steps.rb +14 -0
  34. data/lib/grumlin/middlewares/find_mutating_steps.rb +9 -0
  35. data/lib/grumlin/middlewares/middleware.rb +6 -10
  36. data/lib/grumlin/middlewares/run_query.rb +3 -7
  37. data/lib/grumlin/middlewares/serialize_to_bytecode.rb +5 -9
  38. data/lib/grumlin/middlewares/serialize_to_steps.rb +4 -8
  39. data/lib/grumlin/path.rb +11 -13
  40. data/lib/grumlin/property.rb +14 -16
  41. data/lib/grumlin/query_validators/blocklisted_steps_validator.rb +22 -0
  42. data/lib/grumlin/query_validators/validator.rb +36 -0
  43. data/lib/grumlin/repository/error_handling_strategy.rb +36 -40
  44. data/lib/grumlin/repository/instance_methods.rb +115 -118
  45. data/lib/grumlin/repository.rb +82 -58
  46. data/lib/grumlin/request_dispatcher.rb +55 -57
  47. data/lib/grumlin/request_error_factory.rb +53 -55
  48. data/lib/grumlin/shortcut.rb +19 -21
  49. data/lib/grumlin/shortcuts/properties.rb +12 -16
  50. data/lib/grumlin/shortcuts/storage.rb +67 -74
  51. data/lib/grumlin/shortcuts/upserts.rb +18 -22
  52. data/lib/grumlin/shortcuts.rb +23 -25
  53. data/lib/grumlin/shortcuts_applyer.rb +27 -29
  54. data/lib/grumlin/step.rb +88 -90
  55. data/lib/grumlin/step_data.rb +12 -14
  56. data/lib/grumlin/steppable.rb +23 -25
  57. data/lib/grumlin/steps.rb +52 -54
  58. data/lib/grumlin/steps_serializers/bytecode.rb +53 -56
  59. data/lib/grumlin/steps_serializers/human_readable_bytecode.rb +17 -21
  60. data/lib/grumlin/steps_serializers/serializer.rb +7 -11
  61. data/lib/grumlin/steps_serializers/string.rb +26 -30
  62. data/lib/grumlin/test/rspec/db_cleaner_context.rb +8 -12
  63. data/lib/grumlin/test/rspec/gremlin_context.rb +18 -16
  64. data/lib/grumlin/test/rspec.rb +1 -5
  65. data/lib/grumlin/transaction.rb +34 -36
  66. data/lib/grumlin/transport.rb +71 -73
  67. data/lib/grumlin/traversal_start.rb +31 -33
  68. data/lib/grumlin/traversal_strategies/options_strategy.rb +3 -7
  69. data/lib/grumlin/traverser.rb +5 -7
  70. data/lib/grumlin/typed_value.rb +11 -13
  71. data/lib/grumlin/typing.rb +70 -72
  72. data/lib/grumlin/version.rb +1 -1
  73. data/lib/grumlin/vertex.rb +14 -16
  74. data/lib/grumlin/vertex_property.rb +14 -16
  75. data/lib/grumlin/with_extension.rb +17 -19
  76. metadata +9 -6
  77. data/lib/grumlin/middlewares/frozen_builder.rb +0 -18
  78. data/lib/grumlin/sugar.rb +0 -15
data/lib/grumlin/step.rb CHANGED
@@ -1,94 +1,92 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Grumlin
4
- class Step < Steppable
5
- attr_reader :name, :args, :params, :next_step, :configuration_steps, :previous_step, :shortcut
6
-
7
- # TODO: replace pool, session_id and middlewares with a context?
8
- def initialize(name, args: [], params: {}, previous_step: nil, pool: nil, session_id: nil, # rubocop:disable Metrics/ParameterLists
9
- middlewares: Grumlin.default_middlewares)
10
- super(pool: pool, session_id: session_id, middlewares: middlewares)
11
-
12
- @name = name.to_sym
13
- @args = args # TODO: add recursive validation: only json types or Step
14
- @params = params # TODO: add recursive validation: only json types
15
- @previous_step = previous_step
16
- @shortcut = shortcuts[@name]
17
- end
18
-
19
- def configuration_step?
20
- CONFIGURATION_STEPS.include?(@name) || name.to_sym == :tx
21
- end
22
-
23
- def start_step?
24
- START_STEPS.include?(@name)
25
- end
26
-
27
- def regular_step?
28
- REGULAR_STEPS.include?(@name)
29
- end
30
-
31
- def supported_step?
32
- ALL_STEPS.include?(@name)
33
- end
34
-
35
- def ==(other)
36
- self.class == other.class &&
37
- @name == other.name &&
38
- @args == other.args &&
39
- @params == other.params &&
40
- @previous_step == other.previous_step &&
41
- shortcuts == other.shortcuts
42
- end
43
-
44
- def steps
45
- @steps ||= Steps.from(self)
46
- end
47
-
48
- def to_s(**params)
49
- StepsSerializers::String.new(steps, **params).serialize
50
- end
51
-
52
- # TODO: add human readable mode
53
- def inspect
54
- conf_steps, regular_steps = StepsSerializers::HumanReadableBytecode.new(steps).serialize
55
- "#{conf_steps.any? ? conf_steps : nil}#{regular_steps}"
56
- end
57
-
58
- def bytecode(no_return: false)
59
- StepsSerializers::Bytecode.new(steps, no_return: no_return)
60
- end
61
-
62
- def next
63
- to_enum.next
64
- end
65
-
66
- def hasNext # rubocop:disable Naming/MethodName
67
- to_enum.peek
68
- true
69
- rescue StopIteration
70
- false
71
- end
72
-
73
- def to_enum
74
- @to_enum ||= toList.to_enum
75
- end
76
-
77
- def toList
78
- send_query(need_results: true)
79
- end
80
-
81
- def iterate
82
- send_query(need_results: false)
83
- end
84
-
85
- private
86
-
87
- def send_query(need_results:)
88
- @middlewares.call(traversal: self,
89
- need_results: need_results,
90
- session_id: @session_id,
91
- pool: @pool)
92
- end
3
+ class Grumlin::Step < Grumlin::Steppable
4
+ attr_reader :name, :args, :params, :next_step, :configuration_steps, :previous_step, :shortcut
5
+
6
+ # TODO: replace pool, session_id and middlewares with a context?
7
+ def initialize(name, args: [], params: {}, previous_step: nil, pool: nil, session_id: nil, # rubocop:disable Metrics/ParameterLists
8
+ middlewares: Grumlin.default_middlewares)
9
+ super(pool: pool, session_id: session_id, middlewares: middlewares)
10
+
11
+ @name = name.to_sym
12
+ @args = args # TODO: add recursive validation: only json types or Step
13
+ @params = params # TODO: add recursive validation: only json types
14
+ @previous_step = previous_step
15
+ @shortcut = shortcuts[@name]
16
+ end
17
+
18
+ def configuration_step?
19
+ CONFIGURATION_STEPS.include?(@name) || name.to_sym == :tx
20
+ end
21
+
22
+ def start_step?
23
+ START_STEPS.include?(@name)
24
+ end
25
+
26
+ def regular_step?
27
+ REGULAR_STEPS.include?(@name)
28
+ end
29
+
30
+ def supported_step?
31
+ ALL_STEPS.include?(@name)
32
+ end
33
+
34
+ def ==(other)
35
+ self.class == other.class &&
36
+ @name == other.name &&
37
+ @args == other.args &&
38
+ @params == other.params &&
39
+ @previous_step == other.previous_step &&
40
+ shortcuts == other.shortcuts
41
+ end
42
+
43
+ def steps
44
+ @steps ||= Grumlin::Steps.from(self)
45
+ end
46
+
47
+ def to_s(**params)
48
+ Grumlin::StepsSerializers::String.new(steps, **params).serialize
49
+ end
50
+
51
+ # TODO: add human readable mode
52
+ def inspect
53
+ conf_steps, regular_steps = Grumlin::StepsSerializers::HumanReadableBytecode.new(steps).serialize
54
+ "#{conf_steps.any? ? conf_steps : nil}#{regular_steps}"
55
+ end
56
+
57
+ def bytecode(no_return: false)
58
+ Grumlin::StepsSerializers::Bytecode.new(steps, no_return: no_return)
59
+ end
60
+
61
+ def next
62
+ to_enum.next
63
+ end
64
+
65
+ def hasNext # rubocop:disable Naming/MethodName
66
+ to_enum.peek
67
+ true
68
+ rescue StopIteration
69
+ false
70
+ end
71
+
72
+ def to_enum
73
+ @to_enum ||= toList.to_enum
74
+ end
75
+
76
+ def toList
77
+ send_query(need_results: true)
78
+ end
79
+
80
+ def iterate
81
+ send_query(need_results: false)
82
+ end
83
+
84
+ private
85
+
86
+ def send_query(need_results:)
87
+ @middlewares.call(traversal: self,
88
+ need_results: need_results,
89
+ session_id: @session_id,
90
+ pool: @pool)
93
91
  end
94
92
  end
@@ -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,40 +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: nil, session_id: nil, middlewares: Grumlin.default_middlewares)
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
- @middlewares = middlewares
18
+ @middlewares = middlewares
20
19
 
21
- return if respond_to?(:shortcuts)
20
+ return if respond_to?(:shortcuts)
22
21
 
23
- raise "steppable must not be initialized directly, use Grumlin::Shortcuts::Storage#g or #__ instead"
24
- end
25
-
26
- ALL_STEPS.each do |step|
27
- define_method step do |*args, **params|
28
- shortcuts.step_class.new(step, args: args, params: params, previous_step: self,
29
- session_id: @session_id, pool: @pool, middlewares: @middlewares)
30
- end
31
- end
22
+ raise "steppable must not be initialized directly, use Grumlin::Shortcuts::Storage#g or #__ instead"
23
+ end
32
24
 
33
- def step(name, *args, **params)
34
- shortcuts.step_class.new(name, args: args, params: params, previous_step: self,
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,
35
28
  session_id: @session_id, pool: @pool, middlewares: @middlewares)
36
29
  end
30
+ end
37
31
 
38
- 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)
39
35
  end
36
+
37
+ def_delegator :shortcuts, :__
40
38
  end
data/lib/grumlin/steps.rb CHANGED
@@ -1,78 +1,76 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Grumlin
4
- class Steps
5
- CONFIGURATION_STEPS = Step::CONFIGURATION_STEPS
6
- ALL_STEPS = Step::ALL_STEPS
7
-
8
- def self.from(step)
9
- raise ArgumentError, "expected: #{Step}, given: #{step.class}" unless step.is_a?(Step)
10
-
11
- new(step.shortcuts).tap do |chain|
12
- until step.nil? || step.is_a?(TraversalStart)
13
- chain.add(step.name, args: step.args, params: step.params, to: :begin)
14
- step = step.previous_step
15
- end
16
- end
17
- end
3
+ class Grumlin::Steps
4
+ CONFIGURATION_STEPS = Grumlin::Step::CONFIGURATION_STEPS
5
+ ALL_STEPS = Grumlin::Step::ALL_STEPS
18
6
 
19
- attr_reader :configuration_steps, :steps, :shortcuts
7
+ def self.from(step)
8
+ raise ArgumentError, "expected: #{Grumlin::Step}, given: #{step.class}" unless step.is_a?(Grumlin::Step)
20
9
 
21
- def initialize(shortcuts, configuration_steps: [], steps: [])
22
- @shortcuts = shortcuts
23
- @configuration_steps = configuration_steps
24
- @steps = steps
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
14
+ end
25
15
  end
16
+ end
26
17
 
27
- def add(name, args: [], params: {}, to: :end)
28
- if CONFIGURATION_STEPS.include?(name) || name.to_sym == :tx
29
- return add_configuration_step(name, args: args, params: params, to: to)
30
- end
18
+ attr_reader :configuration_steps, :steps, :shortcuts
31
19
 
32
- StepData.new(name, args: cast_arguments(args), params: params).tap do |step|
33
- next @steps << step if to == :end
34
- next @steps.unshift(step) if to == :begin
20
+ def initialize(shortcuts, configuration_steps: [], steps: [])
21
+ @shortcuts = shortcuts
22
+ @configuration_steps = configuration_steps
23
+ @steps = steps
24
+ end
35
25
 
36
- raise ArgumentError, "'to:' must be either :begin or :end, given: '#{to}'"
37
- end
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)
38
29
  end
39
30
 
40
- def uses_shortcuts?
41
- shortcuts?(@configuration_steps) || shortcuts?(@steps)
42
- 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
43
34
 
44
- def ==(other)
45
- self.class == other.class &&
46
- @shortcuts == other.shortcuts &&
47
- @configuration_steps == other.configuration_steps &&
48
- @steps == other.steps
35
+ raise ArgumentError, "'to:' must be either :begin or :end, given: '#{to}'"
49
36
  end
37
+ end
50
38
 
51
- # TODO: add #bytecode, to_s, inspect
39
+ def uses_shortcuts?
40
+ shortcuts?(@configuration_steps) || shortcuts?(@steps)
41
+ end
42
+
43
+ def ==(other)
44
+ self.class == other.class &&
45
+ @shortcuts == other.shortcuts &&
46
+ @configuration_steps == other.configuration_steps &&
47
+ @steps == other.steps
48
+ end
49
+
50
+ # TODO: add #bytecode, to_s, inspect
52
51
 
53
- private
52
+ private
54
53
 
55
- def shortcuts?(steps_ary)
56
- steps_ary.any? do |step|
57
- @shortcuts.known?(step.name) || step.args.any? do |arg|
58
- arg.is_a?(Steps) ? arg.uses_shortcuts? : false
59
- 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
60
58
  end
61
59
  end
60
+ end
62
61
 
63
- def add_configuration_step(name, args: [], params: {}, to: :end)
64
- raise ArgumentError, "cannot use configuration steps after start step was used" if @steps.any? && to == :end
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
65
64
 
66
- StepData.new(name, args: cast_arguments(args), params: params).tap do |step|
67
- next @configuration_steps << step if to == :end
68
- next @configuration_steps.unshift(step) if to == :begin
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
69
68
 
70
- raise ArgumentError, "to must be either :begin or :end, given: '#{to}'"
71
- end
69
+ raise ArgumentError, "to must be either :begin or :end, given: '#{to}'"
72
70
  end
71
+ end
73
72
 
74
- def cast_arguments(arguments)
75
- arguments.map { |arg| arg.is_a?(Step) ? Steps.from(arg) : arg }
76
- end
73
+ def cast_arguments(arguments)
74
+ arguments.map { |arg| arg.is_a?(Grumlin::Step) ? Grumlin::Steps.from(arg) : arg }
77
75
  end
78
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