lotus-utils 0.4.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/lib/lotus/interactor.rb +76 -15
- data/lib/lotus/logger.rb +141 -0
- data/lib/lotus/utils/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93d211db34674dbdfa9728cf23e72e6d3236f754
|
4
|
+
data.tar.gz: c88e28e49ec323d6e74a01c6f0371d29e97e0680
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2335cb45570fc4f67b6f5b1db5f8a938d9b94e1e3d49338d68f717f39fc046fb2dc573fd6070ccd5e7aaf47f5b01092b167d2f108ef3d9308e46a029d865a5b8
|
7
|
+
data.tar.gz: 4d2c770981d67118df3723dd306a20e3644ae454c114894c6dd4bd3f78974bc04bd575af1c8089e2b53d724d6d99147a72fe175be824302c6c6c1e5ff1f91996
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
# Lotus::Utils
|
2
2
|
Ruby core extentions and class utilities for Lotus
|
3
3
|
|
4
|
+
## v0.5.0 - 2015-06-23
|
5
|
+
### Added
|
6
|
+
- [Luca Guidi] Extracted `Lotus::Logger` from `lotusrb`
|
7
|
+
|
8
|
+
### Changed
|
9
|
+
- [Luca Guidi] `Lotus::Interactor::Result` contains only objects explicitly exposed via `Lotus::Interactor.expose`.
|
10
|
+
|
4
11
|
## v0.4.3 - 2015-05-22
|
5
12
|
### Added
|
6
13
|
- [François Beausoleil] Improved `Lotus::Utils::Kernel` messages for `TypeError`.
|
data/lib/lotus/interactor.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'lotus/utils/basic_object'
|
2
|
+
require 'lotus/utils/class_attribute'
|
2
3
|
require 'lotus/utils/hash'
|
3
4
|
|
4
5
|
module Lotus
|
@@ -28,6 +29,7 @@ module Lotus
|
|
28
29
|
# @api private
|
29
30
|
def initialize(payload = {})
|
30
31
|
@payload = _payload(payload)
|
32
|
+
@errors = []
|
31
33
|
@success = true
|
32
34
|
end
|
33
35
|
|
@@ -58,7 +60,15 @@ module Lotus
|
|
58
60
|
# @see Lotus::Interactor#error
|
59
61
|
# @see Lotus::Interactor#error!
|
60
62
|
def errors
|
61
|
-
@
|
63
|
+
@errors.dup
|
64
|
+
end
|
65
|
+
|
66
|
+
# @since 0.5.0
|
67
|
+
# @api private
|
68
|
+
def add_error(*errors)
|
69
|
+
@errors << errors
|
70
|
+
@errors.flatten!
|
71
|
+
nil
|
62
72
|
end
|
63
73
|
|
64
74
|
# Returns the first errors collected during an operation
|
@@ -122,6 +132,7 @@ module Lotus
|
|
122
132
|
|
123
133
|
base.class_eval do
|
124
134
|
prepend Interface
|
135
|
+
extend ClassMethods
|
125
136
|
end
|
126
137
|
end
|
127
138
|
|
@@ -146,8 +157,8 @@ module Lotus
|
|
146
157
|
# class UpdateProfile
|
147
158
|
# include Lotus::Interactor
|
148
159
|
#
|
149
|
-
# def initialize(
|
150
|
-
# @
|
160
|
+
# def initialize(user, params)
|
161
|
+
# @user = user
|
151
162
|
# @params = params
|
152
163
|
# end
|
153
164
|
#
|
@@ -159,7 +170,6 @@ module Lotus
|
|
159
170
|
super
|
160
171
|
ensure
|
161
172
|
@__result = ::Lotus::Interactor::Result.new
|
162
|
-
@_errors = []
|
163
173
|
end
|
164
174
|
|
165
175
|
# Triggers the operation and return a result.
|
@@ -172,11 +182,12 @@ module Lotus
|
|
172
182
|
#
|
173
183
|
# @raise [NoMethodError] if this isn't implemented by the including class.
|
174
184
|
#
|
175
|
-
# @example
|
185
|
+
# @example Expose instance variables in result payload
|
176
186
|
# require 'lotus/interactor'
|
177
187
|
#
|
178
188
|
# class Signup
|
179
189
|
# include Lotus::Interactor
|
190
|
+
# expose :user, :params
|
180
191
|
#
|
181
192
|
# def initialize(params)
|
182
193
|
# @params = params
|
@@ -194,13 +205,14 @@ module Lotus
|
|
194
205
|
#
|
195
206
|
# result.user # => #<User:0x007fa311105778 @id=1 @name="Luca">
|
196
207
|
# result.params # => { :name=>"Luca" }
|
197
|
-
# result.foo # =>
|
208
|
+
# result.foo # => raises NoMethodError
|
198
209
|
#
|
199
210
|
# @example Failed precondition
|
200
211
|
# require 'lotus/interactor'
|
201
212
|
#
|
202
213
|
# class Signup
|
203
214
|
# include Lotus::Interactor
|
215
|
+
# expose :user
|
204
216
|
#
|
205
217
|
# def initialize(params)
|
206
218
|
# @params = params
|
@@ -308,6 +320,7 @@ module Lotus
|
|
308
320
|
#
|
309
321
|
# class CreateRecord
|
310
322
|
# include Lotus::Interactor
|
323
|
+
# expose :logger
|
311
324
|
#
|
312
325
|
# def initialize
|
313
326
|
# @logger = []
|
@@ -341,7 +354,7 @@ module Lotus
|
|
341
354
|
# result.errors # => ["Prepare data error", "Persist error"]
|
342
355
|
# result.logger # => [:prepare_data!, :persist!, :sync!]
|
343
356
|
def error(message)
|
344
|
-
@
|
357
|
+
@__result.add_error message
|
345
358
|
false
|
346
359
|
end
|
347
360
|
|
@@ -360,6 +373,7 @@ module Lotus
|
|
360
373
|
#
|
361
374
|
# class CreateRecord
|
362
375
|
# include Lotus::Interactor
|
376
|
+
# expose :logger
|
363
377
|
#
|
364
378
|
# def initialize
|
365
379
|
# @logger = []
|
@@ -417,20 +431,67 @@ module Lotus
|
|
417
431
|
# @since 0.3.5
|
418
432
|
# @api private
|
419
433
|
def _prepare!
|
420
|
-
@__result.prepare!(
|
434
|
+
@__result.prepare!(_exposures)
|
421
435
|
end
|
422
436
|
|
423
|
-
# @since 0.
|
437
|
+
# @since 0.5.0
|
424
438
|
# @api private
|
425
|
-
def
|
439
|
+
def _exposures
|
426
440
|
Hash[].tap do |result|
|
427
|
-
|
428
|
-
name =
|
429
|
-
next if name.match(/\A__/)
|
430
|
-
|
431
|
-
result[name.to_sym] = instance_variable_get(iv)
|
441
|
+
self.class.exposures.each do |name, ivar|
|
442
|
+
result[name] = instance_variable_get(ivar)
|
432
443
|
end
|
433
444
|
end
|
434
445
|
end
|
435
446
|
end
|
447
|
+
|
448
|
+
# @since 0.5.0
|
449
|
+
# @api private
|
450
|
+
module ClassMethods
|
451
|
+
# @since 0.5.0
|
452
|
+
# @api private
|
453
|
+
def self.extended(interactor)
|
454
|
+
interactor.class_eval do
|
455
|
+
include Utils::ClassAttribute
|
456
|
+
|
457
|
+
class_attribute :exposures
|
458
|
+
self.exposures = Utils::Hash.new
|
459
|
+
end
|
460
|
+
end
|
461
|
+
|
462
|
+
# Expose local instance variables into the returing value of <tt>#call</tt>
|
463
|
+
#
|
464
|
+
# @param instance_variable_names [Symbol,Array<Symbol>] one or more instance
|
465
|
+
# variable names
|
466
|
+
#
|
467
|
+
# @since 0.5.0
|
468
|
+
#
|
469
|
+
# @see Lotus::Interactor::Result
|
470
|
+
#
|
471
|
+
# @example Expose instance variable
|
472
|
+
#
|
473
|
+
# class Signup
|
474
|
+
# include Lotus::Interactor
|
475
|
+
# expose :user
|
476
|
+
#
|
477
|
+
# def initialize(params)
|
478
|
+
# @params = params
|
479
|
+
# @user = User.new(@params[:user])
|
480
|
+
# end
|
481
|
+
#
|
482
|
+
# def call
|
483
|
+
# # ...
|
484
|
+
# end
|
485
|
+
# end
|
486
|
+
#
|
487
|
+
# result = Signup.new(user: { name: "Luca" }).call
|
488
|
+
#
|
489
|
+
# result.user # => #<User:0x007fa85c58ccd8 @name="Luca">
|
490
|
+
# result.params # => NoMethodError
|
491
|
+
def expose(*instance_variable_names)
|
492
|
+
instance_variable_names.each do |name|
|
493
|
+
exposures[name] = "@#{ name }"
|
494
|
+
end
|
495
|
+
end
|
496
|
+
end
|
436
497
|
end
|
data/lib/lotus/logger.rb
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'lotus/utils/string'
|
3
|
+
|
4
|
+
module Lotus
|
5
|
+
# Lotus logger
|
6
|
+
#
|
7
|
+
# Implement with the same interface of Ruby std lib `Logger`.
|
8
|
+
# It uses `STDOUT` as output device.
|
9
|
+
#
|
10
|
+
#
|
11
|
+
#
|
12
|
+
# When a Lotus application is initialized, it creates a logger for that specific application.
|
13
|
+
# For instance for a `Bookshelf::Application` a `Bookshelf::Logger` will be available.
|
14
|
+
#
|
15
|
+
# This is useful for auto-tagging the output. Eg (`[Booshelf]`).
|
16
|
+
#
|
17
|
+
# When used stand alone (eg. `Lotus::Logger.info`), it tags lines with `[Shared]`.
|
18
|
+
#
|
19
|
+
#
|
20
|
+
#
|
21
|
+
# The available severity levels are the same of `Logger`:
|
22
|
+
#
|
23
|
+
# * debug
|
24
|
+
# * error
|
25
|
+
# * fatal
|
26
|
+
# * info
|
27
|
+
# * unknown
|
28
|
+
# * warn
|
29
|
+
#
|
30
|
+
# Those levels are available both as class and instance methods.
|
31
|
+
#
|
32
|
+
# @since 0.5.0
|
33
|
+
#
|
34
|
+
# @see http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc/Logger.html
|
35
|
+
# @see http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc/Logger/Severity.html
|
36
|
+
#
|
37
|
+
# @example Basic usage
|
38
|
+
# require 'lotus'
|
39
|
+
#
|
40
|
+
# module Bookshelf
|
41
|
+
# class Application < Lotus::Application
|
42
|
+
# end
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# # Initialize the application with the following code:
|
46
|
+
# Bookshelf::Application.load!
|
47
|
+
# # or
|
48
|
+
# Bookshelf::Application.new
|
49
|
+
#
|
50
|
+
# Bookshelf::Logger.info('Hello')
|
51
|
+
# # => I, [2015-01-10T21:55:12.727259 #80487] INFO -- [Bookshelf] : Hello
|
52
|
+
#
|
53
|
+
# Bookshelf::Logger.new.info('Hello')
|
54
|
+
# # => I, [2015-01-10T21:55:12.727259 #80487] INFO -- [Bookshelf] : Hello
|
55
|
+
#
|
56
|
+
# @example Standalone usage
|
57
|
+
# require 'lotus'
|
58
|
+
#
|
59
|
+
# Lotus::Logger.info('Hello')
|
60
|
+
# # => I, [2015-01-10T21:55:12.727259 #80487] INFO -- [Lotus] : Hello
|
61
|
+
#
|
62
|
+
# Lotus::Logger.new.info('Hello')
|
63
|
+
# # => I, [2015-01-10T21:55:12.727259 #80487] INFO -- [Lotus] : Hello
|
64
|
+
#
|
65
|
+
# @example Custom tagging
|
66
|
+
# require 'lotus'
|
67
|
+
#
|
68
|
+
# Lotus::Logger.new('FOO').info('Hello')
|
69
|
+
# # => I, [2015-01-10T21:55:12.727259 #80487] INFO -- [FOO] : Hello
|
70
|
+
class Logger < ::Logger
|
71
|
+
# Lotus::Logger default formatter
|
72
|
+
#
|
73
|
+
# @since 0.5.0
|
74
|
+
# @api private
|
75
|
+
#
|
76
|
+
# @see http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc/Logger/Formatter.html
|
77
|
+
class Formatter < ::Logger::Formatter
|
78
|
+
# @since 0.5.0
|
79
|
+
# @api private
|
80
|
+
attr_writer :application_name
|
81
|
+
|
82
|
+
# @since 0.5.0
|
83
|
+
# @api private
|
84
|
+
#
|
85
|
+
# @see http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc/Logger/Formatter.html#method-i-call
|
86
|
+
def call(severity, time, progname, msg)
|
87
|
+
progname = "[#{@application_name}] #{progname}"
|
88
|
+
super(severity, time.utc, progname, msg)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Default application name.
|
93
|
+
# This is used as a fallback for tagging purposes.
|
94
|
+
#
|
95
|
+
# @since 0.5.0
|
96
|
+
# @api private
|
97
|
+
DEFAULT_APPLICATION_NAME = 'Lotus'.freeze
|
98
|
+
|
99
|
+
# @since 0.5.0
|
100
|
+
# @api private
|
101
|
+
attr_writer :application_name
|
102
|
+
|
103
|
+
# Initialize a logger
|
104
|
+
#
|
105
|
+
# @param application_name [String] an optional application name used for
|
106
|
+
# tagging purposes
|
107
|
+
#
|
108
|
+
# @since 0.5.0
|
109
|
+
def initialize(application_name = nil)
|
110
|
+
super(STDOUT)
|
111
|
+
|
112
|
+
@application_name = application_name
|
113
|
+
@formatter = Lotus::Logger::Formatter.new.tap { |f| f.application_name = self.application_name }
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns the current application name, this is used for tagging purposes
|
117
|
+
#
|
118
|
+
# @return [String] the application name
|
119
|
+
#
|
120
|
+
# @since 0.5.0
|
121
|
+
def application_name
|
122
|
+
@application_name || _application_name_from_namespace || _default_application_name
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
# @since 0.5.0
|
127
|
+
# @api private
|
128
|
+
def _application_name_from_namespace
|
129
|
+
class_name = self.class.name
|
130
|
+
namespace = Utils::String.new(class_name).namespace
|
131
|
+
|
132
|
+
class_name != namespace and return namespace
|
133
|
+
end
|
134
|
+
|
135
|
+
# @since 0.5.0
|
136
|
+
# @api private
|
137
|
+
def _default_application_name
|
138
|
+
DEFAULT_APPLICATION_NAME
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
data/lib/lotus/utils/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lotus-utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-06-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -65,6 +65,7 @@ files:
|
|
65
65
|
- LICENSE.md
|
66
66
|
- README.md
|
67
67
|
- lib/lotus/interactor.rb
|
68
|
+
- lib/lotus/logger.rb
|
68
69
|
- lib/lotus/utils.rb
|
69
70
|
- lib/lotus/utils/attributes.rb
|
70
71
|
- lib/lotus/utils/basic_object.rb
|
@@ -102,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
103
|
version: '0'
|
103
104
|
requirements: []
|
104
105
|
rubyforge_project:
|
105
|
-
rubygems_version: 2.4.
|
106
|
+
rubygems_version: 2.4.8
|
106
107
|
signing_key:
|
107
108
|
specification_version: 4
|
108
109
|
summary: Ruby core extentions and Louts utilities
|