tty-file 0.6.0 → 0.10.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 12c95f3b7bd457b553e6592d5a9c74cf3dff2d9a
4
- data.tar.gz: adc293eda605ad68b5f45acff1d37c2849050922
2
+ SHA256:
3
+ metadata.gz: e1d9e2c1d0c438b74128707623835e44da4ec23dcdebfe0ba88afb5284c730a7
4
+ data.tar.gz: 63c7b68f347b2199502240cbdbfdf20264f90a95ece1ea50f60a78d2c3a6c73f
5
5
  SHA512:
6
- metadata.gz: 3a86b5c70306a91576514af459e7fd3a458858732352cbe68683afa27786576abdc018c4388e4aa00105e85a23de1d0dcd84f02ea715377ef86e7bbee2ff2197
7
- data.tar.gz: a484156abd85e985118467b7cfd087c9672882e763fe0a84867b2543d08c4aa2000fc7640d205ffd6c2201fd18d0a79bcc0f83bf128165668ae4d7d06ca52e5c
6
+ metadata.gz: 0ab6abf98fa2bcdb58f7f0eb2d3518e1184607863fedfeb2a1de34b21eeb876d3e7c9ce2eb0c48198b98dfaae7d281c49447a7dfe872a48e19d07493fdb0c020
7
+ data.tar.gz: 9925c5f71b7a0c8f9afb369abb6b83df9c6700d87884a3b9e4ce2dd77c02c2e0d9848803979ac599e431c0f282419ba2be72ea241de10479930989bc7073ed57
@@ -1,12 +1,68 @@
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
+
17
+ ## [v0.9.0] - 2020-04-28
18
+
19
+ ### Changed
20
+ * Change #chmod custom permission implementation for built-in FileUtils one
21
+ * Change to update tty-prompt dependency
22
+ * Change gemspec to include metadata and stop loading test artefacts
23
+
24
+ ### Fixed
25
+ * Fix Ruby 2.7 hash to keywords conversion warnings
26
+
27
+ ## [v0.8.0] - 2019-07-25
28
+
29
+ ### Added
30
+ * Add #read_to_char for reading file content limited by bytes until a valid char
31
+
32
+ ### Fixed
33
+ * Fix #binary? to correctly identify large UTF-8 files as non-binary
34
+
35
+ ## [v0.7.1] - 2019-05-06
36
+
37
+ ### Changed
38
+ * Change all methods to accept Pathname instances as argument by Chris Hoffman(@yarmiganosca)
39
+
40
+ ### Fixed
41
+ * Fix Ruby 2.6.0 ERB#new arguments deprecation warnings
42
+ * Fix #replace_in_file to handle character encoding
43
+
44
+ ## [v0.7.0] - 2018-12-17
45
+
46
+ ### Added
47
+ * Add :secure option to #remove_file call
48
+ * Add #safe_append_to_file, #safe_prepend_to_file, #safe_inject_into_file
49
+
50
+ ### Changed
51
+ * Change #replace_in_file, #append_to_file, #prepend_to_file, and #inject_into_file to perform operation unsafely without checking prior content
52
+ * Change to load gemspec files directly
53
+ * Change to update tty-prompt
54
+ * Change to freeze strings
55
+ * Change to relax tty-prompt & diff-lcs version constraints
56
+
57
+ ### Fixed
58
+ * Fixed windows tests
59
+
3
60
  ## [v0.6.0] - 2018-05-21
4
61
 
5
62
  ### Changed
6
63
  * Change identical files conflict message from blue to cyan for readability
7
64
  * 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
65
+ * Change replace_in_file, inject_into_file, prepend_to_file, append_to_file to return true when operation is performed successfully, false otherwise
10
66
  * Update tty-prompt dependency
11
67
  * Change download_file to preserve query parameters
12
68
 
@@ -64,6 +120,11 @@
64
120
 
65
121
  * Initial implementation and release
66
122
 
123
+ [v0.10.0]: https://github.com/piotrmurach/tty-file/compare/v0.9.0...v0.10.0
124
+ [v0.9.0]: https://github.com/piotrmurach/tty-file/compare/v0.8.0...v0.9.0
125
+ [v0.8.0]: https://github.com/piotrmurach/tty-file/compare/v0.7.1...v0.8.0
126
+ [v0.7.1]: https://github.com/piotrmurach/tty-file/compare/v0.7.0...v0.7.1
127
+ [v0.7.0]: https://github.com/piotrmurach/tty-file/compare/v0.6.0...v0.7.0
67
128
  [v0.6.0]: https://github.com/piotrmurach/tty-file/compare/v0.5.0...v0.6.0
68
129
  [v0.5.0]: https://github.com/piotrmurach/tty-file/compare/v0.4.0...v0.5.0
69
130
  [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](https://badges.gitter.im/Join%20Chat.svg)][gitter]
2
6
 
3
7
  [![Gem Version](https://badge.fury.io/rb/tty-file.svg)][gem]
@@ -26,7 +30,7 @@ Though Ruby's `File` and `FileUtils` libraries provide very robust apis for deal
26
30
  Add this line to your application's Gemfile:
27
31
 
28
32
  ```ruby
29
- gem 'tty-file'
33
+ gem "tty-file"
30
34
  ```
31
35
 
32
36
  And then execute:
@@ -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. diff](#28-diff)
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-apend_to_file)
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)
@@ -60,7 +64,7 @@ Or install it yourself as:
60
64
  ## 1. Usage
61
65
 
62
66
  ```ruby
63
- TTY::File.replace_in_file('Gemfile', /gem 'rails'/, "gem 'hanami'")
67
+ TTY::File.replace_in_file("Gemfile", /gem 'rails'/, "gem 'hanami'")
64
68
  ```
65
69
 
66
70
  ## 2. Interface
@@ -74,7 +78,7 @@ If you wish to silence verbose output use `verbose: false`. Similarly if you wis
74
78
  To check whether a file is a binary file, i.e. image, executable etc. do:
75
79
 
76
80
  ```ruby
77
- TTY::File.binary?('image.png') # => true
81
+ TTY::File.binary?("image.png") # => true
78
82
  ```
79
83
 
80
84
  ### 2.2. checksum_file
@@ -89,7 +93,7 @@ Among the supported message digest algorithms are:
89
93
  For example, to create a digest for a string using `SHA1` do:
90
94
 
91
95
  ```ruby
92
- TTY::File.checksum_file("Some content\nThe end", 'sha1')
96
+ TTY::File.checksum_file("Some content\nThe end", "sha1")
93
97
  # => "289388f187404135e6c15b21460442cf867180dd"
94
98
  ```
95
99
 
@@ -98,19 +102,19 @@ TTY::File.checksum_file("Some content\nThe end", 'sha1')
98
102
  To change file modes use `chmod`, like so:
99
103
 
100
104
  ```ruby
101
- TTY::File.chmod('filename.rb', 0777)
105
+ TTY::File.chmod("filename.rb", 0777)
102
106
  ```
103
107
 
104
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:
105
109
 
106
110
  ```ruby
107
- TTY::File.chmod('filename.rb', TTY::File::U_R | TTY::File::O_X)
111
+ TTY::File.chmod("filename.rb", TTY::File::U_R | TTY::File::O_X)
108
112
  ```
109
113
 
110
114
  Apart from traditional octal number definition for file permissions, you can use the more convenient permission notation used by the Unix `chmod` command:
111
115
 
112
116
  ```ruby
113
- TTY::File.chmod('filename.rb', 'u=wrx,g+x')
117
+ TTY::File.chmod("filename.rb", "u=wrx,g+x")
114
118
  ```
115
119
 
116
120
  The `u`, `g`, and `o` specify the user, group, and other parts of the mode bits. The `a` symbol is equivalent to `ugo`.
@@ -120,13 +124,13 @@ The `u`, `g`, and `o` specify the user, group, and other parts of the mode bits.
120
124
  Copies a file's contents from a relative source to a relative destination.
121
125
 
122
126
  ```ruby
123
- TTY::File.copy_file 'Gemfile', 'Gemfile.bak'
127
+ TTY::File.copy_file "Gemfile", "Gemfile.bak"
124
128
  ```
125
129
 
126
130
  If you provide a block then the file content is yielded:
127
131
 
128
132
  ```ruby
129
- TTY::File.copy_file('Gemfile', 'app/Gemfile') do |content|
133
+ TTY::File.copy_file("Gemfile", "app/Gemfile") do |content|
130
134
  "https://rubygems.org\n" + content
131
135
  end
132
136
  ```
@@ -135,25 +139,25 @@ If the source file is an `ERB` template then you can provide a `:context` in whi
135
139
 
136
140
  ```ruby
137
141
  variables = OpenStruct.new
138
- variables[:foo] = 'bar'
142
+ variables[:foo] = "bar"
139
143
 
140
- TTY::File.copy_file('templates/application.html.erb', context: variables)
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 evaluted:
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
147
- variables[:file_name] = 'foo'
151
+ variables[:file_name] = "foo"
148
152
 
149
- TTY::File.copy_file('templates/%file_name%.rb', context: variables)
153
+ TTY::File.copy_file("templates/%file_name%.rb", context: variables)
150
154
  # => Creates templates/foo.rb
151
155
  ```
152
156
 
153
157
  If the destination is a directory, then copies source inside that directory.
154
158
 
155
159
  ```ruby
156
- TTY::File.copy_file 'docs/README.md', 'app'
160
+ TTY::File.copy_file "docs/README.md", "app"
157
161
  ```
158
162
 
159
163
  If the destination file already exists, a prompt menu will be displayed to enquire about action:
@@ -161,24 +165,50 @@ If the destination file already exists, a prompt menu will be displayed to enqui
161
165
  If you wish to preserve original owner, group, permission and modified time use `:preserve` option:
162
166
 
163
167
  ```ruby
164
- TTY::File.copy_file 'docs/README.md', 'app', preserve: true
168
+ TTY::File.copy_file "docs/README.md", "app", preserve: true
165
169
  ```
166
170
 
167
171
  ### 2.5. create_file
168
172
 
169
- To create a file at a given destination with the given content use `create_file`:
173
+ To create a file at a given destination with some content use `create_file`:
170
174
 
171
175
  ```ruby
172
- TTY::File.create_file 'docs/README.md', '## Title header'
176
+ TTY::File.create_file "file-a/README.md", content
177
+ ```
178
+
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]
173
184
  ```
174
185
 
175
- On collision with already existing file, a menu is displayed:
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
+ ````
176
204
 
177
205
  You can force to always overwrite file with `:force` option or always skip by providing `:skip`.
178
206
 
207
+ There is [examples/overwrite.rb](examples/overwrite.rb) that demonstrates diffing file with new content.
208
+
179
209
  ### 2.6. copy_dir
180
210
 
181
- To recursively copy a directory of files from source to destination location use `copy_directory` or its alias 'copy_dir'.
211
+ To recursively copy a directory of files from source to destination location use `copy_directory` or its alias `copy_dir`.
182
212
 
183
213
  Assuming you have the following directory structure:
184
214
 
@@ -190,10 +220,10 @@ Assuming you have the following directory structure:
190
220
  # %name%.rb
191
221
  ```
192
222
 
193
- you can copy `doc` folder to `docs` by invoking:
223
+ You can copy `doc` folder to `docs` by invoking:
194
224
 
195
225
  ```ruby
196
- TTY::File.copy_directory('doc', 'docs', context: ...)
226
+ TTY::File.copy_directory("doc", "docs", context: ...)
197
227
  ```
198
228
 
199
229
  The `context` needs to respond to `name` message and given it returns `foo` value the following directory gets created:
@@ -209,13 +239,13 @@ The `context` needs to respond to `name` message and given it returns `foo` valu
209
239
  If you only need to copy top level files use option `recursive: false`:
210
240
 
211
241
  ```ruby
212
- TTY::File.copy_directory('doc', 'docs', recursive: false)
242
+ TTY::File.copy_directory("doc", "docs", recursive: false)
213
243
  ```
214
244
 
215
245
  By passing `:exclude` option you can instruct the method to ignore any files including the given pattern:
216
246
 
217
247
  ```ruby
218
- TTY::File.copy_directory('doc', 'docs', exclude: 'subcommands')
248
+ TTY::File.copy_directory("doc", "docs", exclude: "subcommands")
219
249
  ```
220
250
 
221
251
  ### 2.7. create_dir
@@ -223,21 +253,21 @@ TTY::File.copy_directory('doc', 'docs', exclude: 'subcommands')
223
253
  To create directory use `create_directory` or its alias `create_dir` passing as a first argument file path:
224
254
 
225
255
  ```ruby
226
- TTY::File.create_dir(/path/to/directory)
256
+ TTY::File.create_dir("/path/to/directory")
227
257
  ```
228
258
 
229
- or a data structure describing the directory tree including any files with or without content:
259
+ Or a data structure describing the directory tree including any files with or without content:
230
260
 
231
261
  ```ruby
232
262
  tree =
233
- 'app' => [
234
- 'README.md',
235
- ['Gemfile', "gem 'tty-file'"],
236
- 'lib' => [
237
- 'cli.rb',
238
- ['file_utils.rb', "require 'tty-file'"]
263
+ "app" => [
264
+ "README.md",
265
+ ["Gemfile", "gem 'tty-file'"],
266
+ "lib" => [
267
+ "cli.rb",
268
+ ["file_utils.rb", "require 'tty-file'"]
239
269
  ]
240
- 'spec' => []
270
+ "spec" => []
241
271
  ]
242
272
  ```
243
273
 
@@ -256,50 +286,93 @@ TTY::File.create_dir(tree)
256
286
  As a second argument you can provide a parent directory, otherwise current directory will be assumed:
257
287
 
258
288
  ```ruby
259
- TTy::File.create_dir(tree, '/path/to/parent/dir')
289
+ TTY::File.create_dir(tree, "/path/to/parent/dir")
260
290
  ```
261
291
 
262
- ### 2.8. diff
292
+ ### 2.8. diff_files
263
293
 
264
294
  To compare files line by line in a system independent way use `diff`, or `diff_files`:
265
295
 
266
296
  ```ruby
267
- TTY::File.diff('file_a', 'file_b')
268
- # =>
269
- # @@ -1,4 +1,4 @@
270
- # aaa
271
- # -bbb
272
- # +xxx
273
- # ccc
297
+ print TTY::File.diff_files("file-a", "file-b")
274
298
  ```
275
299
 
276
- You can also pass additional arguments such as `:format`, `:context_lines` and `:threshold`.
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
+ ```
277
318
 
278
- Accepted formats are `:old`, `:unified`, `:context`, `:ed`, `:reverse_ed`, by default the `:unified` format is used.
319
+ You can also pass additional parameters such as:
279
320
 
280
- The `:context_lines` specifies how many extra lines around the differing lines to include in the output. By default its 3 lines.
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`.
281
325
 
282
- The `:threshold` sets maximum file size in bytes, by default files larger than `10Mb` are not processed.
326
+ Changing format to `:old`, removing context lines and skipping log output:
283
327
 
284
328
  ```ruby
285
- TTY::File.diff('file_a', 'file_b', format: :old)
286
- # =>
287
- # 1,4c1,4
288
- # < aaa
289
- # < bbb
290
- # < ccc
291
- # ---
292
- # > aaa
293
- # > xxx
294
- # > ccc
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
295
347
  ```
296
348
 
297
- Equally, you can perform a comparison between a file content and a string content like so:
349
+ In addition, you can perform a comparison between a file and a string or between two strings. For example, comparing file with content:
298
350
 
299
351
  ```ruby
300
- TTY::File.diff('/path/to/file', 'some long text')
352
+ TTY::File.diff_files("file-a", "new\nlong\ntext")
301
353
  ```
302
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
+
303
376
  ### 2.9. download_file
304
377
 
305
378
  To download a content from a given address and to save at a given relative location do:
@@ -328,32 +401,46 @@ TTY::File.download_file("https://gist.github.com/4701967", "doc/README.md", limi
328
401
  Inject content into a file at a given location and return `true` when performed successfully, `false` otherwise.
329
402
 
330
403
  ```ruby
331
- TTY::File.inject_into_file 'filename.rb', "text to add", after: "Code below this line\n"
404
+ TTY::File.inject_into_file "filename.rb", "text to add", after: "Code below this line\n"
332
405
  ```
333
406
 
334
- or using a block
407
+ Or using a block:
335
408
 
336
409
  ```ruby
337
- TTY::File.inject_into_file 'filename.rb', after: "Code below this line\n" do
410
+ TTY::File.inject_into_file "filename.rb", after: "Code below this line\n" do
338
411
  "text to add"
339
412
  end
340
413
  ```
341
414
 
342
- You can also use Regular Expressions in `:after` or `:before` to match file location. The `append_to_file` and `prepend_to_file` allow you to add content at the end and the begging of a file.
415
+ You can also use Regular Expressions in `:after` or `:before` to match file location.
416
+
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:
418
+
419
+ ```ruby
420
+ TTY::File.inject_into_file("filename.rb", "text to add", after: "Code below this line\n"
421
+ ```
422
+
423
+ Alternatively, use `safe_inject_into_file` to check if the text can be safely inserted.
424
+
425
+ ```ruby
426
+ TTY::File.safe_inject_into_file("Gemfile", "gem 'tty'")
427
+ ```
428
+
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.
343
430
 
344
431
  ### 2.11. replace_in_file
345
432
 
346
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.
347
434
 
348
435
  ```ruby
349
- TTY::File.replace_in_file 'filename.rb', /matching condition/, 'replacement'
436
+ TTY::File.replace_in_file "filename.rb", /matching condition/, "replacement"
350
437
  ```
351
438
 
352
439
  The replacement content can be provided in a block
353
440
 
354
441
  ```ruby
355
- TTY::File.gsub_file 'filename.rb', /matching condition/ do
356
- 'replacement'
442
+ TTY::File.gsub_file "filename.rb", /matching condition/ do
443
+ "replacement"
357
444
  end
358
445
  ```
359
446
 
@@ -362,45 +449,69 @@ end
362
449
  Appends text to a file and returns `true` when performed successfully, `false` otherwise. You can provide the text as a second argument:
363
450
 
364
451
  ```ruby
365
- TTY::File.append_to_file('Gemfile', "gem 'tty'")
452
+ TTY::File.append_to_file("Gemfile", "gem 'tty'")
366
453
  ```
367
454
 
368
- or inside a block:
455
+ Or inside a block:
369
456
 
370
457
  ```ruby
371
- TTY::File.append_to_file('Gemfile') do
458
+ TTY::File.append_to_file("Gemfile") do
372
459
  "gem 'tty'"
373
460
  end
374
461
  ```
375
462
 
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:
464
+
465
+ ```ruby
466
+ TTY::File.append_to_file("Gemfile", "gem 'tty'", force: false)
467
+ ```
468
+
469
+ Alternatively, use `safe_append_to_file` to check if the text can be safely appended.
470
+
471
+ ```ruby
472
+ TTY::File.safe_append_to_file("Gemfile", "gem 'tty'")
473
+ ```
474
+
376
475
  ### 2.13. prepend_to_file
377
476
 
378
477
  Prepends text to a file and returns `true` when performed successfully, `false` otherwise. You can provide the text as a second argument:
379
478
 
380
479
  ```ruby
381
- TTY::File.prepend_to_file('Gemfile', "gem 'tty'")
480
+ TTY::File.prepend_to_file("Gemfile", "gem 'tty'")
382
481
  ```
383
482
 
384
- or inside a block:
483
+ Or inside a block:
385
484
 
386
485
  ```ruby
387
- TTY::File.prepend_to_file('Gemfile') do
486
+ TTY::File.prepend_to_file("Gemfile") do
388
487
  "gem 'tty'"
389
488
  end
390
489
  ```
391
490
 
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:
492
+
493
+ ```ruby
494
+ TTY::File.prepend_to_file("Gemfile", "gem 'tty'", force: false)
495
+ ```
496
+
497
+ Alternatively, use `safe_prepend_to_file` to check if the text can be safely appended.
498
+
499
+ ```ruby
500
+ TTY::File.safe_prepend_to_file("Gemfile", "gem 'tty'")
501
+ ```
502
+
392
503
  ### 2.14. remove_file
393
504
 
394
505
  To remove a file do:
395
506
 
396
507
  ```ruby
397
- TTY::File.remove_file 'doc/README.md'
508
+ TTY::File.remove_file "doc/README.md"
398
509
  ```
399
510
 
400
511
  You can also pass in `:force` to remove file ignoring any errors:
401
512
 
402
513
  ```ruby
403
- TTY::File.remove_file 'doc/README.md', force: true
514
+ TTY::File.remove_file "doc/README.md", force: true
404
515
  ```
405
516
 
406
517
  ### 2.15. tail_file
@@ -408,14 +519,14 @@ TTY::File.remove_file 'doc/README.md', force: true
408
519
  To read the last 10 lines from a file do:
409
520
 
410
521
  ```ruby
411
- TTY::File.tail_file 'doc/README.md'
412
- # => ['## Copyright', 'Copyright (c) 2016-2017', ...]
522
+ TTY::File.tail_file "doc/README.md"
523
+ # => ["## Copyright", "Copyright (c) 2016-2017", ...]
413
524
  ```
414
525
 
415
526
  You can also pass a block:
416
527
 
417
528
  ```ruby
418
- TTY::File.tail_file('doc/README.md') do |line|
529
+ TTY::File.tail_file("doc/README.md") do |line|
419
530
  puts line
420
531
  end
421
532
  ```
@@ -423,7 +534,7 @@ end
423
534
  To change how many lines are read pass a second argument:
424
535
 
425
536
  ```ruby
426
- TTY::File.tail_file('doc/README.md', 15)
537
+ TTY::File.tail_file("doc/README.md", 15)
427
538
  ```
428
539
 
429
540
  ## Development
@@ -442,4 +553,4 @@ The gem is available as open source under the terms of the [MIT License](http://
442
553
 
443
554
  ## Copyright
444
555
 
445
- Copyright (c) 2016-2018 Piotr Murach. See LICENSE for further details.
556
+ Copyright (c) 2016 Piotr Murach. See LICENSE for further details.