extracter 1.2.32 → 1.3.6

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.
data/extracter.gemspec CHANGED
@@ -15,40 +15,20 @@ Gem::Specification.new { |s|
15
15
 
16
16
  DESCRIPTION = <<-EOF
17
17
 
18
- This fairly small project can be used to extract different
19
- archive formats such as .tar.bz2 or .tbz - archives such
20
- as .gem and .lzma will also work.
18
+ This fairly small gem can be used to extract different
19
+ archive formats, such as .tar.bz2, .tar.gz, .tbz,
20
+ .zip, .gem, .lzma and various more.
21
21
 
22
- You can also extract audio, by making use of class ExtractAudio
23
- (part of the multimedia_paradise gem. The latter is - and should
24
- be - optional, though. If you have no such use case then you
25
- won't need to install the multimedia_paradise gem.
22
+ Audio can be extracted as well, via ffmpeg, if the gem called
23
+ multimedia_paradise is installed.
26
24
 
27
- Usage example:
25
+ This project, however had, depends on external tools,
26
+ such as tar (on Linux) or 7z / 7zip (on Windows), so
27
+ these have to be installed first.
28
28
 
29
- require 'extracter'
30
-
31
- Extracter.new('/foo/bla-1.0.tar.bz2')
32
-
33
- The second argument that can be passed to the method new()
34
- specifies where this should be extract to.
35
-
36
- For example:
37
-
38
- Extracter.new('/foo/bla-1.0.tar.bz2', '/opt')
39
-
40
- This would extract to the /opt directory.
41
-
42
- You can query whether input is an archive or not via:
43
-
44
- Extracter.is_archive? 'foo.tar.xz'
45
-
46
- As of April 2014 we also provide a bin/extract file, so that
47
- you can simply extract something from the commandline.
48
-
49
- Since as of November 2018, class Extracter can also "extract"
50
- .iso files. (The .iso will be mounted to a directory that
51
- will be created, actually.)
29
+ For more information about this project have a look
30
+ at the homepage, at
31
+ https://rubygems.org/gems/extracter.
52
32
 
53
33
  EOF
54
34
 
@@ -106,4 +86,4 @@ EOF
106
86
  # ========================================================================= #
107
87
  s.add_dependency 'opn'
108
88
 
109
- }
89
+ }
@@ -4,6 +4,8 @@
4
4
  # =========================================================================== #
5
5
  # === Extracter::Base
6
6
  #
7
+ # This is the base class for the extracter-gem.
8
+ #
7
9
  # Usage example:
8
10
  #
9
11
  # Extracter::Base.new(ARGV)
@@ -15,24 +17,52 @@ module Extracter
15
17
 
16
18
  class Base # === Extracter::Base
17
19
 
20
+ require 'fileutils' # We always need fileutils.
21
+
18
22
  begin
19
23
  require 'colours/html_colours'
20
24
  rescue LoadError; end
21
25
 
26
+ require 'extracter/toplevel_methods/toplevel_methods.rb'
27
+
22
28
  # ========================================================================= #
23
- # === reset
29
+ # === reset (reset tag)
24
30
  # ========================================================================= #
25
31
  def reset
26
32
  # ======================================================================= #
27
33
  # === @internal_hash
34
+ #
35
+ # The internal Hash must be created first.
28
36
  # ======================================================================= #
29
- @internal_hash = {}
37
+ create_the_internal_hash
38
+ # ======================================================================= #
39
+ # === :debug
40
+ # ======================================================================= #
41
+ @internal_hash[:debug] = false
30
42
  # ======================================================================= #
31
- # === :use_colours
43
+ # === :be_verbose
44
+ # ======================================================================= #
45
+ @internal_hash[:be_verbose] = true
46
+ # ======================================================================= #
47
+ # === :colour_to_use_for_directories
48
+ # ======================================================================= #
49
+ @internal_hash[:colour_to_use_for_directories] = 'cyan'
50
+ # ======================================================================= #
51
+ # === :use_opn
52
+ # ======================================================================= #
53
+ @internal_hash[:use_opn] = true # ← Whether to use make use of Opn by default or not.
32
54
  # ======================================================================= #
33
- @internal_hash[:use_colours] = true
34
55
  # Next check whether the Colours gem is available.
56
+ # ======================================================================= #
35
57
  check_whether_the_colours_gem_is_available
58
+ do_try_to_use_colours
59
+ end
60
+
61
+ # ========================================================================= #
62
+ # === create_the_internal_hash
63
+ # ========================================================================= #
64
+ def create_the_internal_hash
65
+ @internal_hash = {}
36
66
  end
37
67
 
38
68
  # ========================================================================= #
@@ -45,22 +75,39 @@ class Base # === Extracter::Base
45
75
  Colours.respond_to?(:sdir) and
46
76
  Colours.respond_to?(:simp)
47
77
  else
48
- @internal_hash[:use_colours] = false
78
+ do_not_make_use_of_colours
49
79
  end
50
80
  end
51
81
 
82
+ # ========================================================================= #
83
+ # === do_not_make_use_of_colours
84
+ # ========================================================================= #
85
+ def do_not_make_use_of_colours
86
+ @internal_hash[:use_colours] = false
87
+ end
88
+
89
+ # ========================================================================= #
90
+ # === change_directory
91
+ # ========================================================================= #
92
+ def change_directory(i)
93
+ Dir.chdir(i)
94
+ end; alias cd change_directory # === cd
95
+
52
96
  # ========================================================================= #
53
97
  # === cyan
54
98
  # ========================================================================= #
55
- def cyan?
56
- return Colours::CYAN if Object.const_defined?(:Colours) and use_colours?
99
+ def cyan?(use_colours = use_colours?)
100
+ return Colours::CYAN if Object.const_defined?(:Colours) and use_colours
57
101
  return ''
58
102
  end
59
103
 
60
104
  # ========================================================================= #
61
105
  # === tomato
62
106
  # ========================================================================= #
63
- def tomato(i = '', use_colours = use_colours?)
107
+ def tomato(
108
+ i = '',
109
+ use_colours = use_colours?
110
+ )
64
111
  return Colours.tomato(i) if use_colours
65
112
  return i
66
113
  end
@@ -68,30 +115,74 @@ class Base # === Extracter::Base
68
115
  # ========================================================================= #
69
116
  # === simp
70
117
  # ========================================================================= #
71
- def simp(i = '')
72
- return Colours.simp(i) if use_colours?
118
+ def simp(
119
+ i = '',
120
+ use_colours = use_colours?
121
+ )
122
+ return Colours.simp(i) if use_colours
73
123
  return i
74
124
  end
75
125
 
76
126
  # ========================================================================= #
77
127
  # === steelblue
78
128
  # ========================================================================= #
79
- def steelblue(i = '')
80
- return ::Colours.steelblue(i) if use_colours? and ::Colours.respond_to?(:steelblue)
129
+ def steelblue(
130
+ i = '',
131
+ use_colours = use_colours?
132
+ )
133
+ return ::Colours.steelblue(i) if use_colours and ::Colours.respond_to?(:steelblue)
81
134
  return i
82
135
  end
83
136
 
84
137
  # ========================================================================= #
85
138
  # === ewarn
86
139
  # ========================================================================= #
87
- def ewarn(i = '')
88
- if use_colours? and Object.const_defined?(:Colours)
140
+ def ewarn(
141
+ i = '',
142
+ use_colours = use_colours?
143
+ )
144
+ if use_colours and Object.const_defined?(:Colours)
89
145
  e Colours.swarn(i)
90
146
  else
91
147
  e i
92
148
  end
93
149
  end
94
150
 
151
+ # ========================================================================= #
152
+ # === cpr
153
+ # ========================================================================= #
154
+ def cpr(a, b)
155
+ try_to_require_fileutils
156
+ FileUtils.cp_r(a, b)
157
+ end
158
+
159
+ # ========================================================================= #
160
+ # === move
161
+ # ========================================================================= #
162
+ def move(a, b)
163
+ try_to_require_fileutils
164
+ FileUtils.mv(a, b)
165
+ end; alias mv move # === mv
166
+
167
+ # ========================================================================= #
168
+ # === remove_this_directory
169
+ #
170
+ # This method can be used to remove a directory.
171
+ # ========================================================================= #
172
+ def remove_this_directory(i)
173
+ if File.directory? i
174
+ try_to_require_fileutils
175
+ FileUtils.rm_r(i) unless i == '/'
176
+ end
177
+ end
178
+
179
+ # ========================================================================= #
180
+ # === try_to_require_fileutils
181
+ # ========================================================================= #
182
+ def try_to_require_fileutils
183
+ require 'fileutils' unless Object.const_defined?(:FileUtils)
184
+ end
185
+
95
186
  # ========================================================================= #
96
187
  # === sfile
97
188
  # ========================================================================= #
@@ -117,62 +208,282 @@ class Base # === Extracter::Base
117
208
  end
118
209
 
119
210
  # ========================================================================= #
120
- # === use_colours?
211
+ # === e (e tag)
212
+ # ========================================================================= #
213
+ def e(i = '')
214
+ puts i
215
+ end
216
+
217
+ # ========================================================================= #
218
+ # === rev (rev tag)
219
+ # ========================================================================= #
220
+ def rev
221
+ if use_colours?
222
+ ::Colours.rev
223
+ else
224
+ ''
225
+ end
226
+ end
227
+
228
+ # ========================================================================= #
229
+ # === are_we_on_windows?
230
+ # ========================================================================= #
231
+ def are_we_on_windows?
232
+ ::Extracter.are_we_on_windows?
233
+ end
234
+
235
+ # ========================================================================= #
236
+ # === be_verbose?
121
237
  #
122
- # Determine whether we will use colours in class Extracter.
238
+ # Getter method for whether we will be verbose or not.
123
239
  # ========================================================================= #
124
- def use_colours?
125
- @internal_hash[:use_colours]
126
- end; alias colours? use_colours? # === colours?
240
+ def be_verbose?
241
+ @internal_hash[:be_verbose]
242
+ end
127
243
 
128
244
  # ========================================================================= #
129
- # === e (e tag)
245
+ # === register_sigint
130
246
  # ========================================================================= #
131
- def e(i = '')
132
- puts i
247
+ def register_sigint(this_class_name = 'Extracter')
248
+ Signal.trap('SIGINT') {
249
+ e sfancy('Requesting a graceful exit from ')+
250
+ colour_to_use_for_directories?+
251
+ 'class '+this_class_name+sfancy('. Exiting now.')
252
+ exit
253
+ }
133
254
  end
134
255
 
135
256
  # ========================================================================= #
136
- # === cpr
257
+ # === colour_to_use_for_directories?
137
258
  # ========================================================================= #
138
- def cpr(a, b)
139
- require 'fileutils' unless Object.const_defined?(:FileUtils)
140
- FileUtils.cp_r(a, b)
259
+ def colour_to_use_for_directories?
260
+ if use_colours?
261
+ return @internal_hash[:colour_to_use_for_directories]
262
+ else
263
+ return ''
264
+ end
141
265
  end
142
266
 
143
267
  # ========================================================================= #
144
- # === move
268
+ # === disable_colours
269
+ #
270
+ # Use this method if you want to disable colour-support of this class.
145
271
  # ========================================================================= #
146
- def move(a, b)
147
- require 'fileutils' unless Object.const_defined?(:FileUtils)
148
- FileUtils.mv(a, b)
149
- end; alias mv move # === mv
272
+ def disable_colours
273
+ set_use_colours(false)
274
+ @internal_hash[:colour_to_use_for_directories] = ''.dup
275
+ end
150
276
 
151
277
  # ========================================================================= #
152
- # === remove_this_directory
278
+ # === create_directory (mkdir tag)
279
+ #
280
+ # Use this to create directories.
153
281
  # ========================================================================= #
154
- def remove_this_directory(i)
155
- if File.directory? i
156
- FileUtils.rm_r(i) unless i == '/'
282
+ def create_directory(i)
283
+ FileUtils.mkdir_p(i) unless File.directory?(i)
284
+ end; alias mkdir create_directory # === mkdir
285
+
286
+ # ========================================================================= #
287
+ # === be_verbose
288
+ # ========================================================================= #
289
+ def be_verbose
290
+ set_be_verbose(true)
291
+ end
292
+
293
+ # ========================================================================= #
294
+ # === do_be_quiet
295
+ # ========================================================================= #
296
+ def do_be_quiet
297
+ set_be_verbose(false)
298
+ end; alias be_silent do_be_quiet # === be_silent
299
+ alias be_quiet do_be_quiet # === be_quiet
300
+
301
+ # ========================================================================= #
302
+ # === rds
303
+ # ========================================================================= #
304
+ def rds(i)
305
+ return i.squeeze('/') if i.respond_to? :squeeze
306
+ return i
307
+ end
308
+
309
+ # ========================================================================= #
310
+ # === set_be_verbose
311
+ #
312
+ # This sets the verbosity level of the class. Use only this method
313
+ # when you wish to modify the @be_verbose instance variable.
314
+ # ========================================================================= #
315
+ def set_be_verbose(i = false)
316
+ @internal_hash[:be_verbose] = i
317
+ end; alias set_verbosity set_be_verbose # === set_verbosity
318
+ alias show_commands_used set_be_verbose # === show_commands_used
319
+
320
+ # ========================================================================= #
321
+ # === remove_file_extension
322
+ # ========================================================================= #
323
+ def remove_file_extension(i)
324
+ _ = File.basename(i)
325
+ return ::Extracter.remove_archive_type(_)
326
+ end; alias remove_extension remove_file_extension # === remove_extensions
327
+ alias remove_ext remove_file_extension # === remove_ext
328
+
329
+ # ========================================================================= #
330
+ # === set_commandline_arguments
331
+ # ========================================================================= #
332
+ def set_commandline_arguments(i = '')
333
+ i = [i].flatten.compact
334
+ @commandline_arguments = i
335
+ end
336
+
337
+ # ========================================================================= #
338
+ # === commandline_arguments?
339
+ # ========================================================================= #
340
+ def commandline_arguments?
341
+ @commandline_arguments
342
+ end
343
+
344
+ # ========================================================================= #
345
+ # === first_argument?
346
+ # ========================================================================= #
347
+ def first_argument?
348
+ @commandline_arguments.first
349
+ end; alias first? first_argument? # === first?
350
+
351
+ # ========================================================================= #
352
+ # === return_pwd
353
+ # ========================================================================= #
354
+ def return_pwd
355
+ "#{Dir.pwd}/".squeeze('/')
356
+ end
357
+
358
+ # ========================================================================= #
359
+ # === debug?
360
+ # ========================================================================= #
361
+ def debug?
362
+ @internal_hash[:debug]
363
+ end
364
+
365
+ # ========================================================================= #
366
+ # === enable_debug
367
+ # ========================================================================= #
368
+ def enable_debug
369
+ @internal_hash[:debug] = true
370
+ end
371
+
372
+ # ========================================================================= #
373
+ # === namespace?
374
+ # ========================================================================= #
375
+ def namespace?
376
+ @internal_hash[:namespace]
377
+ end
378
+
379
+ # ========================================================================= #
380
+ # === enable_colours
381
+ # ========================================================================= #
382
+ def enable_colours
383
+ set_use_colours(true)
384
+ @internal_hash[:colour_to_use_for_directories] = cyan?
385
+ end
386
+
387
+ # ========================================================================= #
388
+ # === set_use_colours
389
+ # ========================================================================= #
390
+ def set_use_colours(i, main_hash = main_hash?)
391
+ # ======================================================================= #
392
+ # We must also sync this towards our main Hash, for opn(). The next
393
+ # line of code achieves precisely that.
394
+ # ======================================================================= #
395
+ main_hash.update(use_colours: i) if main_hash
396
+ @internal_hash[:try_to_use_colours] = i
397
+ end
398
+
399
+ # ========================================================================= #
400
+ # === do_try_to_use_colours
401
+ # ========================================================================= #
402
+ def do_try_to_use_colours
403
+ set_use_colours(true)
404
+ end
405
+
406
+ # ========================================================================= #
407
+ # === try_to_use_colours?
408
+ #
409
+ # Determine whether we will use colours for class Extracter::Base
410
+ # and its subclass.
411
+ # ========================================================================= #
412
+ def try_to_use_colours?
413
+ @internal_hash[:try_to_use_colours]
414
+ end; alias use_colours? try_to_use_colours? # === use_colours?
415
+ alias colours? try_to_use_colours? # === colours?
416
+
417
+ # ========================================================================= #
418
+ # === set_use_opn
419
+ # ========================================================================= #
420
+ def set_use_opn(i = true)
421
+ @internal_hash[:use_opn] = i
422
+ end
423
+
424
+ # ========================================================================= #
425
+ # === use_opn?
426
+ # ========================================================================= #
427
+ def use_opn?
428
+ @internal_hash[:use_opn]
429
+ end
430
+
431
+ # ========================================================================= #
432
+ # === opne
433
+ # ========================================================================= #
434
+ def opne(i = '')
435
+ opnn; e i
436
+ end
437
+
438
+ # ========================================================================= #
439
+ # === use_this_opn_hash?
440
+ # ========================================================================= #
441
+ def use_this_opn_hash?
442
+ @internal_hash[:use_this_opn_hash]
443
+ end; alias main_hash? use_this_opn_hash? # === main_hash?
444
+
445
+ # ========================================================================= #
446
+ # === opnn
447
+ #
448
+ # This variant will also check whether we should show the name or not.
449
+ # ========================================================================= #
450
+ def opnn(
451
+ use_this_hash = use_this_opn_hash?
452
+ )
453
+ if use_opn? and Object.const_defined?(:Opn)
454
+ Opn.opn(use_this_hash)
157
455
  end
456
+ end; alias opn opnn # === opn
457
+ alias copn opnn # === copn
458
+
459
+ # ========================================================================= #
460
+ # === is_archive?
461
+ #
462
+ # This method queries whether the given file at hand (as input to
463
+ # this method) is assumed to be an archive or whether it is not.
464
+ # ========================================================================= #
465
+ def is_archive?(i)
466
+ ARRAY_ARCHIVE_TYPES.include?(
467
+ File.extname(File.basename(i))
468
+ )
158
469
  end
159
470
 
160
471
  # ========================================================================= #
161
- # === change_directory
472
+ # === array_archive_types?
162
473
  # ========================================================================= #
163
- def change_directory(i)
164
- Dir.chdir(i)
165
- end; alias cd change_directory # === cd
474
+ def array_archive_types?
475
+ ARRAY_REGISTERED_ARCHIVES
476
+ end
166
477
 
167
478
  # ========================================================================= #
168
- # === rev
479
+ # === orev
169
480
  # ========================================================================= #
170
- def rev
171
- ::Colours.rev
481
+ def orev(i = '')
482
+ opne "#{rev}#{i}"
172
483
  end
173
484
 
174
485
  end; end
175
486
 
176
487
  if __FILE__ == $PROGRAM_NAME
177
488
  Extracter::Extracter.new(ARGV)
178
- end # base.rb
489
+ end # base.rb