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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/treaty/action/base.rb +11 -0
- data/lib/treaty/action/context/callable.rb +90 -0
- data/lib/treaty/action/context/dsl.rb +56 -0
- data/lib/treaty/action/context/workspace.rb +92 -0
- data/lib/treaty/action/executor/inventory.rb +136 -0
- data/lib/treaty/{info/rest → action/info}/builder.rb +2 -2
- data/lib/treaty/{info/rest → action/info}/dsl.rb +2 -2
- data/lib/treaty/{info/rest → action/info}/result.rb +2 -2
- data/lib/treaty/action/inventory/collection.rb +77 -0
- data/lib/treaty/action/inventory/factory.rb +108 -0
- data/lib/treaty/action/inventory/inventory.rb +146 -0
- data/lib/treaty/action/request/attribute/attribute.rb +76 -0
- data/lib/treaty/action/request/attribute/builder.rb +98 -0
- data/lib/treaty/action/request/entity.rb +78 -0
- data/lib/treaty/action/request/factory.rb +116 -0
- data/lib/treaty/action/request/validator.rb +120 -0
- data/lib/treaty/action/response/attribute/attribute.rb +79 -0
- data/lib/treaty/action/response/attribute/builder.rb +96 -0
- data/lib/treaty/action/response/entity.rb +79 -0
- data/lib/treaty/action/response/factory.rb +129 -0
- data/lib/treaty/action/response/validator.rb +111 -0
- data/lib/treaty/action/result.rb +81 -0
- data/lib/treaty/action/versions/collection.rb +47 -0
- data/lib/treaty/action/versions/dsl.rb +116 -0
- data/lib/treaty/action/versions/execution/request.rb +287 -0
- data/lib/treaty/action/versions/executor.rb +61 -0
- data/lib/treaty/action/versions/factory.rb +253 -0
- data/lib/treaty/action/versions/resolver.rb +150 -0
- data/lib/treaty/action/versions/semantic.rb +64 -0
- data/lib/treaty/action/versions/workspace.rb +106 -0
- data/lib/treaty/action.rb +31 -0
- data/lib/treaty/controller/dsl.rb +1 -1
- data/lib/treaty/entity/attribute/base.rb +1 -1
- data/lib/treaty/entity/attribute/builder/base.rb +1 -1
- data/lib/treaty/entity/attribute/dsl.rb +1 -1
- data/lib/treaty/entity/base.rb +1 -1
- data/lib/treaty/entity/builder.rb +62 -5
- data/lib/treaty/version.rb +1 -1
- metadata +32 -31
- data/lib/treaty/base.rb +0 -9
- data/lib/treaty/context/callable.rb +0 -26
- data/lib/treaty/context/dsl.rb +0 -12
- data/lib/treaty/context/workspace.rb +0 -32
- data/lib/treaty/executor/inventory.rb +0 -122
- data/lib/treaty/inventory/collection.rb +0 -71
- data/lib/treaty/inventory/factory.rb +0 -91
- data/lib/treaty/inventory/inventory.rb +0 -92
- data/lib/treaty/request/attribute/attribute.rb +0 -25
- data/lib/treaty/request/attribute/builder.rb +0 -46
- data/lib/treaty/request/entity.rb +0 -33
- data/lib/treaty/request/factory.rb +0 -81
- data/lib/treaty/request/validator.rb +0 -60
- data/lib/treaty/response/attribute/attribute.rb +0 -25
- data/lib/treaty/response/attribute/builder.rb +0 -46
- data/lib/treaty/response/entity.rb +0 -33
- data/lib/treaty/response/factory.rb +0 -87
- data/lib/treaty/response/validator.rb +0 -53
- data/lib/treaty/result.rb +0 -23
- data/lib/treaty/versions/collection.rb +0 -15
- data/lib/treaty/versions/dsl.rb +0 -42
- data/lib/treaty/versions/execution/request.rb +0 -177
- data/lib/treaty/versions/executor.rb +0 -14
- data/lib/treaty/versions/factory.rb +0 -112
- data/lib/treaty/versions/resolver.rb +0 -70
- data/lib/treaty/versions/semantic.rb +0 -22
- 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,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
|