treaty 0.19.0 → 0.20.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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/treaty/action/base.rb +11 -0
  4. data/lib/treaty/action/context/callable.rb +90 -0
  5. data/lib/treaty/action/context/dsl.rb +56 -0
  6. data/lib/treaty/action/context/workspace.rb +92 -0
  7. data/lib/treaty/action/executor/inventory.rb +136 -0
  8. data/lib/treaty/{info/rest → action/info}/builder.rb +2 -2
  9. data/lib/treaty/{info/rest → action/info}/dsl.rb +2 -2
  10. data/lib/treaty/{info/rest → action/info}/result.rb +2 -2
  11. data/lib/treaty/action/inventory/collection.rb +77 -0
  12. data/lib/treaty/action/inventory/factory.rb +108 -0
  13. data/lib/treaty/action/inventory/inventory.rb +146 -0
  14. data/lib/treaty/action/request/attribute/attribute.rb +76 -0
  15. data/lib/treaty/action/request/attribute/builder.rb +98 -0
  16. data/lib/treaty/action/request/entity.rb +78 -0
  17. data/lib/treaty/action/request/factory.rb +116 -0
  18. data/lib/treaty/action/request/validator.rb +120 -0
  19. data/lib/treaty/action/response/attribute/attribute.rb +79 -0
  20. data/lib/treaty/action/response/attribute/builder.rb +96 -0
  21. data/lib/treaty/action/response/entity.rb +79 -0
  22. data/lib/treaty/action/response/factory.rb +129 -0
  23. data/lib/treaty/action/response/validator.rb +111 -0
  24. data/lib/treaty/action/result.rb +81 -0
  25. data/lib/treaty/action/versions/collection.rb +47 -0
  26. data/lib/treaty/action/versions/dsl.rb +116 -0
  27. data/lib/treaty/action/versions/execution/request.rb +287 -0
  28. data/lib/treaty/action/versions/executor.rb +61 -0
  29. data/lib/treaty/action/versions/factory.rb +253 -0
  30. data/lib/treaty/action/versions/resolver.rb +150 -0
  31. data/lib/treaty/action/versions/semantic.rb +64 -0
  32. data/lib/treaty/action/versions/workspace.rb +106 -0
  33. data/lib/treaty/action.rb +31 -0
  34. data/lib/treaty/controller/dsl.rb +1 -1
  35. data/lib/treaty/entity/attribute/base.rb +1 -1
  36. data/lib/treaty/entity/attribute/builder/base.rb +1 -1
  37. data/lib/treaty/entity/attribute/dsl.rb +1 -1
  38. data/lib/treaty/entity/base.rb +1 -1
  39. data/lib/treaty/entity/builder.rb +62 -5
  40. data/lib/treaty/version.rb +1 -1
  41. metadata +32 -31
  42. data/lib/treaty/base.rb +0 -9
  43. data/lib/treaty/context/callable.rb +0 -26
  44. data/lib/treaty/context/dsl.rb +0 -12
  45. data/lib/treaty/context/workspace.rb +0 -32
  46. data/lib/treaty/executor/inventory.rb +0 -122
  47. data/lib/treaty/inventory/collection.rb +0 -71
  48. data/lib/treaty/inventory/factory.rb +0 -91
  49. data/lib/treaty/inventory/inventory.rb +0 -92
  50. data/lib/treaty/request/attribute/attribute.rb +0 -25
  51. data/lib/treaty/request/attribute/builder.rb +0 -46
  52. data/lib/treaty/request/entity.rb +0 -33
  53. data/lib/treaty/request/factory.rb +0 -81
  54. data/lib/treaty/request/validator.rb +0 -60
  55. data/lib/treaty/response/attribute/attribute.rb +0 -25
  56. data/lib/treaty/response/attribute/builder.rb +0 -46
  57. data/lib/treaty/response/entity.rb +0 -33
  58. data/lib/treaty/response/factory.rb +0 -87
  59. data/lib/treaty/response/validator.rb +0 -53
  60. data/lib/treaty/result.rb +0 -23
  61. data/lib/treaty/versions/collection.rb +0 -15
  62. data/lib/treaty/versions/dsl.rb +0 -42
  63. data/lib/treaty/versions/execution/request.rb +0 -177
  64. data/lib/treaty/versions/executor.rb +0 -14
  65. data/lib/treaty/versions/factory.rb +0 -112
  66. data/lib/treaty/versions/resolver.rb +0 -70
  67. data/lib/treaty/versions/semantic.rb +0 -22
  68. data/lib/treaty/versions/workspace.rb +0 -43
@@ -1,177 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Treaty
4
- module Versions
5
- module Execution
6
- class Request # rubocop:disable Metrics/ClassLength
7
- def self.execute!(...)
8
- new(...).execute!
9
- end
10
-
11
- def initialize(version_factory:, validated_params:, inventory: nil, context: nil)
12
- @inventory = inventory
13
- @context = context
14
- @version_factory = version_factory
15
- @validated_params = validated_params
16
- end
17
-
18
- def execute!
19
- raise_executor_missing_error! if @version_factory.executor.nil?
20
-
21
- extract_data_from_result
22
- end
23
-
24
- private
25
-
26
- def extract_data_from_result
27
- return execution_result if executor.is_a?(Proc)
28
- return execution_result.data if execution_result.respond_to?(:data)
29
-
30
- execution_result
31
- end
32
-
33
- ########################################################################
34
-
35
- def execution_result
36
- @execution_result ||=
37
- if executor.is_a?(Proc)
38
- execute_proc
39
- elsif servactory_service?
40
- execute_servactory
41
- else
42
- execute_regular_class
43
- end
44
- end
45
-
46
- ########################################################################
47
-
48
- def executor
49
- @executor ||= resolve_executor(@version_factory.executor.executor)
50
- end
51
-
52
- ########################################################################
53
-
54
- def resolve_executor(executor) # rubocop:disable Metrics/MethodLength
55
- return executor if executor.is_a?(Proc) || executor.is_a?(Class)
56
-
57
- if executor.is_a?(String) || executor.is_a?(Symbol)
58
- string_executor = executor.to_s
59
-
60
- if string_executor.empty?
61
- raise Treaty::Exceptions::Execution,
62
- I18n.t("treaty.execution.executor_empty")
63
- end
64
-
65
- constant_name = normalize_constant_name(executor)
66
-
67
- begin
68
- constant_name.constantize
69
- rescue NameError
70
- raise Treaty::Exceptions::Execution,
71
- I18n.t("treaty.execution.executor_not_found", class_name: constant_name)
72
- end
73
- else
74
- raise Treaty::Exceptions::Execution,
75
- I18n.t("treaty.execution.executor_invalid_type", type: executor.class)
76
- end
77
- end
78
-
79
- ########################################################################
80
-
81
- def normalize_constant_name(name)
82
- string = name.to_s
83
-
84
- return string if string.include?("::")
85
- return string.split("/").map(&:camelize).join("::") if string.include?("/")
86
-
87
- string
88
- end
89
-
90
- ########################################################################
91
- ########################################################################
92
- ########################################################################
93
-
94
- # Creates inventory wrapper with lazy evaluation
95
- #
96
- # @return [Treaty::Executor::Inventory] Inventory wrapper with method-based access
97
- def evaluated_inventory
98
- @evaluated_inventory ||= Treaty::Executor::Inventory.new(@inventory, @context)
99
- end
100
-
101
- ########################################################################
102
-
103
- def execute_proc
104
- # For Proc executors, pass inventory if collection exists
105
- executor.call(**build_call_params)
106
- rescue StandardError => e
107
- raise Treaty::Exceptions::Execution,
108
- I18n.t("treaty.execution.proc_error", message: e.message)
109
- end
110
-
111
- def execute_servactory # rubocop:disable Metrics/MethodLength
112
- # For Servactory services, pass inventory if collection exists
113
- executor.call!(**build_call_params)
114
- rescue Servactory::Exceptions::Input => e
115
- raise Treaty::Exceptions::Execution,
116
- I18n.t("treaty.execution.servactory_input_error", message: e.message)
117
- rescue Servactory::Exceptions::Internal => e
118
- raise Treaty::Exceptions::Execution,
119
- I18n.t("treaty.execution.servactory_internal_error", message: e.message)
120
- rescue Servactory::Exceptions::Output => e
121
- raise Treaty::Exceptions::Execution,
122
- I18n.t("treaty.execution.servactory_output_error", message: e.message)
123
- rescue Servactory::Exceptions::Failure => e
124
- raise Treaty::Exceptions::Execution,
125
- I18n.t("treaty.execution.servactory_failure_error", message: e.message)
126
- end
127
-
128
- def execute_regular_class # rubocop:disable Metrics/MethodLength
129
- method_name = @version_factory.executor.method
130
-
131
- unless executor.respond_to?(method_name)
132
- raise Treaty::Exceptions::Execution,
133
- I18n.t(
134
- "treaty.execution.method_not_found",
135
- method: method_name,
136
- class_name: executor
137
- )
138
- end
139
-
140
- # For regular classes, pass inventory if collection exists
141
- executor.public_send(method_name, **build_call_params)
142
- rescue StandardError => e
143
- raise Treaty::Exceptions::Execution,
144
- I18n.t("treaty.execution.regular_service_error", message: e.message)
145
- end
146
-
147
- ########################################################################
148
- ########################################################################
149
- ########################################################################
150
-
151
- # Builds call parameters hash with inventory if it exists
152
- #
153
- # @return [Hash] Parameters hash with :params and optionally :inventory
154
- def build_call_params
155
- if @inventory&.exists?
156
- { params: @validated_params, inventory: evaluated_inventory }
157
- else
158
- { params: @validated_params }
159
- end
160
- end
161
-
162
- def raise_executor_missing_error!
163
- raise Treaty::Exceptions::Execution,
164
- I18n.t(
165
- "treaty.execution.executor_missing",
166
- version: @version_factory.version
167
- )
168
- end
169
-
170
- def servactory_service?
171
- executor.respond_to?(:servactory?) &&
172
- executor.servactory?
173
- end
174
- end
175
- end
176
- end
177
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Treaty
4
- module Versions
5
- class Executor
6
- attr_reader :executor, :method
7
-
8
- def initialize(executor, method)
9
- @executor = executor
10
- @method = method
11
- end
12
- end
13
- end
14
- end
@@ -1,112 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Treaty
4
- module Versions
5
- class Factory
6
- attr_reader :version,
7
- :default_result,
8
- :summary_text,
9
- :deprecated_result,
10
- :executor,
11
- :request_factory,
12
- :response_factory
13
-
14
- def initialize(version:, default:)
15
- @version = Semantic.new(version)
16
- @default_result = default.is_a?(Proc) ? default.call : default
17
- @summary_text = nil
18
- @deprecated_result = false
19
- @executor = nil
20
-
21
- validate!
22
- end
23
-
24
- def validate!
25
- validate_default_option!
26
- end
27
-
28
- def validate_after_block!
29
- validate_default_deprecated_conflict!
30
- end
31
-
32
- def summary(text)
33
- @summary_text = text
34
- end
35
-
36
- def deprecated(condition = nil)
37
- result =
38
- if condition.is_a?(Proc)
39
- condition.call
40
- elsif condition.is_a?(TrueClass) || condition.is_a?(FalseClass)
41
- condition
42
- else
43
- yield
44
- end
45
-
46
- @deprecated_result = result
47
- end
48
-
49
- def request(entity_class = nil, &block)
50
- @request_factory ||= Request::Factory.new
51
-
52
- if entity_class.present?
53
- @request_factory.use_entity(entity_class)
54
- elsif block_given?
55
- @request_factory.instance_eval(&block)
56
- end
57
- end
58
-
59
- def response(status, entity_class = nil, &block)
60
- @response_factory ||= Response::Factory.new(status)
61
-
62
- if entity_class.present?
63
- @response_factory.use_entity(entity_class)
64
- elsif block_given?
65
- @response_factory.instance_eval(&block)
66
- end
67
- end
68
-
69
- def delegate_to(executor, method = :call)
70
- @executor = Executor.new(executor, method)
71
- end
72
-
73
- ##########################################################################
74
-
75
- private
76
-
77
- def validate_default_option!
78
- if @default_result.is_a?(TrueClass) || @default_result.is_a?(FalseClass) || @default_result.is_a?(Proc)
79
- return @default_result
80
- end
81
-
82
- raise Treaty::Exceptions::Validation,
83
- I18n.t(
84
- "treaty.versioning.factory.invalid_default_option",
85
- type: @default_result.class
86
- )
87
- end
88
-
89
- def validate_default_deprecated_conflict!
90
- return unless @default_result == true
91
- return unless @deprecated_result == true
92
-
93
- raise Treaty::Exceptions::VersionDefaultDeprecatedConflict,
94
- I18n.t(
95
- "treaty.versioning.factory.default_deprecated_conflict",
96
- version: @version.version
97
- )
98
- end
99
-
100
- ##########################################################################
101
-
102
- def method_missing(name, *, &_block)
103
- raise Treaty::Exceptions::MethodName,
104
- I18n.t("treaty.versioning.factory.unknown_method", method: name)
105
- end
106
-
107
- def respond_to_missing?(name, *)
108
- super
109
- end
110
- end
111
- end
112
- end
@@ -1,70 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Treaty
4
- module Versions
5
- class Resolver
6
- def self.resolve!(...)
7
- new(...).resolve!
8
- end
9
-
10
- def initialize(specified_version:, collection_of_versions:)
11
- @specified_version = specified_version
12
- @collection_of_versions = collection_of_versions
13
- end
14
-
15
- def resolve!
16
- determined_factory =
17
- if specified_version_blank?
18
- default_version_factory || raise_specified_version_not_found!
19
- else
20
- version_factory || raise_version_not_found!
21
- end
22
-
23
- raise_version_deprecated! if determined_factory.deprecated_result
24
-
25
- determined_factory
26
- end
27
-
28
- private
29
-
30
- def version_factory
31
- @version_factory ||=
32
- @collection_of_versions.find do |factory|
33
- factory.version.version == @specified_version
34
- end
35
- end
36
-
37
- def default_version_factory
38
- @default_version_factory ||=
39
- @collection_of_versions.find(&:default_result)
40
- end
41
-
42
- def specified_version_blank?
43
- @specified_version.to_s.strip.empty?
44
- end
45
-
46
- ##########################################################################
47
-
48
- def raise_specified_version_not_found!
49
- raise Treaty::Exceptions::SpecifiedVersionNotFound,
50
- I18n.t("treaty.versioning.resolver.specified_version_required")
51
- end
52
-
53
- def raise_version_not_found!
54
- raise Treaty::Exceptions::VersionNotFound,
55
- I18n.t(
56
- "treaty.versioning.resolver.version_not_found",
57
- version: @specified_version
58
- )
59
- end
60
-
61
- def raise_version_deprecated!
62
- raise Treaty::Exceptions::Deprecated,
63
- I18n.t(
64
- "treaty.versioning.resolver.version_deprecated",
65
- version: @specified_version
66
- )
67
- end
68
- end
69
- end
70
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Treaty
4
- module Versions
5
- class Semantic
6
- attr_reader :version
7
-
8
- def initialize(version)
9
- version =
10
- if version.is_a?(Array)
11
- version.join(".")
12
- # elsif version.is_a?(Integer)
13
- # version.to_s
14
- else
15
- version # rubocop:disable Style/RedundantSelfAssignmentBranch
16
- end
17
-
18
- @version = Gem::Version.new(version)
19
- end
20
- end
21
- end
22
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Treaty
4
- module Versions
5
- module Workspace
6
- private
7
-
8
- def call!(context:, inventory:, version:, params:, **) # rubocop:disable Metrics/MethodLength
9
- super
10
-
11
- version_factory = Resolver.resolve!(
12
- specified_version: version,
13
- collection_of_versions: @collection_of_versions
14
- )
15
-
16
- validated_params = Request::Validator.validate!(
17
- params:,
18
- version_factory:
19
- )
20
-
21
- executor_result = Execution::Request.execute!(
22
- context:,
23
- inventory:,
24
- version_factory:,
25
- validated_params:
26
- )
27
-
28
- validated_response = Response::Validator.validate!(
29
- version_factory:,
30
- response_data: executor_result
31
- )
32
-
33
- status = version_factory.response_factory&.status || 200
34
-
35
- Treaty::Result.new(
36
- data: validated_response,
37
- status:,
38
- version: version_factory.version.version
39
- )
40
- end
41
- end
42
- end
43
- end