servactory 1.5.1 → 1.6.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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +87 -50
  3. data/config/locales/en.yml +5 -5
  4. data/lib/servactory/base.rb +4 -4
  5. data/lib/servactory/configuration/factory.rb +6 -6
  6. data/lib/servactory/configuration/setup.rb +6 -6
  7. data/lib/servactory/context/callable.rb +21 -22
  8. data/lib/servactory/context/configuration.rb +6 -6
  9. data/lib/servactory/context/workspace/inputs.rb +13 -0
  10. data/lib/servactory/context/workspace.rb +9 -7
  11. data/lib/servactory/errors/base.rb +2 -1
  12. data/lib/servactory/errors/collection.rb +25 -0
  13. data/lib/servactory/errors/failure.rb +11 -1
  14. data/lib/servactory/errors/input_error.rb +17 -0
  15. data/lib/servactory/errors/internal_error.rb +15 -0
  16. data/lib/servactory/errors/output_error.rb +15 -0
  17. data/lib/servactory/{input_arguments → inputs}/checks/base.rb +3 -3
  18. data/lib/servactory/{input_arguments → inputs}/checks/errors.rb +1 -1
  19. data/lib/servactory/{input_arguments → inputs}/checks/inclusion.rb +7 -4
  20. data/lib/servactory/{input_arguments → inputs}/checks/must.rb +3 -3
  21. data/lib/servactory/{input_arguments → inputs}/checks/required.rb +2 -2
  22. data/lib/servactory/{input_arguments → inputs}/checks/type.rb +3 -3
  23. data/lib/servactory/{input_arguments → inputs}/collection.rb +1 -1
  24. data/lib/servactory/{input_arguments → inputs}/define_input_conflict.rb +1 -1
  25. data/lib/servactory/{input_arguments → inputs}/define_input_method.rb +1 -1
  26. data/lib/servactory/inputs/dsl.rb +36 -0
  27. data/lib/servactory/{input_arguments/input_argument.rb → inputs/input.rb} +13 -12
  28. data/lib/servactory/{input_arguments → inputs}/option.rb +5 -3
  29. data/lib/servactory/{input_arguments → inputs}/options_collection.rb +1 -1
  30. data/lib/servactory/{input_arguments → inputs}/tools/check.rb +5 -5
  31. data/lib/servactory/{input_arguments → inputs}/tools/check_errors.rb +1 -1
  32. data/lib/servactory/{input_arguments → inputs}/tools/find_unnecessary.rb +6 -6
  33. data/lib/servactory/{input_arguments → inputs}/tools/prepare.rb +5 -5
  34. data/lib/servactory/inputs/tools/rules.rb +46 -0
  35. data/lib/servactory/{input_arguments → inputs}/workbench.rb +8 -8
  36. data/lib/servactory/internals/checks/base.rb +17 -0
  37. data/lib/servactory/{internal_arguments → internals}/checks/type.rb +8 -8
  38. data/lib/servactory/{output_arguments → internals}/collection.rb +1 -1
  39. data/lib/servactory/internals/dsl.rb +33 -0
  40. data/lib/servactory/{internal_arguments/internal_argument.rb → internals/internal.rb} +2 -2
  41. data/lib/servactory/internals/tools/prepare.rb +60 -0
  42. data/lib/servactory/{internal_arguments → internals}/workbench.rb +5 -5
  43. data/lib/servactory/{make_methods → methods}/collection.rb +1 -1
  44. data/lib/servactory/methods/dsl.rb +33 -0
  45. data/lib/servactory/{make_methods/make_method.rb → methods/method.rb} +2 -2
  46. data/lib/servactory/{make_methods → methods}/workbench.rb +5 -5
  47. data/lib/servactory/outputs/checks/base.rb +17 -0
  48. data/lib/servactory/{output_arguments → outputs}/checks/type.rb +8 -8
  49. data/lib/servactory/{internal_arguments → outputs}/collection.rb +1 -1
  50. data/lib/servactory/outputs/dsl.rb +33 -0
  51. data/lib/servactory/{output_arguments/output_argument.rb → outputs/output.rb} +2 -2
  52. data/lib/servactory/{output_arguments → outputs}/tools/conflicts.rb +7 -7
  53. data/lib/servactory/outputs/tools/prepare.rb +62 -0
  54. data/lib/servactory/outputs/workbench.rb +31 -0
  55. data/lib/servactory/result.rb +4 -4
  56. data/lib/servactory/utils.rb +2 -0
  57. data/lib/servactory/version.rb +2 -2
  58. metadata +59 -46
  59. data/lib/servactory/context/workspace/error.rb +0 -19
  60. data/lib/servactory/context/workspace/errors.rb +0 -33
  61. data/lib/servactory/errors/input_argument_error.rb +0 -7
  62. data/lib/servactory/errors/internal_argument_error.rb +0 -7
  63. data/lib/servactory/errors/output_argument_error.rb +0 -7
  64. data/lib/servactory/input_arguments/dsl.rb +0 -36
  65. data/lib/servactory/input_arguments/tools/rules.rb +0 -43
  66. data/lib/servactory/inputs.rb +0 -9
  67. data/lib/servactory/internal_arguments/checks/base.rb +0 -17
  68. data/lib/servactory/internal_arguments/dsl.rb +0 -33
  69. data/lib/servactory/internal_arguments/tools/prepare.rb +0 -60
  70. data/lib/servactory/make_methods/dsl.rb +0 -33
  71. data/lib/servactory/output_arguments/checks/base.rb +0 -17
  72. data/lib/servactory/output_arguments/dsl.rb +0 -33
  73. data/lib/servactory/output_arguments/tools/prepare.rb +0 -62
  74. data/lib/servactory/output_arguments/workbench.rb +0 -31
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InputArguments
4
+ module Inputs
5
5
  module Checks
6
6
  class Must < Base
7
7
  DEFAULT_MESSAGE = lambda do |service_class_name:, input:, value:, code:|
8
8
  I18n.t(
9
- "servactory.input_arguments.checks.must.default_error",
9
+ "servactory.inputs.checks.must.default_error",
10
10
  service_class_name: service_class_name,
11
11
  input_name: input.name,
12
12
  value: value,
@@ -16,7 +16,7 @@ module Servactory
16
16
 
17
17
  SYNTAX_ERROR_MESSAGE = lambda do |service_class_name:, input:, value:, code:, exception_message:|
18
18
  I18n.t(
19
- "servactory.input_arguments.checks.must.syntax_error",
19
+ "servactory.inputs.checks.must.syntax_error",
20
20
  service_class_name: service_class_name,
21
21
  input_name: input.name,
22
22
  value: value,
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InputArguments
4
+ module Inputs
5
5
  module Checks
6
6
  class Required < Base
7
7
  DEFAULT_MESSAGE = lambda do |service_class_name:, input:, value:|
8
- i18n_key = "servactory.input_arguments.checks.required.default_error."
8
+ i18n_key = "servactory.inputs.checks.required.default_error."
9
9
  i18n_key += input.array? && value.present? ? "for_array" : "default"
10
10
 
11
11
  I18n.t(
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InputArguments
4
+ module Inputs
5
5
  module Checks
6
6
  class Type < Base
7
7
  DEFAULT_MESSAGE = lambda do |service_class_name:, input:, expected_type:, given_type:|
@@ -14,7 +14,7 @@ module Servactory
14
14
  array_message
15
15
  else
16
16
  I18n.t(
17
- "servactory.input_arguments.checks.type.default_error.for_array",
17
+ "servactory.inputs.checks.type.default_error.for_array",
18
18
  service_class_name: service_class_name,
19
19
  input_name: input.name,
20
20
  expected_type: expected_type,
@@ -23,7 +23,7 @@ module Servactory
23
23
  end
24
24
  else
25
25
  I18n.t(
26
- "servactory.input_arguments.checks.type.default_error.default",
26
+ "servactory.inputs.checks.type.default_error.default",
27
27
  service_class_name: service_class_name,
28
28
  input_name: input.name,
29
29
  expected_type: expected_type,
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InputArguments
4
+ module Inputs
5
5
  class Collection
6
6
  # NOTE: http://words.steveklabnik.com/beware-subclassing-ruby-core-classes
7
7
  extend Forwardable
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InputArguments
4
+ module Inputs
5
5
  class DefineInputConflict
6
6
  attr_reader :content
7
7
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InputArguments
4
+ module Inputs
5
5
  class DefineInputMethod
6
6
  attr_reader :name,
7
7
  :content
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Servactory
4
+ module Inputs
5
+ module DSL
6
+ def self.included(base)
7
+ base.extend(ClassMethods)
8
+ end
9
+
10
+ module ClassMethods
11
+ def inherited(child)
12
+ super
13
+
14
+ child.send(:collection_of_inputs).merge(collection_of_inputs)
15
+ end
16
+
17
+ private
18
+
19
+ def input(name, **options)
20
+ collection_of_inputs << Input.new(
21
+ name,
22
+ **options
23
+ )
24
+ end
25
+
26
+ def collection_of_inputs
27
+ @collection_of_inputs ||= Collection.new
28
+ end
29
+
30
+ def inputs_workbench
31
+ @inputs_workbench ||= Workbench.work_with(collection_of_inputs)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InputArguments
5
- class InputArgument # rubocop:disable Metrics/ClassLength
4
+ module Inputs
5
+ class Input # rubocop:disable Metrics/ClassLength
6
6
  ARRAY_DEFAULT_VALUE = ->(is: false, message: nil) { { is: is, message: message } }
7
7
 
8
8
  attr_reader :name,
@@ -17,6 +17,7 @@ module Servactory
17
17
  )
18
18
  @name = name
19
19
  @internal_name = as.present? ? as : name
20
+
20
21
  add_basic_options_with(type: type, options: options)
21
22
 
22
23
  collection_of_options.each do |option|
@@ -28,18 +29,18 @@ module Servactory
28
29
  # rubocop:enable Style/KeywordParametersOrder
29
30
 
30
31
  def add_basic_options_with(type:, options:)
31
- # Check Class: Servactory::InputArguments::Checks::Required
32
+ # Check Class: Servactory::Inputs::Checks::Required
32
33
  add_required_option_with(options)
33
34
 
34
- # Check Class: Servactory::InputArguments::Checks::Type
35
+ # Check Class: Servactory::Inputs::Checks::Type
35
36
  add_types_option_with(type)
36
37
  add_default_option_with(options)
37
38
  add_array_option_with(options)
38
39
 
39
- # Check Class: Servactory::InputArguments::Checks::Inclusion
40
+ # Check Class: Servactory::Inputs::Checks::Inclusion
40
41
  add_inclusion_option_with(options)
41
42
 
42
- # Check Class: Servactory::InputArguments::Checks::Must
43
+ # Check Class: Servactory::Inputs::Checks::Must
43
44
  add_must_option_with(options)
44
45
 
45
46
  # Check Class: nil
@@ -50,7 +51,7 @@ module Servactory
50
51
  collection_of_options << Option.new(
51
52
  name: :required,
52
53
  input: self,
53
- check_class: Servactory::InputArguments::Checks::Required,
54
+ check_class: Servactory::Inputs::Checks::Required,
54
55
  define_input_methods: [
55
56
  DefineInputMethod.new(
56
57
  name: :required?,
@@ -75,7 +76,7 @@ module Servactory
75
76
  collection_of_options << Option.new(
76
77
  name: :types,
77
78
  input: self,
78
- check_class: Servactory::InputArguments::Checks::Type,
79
+ check_class: Servactory::Inputs::Checks::Type,
79
80
  original_value: Array(type),
80
81
  need_for_checks: true,
81
82
  value_fallback: nil,
@@ -87,7 +88,7 @@ module Servactory
87
88
  collection_of_options << Option.new(
88
89
  name: :default,
89
90
  input: self,
90
- check_class: Servactory::InputArguments::Checks::Type,
91
+ check_class: Servactory::Inputs::Checks::Type,
91
92
  define_input_methods: [
92
93
  DefineInputMethod.new(
93
94
  name: :default_value_present?,
@@ -105,7 +106,7 @@ module Servactory
105
106
  collection_of_options << Option.new(
106
107
  name: :array,
107
108
  input: self,
108
- check_class: Servactory::InputArguments::Checks::Type,
109
+ check_class: Servactory::Inputs::Checks::Type,
109
110
  define_input_methods: [
110
111
  DefineInputMethod.new(
111
112
  name: :array?,
@@ -127,7 +128,7 @@ module Servactory
127
128
  collection_of_options << Option.new(
128
129
  name: :inclusion,
129
130
  input: self,
130
- check_class: Servactory::InputArguments::Checks::Inclusion,
131
+ check_class: Servactory::Inputs::Checks::Inclusion,
131
132
  define_input_methods: [
132
133
  DefineInputMethod.new(
133
134
  name: :inclusion_present?,
@@ -145,7 +146,7 @@ module Servactory
145
146
  collection_of_options << Option.new(
146
147
  name: :must,
147
148
  input: self,
148
- check_class: Servactory::InputArguments::Checks::Must,
149
+ check_class: Servactory::Inputs::Checks::Must,
149
150
  define_input_methods: [
150
151
  DefineInputMethod.new(
151
152
  name: :must_present?,
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InputArguments
4
+ module Inputs
5
5
  class Option
6
6
  DEFAULT_VALUE = ->(key:, value:, message: nil) { { key => value, message: message } }
7
7
 
@@ -66,10 +66,12 @@ module Servactory
66
66
 
67
67
  def prepare_advanced_for(value:, value_fallback:)
68
68
  if value.is_a?(Hash)
69
+ message = value.fetch(:message, nil)
70
+
69
71
  DEFAULT_VALUE.call(
70
72
  key: value_key,
71
- value: value.fetch(value_key, value_fallback),
72
- message: value.fetch(:message, nil)
73
+ value: value.fetch(value_key, message.present? ? true : value_fallback),
74
+ message: message
73
75
  )
74
76
  else
75
77
  DEFAULT_VALUE.call(key: value_key, value: value)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InputArguments
4
+ module Inputs
5
5
  class OptionsCollection
6
6
  # NOTE: http://words.steveklabnik.com/beware-subclassing-ruby-core-classes
7
7
  extend Forwardable
@@ -1,21 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InputArguments
4
+ module Inputs
5
5
  module Tools
6
6
  class Check
7
7
  def self.check!(...)
8
8
  new(...).check!
9
9
  end
10
10
 
11
- def initialize(context, incoming_arguments, collection_of_input_arguments)
11
+ def initialize(context, incoming_arguments, collection_of_inputs)
12
12
  @context = context
13
13
  @incoming_arguments = incoming_arguments
14
- @collection_of_input_arguments = collection_of_input_arguments
14
+ @collection_of_inputs = collection_of_inputs
15
15
  end
16
16
 
17
17
  def check!
18
- @collection_of_input_arguments.each do |input|
18
+ @collection_of_inputs.each do |input|
19
19
  process_input(input)
20
20
  end
21
21
 
@@ -68,7 +68,7 @@ module Servactory
68
68
  def raise_errors
69
69
  return if (tmp_errors = errors.not_blank).empty?
70
70
 
71
- raise Servactory.configuration.input_argument_error_class, tmp_errors.first
71
+ raise Servactory.configuration.input_error_class.new(message: tmp_errors.first)
72
72
  end
73
73
  end
74
74
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InputArguments
4
+ module Inputs
5
5
  module Tools
6
6
  class CheckErrors
7
7
  # NOTE: http://words.steveklabnik.com/beware-subclassing-ruby-core-classes
@@ -1,35 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InputArguments
4
+ module Inputs
5
5
  module Tools
6
6
  class FindUnnecessary
7
7
  def self.check!(...)
8
8
  new(...).check!
9
9
  end
10
10
 
11
- def initialize(context, incoming_arguments, collection_of_input_arguments)
11
+ def initialize(context, incoming_arguments, collection_of_inputs)
12
12
  @context = context
13
13
  @incoming_arguments = incoming_arguments
14
- @collection_of_input_arguments = collection_of_input_arguments
14
+ @collection_of_inputs = collection_of_inputs
15
15
  end
16
16
 
17
17
  def check!
18
18
  return if unnecessary_attributes.empty?
19
19
 
20
20
  message_text = I18n.t(
21
- "servactory.input_arguments.tools.find_unnecessary.error",
21
+ "servactory.inputs.tools.find_unnecessary.error",
22
22
  service_class_name: @context.class.name,
23
23
  unnecessary_attributes: unnecessary_attributes.join(", ")
24
24
  )
25
25
 
26
- raise Servactory.configuration.input_argument_error_class, message_text
26
+ raise Servactory.configuration.input_error_class.new(message: message_text)
27
27
  end
28
28
 
29
29
  private
30
30
 
31
31
  def unnecessary_attributes
32
- @unnecessary_attributes ||= @incoming_arguments.keys - @collection_of_input_arguments.names
32
+ @unnecessary_attributes ||= @incoming_arguments.keys - @collection_of_inputs.names
33
33
  end
34
34
  end
35
35
  end
@@ -1,24 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InputArguments
4
+ module Inputs
5
5
  module Tools
6
6
  class Prepare
7
7
  def self.prepare(...)
8
8
  new(...).prepare
9
9
  end
10
10
 
11
- def initialize(context, incoming_arguments, collection_of_input_arguments)
11
+ def initialize(context, incoming_arguments, collection_of_inputs)
12
12
  @context = context
13
13
  @incoming_arguments = incoming_arguments
14
- @collection_of_input_arguments = collection_of_input_arguments
14
+ @collection_of_inputs = collection_of_inputs
15
15
  end
16
16
 
17
17
  def prepare
18
18
  @inputs_variables = {}
19
19
  @internal_variables = {}
20
20
 
21
- @collection_of_input_arguments.each do |input|
21
+ @collection_of_inputs.each do |input|
22
22
  process_input(input)
23
23
  end
24
24
 
@@ -39,7 +39,7 @@ module Servactory
39
39
  end
40
40
 
41
41
  def create_instance_variables
42
- inputs_class = Servactory::Inputs.dup
42
+ inputs_class = Servactory::Context::Workspace::Inputs.dup
43
43
  inputs_class.class_eval(class_inputs_template) if class_inputs_template.present?
44
44
 
45
45
  @context.assign_inputs(inputs_class.new(**@inputs_variables))
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Servactory
4
+ module Inputs
5
+ module Tools
6
+ class Rules
7
+ def self.check!(...)
8
+ new(...).check!
9
+ end
10
+
11
+ def initialize(context, collection_of_inputs)
12
+ @context = context
13
+ @collection_of_inputs = collection_of_inputs
14
+ end
15
+
16
+ def check!
17
+ @collection_of_inputs.each do |input|
18
+ check_for!(input)
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def check_for!(input)
25
+ return unless input.with_conflicts?
26
+
27
+ raise_error_for(input)
28
+ end
29
+
30
+ def raise_error_for(input)
31
+ message_text = I18n.t(
32
+ "servactory.inputs.tools.rules.error",
33
+ service_class_name: @context.class.name,
34
+ input_name: input.name,
35
+ conflict_code: input.conflict_code
36
+ )
37
+
38
+ raise Servactory.configuration.input_error_class.new(
39
+ message: message_text,
40
+ input_name: input.name
41
+ )
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InputArguments
4
+ module Inputs
5
5
  class Workbench
6
6
  def self.work_with(...)
7
7
  new(...)
8
8
  end
9
9
 
10
- def initialize(collection_of_input_arguments)
11
- @collection_of_input_arguments = collection_of_input_arguments
10
+ def initialize(collection_of_inputs)
11
+ @collection_of_inputs = collection_of_inputs
12
12
  end
13
13
 
14
14
  def assign(context:, arguments:)
@@ -17,25 +17,25 @@ module Servactory
17
17
  end
18
18
 
19
19
  def find_unnecessary!
20
- Tools::FindUnnecessary.check!(context, @incoming_arguments, collection_of_input_arguments)
20
+ Tools::FindUnnecessary.check!(context, @incoming_arguments, collection_of_inputs)
21
21
  end
22
22
 
23
23
  def check_rules!
24
- Tools::Rules.check!(context, collection_of_input_arguments)
24
+ Tools::Rules.check!(context, collection_of_inputs)
25
25
  end
26
26
 
27
27
  def prepare
28
- Tools::Prepare.prepare(context, @incoming_arguments, collection_of_input_arguments)
28
+ Tools::Prepare.prepare(context, @incoming_arguments, collection_of_inputs)
29
29
  end
30
30
 
31
31
  def check!
32
- Tools::Check.check!(context, @incoming_arguments, collection_of_input_arguments)
32
+ Tools::Check.check!(context, @incoming_arguments, collection_of_inputs)
33
33
  end
34
34
 
35
35
  private
36
36
 
37
37
  attr_reader :context,
38
- :collection_of_input_arguments
38
+ :collection_of_inputs
39
39
  end
40
40
  end
41
41
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Servactory
4
+ module Internals
5
+ module Checks
6
+ class Base
7
+ protected
8
+
9
+ def raise_error_with(message, **attributes)
10
+ message = message.call(**attributes) if message.is_a?(Proc)
11
+
12
+ raise Servactory.configuration.internal_error_class.new(message: message)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InternalArguments
4
+ module Internals
5
5
  module Checks
6
6
  class Type < Base
7
- DEFAULT_MESSAGE = lambda do |service_class_name:, internal_argument:, expected_type:, given_type:|
7
+ DEFAULT_MESSAGE = lambda do |service_class_name:, internal:, expected_type:, given_type:|
8
8
  I18n.t(
9
- "servactory.internal_arguments.checks.type.default_error",
9
+ "servactory.internals.checks.type.default_error",
10
10
  service_class_name: service_class_name,
11
- internal_argument_name: internal_argument.name,
11
+ internal_name: internal.name,
12
12
  expected_type: expected_type,
13
13
  given_type: given_type
14
14
  )
@@ -22,11 +22,11 @@ module Servactory
22
22
 
23
23
  ##########################################################################
24
24
 
25
- def initialize(context:, internal_argument:, value:)
25
+ def initialize(context:, internal:, value:)
26
26
  super()
27
27
 
28
28
  @context = context
29
- @internal_argument = internal_argument
29
+ @internal = internal
30
30
  @value = value
31
31
  end
32
32
 
@@ -36,7 +36,7 @@ module Servactory
36
36
  raise_error_with(
37
37
  DEFAULT_MESSAGE,
38
38
  service_class_name: @context.class.name,
39
- internal_argument: @internal_argument,
39
+ internal: @internal,
40
40
  expected_type: prepared_types.join(", "),
41
41
  given_type: @value.class.name
42
42
  )
@@ -46,7 +46,7 @@ module Servactory
46
46
 
47
47
  def prepared_types
48
48
  @prepared_types ||=
49
- Array(@internal_argument.types).map do |type|
49
+ Array(@internal.types).map do |type|
50
50
  if type.is_a?(String)
51
51
  Object.const_get(type)
52
52
  else
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module OutputArguments
4
+ module Internals
5
5
  class Collection
6
6
  # NOTE: http://words.steveklabnik.com/beware-subclassing-ruby-core-classes
7
7
  extend Forwardable
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Servactory
4
+ module Internals
5
+ module DSL
6
+ def self.included(base)
7
+ base.extend(ClassMethods)
8
+ end
9
+
10
+ module ClassMethods
11
+ def inherited(child)
12
+ super
13
+
14
+ child.send(:collection_of_internals).merge(collection_of_internals)
15
+ end
16
+
17
+ private
18
+
19
+ def internal(name, **options)
20
+ collection_of_internals << Internal.new(name, **options)
21
+ end
22
+
23
+ def collection_of_internals
24
+ @collection_of_internals ||= Collection.new
25
+ end
26
+
27
+ def internals_workbench
28
+ @internals_workbench ||= Workbench.work_with(collection_of_internals)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- module InternalArguments
5
- class InternalArgument
4
+ module Internals
5
+ class Internal
6
6
  attr_reader :name,
7
7
  :types,
8
8
  :required
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Servactory
4
+ module Internals
5
+ module Tools
6
+ class Prepare
7
+ def self.prepare(...)
8
+ new(...).prepare
9
+ end
10
+
11
+ def initialize(context, collection_of_internals)
12
+ @context = context
13
+ @collection_of_internals = collection_of_internals
14
+ end
15
+
16
+ def prepare
17
+ @collection_of_internals.each do |internal|
18
+ create_instance_variable_for(internal)
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def create_instance_variable_for(internal)
25
+ @context.instance_variable_set(:"@#{internal.name}", nil)
26
+
27
+ @context.class.class_eval(context_internal_template_for(internal))
28
+ end
29
+
30
+ # EXAMPLE:
31
+ #
32
+ # define_method(:user=) do |value|
33
+ # Servactory::Internals::Checks::Type.check!( context: self, internal:, value: )
34
+ #
35
+ # instance_variable_set(:@user, value)
36
+ # end
37
+ #
38
+ # private attr_reader :user
39
+ #
40
+ def context_internal_template_for(internal)
41
+ <<-RUBY
42
+ define_method(:#{internal.name}=) do |value|
43
+ Servactory::Internals::Checks::Type.check!(
44
+ context: self,
45
+ internal: internal,
46
+ value: value
47
+ )
48
+
49
+ instance_variable_set(:@#{internal.name}, value)
50
+ end
51
+
52
+ private
53
+
54
+ attr_reader :#{internal.name}
55
+ RUBY
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end