hanami-utils 1.3.8 → 2.0.0.alpha1
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 +14 -33
- data/README.md +5 -13
- data/hanami-utils.gemspec +3 -4
- data/lib/hanami/interactor.rb +33 -65
- data/lib/hanami/logger.rb +12 -12
- data/lib/hanami/logger/colorizer.rb +10 -10
- data/lib/hanami/logger/filter.rb +10 -89
- data/lib/hanami/logger/formatter.rb +7 -7
- data/lib/hanami/middleware.rb +11 -0
- data/lib/hanami/utils.rb +3 -19
- data/lib/hanami/utils/basic_object.rb +3 -63
- data/lib/hanami/utils/blank.rb +6 -8
- data/lib/hanami/utils/callbacks.rb +20 -5
- data/lib/hanami/utils/class.rb +3 -52
- data/lib/hanami/utils/class_attribute.rb +22 -13
- data/lib/hanami/utils/class_attribute/attributes.rb +45 -0
- data/lib/hanami/utils/escape.rb +170 -172
- data/lib/hanami/utils/file_list.rb +1 -1
- data/lib/hanami/utils/files.rb +2 -31
- data/lib/hanami/utils/hash.rb +12 -341
- data/lib/hanami/utils/json.rb +1 -1
- data/lib/hanami/utils/kernel.rb +12 -11
- data/lib/hanami/utils/load_paths.rb +3 -3
- data/lib/hanami/utils/query_string.rb +1 -1
- data/lib/hanami/utils/shell_color.rb +9 -9
- data/lib/hanami/utils/string.rb +38 -102
- data/lib/hanami/utils/version.rb +1 -1
- metadata +12 -26
- data/lib/hanami/utils/duplicable.rb +0 -82
- data/lib/hanami/utils/inflector.rb +0 -493
data/lib/hanami/utils/json.rb
CHANGED
data/lib/hanami/utils/kernel.rb
CHANGED
@@ -9,7 +9,7 @@ require "hanami/utils"
|
|
9
9
|
require "hanami/utils/string"
|
10
10
|
|
11
11
|
unless defined?(Boolean)
|
12
|
-
#
|
12
|
+
# Define top level constant Boolean, so it can be easily used by other libraries
|
13
13
|
# in coercions DSLs
|
14
14
|
#
|
15
15
|
# @since 0.3.0
|
@@ -327,7 +327,7 @@ module Hanami
|
|
327
327
|
# # big complex represented as a string
|
328
328
|
# input = Complex(2, 3)
|
329
329
|
# Hanami::Utils::Kernel.Integer(input) # => TypeError
|
330
|
-
def self.Integer(arg)
|
330
|
+
def self.Integer(arg) # rubocop:disable Metrics/MethodLength
|
331
331
|
super(arg)
|
332
332
|
rescue ArgumentError, TypeError, NoMethodError
|
333
333
|
begin
|
@@ -418,6 +418,7 @@ module Hanami
|
|
418
418
|
# input = BasicObject.new
|
419
419
|
# Hanami::Utils::Kernel.BigDecimal(input) # => TypeError
|
420
420
|
#
|
421
|
+
# rubocop:disable Metrics/MethodLength
|
421
422
|
def self.BigDecimal(arg, precision = ::Float::DIG)
|
422
423
|
case arg
|
423
424
|
when NilClass # This is only needed by Ruby 2.6
|
@@ -434,6 +435,7 @@ module Hanami
|
|
434
435
|
rescue NoMethodError
|
435
436
|
raise TypeError.new "can't convert #{inspect_type_error(arg)}into BigDecimal"
|
436
437
|
end
|
438
|
+
# rubocop:enable Metrics/MethodLength
|
437
439
|
|
438
440
|
# Coerces the argument to be a Float.
|
439
441
|
#
|
@@ -547,7 +549,7 @@ module Hanami
|
|
547
549
|
# # big complex represented as a string
|
548
550
|
# input = Complex(2, 3)
|
549
551
|
# Hanami::Utils::Kernel.Float(input) # => TypeError
|
550
|
-
def self.Float(arg)
|
552
|
+
def self.Float(arg) # rubocop:disable Metrics/MethodLength
|
551
553
|
super(arg)
|
552
554
|
rescue ArgumentError, TypeError
|
553
555
|
begin
|
@@ -736,8 +738,7 @@ module Hanami
|
|
736
738
|
# require 'hanami/utils/kernel'
|
737
739
|
#
|
738
740
|
# Hanami::Utils::Kernel.DateTime(3483943)
|
739
|
-
# # => Time.at(3483943).to_datetime
|
740
|
-
# # #<DateTime: 1970-02-10T08:45:43+01:00 ((2440628j,27943s,0n),+3600s,2299161j)>
|
741
|
+
# # => Time.at(3483943).to_datetime #<DateTime: 1970-02-10T08:45:43+01:00 ((2440628j,27943s,0n),+3600s,2299161j)>
|
741
742
|
#
|
742
743
|
# Hanami::Utils::Kernel.DateTime(DateTime.now)
|
743
744
|
# # => #<DateTime: 2014-04-18T09:33:49+02:00 ((2456766j,27229s,690849000n),+7200s,2299161j)>
|
@@ -897,7 +898,7 @@ module Hanami
|
|
897
898
|
# # Missing #respond_to?
|
898
899
|
# input = BasicObject.new
|
899
900
|
# Hanami::Utils::Kernel.Boolean(input) # => TypeError
|
900
|
-
def self.Boolean(arg)
|
901
|
+
def self.Boolean(arg) # rubocop:disable Metrics/MethodLength
|
901
902
|
case arg
|
902
903
|
when Numeric
|
903
904
|
arg.to_i == BOOLEAN_TRUE_INTEGER
|
@@ -1022,7 +1023,7 @@ module Hanami
|
|
1022
1023
|
raise TypeError.new "can't convert #{inspect_type_error(arg)}into Symbol"
|
1023
1024
|
end
|
1024
1025
|
|
1025
|
-
#
|
1026
|
+
# Check if the given argument is a string representation of a number
|
1026
1027
|
#
|
1027
1028
|
# @param arg [Object] the input
|
1028
1029
|
#
|
@@ -1043,11 +1044,11 @@ module Hanami
|
|
1043
1044
|
# @since 0.4.3
|
1044
1045
|
# @api private
|
1045
1046
|
def self.inspect_type_error(arg)
|
1046
|
-
(arg.respond_to?(:inspect) ? arg.inspect : arg.to_s)
|
1047
|
-
rescue NoMethodError
|
1047
|
+
(arg.respond_to?(:inspect) ? arg.inspect : arg.to_s) << " "
|
1048
|
+
rescue NoMethodError => _
|
1048
1049
|
# missing the #respond_to? method, fall back to returning the class' name
|
1049
1050
|
begin
|
1050
|
-
arg.class.name
|
1051
|
+
arg.class.name << " instance "
|
1051
1052
|
rescue NoMethodError
|
1052
1053
|
# missing the #class method, can't fall back to anything better than nothing
|
1053
1054
|
# Callers will have to guess from their code
|
@@ -1056,7 +1057,7 @@ module Hanami
|
|
1056
1057
|
end
|
1057
1058
|
|
1058
1059
|
class << self
|
1059
|
-
private :inspect_type_error
|
1060
|
+
private :inspect_type_error # rubocop:disable Style/AccessModifierDeclarations
|
1060
1061
|
end
|
1061
1062
|
end
|
1062
1063
|
end
|
@@ -50,7 +50,7 @@ module Hanami
|
|
50
50
|
@paths = original.instance_variable_get(:@paths).dup
|
51
51
|
end
|
52
52
|
|
53
|
-
# Iterates
|
53
|
+
# Iterates thru the collection and yields the given block.
|
54
54
|
# It skips duplications and raises an error in case one of the paths
|
55
55
|
# doesn't exist.
|
56
56
|
#
|
@@ -117,7 +117,7 @@ module Hanami
|
|
117
117
|
self
|
118
118
|
end
|
119
119
|
|
120
|
-
|
120
|
+
alias << push
|
121
121
|
|
122
122
|
# It freezes the object by preventing further modifications.
|
123
123
|
#
|
@@ -158,7 +158,7 @@ module Hanami
|
|
158
158
|
|
159
159
|
private
|
160
160
|
|
161
|
-
#
|
161
|
+
# Allow subclasses to define their own policy to discover the realpath
|
162
162
|
# of the given path.
|
163
163
|
#
|
164
164
|
# @since 0.2.0
|
@@ -18,22 +18,22 @@ module Hanami
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
#
|
21
|
+
# Escape codes for terminals to output strings in colors
|
22
22
|
#
|
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
|
+
# Colorize output
|
37
37
|
# 8 colors available: black, red, green, yellow, blue, magenta, cyan, and gray
|
38
38
|
#
|
39
39
|
# @param input [#to_s] the string to colorize
|
data/lib/hanami/utils/string.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "hanami/utils/inflector"
|
4
3
|
require "transproc"
|
5
4
|
require "concurrent/map"
|
6
5
|
|
@@ -9,7 +8,7 @@ module Hanami
|
|
9
8
|
# String on steroids
|
10
9
|
#
|
11
10
|
# @since 0.1.0
|
12
|
-
class String
|
11
|
+
class String # rubocop:disable Metrics/ClassLength
|
13
12
|
# Empty string for #classify
|
14
13
|
#
|
15
14
|
# @since 0.6.0
|
@@ -74,17 +73,16 @@ module Hanami
|
|
74
73
|
#
|
75
74
|
# @since 0.3.4
|
76
75
|
# @api private
|
77
|
-
CLASSIFY_WORD_SEPARATOR = /#{CLASSIFY_SEPARATOR}|#{NAMESPACE_SEPARATOR}|#{UNDERSCORE_SEPARATOR}|#{DASHERIZE_SEPARATOR}/.freeze
|
76
|
+
CLASSIFY_WORD_SEPARATOR = /#{CLASSIFY_SEPARATOR}|#{NAMESPACE_SEPARATOR}|#{UNDERSCORE_SEPARATOR}|#{DASHERIZE_SEPARATOR}/.freeze
|
78
77
|
|
79
78
|
@__transformations__ = Concurrent::Map.new
|
80
79
|
|
81
80
|
extend Transproc::Registry
|
82
81
|
extend Transproc::Composer
|
83
82
|
|
84
|
-
#
|
83
|
+
# Apply the given transformation(s) to `input`
|
85
84
|
#
|
86
|
-
# It performs a pipeline of transformations, by applying the given
|
87
|
-
# functions from `Hanami::Utils::String` and `::String`.
|
85
|
+
# It performs a pipeline of transformations, by applying the given functions from `Hanami::Utils::String` and `::String`.
|
88
86
|
# The transformations are applied in the given order.
|
89
87
|
#
|
90
88
|
# It doesn't mutate the input, unless you use destructive methods from `::String`
|
@@ -132,6 +130,8 @@ module Hanami
|
|
132
130
|
# Hanami::Utils::String.transform("Cherry", -> { "blossom" }))
|
133
131
|
# # => ArgumentError: wrong number of arguments (given 1, expected 0)
|
134
132
|
#
|
133
|
+
# rubocop:disable Metrics/AbcSize
|
134
|
+
# rubocop:disable Metrics/MethodLength
|
135
135
|
def self.transform(input, *transformations)
|
136
136
|
fn = @__transformations__.fetch_or_store(transformations.hash) do
|
137
137
|
compose do |fns|
|
@@ -143,7 +143,7 @@ module Hanami
|
|
143
143
|
elsif input.respond_to?(transformation)
|
144
144
|
t(:bind, input, ->(i) { i.public_send(transformation, *args) })
|
145
145
|
else
|
146
|
-
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}))
|
147
147
|
end
|
148
148
|
end
|
149
149
|
end
|
@@ -151,6 +151,8 @@ module Hanami
|
|
151
151
|
|
152
152
|
fn.call(input)
|
153
153
|
end
|
154
|
+
# rubocop:enable Metrics/MethodLength
|
155
|
+
# rubocop:enable Metrics/AbcSize
|
154
156
|
|
155
157
|
# Extracted from `transproc` source code
|
156
158
|
#
|
@@ -163,7 +165,7 @@ module Hanami
|
|
163
165
|
binding.instance_exec(value, &fun)
|
164
166
|
end
|
165
167
|
|
166
|
-
#
|
168
|
+
# Return a titleized version of the string
|
167
169
|
#
|
168
170
|
# @param input [::String] the input
|
169
171
|
#
|
@@ -180,7 +182,7 @@ module Hanami
|
|
180
182
|
underscore(string).split(CLASSIFY_SEPARATOR).map(&:capitalize).join(TITLEIZE_SEPARATOR)
|
181
183
|
end
|
182
184
|
|
183
|
-
#
|
185
|
+
# Return a capitalized version of the string
|
184
186
|
#
|
185
187
|
# @param input [::String] the input
|
186
188
|
#
|
@@ -207,7 +209,7 @@ module Hanami
|
|
207
209
|
tail.unshift(head.capitalize).join(CAPITALIZE_SEPARATOR)
|
208
210
|
end
|
209
211
|
|
210
|
-
#
|
212
|
+
# Return a CamelCase version of the string
|
211
213
|
#
|
212
214
|
# @param input [::String] the input
|
213
215
|
#
|
@@ -231,7 +233,7 @@ module Hanami
|
|
231
233
|
words.zip(delimiters).join
|
232
234
|
end
|
233
235
|
|
234
|
-
#
|
236
|
+
# Return a downcased and underscore separated version of the string
|
235
237
|
#
|
236
238
|
# Revised version of `ActiveSupport::Inflector.underscore` implementation
|
237
239
|
# @see https://github.com/rails/rails/blob/feaa6e2048fe86bcf07e967d6e47b865e42e055b/activesupport/lib/active_support/inflector/methods.rb#L90
|
@@ -256,7 +258,7 @@ module Hanami
|
|
256
258
|
string.downcase
|
257
259
|
end
|
258
260
|
|
259
|
-
#
|
261
|
+
# Return a downcased and dash separated version of the string
|
260
262
|
#
|
261
263
|
# @param input [::String] the input
|
262
264
|
#
|
@@ -277,7 +279,7 @@ module Hanami
|
|
277
279
|
underscore(string).split(CLASSIFY_SEPARATOR).join(DASHERIZE_SEPARATOR)
|
278
280
|
end
|
279
281
|
|
280
|
-
#
|
282
|
+
# Return the string without the Ruby namespace of the class
|
281
283
|
#
|
282
284
|
# @param input [::String] the input
|
283
285
|
#
|
@@ -295,7 +297,7 @@ module Hanami
|
|
295
297
|
::String.new(input.to_s).split(NAMESPACE_SEPARATOR).last
|
296
298
|
end
|
297
299
|
|
298
|
-
#
|
300
|
+
# Return the top level namespace name
|
299
301
|
#
|
300
302
|
# @param input [::String] the input
|
301
303
|
#
|
@@ -313,47 +315,7 @@ module Hanami
|
|
313
315
|
::String.new(input.to_s).split(NAMESPACE_SEPARATOR).first
|
314
316
|
end
|
315
317
|
|
316
|
-
#
|
317
|
-
#
|
318
|
-
# @param input [::String] the input
|
319
|
-
#
|
320
|
-
# @return [::String] the pluralized string.
|
321
|
-
#
|
322
|
-
# @since 1.1.0
|
323
|
-
#
|
324
|
-
# @see Hanami::Utils::Inflector
|
325
|
-
# @deprecated
|
326
|
-
#
|
327
|
-
# @example
|
328
|
-
# require 'hanami/utils/string'
|
329
|
-
#
|
330
|
-
# Hanami::Utils::String.pluralize('book') # => 'books'
|
331
|
-
def self.pluralize(input)
|
332
|
-
string = ::String.new(input.to_s)
|
333
|
-
Inflector.pluralize(string)
|
334
|
-
end
|
335
|
-
|
336
|
-
# Returns a singularized version of self.
|
337
|
-
#
|
338
|
-
# @param input [::String] the input
|
339
|
-
#
|
340
|
-
# @return [::String] the singularized string.
|
341
|
-
#
|
342
|
-
# @since 1.1.0
|
343
|
-
# @deprecated
|
344
|
-
#
|
345
|
-
# @see Hanami::Utils::Inflector
|
346
|
-
#
|
347
|
-
# @example
|
348
|
-
# require 'hanami/utils/string'
|
349
|
-
#
|
350
|
-
# Hanami::Utils::String.singularize('books') # => 'book'
|
351
|
-
def self.singularize(input)
|
352
|
-
string = ::String.new(input.to_s)
|
353
|
-
Inflector.singularize(string)
|
354
|
-
end
|
355
|
-
|
356
|
-
# Replaces the rightmost match of `pattern` with `replacement`
|
318
|
+
# Replace the rightmost match of `pattern` with `replacement`
|
357
319
|
#
|
358
320
|
# If the pattern cannot be matched, it returns the original string.
|
359
321
|
#
|
@@ -374,7 +336,7 @@ module Hanami
|
|
374
336
|
# # => 'authors/books#index'
|
375
337
|
def self.rsub(input, pattern, replacement)
|
376
338
|
string = ::String.new(input.to_s)
|
377
|
-
if i = string.rindex(pattern)
|
339
|
+
if i = string.rindex(pattern) # rubocop:disable Lint/AssignmentInCondition
|
378
340
|
s = string.dup
|
379
341
|
s[i] = replacement
|
380
342
|
s
|
@@ -395,7 +357,7 @@ module Hanami
|
|
395
357
|
@string = string.to_s
|
396
358
|
end
|
397
359
|
|
398
|
-
#
|
360
|
+
# Return a titleized version of the string
|
399
361
|
#
|
400
362
|
# @return [Hanami::Utils::String] the transformed string
|
401
363
|
#
|
@@ -411,7 +373,7 @@ module Hanami
|
|
411
373
|
self.class.new underscore.split(CLASSIFY_SEPARATOR).map(&:capitalize).join(TITLEIZE_SEPARATOR)
|
412
374
|
end
|
413
375
|
|
414
|
-
#
|
376
|
+
# Return a capitalized version of the string
|
415
377
|
#
|
416
378
|
# @return [Hanami::Utils::String] the transformed string
|
417
379
|
#
|
@@ -443,7 +405,7 @@ module Hanami
|
|
443
405
|
)
|
444
406
|
end
|
445
407
|
|
446
|
-
#
|
408
|
+
# Return a CamelCase version of the string
|
447
409
|
#
|
448
410
|
# @return [Hanami::Utils::String] the transformed string
|
449
411
|
#
|
@@ -466,7 +428,7 @@ module Hanami
|
|
466
428
|
self.class.new words.zip(delimiters).join
|
467
429
|
end
|
468
430
|
|
469
|
-
#
|
431
|
+
# Return a downcased and underscore separated version of the string
|
470
432
|
#
|
471
433
|
# Revised version of `ActiveSupport::Inflector.underscore` implementation
|
472
434
|
# @see https://github.com/rails/rails/blob/feaa6e2048fe86bcf07e967d6e47b865e42e055b/activesupport/lib/active_support/inflector/methods.rb#L90
|
@@ -490,7 +452,7 @@ module Hanami
|
|
490
452
|
self.class.new new_string
|
491
453
|
end
|
492
454
|
|
493
|
-
#
|
455
|
+
# Return a downcased and dash separated version of the string
|
494
456
|
#
|
495
457
|
# @return [Hanami::Utils::String] the transformed string
|
496
458
|
#
|
@@ -512,7 +474,7 @@ module Hanami
|
|
512
474
|
self.class.new underscore.split(CLASSIFY_SEPARATOR).join(DASHERIZE_SEPARATOR)
|
513
475
|
end
|
514
476
|
|
515
|
-
#
|
477
|
+
# Return the string without the Ruby namespace of the class
|
516
478
|
#
|
517
479
|
# @return [Hanami::Utils::String] the transformed string
|
518
480
|
#
|
@@ -531,7 +493,7 @@ module Hanami
|
|
531
493
|
self.class.new split(NAMESPACE_SEPARATOR).last
|
532
494
|
end
|
533
495
|
|
534
|
-
#
|
496
|
+
# Return the top level namespace name
|
535
497
|
#
|
536
498
|
# @return [Hanami::Utils::String] the transformed string
|
537
499
|
#
|
@@ -572,8 +534,9 @@ module Hanami
|
|
572
534
|
# 'Hanami::Utils'
|
573
535
|
# 'Hanami::App'
|
574
536
|
#
|
537
|
+
# rubocop:disable Metrics/MethodLength
|
575
538
|
def tokenize
|
576
|
-
if match = TOKENIZE_REGEXP.match(@string)
|
539
|
+
if match = TOKENIZE_REGEXP.match(@string) # rubocop:disable Lint/AssignmentInCondition
|
577
540
|
pre = match.pre_match
|
578
541
|
post = match.post_match
|
579
542
|
tokens = match[1].split(TOKENIZE_SEPARATOR)
|
@@ -586,32 +549,7 @@ module Hanami
|
|
586
549
|
|
587
550
|
nil
|
588
551
|
end
|
589
|
-
|
590
|
-
# Returns a pluralized version of self.
|
591
|
-
#
|
592
|
-
# @return [Hanami::Utils::String] the pluralized string.
|
593
|
-
#
|
594
|
-
# @api private
|
595
|
-
# @since 0.4.1
|
596
|
-
# @deprecated
|
597
|
-
#
|
598
|
-
# @see Hanami::Utils::Inflector
|
599
|
-
def pluralize
|
600
|
-
self.class.new Inflector.pluralize(self)
|
601
|
-
end
|
602
|
-
|
603
|
-
# Returns a singularized version of self.
|
604
|
-
#
|
605
|
-
# @return [Hanami::Utils::String] the singularized string.
|
606
|
-
#
|
607
|
-
# @api private
|
608
|
-
# @since 0.4.1
|
609
|
-
# @deprecated
|
610
|
-
#
|
611
|
-
# @see Hanami::Utils::Inflector
|
612
|
-
def singularize
|
613
|
-
self.class.new Inflector.singularize(self)
|
614
|
-
end
|
552
|
+
# rubocop:enable Metrics/MethodLength
|
615
553
|
|
616
554
|
# Returns the hash of the internal string
|
617
555
|
#
|
@@ -633,7 +571,7 @@ module Hanami
|
|
633
571
|
@string
|
634
572
|
end
|
635
573
|
|
636
|
-
|
574
|
+
alias to_str to_s
|
637
575
|
|
638
576
|
# Equality
|
639
577
|
#
|
@@ -645,9 +583,9 @@ module Hanami
|
|
645
583
|
to_s == other
|
646
584
|
end
|
647
585
|
|
648
|
-
|
586
|
+
alias eql? ==
|
649
587
|
|
650
|
-
#
|
588
|
+
# Split the string with the given pattern
|
651
589
|
#
|
652
590
|
# @return [Array<::String>]
|
653
591
|
#
|
@@ -659,7 +597,7 @@ module Hanami
|
|
659
597
|
@string.split(pattern, limit)
|
660
598
|
end
|
661
599
|
|
662
|
-
#
|
600
|
+
# Replace the given pattern with the given replacement
|
663
601
|
#
|
664
602
|
# @return [::String]
|
665
603
|
#
|
@@ -675,7 +613,7 @@ module Hanami
|
|
675
613
|
end
|
676
614
|
end
|
677
615
|
|
678
|
-
#
|
616
|
+
# Iterate through the string, matching the pattern.
|
679
617
|
# Either return all those patterns, or pass them to the block.
|
680
618
|
#
|
681
619
|
# @return [Array<::String>]
|
@@ -688,7 +626,7 @@ module Hanami
|
|
688
626
|
@string.scan(pattern, &blk)
|
689
627
|
end
|
690
628
|
|
691
|
-
#
|
629
|
+
# Replace the rightmost match of `pattern` with `replacement`
|
692
630
|
#
|
693
631
|
# If the pattern cannot be matched, it returns the original string.
|
694
632
|
#
|
@@ -714,7 +652,7 @@ module Hanami
|
|
714
652
|
# puts result
|
715
653
|
# # => #<Hanami::Utils::String:0x007fdb41232ed0 @string="authors/books#index">
|
716
654
|
def rsub(pattern, replacement)
|
717
|
-
if i = rindex(pattern)
|
655
|
+
if i = rindex(pattern) # rubocop:disable Lint/AssignmentInCondition
|
718
656
|
s = @string.dup
|
719
657
|
s[i] = replacement
|
720
658
|
self.class.new s
|
@@ -723,23 +661,21 @@ module Hanami
|
|
723
661
|
end
|
724
662
|
end
|
725
663
|
|
726
|
-
#
|
664
|
+
# Override Ruby's method_missing in order to provide ::String interface
|
727
665
|
#
|
728
666
|
# @api private
|
729
667
|
# @since 0.3.0
|
730
668
|
#
|
731
669
|
# @raise [NoMethodError] If doesn't respond to the given method
|
732
670
|
def method_missing(method_name, *args, &blk)
|
733
|
-
unless respond_to?(method_name)
|
734
|
-
raise NoMethodError.new(%(undefined method `#{method_name}' for "#{@string}":#{self.class}))
|
735
|
-
end
|
671
|
+
raise NoMethodError.new(%(undefined method `#{method_name}' for "#{@string}":#{self.class})) unless respond_to?(method_name)
|
736
672
|
|
737
673
|
s = @string.__send__(method_name, *args, &blk)
|
738
674
|
s = self.class.new(s) if s.is_a?(::String)
|
739
675
|
s
|
740
676
|
end
|
741
677
|
|
742
|
-
#
|
678
|
+
# Override Ruby's respond_to_missing? in order to support ::String interface
|
743
679
|
#
|
744
680
|
# @api private
|
745
681
|
# @since 0.3.0
|