convenient_service 0.3.1 → 0.5.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/.dev/.tmuxinator.yml +17 -0
- data/CHANGELOG.md +22 -0
- data/README.md +8 -8
- data/Taskfile.yml +30 -0
- data/convenient_service.gemspec +1 -1
- data/lib/convenient_service/aliases.rb +5 -0
- data/lib/convenient_service/rspec/matchers/custom/results/base.rb +245 -0
- data/lib/convenient_service/rspec/matchers/custom/results/be_error.rb +3 -139
- data/lib/convenient_service/rspec/matchers/custom/results/be_failure.rb +3 -106
- data/lib/convenient_service/rspec/matchers/custom/results/be_not_error.rb +20 -0
- data/lib/convenient_service/rspec/matchers/custom/results/be_not_failure.rb +20 -0
- data/lib/convenient_service/rspec/matchers/custom/results/be_not_success.rb +20 -0
- data/lib/convenient_service/rspec/matchers/custom/results/be_success.rb +3 -112
- data/lib/convenient_service/rspec/matchers/custom/results.rb +6 -0
- data/lib/convenient_service/rspec/matchers/results/be_not_error.rb +15 -0
- data/lib/convenient_service/rspec/matchers/results/be_not_failure.rb +15 -0
- data/lib/convenient_service/rspec/matchers/results/be_not_success.rb +15 -0
- data/lib/convenient_service/rspec/matchers/results.rb +8 -0
- data/lib/convenient_service/service/plugins/has_result/constants.rb +1 -4
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_jsend_status_and_attributes/entities/data.rb +8 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_jsend_status_and_attributes/entities/status.rb +4 -0
- data/lib/convenient_service/service/plugins/has_result_method_steps/middleware.rb +1 -4
- data/lib/convenient_service/service/plugins/has_result_steps/concern.rb +8 -2
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/cast_method_caller.rb +1 -1
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/cast_method_key.rb +1 -1
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/cast_method_name.rb +1 -1
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/define_method_in_container.rb +15 -8
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities.rb +0 -1
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/errors.rb +15 -1
- data/lib/convenient_service/service/plugins/has_result_steps/entities/step/concern/instance_methods.rb +10 -0
- data/lib/convenient_service/support/dependency_container/commands/create_methods_module.rb +27 -0
- data/lib/convenient_service/support/dependency_container/commands/import_method.rb +111 -0
- data/lib/convenient_service/support/dependency_container/commands.rb +4 -0
- data/lib/convenient_service/support/dependency_container/constants.rb +15 -0
- data/lib/convenient_service/support/dependency_container/entities/method.rb +121 -0
- data/lib/convenient_service/support/dependency_container/entities/method_collection.rb +98 -0
- data/lib/convenient_service/support/dependency_container/entities/namespace.rb +69 -0
- data/lib/convenient_service/support/dependency_container/entities/namespace_collection.rb +103 -0
- data/lib/convenient_service/support/dependency_container/entities.rb +6 -0
- data/lib/convenient_service/support/dependency_container/errors.rb +49 -0
- data/lib/convenient_service/support/dependency_container/export.rb +30 -0
- data/lib/convenient_service/support/dependency_container/import.rb +30 -0
- data/lib/convenient_service/support/dependency_container.rb +9 -0
- data/lib/convenient_service/support/gems/rspec.rb +9 -2
- data/lib/convenient_service/support/not_passed.rb +7 -0
- data/lib/convenient_service/support/raw_value.rb +52 -0
- data/lib/convenient_service/support.rb +3 -0
- data/lib/convenient_service/utils/module/fetch_own_const.rb +88 -0
- data/lib/convenient_service/utils/module/include_module.rb +38 -0
- data/lib/convenient_service/utils/module.rb +10 -0
- data/lib/convenient_service/utils/proc/conjunct.rb +1 -1
- data/lib/convenient_service/utils/string/split.rb +41 -0
- data/lib/convenient_service/utils/string.rb +5 -0
- data/lib/convenient_service/version.rb +1 -1
- data/lib/convenient_service.rb +6 -0
- metadata +33 -8
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/values/raw.rb +0 -48
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/values.rb +0 -3
@@ -0,0 +1,121 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Support
|
5
|
+
module DependencyContainer
|
6
|
+
module Entities
|
7
|
+
class Method
|
8
|
+
##
|
9
|
+
# @!attribute [r] full_name
|
10
|
+
# @return [String, Symbol]
|
11
|
+
#
|
12
|
+
attr_reader :full_name
|
13
|
+
|
14
|
+
##
|
15
|
+
# @!attribute [r] scope
|
16
|
+
# @return [:instance, :class]
|
17
|
+
#
|
18
|
+
attr_reader :scope
|
19
|
+
|
20
|
+
##
|
21
|
+
# @!attribute [r] body
|
22
|
+
# @return [Proc]
|
23
|
+
#
|
24
|
+
attr_reader :body
|
25
|
+
|
26
|
+
##
|
27
|
+
# @param full_name [String, Symbol]
|
28
|
+
# @param scope [:instance, :class]
|
29
|
+
# @param body [Proc]
|
30
|
+
# @return [void]
|
31
|
+
#
|
32
|
+
def initialize(full_name:, scope:, body:)
|
33
|
+
@full_name = full_name
|
34
|
+
@scope = scope
|
35
|
+
@body = body
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# @return [String]
|
40
|
+
#
|
41
|
+
def name
|
42
|
+
@name ||= full_name_parts.last
|
43
|
+
end
|
44
|
+
|
45
|
+
##
|
46
|
+
# @return [Array<ConvenientService::Support::DependencyContainer::Entities::Namespace>]
|
47
|
+
#
|
48
|
+
def namespaces
|
49
|
+
@namespaces ||= full_name_parts.slice(0..-2).map { |part| Entities::Namespace.new(name: part) }
|
50
|
+
end
|
51
|
+
|
52
|
+
##
|
53
|
+
# @param mod [Module]
|
54
|
+
# @return [ConvenientService::Support::DependencyContainer::Entities::Method]
|
55
|
+
#
|
56
|
+
def define_in_module!(mod)
|
57
|
+
##
|
58
|
+
# NOTE: `innermost_namespace` is just `mod`, when `namespaces` are empty.
|
59
|
+
#
|
60
|
+
innermost_namespace =
|
61
|
+
namespaces.reduce(mod) do |namespace, sub_namespace|
|
62
|
+
already_defined_sub_namespace = namespace.namespaces.find_by(name: sub_namespace.name)
|
63
|
+
|
64
|
+
##
|
65
|
+
# NOTE:
|
66
|
+
# - Reuses already defined namespace from previous "imports".
|
67
|
+
# - In contrast, same methods are always redefined.
|
68
|
+
#
|
69
|
+
next already_defined_sub_namespace if already_defined_sub_namespace
|
70
|
+
|
71
|
+
namespace.namespaces << sub_namespace
|
72
|
+
|
73
|
+
namespace.define_method(sub_namespace.name) { sub_namespace.body.call }
|
74
|
+
|
75
|
+
sub_namespace
|
76
|
+
end
|
77
|
+
|
78
|
+
##
|
79
|
+
# NOTE:
|
80
|
+
# - Same methods are redefined.
|
81
|
+
# - In contrast, same namespaces are always reused.
|
82
|
+
#
|
83
|
+
innermost_namespace.define_method(method.name, &method.body)
|
84
|
+
|
85
|
+
method
|
86
|
+
end
|
87
|
+
|
88
|
+
##
|
89
|
+
# @param other [Object] Can be any type.
|
90
|
+
# @return [Boolean]
|
91
|
+
#
|
92
|
+
def ==(other)
|
93
|
+
return unless other.instance_of?(self.class)
|
94
|
+
|
95
|
+
return false if full_name != other.full_name
|
96
|
+
return false if scope != other.scope
|
97
|
+
return false if body != other.body
|
98
|
+
|
99
|
+
true
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
##
|
105
|
+
# @return [ConvenientService::Support::DependencyContainer::Entities::Method]
|
106
|
+
#
|
107
|
+
def method
|
108
|
+
self
|
109
|
+
end
|
110
|
+
|
111
|
+
##
|
112
|
+
# @return [Array<String>]
|
113
|
+
#
|
114
|
+
def full_name_parts
|
115
|
+
@full_name_parts ||= Utils::String.split(full_name, ".", "::").map(&:to_sym)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Support
|
5
|
+
module DependencyContainer
|
6
|
+
module Entities
|
7
|
+
class MethodCollection
|
8
|
+
##
|
9
|
+
# @param methods [Array<ConvenientService::Support::DependencyContainer::Entities::Method>]
|
10
|
+
# @return [void]
|
11
|
+
#
|
12
|
+
def initialize(methods: [])
|
13
|
+
@methods = methods
|
14
|
+
end
|
15
|
+
|
16
|
+
##
|
17
|
+
# @param name [String, Symbol]
|
18
|
+
# @param full_name [String, Symbol]
|
19
|
+
# @param scope [:instance, :class]
|
20
|
+
# @return [ConvenientService::Support::DependencyContainer::Entities::Method, nil]
|
21
|
+
#
|
22
|
+
def find_by(name: Support::NOT_PASSED, full_name: Support::NOT_PASSED, scope: Support::NOT_PASSED)
|
23
|
+
rules = []
|
24
|
+
|
25
|
+
rules << ->(method) { method.name.to_s == name.to_s } if name != Support::NOT_PASSED
|
26
|
+
rules << ->(method) { method.full_name.to_s == full_name.to_s } if full_name != Support::NOT_PASSED
|
27
|
+
rules << ->(method) { method.scope == scope } if scope != Support::NOT_PASSED
|
28
|
+
|
29
|
+
condition = Utils::Proc.conjunct(rules)
|
30
|
+
|
31
|
+
methods.find(&condition)
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# @param method [ConvenientService::Support::DependencyContainer::Entities::Method]
|
36
|
+
# @return [ConvenientService::Support::DependencyContainer::Entities::MethodCollection]
|
37
|
+
#
|
38
|
+
def <<(method)
|
39
|
+
methods << method
|
40
|
+
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
##
|
45
|
+
# @return [Boolean]
|
46
|
+
#
|
47
|
+
def empty?
|
48
|
+
methods.empty?
|
49
|
+
end
|
50
|
+
|
51
|
+
##
|
52
|
+
# @param method [ConvenientService::Support::DependencyContainer::Entities::Method]
|
53
|
+
# @return [Boolean]
|
54
|
+
#
|
55
|
+
def include?(method)
|
56
|
+
methods.include?(method)
|
57
|
+
end
|
58
|
+
|
59
|
+
##
|
60
|
+
# @return [ConvenientService::Support::DependencyContainer::Entities::MethodCollection]
|
61
|
+
#
|
62
|
+
def clear
|
63
|
+
methods.clear
|
64
|
+
|
65
|
+
self
|
66
|
+
end
|
67
|
+
|
68
|
+
##
|
69
|
+
# @return [Array]
|
70
|
+
#
|
71
|
+
def to_a
|
72
|
+
methods.to_a
|
73
|
+
end
|
74
|
+
|
75
|
+
##
|
76
|
+
# @param other [Object] Can be any type.
|
77
|
+
# @return [Boolean]
|
78
|
+
#
|
79
|
+
def ==(other)
|
80
|
+
return unless other.instance_of?(self.class)
|
81
|
+
|
82
|
+
return false if methods != other.methods
|
83
|
+
|
84
|
+
true
|
85
|
+
end
|
86
|
+
|
87
|
+
protected
|
88
|
+
|
89
|
+
##
|
90
|
+
# @!attribute [r] methods
|
91
|
+
# @return [Array<ConvenientService::Support::DependencyContainer::Entities::Method>]
|
92
|
+
#
|
93
|
+
attr_reader :methods
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Support
|
5
|
+
module DependencyContainer
|
6
|
+
module Entities
|
7
|
+
class Namespace
|
8
|
+
##
|
9
|
+
# @!attribute [r] name
|
10
|
+
# @return [String, Symbol]
|
11
|
+
#
|
12
|
+
attr_reader :name
|
13
|
+
|
14
|
+
##
|
15
|
+
# @param name [String, Symbol]
|
16
|
+
# @return [void]
|
17
|
+
#
|
18
|
+
def initialize(name:)
|
19
|
+
@name = name
|
20
|
+
end
|
21
|
+
|
22
|
+
##
|
23
|
+
# @return [Proc]
|
24
|
+
#
|
25
|
+
def body
|
26
|
+
@body ||= -> { namespace }
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# @return [ConvenientService::Support::DependencyContainer::Entities::NamespaceCollection]
|
31
|
+
#
|
32
|
+
def namespaces
|
33
|
+
@namespaces ||= Entities::NamespaceCollection.new
|
34
|
+
end
|
35
|
+
|
36
|
+
##
|
37
|
+
# @param name [String, Symbol]
|
38
|
+
# @param body [Proc]
|
39
|
+
# @return [Symbol]
|
40
|
+
#
|
41
|
+
def define_method(name, &body)
|
42
|
+
define_singleton_method(name, &body)
|
43
|
+
end
|
44
|
+
|
45
|
+
##
|
46
|
+
# @param other [Object] Can be any type.
|
47
|
+
# @return [Boolean]
|
48
|
+
#
|
49
|
+
def ==(other)
|
50
|
+
return unless other.instance_of?(self.class)
|
51
|
+
|
52
|
+
return false if name != other.name
|
53
|
+
|
54
|
+
true
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
##
|
60
|
+
# @return [ConvenientService::Support::DependencyContainer::Entities::Namespace]
|
61
|
+
#
|
62
|
+
def namespace
|
63
|
+
self
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Support
|
5
|
+
module DependencyContainer
|
6
|
+
module Entities
|
7
|
+
class NamespaceCollection
|
8
|
+
##
|
9
|
+
# @param namespaces [Array<ConvenientService::Support::DependencyContainer::Entities::Namespace>]
|
10
|
+
# @return [void]
|
11
|
+
#
|
12
|
+
def initialize(namespaces: [])
|
13
|
+
@namespaces = namespaces
|
14
|
+
end
|
15
|
+
|
16
|
+
##
|
17
|
+
#
|
18
|
+
#
|
19
|
+
def define_namespace(namespace)
|
20
|
+
namespaces << namespace
|
21
|
+
|
22
|
+
define_singleton_method(namespace.name) { namespace.body.call }
|
23
|
+
end
|
24
|
+
|
25
|
+
##
|
26
|
+
# @param name [String, Symbol]
|
27
|
+
# @return [ConvenientService::Support::DependencyContainer::Entities::Namespace, nil]
|
28
|
+
#
|
29
|
+
def find_by(name: Support::NOT_PASSED)
|
30
|
+
rules = []
|
31
|
+
|
32
|
+
rules << ->(namespace) { namespace.name.to_s == name.to_s } if name != Support::NOT_PASSED
|
33
|
+
|
34
|
+
condition = Utils::Proc.conjunct(rules)
|
35
|
+
|
36
|
+
namespaces.find(&condition)
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# @param namespace [ConvenientService::Support::DependencyContainer::Entities::Namespace]
|
41
|
+
# @return [ConvenientService::Support::DependencyContainer::Entities::NamespaceCollection]
|
42
|
+
#
|
43
|
+
def <<(namespace)
|
44
|
+
namespaces << namespace
|
45
|
+
|
46
|
+
self
|
47
|
+
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# @return [Boolean]
|
51
|
+
#
|
52
|
+
def empty?
|
53
|
+
namespaces.empty?
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# @param namespace [ConvenientService::Support::DependencyContainer::Entities::Namespace]
|
58
|
+
# @return [Boolean]
|
59
|
+
#
|
60
|
+
def include?(namespace)
|
61
|
+
namespaces.include?(namespace)
|
62
|
+
end
|
63
|
+
|
64
|
+
##
|
65
|
+
# @return [ConvenientService::Support::DependencyContainer::Entities::NamespaceCollection]
|
66
|
+
#
|
67
|
+
def clear
|
68
|
+
namespaces.clear
|
69
|
+
|
70
|
+
self
|
71
|
+
end
|
72
|
+
|
73
|
+
##
|
74
|
+
# @return [Array]
|
75
|
+
#
|
76
|
+
def to_a
|
77
|
+
namespaces.to_a
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# @param other [Object] Can be any type.
|
82
|
+
# @return [Boolean]
|
83
|
+
#
|
84
|
+
def ==(other)
|
85
|
+
return unless other.instance_of?(self.class)
|
86
|
+
|
87
|
+
return false if namespaces != other.namespaces
|
88
|
+
|
89
|
+
true
|
90
|
+
end
|
91
|
+
|
92
|
+
protected
|
93
|
+
|
94
|
+
##
|
95
|
+
# @!attribute [r] namespaces
|
96
|
+
# @return [Array<ConvenientService::Support::DependencyContainer::Entities::Namespace>]
|
97
|
+
#
|
98
|
+
attr_reader :namespaces
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Support
|
5
|
+
module DependencyContainer
|
6
|
+
module Errors
|
7
|
+
class NotExportableModule < ConvenientService::Error
|
8
|
+
##
|
9
|
+
# @param mod [Module]
|
10
|
+
# @return [void]
|
11
|
+
#
|
12
|
+
def initialize(mod:)
|
13
|
+
message = <<~TEXT
|
14
|
+
Module `#{mod}` can NOT export methods.
|
15
|
+
|
16
|
+
Did you forget to include `ConvenientService::Container.export` into it?
|
17
|
+
TEXT
|
18
|
+
|
19
|
+
super(message)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class NotExportedMethod < ConvenientService::Error
|
24
|
+
##
|
25
|
+
# @param method_name [String]
|
26
|
+
# @param method_scope [Symbol]
|
27
|
+
# @param mod [Module]
|
28
|
+
# @return [void]
|
29
|
+
#
|
30
|
+
def initialize(method_name:, method_scope:, mod:)
|
31
|
+
message = <<~TEXT
|
32
|
+
Module `#{mod}` does NOT export method `#{method_name}` with `#{method_scope}` scope.
|
33
|
+
|
34
|
+
Did you forget to export if from `#{mod}`? For example:
|
35
|
+
|
36
|
+
module #{mod}
|
37
|
+
export #{method_name}, scope: :#{method_scope} do |*args, **kwargs, &block|
|
38
|
+
# ...
|
39
|
+
end
|
40
|
+
end
|
41
|
+
TEXT
|
42
|
+
|
43
|
+
super(message)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Support
|
5
|
+
module DependencyContainer
|
6
|
+
module Export
|
7
|
+
include Support::Concern
|
8
|
+
|
9
|
+
class_methods do
|
10
|
+
##
|
11
|
+
# @param full_name [String, Symbol]
|
12
|
+
# @param scope [:instance, :class]
|
13
|
+
# @param body [Proc]
|
14
|
+
# @return [ConvenientService::Support::DependencyContainer::Entities::Method]
|
15
|
+
#
|
16
|
+
def export(full_name, scope: Constants::DEFAULT_SCOPE, &body)
|
17
|
+
Entities::Method.new(full_name: full_name, scope: scope, body: body).tap { |method| exported_methods << method }
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# @return [ConvenientService::Support::DependencyContainer::Entities::MethodCollection]
|
22
|
+
#
|
23
|
+
def exported_methods
|
24
|
+
@exported_methods ||= Entities::MethodCollection.new
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Support
|
5
|
+
module DependencyContainer
|
6
|
+
module Import
|
7
|
+
include Support::Concern
|
8
|
+
|
9
|
+
class_methods do
|
10
|
+
##
|
11
|
+
# @param full_name [String, Symbol]
|
12
|
+
# @param from [Module]
|
13
|
+
# @param scope [:instance, :class]
|
14
|
+
# @param prepend [Boolean]
|
15
|
+
# @return [ConvenientService::Support::DependencyContainer::Entities::Method]
|
16
|
+
#
|
17
|
+
def import(full_name, from:, scope: Constants::DEFAULT_SCOPE, prepend: Constants::DEFAULT_PREPEND)
|
18
|
+
raise Errors::NotExportableModule.new(mod: from) unless Utils::Module.include_module?(from, DependencyContainer::Export)
|
19
|
+
|
20
|
+
method = from.exported_methods.find_by(full_name: full_name, scope: scope)
|
21
|
+
|
22
|
+
raise Errors::NotExportedMethod.new(method_name: full_name, method_scope: scope, mod: from) unless method
|
23
|
+
|
24
|
+
Commands::ImportMethod.call(importing_module: self, exporting_module: from, method: method, scope: scope, prepend: prepend)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "dependency_container/commands"
|
4
|
+
require_relative "dependency_container/constants"
|
5
|
+
require_relative "dependency_container/entities"
|
6
|
+
require_relative "dependency_container/errors"
|
7
|
+
|
8
|
+
require_relative "dependency_container/export"
|
9
|
+
require_relative "dependency_container/import"
|
@@ -34,7 +34,7 @@ module ConvenientService
|
|
34
34
|
# @return [RSpec::Core::Example, nil]
|
35
35
|
#
|
36
36
|
# @internal
|
37
|
-
# NOTE: Returns `nil` in
|
37
|
+
# NOTE: Returns `nil` in environments where RSpec is NOT fully loaded, e.g: irb, rails console, etc.
|
38
38
|
#
|
39
39
|
# `::RSpec.current_example` docs:
|
40
40
|
# - https://www.rubydoc.info/github/rspec/rspec-core/RSpec.current_example
|
@@ -42,7 +42,14 @@ module ConvenientService
|
|
42
42
|
# - https://relishapp.com/rspec/rspec-core/docs/metadata/current-example
|
43
43
|
#
|
44
44
|
def current_example
|
45
|
-
|
45
|
+
return unless loaded?
|
46
|
+
|
47
|
+
##
|
48
|
+
# NOTE: This happens in Ruby-only projects where RSpec is loaded by `Bundler.require`, not by `bundle exec rspec`.
|
49
|
+
#
|
50
|
+
return unless ::RSpec.respond_to?(:current_example)
|
51
|
+
|
52
|
+
::RSpec.current_example
|
46
53
|
end
|
47
54
|
end
|
48
55
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Support
|
5
|
+
class RawValue
|
6
|
+
##
|
7
|
+
# @param object [Object] Can be any type.
|
8
|
+
# @return [void]
|
9
|
+
#
|
10
|
+
def initialize(object)
|
11
|
+
@object = object
|
12
|
+
end
|
13
|
+
|
14
|
+
class << self
|
15
|
+
##
|
16
|
+
# @param object [Object] Can be any type.
|
17
|
+
# @return [ConvenientService::Support::RawValue]
|
18
|
+
#
|
19
|
+
def wrap(object)
|
20
|
+
new(object)
|
21
|
+
end
|
22
|
+
|
23
|
+
private :new
|
24
|
+
end
|
25
|
+
|
26
|
+
##
|
27
|
+
# @return [Object] Can be any type.
|
28
|
+
#
|
29
|
+
def unwrap
|
30
|
+
object
|
31
|
+
end
|
32
|
+
|
33
|
+
##
|
34
|
+
# @return [Boolean, nil]
|
35
|
+
#
|
36
|
+
def ==(other)
|
37
|
+
return unless other.instance_of?(self.class)
|
38
|
+
|
39
|
+
return false if object != other.object
|
40
|
+
|
41
|
+
true
|
42
|
+
end
|
43
|
+
|
44
|
+
protected
|
45
|
+
|
46
|
+
##
|
47
|
+
# @return [Object] Can be any type.
|
48
|
+
#
|
49
|
+
attr_reader :object
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative "support/not_passed"
|
3
4
|
require_relative "support/concern"
|
4
5
|
|
5
6
|
require_relative "support/abstract_method"
|
@@ -8,8 +9,10 @@ require_relative "support/castable"
|
|
8
9
|
require_relative "support/command"
|
9
10
|
require_relative "support/copyable"
|
10
11
|
require_relative "support/delegate"
|
12
|
+
require_relative "support/dependency_container"
|
11
13
|
require_relative "support/finite_loop"
|
12
14
|
require_relative "support/gems"
|
13
15
|
require_relative "support/middleware"
|
16
|
+
require_relative "support/raw_value"
|
14
17
|
require_relative "support/ruby"
|
15
18
|
require_relative "support/version"
|