solid-process 0.1.0 → 0.2.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/CHANGELOG.md +2 -0
- data/lib/solid/input.rb +3 -9
- data/lib/solid/model.rb +12 -2
- data/lib/solid/process/callbacks.rb +13 -19
- data/lib/solid/process/caller.rb +19 -15
- data/lib/solid/process/class_methods.rb +4 -12
- data/lib/solid/process/config.rb +35 -0
- data/lib/solid/process/version.rb +1 -1
- data/lib/solid/process.rb +73 -6
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d4b6ab233b8f225123d7a74114c281011f94f7a186faeaee54b3d25e9ba51c2e
|
4
|
+
data.tar.gz: 57a1de84e07d74971640ce4c03b1e12812d1da7765eb83b6ebb460e92972d1bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 378aff92aaacc388198e4c72a5ce0fb72df788b1dd7763d2b0f11024629c8988d95e4e52015393dddd4cfbd1116539f1c6f5e1a541422e296117a27e7a7e778b
|
7
|
+
data.tar.gz: 0040c63c885ff1177dd11c864d208a64c2b46dec1bee9bf71ea2e7df5ac2340668ac8e524c848c30b736457c3a64051e0084e01c3d401cf3bbaf1293959e6764
|
data/CHANGELOG.md
CHANGED
data/lib/solid/input.rb
CHANGED
@@ -1,13 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
require_relative "model"
|
5
|
-
|
6
|
-
def self.inherited(subclass)
|
7
|
-
subclass.include(::Solid::Model)
|
8
|
-
end
|
3
|
+
require_relative "model"
|
9
4
|
|
10
|
-
|
11
|
-
|
12
|
-
end
|
5
|
+
class Solid::Input
|
6
|
+
include ::Solid::Model
|
13
7
|
end
|
data/lib/solid/model.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
require_relative "model/access"
|
3
|
+
require_relative "model/access"
|
5
4
|
|
5
|
+
module Solid::Model
|
6
6
|
extend ::ActiveSupport::Concern
|
7
7
|
|
8
8
|
included do
|
@@ -14,6 +14,16 @@ module Solid::Model
|
|
14
14
|
include ::ActiveModel::Validations::Callbacks
|
15
15
|
end
|
16
16
|
|
17
|
+
module ClassMethods
|
18
|
+
def [](...)
|
19
|
+
new(...)
|
20
|
+
end
|
21
|
+
|
22
|
+
def inherited(subclass)
|
23
|
+
subclass.include(::Solid::Model)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
17
27
|
def inspect
|
18
28
|
"#<#{self.class.name} #{attributes.map { |k, v| "#{k}=#{v.inspect}" }.join(" ")}>"
|
19
29
|
end
|
@@ -5,37 +5,31 @@ class Solid::Process
|
|
5
5
|
def self.included(subclass)
|
6
6
|
subclass.include ActiveSupport::Callbacks
|
7
7
|
|
8
|
-
subclass.define_callbacks(:
|
8
|
+
subclass.define_callbacks(:call, :success, :failure)
|
9
9
|
|
10
10
|
subclass.extend ClassMethods
|
11
11
|
end
|
12
12
|
|
13
13
|
module ClassMethods
|
14
|
-
def
|
15
|
-
|
16
|
-
options = options.dup
|
17
|
-
options[:prepend] = true
|
18
|
-
|
19
|
-
set_callback(:success, :after, *args, options, &block)
|
14
|
+
def before_call(*filters, &block)
|
15
|
+
set_callback(:call, :before, *filters, &block)
|
20
16
|
end
|
21
17
|
|
22
|
-
def
|
23
|
-
|
24
|
-
options = options.dup
|
25
|
-
options[:prepend] = true
|
26
|
-
|
27
|
-
set_callback(:failure, :after, *args, options, &block)
|
18
|
+
def around_call(*filters, &block)
|
19
|
+
set_callback(:call, :around, *filters, &block)
|
28
20
|
end
|
29
21
|
|
30
|
-
def
|
31
|
-
|
32
|
-
|
33
|
-
options[:prepend] = true
|
22
|
+
def after_call(*filters, &block)
|
23
|
+
set_callback(:call, :after, *filters, &block)
|
24
|
+
end
|
34
25
|
|
35
|
-
|
26
|
+
def after_success(*filters, &block)
|
27
|
+
set_callback(:success, :after, *filters, &block)
|
36
28
|
end
|
37
29
|
|
38
|
-
|
30
|
+
def after_failure(*filters, &block)
|
31
|
+
set_callback(:failure, :after, *filters, &block)
|
32
|
+
end
|
39
33
|
end
|
40
34
|
end
|
41
35
|
end
|
data/lib/solid/process/caller.rb
CHANGED
@@ -1,31 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rubocop:disable Lint/RescueException
|
3
4
|
class Solid::Process
|
4
5
|
module Caller
|
5
6
|
def call(arg = nil)
|
6
|
-
if output?
|
7
|
-
|
8
|
-
|
9
|
-
end
|
7
|
+
output_already_set! if output?
|
8
|
+
|
9
|
+
self.input = arg
|
10
10
|
|
11
|
-
|
11
|
+
run_callbacks(:call) do
|
12
|
+
::BCDD::Result.event_logs(name: self.class.name) do
|
13
|
+
self.output =
|
14
|
+
if dependencies&.invalid?
|
15
|
+
Failure(:invalid_dependencies, dependencies: dependencies)
|
16
|
+
elsif input.invalid?
|
17
|
+
Failure(:invalid_input, input: input)
|
18
|
+
else
|
19
|
+
super(input.attributes.deep_symbolize_keys)
|
20
|
+
end
|
21
|
+
rescue ::Exception => exception
|
22
|
+
rescue_with_handler(exception) || raise
|
12
23
|
|
13
|
-
|
14
|
-
|
15
|
-
if dependencies&.invalid?
|
16
|
-
Failure(:invalid_dependencies, dependencies: dependencies)
|
17
|
-
elsif input.invalid?
|
18
|
-
Failure(:invalid_input, input: input)
|
19
|
-
else
|
20
|
-
super(input.attributes.deep_symbolize_keys)
|
21
|
-
end
|
24
|
+
output
|
25
|
+
end
|
22
26
|
end
|
23
27
|
|
24
28
|
run_callbacks(:success) if output.success?
|
25
29
|
run_callbacks(:failure) if output.failure?
|
26
|
-
run_callbacks(:output)
|
27
30
|
|
28
31
|
output
|
29
32
|
end
|
30
33
|
end
|
31
34
|
end
|
35
|
+
# rubocop:enable Lint/RescueException
|
@@ -5,11 +5,7 @@ class Solid::Process
|
|
5
5
|
def input=(klass)
|
6
6
|
const_defined?(:Input, false) and raise Error, "#{const_get(:Input, false)} class already defined"
|
7
7
|
|
8
|
-
|
9
|
-
raise ArgumentError, "#{klass.inspect} must be a class that includes #{::Solid::Model}"
|
10
|
-
end
|
11
|
-
|
12
|
-
const_set(:Input, klass)
|
8
|
+
const_set(:Input, Config::SolidModel[klass])
|
13
9
|
end
|
14
10
|
|
15
11
|
def input(&block)
|
@@ -17,7 +13,7 @@ class Solid::Process
|
|
17
13
|
|
18
14
|
block.nil? and raise Error, "#{self}::Input is undefined. Use #{self}.input { ... } to define it."
|
19
15
|
|
20
|
-
klass = ::Class.new(
|
16
|
+
klass = ::Class.new(Config.instance.input_class)
|
21
17
|
klass.class_eval(&block)
|
22
18
|
|
23
19
|
self.input = klass
|
@@ -26,11 +22,7 @@ class Solid::Process
|
|
26
22
|
def dependencies=(klass)
|
27
23
|
const_defined?(:Dependencies, false) and raise Error, "#{const_get(:Dependencies, false)} class already defined"
|
28
24
|
|
29
|
-
|
30
|
-
raise ArgumentError, "#{klass.inspect} must be a class that includes #{::Solid::Model}"
|
31
|
-
end
|
32
|
-
|
33
|
-
const_set(:Dependencies, klass)
|
25
|
+
const_set(:Dependencies, Config::SolidModel[klass])
|
34
26
|
end
|
35
27
|
|
36
28
|
def dependencies(&block)
|
@@ -38,7 +30,7 @@ class Solid::Process
|
|
38
30
|
|
39
31
|
return if block.nil?
|
40
32
|
|
41
|
-
klass = ::Class.new(
|
33
|
+
klass = ::Class.new(Config.instance.dependencies_class)
|
42
34
|
klass.class_eval(&block)
|
43
35
|
|
44
36
|
self.dependencies = klass
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Solid::Process
|
4
|
+
class Config
|
5
|
+
SolidModel = ->(klass) do
|
6
|
+
return klass if klass.is_a?(::Class) && klass < ::Solid::Model
|
7
|
+
|
8
|
+
raise ArgumentError, "#{klass.inspect} must be a class that includes #{::Solid::Model}"
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :input_class, :dependencies_class
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
self.input_class = ::Solid::Input
|
15
|
+
self.dependencies_class = ::Solid::Input
|
16
|
+
end
|
17
|
+
|
18
|
+
def input_class=(klass)
|
19
|
+
@input_class = SolidModel[klass]
|
20
|
+
end
|
21
|
+
|
22
|
+
def dependencies_class=(klass)
|
23
|
+
@dependencies_class = SolidModel[klass]
|
24
|
+
end
|
25
|
+
|
26
|
+
alias_method :deps_class, :dependencies_class
|
27
|
+
alias_method :deps_class=, :dependencies_class=
|
28
|
+
|
29
|
+
class << self
|
30
|
+
attr_reader :instance
|
31
|
+
end
|
32
|
+
|
33
|
+
@instance = new
|
34
|
+
end
|
35
|
+
end
|
data/lib/solid/process.rb
CHANGED
@@ -11,6 +11,7 @@ module Solid
|
|
11
11
|
class Process
|
12
12
|
require "solid/process/version"
|
13
13
|
require "solid/process/error"
|
14
|
+
require "solid/process/config"
|
14
15
|
require "solid/process/caller"
|
15
16
|
require "solid/process/callbacks"
|
16
17
|
require "solid/process/class_methods"
|
@@ -18,23 +19,46 @@ module Solid
|
|
18
19
|
|
19
20
|
extend ClassMethods
|
20
21
|
|
22
|
+
include Callbacks
|
23
|
+
include ::ActiveSupport::Rescuable
|
21
24
|
include ::BCDD::Context.mixin(config: {addon: {continue: true}})
|
22
25
|
|
23
26
|
def self.inherited(subclass)
|
27
|
+
super
|
28
|
+
|
24
29
|
subclass.prepend(Caller)
|
25
|
-
subclass.include(Callbacks)
|
26
30
|
end
|
27
31
|
|
28
32
|
def self.call(arg = nil)
|
29
33
|
new.call(arg)
|
30
34
|
end
|
31
35
|
|
32
|
-
|
36
|
+
def self.configuration(&block)
|
37
|
+
yield config
|
38
|
+
|
39
|
+
config.freeze
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.config
|
43
|
+
Config.instance
|
44
|
+
end
|
33
45
|
|
34
|
-
|
46
|
+
attr_reader :output, :input, :dependencies
|
35
47
|
|
36
48
|
def initialize(arg = nil)
|
37
|
-
self.dependencies =
|
49
|
+
self.dependencies = arg
|
50
|
+
end
|
51
|
+
|
52
|
+
def call(_arg = nil)
|
53
|
+
raise Error, "#{self.class}#call must be implemented."
|
54
|
+
end
|
55
|
+
|
56
|
+
def with(dependencies)
|
57
|
+
self.class.new(dependencies.with_indifferent_access.with_defaults(deps&.attributes))
|
58
|
+
end
|
59
|
+
|
60
|
+
def new(dependencies = {})
|
61
|
+
with(dependencies)
|
38
62
|
end
|
39
63
|
|
40
64
|
def input?
|
@@ -49,8 +73,12 @@ module Solid
|
|
49
73
|
!dependencies.nil?
|
50
74
|
end
|
51
75
|
|
52
|
-
def
|
53
|
-
|
76
|
+
def success?(type = nil)
|
77
|
+
!!output&.success?(type)
|
78
|
+
end
|
79
|
+
|
80
|
+
def failure?(type = nil)
|
81
|
+
!!output&.failure?(type)
|
54
82
|
end
|
55
83
|
|
56
84
|
def inspect
|
@@ -69,5 +97,44 @@ module Solid
|
|
69
97
|
alias_method :deps?, :dependencies?
|
70
98
|
alias_method :result, :output
|
71
99
|
alias_method :result?, :output?
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
def dependencies=(arg)
|
104
|
+
raise Error, "The `#{self.class}#dependencies` is already set." unless dependencies.nil?
|
105
|
+
|
106
|
+
@dependencies = self.class.dependencies&.then { arg.instance_of?(_1) ? arg : _1.new(arg) }
|
107
|
+
end
|
108
|
+
|
109
|
+
def input=(arg)
|
110
|
+
raise Error, "The `#{self.class}#input` is already set." unless input.nil?
|
111
|
+
|
112
|
+
@input = self.class.input.then { arg.instance_of?(_1) ? arg : _1.new(arg) }
|
113
|
+
end
|
114
|
+
|
115
|
+
def output_already_set!
|
116
|
+
raise Error, "The `#{self.class}#output` is already set. " \
|
117
|
+
"Use `.output` to access the result or create a new instance to call again."
|
118
|
+
end
|
119
|
+
|
120
|
+
def output=(result)
|
121
|
+
output_already_set! unless output.nil?
|
122
|
+
|
123
|
+
raise Error, "The result #{result.inspect} must be a BCDD::Context." unless result.is_a?(::BCDD::Context)
|
124
|
+
|
125
|
+
@output = result
|
126
|
+
end
|
127
|
+
|
128
|
+
def Success!(...)
|
129
|
+
return self.output = Success(...) if output.nil?
|
130
|
+
|
131
|
+
raise Error, "`Success!()` cannot be called because the `#{self.class}#output` is already set."
|
132
|
+
end
|
133
|
+
|
134
|
+
def Failure!(...)
|
135
|
+
return self.output = Failure(...) if output.nil?
|
136
|
+
|
137
|
+
raise Error, "`Failure!()` cannot be called because the `#{self.class}#output` is already set."
|
138
|
+
end
|
72
139
|
end
|
73
140
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solid-process
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rodrigo Serradura
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-03-
|
11
|
+
date: 2024-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bcdd-result
|
@@ -92,6 +92,7 @@ files:
|
|
92
92
|
- lib/solid/process/callbacks.rb
|
93
93
|
- lib/solid/process/caller.rb
|
94
94
|
- lib/solid/process/class_methods.rb
|
95
|
+
- lib/solid/process/config.rb
|
95
96
|
- lib/solid/process/error.rb
|
96
97
|
- lib/solid/process/version.rb
|
97
98
|
- lib/solid/result.rb
|