tty-file 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/README.md +144 -75
- data/lib/tty-file.rb +1 -1
- data/lib/tty/file.rb +237 -155
- data/lib/tty/file/compare_files.rb +70 -0
- data/lib/tty/file/create_file.rb +28 -14
- data/lib/tty/file/differ.rb +40 -20
- data/lib/tty/file/download_file.rb +2 -2
- data/lib/tty/file/version.rb +1 -1
- metadata +10 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e1d9e2c1d0c438b74128707623835e44da4ec23dcdebfe0ba88afb5284c730a7
|
4
|
+
data.tar.gz: 63c7b68f347b2199502240cbdbfdf20264f90a95ece1ea50f60a78d2c3a6c73f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ab6abf98fa2bcdb58f7f0eb2d3518e1184607863fedfeb2a1de34b21eeb876d3e7c9ce2eb0c48198b98dfaae7d281c49447a7dfe872a48e19d07493fdb0c020
|
7
|
+
data.tar.gz: 9925c5f71b7a0c8f9afb369abb6b83df9c6700d87884a3b9e4ce2dd77c02c2e0d9848803979ac599e431c0f282419ba2be72ea241de10479930989bc7073ed57
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## [v0.10.0] - 2020-07-27
|
4
|
+
|
5
|
+
### Added
|
6
|
+
* Add diff option to file conflict menu to show file contents differences
|
7
|
+
* Add :header option to #diff to show two-line header for compared files
|
8
|
+
* Add git-like hunk coloring when displaying diff lines in unified format
|
9
|
+
|
10
|
+
### Changed
|
11
|
+
* Change to only use keyword arguments in all methods
|
12
|
+
* Change #tail_file to accept :lines as keyword parameter
|
13
|
+
* Change to update tty-prompt & pastel dependencies
|
14
|
+
* Change prompt to be quiet and provide no output after selection
|
15
|
+
* Change #diff_files to stop raising on binary or large files
|
16
|
+
|
3
17
|
## [v0.9.0] - 2020-04-28
|
4
18
|
|
5
19
|
### Changed
|
@@ -106,6 +120,7 @@
|
|
106
120
|
|
107
121
|
* Initial implementation and release
|
108
122
|
|
123
|
+
[v0.10.0]: https://github.com/piotrmurach/tty-file/compare/v0.9.0...v0.10.0
|
109
124
|
[v0.9.0]: https://github.com/piotrmurach/tty-file/compare/v0.8.0...v0.9.0
|
110
125
|
[v0.8.0]: https://github.com/piotrmurach/tty-file/compare/v0.7.1...v0.8.0
|
111
126
|
[v0.7.1]: https://github.com/piotrmurach/tty-file/compare/v0.7.0...v0.7.1
|
data/README.md
CHANGED
@@ -30,7 +30,7 @@ Though Ruby's `File` and `FileUtils` libraries provide very robust apis for deal
|
|
30
30
|
Add this line to your application's Gemfile:
|
31
31
|
|
32
32
|
```ruby
|
33
|
-
gem
|
33
|
+
gem "tty-file"
|
34
34
|
```
|
35
35
|
|
36
36
|
And then execute:
|
@@ -64,7 +64,7 @@ Or install it yourself as:
|
|
64
64
|
## 1. Usage
|
65
65
|
|
66
66
|
```ruby
|
67
|
-
TTY::File.replace_in_file(
|
67
|
+
TTY::File.replace_in_file("Gemfile", /gem 'rails'/, "gem 'hanami'")
|
68
68
|
```
|
69
69
|
|
70
70
|
## 2. Interface
|
@@ -78,7 +78,7 @@ If you wish to silence verbose output use `verbose: false`. Similarly if you wis
|
|
78
78
|
To check whether a file is a binary file, i.e. image, executable etc. do:
|
79
79
|
|
80
80
|
```ruby
|
81
|
-
TTY::File.binary?(
|
81
|
+
TTY::File.binary?("image.png") # => true
|
82
82
|
```
|
83
83
|
|
84
84
|
### 2.2. checksum_file
|
@@ -93,7 +93,7 @@ Among the supported message digest algorithms are:
|
|
93
93
|
For example, to create a digest for a string using `SHA1` do:
|
94
94
|
|
95
95
|
```ruby
|
96
|
-
TTY::File.checksum_file("Some content\nThe end",
|
96
|
+
TTY::File.checksum_file("Some content\nThe end", "sha1")
|
97
97
|
# => "289388f187404135e6c15b21460442cf867180dd"
|
98
98
|
```
|
99
99
|
|
@@ -102,19 +102,19 @@ TTY::File.checksum_file("Some content\nThe end", 'sha1')
|
|
102
102
|
To change file modes use `chmod`, like so:
|
103
103
|
|
104
104
|
```ruby
|
105
|
-
TTY::File.chmod(
|
105
|
+
TTY::File.chmod("filename.rb", 0777)
|
106
106
|
```
|
107
107
|
|
108
108
|
There are a number of constants available to represent common mode bits such as `TTY::File::U_R` and `TTY::File::O_X`, and they can be used as follows:
|
109
109
|
|
110
110
|
```ruby
|
111
|
-
TTY::File.chmod(
|
111
|
+
TTY::File.chmod("filename.rb", TTY::File::U_R | TTY::File::O_X)
|
112
112
|
```
|
113
113
|
|
114
114
|
Apart from traditional octal number definition for file permissions, you can use the more convenient permission notation used by the Unix `chmod` command:
|
115
115
|
|
116
116
|
```ruby
|
117
|
-
TTY::File.chmod(
|
117
|
+
TTY::File.chmod("filename.rb", "u=wrx,g+x")
|
118
118
|
```
|
119
119
|
|
120
120
|
The `u`, `g`, and `o` specify the user, group, and other parts of the mode bits. The `a` symbol is equivalent to `ugo`.
|
@@ -124,13 +124,13 @@ The `u`, `g`, and `o` specify the user, group, and other parts of the mode bits.
|
|
124
124
|
Copies a file's contents from a relative source to a relative destination.
|
125
125
|
|
126
126
|
```ruby
|
127
|
-
TTY::File.copy_file
|
127
|
+
TTY::File.copy_file "Gemfile", "Gemfile.bak"
|
128
128
|
```
|
129
129
|
|
130
130
|
If you provide a block then the file content is yielded:
|
131
131
|
|
132
132
|
```ruby
|
133
|
-
TTY::File.copy_file(
|
133
|
+
TTY::File.copy_file("Gemfile", "app/Gemfile") do |content|
|
134
134
|
"https://rubygems.org\n" + content
|
135
135
|
end
|
136
136
|
```
|
@@ -139,25 +139,25 @@ If the source file is an `ERB` template then you can provide a `:context` in whi
|
|
139
139
|
|
140
140
|
```ruby
|
141
141
|
variables = OpenStruct.new
|
142
|
-
variables[:foo] =
|
142
|
+
variables[:foo] = "bar"
|
143
143
|
|
144
|
-
TTY::File.copy_file(
|
144
|
+
TTY::File.copy_file("templates/application.html.erb", context: variables)
|
145
145
|
```
|
146
146
|
|
147
147
|
You can also specify the template name surrounding any dynamic variables with `%` to be evaluated:
|
148
148
|
|
149
149
|
```ruby
|
150
150
|
variables = OpenStruct.new
|
151
|
-
variables[:file_name] =
|
151
|
+
variables[:file_name] = "foo"
|
152
152
|
|
153
|
-
TTY::File.copy_file(
|
153
|
+
TTY::File.copy_file("templates/%file_name%.rb", context: variables)
|
154
154
|
# => Creates templates/foo.rb
|
155
155
|
```
|
156
156
|
|
157
157
|
If the destination is a directory, then copies source inside that directory.
|
158
158
|
|
159
159
|
```ruby
|
160
|
-
TTY::File.copy_file
|
160
|
+
TTY::File.copy_file "docs/README.md", "app"
|
161
161
|
```
|
162
162
|
|
163
163
|
If the destination file already exists, a prompt menu will be displayed to enquire about action:
|
@@ -165,24 +165,50 @@ If the destination file already exists, a prompt menu will be displayed to enqui
|
|
165
165
|
If you wish to preserve original owner, group, permission and modified time use `:preserve` option:
|
166
166
|
|
167
167
|
```ruby
|
168
|
-
TTY::File.copy_file
|
168
|
+
TTY::File.copy_file "docs/README.md", "app", preserve: true
|
169
169
|
```
|
170
170
|
|
171
171
|
### 2.5. create_file
|
172
172
|
|
173
|
-
To create a file at a given destination with
|
173
|
+
To create a file at a given destination with some content use `create_file`:
|
174
174
|
|
175
175
|
```ruby
|
176
|
-
TTY::File.create_file
|
176
|
+
TTY::File.create_file "file-a/README.md", content
|
177
177
|
```
|
178
178
|
|
179
|
-
On collision with already existing file, a menu
|
179
|
+
On collision with already existing file, a menu gets displayed:
|
180
|
+
|
181
|
+
```
|
182
|
+
collision examples/file-a
|
183
|
+
Overwrite examples/file-a? (enter "h" for help) [y,d,n,q,h]
|
184
|
+
```
|
185
|
+
|
186
|
+
The `d` option allows to compare the changes:
|
187
|
+
|
188
|
+
```
|
189
|
+
--- a/examples/file-a
|
190
|
+
+++ b/examples/file-a
|
191
|
+
@@ -1,8 +1,9 @@
|
192
|
+
aaaaa
|
193
|
+
bbbbb
|
194
|
+
-ccccc
|
195
|
+
+xxxxx
|
196
|
+
+
|
197
|
+
ddddd
|
198
|
+
eeeee
|
199
|
+
fffff
|
200
|
+
-ggggg
|
201
|
+
+yyyyy
|
202
|
+
Overwrite examples/file-a? (enter "h" for help) [y,d,n,q,h]
|
203
|
+
````
|
180
204
|
|
181
205
|
You can force to always overwrite file with `:force` option or always skip by providing `:skip`.
|
182
206
|
|
207
|
+
There is [examples/overwrite.rb](examples/overwrite.rb) that demonstrates diffing file with new content.
|
208
|
+
|
183
209
|
### 2.6. copy_dir
|
184
210
|
|
185
|
-
To recursively copy a directory of files from source to destination location use `copy_directory` or its alias
|
211
|
+
To recursively copy a directory of files from source to destination location use `copy_directory` or its alias `copy_dir`.
|
186
212
|
|
187
213
|
Assuming you have the following directory structure:
|
188
214
|
|
@@ -197,7 +223,7 @@ Assuming you have the following directory structure:
|
|
197
223
|
You can copy `doc` folder to `docs` by invoking:
|
198
224
|
|
199
225
|
```ruby
|
200
|
-
TTY::File.copy_directory(
|
226
|
+
TTY::File.copy_directory("doc", "docs", context: ...)
|
201
227
|
```
|
202
228
|
|
203
229
|
The `context` needs to respond to `name` message and given it returns `foo` value the following directory gets created:
|
@@ -213,13 +239,13 @@ The `context` needs to respond to `name` message and given it returns `foo` valu
|
|
213
239
|
If you only need to copy top level files use option `recursive: false`:
|
214
240
|
|
215
241
|
```ruby
|
216
|
-
TTY::File.copy_directory(
|
242
|
+
TTY::File.copy_directory("doc", "docs", recursive: false)
|
217
243
|
```
|
218
244
|
|
219
245
|
By passing `:exclude` option you can instruct the method to ignore any files including the given pattern:
|
220
246
|
|
221
247
|
```ruby
|
222
|
-
TTY::File.copy_directory(
|
248
|
+
TTY::File.copy_directory("doc", "docs", exclude: "subcommands")
|
223
249
|
```
|
224
250
|
|
225
251
|
### 2.7. create_dir
|
@@ -227,21 +253,21 @@ TTY::File.copy_directory('doc', 'docs', exclude: 'subcommands')
|
|
227
253
|
To create directory use `create_directory` or its alias `create_dir` passing as a first argument file path:
|
228
254
|
|
229
255
|
```ruby
|
230
|
-
TTY::File.create_dir(
|
256
|
+
TTY::File.create_dir("/path/to/directory")
|
231
257
|
```
|
232
258
|
|
233
259
|
Or a data structure describing the directory tree including any files with or without content:
|
234
260
|
|
235
261
|
```ruby
|
236
262
|
tree =
|
237
|
-
|
238
|
-
|
239
|
-
[
|
240
|
-
|
241
|
-
|
242
|
-
[
|
263
|
+
"app" => [
|
264
|
+
"README.md",
|
265
|
+
["Gemfile", "gem 'tty-file'"],
|
266
|
+
"lib" => [
|
267
|
+
"cli.rb",
|
268
|
+
["file_utils.rb", "require 'tty-file'"]
|
243
269
|
]
|
244
|
-
|
270
|
+
"spec" => []
|
245
271
|
]
|
246
272
|
```
|
247
273
|
|
@@ -260,7 +286,7 @@ TTY::File.create_dir(tree)
|
|
260
286
|
As a second argument you can provide a parent directory, otherwise current directory will be assumed:
|
261
287
|
|
262
288
|
```ruby
|
263
|
-
TTY::File.create_dir(tree,
|
289
|
+
TTY::File.create_dir(tree, "/path/to/parent/dir")
|
264
290
|
```
|
265
291
|
|
266
292
|
### 2.8. diff_files
|
@@ -268,42 +294,85 @@ TTY::File.create_dir(tree, '/path/to/parent/dir')
|
|
268
294
|
To compare files line by line in a system independent way use `diff`, or `diff_files`:
|
269
295
|
|
270
296
|
```ruby
|
271
|
-
TTY::File.diff_files(
|
272
|
-
# =>
|
273
|
-
# @@ -1,4 +1,4 @@
|
274
|
-
# aaa
|
275
|
-
# -bbb
|
276
|
-
# +xxx
|
277
|
-
# ccc
|
297
|
+
print TTY::File.diff_files("file-a", "file-b")
|
278
298
|
```
|
279
299
|
|
280
|
-
|
300
|
+
Printing output to console would result in:
|
301
|
+
|
302
|
+
```
|
303
|
+
diff examples/file-a and examples/file-b
|
304
|
+
--- examples/file-a
|
305
|
+
+++ examples/file-b
|
306
|
+
@@ -1,8 +1,9 @@
|
307
|
+
aaaaa
|
308
|
+
bbbbb
|
309
|
+
-ccccc
|
310
|
+
+xxxxx
|
311
|
+
+
|
312
|
+
ddddd
|
313
|
+
eeeee
|
314
|
+
fffff
|
315
|
+
-ggggg
|
316
|
+
+yyyyy
|
317
|
+
```
|
281
318
|
|
282
|
-
|
319
|
+
You can also pass additional parameters such as:
|
283
320
|
|
284
|
-
|
321
|
+
* `:format` - accepted values are `:unified`, `:old`, `:context` and `:ed`. Defaults to `:unified` as seen in the output above - similar to git tool.
|
322
|
+
* `:lines` - how many extra lines to include in the output around the compared lines. Defaults to `3` lines.
|
323
|
+
* `:threshold` - set maximum file size in bytes. By default files larger than `10Mb` are no processed.
|
324
|
+
* `:header` - controls display of two-line files comparison. By default `true`.
|
285
325
|
|
286
|
-
|
326
|
+
Changing format to `:old`, removing context lines and skipping log output:
|
287
327
|
|
288
328
|
```ruby
|
289
|
-
TTY::File.diff_files(
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
329
|
+
TTY::File.diff_files("file_a", "file_b", format: :old, lines: 0, verbose: false)
|
330
|
+
```
|
331
|
+
|
332
|
+
Results in the following output:
|
333
|
+
|
334
|
+
```
|
335
|
+
<<< examples/file-a
|
336
|
+
>>> examples/file-b
|
337
|
+
3c3,4
|
338
|
+
< ccccc
|
339
|
+
---
|
340
|
+
> xxxxx
|
341
|
+
>
|
342
|
+
|
343
|
+
7c8
|
344
|
+
< ggggg
|
345
|
+
---
|
346
|
+
> yyyyy
|
299
347
|
```
|
300
348
|
|
301
|
-
|
349
|
+
In addition, you can perform a comparison between a file and a string or between two strings. For example, comparing file with content:
|
302
350
|
|
303
351
|
```ruby
|
304
|
-
TTY::File.diff_files(
|
352
|
+
TTY::File.diff_files("file-a", "new\nlong\ntext")
|
305
353
|
```
|
306
354
|
|
355
|
+
Will output:
|
356
|
+
|
357
|
+
```
|
358
|
+
diff a/examples/file-a and b/examples/file-a
|
359
|
+
--- a/examples/file-a
|
360
|
+
+++ b/examples/file-a
|
361
|
+
@@ -1,8 +1,4 @@
|
362
|
+
-aaaaa
|
363
|
+
-bbbbb
|
364
|
+
-ccccc
|
365
|
+
-ddddd
|
366
|
+
-eeeee
|
367
|
+
-fffff
|
368
|
+
-ggggg
|
369
|
+
+new
|
370
|
+
+long
|
371
|
+
+text
|
372
|
+
````
|
373
|
+
|
374
|
+
Please run [examples/diff.rb](examples/diff.rb) to see how output works.
|
375
|
+
|
307
376
|
### 2.9. download_file
|
308
377
|
|
309
378
|
To download a content from a given address and to save at a given relative location do:
|
@@ -332,13 +401,13 @@ TTY::File.download_file("https://gist.github.com/4701967", "doc/README.md", limi
|
|
332
401
|
Inject content into a file at a given location and return `true` when performed successfully, `false` otherwise.
|
333
402
|
|
334
403
|
```ruby
|
335
|
-
TTY::File.inject_into_file
|
404
|
+
TTY::File.inject_into_file "filename.rb", "text to add", after: "Code below this line\n"
|
336
405
|
```
|
337
406
|
|
338
407
|
Or using a block:
|
339
408
|
|
340
409
|
```ruby
|
341
|
-
TTY::File.inject_into_file
|
410
|
+
TTY::File.inject_into_file "filename.rb", after: "Code below this line\n" do
|
342
411
|
"text to add"
|
343
412
|
end
|
344
413
|
```
|
@@ -348,13 +417,13 @@ You can also use Regular Expressions in `:after` or `:before` to match file loca
|
|
348
417
|
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
418
|
|
350
419
|
```ruby
|
351
|
-
TTY::File.inject_into_file(
|
420
|
+
TTY::File.inject_into_file("filename.rb", "text to add", after: "Code below this line\n"
|
352
421
|
```
|
353
422
|
|
354
423
|
Alternatively, use `safe_inject_into_file` to check if the text can be safely inserted.
|
355
424
|
|
356
425
|
```ruby
|
357
|
-
TTY::File.safe_inject_into_file(
|
426
|
+
TTY::File.safe_inject_into_file("Gemfile", "gem 'tty'")
|
358
427
|
```
|
359
428
|
|
360
429
|
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.
|
@@ -364,14 +433,14 @@ The [append_to_file](#212-append_to_file) and [prepend_to_file](#213-prepend_to_
|
|
364
433
|
Replace content of a file matching condition by calling `replace_in_file` or `gsub_file`, which returns `true` when substitutions are performed successfully, `false` otherwise.
|
365
434
|
|
366
435
|
```ruby
|
367
|
-
TTY::File.replace_in_file
|
436
|
+
TTY::File.replace_in_file "filename.rb", /matching condition/, "replacement"
|
368
437
|
```
|
369
438
|
|
370
439
|
The replacement content can be provided in a block
|
371
440
|
|
372
441
|
```ruby
|
373
|
-
TTY::File.gsub_file
|
374
|
-
|
442
|
+
TTY::File.gsub_file "filename.rb", /matching condition/ do
|
443
|
+
"replacement"
|
375
444
|
end
|
376
445
|
```
|
377
446
|
|
@@ -380,13 +449,13 @@ end
|
|
380
449
|
Appends text to a file and returns `true` when performed successfully, `false` otherwise. You can provide the text as a second argument:
|
381
450
|
|
382
451
|
```ruby
|
383
|
-
TTY::File.append_to_file(
|
452
|
+
TTY::File.append_to_file("Gemfile", "gem 'tty'")
|
384
453
|
```
|
385
454
|
|
386
455
|
Or inside a block:
|
387
456
|
|
388
457
|
```ruby
|
389
|
-
TTY::File.append_to_file(
|
458
|
+
TTY::File.append_to_file("Gemfile") do
|
390
459
|
"gem 'tty'"
|
391
460
|
end
|
392
461
|
```
|
@@ -394,13 +463,13 @@ end
|
|
394
463
|
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
464
|
|
396
465
|
```ruby
|
397
|
-
TTY::File.append_to_file(
|
466
|
+
TTY::File.append_to_file("Gemfile", "gem 'tty'", force: false)
|
398
467
|
```
|
399
468
|
|
400
469
|
Alternatively, use `safe_append_to_file` to check if the text can be safely appended.
|
401
470
|
|
402
471
|
```ruby
|
403
|
-
TTY::File.safe_append_to_file(
|
472
|
+
TTY::File.safe_append_to_file("Gemfile", "gem 'tty'")
|
404
473
|
```
|
405
474
|
|
406
475
|
### 2.13. prepend_to_file
|
@@ -408,13 +477,13 @@ TTY::File.safe_append_to_file('Gemfile', "gem 'tty'")
|
|
408
477
|
Prepends text to a file and returns `true` when performed successfully, `false` otherwise. You can provide the text as a second argument:
|
409
478
|
|
410
479
|
```ruby
|
411
|
-
TTY::File.prepend_to_file(
|
480
|
+
TTY::File.prepend_to_file("Gemfile", "gem 'tty'")
|
412
481
|
```
|
413
482
|
|
414
483
|
Or inside a block:
|
415
484
|
|
416
485
|
```ruby
|
417
|
-
TTY::File.prepend_to_file(
|
486
|
+
TTY::File.prepend_to_file("Gemfile") do
|
418
487
|
"gem 'tty'"
|
419
488
|
end
|
420
489
|
```
|
@@ -422,13 +491,13 @@ end
|
|
422
491
|
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
492
|
|
424
493
|
```ruby
|
425
|
-
TTY::File.prepend_to_file(
|
494
|
+
TTY::File.prepend_to_file("Gemfile", "gem 'tty'", force: false)
|
426
495
|
```
|
427
496
|
|
428
497
|
Alternatively, use `safe_prepend_to_file` to check if the text can be safely appended.
|
429
498
|
|
430
499
|
```ruby
|
431
|
-
TTY::File.safe_prepend_to_file(
|
500
|
+
TTY::File.safe_prepend_to_file("Gemfile", "gem 'tty'")
|
432
501
|
```
|
433
502
|
|
434
503
|
### 2.14. remove_file
|
@@ -436,13 +505,13 @@ TTY::File.safe_prepend_to_file('Gemfile', "gem 'tty'")
|
|
436
505
|
To remove a file do:
|
437
506
|
|
438
507
|
```ruby
|
439
|
-
TTY::File.remove_file
|
508
|
+
TTY::File.remove_file "doc/README.md"
|
440
509
|
```
|
441
510
|
|
442
511
|
You can also pass in `:force` to remove file ignoring any errors:
|
443
512
|
|
444
513
|
```ruby
|
445
|
-
TTY::File.remove_file
|
514
|
+
TTY::File.remove_file "doc/README.md", force: true
|
446
515
|
```
|
447
516
|
|
448
517
|
### 2.15. tail_file
|
@@ -450,14 +519,14 @@ TTY::File.remove_file 'doc/README.md', force: true
|
|
450
519
|
To read the last 10 lines from a file do:
|
451
520
|
|
452
521
|
```ruby
|
453
|
-
TTY::File.tail_file
|
454
|
-
# => [
|
522
|
+
TTY::File.tail_file "doc/README.md"
|
523
|
+
# => ["## Copyright", "Copyright (c) 2016-2017", ...]
|
455
524
|
```
|
456
525
|
|
457
526
|
You can also pass a block:
|
458
527
|
|
459
528
|
```ruby
|
460
|
-
TTY::File.tail_file(
|
529
|
+
TTY::File.tail_file("doc/README.md") do |line|
|
461
530
|
puts line
|
462
531
|
end
|
463
532
|
```
|
@@ -465,7 +534,7 @@ end
|
|
465
534
|
To change how many lines are read pass a second argument:
|
466
535
|
|
467
536
|
```ruby
|
468
|
-
TTY::File.tail_file(
|
537
|
+
TTY::File.tail_file("doc/README.md", 15)
|
469
538
|
```
|
470
539
|
|
471
540
|
## Development
|