light_operations 0.0.1 → 0.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3d66e8c5f9729b8c5d261eab885164317a64619f
4
- data.tar.gz: aec76cd8d6088dfbcafee5e1eb607d58cd30d901
3
+ metadata.gz: db2c6c8440e6a48a6ef168af4a7b545132437356
4
+ data.tar.gz: 575327c90f66617d35a9954efe5870403695faf2
5
5
  SHA512:
6
- metadata.gz: 51a815033d9623f4e3b70087e6a9b85e70a1a982dcafadd92676b415037fd604daddffa02a6f132121591b7f54a6d7f1406288e6eb311395341275f7fb783242
7
- data.tar.gz: ee0e5dc1efa1f059421fc5fca252e78da16e5a07345decac4c7fd091f4cb69d2d95e0388f9422f024e12069737f09e32eb66124f603a6102e8dc8d18a7633e69
6
+ metadata.gz: 84d0758c75019a861344f0ad49ffc2283af17c21aa8c385e84b54eaee2d15f6d746897f65e364527dbf7c8a055261f58aa294212124e30917cd795baab2ab895
7
+ data.tar.gz: b78d2ae0b6f0776491cc0725c24f543e142e11e2d39814dbcf21fb83beaa5768793ad3408d3b8c4704c6e828aa840b3c3284476bd8e0bd6a360698350355d075
data/.rubocop.yml CHANGED
@@ -45,3 +45,4 @@ Metrics/LineLength:
45
45
  AllCops:
46
46
  Exclude:
47
47
  - '**/Guardfile'
48
+ - '**/light_operations.gemspec'
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # LightOperations
2
2
 
3
- TODO: Write a gem description
3
+ When you want have slim controllers or some logic with several operations
4
+ this gem could help you to have nice separated and clan code. CAN HELP YOU! :D
4
5
 
5
6
  ## Installation
6
7
 
@@ -20,7 +21,142 @@ Or install it yourself as:
20
21
 
21
22
  ## Usage
22
23
 
23
- TODO: Write usage instructions here
24
+
25
+ ### Uses cases
26
+
27
+ #### Simple case when you want have user authorization
28
+
29
+ Operation
30
+
31
+ ```ruby
32
+ class AuthOperation < LightOperations::Core
33
+ rescue_from AuthFail, with: :on_auth_error
34
+
35
+ def execute
36
+ dependency(:auth_service).login(login: login, password: password)
37
+ end
38
+
39
+ def on_auth_error(_exception)
40
+ fail!([login: 'unknown']) # or subject.errors.add(login: 'unknown')
41
+ end
42
+
43
+ def login
44
+ params.fetch(:login)
45
+ end
46
+
47
+ def password
48
+ params.fetch(:password)
49
+ end
50
+ end
51
+ ```
52
+
53
+ Controller way #1
54
+
55
+ ```ruby
56
+ class AuthController < ApplicationController
57
+ def new
58
+ render :new, locals: { account: Account.new }
59
+ end
60
+
61
+ def create
62
+ auth_op
63
+ .run
64
+ .bind_with(self)
65
+ .on_success(:create_session_with_dashbord_redirection)
66
+ .on_fail(:render_account_with_errors)
67
+ end
68
+
69
+ private
70
+
71
+ def create_session_with_dashbord_redirection(account)
72
+ session_create_for(account)
73
+ redirect_to :dashboard
74
+ end
75
+
76
+ def render_account_with_errors(account, _errors)
77
+ render :new, locals: { account: account }
78
+ end
79
+
80
+ def auth_op
81
+ @auth_op ||= AuthOperation.new(params, auth_service: auth_service)
82
+ end
83
+
84
+ def auth_service
85
+ @auth_service ||= AuthService.new
86
+ end
87
+ end
88
+ ```
89
+
90
+ Controller way #2
91
+
92
+ ```ruby
93
+ class AuthController < ApplicationController
94
+ def new
95
+ render :new, locals: { account: Account.new }
96
+ end
97
+
98
+ def create
99
+ auth_op
100
+ .run
101
+ .on_success{ |account| create_session_with_dashbord_redirection(account) }
102
+ .on_fail { |account, _errors| render :new, locals: { account: account } }
103
+ end
104
+
105
+ private
106
+
107
+ def create_session_with_dashbord_redirection(account)
108
+ session_create_for(account)
109
+ redirect_to :dashboard
110
+ end
111
+
112
+ def auth_op
113
+ @auth_op ||= AuthOperation.new(params, auth_service: auth_service)
114
+ end
115
+
116
+ def auth_service
117
+ @auth_service ||= AuthService.new
118
+ end
119
+ end
120
+ ```
121
+
122
+ Controller way #3
123
+
124
+ ```ruby
125
+ class AuthController < ApplicationController
126
+ def new
127
+ render :new, locals: { account: Account.new }
128
+ end
129
+
130
+ def create
131
+ auth_op.run.on_success(&go_to_dashboard).on_fail(&go_to_login)
132
+ end
133
+
134
+ private
135
+
136
+ def go_to_dashboard
137
+ -> (account) do
138
+ session_create_for(account)
139
+ redirect_to :dashboard
140
+ end
141
+ end
142
+
143
+ def go_to_login
144
+ -> (account, _errors) { render :new, locals: { account: account } }
145
+ end
146
+
147
+ def auth_op
148
+ @auth_op ||= AuthOperation.new(params, auth_service: auth_service)
149
+ end
150
+
151
+ def auth_service
152
+ @auth_service ||= AuthService.new
153
+ end
154
+ end
155
+ ```
156
+
157
+ When operation status is most importent we can simply use `#success?` or `#fail?` on the executed operation
158
+
159
+ Errors are available by `#errors` after operation is executed
24
160
 
25
161
  ## Contributing
26
162
 
@@ -3,10 +3,9 @@ require 'active_support'
3
3
  module LightOperations
4
4
  class Core
5
5
  include ::ActiveSupport::Rescuable
6
- include ::ActiveSupport
7
6
  MissingDependency = Class.new(StandardError)
8
7
 
9
- attr_reader :dependencies, :params, :subject
8
+ attr_reader :dependencies, :params, :subject, :bind_oject
10
9
 
11
10
  def initialize(params = {}, dependencies = {})
12
11
  @params, @dependencies = params, dependencies
@@ -18,17 +17,27 @@ module LightOperations
18
17
  self
19
18
  rescue => exception
20
19
  rescue_with_handler(exception) || raise
21
- ensure
22
20
  self
23
21
  end
24
22
 
25
- def on_success(&block)
26
- block.call(subject) if success?
23
+ def bind_with(binding_obj)
24
+ @bind_oject = binding_obj
27
25
  self
28
26
  end
29
27
 
30
- def on_fail(&block)
31
- block.call(subject, errors) unless success?
28
+ def on_success(binded_method = nil, &block)
29
+ if success?
30
+ bind_oject.send(binded_method, subject) if can_use_binding_method?(binded_method)
31
+ block.call(subject) if block_given?
32
+ end
33
+ self
34
+ end
35
+
36
+ def on_fail(binded_method = nil, &block)
37
+ unless success?
38
+ bind_oject.send(binded_method, subject, errors) if can_use_binding_method?(binded_method)
39
+ block.call(subject, errors) if block_given?
40
+ end
32
41
  self
33
42
  end
34
43
 
@@ -46,6 +55,10 @@ module LightOperations
46
55
 
47
56
  protected
48
57
 
58
+ def can_use_binding_method?(method_name)
59
+ method_name && bind_oject && bind_oject.respond_to?(method_name)
60
+ end
61
+
49
62
  def execute
50
63
  fail 'Not implemented yet'
51
64
  end
@@ -1,3 +1,3 @@
1
1
  module LightOperations
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
@@ -18,6 +18,15 @@ describe LightOperations::Core do
18
18
  end
19
19
 
20
20
  context 'use cases' do
21
+ let(:binding_object) do
22
+ Class.new(Object).tap do |klass|
23
+ klass.class_eval do
24
+ def success_action(_subject); end
25
+
26
+ def error_action(_subject, _errors); end
27
+ end
28
+ end.new
29
+ end
21
30
 
22
31
  # dependency using
23
32
 
@@ -93,16 +102,30 @@ describe LightOperations::Core do
93
102
  end
94
103
  end
95
104
 
96
- it '#on_success' do
97
- subject.run.on_success do |result|
98
- expect(result).to eq(:success)
105
+ context '#on_success' do
106
+ it 'when bind_with and send_method is used' do
107
+ expect(binding_object).to receive(:success_action).with(:success)
108
+ subject.run.bind_with(binding_object).on_success(:success_action)
109
+ end
110
+
111
+ it 'when block is userd' do
112
+ subject.run.on_success do |result|
113
+ expect(result).to eq(:success)
114
+ end
99
115
  end
100
116
  end
101
117
 
102
- it '#on_fail' do
103
- block_to_exec = -> () {}
104
- expect(block_to_exec).not_to receive(:call)
105
- subject.run.on_fail(&block_to_exec)
118
+ context '#on_fail' do
119
+ it 'when bind_with and send_method is used' do
120
+ expect(binding_object).not_to receive(:error_action)
121
+ subject.run.bind_with(binding_object).on_fail(:error_action)
122
+ end
123
+
124
+ it 'when block is userd' do
125
+ block_to_exec = -> () {}
126
+ expect(block_to_exec).not_to receive(:call)
127
+ subject.run.on_fail(&block_to_exec)
128
+ end
106
129
  end
107
130
 
108
131
  it '#errors' do
@@ -128,17 +151,30 @@ describe LightOperations::Core do
128
151
  end
129
152
  end
130
153
 
131
- it '#on_success' do
132
- block_to_exec = -> () {}
133
- expect(block_to_exec).not_to receive(:call)
134
- subject.run.on_success(&block_to_exec)
154
+ context '#on_success' do
155
+ it 'when bind_with and send_method is used' do
156
+ expect(binding_object).not_to receive(:success_action)
157
+ subject.run.bind_with(binding_object).on_success(:success_action)
158
+ end
159
+
160
+ it 'when block is userd' do
161
+ block_to_exec = -> () {}
162
+ expect(block_to_exec).not_to receive(:call)
163
+ subject.run.on_success(&block_to_exec)
164
+ end
135
165
  end
136
166
 
137
- it '#on_fail' do
167
+ context '#on_fail' do
168
+ it 'when bind_with and send_method is used' do
169
+ expect(binding_object).to receive(:error_action).with(:fail, [email: :unknown])
170
+ subject.run.bind_with(binding_object).on_fail(:error_action)
171
+ end
138
172
 
139
- subject.run.on_fail do |result, errors|
140
- expect(result).to eq(:fail)
141
- expect(errors).to eq([email: :unknown])
173
+ it 'when block is userd' do
174
+ subject.run.on_fail do |result, errors|
175
+ expect(result).to eq(:fail)
176
+ expect(errors).to eq([email: :unknown])
177
+ end
142
178
  end
143
179
  end
144
180
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: light_operations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pawel Niemczyk