light-services 2.0.0.rc4 → 2.0.0.rc6
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/Gemfile.lock +1 -1
- data/lib/light/services/base.rb +7 -3
- data/lib/light/services/base_with_context.rb +5 -1
- data/lib/light/services/class_based_collection/base.rb +0 -2
- data/lib/light/services/message.rb +29 -0
- data/lib/light/services/messages.rb +30 -29
- data/lib/light/services/settings/argument.rb +18 -1
- data/lib/light/services/settings/step.rb +1 -5
- data/lib/light/services/version.rb +1 -1
- 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: 06c568f730742de7555fcdccd76689a7ae983dbc97880935b2587439f1707d29
|
4
|
+
data.tar.gz: 48ad82deadfae1e28300aea79fdb6b220f3c2a29e4e082419cb43743aebfda15
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e55a6a1b112d794368d08c4c487734613e24d8fbf1ec5d9b097f0cba22148f37325053db5568a9715ab0d1c8ba3abb22b5762657e5b838048fe6e4c11a6cb6ec
|
7
|
+
data.tar.gz: 84ffbca0ddfade25831c0b2c7597455200a98149e6a2e102923ec9298faa4d0486a97c5b06d2d2e0a974cb47a43feb84bc4748ee3bda3aec5731b5ff132bd089
|
data/Gemfile.lock
CHANGED
data/lib/light/services/base.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "light/services/message"
|
3
4
|
require "light/services/messages"
|
4
5
|
require "light/services/base_with_context"
|
5
6
|
|
@@ -92,9 +93,12 @@ module Light
|
|
92
93
|
end
|
93
94
|
|
94
95
|
class << self
|
95
|
-
|
96
|
-
|
97
|
-
|
96
|
+
def run(args = {}, config = {})
|
97
|
+
new(args, config).tap(&:call)
|
98
|
+
end
|
99
|
+
|
100
|
+
def run!(args = {})
|
101
|
+
run(args, raise_on_error: true)
|
98
102
|
end
|
99
103
|
|
100
104
|
def with(service_or_config = {}, config = {})
|
@@ -14,11 +14,15 @@ module Light
|
|
14
14
|
raise Light::Services::ArgTypeError, "#{parent_service.class} - must be a subclass of Light::Services::Base"
|
15
15
|
end
|
16
16
|
|
17
|
-
# TODO: Create `run!`
|
18
17
|
def run(args = {})
|
19
18
|
@service_class.new(extend_arguments(args), @config, @parent_service).tap(&:call)
|
20
19
|
end
|
21
20
|
|
21
|
+
def run!(args = {})
|
22
|
+
@config[:raise_on_error] = true
|
23
|
+
run(args)
|
24
|
+
end
|
25
|
+
|
22
26
|
private
|
23
27
|
|
24
28
|
def extend_arguments(args)
|
@@ -63,14 +63,12 @@ module Light
|
|
63
63
|
|
64
64
|
def validate_name!(klass, name)
|
65
65
|
if !@allow_redefine && all(klass).key?(name)
|
66
|
-
# TODO: Update error class
|
67
66
|
raise Light::Services::Error, "#{@item_class} with name `#{name}` already exists in service #{klass}"
|
68
67
|
end
|
69
68
|
end
|
70
69
|
|
71
70
|
def validate_opts!(klass, name, opts)
|
72
71
|
if opts[:before] && opts[:after]
|
73
|
-
# TODO: Update error class
|
74
72
|
raise Light::Services::Error, "You cannot specify `before` and `after` " \
|
75
73
|
"for #{@item_class} `#{name}` in service #{klass} at the same time"
|
76
74
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This class stores errors and warnings
|
4
|
+
module Light
|
5
|
+
module Services
|
6
|
+
class Message
|
7
|
+
# Getters
|
8
|
+
attr_reader :key, :text
|
9
|
+
|
10
|
+
def initialize(key, text, opts = {})
|
11
|
+
@key = key
|
12
|
+
@text = text
|
13
|
+
@opts = opts
|
14
|
+
end
|
15
|
+
|
16
|
+
def break?
|
17
|
+
@opts[:break]
|
18
|
+
end
|
19
|
+
|
20
|
+
def rollback?
|
21
|
+
@opts[:rollback]
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
text
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -10,13 +10,21 @@ module Light
|
|
10
10
|
@messages = {}
|
11
11
|
end
|
12
12
|
|
13
|
-
def add(key,
|
14
|
-
|
15
|
-
@messages[key] += [*message]
|
13
|
+
def add(key, text, opts = {})
|
14
|
+
raise Light::Services::Error, "Error text can't be blank" if !text || text.blank?
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
message = nil
|
17
|
+
|
18
|
+
[*text].each do |text|
|
19
|
+
message = text.is_a?(Message) ? text : Message.new(key, text, opts)
|
20
|
+
|
21
|
+
@messages[key] ||= []
|
22
|
+
@messages[key] << message
|
23
|
+
end
|
24
|
+
|
25
|
+
raise!(message)
|
26
|
+
break!(opts.key?(:break) ? opts[:break] : message.break?)
|
27
|
+
rollback!(opts.key?(:rollback) ? opts[:rollback] : message.rollback?) if !opts.key?(:last) || opts[:last]
|
20
28
|
end
|
21
29
|
|
22
30
|
def break?
|
@@ -26,47 +34,40 @@ module Light
|
|
26
34
|
def copy_from(entity, opts = {})
|
27
35
|
if defined?(ActiveRecord::Base) && entity.is_a?(ActiveRecord::Base)
|
28
36
|
copy_from(entity.errors.messages, opts)
|
37
|
+
elsif entity.is_a?(Light::Services::Base)
|
38
|
+
copy_from(entity.errors, opts)
|
29
39
|
elsif entity.respond_to?(:each)
|
30
40
|
last_index = entity.size - 1
|
31
41
|
|
32
42
|
entity.each_with_index do |(key, message), index|
|
33
|
-
add(key, message, opts
|
43
|
+
add(key, message, opts.merge(last: index == last_index))
|
34
44
|
end
|
35
45
|
else
|
36
|
-
|
37
|
-
raise Light::Services::Error
|
46
|
+
raise Light::Services::Error, "Don't know how to import errors from #{entity}"
|
38
47
|
end
|
39
48
|
end
|
40
49
|
|
41
50
|
def copy_to(entity)
|
42
|
-
if defined?(ActiveRecord::Base) && entity.is_a?(ActiveRecord::Base)
|
43
|
-
each do |key,
|
44
|
-
|
51
|
+
if defined?(ActiveRecord::Base) && entity.is_a?(ActiveRecord::Base) || entity.is_a?(Light::Services::Base)
|
52
|
+
each do |key, messages|
|
53
|
+
messages.each do |message|
|
54
|
+
entity.errors.add(key, message.to_s)
|
55
|
+
end
|
45
56
|
end
|
46
57
|
elsif entity.is_a?(Hash)
|
47
|
-
each do |key,
|
58
|
+
each do |key, messages|
|
48
59
|
entity[key] ||= []
|
49
|
-
entity[key]
|
60
|
+
entity[key] += messages.map(&:to_s)
|
50
61
|
end
|
51
62
|
else
|
52
|
-
|
53
|
-
raise Light::Services::Error
|
63
|
+
raise Light::Services::Error, "Don't know how to export errors to #{entity}"
|
54
64
|
end
|
55
65
|
|
56
66
|
entity
|
57
67
|
end
|
58
68
|
|
59
|
-
def
|
60
|
-
|
61
|
-
# TODO: Update error
|
62
|
-
raise Light::Services::Error
|
63
|
-
end
|
64
|
-
|
65
|
-
errors.each do |key, message|
|
66
|
-
record.errors.add(key, message)
|
67
|
-
end
|
68
|
-
|
69
|
-
record
|
69
|
+
def to_h
|
70
|
+
@messages.to_h.map { |key, value| [key, value.map(&:to_s)] }.to_h
|
70
71
|
end
|
71
72
|
|
72
73
|
def method_missing(method, *args, &block)
|
@@ -89,10 +90,10 @@ module Light
|
|
89
90
|
@break = true
|
90
91
|
end
|
91
92
|
|
92
|
-
def raise!(
|
93
|
+
def raise!(message)
|
93
94
|
return unless @config[:raise_on_add]
|
94
95
|
|
95
|
-
raise Light::Services::Error, "#{key.to_s.capitalize} #{message}"
|
96
|
+
raise Light::Services::Error, "#{message.key.to_s.capitalize} #{message}"
|
96
97
|
end
|
97
98
|
|
98
99
|
def rollback!(rollback)
|
@@ -6,7 +6,7 @@ module Light
|
|
6
6
|
module Settings
|
7
7
|
class Argument
|
8
8
|
# Getters
|
9
|
-
attr_reader :name, :default_exists, :default, :context, :optional
|
9
|
+
attr_reader :name, :default_exists, :default, :context, :optional, :arg_types_cache
|
10
10
|
|
11
11
|
def initialize(name, service_class, opts = {})
|
12
12
|
@name = name
|
@@ -18,6 +18,8 @@ module Light
|
|
18
18
|
@default = opts.delete(:default)
|
19
19
|
@optional = opts.delete(:optional)
|
20
20
|
|
21
|
+
@arg_types_cache = {}
|
22
|
+
|
21
23
|
define_methods
|
22
24
|
end
|
23
25
|
|
@@ -25,6 +27,8 @@ module Light
|
|
25
27
|
return if !@type || [*@type].any? do |type|
|
26
28
|
if type == :boolean
|
27
29
|
value.is_a?(TrueClass) || value.is_a?(FalseClass)
|
30
|
+
elsif type.is_a?(Symbol)
|
31
|
+
arg_type(value) == type
|
28
32
|
else
|
29
33
|
value.is_a?(type)
|
30
34
|
end
|
@@ -36,6 +40,19 @@ module Light
|
|
36
40
|
|
37
41
|
private
|
38
42
|
|
43
|
+
def arg_type(value)
|
44
|
+
klass = value.class
|
45
|
+
|
46
|
+
@arg_types_cache[klass] ||= klass
|
47
|
+
.name
|
48
|
+
.gsub(/::/, '/')
|
49
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
50
|
+
.gsub(/([a-z\d])([A-Z])/,'\1_\2')
|
51
|
+
.tr("-", "_")
|
52
|
+
.downcase
|
53
|
+
.to_sym
|
54
|
+
end
|
55
|
+
|
39
56
|
def define_methods
|
40
57
|
name = @name
|
41
58
|
|
@@ -20,10 +20,6 @@ module Light
|
|
20
20
|
raise Light::Services::TwoConditions, "#{service_class} `if` and `unless` cannot be specified " \
|
21
21
|
"for the step `#{name}` at the same time"
|
22
22
|
end
|
23
|
-
|
24
|
-
if @always && (@if || @unless)
|
25
|
-
raise Light::Services::Error, "#{service_class} `always` cannot be combined with `if` and `unless`"
|
26
|
-
end
|
27
23
|
end
|
28
24
|
|
29
25
|
def run(instance, benchmark: false)
|
@@ -65,7 +61,7 @@ module Light
|
|
65
61
|
when Symbol
|
66
62
|
instance.send(condition)
|
67
63
|
when Proc
|
68
|
-
condition
|
64
|
+
instance.instance_exec(&condition)
|
69
65
|
else
|
70
66
|
raise Light::Services::Error, "#{@service_class} condition should be a Symbol or Proc " \
|
71
67
|
"for the step `#{@name}` (currently: #{condition.class})"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: light-services
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.rc6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Emelianenko
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-20 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Powerful implementation of Service Object pattern for Ruby and Rails
|
14
14
|
email:
|
@@ -41,6 +41,7 @@ files:
|
|
41
41
|
- lib/light/services/collection/outputs.rb
|
42
42
|
- lib/light/services/config.rb
|
43
43
|
- lib/light/services/exceptions.rb
|
44
|
+
- lib/light/services/message.rb
|
44
45
|
- lib/light/services/messages.rb
|
45
46
|
- lib/light/services/settings/argument.rb
|
46
47
|
- lib/light/services/settings/output.rb
|