tty-file 0.6.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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.