lotus-utils 0.4.3 → 0.5.0
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/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
|