hanami-utils 1.3.8 → 2.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,7 +6,7 @@ module Hanami
6
6
  #
7
7
  # @since 0.9.0
8
8
  module FileList
9
- # Returns an ordered list of files, consistent across operating systems
9
+ # Return an ordered list of files, consistent across operating systems
10
10
  #
11
11
  # It has the same signature of <tt>Dir.glob</tt>, it just guarantees to
12
12
  # order the results before to return them.
@@ -34,24 +34,6 @@ module Hanami
34
34
  open(path, ::File::CREAT | ::File::WRONLY | ::File::TRUNC, *content) # rubocop:disable Security/Open - this isn't a call to `::Kernel.open`, but to `self.open`
35
35
  end
36
36
 
37
- # Rewrites the contents of an existing file.
38
- # If the path already exists, it replaces the contents.
39
- #
40
- # @param path [String,Pathname] the path to file
41
- # @param content [String, Array<String>] the content to write
42
- #
43
- # @raise [Errno::ENOENT] if the path doesn't exist
44
- #
45
- # @since 1.1.0
46
- def self.rewrite(path, *content)
47
- Hanami::Utils::Deprecation.new(
48
- "`.rewrite' is deprecated, please use `.write'"
49
- )
50
- raise Errno::ENOENT unless File.exist?(path)
51
-
52
- write(path, *content)
53
- end
54
-
55
37
  # Copies source into destination.
56
38
  # All the intermediate directories are created.
57
39
  # If the destination already exists, it overrides the contents.
@@ -165,7 +147,6 @@ module Hanami
165
147
  mkdir_p(path)
166
148
 
167
149
  content = ::File.readlines(path)
168
- content << "\n" if _append_newline?(content)
169
150
  content << "#{contents}\n"
170
151
 
171
152
  write(path, content)
@@ -326,12 +307,12 @@ module Hanami
326
307
  #
327
308
  # # class App
328
309
  # # end
329
- def self.remove_block(path, target)
310
+ def self.remove_block(path, target) # rubocop:disable Metrics/AbcSize
330
311
  content = ::File.readlines(path)
331
312
  starting = index(content, path, target)
332
313
  line = content[starting]
333
314
  size = line[/\A[[:space:]]*/].bytesize
334
- closing = (" " * size) + (target =~ /{/ ? "}" : "end")
315
+ closing = (" " * size) + (/{/.match?(target) ? "}" : "end")
335
316
  ending = starting + index(content[starting..-1], path, closing)
336
317
 
337
318
  content.slice!(starting..ending)
@@ -454,16 +435,6 @@ module Hanami
454
435
  end
455
436
 
456
437
  private_class_method :line_number
457
-
458
- # @since 1.3.6
459
- # @api private
460
- def self._append_newline?(content)
461
- return false if content.empty?
462
-
463
- !content.last.end_with?("\n")
464
- end
465
-
466
- private_class_method :_append_newline?
467
438
  end
468
439
  end
469
440
  end
@@ -1,28 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "hanami/utils/duplicable"
4
3
  require "transproc"
5
4
 
6
5
  module Hanami
7
6
  module Utils
8
- # Hash on steroids
7
+ # Hash transformations
9
8
  # @since 0.1.0
10
- #
11
- class Hash
12
- # @since 0.6.0
13
- # @api private
14
- #
15
- # @see Hanami::Utils::Hash#deep_dup
16
- # @see Hanami::Utils::Duplicable
17
- DUPLICATE_LOGIC = proc do |value|
18
- case value
19
- when Hash
20
- value.deep_dup
21
- when ::Hash
22
- Hash.new(value).deep_dup.to_h
23
- end
24
- end.freeze
25
-
9
+ module Hash
26
10
  extend Transproc::Registry
27
11
  import Transproc::HashTransformations
28
12
 
@@ -48,7 +32,7 @@ module Hanami
48
32
  self[:symbolize_keys].call(input)
49
33
  end
50
34
 
51
- # Performs deep symbolize on the given hash
35
+ # Deep symbolize the given hash
52
36
  #
53
37
  # @param input [::Hash] the input
54
38
  #
@@ -70,7 +54,7 @@ module Hanami
70
54
  self[:deep_symbolize_keys].call(input)
71
55
  end
72
56
 
73
- # Stringifies the given hash
57
+ # Stringify the given hash
74
58
  #
75
59
  # @param input [::Hash] the input
76
60
  #
@@ -90,7 +74,7 @@ module Hanami
90
74
  self[:stringify_keys].call(input)
91
75
  end
92
76
 
93
- # Deeply stringifies the given hash
77
+ # Deeply stringify the given hash
94
78
  #
95
79
  # @param input [::Hash] the input
96
80
  #
@@ -106,7 +90,7 @@ module Hanami
106
90
  #
107
91
  # hash.class
108
92
  # # => Hash
109
- def self.deep_stringify(input)
93
+ def self.deep_stringify(input) # rubocop:disable Metrics/MethodLength
110
94
  input.each_with_object({}) do |(key, value), output|
111
95
  output[key.to_s] =
112
96
  case value
@@ -122,15 +106,15 @@ module Hanami
122
106
  end
123
107
  end
124
108
 
125
- # Deep duplicates hash values
109
+ # Deep duplicate hash values
126
110
  #
127
- # The output of this function is a deep duplicate of the input.
111
+ # The output of this function is a shallow duplicate of the input.
128
112
  # Any further modification on the input, won't be reflected on the output
129
113
  # and viceversa.
130
114
  #
131
115
  # @param input [::Hash] the input
132
116
  #
133
- # @return [::Hash] the deep duplicate of input
117
+ # @return [::Hash] the shallow duplicate of input
134
118
  #
135
119
  # @since 1.0.1
136
120
  #
@@ -165,12 +149,12 @@ module Hanami
165
149
  when ::Hash
166
150
  deep_dup(v)
167
151
  else
168
- Duplicable.dup(v)
152
+ v.dup
169
153
  end
170
154
  end
171
155
  end
172
156
 
173
- # Deep serializes given object into a `Hash`
157
+ # Deep serialize given object into a `Hash`
174
158
  #
175
159
  # Please note that the returning `Hash` will use symbols as keys.
176
160
  #
@@ -194,7 +178,7 @@ module Hanami
194
178
  #
195
179
  # Hanami::Utils::Hash.deep_serialize(input)
196
180
  # # => {:foo=>"bar", :baz=>[{:hello=>"world"}]}
197
- def self.deep_serialize(input)
181
+ def self.deep_serialize(input) # rubocop:disable Metrics/MethodLength
198
182
  input.to_hash.each_with_object({}) do |(key, value), output|
199
183
  output[key.to_sym] =
200
184
  case value
@@ -209,319 +193,6 @@ module Hanami
209
193
  end
210
194
  end
211
195
  end
212
-
213
- # Initialize the hash
214
- #
215
- # @param hash [#to_h] the value we want to use to initialize this instance
216
- # @param blk [Proc] define the default value
217
- #
218
- # @return [Hanami::Utils::Hash] self
219
- #
220
- # @since 0.1.0
221
- # @deprecated
222
- #
223
- # @see http://www.ruby-doc.org/core/Hash.html#method-c-5B-5D
224
- #
225
- # @example Passing a Hash
226
- # require 'hanami/utils/hash'
227
- #
228
- # hash = Hanami::Utils::Hash.new('l' => 23)
229
- # hash['l'] # => 23
230
- #
231
- # @example Passing a block for default
232
- # require 'hanami/utils/hash'
233
- #
234
- # hash = Hanami::Utils::Hash.new {|h,k| h[k] = [] }
235
- # hash['foo'].push 'bar'
236
- #
237
- # hash.to_h # => { 'foo' => ['bar'] }
238
- def initialize(hash = {}, &blk)
239
- @hash = hash.to_hash
240
- @hash.default_proc = blk if blk
241
- end
242
-
243
- # Converts in-place all the keys to Symbol instances.
244
- #
245
- # @return [Hash] self
246
- #
247
- # @since 0.1.0
248
- # @deprecated Use {Hanami::Utils::Hash.symbolize}
249
- #
250
- # @example
251
- # require 'hanami/utils/hash'
252
- #
253
- # hash = Hanami::Utils::Hash.new 'a' => 23, 'b' => { 'c' => ['x','y','z'] }
254
- # hash.symbolize!
255
- #
256
- # hash.keys # => [:a, :b]
257
- # hash.inspect # => { :a => 23, :b => { 'c' => ["x", "y", "z"] } }
258
- def symbolize!
259
- keys.each do |k|
260
- v = delete(k)
261
- self[k.to_sym] = v
262
- end
263
-
264
- self
265
- end
266
-
267
- # Converts in-place all the keys to Symbol instances, nested hashes are converted too.
268
- #
269
- # @return [Hash] self
270
- #
271
- # @since 1.0.0
272
- # @deprecated Use {Hanami::Utils::Hash.deep_symbolize}
273
- #
274
- # @example
275
- # require 'hanami/utils/hash'
276
- #
277
- # hash = Hanami::Utils::Hash.new 'a' => 23, 'b' => { 'c' => ['x','y','z'] }
278
- # hash.deep_symbolize!
279
- #
280
- # hash.keys # => [:a, :b]
281
- # hash.inspect # => {:a=>23, :b=>{:c=>["x", "y", "z"]}}
282
- def deep_symbolize!
283
- keys.each do |k|
284
- v = delete(k)
285
- v = self.class.new(v).deep_symbolize! if v.respond_to?(:to_hash)
286
-
287
- self[k.to_sym] = v
288
- end
289
-
290
- self
291
- end
292
-
293
- # Converts in-place all the keys to Symbol instances, nested hashes are converted too.
294
- #
295
- # @return [Hash] self
296
- #
297
- # @since 0.3.2
298
- # @deprecated Use {Hanami::Utils::Hash.stringify}
299
- #
300
- # @example
301
- # require 'hanami/utils/hash'
302
- #
303
- # hash = Hanami::Utils::Hash.new a: 23, b: { c: ['x','y','z'] }
304
- # hash.stringify!
305
- #
306
- # hash.keys # => [:a, :b]
307
- # hash.inspect # => {"a"=>23, "b"=>{"c"=>["x", "y", "z"]}}
308
- def stringify!
309
- keys.each do |k|
310
- v = delete(k)
311
- v = self.class.new(v).stringify! if v.respond_to?(:to_hash)
312
-
313
- self[k.to_s] = v
314
- end
315
-
316
- self
317
- end
318
-
319
- # Returns a deep copy of the current Hanami::Utils::Hash
320
- #
321
- # @return [Hash] a deep duplicated self
322
- #
323
- # @since 0.3.1
324
- # @deprecated Use {Hanami::Utils::Hash.deep_dup}
325
- #
326
- # @example
327
- # require 'hanami/utils/hash'
328
- #
329
- # hash = Hanami::Utils::Hash.new(
330
- # 'nil' => nil,
331
- # 'false' => false,
332
- # 'true' => true,
333
- # 'symbol' => :foo,
334
- # 'fixnum' => 23,
335
- # 'bignum' => 13289301283 ** 2,
336
- # 'float' => 1.0,
337
- # 'complex' => Complex(0.3),
338
- # 'bigdecimal' => BigDecimal('12.0001'),
339
- # 'rational' => Rational(0.3),
340
- # 'string' => 'foo bar',
341
- # 'hash' => { a: 1, b: 'two', c: :three },
342
- # 'u_hash' => Hanami::Utils::Hash.new({ a: 1, b: 'two', c: :three })
343
- # )
344
- #
345
- # duped = hash.deep_dup
346
- #
347
- # hash.class # => Hanami::Utils::Hash
348
- # duped.class # => Hanami::Utils::Hash
349
- #
350
- # hash.object_id # => 70147385937100
351
- # duped.object_id # => 70147385950620
352
- #
353
- # # unduplicated values
354
- # duped['nil'] # => nil
355
- # duped['false'] # => false
356
- # duped['true'] # => true
357
- # duped['symbol'] # => :foo
358
- # duped['fixnum'] # => 23
359
- # duped['bignum'] # => 176605528590345446089
360
- # duped['float'] # => 1.0
361
- # duped['complex'] # => (0.3+0i)
362
- # duped['bigdecimal'] # => #<BigDecimal:7f9ffe6e2fd0,'0.120001E2',18(18)>
363
- # duped['rational'] # => 5404319552844595/18014398509481984)
364
- #
365
- # # it duplicates values
366
- # duped['string'].reverse!
367
- # duped['string'] # => "rab oof"
368
- # hash['string'] # => "foo bar"
369
- #
370
- # # it deeply duplicates Hash, by preserving the class
371
- # duped['hash'].class # => Hash
372
- # duped['hash'].delete(:a)
373
- # hash['hash'][:a] # => 1
374
- #
375
- # duped['hash'][:b].upcase!
376
- # duped['hash'][:b] # => "TWO"
377
- # hash['hash'][:b] # => "two"
378
- #
379
- # # it deeply duplicates Hanami::Utils::Hash, by preserving the class
380
- # duped['u_hash'].class # => Hanami::Utils::Hash
381
- def deep_dup
382
- self.class.new.tap do |result|
383
- @hash.each { |k, v| result[k] = Duplicable.dup(v, &DUPLICATE_LOGIC) }
384
- end
385
- end
386
-
387
- # Returns a new array populated with the keys from this hash
388
- #
389
- # @return [Array] the keys
390
- #
391
- # @since 0.3.0
392
- # @deprecated
393
- #
394
- # @see http://www.ruby-doc.org/core/Hash.html#method-i-keys
395
- def keys
396
- @hash.keys
397
- end
398
-
399
- # Deletes the key-value pair and returns the value from hsh whose key is
400
- # equal to key.
401
- #
402
- # @param key [Object] the key to remove
403
- #
404
- # @return [Object,nil] the value hold by the given key, if present
405
- #
406
- # @since 0.3.0
407
- # @deprecated
408
- #
409
- # @see http://www.ruby-doc.org/core/Hash.html#method-i-keys
410
- def delete(key)
411
- @hash.delete(key)
412
- end
413
-
414
- # Retrieves the value object corresponding to the key object.
415
- #
416
- # @param key [Object] the key
417
- #
418
- # @return [Object,nil] the correspoding value, if present
419
- #
420
- # @since 0.3.0
421
- # @deprecated
422
- #
423
- # @see http://www.ruby-doc.org/core/Hash.html#method-i-5B-5D
424
- def [](key)
425
- @hash[key]
426
- end
427
-
428
- # Associates the value given by value with the key given by key.
429
- #
430
- # @param key [Object] the key to assign
431
- # @param value [Object] the value to assign
432
- #
433
- # @since 0.3.0
434
- # @deprecated
435
- #
436
- # @see http://www.ruby-doc.org/core/Hash.html#method-i-5B-5D-3D
437
- def []=(key, value)
438
- @hash[key] = value
439
- end
440
-
441
- # Returns a Ruby Hash as duplicated version of self
442
- #
443
- # @return [::Hash] the hash
444
- #
445
- # @since 0.3.0
446
- # @deprecated
447
- #
448
- # @see http://www.ruby-doc.org/core/Hash.html#method-i-to_h
449
- def to_h
450
- @hash.each_with_object({}) do |(k, v), result|
451
- v = v.to_h if v.respond_to?(:to_hash)
452
- result[k] = v
453
- end
454
- end
455
-
456
- alias_method :to_hash, :to_h
457
-
458
- # Converts into a nested array of [ key, value ] arrays.
459
- #
460
- # @return [::Array] the array
461
- #
462
- # @since 0.3.0
463
- # @deprecated
464
- #
465
- # @see http://www.ruby-doc.org/core/Hash.html#method-i-to_a
466
- def to_a
467
- @hash.to_a
468
- end
469
-
470
- # Equality
471
- #
472
- # @return [TrueClass,FalseClass]
473
- #
474
- # @since 0.3.0
475
- # @deprecated
476
- def ==(other)
477
- @hash == other.to_h
478
- end
479
-
480
- alias_method :eql?, :==
481
-
482
- # Returns the hash of the internal @hash
483
- #
484
- # @return [Fixnum]
485
- #
486
- # @since 0.3.0
487
- # @deprecated
488
- def hash
489
- @hash.hash
490
- end
491
-
492
- # Returns a string describing the internal @hash
493
- #
494
- # @return [String]
495
- #
496
- # @since 0.3.0
497
- # @deprecated
498
- def inspect
499
- @hash.inspect
500
- end
501
-
502
- # Overrides Ruby's method_missing in order to provide ::Hash interface
503
- #
504
- # @api private
505
- # @since 0.3.0
506
- #
507
- # @raise [NoMethodError] If doesn't respond to the given method
508
- def method_missing(method_name, *args, &blk)
509
- unless respond_to?(method_name)
510
- raise NoMethodError.new(%(undefined method `#{method_name}' for #{@hash}:#{self.class}))
511
- end
512
-
513
- h = @hash.__send__(method_name, *args, &blk)
514
- h = self.class.new(h) if h.is_a?(::Hash)
515
- h
516
- end
517
-
518
- # Overrides Ruby's respond_to_missing? in order to support ::Hash interface
519
- #
520
- # @api private
521
- # @since 0.3.0
522
- def respond_to_missing?(method_name, include_private = false)
523
- @hash.respond_to?(method_name, include_private)
524
- end
525
196
  end
526
197
  end
527
198
  end