light-services 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "5.1.3"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,150 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ light-services (0.5.0)
5
+ rails (> 4.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ actioncable (5.1.3)
11
+ actionpack (= 5.1.3)
12
+ nio4r (~> 2.0)
13
+ websocket-driver (~> 0.6.1)
14
+ actionmailer (5.1.3)
15
+ actionpack (= 5.1.3)
16
+ actionview (= 5.1.3)
17
+ activejob (= 5.1.3)
18
+ mail (~> 2.5, >= 2.5.4)
19
+ rails-dom-testing (~> 2.0)
20
+ actionpack (5.1.3)
21
+ actionview (= 5.1.3)
22
+ activesupport (= 5.1.3)
23
+ rack (~> 2.0)
24
+ rack-test (~> 0.6.3)
25
+ rails-dom-testing (~> 2.0)
26
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
27
+ actionview (5.1.3)
28
+ activesupport (= 5.1.3)
29
+ builder (~> 3.1)
30
+ erubi (~> 1.4)
31
+ rails-dom-testing (~> 2.0)
32
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
33
+ activejob (5.1.3)
34
+ activesupport (= 5.1.3)
35
+ globalid (>= 0.3.6)
36
+ activemodel (5.1.3)
37
+ activesupport (= 5.1.3)
38
+ activerecord (5.1.3)
39
+ activemodel (= 5.1.3)
40
+ activesupport (= 5.1.3)
41
+ arel (~> 8.0)
42
+ activesupport (5.1.3)
43
+ concurrent-ruby (~> 1.0, >= 1.0.2)
44
+ i18n (~> 0.7)
45
+ minitest (~> 5.1)
46
+ tzinfo (~> 1.1)
47
+ appraisal (2.2.0)
48
+ bundler
49
+ rake
50
+ thor (>= 0.14.0)
51
+ arel (8.0.0)
52
+ builder (3.2.3)
53
+ codeclimate-test-reporter (1.0.8)
54
+ simplecov (<= 0.13)
55
+ concurrent-ruby (1.0.5)
56
+ diff-lcs (1.3)
57
+ docile (1.1.5)
58
+ erubi (1.6.1)
59
+ globalid (0.4.0)
60
+ activesupport (>= 4.2.0)
61
+ i18n (0.8.6)
62
+ json (1.8.6)
63
+ loofah (2.0.3)
64
+ nokogiri (>= 1.5.9)
65
+ mail (2.6.6)
66
+ mime-types (>= 1.16, < 4)
67
+ method_source (0.8.2)
68
+ mime-types (3.1)
69
+ mime-types-data (~> 3.2015)
70
+ mime-types-data (3.2016.0521)
71
+ mini_portile2 (2.2.0)
72
+ minitest (5.10.3)
73
+ nio4r (2.1.0)
74
+ nokogiri (1.8.0)
75
+ mini_portile2 (~> 2.2.0)
76
+ rack (2.0.3)
77
+ rack-test (0.6.3)
78
+ rack (>= 1.0)
79
+ rails (5.1.3)
80
+ actioncable (= 5.1.3)
81
+ actionmailer (= 5.1.3)
82
+ actionpack (= 5.1.3)
83
+ actionview (= 5.1.3)
84
+ activejob (= 5.1.3)
85
+ activemodel (= 5.1.3)
86
+ activerecord (= 5.1.3)
87
+ activesupport (= 5.1.3)
88
+ bundler (>= 1.3.0)
89
+ railties (= 5.1.3)
90
+ sprockets-rails (>= 2.0.0)
91
+ rails-dom-testing (2.0.3)
92
+ activesupport (>= 4.2.0)
93
+ nokogiri (>= 1.6)
94
+ rails-html-sanitizer (1.0.3)
95
+ loofah (~> 2.0)
96
+ railties (5.1.3)
97
+ actionpack (= 5.1.3)
98
+ activesupport (= 5.1.3)
99
+ method_source
100
+ rake (>= 0.8.7)
101
+ thor (>= 0.18.1, < 2.0)
102
+ rake (10.5.0)
103
+ rspec (3.6.0)
104
+ rspec-core (~> 3.6.0)
105
+ rspec-expectations (~> 3.6.0)
106
+ rspec-mocks (~> 3.6.0)
107
+ rspec-core (3.6.0)
108
+ rspec-support (~> 3.6.0)
109
+ rspec-expectations (3.6.0)
110
+ diff-lcs (>= 1.2.0, < 2.0)
111
+ rspec-support (~> 3.6.0)
112
+ rspec-mocks (3.6.0)
113
+ diff-lcs (>= 1.2.0, < 2.0)
114
+ rspec-support (~> 3.6.0)
115
+ rspec-support (3.6.0)
116
+ simplecov (0.11.2)
117
+ docile (~> 1.1.0)
118
+ json (~> 1.8)
119
+ simplecov-html (~> 0.10.0)
120
+ simplecov-html (0.10.2)
121
+ sprockets (3.7.1)
122
+ concurrent-ruby (~> 1.0)
123
+ rack (> 1, < 3)
124
+ sprockets-rails (3.2.0)
125
+ actionpack (>= 4.0)
126
+ activesupport (>= 4.0)
127
+ sprockets (>= 3.0.0)
128
+ thor (0.20.0)
129
+ thread_safe (0.3.6)
130
+ tzinfo (1.2.3)
131
+ thread_safe (~> 0.1)
132
+ websocket-driver (0.6.5)
133
+ websocket-extensions (>= 0.1.0)
134
+ websocket-extensions (0.1.2)
135
+
136
+ PLATFORMS
137
+ ruby
138
+
139
+ DEPENDENCIES
140
+ appraisal (~> 2.1)
141
+ bundler (~> 1.12)
142
+ codeclimate-test-reporter
143
+ light-services!
144
+ rails (= 5.1.3)
145
+ rake (~> 10.0)
146
+ rspec (~> 3.0)
147
+ simplecov (~> 0.11.2)
148
+
149
+ BUNDLED WITH
150
+ 1.15.4
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Light
2
4
  module Services
3
5
  class Base
4
6
  # Includes
5
7
  include Light::Services::Parameters
8
+ include Light::Services::Outputs
6
9
  include Light::Services::Callbacks
7
10
 
8
11
  # Getters
@@ -32,9 +35,7 @@ module Light
32
35
 
33
36
  class << self
34
37
  def call(args = {})
35
- service = new(args)
36
- service.call
37
- service
38
+ new(args).tap(&:call)
38
39
  end
39
40
 
40
41
  alias run call
@@ -49,7 +50,7 @@ module Light
49
50
  run_callbacks(:before)
50
51
  run if success?
51
52
  run_callbacks(:after) if success?
52
- run_callbacks(:finally, break: false)
53
+ run_callbacks(:finally, force_run: true)
53
54
  success?
54
55
  end
55
56
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Light
2
4
  module Services
3
5
  module Callbacks
@@ -12,32 +14,33 @@ module Light
12
14
 
13
15
  private
14
16
 
15
- def run_callbacks(type, opts = {})
16
- opts[:break] = true unless opts.key?(:break)
17
-
18
- callbacks = (self.class.callbacks || []).select { |callback| callback[:type] == type }
19
- callbacks.each do |callback|
20
- break if !success? && opts[:break]
21
- send(callback[:method])
17
+ def run_callbacks(type, options = {})
18
+ callbacks_by(type).each do |callback|
19
+ break if !success? && !options[:force_run]
20
+ send(callback[:method_name])
22
21
  end
23
22
  end
24
23
 
24
+ def callbacks_by(type)
25
+ (self.class.callbacks || []).select { |callback| callback[:type] == type }
26
+ end
27
+
25
28
  module ClassMethods
26
- def before(method)
27
- set_callback(:before, method)
29
+ def before(method_name)
30
+ set_callback(:before, method_name)
28
31
  end
29
32
 
30
- def after(method)
31
- set_callback(:after, method)
33
+ def after(method_name)
34
+ set_callback(:after, method_name)
32
35
  end
33
36
 
34
- def finally(method)
35
- set_callback(:finally, method)
37
+ def finally(method_name)
38
+ set_callback(:finally, method_name)
36
39
  end
37
40
 
38
- def set_callback(type, method)
41
+ def set_callback(type, method_name)
39
42
  self.callbacks ||= []
40
- self.callbacks << { type: type, method: method }
43
+ self.callbacks << { type: type, method_name: method_name }
41
44
  end
42
45
  end
43
46
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Light
2
4
  module Services
3
5
  class Error < StandardError; end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Light
2
4
  module Services
3
5
  class Messages
@@ -6,8 +8,8 @@ module Light
6
8
  end
7
9
 
8
10
  def add(key, message)
9
- @storage[key] ||= []
10
- @storage[key] << message
11
+ storage[key] ||= []
12
+ storage[key] << message
11
13
  end
12
14
 
13
15
  def from_record(record)
@@ -17,11 +19,11 @@ module Light
17
19
  end
18
20
 
19
21
  def delete(key)
20
- @storage.delete(key)
22
+ storage.delete(key)
21
23
  end
22
24
 
23
25
  def blank?
24
- @storage.empty?
26
+ storage.empty?
25
27
  end
26
28
 
27
29
  def any?
@@ -29,9 +31,11 @@ module Light
29
31
  end
30
32
 
31
33
  def to_hash
32
- @storage
34
+ storage
33
35
  end
34
36
 
37
+ alias to_h to_hash
38
+
35
39
  private
36
40
 
37
41
  # Getters/Setters
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Light
4
+ module Services
5
+ module Outputs
6
+ def self.included(base)
7
+ base.extend ClassMethods
8
+ base.class_eval do
9
+ class << self
10
+ attr_accessor :outputs
11
+ end
12
+ end
13
+ end
14
+
15
+ # Getters
16
+ attr_reader :outputs
17
+
18
+ private
19
+
20
+ # Setters
21
+ attr_writer :outputs
22
+
23
+ def initialize_outputs
24
+ self.outputs = {}
25
+
26
+ (self.class.outputs || []).each do |options|
27
+ store_output(options)
28
+ end
29
+
30
+ generate_outputs_methods
31
+ end
32
+
33
+ def store_output(options)
34
+ output_name = options[:name]
35
+ output_value = options[:value]
36
+
37
+ outputs[output_name] = output_value
38
+ end
39
+
40
+ def generate_outputs_methods
41
+ outputs.keys.each do |output_name|
42
+ define_singleton_method output_name do
43
+ outputs[output_name]
44
+ end
45
+
46
+ define_singleton_method "#{output_name}=" do |value|
47
+ outputs[output_name] = value
48
+ end
49
+ end
50
+ end
51
+
52
+ module ClassMethods
53
+ def output(name, value = nil, options = {})
54
+ self.outputs ||= []
55
+ self.outputs << {
56
+ name: name,
57
+ value: value,
58
+ public: options.fetch(:private, false)
59
+ }
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Light
2
4
  module Services
3
5
  module Parameters
@@ -6,72 +8,69 @@ module Light
6
8
  base.class_eval do
7
9
  class << self
8
10
  attr_accessor :parameters
9
- attr_accessor :outputs
10
11
  end
11
12
  end
12
13
  end
13
14
 
14
- def parameters
15
- @parameters_storage.to_hash
16
- end
17
-
18
- def outputs
19
- @outputs_storage.to_hash
20
- end
15
+ # Getters
16
+ attr_reader :parameters
21
17
 
22
18
  private
23
19
 
20
+ # Setters
21
+ attr_writer :parameters
22
+
24
23
  def initialize_params
25
- @parameters_storage = Light::Services::Variables.new
24
+ self.parameters = {}
26
25
 
27
26
  (self.class.parameters || []).each do |options|
28
- # Raise exception if parameter not exist
29
- if !args.key?(options[:name]) && options[:required] && !options[:allow_nil]
30
- raise Light::Services::ParamRequired, "Parameter \"#{options[:name]}\" is required"
31
- end
27
+ validate_parameter(options)
28
+ store_parameter(options)
29
+ end
32
30
 
33
- # Load parameter value
34
- value = args[options[:name]]
31
+ generate_parameters_methods
32
+ end
35
33
 
36
- # Check type of parameter
37
- wrong_type = options[:type] && !options[:type].include?(value.class)
38
- not_allow_nil = !options[:allow_nil] || (options[:allow_nil] && !value.nil?)
34
+ def validate_parameter(options)
35
+ if parameter_required?(options)
36
+ raise Light::Services::ParamRequired, "Parameter \"#{options[:name]}\" is required"
37
+ end
39
38
 
40
- if wrong_type && not_allow_nil
41
- raise Light::Services::ParamType, "Type of \"#{options[:name]}\" must be \"#{options[:type]}\""
42
- end
39
+ return unless parameter_wrong_type?(options)
43
40
 
44
- # Create instance variable and getter
45
- @parameters_storage.add(options[:name], value)
41
+ raise Light::Services::ParamType, "Type of \"#{options[:name]}\" must be \"#{options[:type]}\""
42
+ end
46
43
 
47
- define_singleton_method options[:name] do
48
- @parameters_storage.get(options[:name])
49
- end
44
+ def parameter_required?(options)
45
+ !args.key?(options[:name]) && options[:required] && !options[:allow_nil]
46
+ end
50
47
 
51
- define_singleton_method "#{options[:name]}=" do |val|
52
- @parameters_storage.add(options[:name], val)
53
- end
54
- end
48
+ def parameter_wrong_type?(options)
49
+ value = args[options[:name]]
50
+
51
+ wrong_type = options[:type] && !options[:type].include?(value.class)
52
+ not_allow_nil = !options[:allow_nil] || (options[:allow_nil] && !value.nil?)
55
53
 
56
- @parameters_storage
54
+ wrong_type && not_allow_nil
57
55
  end
58
56
 
59
- def initialize_outputs
60
- @outputs_storage = Light::Services::Variables.new
57
+ def store_parameter(options)
58
+ parameter_name = options[:name]
59
+ parameter_value = args[parameter_name]
61
60
 
62
- (self.class.outputs || []).each do |options|
63
- @outputs_storage.add(options[:name], options[:value])
61
+ parameters[parameter_name] = parameter_value
62
+ end
64
63
 
65
- define_singleton_method options[:name] do
66
- @outputs_storage.get(options[:name])
64
+ def generate_parameters_methods
65
+ parameters.keys.each do |parameter_name|
66
+ define_singleton_method parameter_name do
67
+ parameters[parameter_name]
67
68
  end
68
69
 
69
- define_singleton_method "#{options[:name]}=" do |value|
70
- @outputs_storage.add(options[:name], value)
70
+ define_singleton_method "#{parameter_name}=" do |value|
71
+ parameters[parameter_name] = value
71
72
  end
72
73
  end
73
-
74
- @outputs_storage
75
74
  end
76
75
 
77
76
  module ClassMethods
@@ -85,15 +84,6 @@ module Light
85
84
  allow_nil: options.fetch(:allow_nil, false)
86
85
  }
87
86
  end
88
-
89
- def output(name, value = nil, options = {})
90
- self.outputs ||= []
91
- self.outputs << {
92
- name: name,
93
- value: value,
94
- public: options.fetch(:private, false)
95
- }
96
- end
97
87
  end
98
88
  end
99
89
  end