tty-file 0.8.0 → 0.9.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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/lib/tty/file.rb +75 -85
  4. data/lib/tty/file/create_file.rb +5 -5
  5. data/lib/tty/file/differ.rb +5 -4
  6. data/lib/tty/file/digest_file.rb +4 -4
  7. data/lib/tty/file/download_file.rb +5 -5
  8. data/lib/tty/file/version.rb +1 -1
  9. metadata +19 -56
  10. data/Rakefile +0 -10
  11. data/bin/console +0 -14
  12. data/bin/setup +0 -8
  13. data/spec/fixtures/cli_app/%name%_cli.rb +0 -2
  14. data/spec/fixtures/cli_app/commands/subcommand.rb +0 -2
  15. data/spec/fixtures/cli_app/excluded/%name%_cli.rb +0 -2
  16. data/spec/fixtures/templates/%file_name%.rb +0 -1
  17. data/spec/fixtures/templates/unit_test.rb +0 -1
  18. data/spec/spec_helper.rb +0 -94
  19. data/spec/unit/append_to_file_spec.rb +0 -110
  20. data/spec/unit/binary_spec.rb +0 -230
  21. data/spec/unit/checksum_file_spec.rb +0 -48
  22. data/spec/unit/chmod_spec.rb +0 -92
  23. data/spec/unit/copy_directory_spec.rb +0 -120
  24. data/spec/unit/copy_file_spec.rb +0 -172
  25. data/spec/unit/create_directory_spec.rb +0 -93
  26. data/spec/unit/create_file_spec.rb +0 -130
  27. data/spec/unit/diff_spec.rb +0 -107
  28. data/spec/unit/differ/call_spec.rb +0 -101
  29. data/spec/unit/download_file_spec.rb +0 -68
  30. data/spec/unit/escape_glob_path_spec.rb +0 -14
  31. data/spec/unit/inject_into_file_spec.rb +0 -176
  32. data/spec/unit/prepend_to_file_spec.rb +0 -124
  33. data/spec/unit/read_to_char_spec.rb +0 -24
  34. data/spec/unit/remove_file_spec.rb +0 -67
  35. data/spec/unit/replace_in_file_spec.rb +0 -140
  36. data/spec/unit/tail_file_spec.rb +0 -77
  37. data/tasks/console.rake +0 -11
  38. data/tasks/coverage.rake +0 -11
  39. data/tasks/spec.rake +0 -29
  40. data/tty-file.gemspec +0 -33
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ff0231767c10a14f731dcf153855ef3c652f0db9996e0a9588ad17b8c6bb4bdc
4
- data.tar.gz: a441339b4d10b0ab58e6775d1df7471c36a475700ffdd385ad18d75c0b28459b
3
+ metadata.gz: 3c14d1cde8381d3b5e40e0b73139df56495bf4247abc1e5b28cfa5cfc17ed94a
4
+ data.tar.gz: 752eebdc5b63125700de9ed06aa8abd700ab1518a595e26b2bbaa767dadc31c4
5
5
  SHA512:
6
- metadata.gz: 322c2d767842c0a315c98eb01175cb0b2ca1b32ce6a5d961ef274d67db9428c5c6b32a710c81345a6383ca92cd67862f2a3354a853f587ed00b47196eb75f664
7
- data.tar.gz: 340eb4e7b495e9ed91224fd6eec7df4e4990c4ef5dd5024e08110285560bf3e1bf5dd6c33433493f145f8b5dc3f76aa60052fbca5933816dbca0569c60e2ef77
6
+ metadata.gz: 2625754b9f281800439fbc63eea1b978bf3711ec38eb5040e8279f3ce68de5880c8a58003f2f42b7717f86660f987aa321db128f095cef9a81360b19a020da3f
7
+ data.tar.gz: e87cd920b9f868ed0774d986b997e697a1351cc83916b05fd148e439b0e9fc5c24ace82d41add7c287dced567ba5ce43010cd58667f04409c3a49d1988fbf38d
@@ -1,5 +1,15 @@
1
1
  # Change log
2
2
 
3
+ ## [v0.9.0] - 2020-04-28
4
+
5
+ ### Changed
6
+ * Change #chmod custom permission implementation for built-in FileUtils one
7
+ * Change to update tty-prompt dependency
8
+ * Change gemspec to include metadata and stop loading test artefacts
9
+
10
+ ### Fixed
11
+ * Fix Ruby 2.7 hash to keywords conversion warnings
12
+
3
13
  ## [v0.8.0] - 2019-07-25
4
14
 
5
15
  ### Added
@@ -96,6 +106,7 @@
96
106
 
97
107
  * Initial implementation and release
98
108
 
109
+ [v0.9.0]: https://github.com/piotrmurach/tty-file/compare/v0.8.0...v0.9.0
99
110
  [v0.8.0]: https://github.com/piotrmurach/tty-file/compare/v0.7.1...v0.8.0
100
111
  [v0.7.1]: https://github.com/piotrmurach/tty-file/compare/v0.7.0...v0.7.1
101
112
  [v0.7.0]: https://github.com/piotrmurach/tty-file/compare/v0.6.0...v0.7.0
@@ -1,16 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'pastel'
4
- require 'erb'
5
- require 'tempfile'
6
- require 'pathname'
7
-
8
- require_relative 'file/create_file'
9
- require_relative 'file/digest_file'
10
- require_relative 'file/download_file'
11
- require_relative 'file/differ'
12
- require_relative 'file/read_backward_file'
13
- require_relative 'file/version'
3
+ require "pastel"
4
+ require "erb"
5
+ require "tempfile"
6
+ require "pathname"
7
+
8
+ require_relative "file/create_file"
9
+ require_relative "file/digest_file"
10
+ require_relative "file/download_file"
11
+ require_relative "file/differ"
12
+ require_relative "file/read_backward_file"
13
+ require_relative "file/version"
14
14
 
15
15
  module TTY
16
16
  module File
@@ -41,10 +41,10 @@ module TTY
41
41
  # the path to file to check
42
42
  #
43
43
  # @example
44
- # binary?('Gemfile') # => false
44
+ # binary?("Gemfile") # => false
45
45
  #
46
46
  # @example
47
- # binary?('image.jpg') # => true
47
+ # binary?("image.jpg") # => true
48
48
  #
49
49
  # @return [Boolean]
50
50
  # Returns `true` if the file is binary, `false` otherwise
@@ -103,18 +103,18 @@ module TTY
103
103
  # No operation
104
104
  #
105
105
  # @example
106
- # checksum_file('/path/to/file')
106
+ # checksum_file("/path/to/file")
107
107
  #
108
108
  # @example
109
- # checksum_file('Some string content', 'md5')
109
+ # checksum_file("Some string content", "md5")
110
110
  #
111
111
  # @return [String]
112
112
  # the generated hex value
113
113
  #
114
114
  # @api public
115
115
  def checksum_file(source, *args, **options)
116
- mode = args.size.zero? ? 'sha256' : args.pop
117
- digester = DigestFile.new(source, mode, options)
116
+ mode = args.size.zero? ? "sha256" : args.pop
117
+ digester = DigestFile.new(source, mode)
118
118
  digester.call unless options[:noop]
119
119
  end
120
120
  module_function :checksum_file
@@ -129,31 +129,19 @@ module TTY
129
129
  # @option options [Symbol] :force
130
130
  #
131
131
  # @example
132
- # chmod('Gemfile', 0755)
132
+ # chmod("Gemfile", 0755)
133
133
  #
134
134
  # @example
135
- # chmod('Gemilfe', TTY::File::U_R | TTY::File::U_W)
135
+ # chmod("Gemilfe", TTY::File::U_R | TTY::File::U_W)
136
136
  #
137
137
  # @example
138
- # chmod('Gemfile', 'u+x,g+x')
138
+ # chmod("Gemfile", "u+x,g+x")
139
139
  #
140
140
  # @api public
141
141
  def chmod(relative_path, permissions, **options)
142
- mode = ::File.lstat(relative_path).mode
143
- if permissions.to_s =~ /\d+/
144
- mode = permissions
145
- else
146
- permissions.scan(/[ugoa][+-=][rwx]+/) do |setting|
147
- who, action = setting[0], setting[1]
148
- setting[2..setting.size].each_byte do |perm|
149
- mask = const_get("#{who.upcase}_#{perm.chr.upcase}")
150
- (action == '+') ? mode |= mask : mode ^= mask
151
- end
152
- end
153
- end
154
142
  log_status(:chmod, relative_path, options.fetch(:verbose, true),
155
- options.fetch(:color, :green))
156
- ::FileUtils.chmod_R(mode, relative_path) unless options[:noop]
143
+ options.fetch(:color, :green))
144
+ ::FileUtils.chmod_R(permissions, relative_path) unless options[:noop]
157
145
  end
158
146
  module_function :chmod
159
147
 
@@ -163,18 +151,18 @@ module TTY
163
151
  # the path or data structure describing directory tree
164
152
  #
165
153
  # @example
166
- # create_directory('/path/to/dir')
154
+ # create_directory("/path/to/dir")
167
155
  #
168
156
  # @example
169
157
  # tree =
170
- # 'app' => [
171
- # 'README.md',
172
- # ['Gemfile', "gem 'tty-file'"],
173
- # 'lib' => [
174
- # 'cli.rb',
175
- # ['file_utils.rb', "require 'tty-file'"]
158
+ # "app" => [
159
+ # "README.md",
160
+ # ["Gemfile", "gem "tty-file""],
161
+ # "lib" => [
162
+ # "cli.rb",
163
+ # ["file_utils.rb", "require "tty-file""]
176
164
  # ]
177
- # 'spec' => []
165
+ # "spec" => []
178
166
  # ]
179
167
  #
180
168
  # create_directory(tree)
@@ -198,9 +186,9 @@ module TTY
198
186
 
199
187
  files.each do |filename, contents|
200
188
  if filename.respond_to?(:each_pair)
201
- create_directory(filename, path, options)
189
+ create_directory(filename, path, **options)
202
190
  else
203
- create_file(::File.join(path, filename), contents, options)
191
+ create_file(::File.join(path, filename), contents, **options)
204
192
  end
205
193
  end
206
194
  end
@@ -220,11 +208,11 @@ module TTY
220
208
  # forces ovewrite if conflict present
221
209
  #
222
210
  # @example
223
- # create_file('doc/README.md', '# Title header')
211
+ # create_file("doc/README.md", "# Title header")
224
212
  #
225
213
  # @example
226
- # create_file 'doc/README.md' do
227
- # '# Title Header'
214
+ # create_file "doc/README.md" do
215
+ # "# Title Header"
228
216
  # end
229
217
  #
230
218
  # @api public
@@ -243,12 +231,12 @@ module TTY
243
231
  # destination running it through ERB.
244
232
  #
245
233
  # @example
246
- # copy_file 'templates/test.rb', 'app/test.rb'
234
+ # copy_file "templates/test.rb", "app/test.rb"
247
235
  #
248
236
  # @example
249
237
  # vars = OpenStruct.new
250
- # vars[:name] = 'foo'
251
- # copy_file 'templates/%name%.rb', 'app/%name%.rb', context: vars
238
+ # vars[:name] = "foo"
239
+ # copy_file "templates/%name%.rb", "app/%name%.rb", context: vars
252
240
  #
253
241
  # @param [String, Pathname] source_path
254
242
  # @param [Hash] options
@@ -265,15 +253,15 @@ module TTY
265
253
  # @api public
266
254
  def copy_file(source_path, *args, **options, &block)
267
255
  source_path = source_path.to_s
268
- dest_path = (args.first || source_path).to_s.sub(/\.erb$/, '')
256
+ dest_path = (args.first || source_path).to_s.sub(/\.erb$/, "")
269
257
 
270
258
  ctx = if (vars = options[:context])
271
- vars.instance_eval('binding')
259
+ vars.instance_eval("binding")
272
260
  else
273
- instance_eval('binding')
261
+ instance_eval("binding")
274
262
  end
275
263
 
276
- create_file(dest_path, options) do
264
+ create_file(dest_path, **options) do
277
265
  version = ERB.version.scan(/\d+\.\d+\.\d+/)[0]
278
266
  template = if version.to_f >= 2.2
279
267
  ERB.new(::File.binread(source_path), trim_mode: "-", eoutvar: "@output_buffer")
@@ -285,7 +273,8 @@ module TTY
285
273
  content
286
274
  end
287
275
  return unless options[:preserve]
288
- copy_metadata(source_path, dest_path, options)
276
+
277
+ copy_metadata(source_path, dest_path, **options)
289
278
  end
290
279
  module_function :copy_file
291
280
 
@@ -300,7 +289,7 @@ module TTY
300
289
  def copy_metadata(src_path, dest_path, **options)
301
290
  stats = ::File.lstat(src_path)
302
291
  ::File.utime(stats.atime, stats.mtime, dest_path)
303
- chmod(dest_path, stats.mode, options)
292
+ chmod(dest_path, stats.mode, **options)
304
293
  end
305
294
  module_function :copy_metadata
306
295
 
@@ -318,7 +307,7 @@ module TTY
318
307
  # Invoking:
319
308
  # copy_directory("app", "new_app")
320
309
  # The following directory structure should be created where
321
- # name resolves to 'cli' value:
310
+ # name resolves to "cli" value:
322
311
  #
323
312
  # new_app/
324
313
  # cli.rb
@@ -345,15 +334,15 @@ module TTY
345
334
  check_path(source_path)
346
335
  source = escape_glob_path(source_path)
347
336
  dest_path = (args.first || source).to_s
348
- opts = {recursive: true}.merge(options)
349
- pattern = opts[:recursive] ? ::File.join(source, '**') : source
350
- glob_pattern = ::File.join(pattern, '*')
337
+ opts = { recursive: true }.merge(options)
338
+ pattern = opts[:recursive] ? ::File.join(source, "**") : source
339
+ glob_pattern = ::File.join(pattern, "*")
351
340
 
352
341
  Dir.glob(glob_pattern, ::File::FNM_DOTMATCH).sort.each do |file_source|
353
342
  next if ::File.directory?(file_source)
354
343
  next if opts[:exclude] && file_source.match(opts[:exclude])
355
344
 
356
- dest = ::File.join(dest_path, file_source.gsub(source_path, '.'))
345
+ dest = ::File.join(dest_path, file_source.gsub(source_path, "."))
357
346
  file_dest = ::Pathname.new(dest).cleanpath.to_s
358
347
 
359
348
  copy_file(file_source, file_dest, **options, &block)
@@ -446,7 +435,7 @@ module TTY
446
435
  dest_path = (args.first || ::File.basename(uri)).to_s
447
436
 
448
437
  unless uri =~ %r{^https?\://}
449
- copy_file(uri, dest_path, options)
438
+ copy_file(uri, dest_path, **options)
450
439
  return
451
440
  end
452
441
 
@@ -456,7 +445,7 @@ module TTY
456
445
  content = (block.arity.nonzero? ? block[content] : block[])
457
446
  end
458
447
 
459
- create_file(dest_path, content, options)
448
+ create_file(dest_path, content, **options)
460
449
  end
461
450
  module_function :download_file
462
451
 
@@ -470,19 +459,19 @@ module TTY
470
459
  # the content to preped to file
471
460
  #
472
461
  # @example
473
- # prepend_to_file('Gemfile', "gem 'tty'")
462
+ # prepend_to_file("Gemfile", "gem "tty"")
474
463
  #
475
464
  # @example
476
- # prepend_to_file('Gemfile') do
465
+ # prepend_to_file("Gemfile") do
477
466
  # "gem 'tty'"
478
467
  # end
479
468
  #
480
469
  # @api public
481
470
  def prepend_to_file(relative_path, *args, **options, &block)
482
471
  log_status(:prepend, relative_path, options.fetch(:verbose, true),
483
- options.fetch(:color, :green))
472
+ options.fetch(:color, :green))
484
473
  options.merge!(before: /\A/, verbose: false)
485
- inject_into_file(relative_path, *(args << options), &block)
474
+ inject_into_file(relative_path, *args, **options, &block)
486
475
  end
487
476
  module_function :prepend_to_file
488
477
 
@@ -501,19 +490,19 @@ module TTY
501
490
  # the content to append to file
502
491
  #
503
492
  # @example
504
- # append_to_file('Gemfile', "gem 'tty'")
493
+ # append_to_file("Gemfile", "gem 'tty'")
505
494
  #
506
495
  # @example
507
- # append_to_file('Gemfile') do
496
+ # append_to_file("Gemfile") do
508
497
  # "gem 'tty'"
509
498
  # end
510
499
  #
511
500
  # @api public
512
501
  def append_to_file(relative_path, *args, **options, &block)
513
502
  log_status(:append, relative_path, options.fetch(:verbose, true),
514
- options.fetch(:color, :green))
503
+ options.fetch(:color, :green))
515
504
  options.merge!(after: /\z/, verbose: false)
516
- inject_into_file(relative_path, *(args << options), &block)
505
+ inject_into_file(relative_path, *args, **options, &block)
517
506
  end
518
507
  module_function :append_to_file
519
508
 
@@ -543,13 +532,13 @@ module TTY
543
532
  # log status
544
533
  #
545
534
  # @example
546
- # inject_into_file('Gemfile', "gem 'tty'", after: "gem 'rack'\n")
535
+ # inject_into_file("Gemfile", "gem 'tty'", after: "gem 'rack'\n")
547
536
  #
548
537
  # @example
549
- # inject_into_file('Gemfile', "gem 'tty'\n", "gem 'loaf'", after: "gem 'rack'\n")
538
+ # inject_into_file("Gemfile", "gem 'tty'\n", "gem 'loaf'", after: "gem 'rack'\n")
550
539
  #
551
540
  # @example
552
- # inject_into_file('Gemfile', after: "gem 'rack'\n") do
541
+ # inject_into_file("Gemfile", after: "gem 'rack'\n") do
553
542
  # "gem 'tty'\n"
554
543
  # end
555
544
  #
@@ -574,7 +563,7 @@ module TTY
574
563
  log_status(:inject, relative_path, options.fetch(:verbose, true),
575
564
  options.fetch(:color, :green))
576
565
  replace_in_file(relative_path, /#{match}/, content,
577
- options.merge(verbose: false))
566
+ **options.merge(verbose: false))
578
567
  end
579
568
  module_function :inject_into_file
580
569
 
@@ -600,10 +589,10 @@ module TTY
600
589
  # log status
601
590
  #
602
591
  # @example
603
- # replace_in_file('Gemfile', /gem 'rails'/, "gem 'hanami'")
592
+ # replace_in_file("Gemfile", /gem 'rails'/, "gem 'hanami'")
604
593
  #
605
594
  # @example
606
- # replace_in_file('Gemfile', /gem 'rails'/) do |match|
595
+ # replace_in_file("Gemfile", /gem 'rails'/) do |match|
607
596
  # match = "gem 'hanami'"
608
597
  # end
609
598
  #
@@ -614,7 +603,7 @@ module TTY
614
603
  def replace_in_file(relative_path, *args, **options, &block)
615
604
  check_path(relative_path)
616
605
  contents = ::File.read(relative_path)
617
- replacement = (block ? block[] : args[1..-1].join).gsub('\0', '')
606
+ replacement = (block ? block[] : args[1..-1].join).gsub('\0', "")
618
607
  match = Regexp.escape(replacement)
619
608
  status = nil
620
609
 
@@ -625,7 +614,7 @@ module TTY
625
614
  if options.fetch(:force, true) || !(contents =~ /^#{match}(\r?\n)*/m)
626
615
  status = contents.gsub!(*args, &block)
627
616
  if !status.nil?
628
- ::File.open(relative_path, 'w') do |file|
617
+ ::File.open(relative_path, "w") do |file|
629
618
  file.write(contents)
630
619
  end
631
620
  end
@@ -651,7 +640,7 @@ module TTY
651
640
  # for secure removing
652
641
  #
653
642
  # @example
654
- # remove_file 'doc/README.md'
643
+ # remove_file "doc/README.md"
655
644
  #
656
645
  # @api public
657
646
  def remove_file(relative_path, *args, **options)
@@ -675,12 +664,12 @@ module TTY
675
664
  # the number of lines to return from file
676
665
  #
677
666
  # @example
678
- # tail_file 'filename'
679
- # # => ['line 19', 'line20', ... ]
667
+ # tail_file "filename"
668
+ # # => ["line 19", "line20", ... ]
680
669
  #
681
670
  # @example
682
- # tail_file 'filename', 15
683
- # # => ['line 19', 'line20', ... ]
671
+ # tail_file "filename", 15
672
+ # # => ["line 19", "line20", ... ]
684
673
  #
685
674
  # @return [Array[String]]
686
675
  #
@@ -736,6 +725,7 @@ module TTY
736
725
  # @api private
737
726
  def check_path(path)
738
727
  return if ::File.exist?(path)
728
+
739
729
  raise InvalidPathError, "File path \"#{path}\" does not exist."
740
730
  end
741
731
  private_module_function :check_path
@@ -779,7 +769,7 @@ module TTY
779
769
  if ::FileTest.file?(object)
780
770
  ::File.open(object, &block)
781
771
  else
782
- tempfile = Tempfile.new('tty-file-diff')
772
+ tempfile = Tempfile.new("tty-file-diff")
783
773
  tempfile << object
784
774
  tempfile.rewind
785
775
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'tty-prompt'
3
+ require "tty-prompt"
4
4
 
5
5
  module TTY
6
6
  module File
@@ -34,7 +34,7 @@ module TTY
34
34
  def call
35
35
  detect_collision do
36
36
  FileUtils.mkdir_p(::File.dirname(relative_path))
37
- ::File.open(relative_path, 'wb') { |f| f.write(content) }
37
+ ::File.open(relative_path, "wb") { |f| f.write(content) }
38
38
  end
39
39
  relative_path
40
40
  end
@@ -86,9 +86,9 @@ module TTY
86
86
  # @api private
87
87
  def file_collision(relative_path, content)
88
88
  choices = [
89
- { key: 'y', name: 'yes, overwrite', value: :yes },
90
- { key: 'n', name: 'no, do not overwrite', value: :no },
91
- { key: 'q', name: 'quit, abort', value: :quit }
89
+ { key: "y", name: "yes, overwrite", value: :yes },
90
+ { key: "n", name: "no, do not overwrite", value: :no },
91
+ { key: "q", name: "quit, abort", value: :quit }
92
92
  ]
93
93
  answer = prompt.expand("Overwrite #{relative_path}?", choices)
94
94
  interpret_answer(answer)