light_operations 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +109 -10
- data/lib/light_operations/core.rb +67 -23
- data/lib/light_operations/version.rb +1 -1
- data/spec/lib/core_spec.rb +81 -38
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c894c1e7f9c3a1a15692c6875f4ded5b88d458d9
|
4
|
+
data.tar.gz: 9d841c8af28c066013159703d302ef42cb354991
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c3dcbef05689a60f891fc292b4fb96079406e6703d5ce7df0ca56ca2fee36ccc6808bb4987bbbfe4f095ec03f2dee656ff1aaa90dc5155a6982ddd4a522f3fb
|
7
|
+
data.tar.gz: a1b15f8668462cf6409450825a6a9f23d2e20040b44e53a8b39a42f17a73499a23bf28ab70ead3a583911e3453836bbc13e15bcbfe69163c2aae3df8f8a68952
|
data/README.md
CHANGED
@@ -24,6 +24,105 @@ Or install it yourself as:
|
|
24
24
|
|
25
25
|
### Uses cases
|
26
26
|
|
27
|
+
#### Basic vote logic
|
28
|
+
|
29
|
+
Operation
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
class ArticleVoteBumperOperation < LightOperations::Core
|
33
|
+
rescue_from ActiveRecord::ActiveRecordError, with: :on_ar_error
|
34
|
+
|
35
|
+
def execute(_params = nil)
|
36
|
+
dependency(:article_model).tap do |article|
|
37
|
+
article.vote = article.vote.next
|
38
|
+
article.save
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def on_ar_error(_exception)
|
43
|
+
fail!({ vote: 'could not be updated!' })
|
44
|
+
end
|
45
|
+
end
|
46
|
+
```
|
47
|
+
|
48
|
+
Controller
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
class ArticleVotesController < ApplicationController
|
52
|
+
def up
|
53
|
+
response = article_vote_bumper_op.run.success? ? { success: true } : article_vote_bumper_op.errors
|
54
|
+
render :up, json: response
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def article_vote_bumper_op
|
60
|
+
@article_vote_bumper_op ||= ArticleVoteBumperOperation.new(article_model: article)
|
61
|
+
end
|
62
|
+
|
63
|
+
def article
|
64
|
+
Article.find(params.require(:id))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
```
|
68
|
+
|
69
|
+
#### Basic recursion execution for collect newsfeeds from 2 sources
|
70
|
+
|
71
|
+
Operation
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
class CollectFeedsOperation < LightOperations::Core
|
75
|
+
rescue_from Timeout::Error, with: :on_timeout
|
76
|
+
|
77
|
+
def execute(params = {})
|
78
|
+
dependency(:http_client).get(params.fetch(:url)).body
|
79
|
+
end
|
80
|
+
|
81
|
+
def on_timeout
|
82
|
+
fail!
|
83
|
+
end
|
84
|
+
end
|
85
|
+
```
|
86
|
+
|
87
|
+
Controller
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
class NewsFeedsController < ApplicationController
|
91
|
+
DEFAULT_NEWS_URL = 'http://rss.best_news.pl'
|
92
|
+
BACKUP_NEWS_URL = 'http://rss.not_so_bad_news.pl'
|
93
|
+
def news
|
94
|
+
collect_feeds_op
|
95
|
+
on(success: :display_news, fail: :second_attempt)
|
96
|
+
.run(url: DEFAULT_NEWS_URL)
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
def second_attempt(_news, _errors)
|
102
|
+
collect_feeds_op
|
103
|
+
.on_fail(:display_old_news)
|
104
|
+
.run(url: BACKUP_NEWS_URL)
|
105
|
+
end
|
106
|
+
|
107
|
+
def display_news(news)
|
108
|
+
render :display_news, locals { news: news }
|
109
|
+
end
|
110
|
+
|
111
|
+
def display_old_news
|
112
|
+
end
|
113
|
+
|
114
|
+
def collect_feeds_op
|
115
|
+
@collect_feeds_op ||= CollectFeedsOperation.new(http_client: http_client)
|
116
|
+
end
|
117
|
+
|
118
|
+
def http_client
|
119
|
+
MyAwesomeHttpClient
|
120
|
+
end
|
121
|
+
end
|
122
|
+
```
|
123
|
+
|
124
|
+
|
125
|
+
|
27
126
|
#### Simple case when you want have user authorization
|
28
127
|
|
29
128
|
Operation
|
@@ -32,19 +131,19 @@ Operation
|
|
32
131
|
class AuthOperation < LightOperations::Core
|
33
132
|
rescue_from AuthFail, with: :on_auth_error
|
34
133
|
|
35
|
-
def execute
|
36
|
-
dependency(:auth_service).login(login: login, password: password)
|
134
|
+
def execute(params = {})
|
135
|
+
dependency(:auth_service).login(login: login(params), password: password(params))
|
37
136
|
end
|
38
137
|
|
39
138
|
def on_auth_error(_exception)
|
40
139
|
fail!([login: 'unknown']) # or subject.errors.add(login: 'unknown')
|
41
140
|
end
|
42
141
|
|
43
|
-
def login
|
142
|
+
def login(params)
|
44
143
|
params.fetch(:login)
|
45
144
|
end
|
46
145
|
|
47
|
-
def password
|
146
|
+
def password(params)
|
48
147
|
params.fetch(:password)
|
49
148
|
end
|
50
149
|
end
|
@@ -60,10 +159,10 @@ class AuthController < ApplicationController
|
|
60
159
|
|
61
160
|
def create
|
62
161
|
auth_op
|
63
|
-
.run
|
64
162
|
.bind_with(self)
|
65
163
|
.on_success(:create_session_with_dashbord_redirection)
|
66
164
|
.on_fail(:render_account_with_errors)
|
165
|
+
.run(params)
|
67
166
|
end
|
68
167
|
|
69
168
|
private
|
@@ -78,7 +177,7 @@ class AuthController < ApplicationController
|
|
78
177
|
end
|
79
178
|
|
80
179
|
def auth_op
|
81
|
-
@auth_op ||= AuthOperation.new(
|
180
|
+
@auth_op ||= AuthOperation.new(auth_service: auth_service)
|
82
181
|
end
|
83
182
|
|
84
183
|
def auth_service
|
@@ -97,9 +196,9 @@ class AuthController < ApplicationController
|
|
97
196
|
|
98
197
|
def create
|
99
198
|
auth_op
|
100
|
-
.run
|
101
199
|
.on_success{ |account| create_session_with_dashbord_redirection(account) }
|
102
200
|
.on_fail { |account, _errors| render :new, locals: { account: account } }
|
201
|
+
.run(params)
|
103
202
|
end
|
104
203
|
|
105
204
|
private
|
@@ -110,7 +209,7 @@ class AuthController < ApplicationController
|
|
110
209
|
end
|
111
210
|
|
112
211
|
def auth_op
|
113
|
-
@auth_op ||= AuthOperation.new(
|
212
|
+
@auth_op ||= AuthOperation.new(auth_service: auth_service)
|
114
213
|
end
|
115
214
|
|
116
215
|
def auth_service
|
@@ -128,7 +227,7 @@ class AuthController < ApplicationController
|
|
128
227
|
end
|
129
228
|
|
130
229
|
def create
|
131
|
-
auth_op.
|
230
|
+
auth_op.on_success(&go_to_dashboard).on_fail(&go_to_login).run(params)
|
132
231
|
end
|
133
232
|
|
134
233
|
private
|
@@ -145,7 +244,7 @@ class AuthController < ApplicationController
|
|
145
244
|
end
|
146
245
|
|
147
246
|
def auth_op
|
148
|
-
@auth_op ||= AuthOperation.new(
|
247
|
+
@auth_op ||= AuthOperation.new(auth_service: auth_service)
|
149
248
|
end
|
150
249
|
|
151
250
|
def auth_service
|
@@ -5,44 +5,68 @@ module LightOperations
|
|
5
5
|
include ::ActiveSupport::Rescuable
|
6
6
|
MissingDependency = Class.new(StandardError)
|
7
7
|
|
8
|
-
attr_reader :dependencies, :
|
8
|
+
attr_reader :dependencies, :bind_object, :subject
|
9
9
|
|
10
|
-
def initialize(
|
11
|
-
@
|
10
|
+
def initialize(dependencies = {})
|
11
|
+
@dependencies = dependencies
|
12
12
|
end
|
13
13
|
|
14
|
-
# do
|
15
|
-
def run
|
16
|
-
@subject = execute
|
14
|
+
# do no.t override this method
|
15
|
+
def run(params = {})
|
16
|
+
@subject = execute(params)
|
17
|
+
execute_actions
|
17
18
|
self
|
18
19
|
rescue => exception
|
19
20
|
rescue_with_handler(exception) || raise
|
20
21
|
self
|
21
22
|
end
|
22
23
|
|
23
|
-
def
|
24
|
-
|
24
|
+
def on_success(binded_method = nil, &block)
|
25
|
+
actions[:success] = binded_method || block
|
25
26
|
self
|
26
27
|
end
|
27
28
|
|
28
|
-
def
|
29
|
-
|
30
|
-
bind_oject.send(binded_method, subject) if can_use_binding_method?(binded_method)
|
31
|
-
block.call(subject) if block_given?
|
32
|
-
end
|
29
|
+
def on_fail(binded_method = nil, &block)
|
30
|
+
actions[:fail] = binded_method || block
|
33
31
|
self
|
34
32
|
end
|
35
33
|
|
36
|
-
def
|
37
|
-
|
38
|
-
|
39
|
-
block.call(subject, errors) if block_given?
|
34
|
+
def on(actions_with_responses = {})
|
35
|
+
actions_with_responses.slice(:success, :fail).each do |action, response|
|
36
|
+
actions[action] = response
|
40
37
|
end
|
41
38
|
self
|
42
39
|
end
|
43
40
|
|
41
|
+
def clear!
|
42
|
+
clear_actions!
|
43
|
+
unbind!
|
44
|
+
clear_subject_with_errors!
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
48
|
+
def unbind!
|
49
|
+
@bind_object = nil
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
def clear_subject_with_errors!
|
54
|
+
@subject, @fail_errors, @errors = nil, nil, nil
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
def clear_actions!
|
59
|
+
@actions = {}
|
60
|
+
self
|
61
|
+
end
|
62
|
+
|
63
|
+
def bind_with(bind_object)
|
64
|
+
@bind_object = bind_object
|
65
|
+
self
|
66
|
+
end
|
67
|
+
|
44
68
|
def errors
|
45
|
-
@errors ||= (subject.respond_to?(:errors) ? subject.errors : [])
|
69
|
+
@errors ||= fail_errors || (subject.respond_to?(:errors) ? subject.errors : [])
|
46
70
|
end
|
47
71
|
|
48
72
|
def fail?
|
@@ -55,16 +79,36 @@ module LightOperations
|
|
55
79
|
|
56
80
|
protected
|
57
81
|
|
58
|
-
|
59
|
-
|
82
|
+
attr_reader :fail_errors
|
83
|
+
|
84
|
+
def execute_actions
|
85
|
+
success? ? execute_success_action : execute_fail_action
|
60
86
|
end
|
61
87
|
|
62
|
-
def
|
63
|
-
|
88
|
+
def execute_success_action
|
89
|
+
return unless actions.key?(:success)
|
90
|
+
action = actions[:success]
|
91
|
+
bind_object.send(action, subject) if action.is_a?(Symbol) && bind_object
|
92
|
+
action.call(subject) if action.is_a?(Proc)
|
93
|
+
end
|
94
|
+
|
95
|
+
def execute_fail_action
|
96
|
+
return unless actions.key?(:fail)
|
97
|
+
action = actions[:fail]
|
98
|
+
bind_object.send(action, subject, errors) if action.is_a?(Symbol) && bind_object
|
99
|
+
action.call(subject, errors) if action.is_a?(Proc)
|
64
100
|
end
|
65
101
|
|
66
102
|
def fail!(errors = [])
|
67
|
-
@
|
103
|
+
@fail_errors = errors
|
104
|
+
end
|
105
|
+
|
106
|
+
def actions
|
107
|
+
@actions ||= {}
|
108
|
+
end
|
109
|
+
|
110
|
+
def execute(_params = {})
|
111
|
+
fail 'Not implemented yet'
|
68
112
|
end
|
69
113
|
|
70
114
|
def dependency(name)
|
data/spec/lib/core_spec.rb
CHANGED
@@ -8,13 +8,13 @@ describe LightOperations::Core do
|
|
8
8
|
def subject_factory(&block)
|
9
9
|
Class.new(described_class).tap do |klass|
|
10
10
|
klass.class_eval(&block)
|
11
|
-
end.new(
|
11
|
+
end.new(dependencies)
|
12
12
|
end
|
13
13
|
|
14
|
-
subject { described_class.new(
|
14
|
+
subject { described_class.new(dependencies) }
|
15
15
|
|
16
16
|
it 'raise error when #execute is not implemented' do
|
17
|
-
expect { subject.run }.to raise_error('Not implemented yet')
|
17
|
+
expect { subject.on(success: :do_nothing).run }.to raise_error('Not implemented yet')
|
18
18
|
end
|
19
19
|
|
20
20
|
context 'use cases' do
|
@@ -33,12 +33,14 @@ describe LightOperations::Core do
|
|
33
33
|
context 'dependency usage' do
|
34
34
|
subject do
|
35
35
|
subject_factory do
|
36
|
-
def execute
|
36
|
+
def execute(_params)
|
37
37
|
dependency(:login_service)
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
+
before { subject.on(success: -> (_subject) {}) }
|
43
|
+
|
42
44
|
it 'is allowed when is initialized correctly' do
|
43
45
|
expect { subject.run }.not_to raise_error
|
44
46
|
end
|
@@ -46,7 +48,7 @@ describe LightOperations::Core do
|
|
46
48
|
context 'raise_error' do
|
47
49
|
let(:dependencies) { {} }
|
48
50
|
it 'when dependency missing' do
|
49
|
-
expect { subject.run }.to raise_error(
|
51
|
+
expect { subject.run }.to raise_error(described_class::MissingDependency)
|
50
52
|
end
|
51
53
|
end
|
52
54
|
end
|
@@ -54,49 +56,55 @@ describe LightOperations::Core do
|
|
54
56
|
# error handling
|
55
57
|
|
56
58
|
context '.rescue_from specific error' do
|
59
|
+
TestError = Class.new(StandardError)
|
60
|
+
|
61
|
+
before { subject.on(success: -> (_subject) {}) }
|
62
|
+
|
57
63
|
context 'by block' do
|
58
64
|
subject do
|
59
65
|
subject_factory do
|
60
|
-
rescue_from
|
61
|
-
fail
|
66
|
+
rescue_from TestError do |exception|
|
67
|
+
fail "execute block instead original #{exception.class}"
|
62
68
|
end
|
63
69
|
|
64
|
-
def execute
|
65
|
-
fail
|
70
|
+
def execute(_params)
|
71
|
+
fail TestError, 'What now'
|
66
72
|
end
|
67
73
|
end
|
68
74
|
end
|
69
75
|
|
70
76
|
it 'call' do
|
71
|
-
expect { subject.run }.to raise_error('execute block instead original
|
77
|
+
expect { subject.run }.to raise_error('execute block instead original TestError')
|
72
78
|
end
|
73
79
|
end
|
74
80
|
|
75
81
|
context 'by defined method' do
|
76
82
|
subject do
|
77
83
|
subject_factory do
|
78
|
-
rescue_from
|
84
|
+
rescue_from TestError, with: :rescue_me
|
79
85
|
|
80
|
-
def rescue_me
|
81
|
-
fail
|
86
|
+
def rescue_me(exception)
|
87
|
+
fail "execute rescue_me method instead original #{exception.class}"
|
82
88
|
end
|
83
89
|
|
84
|
-
def execute
|
85
|
-
fail
|
90
|
+
def execute(_params)
|
91
|
+
fail TestError, 'What now'
|
86
92
|
end
|
87
93
|
end
|
88
94
|
end
|
89
95
|
|
90
96
|
it 'execute' do
|
91
|
-
expect { subject.run }.to raise_error('execute rescue_me method instead original
|
97
|
+
expect { subject.run }.to raise_error('execute rescue_me method instead original TestError')
|
92
98
|
end
|
93
99
|
end
|
94
100
|
end
|
95
101
|
|
102
|
+
# on actions success/fail
|
103
|
+
|
96
104
|
context 'when operation is successful' do
|
97
105
|
subject do
|
98
106
|
subject_factory do
|
99
|
-
def execute
|
107
|
+
def execute(_params)
|
100
108
|
:success
|
101
109
|
end
|
102
110
|
end
|
@@ -105,46 +113,44 @@ describe LightOperations::Core do
|
|
105
113
|
context '#on_success' do
|
106
114
|
it 'when bind_with and send_method is used' do
|
107
115
|
expect(binding_object).to receive(:success_action).with(:success)
|
108
|
-
subject.
|
116
|
+
subject.on_success(:success_action).bind_with(binding_object).run
|
109
117
|
end
|
110
118
|
|
111
|
-
it 'when block is
|
112
|
-
subject.
|
113
|
-
expect(result).to eq(:success)
|
114
|
-
end
|
119
|
+
it 'when block is used' do
|
120
|
+
subject.on_success { |result| expect(result).to eq(:success) }.run
|
115
121
|
end
|
116
122
|
end
|
117
123
|
|
118
124
|
context '#on_fail' do
|
119
125
|
it 'when bind_with and send_method is used' do
|
120
126
|
expect(binding_object).not_to receive(:error_action)
|
121
|
-
subject.
|
127
|
+
subject.bind_with(binding_object).on_fail(:error_action).run
|
122
128
|
end
|
123
129
|
|
124
|
-
it 'when block is
|
130
|
+
it 'when block is used' do
|
125
131
|
block_to_exec = -> () {}
|
126
132
|
expect(block_to_exec).not_to receive(:call)
|
127
|
-
subject.
|
133
|
+
subject.on_fail(&block_to_exec).run
|
128
134
|
end
|
129
135
|
end
|
130
136
|
|
131
137
|
it '#errors' do
|
132
|
-
expect(subject.run.errors).to eq([])
|
138
|
+
expect(subject.on_success(:success_action).run.errors).to eq([])
|
133
139
|
end
|
134
140
|
|
135
141
|
it '#fail?' do
|
136
|
-
expect(subject.run.fail?).to eq(false)
|
142
|
+
expect(subject.on_success(:success_action).run.fail?).to eq(false)
|
137
143
|
end
|
138
144
|
|
139
145
|
it '#success?' do
|
140
|
-
expect(subject.run.success?).to eq(true)
|
146
|
+
expect(subject.on_success(:success_action).run.success?).to eq(true)
|
141
147
|
end
|
142
148
|
end
|
143
149
|
|
144
150
|
context 'when operation is fail' do
|
145
151
|
subject do
|
146
152
|
subject_factory do
|
147
|
-
def execute
|
153
|
+
def execute(_params)
|
148
154
|
fail!([email: :unknown])
|
149
155
|
:fail
|
150
156
|
end
|
@@ -154,41 +160,78 @@ describe LightOperations::Core do
|
|
154
160
|
context '#on_success' do
|
155
161
|
it 'when bind_with and send_method is used' do
|
156
162
|
expect(binding_object).not_to receive(:success_action)
|
157
|
-
subject.
|
163
|
+
subject.bind_with(binding_object).on_success(:success_action).run
|
158
164
|
end
|
159
165
|
|
160
|
-
it 'when block is
|
166
|
+
it 'when block is used' do
|
161
167
|
block_to_exec = -> () {}
|
162
168
|
expect(block_to_exec).not_to receive(:call)
|
163
|
-
subject.
|
169
|
+
subject.on_success(&block_to_exec).run
|
164
170
|
end
|
165
171
|
end
|
166
172
|
|
167
173
|
context '#on_fail' do
|
168
174
|
it 'when bind_with and send_method is used' do
|
169
175
|
expect(binding_object).to receive(:error_action).with(:fail, [email: :unknown])
|
170
|
-
subject.
|
176
|
+
subject.bind_with(binding_object).on_fail(:error_action).run
|
171
177
|
end
|
172
178
|
|
173
|
-
it 'when block is
|
174
|
-
subject.
|
179
|
+
it 'when block is used' do
|
180
|
+
subject.on_fail do |result, errors|
|
175
181
|
expect(result).to eq(:fail)
|
176
182
|
expect(errors).to eq([email: :unknown])
|
177
183
|
end
|
184
|
+
subject.run
|
178
185
|
end
|
179
186
|
end
|
180
187
|
|
181
188
|
it '#errors' do
|
182
|
-
expect(subject.run.errors).to eq([email: :unknown])
|
189
|
+
expect(subject.on_fail(:error_action).run.errors).to eq([email: :unknown])
|
183
190
|
end
|
184
191
|
|
185
192
|
it '#fail?' do
|
186
|
-
expect(subject.run.fail?).to eq(true)
|
193
|
+
expect(subject.on_fail(:error_action).run.fail?).to eq(true)
|
187
194
|
end
|
188
195
|
|
189
196
|
it '#success?' do
|
190
|
-
expect(subject.run.success?).to eq(false)
|
197
|
+
expect(subject.on_fail(:error_action).run.success?).to eq(false)
|
191
198
|
end
|
192
199
|
end
|
193
200
|
end
|
201
|
+
|
202
|
+
context 'prepare operation to reuse or simply clear' do
|
203
|
+
it '#unbind!' do
|
204
|
+
subject.bind_with(:some_object)
|
205
|
+
expect { subject.unbind! }.to change { subject.bind_object }
|
206
|
+
.from(:some_object)
|
207
|
+
.to(nil)
|
208
|
+
end
|
209
|
+
|
210
|
+
it '#clear_actions!' do
|
211
|
+
subject.on(success: :abc, fail: :def)
|
212
|
+
expect { subject.clear_actions! }.to change { subject.send(:actions) }
|
213
|
+
.from(success: :abc, fail: :def)
|
214
|
+
.to({})
|
215
|
+
end
|
216
|
+
|
217
|
+
it '#clear_subject_with_errors!' do
|
218
|
+
%w{ subject fail_errors errors }.each do |variable|
|
219
|
+
subject.instance_variable_set("@#{variable}", variable)
|
220
|
+
end
|
221
|
+
expect(subject.subject).to eq('subject')
|
222
|
+
expect(subject.instance_variable_get('@errors')).to eq('errors')
|
223
|
+
expect(subject.instance_variable_get('@fail_errors')).to eq('fail_errors')
|
224
|
+
subject.clear_subject_with_errors!
|
225
|
+
expect(subject.subject).to be_nil
|
226
|
+
expect(subject.instance_variable_get('@errors')).to be_nil
|
227
|
+
expect(subject.instance_variable_get('@fail_errors')).to be_nil
|
228
|
+
end
|
229
|
+
|
230
|
+
it '#clear!' do
|
231
|
+
expect(subject).to receive(:unbind!)
|
232
|
+
expect(subject).to receive(:clear_actions!)
|
233
|
+
expect(subject).to receive(:clear_subject_with_errors!)
|
234
|
+
subject.clear!
|
235
|
+
end
|
236
|
+
end
|
194
237
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: light_operations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pawel Niemczyk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|