hanami-utils 1.3.6 → 1.3.7
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 +8 -0
- data/README.md +2 -3
- data/hanami-utils.gemspec +19 -16
- data/lib/hanami-utils.rb +3 -1
- data/lib/hanami/interactor.rb +47 -21
- data/lib/hanami/logger.rb +6 -6
- data/lib/hanami/logger/colorizer.rb +10 -10
- data/lib/hanami/logger/filter.rb +77 -9
- data/lib/hanami/logger/formatter.rb +4 -4
- data/lib/hanami/utils.rb +8 -6
- data/lib/hanami/utils/basic_object.rb +2 -2
- data/lib/hanami/utils/blank.rb +3 -1
- data/lib/hanami/utils/callbacks.rb +5 -1
- data/lib/hanami/utils/class.rb +7 -7
- data/lib/hanami/utils/class_attribute.rb +4 -2
- data/lib/hanami/utils/deprecation.rb +3 -1
- data/lib/hanami/utils/duplicable.rb +2 -0
- data/lib/hanami/utils/escape.rb +271 -267
- data/lib/hanami/utils/file_list.rb +2 -0
- data/lib/hanami/utils/files.rb +4 -2
- data/lib/hanami/utils/hash.rb +11 -9
- data/lib/hanami/utils/inflector.rb +106 -107
- data/lib/hanami/utils/io.rb +2 -0
- data/lib/hanami/utils/json.rb +4 -2
- data/lib/hanami/utils/kernel.rb +19 -18
- data/lib/hanami/utils/load_paths.rb +4 -2
- data/lib/hanami/utils/path_prefix.rb +6 -4
- data/lib/hanami/utils/shell_color.rb +7 -7
- data/lib/hanami/utils/string.rb +27 -28
- data/lib/hanami/utils/version.rb +3 -1
- metadata +22 -8
data/lib/hanami/utils/io.rb
CHANGED
data/lib/hanami/utils/json.rb
CHANGED
data/lib/hanami/utils/kernel.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "set"
|
4
|
+
require "date"
|
5
|
+
require "time"
|
6
|
+
require "pathname"
|
7
|
+
require "bigdecimal"
|
8
|
+
require "hanami/utils"
|
9
|
+
require "hanami/utils/string"
|
8
10
|
|
9
11
|
unless defined?(Boolean)
|
10
12
|
# Defines top level constant Boolean, so it can be easily used by other libraries
|
@@ -30,7 +32,7 @@ module Hanami
|
|
30
32
|
|
31
33
|
# @since 0.8.0
|
32
34
|
# @api private
|
33
|
-
BOOLEAN_FALSE_STRING =
|
35
|
+
BOOLEAN_FALSE_STRING = "0"
|
34
36
|
|
35
37
|
# @since 0.8.0
|
36
38
|
# @api private
|
@@ -325,7 +327,7 @@ module Hanami
|
|
325
327
|
# # big complex represented as a string
|
326
328
|
# input = Complex(2, 3)
|
327
329
|
# Hanami::Utils::Kernel.Integer(input) # => TypeError
|
328
|
-
def self.Integer(arg)
|
330
|
+
def self.Integer(arg)
|
329
331
|
super(arg)
|
330
332
|
rescue ArgumentError, TypeError, NoMethodError
|
331
333
|
begin
|
@@ -416,7 +418,6 @@ module Hanami
|
|
416
418
|
# input = BasicObject.new
|
417
419
|
# Hanami::Utils::Kernel.BigDecimal(input) # => TypeError
|
418
420
|
#
|
419
|
-
# rubocop:disable Metrics/MethodLength
|
420
421
|
def self.BigDecimal(arg, precision = ::Float::DIG)
|
421
422
|
case arg
|
422
423
|
when NilClass # This is only needed by Ruby 2.6
|
@@ -433,7 +434,6 @@ module Hanami
|
|
433
434
|
rescue NoMethodError
|
434
435
|
raise TypeError.new "can't convert #{inspect_type_error(arg)}into BigDecimal"
|
435
436
|
end
|
436
|
-
# rubocop:enable Metrics/MethodLength
|
437
437
|
|
438
438
|
# Coerces the argument to be a Float.
|
439
439
|
#
|
@@ -547,7 +547,7 @@ module Hanami
|
|
547
547
|
# # big complex represented as a string
|
548
548
|
# input = Complex(2, 3)
|
549
549
|
# Hanami::Utils::Kernel.Float(input) # => TypeError
|
550
|
-
def self.Float(arg)
|
550
|
+
def self.Float(arg)
|
551
551
|
super(arg)
|
552
552
|
rescue ArgumentError, TypeError
|
553
553
|
begin
|
@@ -736,7 +736,8 @@ module Hanami
|
|
736
736
|
# require 'hanami/utils/kernel'
|
737
737
|
#
|
738
738
|
# Hanami::Utils::Kernel.DateTime(3483943)
|
739
|
-
# # => Time.at(3483943).to_datetime
|
739
|
+
# # => Time.at(3483943).to_datetime
|
740
|
+
# # #<DateTime: 1970-02-10T08:45:43+01:00 ((2440628j,27943s,0n),+3600s,2299161j)>
|
740
741
|
#
|
741
742
|
# Hanami::Utils::Kernel.DateTime(DateTime.now)
|
742
743
|
# # => #<DateTime: 2014-04-18T09:33:49+02:00 ((2456766j,27229s,690849000n),+7200s,2299161j)>
|
@@ -896,7 +897,7 @@ module Hanami
|
|
896
897
|
# # Missing #respond_to?
|
897
898
|
# input = BasicObject.new
|
898
899
|
# Hanami::Utils::Kernel.Boolean(input) # => TypeError
|
899
|
-
def self.Boolean(arg)
|
900
|
+
def self.Boolean(arg)
|
900
901
|
case arg
|
901
902
|
when Numeric
|
902
903
|
arg.to_i == BOOLEAN_TRUE_INTEGER
|
@@ -1012,7 +1013,7 @@ module Hanami
|
|
1012
1013
|
# Hanami::Utils::Kernel.Symbol(input) # => TypeError
|
1013
1014
|
def self.Symbol(arg)
|
1014
1015
|
case arg
|
1015
|
-
when
|
1016
|
+
when "" then raise TypeError.new "can't convert #{inspect_type_error(arg)}into Symbol"
|
1016
1017
|
when ->(a) { a.respond_to?(:to_sym) } then arg.to_sym
|
1017
1018
|
else
|
1018
1019
|
raise TypeError.new "can't convert #{inspect_type_error(arg)}into Symbol"
|
@@ -1042,11 +1043,11 @@ module Hanami
|
|
1042
1043
|
# @since 0.4.3
|
1043
1044
|
# @api private
|
1044
1045
|
def self.inspect_type_error(arg)
|
1045
|
-
(arg.respond_to?(:inspect) ? arg.inspect : arg.to_s) +
|
1046
|
+
(arg.respond_to?(:inspect) ? arg.inspect : arg.to_s) + " "
|
1046
1047
|
rescue NoMethodError
|
1047
1048
|
# missing the #respond_to? method, fall back to returning the class' name
|
1048
1049
|
begin
|
1049
|
-
arg.class.name +
|
1050
|
+
arg.class.name + " instance "
|
1050
1051
|
rescue NoMethodError
|
1051
1052
|
# missing the #class method, can't fall back to anything better than nothing
|
1052
1053
|
# Callers will have to guess from their code
|
@@ -1055,7 +1056,7 @@ module Hanami
|
|
1055
1056
|
end
|
1056
1057
|
|
1057
1058
|
class << self
|
1058
|
-
private :inspect_type_error
|
1059
|
+
private :inspect_type_error
|
1059
1060
|
end
|
1060
1061
|
end
|
1061
1062
|
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "hanami/utils/kernel"
|
2
4
|
|
3
5
|
module Hanami
|
4
6
|
module Utils
|
@@ -115,7 +117,7 @@ module Hanami
|
|
115
117
|
self
|
116
118
|
end
|
117
119
|
|
118
|
-
|
120
|
+
alias_method :<<, :push
|
119
121
|
|
120
122
|
# It freezes the object by preventing further modifications.
|
121
123
|
#
|
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "hanami/utils/string"
|
4
|
+
require "hanami/utils/kernel"
|
3
5
|
|
4
6
|
module Hanami
|
5
7
|
module Utils
|
@@ -11,7 +13,7 @@ module Hanami
|
|
11
13
|
#
|
12
14
|
# @since 0.3.1
|
13
15
|
# @api private
|
14
|
-
DEFAULT_SEPARATOR =
|
16
|
+
DEFAULT_SEPARATOR = "/"
|
15
17
|
|
16
18
|
# Initialize the path prefix
|
17
19
|
#
|
@@ -133,7 +135,7 @@ module Hanami
|
|
133
135
|
# @see #relative
|
134
136
|
def relative!
|
135
137
|
@string.gsub!(/(?<!:)#{separator * 2}/, separator)
|
136
|
-
@string[/\A#{separator}|^/] =
|
138
|
+
@string[/\A#{separator}|^/] = ""
|
137
139
|
|
138
140
|
self
|
139
141
|
end
|
@@ -23,14 +23,14 @@ module Hanami
|
|
23
23
|
# @since 1.2.0
|
24
24
|
# @api private
|
25
25
|
COLORS = ::Hash[
|
26
|
-
black:
|
27
|
-
red:
|
28
|
-
green:
|
29
|
-
yellow:
|
30
|
-
blue:
|
26
|
+
black: 30,
|
27
|
+
red: 31,
|
28
|
+
green: 32,
|
29
|
+
yellow: 33,
|
30
|
+
blue: 34,
|
31
31
|
magenta: 35,
|
32
|
-
cyan:
|
33
|
-
gray:
|
32
|
+
cyan: 36,
|
33
|
+
gray: 37,
|
34
34
|
].freeze
|
35
35
|
|
36
36
|
# Colorizes output
|
data/lib/hanami/utils/string.rb
CHANGED
@@ -1,30 +1,32 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "hanami/utils/inflector"
|
4
|
+
require "transproc"
|
5
|
+
require "concurrent/map"
|
4
6
|
|
5
7
|
module Hanami
|
6
8
|
module Utils
|
7
9
|
# String on steroids
|
8
10
|
#
|
9
11
|
# @since 0.1.0
|
10
|
-
class String
|
12
|
+
class String
|
11
13
|
# Empty string for #classify
|
12
14
|
#
|
13
15
|
# @since 0.6.0
|
14
16
|
# @api private
|
15
|
-
EMPTY_STRING =
|
17
|
+
EMPTY_STRING = ""
|
16
18
|
|
17
19
|
# Separator between Ruby namespaces
|
18
20
|
#
|
19
21
|
# @since 0.1.0
|
20
22
|
# @api private
|
21
|
-
NAMESPACE_SEPARATOR =
|
23
|
+
NAMESPACE_SEPARATOR = "::"
|
22
24
|
|
23
25
|
# Separator for #classify
|
24
26
|
#
|
25
27
|
# @since 0.3.0
|
26
28
|
# @api private
|
27
|
-
CLASSIFY_SEPARATOR =
|
29
|
+
CLASSIFY_SEPARATOR = "_"
|
28
30
|
|
29
31
|
# Regexp for #tokenize
|
30
32
|
#
|
@@ -36,43 +38,43 @@ module Hanami
|
|
36
38
|
#
|
37
39
|
# @since 0.3.0
|
38
40
|
# @api private
|
39
|
-
TOKENIZE_SEPARATOR =
|
41
|
+
TOKENIZE_SEPARATOR = "|"
|
40
42
|
|
41
43
|
# Separator for #underscore
|
42
44
|
#
|
43
45
|
# @since 0.3.0
|
44
46
|
# @api private
|
45
|
-
UNDERSCORE_SEPARATOR =
|
47
|
+
UNDERSCORE_SEPARATOR = "/"
|
46
48
|
|
47
49
|
# gsub second parameter used in #underscore
|
48
50
|
#
|
49
51
|
# @since 0.3.0
|
50
52
|
# @api private
|
51
|
-
UNDERSCORE_DIVISION_TARGET = '\1_\2'
|
53
|
+
UNDERSCORE_DIVISION_TARGET = '\1_\2'
|
52
54
|
|
53
55
|
# Separator for #titleize
|
54
56
|
#
|
55
57
|
# @since 0.4.0
|
56
58
|
# @api private
|
57
|
-
TITLEIZE_SEPARATOR =
|
59
|
+
TITLEIZE_SEPARATOR = " "
|
58
60
|
|
59
61
|
# Separator for #capitalize
|
60
62
|
#
|
61
63
|
# @since 0.5.2
|
62
64
|
# @api private
|
63
|
-
CAPITALIZE_SEPARATOR =
|
65
|
+
CAPITALIZE_SEPARATOR = " "
|
64
66
|
|
65
67
|
# Separator for #dasherize
|
66
68
|
#
|
67
69
|
# @since 0.4.0
|
68
70
|
# @api private
|
69
|
-
DASHERIZE_SEPARATOR =
|
71
|
+
DASHERIZE_SEPARATOR = "-"
|
70
72
|
|
71
73
|
# Regexp for #classify
|
72
74
|
#
|
73
75
|
# @since 0.3.4
|
74
76
|
# @api private
|
75
|
-
CLASSIFY_WORD_SEPARATOR = /#{CLASSIFY_SEPARATOR}|#{NAMESPACE_SEPARATOR}|#{UNDERSCORE_SEPARATOR}|#{DASHERIZE_SEPARATOR}/.freeze
|
77
|
+
CLASSIFY_WORD_SEPARATOR = /#{CLASSIFY_SEPARATOR}|#{NAMESPACE_SEPARATOR}|#{UNDERSCORE_SEPARATOR}|#{DASHERIZE_SEPARATOR}/.freeze # rubocop:disable Layout/LineLength
|
76
78
|
|
77
79
|
@__transformations__ = Concurrent::Map.new
|
78
80
|
|
@@ -81,7 +83,8 @@ module Hanami
|
|
81
83
|
|
82
84
|
# Applies the given transformation(s) to `input`
|
83
85
|
#
|
84
|
-
# It performs a pipeline of transformations, by applying the given
|
86
|
+
# It performs a pipeline of transformations, by applying the given
|
87
|
+
# functions from `Hanami::Utils::String` and `::String`.
|
85
88
|
# The transformations are applied in the given order.
|
86
89
|
#
|
87
90
|
# It doesn't mutate the input, unless you use destructive methods from `::String`
|
@@ -129,8 +132,6 @@ module Hanami
|
|
129
132
|
# Hanami::Utils::String.transform("Cherry", -> { "blossom" }))
|
130
133
|
# # => ArgumentError: wrong number of arguments (given 1, expected 0)
|
131
134
|
#
|
132
|
-
# rubocop:disable Metrics/AbcSize
|
133
|
-
# rubocop:disable Metrics/MethodLength
|
134
135
|
def self.transform(input, *transformations)
|
135
136
|
fn = @__transformations__.fetch_or_store(transformations.hash) do
|
136
137
|
compose do |fns|
|
@@ -142,7 +143,7 @@ module Hanami
|
|
142
143
|
elsif input.respond_to?(transformation)
|
143
144
|
t(:bind, input, ->(i) { i.public_send(transformation, *args) })
|
144
145
|
else
|
145
|
-
raise NoMethodError.new(%(undefined method `#{transformation.inspect}' for #{input.inspect}:#{input.class}))
|
146
|
+
raise NoMethodError.new(%(undefined method `#{transformation.inspect}' for #{input.inspect}:#{input.class})) # rubocop:disable Layout/LineLength
|
146
147
|
end
|
147
148
|
end
|
148
149
|
end
|
@@ -150,8 +151,6 @@ module Hanami
|
|
150
151
|
|
151
152
|
fn.call(input)
|
152
153
|
end
|
153
|
-
# rubocop:enable Metrics/MethodLength
|
154
|
-
# rubocop:enable Metrics/AbcSize
|
155
154
|
|
156
155
|
# Extracted from `transproc` source code
|
157
156
|
#
|
@@ -375,7 +374,7 @@ module Hanami
|
|
375
374
|
# # => 'authors/books#index'
|
376
375
|
def self.rsub(input, pattern, replacement)
|
377
376
|
string = ::String.new(input.to_s)
|
378
|
-
if i = string.rindex(pattern)
|
377
|
+
if i = string.rindex(pattern)
|
379
378
|
s = string.dup
|
380
379
|
s[i] = replacement
|
381
380
|
s
|
@@ -573,9 +572,8 @@ module Hanami
|
|
573
572
|
# 'Hanami::Utils'
|
574
573
|
# 'Hanami::App'
|
575
574
|
#
|
576
|
-
# rubocop:disable Metrics/MethodLength
|
577
575
|
def tokenize
|
578
|
-
if match = TOKENIZE_REGEXP.match(@string)
|
576
|
+
if match = TOKENIZE_REGEXP.match(@string)
|
579
577
|
pre = match.pre_match
|
580
578
|
post = match.post_match
|
581
579
|
tokens = match[1].split(TOKENIZE_SEPARATOR)
|
@@ -588,7 +586,6 @@ module Hanami
|
|
588
586
|
|
589
587
|
nil
|
590
588
|
end
|
591
|
-
# rubocop:enable Metrics/MethodLength
|
592
589
|
|
593
590
|
# Returns a pluralized version of self.
|
594
591
|
#
|
@@ -636,7 +633,7 @@ module Hanami
|
|
636
633
|
@string
|
637
634
|
end
|
638
635
|
|
639
|
-
|
636
|
+
alias_method :to_str, :to_s
|
640
637
|
|
641
638
|
# Equality
|
642
639
|
#
|
@@ -648,7 +645,7 @@ module Hanami
|
|
648
645
|
to_s == other
|
649
646
|
end
|
650
647
|
|
651
|
-
|
648
|
+
alias_method :eql?, :==
|
652
649
|
|
653
650
|
# Splits the string with the given pattern
|
654
651
|
#
|
@@ -717,7 +714,7 @@ module Hanami
|
|
717
714
|
# puts result
|
718
715
|
# # => #<Hanami::Utils::String:0x007fdb41232ed0 @string="authors/books#index">
|
719
716
|
def rsub(pattern, replacement)
|
720
|
-
if i = rindex(pattern)
|
717
|
+
if i = rindex(pattern)
|
721
718
|
s = @string.dup
|
722
719
|
s[i] = replacement
|
723
720
|
self.class.new s
|
@@ -733,7 +730,9 @@ module Hanami
|
|
733
730
|
#
|
734
731
|
# @raise [NoMethodError] If doesn't respond to the given method
|
735
732
|
def method_missing(method_name, *args, &blk)
|
736
|
-
|
733
|
+
unless respond_to?(method_name)
|
734
|
+
raise NoMethodError.new(%(undefined method `#{method_name}' for "#{@string}":#{self.class}))
|
735
|
+
end
|
737
736
|
|
738
737
|
s = @string.__send__(method_name, *args, &blk)
|
739
738
|
s = self.class.new(s) if s.is_a?(::String)
|
data/lib/hanami/utils/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hanami-utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: transproc
|
@@ -78,14 +78,28 @@ dependencies:
|
|
78
78
|
requirements:
|
79
79
|
- - "~>"
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: '3.
|
81
|
+
version: '3.9'
|
82
82
|
type: :development
|
83
83
|
prerelease: false
|
84
84
|
version_requirements: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: '3.
|
88
|
+
version: '3.9'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: rubocop
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - '='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0.81'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - '='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0.81'
|
89
103
|
description: Hanami utilities
|
90
104
|
email:
|
91
105
|
- me@lucaguidi.com
|
@@ -129,7 +143,7 @@ homepage: http://hanamirb.org
|
|
129
143
|
licenses:
|
130
144
|
- MIT
|
131
145
|
metadata: {}
|
132
|
-
post_install_message:
|
146
|
+
post_install_message:
|
133
147
|
rdoc_options: []
|
134
148
|
require_paths:
|
135
149
|
- lib
|
@@ -144,8 +158,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
158
|
- !ruby/object:Gem::Version
|
145
159
|
version: '0'
|
146
160
|
requirements: []
|
147
|
-
rubygems_version: 3.
|
148
|
-
signing_key:
|
161
|
+
rubygems_version: 3.2.4
|
162
|
+
signing_key:
|
149
163
|
specification_version: 4
|
150
164
|
summary: Ruby core extentions and Hanami utilities
|
151
165
|
test_files: []
|