hanami-utils 0.7.2 → 0.8.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 +15 -2
- data/README.md +5 -1
- data/hanami-utils.gemspec +5 -6
- data/lib/hanami-utils.rb +1 -1
- data/lib/hanami/interactor.rb +7 -5
- data/lib/hanami/logger.rb +178 -30
- data/lib/hanami/utils/attributes.rb +11 -2
- data/lib/hanami/utils/basic_object.rb +4 -3
- data/lib/hanami/utils/blank.rb +45 -0
- data/lib/hanami/utils/callbacks.rb +1 -3
- data/lib/hanami/utils/class.rb +34 -3
- data/lib/hanami/utils/class_attribute.rb +5 -1
- data/lib/hanami/utils/deprecation.rb +2 -1
- data/lib/hanami/utils/duplicable.rb +2 -2
- data/lib/hanami/utils/escape.rb +53 -52
- data/lib/hanami/utils/hash.rb +9 -9
- data/lib/hanami/utils/inflector.rb +84 -62
- data/lib/hanami/utils/io.rb +2 -2
- data/lib/hanami/utils/json.rb +51 -0
- data/lib/hanami/utils/kernel.rb +12 -11
- data/lib/hanami/utils/load_paths.rb +4 -2
- data/lib/hanami/utils/path_prefix.rb +4 -3
- data/lib/hanami/utils/string.rb +12 -11
- data/lib/hanami/utils/version.rb +1 -1
- metadata +7 -20
data/lib/hanami/utils/io.rb
CHANGED
@@ -26,7 +26,8 @@ module Hanami
|
|
26
26
|
# Test::TEST_VALUE = 'redefined'
|
27
27
|
# end
|
28
28
|
def self.silence_warnings
|
29
|
-
old_verbose
|
29
|
+
old_verbose = $VERBOSE
|
30
|
+
$VERBOSE = nil
|
30
31
|
yield
|
31
32
|
ensure
|
32
33
|
$VERBOSE = old_verbose
|
@@ -34,4 +35,3 @@ module Hanami
|
|
34
35
|
end
|
35
36
|
end
|
36
37
|
end
|
37
|
-
|
@@ -0,0 +1,51 @@
|
|
1
|
+
begin
|
2
|
+
require 'multi_json'
|
3
|
+
rescue LoadError
|
4
|
+
require 'json'
|
5
|
+
end
|
6
|
+
|
7
|
+
module Hanami
|
8
|
+
module Utils
|
9
|
+
# JSON wrapper
|
10
|
+
#
|
11
|
+
# If you use MultiJson gem this wrapper will use it.
|
12
|
+
# Otherwise - JSON std lib.
|
13
|
+
#
|
14
|
+
# @since 0.8.0
|
15
|
+
module Json
|
16
|
+
# rubocop:disable Style/ClassVars
|
17
|
+
if defined?(MultiJson)
|
18
|
+
@@engine = MultiJson
|
19
|
+
ParserError = MultiJson::ParseError
|
20
|
+
else
|
21
|
+
@@engine = ::JSON
|
22
|
+
ParserError = ::JSON::ParserError
|
23
|
+
end
|
24
|
+
# rubocop:enable Style/ClassVars
|
25
|
+
|
26
|
+
# Load the given JSON payload into Ruby objects.
|
27
|
+
#
|
28
|
+
# @param payload [String] a JSON payload
|
29
|
+
#
|
30
|
+
# @return [Object] the result of the loading process
|
31
|
+
#
|
32
|
+
# @raise [Hanami::Utils::Json::ParserError] if the paylod is invalid
|
33
|
+
#
|
34
|
+
# @since 0.8.0
|
35
|
+
def self.load(payload)
|
36
|
+
@@engine.load(payload)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Dump the given object into a JSON payload
|
40
|
+
#
|
41
|
+
# @param object [Object] any object
|
42
|
+
#
|
43
|
+
# @return [String] the result of the dumping process
|
44
|
+
#
|
45
|
+
# @since 0.8.0
|
46
|
+
def self.dump(object)
|
47
|
+
@@engine.dump(object)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/hanami/utils/kernel.rb
CHANGED
@@ -17,6 +17,9 @@ module Hanami
|
|
17
17
|
module Utils
|
18
18
|
# Kernel utilities
|
19
19
|
# @since 0.1.1
|
20
|
+
#
|
21
|
+
# rubocop:disable Style/MethodName
|
22
|
+
# rubocop:disable Metrics/ModuleLength
|
20
23
|
module Kernel
|
21
24
|
# Matcher for numeric values
|
22
25
|
#
|
@@ -24,13 +27,13 @@ module Hanami
|
|
24
27
|
# @api private
|
25
28
|
#
|
26
29
|
# @see Hanami::Utils::Kernel.Integer
|
27
|
-
NUMERIC_MATCHER =
|
30
|
+
NUMERIC_MATCHER = %r{\A([\d\/\.\+iE]+|NaN|Infinity)\z}
|
28
31
|
|
29
|
-
# @since
|
32
|
+
# @since 0.8.0
|
30
33
|
# @api private
|
31
34
|
BOOLEAN_FALSE_STRING = '0'.freeze
|
32
35
|
|
33
|
-
# @since
|
36
|
+
# @since 0.8.0
|
34
37
|
# @api private
|
35
38
|
BOOLEAN_TRUE_INTEGER = 1
|
36
39
|
|
@@ -323,7 +326,7 @@ module Hanami
|
|
323
326
|
# # big complex represented as a string
|
324
327
|
# input = Complex(2, 3)
|
325
328
|
# Hanami::Utils::Kernel.Integer(input) # => TypeError
|
326
|
-
def self.Integer(arg)
|
329
|
+
def self.Integer(arg) # rubocop:disable Metrics/MethodLength
|
327
330
|
super(arg)
|
328
331
|
rescue ArgumentError, TypeError, NoMethodError
|
329
332
|
begin
|
@@ -343,7 +346,6 @@ module Hanami
|
|
343
346
|
# Coerces the argument to be a BigDecimal.
|
344
347
|
#
|
345
348
|
# @param arg [Object] the argument
|
346
|
-
# @param precision [Keyword] precision for Rational objects (Only JRuby).
|
347
349
|
#
|
348
350
|
# @return [BigDecimal] the result of the coercion
|
349
351
|
#
|
@@ -539,7 +541,7 @@ module Hanami
|
|
539
541
|
# # big complex represented as a string
|
540
542
|
# input = Complex(2, 3)
|
541
543
|
# Hanami::Utils::Kernel.Float(input) # => TypeError
|
542
|
-
def self.Float(arg)
|
544
|
+
def self.Float(arg) # rubocop:disable Metrics/MethodLength
|
543
545
|
super(arg)
|
544
546
|
rescue ArgumentError, TypeError
|
545
547
|
begin
|
@@ -888,7 +890,7 @@ module Hanami
|
|
888
890
|
# # Missing #respond_to?
|
889
891
|
# input = BasicObject.new
|
890
892
|
# Hanami::Utils::Kernel.Boolean(input) # => TypeError
|
891
|
-
def self.Boolean(arg)
|
893
|
+
def self.Boolean(arg) # rubocop:disable Metrics/MethodLength
|
892
894
|
case arg
|
893
895
|
when Numeric
|
894
896
|
arg.to_i == BOOLEAN_TRUE_INTEGER
|
@@ -1019,7 +1021,7 @@ module Hanami
|
|
1019
1021
|
#
|
1020
1022
|
# @return [TrueClass,FalseClass]
|
1021
1023
|
#
|
1022
|
-
# @since
|
1024
|
+
# @since 0.8.0
|
1023
1025
|
# @api private
|
1024
1026
|
def self.numeric?(arg)
|
1025
1027
|
!(arg.to_s =~ NUMERIC_MATCHER).nil?
|
@@ -1034,11 +1036,11 @@ module Hanami
|
|
1034
1036
|
# @since 0.4.3
|
1035
1037
|
# @api private
|
1036
1038
|
def self.inspect_type_error(arg)
|
1037
|
-
(arg.respond_to?(:inspect) ? arg.inspect : arg.to_s) <<
|
1039
|
+
(arg.respond_to?(:inspect) ? arg.inspect : arg.to_s) << ' '
|
1038
1040
|
rescue NoMethodError => _
|
1039
1041
|
# missing the #respond_to? method, fall back to returning the class' name
|
1040
1042
|
begin
|
1041
|
-
arg.class.name <<
|
1043
|
+
arg.class.name << ' instance '
|
1042
1044
|
rescue NoMethodError
|
1043
1045
|
# missing the #class method, can't fall back to anything better than nothing
|
1044
1046
|
# Callers will have to guess from their code
|
@@ -1052,4 +1054,3 @@ module Hanami
|
|
1052
1054
|
end
|
1053
1055
|
end
|
1054
1056
|
end
|
1055
|
-
|
@@ -110,12 +110,12 @@ module Hanami
|
|
110
110
|
# paths = Hanami::Utils::LoadPaths.new
|
111
111
|
# paths << '.' << '../..'
|
112
112
|
def push(*paths)
|
113
|
-
@paths.push(*paths)
|
113
|
+
@paths.push(*paths) # rubocop:disable Performance/PushSplat
|
114
114
|
@paths = Kernel.Array(@paths)
|
115
115
|
self
|
116
116
|
end
|
117
117
|
|
118
|
-
|
118
|
+
alias << push
|
119
119
|
|
120
120
|
# It freezes the object by preventing further modifications.
|
121
121
|
#
|
@@ -149,11 +149,13 @@ module Hanami
|
|
149
149
|
end
|
150
150
|
|
151
151
|
protected
|
152
|
+
|
152
153
|
# @since 0.6.0
|
153
154
|
# @api private
|
154
155
|
attr_reader :paths
|
155
156
|
|
156
157
|
private
|
158
|
+
|
157
159
|
# Allow subclasses to define their own policy to discover the realpath
|
158
160
|
# of the given path.
|
159
161
|
#
|
@@ -83,7 +83,7 @@ module Hanami
|
|
83
83
|
result = [prefix, strings]
|
84
84
|
result.flatten!
|
85
85
|
result.compact!
|
86
|
-
result.reject! {|string| string == separator }
|
86
|
+
result.reject! { |string| string == separator }
|
87
87
|
|
88
88
|
self.class.new(
|
89
89
|
result.join(separator), separator
|
@@ -131,13 +131,14 @@ module Hanami
|
|
131
131
|
#
|
132
132
|
# @see #relative
|
133
133
|
def relative!
|
134
|
-
@string.gsub!(
|
135
|
-
@string.sub!(
|
134
|
+
@string.gsub!(/(?<!:)#{separator * 2}/, separator)
|
135
|
+
@string.sub!(/\A#{separator}/, '')
|
136
136
|
|
137
137
|
self
|
138
138
|
end
|
139
139
|
|
140
140
|
private
|
141
|
+
|
141
142
|
# @since 0.1.0
|
142
143
|
# @api private
|
143
144
|
attr_reader :separator
|
data/lib/hanami/utils/string.rb
CHANGED
@@ -5,7 +5,7 @@ module Hanami
|
|
5
5
|
# String on steroids
|
6
6
|
#
|
7
7
|
# @since 0.1.0
|
8
|
-
class String
|
8
|
+
class String # rubocop:disable Metrics/ClassLength
|
9
9
|
# Empty string for #classify
|
10
10
|
#
|
11
11
|
# @since 0.6.0
|
@@ -46,7 +46,7 @@ module Hanami
|
|
46
46
|
#
|
47
47
|
# @since 0.3.0
|
48
48
|
# @api private
|
49
|
-
UNDERSCORE_DIVISION_TARGET
|
49
|
+
UNDERSCORE_DIVISION_TARGET = '\1_\2'.freeze
|
50
50
|
|
51
51
|
# Separator for #titleize
|
52
52
|
#
|
@@ -141,7 +141,7 @@ module Hanami
|
|
141
141
|
# string = Hanami::Utils::String.new 'hanami_utils'
|
142
142
|
# string.classify # => 'HanamiUtils'
|
143
143
|
def classify
|
144
|
-
words = split(CLASSIFY_WORD_SEPARATOR).map!(&:capitalize)
|
144
|
+
words = underscore.split(CLASSIFY_WORD_SEPARATOR).map!(&:capitalize)
|
145
145
|
delimiters = scan(CLASSIFY_WORD_SEPARATOR)
|
146
146
|
|
147
147
|
delimiters.map! do |delimiter|
|
@@ -251,9 +251,10 @@ module Hanami
|
|
251
251
|
# # =>
|
252
252
|
# 'Hanami::Utils'
|
253
253
|
# 'Hanami::App'
|
254
|
-
def tokenize
|
255
|
-
if match = TOKENIZE_REGEXP.match(@string)
|
256
|
-
pre
|
254
|
+
def tokenize # rubocop:disable Metrics/MethodLength
|
255
|
+
if match = TOKENIZE_REGEXP.match(@string) # rubocop:disable Lint/AssignmentInCondition
|
256
|
+
pre = match.pre_match
|
257
|
+
post = match.post_match
|
257
258
|
tokens = match[1].split(TOKENIZE_SEPARATOR)
|
258
259
|
tokens.each do |token|
|
259
260
|
yield(self.class.new("#{pre}#{token}#{post}"))
|
@@ -307,7 +308,7 @@ module Hanami
|
|
307
308
|
@string
|
308
309
|
end
|
309
310
|
|
310
|
-
|
311
|
+
alias to_str to_s
|
311
312
|
|
312
313
|
# Equality
|
313
314
|
#
|
@@ -318,7 +319,7 @@ module Hanami
|
|
318
319
|
to_s == other
|
319
320
|
end
|
320
321
|
|
321
|
-
|
322
|
+
alias eql? ==
|
322
323
|
|
323
324
|
# Split the string with the given pattern
|
324
325
|
#
|
@@ -382,7 +383,7 @@ module Hanami
|
|
382
383
|
# puts result
|
383
384
|
# # => #<Hanami::Utils::String:0x007fdb41232ed0 @string="authors/books#index">
|
384
385
|
def rsub(pattern, replacement)
|
385
|
-
if i = rindex(pattern)
|
386
|
+
if i = rindex(pattern) # rubocop:disable Lint/AssignmentInCondition
|
386
387
|
s = @string.dup
|
387
388
|
s[i] = replacement
|
388
389
|
self.class.new s
|
@@ -403,7 +404,7 @@ module Hanami
|
|
403
404
|
s = self.class.new(s) if s.is_a?(::String)
|
404
405
|
s
|
405
406
|
else
|
406
|
-
raise NoMethodError.new(%(undefined method `#{
|
407
|
+
raise NoMethodError.new(%(undefined method `#{m}' for "#{@string}":#{self.class}))
|
407
408
|
end
|
408
409
|
end
|
409
410
|
|
@@ -411,7 +412,7 @@ module Hanami
|
|
411
412
|
#
|
412
413
|
# @api private
|
413
414
|
# @since 0.3.0
|
414
|
-
def respond_to_missing?(m, include_private=false)
|
415
|
+
def respond_to_missing?(m, include_private = false)
|
415
416
|
@string.respond_to?(m, include_private)
|
416
417
|
end
|
417
418
|
end
|
data/lib/hanami/utils/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hanami-utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2016-
|
13
|
+
date: 2016-07-22 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -32,28 +32,14 @@ dependencies:
|
|
32
32
|
requirements:
|
33
33
|
- - "~>"
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '
|
35
|
+
version: '11'
|
36
36
|
type: :development
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
40
|
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
43
|
-
- !ruby/object:Gem::Dependency
|
44
|
-
name: minitest
|
45
|
-
requirement: !ruby/object:Gem::Requirement
|
46
|
-
requirements:
|
47
|
-
- - "~>"
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: '5.4'
|
50
|
-
type: :development
|
51
|
-
prerelease: false
|
52
|
-
version_requirements: !ruby/object:Gem::Requirement
|
53
|
-
requirements:
|
54
|
-
- - "~>"
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: '5.4'
|
42
|
+
version: '11'
|
57
43
|
description: Hanami utilities
|
58
44
|
email:
|
59
45
|
- me@lucaguidi.com
|
@@ -73,6 +59,7 @@ files:
|
|
73
59
|
- lib/hanami/utils.rb
|
74
60
|
- lib/hanami/utils/attributes.rb
|
75
61
|
- lib/hanami/utils/basic_object.rb
|
62
|
+
- lib/hanami/utils/blank.rb
|
76
63
|
- lib/hanami/utils/callbacks.rb
|
77
64
|
- lib/hanami/utils/class.rb
|
78
65
|
- lib/hanami/utils/class_attribute.rb
|
@@ -82,6 +69,7 @@ files:
|
|
82
69
|
- lib/hanami/utils/hash.rb
|
83
70
|
- lib/hanami/utils/inflector.rb
|
84
71
|
- lib/hanami/utils/io.rb
|
72
|
+
- lib/hanami/utils/json.rb
|
85
73
|
- lib/hanami/utils/kernel.rb
|
86
74
|
- lib/hanami/utils/load_paths.rb
|
87
75
|
- lib/hanami/utils/path_prefix.rb
|
@@ -99,7 +87,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
99
87
|
requirements:
|
100
88
|
- - ">="
|
101
89
|
- !ruby/object:Gem::Version
|
102
|
-
version: 2.
|
90
|
+
version: 2.2.0
|
103
91
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
92
|
requirements:
|
105
93
|
- - ">="
|
@@ -112,4 +100,3 @@ signing_key:
|
|
112
100
|
specification_version: 4
|
113
101
|
summary: Ruby core extentions and Hanami utilities
|
114
102
|
test_files: []
|
115
|
-
has_rdoc:
|