tty-file 0.6.0 → 0.7.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 +5 -5
- data/CHANGELOG.md +18 -2
- data/README.md +58 -16
- data/Rakefile +1 -1
- data/lib/tty-file.rb +0 -2
- data/lib/tty/file.rb +35 -9
- data/lib/tty/file/create_file.rb +3 -1
- data/lib/tty/file/differ.rb +3 -2
- data/lib/tty/file/digest_file.rb +1 -1
- data/lib/tty/file/download_file.rb +3 -3
- data/lib/tty/file/read_backward_file.rb +0 -1
- data/lib/tty/file/version.rb +2 -2
- data/spec/fixtures/cli_app/%name%_cli.rb +2 -0
- data/spec/fixtures/cli_app/commands/subcommand.rb +2 -0
- data/spec/fixtures/cli_app/excluded/%name%_cli.rb +2 -0
- data/spec/fixtures/templates/%file_name%.rb +1 -0
- data/spec/fixtures/templates/unit_test.rb +1 -0
- data/spec/spec_helper.rb +90 -0
- data/spec/unit/append_to_file_spec.rb +85 -0
- data/spec/unit/binary_spec.rb +206 -0
- data/spec/unit/checksum_file_spec.rb +39 -0
- data/spec/unit/chmod_spec.rb +78 -0
- data/spec/unit/copy_directory_spec.rb +106 -0
- data/spec/unit/copy_file_spec.rb +157 -0
- data/spec/unit/create_directory_spec.rb +79 -0
- data/spec/unit/create_file_spec.rb +116 -0
- data/spec/unit/diff_spec.rb +93 -0
- data/spec/unit/differ/call_spec.rb +101 -0
- data/spec/unit/download_file_spec.rb +54 -0
- data/spec/unit/escape_glob_path_spec.rb +14 -0
- data/spec/unit/inject_into_file_spec.rb +162 -0
- data/spec/unit/prepend_to_file_spec.rb +98 -0
- data/spec/unit/remove_file_spec.rb +53 -0
- data/spec/unit/replace_in_file_spec.rb +126 -0
- data/spec/unit/tail_file_spec.rb +63 -0
- data/tasks/console.rake +1 -1
- data/tasks/coverage.rake +1 -1
- data/tasks/spec.rake +1 -1
- data/tty-file.gemspec +5 -4
- metadata +30 -13
- data/.gitignore +0 -10
- data/.rspec +0 -3
- data/.travis.yml +0 -26
- data/CODE_OF_CONDUCT.md +0 -49
- data/Gemfile +0 -9
- data/appveyor.yml +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c45f9ae4c83da383b63e7951bbc66f0e335ef0dcfe1e5c23f1730f7e03a4a828
|
4
|
+
data.tar.gz: 9ce415f8dda2fc64aa7d4b288d46bf0ee32942846f7233288b65b88f8f4758c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba8743853a4a962d8e7b7dc7ce9c73cff20ede0d506160782605a1187a50facb8b6addd1a5ec2b73ee1f701e8a991afa95ac441010d894fb5b7b4275a6ac0ae6
|
7
|
+
data.tar.gz: bc7dad3603aac26bdcdcc2016871a52f1a717fbd67d7067e846c08059eb883b719f06c349db023115dc026a41893e51460654e1f5d1fa93b202e537c53d1d926
|
data/CHANGELOG.md
CHANGED
@@ -1,12 +1,27 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## [v0.7.0] - 2018-12-17
|
4
|
+
|
5
|
+
### Added
|
6
|
+
* Add :secure option to #remove_file call
|
7
|
+
* Add #safe_append_to_file, #safe_prepend_to_file, #safe_inject_into_file
|
8
|
+
|
9
|
+
### Changed
|
10
|
+
* Change #replace_in_file, #append_to_file, #prepend_to_file, and #inject_into_file to perform operation unsafely without checking prior content
|
11
|
+
* Change to load gemspec files directly
|
12
|
+
* Change to update tty-prompt
|
13
|
+
* Change to freeze strings
|
14
|
+
* Change to relax tty-prompt & diff-lcs version constraints
|
15
|
+
|
16
|
+
### Fixed
|
17
|
+
* Fixed windows tests
|
18
|
+
|
3
19
|
## [v0.6.0] - 2018-05-21
|
4
20
|
|
5
21
|
### Changed
|
6
22
|
* Change identical files conflict message from blue to cyan for readability
|
7
23
|
* Change replace_in_file to stop raising error and allow forcing file overwrite
|
8
|
-
* Change replace_in_file, inject_into_file, prepend_to_file, append_to_file to return true
|
9
|
-
when operation is performed successfully, false otherwise
|
24
|
+
* Change replace_in_file, inject_into_file, prepend_to_file, append_to_file to return true when operation is performed successfully, false otherwise
|
10
25
|
* Update tty-prompt dependency
|
11
26
|
* Change download_file to preserve query parameters
|
12
27
|
|
@@ -64,6 +79,7 @@
|
|
64
79
|
|
65
80
|
* Initial implementation and release
|
66
81
|
|
82
|
+
[v0.7.0]: https://github.com/piotrmurach/tty-file/compare/v0.6.0...v0.7.0
|
67
83
|
[v0.6.0]: https://github.com/piotrmurach/tty-file/compare/v0.5.0...v0.6.0
|
68
84
|
[v0.5.0]: https://github.com/piotrmurach/tty-file/compare/v0.4.0...v0.5.0
|
69
85
|
[v0.4.0]: https://github.com/piotrmurach/tty-file/compare/v0.3.0...v0.4.0
|
data/README.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
<div align="center">
|
2
|
+
<a href="https://piotrmurach.github.io/tty" target="_blank"><img width="130" src="https://cdn.rawgit.com/piotrmurach/tty/master/images/tty.png" alt="tty logo" /></a>
|
3
|
+
</div>
|
4
|
+
|
1
5
|
# TTY::File [][gitter]
|
2
6
|
|
3
7
|
[][gem]
|
@@ -48,11 +52,11 @@ Or install it yourself as:
|
|
48
52
|
* [2.5. create_file](#25-create_file)
|
49
53
|
* [2.6. copy_dir](#26-copy_dir)
|
50
54
|
* [2.7. create_dir](#27-create_dir)
|
51
|
-
* [2.8.
|
55
|
+
* [2.8. diff_files](#28-diff_files)
|
52
56
|
* [2.9. download_file](#29-download_file)
|
53
57
|
* [2.10. inject_into_file](#210-inject_into_file)
|
54
58
|
* [2.11. replace_in_file](#211-replace_in_file)
|
55
|
-
* [2.12. append_to_file](#212-
|
59
|
+
* [2.12. append_to_file](#212-append_to_file)
|
56
60
|
* [2.13. prepend_to_file](#213-prepend_to_file)
|
57
61
|
* [2.14. remove_file](#214-remove_file)
|
58
62
|
* [2.15. tail_file](#215-tail_file)
|
@@ -140,7 +144,7 @@ variables[:foo] = 'bar'
|
|
140
144
|
TTY::File.copy_file('templates/application.html.erb', context: variables)
|
141
145
|
```
|
142
146
|
|
143
|
-
You can also specify the template name surrounding any dynamic variables with `%` to be
|
147
|
+
You can also specify the template name surrounding any dynamic variables with `%` to be evaluated:
|
144
148
|
|
145
149
|
```ruby
|
146
150
|
variables = OpenStruct.new
|
@@ -190,7 +194,7 @@ Assuming you have the following directory structure:
|
|
190
194
|
# %name%.rb
|
191
195
|
```
|
192
196
|
|
193
|
-
|
197
|
+
You can copy `doc` folder to `docs` by invoking:
|
194
198
|
|
195
199
|
```ruby
|
196
200
|
TTY::File.copy_directory('doc', 'docs', context: ...)
|
@@ -223,10 +227,10 @@ TTY::File.copy_directory('doc', 'docs', exclude: 'subcommands')
|
|
223
227
|
To create directory use `create_directory` or its alias `create_dir` passing as a first argument file path:
|
224
228
|
|
225
229
|
```ruby
|
226
|
-
TTY::File.create_dir(/path/to/directory)
|
230
|
+
TTY::File.create_dir('/path/to/directory')
|
227
231
|
```
|
228
232
|
|
229
|
-
|
233
|
+
Or a data structure describing the directory tree including any files with or without content:
|
230
234
|
|
231
235
|
```ruby
|
232
236
|
tree =
|
@@ -256,15 +260,15 @@ TTY::File.create_dir(tree)
|
|
256
260
|
As a second argument you can provide a parent directory, otherwise current directory will be assumed:
|
257
261
|
|
258
262
|
```ruby
|
259
|
-
|
263
|
+
TTY::File.create_dir(tree, '/path/to/parent/dir')
|
260
264
|
```
|
261
265
|
|
262
|
-
### 2.8.
|
266
|
+
### 2.8. diff_files
|
263
267
|
|
264
268
|
To compare files line by line in a system independent way use `diff`, or `diff_files`:
|
265
269
|
|
266
270
|
```ruby
|
267
|
-
TTY::File.
|
271
|
+
TTY::File.diff_files('file_a', 'file_b')
|
268
272
|
# =>
|
269
273
|
# @@ -1,4 +1,4 @@
|
270
274
|
# aaa
|
@@ -282,7 +286,7 @@ The `:context_lines` specifies how many extra lines around the differing lines t
|
|
282
286
|
The `:threshold` sets maximum file size in bytes, by default files larger than `10Mb` are not processed.
|
283
287
|
|
284
288
|
```ruby
|
285
|
-
TTY::File.
|
289
|
+
TTY::File.diff_files('file_a', 'file_b', format: :old)
|
286
290
|
# =>
|
287
291
|
# 1,4c1,4
|
288
292
|
# < aaa
|
@@ -297,7 +301,7 @@ TTY::File.diff('file_a', 'file_b', format: :old)
|
|
297
301
|
Equally, you can perform a comparison between a file content and a string content like so:
|
298
302
|
|
299
303
|
```ruby
|
300
|
-
TTY::File.
|
304
|
+
TTY::File.diff_files('/path/to/file', 'some long text')
|
301
305
|
```
|
302
306
|
|
303
307
|
### 2.9. download_file
|
@@ -331,7 +335,7 @@ Inject content into a file at a given location and return `true` when performed
|
|
331
335
|
TTY::File.inject_into_file 'filename.rb', "text to add", after: "Code below this line\n"
|
332
336
|
```
|
333
337
|
|
334
|
-
|
338
|
+
Or using a block:
|
335
339
|
|
336
340
|
```ruby
|
337
341
|
TTY::File.inject_into_file 'filename.rb', after: "Code below this line\n" do
|
@@ -339,7 +343,21 @@ TTY::File.inject_into_file 'filename.rb', after: "Code below this line\n" do
|
|
339
343
|
end
|
340
344
|
```
|
341
345
|
|
342
|
-
You can also use Regular Expressions in `:after` or `:before` to match file location.
|
346
|
+
You can also use Regular Expressions in `:after` or `:before` to match file location.
|
347
|
+
|
348
|
+
By default, this method will always inject content into file, regardless whether it is already present or not. To change this pass `:force` set to `false` to perform check before actually inserting text:
|
349
|
+
|
350
|
+
```ruby
|
351
|
+
TTY::File.inject_into_file('filename.rb', "text to add", after: "Code below this line\n"
|
352
|
+
```
|
353
|
+
|
354
|
+
Alternatively, use `safe_inject_into_file` to check if the text can be safely inserted.
|
355
|
+
|
356
|
+
```ruby
|
357
|
+
TTY::File.safe_inject_into_file('Gemfile', "gem 'tty'")
|
358
|
+
```
|
359
|
+
|
360
|
+
The [append_to_file](#212-append_to_file) and [prepend_to_file](#213-prepend_to_file) allow you to add content at the end and the begging of a file.
|
343
361
|
|
344
362
|
### 2.11. replace_in_file
|
345
363
|
|
@@ -365,7 +383,7 @@ Appends text to a file and returns `true` when performed successfully, `false` o
|
|
365
383
|
TTY::File.append_to_file('Gemfile', "gem 'tty'")
|
366
384
|
```
|
367
385
|
|
368
|
-
|
386
|
+
Or inside a block:
|
369
387
|
|
370
388
|
```ruby
|
371
389
|
TTY::File.append_to_file('Gemfile') do
|
@@ -373,6 +391,18 @@ TTY::File.append_to_file('Gemfile') do
|
|
373
391
|
end
|
374
392
|
```
|
375
393
|
|
394
|
+
By default, this method will always append content regardless whether it is already present or not. To change this pass `:force` set to `false` to perform check before actually appending:
|
395
|
+
|
396
|
+
```ruby
|
397
|
+
TTY::File.append_to_file('Gemfile', "gem 'tty'", force: false)
|
398
|
+
```
|
399
|
+
|
400
|
+
Alternatively, use `safe_append_to_file` to check if the text can be safely appended.
|
401
|
+
|
402
|
+
```ruby
|
403
|
+
TTY::File.safe_append_to_file('Gemfile', "gem 'tty'")
|
404
|
+
```
|
405
|
+
|
376
406
|
### 2.13. prepend_to_file
|
377
407
|
|
378
408
|
Prepends text to a file and returns `true` when performed successfully, `false` otherwise. You can provide the text as a second argument:
|
@@ -381,7 +411,7 @@ Prepends text to a file and returns `true` when performed successfully, `false`
|
|
381
411
|
TTY::File.prepend_to_file('Gemfile', "gem 'tty'")
|
382
412
|
```
|
383
413
|
|
384
|
-
|
414
|
+
Or inside a block:
|
385
415
|
|
386
416
|
```ruby
|
387
417
|
TTY::File.prepend_to_file('Gemfile') do
|
@@ -389,6 +419,18 @@ TTY::File.prepend_to_file('Gemfile') do
|
|
389
419
|
end
|
390
420
|
```
|
391
421
|
|
422
|
+
By default, this method will always prepend content regardless whether it is already present or not. To change this pass `:force` set to `false` to perform check before actually prepending:
|
423
|
+
|
424
|
+
```ruby
|
425
|
+
TTY::File.prepend_to_file('Gemfile', "gem 'tty'", force: false)
|
426
|
+
```
|
427
|
+
|
428
|
+
Alternatively, use `safe_prepend_to_file` to check if the text can be safely appended.
|
429
|
+
|
430
|
+
```ruby
|
431
|
+
TTY::File.safe_prepend_to_file('Gemfile', "gem 'tty'")
|
432
|
+
```
|
433
|
+
|
392
434
|
### 2.14. remove_file
|
393
435
|
|
394
436
|
To remove a file do:
|
@@ -442,4 +484,4 @@ The gem is available as open source under the terms of the [MIT License](http://
|
|
442
484
|
|
443
485
|
## Copyright
|
444
486
|
|
445
|
-
Copyright (c) 2016
|
487
|
+
Copyright (c) 2016 Piotr Murach. See LICENSE for further details.
|
data/Rakefile
CHANGED
data/lib/tty-file.rb
CHANGED
data/lib/tty/file.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'pastel'
|
4
|
-
require 'tty-prompt'
|
5
4
|
require 'erb'
|
6
5
|
require 'tempfile'
|
7
6
|
require 'pathname'
|
@@ -344,7 +343,7 @@ module TTY
|
|
344
343
|
# @api public
|
345
344
|
def diff(path_a, path_b, **options)
|
346
345
|
threshold = options[:threshold] || 10_000_000
|
347
|
-
output =
|
346
|
+
output = []
|
348
347
|
|
349
348
|
open_tempfile_if_missing(path_a) do |file_a|
|
350
349
|
if ::File.size(file_a) > threshold
|
@@ -363,7 +362,7 @@ module TTY
|
|
363
362
|
|
364
363
|
log_status(:diff, "#{file_a.path} - #{file_b.path}",
|
365
364
|
options.fetch(:verbose, true), options.fetch(:color, :green))
|
366
|
-
return output if options[:noop]
|
365
|
+
return output.join if options[:noop]
|
367
366
|
|
368
367
|
block_size = file_a.lstat.blksize
|
369
368
|
while !file_a.eof? && !file_b.eof?
|
@@ -373,7 +372,7 @@ module TTY
|
|
373
372
|
end
|
374
373
|
end
|
375
374
|
end
|
376
|
-
output
|
375
|
+
output.join
|
377
376
|
end
|
378
377
|
module_function :diff
|
379
378
|
|
@@ -447,6 +446,14 @@ module TTY
|
|
447
446
|
end
|
448
447
|
module_function :prepend_to_file
|
449
448
|
|
449
|
+
# Safely prepend to file checking if content is not already present
|
450
|
+
#
|
451
|
+
# @api public
|
452
|
+
def safe_prepend_to_file(relative_path, *args, **options, &block)
|
453
|
+
prepend_to_file(relative_path, *args, **(options.merge(force: false)), &block)
|
454
|
+
end
|
455
|
+
module_function :safe_prepend_to_file
|
456
|
+
|
450
457
|
# Append to a file
|
451
458
|
#
|
452
459
|
# @param [String] relative_path
|
@@ -473,6 +480,14 @@ module TTY
|
|
473
480
|
alias add_to_file append_to_file
|
474
481
|
module_function :add_to_file
|
475
482
|
|
483
|
+
# Safely append to file checking if content is not already present
|
484
|
+
#
|
485
|
+
# @api public
|
486
|
+
def safe_append_to_file(relative_path, *args, **options, &block)
|
487
|
+
append_to_file(relative_path, *args, **(options.merge(force: false)), &block)
|
488
|
+
end
|
489
|
+
module_function :safe_append_to_file
|
490
|
+
|
476
491
|
# Inject content into file at a given location
|
477
492
|
#
|
478
493
|
# @param [String] relative_path
|
@@ -526,6 +541,14 @@ module TTY
|
|
526
541
|
alias insert_into_file inject_into_file
|
527
542
|
module_function :insert_into_file
|
528
543
|
|
544
|
+
# Safely prepend to file checking if content is not already present
|
545
|
+
#
|
546
|
+
# @api public
|
547
|
+
def safe_inject_into_file(relative_path, *args, **options, &block)
|
548
|
+
inject_into_file(relative_path, *args, **(options.merge(force: false)), &block)
|
549
|
+
end
|
550
|
+
module_function :safe_inject_into_file
|
551
|
+
|
529
552
|
# Replace content of a file matching string, returning false
|
530
553
|
# when no substitutions were performed, true otherwise.
|
531
554
|
#
|
@@ -549,7 +572,7 @@ module TTY
|
|
549
572
|
# @api public
|
550
573
|
def replace_in_file(relative_path, *args, **options, &block)
|
551
574
|
check_path(relative_path)
|
552
|
-
contents =
|
575
|
+
contents = ::File.binread(relative_path)
|
553
576
|
replacement = (block ? block[] : args[1..-1].join).gsub('\0', '')
|
554
577
|
match = Regexp.escape(replacement)
|
555
578
|
status = nil
|
@@ -558,7 +581,7 @@ module TTY
|
|
558
581
|
options.fetch(:color, :green))
|
559
582
|
return false if options[:noop]
|
560
583
|
|
561
|
-
if !(contents =~ /^#{match}(\r?\n)*/m)
|
584
|
+
if options.fetch(:force, true) || !(contents =~ /^#{match}(\r?\n)*/m)
|
562
585
|
status = contents.gsub!(*args, &block)
|
563
586
|
if !status.nil?
|
564
587
|
::File.open(relative_path, 'wb') do |file|
|
@@ -582,6 +605,8 @@ module TTY
|
|
582
605
|
# remove file ignoring errors
|
583
606
|
# @option options [Symbol] :verbose
|
584
607
|
# log status
|
608
|
+
# @option options [Symbol] :secure
|
609
|
+
# for secure removing
|
585
610
|
#
|
586
611
|
# @example
|
587
612
|
# remove_file 'doc/README.md'
|
@@ -591,9 +616,10 @@ module TTY
|
|
591
616
|
log_status(:remove, relative_path, options.fetch(:verbose, true),
|
592
617
|
options.fetch(:color, :red))
|
593
618
|
|
594
|
-
return if options[:noop]
|
619
|
+
return if options[:noop] || !::File.exist?(relative_path)
|
595
620
|
|
596
|
-
::FileUtils.rm_r(relative_path, force: options[:force],
|
621
|
+
::FileUtils.rm_r(relative_path, force: options[:force],
|
622
|
+
secure: options.fetch(:secure, true))
|
597
623
|
end
|
598
624
|
module_function :remove_file
|
599
625
|
|
data/lib/tty/file/create_file.rb
CHANGED
data/lib/tty/file/differ.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'diff/lcs'
|
4
4
|
require 'diff/lcs/hunk'
|
@@ -59,7 +59,7 @@ module TTY
|
|
59
59
|
|
60
60
|
# @api public
|
61
61
|
def format_hunks(hunks)
|
62
|
-
output =
|
62
|
+
output = []
|
63
63
|
hunks.each_cons(2) do |prev_hunk, current_hunk|
|
64
64
|
begin
|
65
65
|
if current_hunk.overlaps?(prev_hunk)
|
@@ -72,6 +72,7 @@ module TTY
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
output << hunks.last.diff(@format) << "\n" if hunks.last
|
75
|
+
output.join
|
75
76
|
end
|
76
77
|
end # Differ
|
77
78
|
end # File
|
data/lib/tty/file/digest_file.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'uri'
|
4
4
|
require 'net/http'
|
@@ -32,7 +32,7 @@ module TTY
|
|
32
32
|
# @api private
|
33
33
|
def download(uri, path, limit)
|
34
34
|
raise DownloadError, 'Redirect limit reached!' if limit.zero?
|
35
|
-
content =
|
35
|
+
content = []
|
36
36
|
|
37
37
|
Net::HTTP.start(uri.host, uri.port,
|
38
38
|
use_ssl: uri.scheme == 'https') do |http|
|
@@ -49,7 +49,7 @@ module TTY
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
52
|
-
content
|
52
|
+
content.join
|
53
53
|
end
|
54
54
|
end # DownloadFile
|
55
55
|
end # File
|
data/lib/tty/file/version.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
<%= foo %>
|