libis-format 1.3.4 → 2.0.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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +2 -0
  3. data/.gitignore +20 -0
  4. data/.travis.yml +70 -0
  5. data/Gemfile +0 -12
  6. data/README.md +2 -2
  7. data/Rakefile +8 -0
  8. data/base/Dockerfile +35 -0
  9. data/base/Dockerfile.alpine +20 -0
  10. data/base/Dockerfile.rvm +56 -0
  11. data/base/rework_path +20 -0
  12. data/bin/{pdf_tool → pdf_copy} +2 -3
  13. data/data/PDFA_def.ps +3 -3
  14. data/data/eciRGB_v2.icc +0 -0
  15. data/data/types.yml +4 -17
  16. data/docker_cfg.yml +1 -0
  17. data/lib/libis/format/cli/convert.rb +4 -4
  18. data/lib/libis/format/cli/prompt_helper.rb +24 -32
  19. data/lib/libis/format/command_line.rb +3 -2
  20. data/lib/libis/format/config.rb +23 -19
  21. data/lib/libis/format/converter/audio_converter.rb +31 -56
  22. data/lib/libis/format/converter/base.rb +36 -16
  23. data/lib/libis/format/converter/chain.rb +32 -52
  24. data/lib/libis/format/converter/fop_pdf_converter.rb +8 -4
  25. data/lib/libis/format/converter/image_assembler.rb +82 -0
  26. data/lib/libis/format/converter/image_converter.rb +45 -250
  27. data/lib/libis/format/converter/image_splitter.rb +80 -0
  28. data/lib/libis/format/converter/image_watermarker.rb +261 -0
  29. data/lib/libis/format/converter/jp2_converter.rb +38 -36
  30. data/lib/libis/format/converter/office_converter.rb +28 -22
  31. data/lib/libis/format/converter/pdf_assembler.rb +66 -0
  32. data/lib/libis/format/converter/pdf_converter.rb +52 -200
  33. data/lib/libis/format/converter/pdf_optimizer.rb +70 -0
  34. data/lib/libis/format/converter/pdf_splitter.rb +65 -0
  35. data/lib/libis/format/converter/pdf_watermarker.rb +110 -0
  36. data/lib/libis/format/converter/repository.rb +13 -7
  37. data/lib/libis/format/converter/spreadsheet_converter.rb +16 -10
  38. data/lib/libis/format/converter/video_converter.rb +58 -47
  39. data/lib/libis/format/converter/xslt_converter.rb +11 -13
  40. data/lib/libis/format/converter.rb +1 -1
  41. data/lib/libis/format/identifier.rb +46 -44
  42. data/lib/libis/format/info.rb +27 -0
  43. data/lib/libis/format/library.rb +147 -0
  44. data/lib/libis/format/tool/droid.rb +30 -29
  45. data/lib/libis/format/tool/extension_identification.rb +26 -24
  46. data/lib/libis/format/tool/{ff_mpeg.rb → ffmpeg.rb} +10 -17
  47. data/lib/libis/format/tool/fido.rb +27 -22
  48. data/lib/libis/format/tool/file_tool.rb +24 -11
  49. data/lib/libis/format/tool/fop_pdf.rb +14 -25
  50. data/lib/libis/format/tool/identification_tool.rb +40 -38
  51. data/lib/libis/format/tool/office_to_pdf.rb +18 -30
  52. data/lib/libis/format/tool/pdf_copy.rb +47 -0
  53. data/lib/libis/format/tool/pdf_merge.rb +19 -25
  54. data/lib/libis/format/tool/pdf_optimizer.rb +19 -22
  55. data/lib/libis/format/tool/pdf_split.rb +33 -6
  56. data/lib/libis/format/tool/pdf_to_pdfa.rb +31 -45
  57. data/lib/libis/format/tool/pdfa_validator.rb +30 -24
  58. data/lib/libis/format/tool/spreadsheet_to_ods.rb +18 -29
  59. data/lib/libis/format/tool.rb +3 -4
  60. data/lib/libis/format/version.rb +1 -3
  61. data/lib/libis/format/yaml_loader.rb +71 -0
  62. data/lib/libis/format.rb +7 -5
  63. data/lib/libis-format.rb +0 -2
  64. data/libis-format.gemspec +18 -24
  65. data/tools/PdfTool.jar +0 -0
  66. data/tools/pdfbox/pdfbox-app-2.0.13.jar +0 -0
  67. data/tools/pdfbox/{preflight-app-3.0.3.jar → preflight-app-2.0.13.jar} +0 -0
  68. metadata +86 -128
  69. data/data/AdobeRGB1998.icc +0 -0
  70. data/lib/libis/format/converter/email_converter.rb +0 -35
  71. data/lib/libis/format/tool/msg_to_pdf.rb +0 -270
  72. data/lib/libis/format/tool/pdf_tool.rb +0 -52
  73. data/lib/libis/format/type_database.rb +0 -156
  74. data/lib/libis/format/type_database_impl.rb +0 -153
  75. data/tools/pdf2pdfa +0 -395
  76. data/tools/pdfbox/pdfbox-app-3.0.3.jar +0 -0
  77. /data/bin/{droid_tool → droid} +0 -0
  78. /data/bin/{fido_tool → fido} +0 -0
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'singleton'
4
2
 
5
3
  require 'tempfile'
@@ -7,10 +5,10 @@ require 'csv'
7
5
 
8
6
  require 'libis/format/config'
9
7
 
10
- unless CSV::HeaderConverters.key?(:droid_headers)
11
- CSV::HeaderConverters[:droid_headers] = lambda { |h|
12
- h.encode(ConverterEncoding).downcase.strip
13
- .gsub(/\W+/, '').to_sym
8
+ unless CSV::HeaderConverters.has_key?(:droid_headers)
9
+ CSV::HeaderConverters[:droid_headers] = lambda {|h|
10
+ h.encode(ConverterEncoding).downcase.strip.
11
+ gsub(/\W+/, "").to_sym
14
12
  }
15
13
  end
16
14
 
@@ -19,7 +17,9 @@ require_relative 'identification_tool'
19
17
  module Libis
20
18
  module Format
21
19
  module Tool
20
+
22
21
  class Droid < Libis::Format::Tool::IdentificationTool
22
+
23
23
  def run_list(filelist, _options = {})
24
24
  runner(filelist)
25
25
  end
@@ -43,13 +43,12 @@ module Libis
43
43
  end
44
44
 
45
45
  def parse_report(report)
46
- keys = %i[
47
- id parent_id uri filepath filename matchtype status filesize type extension
48
- mod_time ext_mismatch hash format_count puid mimetype format_name format_version
49
- ]
46
+ keys = [
47
+ :id, :parent_id, :uri, :filepath, :filename, :matchtype, :status, :filesize, :type, :extension,
48
+ :mod_time, :ext_mismatch, :hash, :format_count, :puid, :mimetype, :format_name, :format_version]
50
49
  result = CSV.parse(File.readlines(report).join)
51
- .map { |a| Hash[keys.zip(a)] }
52
- .select { |a| a[:type] == 'File' }
50
+ .map {|a| Hash[keys.zip(a)]}
51
+ .select {|a| a[:type] == 'File'}
53
52
  # File.delete report
54
53
  result.each do |r|
55
54
  r.delete(:id)
@@ -71,39 +70,39 @@ module Libis
71
70
 
72
71
  def create_report(profile, report)
73
72
  args = [
74
- '-e', report,
75
- '-p', profile,
76
- '-q'
73
+ '-e', report,
74
+ '-p', profile,
75
+ '-q'
77
76
  ]
78
77
  timeout = Libis::Format::Config[:timeouts][:droid]
79
78
  result = Libis::Tools::Command.run(
80
- Libis::Format::Config[:droid_cmd], *args,
81
- timeout:,
82
- kill_after: timeout * 2
79
+ Libis::Format::Config[:droid_cmd], *args,
80
+ timeout: timeout,
81
+ kill_after: timeout * 2
83
82
  )
84
- result[:err].select! { |x| x =~ /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} ERROR / }
85
- raise "#{self.class} report took too long (> #{timeout} seconds) to complete" if result[:timeout]
86
- raise "#{self.class} report errors: #{result[:err].join("\n")}" unless result[:err].empty?
83
+ result[:err].select! {|x| x =~ /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} ERROR /}
84
+ raise RuntimeError, "#{self.class} report took too long (> #{timeout} seconds) to complete" if result[:timeout]
85
+ raise RuntimeError, "#{self.class} report errors: #{result[:err].join("\n")}" unless result[:err].empty?
87
86
 
88
87
  File.delete profile
89
88
  end
90
89
 
91
90
  def create_profile(file_or_list, profile, recursive = false)
92
91
  args = []
93
- files = file_or_list.is_a?(Array) ? file_or_list.map(&:escape_for_string) : [file_or_list.escape_for_string]
94
- files.each { |file| args << '-a' << file }
92
+ files = (file_or_list.is_a?(Array)) ? file_or_list.map(&:escape_for_string) : [file_or_list.escape_for_string]
93
+ files.each {|file| args << '-a' << file}
95
94
  args << '-q'
96
95
  args << '-p' << profile
97
96
  args << '-R' if recursive
98
97
  timeout = Libis::Format::Config[:timeouts][:droid]
99
98
  result = Libis::Tools::Command.run(
100
- Libis::Format::Config[:droid_cmd], *args,
101
- timeout:,
102
- kill_after: timeout * 2
99
+ Libis::Format::Config[:droid_cmd], *args,
100
+ timeout: timeout,
101
+ kill_after: timeout * 2
103
102
  )
104
- result[:err].select! { |x| x =~ /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} ERROR / }
105
- raise "#{self.class} profile took too long (> #{timeout} seconds) to complete" if result[:timeout]
106
- raise "#{self.class} profile errors: #{result[:err].join("\n")}" unless result[:err].empty?
103
+ result[:err].select! {|x| x =~ /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} ERROR /}
104
+ raise RuntimeError, "#{self.class} profile took too long (> #{timeout} seconds) to complete" if result[:timeout]
105
+ raise RuntimeError, "#{self.class} profile errors: #{result[:err].join("\n")}" unless result[:err].empty?
107
106
  end
108
107
 
109
108
  def profile_file_name
@@ -113,7 +112,9 @@ module Libis
113
112
  def result_file_name
114
113
  Tools::TempFile.name('droid', '.csv')
115
114
  end
115
+
116
116
  end
117
+
117
118
  end
118
119
  end
119
120
  end
@@ -1,56 +1,58 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'identification_tool'
4
2
 
5
3
  module Libis
6
4
  module Format
7
5
  module Tool
6
+
8
7
  class ExtensionIdentification < Libis::Format::Tool::IdentificationTool
9
- def run_list(filelist, **_options)
8
+
9
+ def run_list(filelist, _options = {})
10
+
10
11
  output = runner(nil, filelist)
11
12
 
12
13
  process_output(output)
14
+
13
15
  end
14
16
 
15
- def run_dir(dir, recursive = true, **_options)
17
+ def run_dir(dir, recursive = true, _options = {})
18
+
16
19
  filelist = find_files(dir, recursive)
17
20
 
18
21
  output = runner(nil, filelist)
19
22
 
20
23
  process_output(output)
24
+
21
25
  end
22
26
 
23
- def run(file, **_options)
27
+ def run(file, _options)
28
+
24
29
  output = runner(file)
25
30
 
26
31
  process_output(output)
32
+
27
33
  end
28
34
 
29
35
  protected
30
36
 
31
37
  def runner(*args)
38
+
32
39
  args.map do |file|
33
- info = ::Libis::Format::TypeDatabase.ext_infos(File.extname(file)).first
34
- next unless info
35
-
36
- {
37
- filepath: file,
38
- mimetype: begin
39
- info[:MIME].first
40
- rescue StandardError
41
- nil
42
- end,
43
- puid: begin
44
- info[:PUID].first
45
- rescue StandardError
46
- nil
47
- end,
48
- matchtype: 'extension',
49
- tool: :type_database
50
- }
40
+ info = ::Libis::Format::Library.get_info_by(:extension, File.extname(file))
41
+ if info
42
+ {
43
+ filepath: file,
44
+ mimetype: (info[:mimetypes].first rescue nil),
45
+ puid: (info[:puids].first rescue nil),
46
+ matchtype: 'extension',
47
+ tool: :format_library
48
+ }
49
+ end
51
50
  end.cleanup
51
+
52
52
  end
53
+
53
54
  end
55
+
54
56
  end
55
57
  end
56
- end
58
+ end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'libis/tools/extend/string'
4
2
  require 'libis/tools/extend/empty'
5
3
  require 'libis/tools/command'
@@ -10,17 +8,13 @@ require 'libis/format/config'
10
8
  module Libis
11
9
  module Format
12
10
  module Tool
11
+
13
12
  class FFMpeg
14
13
  include Singleton
15
14
  include ::Libis::Tools::Logger
16
15
 
17
- def self.installed?
18
- result = Libis::Tools::Command.run(Libis::Format::Config[:ffmpeg_cmd], '-h')
19
- (result[:status]).zero?
20
- end
21
-
22
16
  def self.run(source, target, options = {})
23
- instance.run source, target, options
17
+ self.instance.run source, target, options
24
18
  end
25
19
 
26
20
  def run(source, target, options = {})
@@ -34,22 +28,21 @@ module Libis
34
28
 
35
29
  timeout = Libis::Format::Config[:timeouts][:ffmpeg]
36
30
  result = Libis::Tools::Command.run(
37
- Libis::Format::Config[:ffmpeg_cmd], *opts,
38
- timeout:,
39
- kill_after: timeout * 2
31
+ Libis::Format::Config[:ffmpeg_cmd], *opts,
32
+ timeout: timeout,
33
+ kill_after: timeout * 2
40
34
  )
41
35
 
42
- raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
43
- raise "#{self.class} errors: #{result[:err].join("\n")}" unless (result[:status]).zero?
36
+ raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
37
+ raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0
44
38
 
45
39
  warn "FFMpeg warnings: #{(result[:err] + result[:out]).join("\n")}" unless result[:err].empty?
46
40
 
47
- {
48
- command: result,
49
- files: [target]
50
- }
41
+ result[:out]
51
42
  end
43
+
52
44
  end
45
+
53
46
  end
54
47
  end
55
48
  end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'libis/tools/extend/string'
4
2
  require 'libis/tools/command'
5
3
 
@@ -11,33 +9,36 @@ require_relative 'identification_tool'
11
9
  module Libis
12
10
  module Format
13
11
  module Tool
12
+
14
13
  class Fido < Libis::Format::Tool::IdentificationTool
14
+
15
15
  def self.add_formats(formats_file)
16
- instance.formats << formats_file unless instance.formats.include?(formats_file)
16
+ self.instance.formats << formats_file unless self.instance.formats.include?(formats_file)
17
17
  end
18
18
 
19
19
  def self.del_formats(formats_file)
20
- instance.formats.delete(formats_file)
20
+ self.instance.formats.delete(formats_file)
21
21
  end
22
22
 
23
23
  attr_reader :formats
24
24
 
25
- def run_list(filelist, **options)
25
+ def run_list(filelist, options = {})
26
26
  create_list_file(filelist) do |list_file|
27
- output = runner(nil, '-input', list_file.escape_for_string, **options)
27
+ output = runner(nil, '-input', list_file.escape_for_string, options)
28
28
  process_output(output)
29
29
  end
30
30
  end
31
31
 
32
- def run_dir(dir, recursive = true, **options)
32
+ def run_dir(dir, recursive = true, options = {})
33
33
  args = []
34
34
  args << '-recurse' if recursive
35
- output = runner(dir, *args, **options)
35
+ args << options
36
+ output = runner(dir, *args)
36
37
  process_output(output)
37
38
  end
38
39
 
39
- def run(file, **options)
40
- output = runner(file, **options)
40
+ def run(file, options = {})
41
+ output = runner(file, options)
41
42
  process_output(output)
42
43
  end
43
44
 
@@ -52,9 +53,11 @@ module Libis
52
53
 
53
54
  attr_writer :formats
54
55
 
55
- def runner(filename, *args, **options)
56
- # Load custom format definitions if present
57
- args << '-loadformats' << formats.join(',').to_s unless formats.empty?
56
+ def runner(filename, *args)
57
+ options = {}
58
+ options = args.pop if args.last.is_a?(Hash)
59
+ # Load custome format definitions if present
60
+ args << '-loadformats' << "#{formats.join(',')}" unless formats.empty?
58
61
 
59
62
  # Workaround for Fido performance bug
60
63
  args << '-bufsize' << (options[:bufsize] || 1000).to_s
@@ -65,7 +68,7 @@ module Libis
65
68
  args << '-nocontainer' if options[:nocontainer]
66
69
 
67
70
  # Add filename to argument list (optional)
68
- args << filename.escape_for_string.to_s if filename
71
+ args << "#{filename.escape_for_string}" if filename
69
72
 
70
73
  # No header output
71
74
  args << '-q'
@@ -73,20 +76,20 @@ module Libis
73
76
  # Run command and capture results
74
77
  timeout = Libis::Format::Config[:timeouts][:fido]
75
78
  result = ::Libis::Tools::Command.run(
76
- Libis::Format::Config[:fido_cmd], *args,
77
- timeout:,
78
- kill_after: timeout * 2
79
+ Libis::Format::Config[:fido_cmd], *args,
80
+ timeout: timeout,
81
+ kill_after: timeout * 2
79
82
  )
80
83
 
81
84
  # Log warning if needed
82
- raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
83
- raise "#{self.class} errors: #{result[:err].join("\n")}" unless (result[:status])&.zero? && result[:err].empty?
85
+ raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
86
+ raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?
84
87
 
85
88
  # Parse output (CSV) text into array and return result
86
- keys = %i[status time puid format_name format_version filesize filepath mimetype matchtype]
89
+ keys = [:status, :time, :puid, :format_name, :format_version, :filesize, :filepath, :mimetype, :matchtype]
87
90
  data = CSV.parse(result[:out].join("\n"))
88
- .map { |a| Hash[keys.zip(a)] }
89
- .select { |a| a[:status] == 'OK' }
91
+ .map {|a| Hash[keys.zip(a)]}
92
+ .select {|a| a[:status] == 'OK'}
90
93
  data.each do |r|
91
94
  r.delete(:time)
92
95
  r.delete(:status)
@@ -94,7 +97,9 @@ module Libis
94
97
  r[:tool] = :fido
95
98
  end
96
99
  end
100
+
97
101
  end
102
+
98
103
  end
99
104
  end
100
105
  end
@@ -1,38 +1,49 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'identification_tool'
4
2
 
5
3
  module Libis
6
4
  module Format
7
5
  module Tool
6
+
8
7
  class FileTool < Libis::Format::Tool::IdentificationTool
9
- def run_list(filelist, **_options)
8
+
9
+ def run_list(filelist, _options = {})
10
+
10
11
  create_list_file(filelist) do |list_file|
12
+
11
13
  output = runner(nil, '--files-from', list_file)
12
14
 
13
15
  process_output(output)
16
+
14
17
  end
18
+
15
19
  end
16
20
 
17
- def run_dir(dir, recursive = true, **_options)
21
+ def run_dir(dir, recursive = true, _options = {})
22
+
18
23
  filelist = find_files(dir, recursive)
19
24
 
20
25
  create_list_file(filelist) do |list_file|
26
+
21
27
  output = runner(nil, '--files-from', list_file)
22
28
 
23
29
  process_output(output)
30
+
24
31
  end
32
+
25
33
  end
26
34
 
27
- def run(file, **_options)
35
+ def run(file, _options = {})
36
+
28
37
  output = runner(file)
29
38
 
30
39
  process_output(output)
40
+
31
41
  end
32
42
 
33
43
  protected
34
44
 
35
45
  def runner(filename, *args)
46
+
36
47
  # Create new argument list
37
48
  opts = []
38
49
 
@@ -50,21 +61,23 @@ module Libis
50
61
  # Run the UNIX file command and capture the results
51
62
  timeout = Libis::Format::Config[:timeouts][:file_tool]
52
63
  result = ::Libis::Tools::Command.run(
53
- 'file', *opts,
54
- timeout:,
55
- kill_after: timeout * 2
64
+ 'file', *opts,
65
+ timeout: timeout,
66
+ kill_after: timeout * 2
56
67
  )
57
68
 
58
- raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
59
- raise "#{self.class} errors: #{result[:err].join("\n")}" unless (result[:status]).zero? && result[:err].empty?
69
+ raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
70
+ raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?
60
71
 
61
72
  # Parse output text into array and return result
62
73
  result[:out].map do |line|
63
74
  r = line.split(/:\s+/)
64
- { filepath: r[0], mimetype: r[1], matchtype: 'magic', tool: :file }
75
+ {filepath: r[0], mimetype: r[1], matchtype: 'magic', tool: :file}
65
76
  end
66
77
  end
78
+
67
79
  end
80
+
68
81
  end
69
82
  end
70
83
  end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'os'
4
2
 
5
3
  require 'libis/tools/extend/string'
@@ -11,46 +9,37 @@ require 'libis/format/config'
11
9
  module Libis
12
10
  module Format
13
11
  module Tool
12
+
14
13
  class FopPdf
15
14
  include ::Libis::Tools::Logger
16
15
 
17
- def self.installed?
18
- result = Libis::Tools::Command.run(Libis::Format::Config[:java_cmd], '-version')
19
- return false unless (result[:status]).zero?
20
-
21
- File.exist?(Libis::Format::Config[:fop_jar])
16
+ def self.run(xml, target, options = [])
17
+ self.new.run xml, target, options
22
18
  end
23
19
 
24
- def self.run(xml, target)
25
- new.run xml, target
26
- end
20
+ def run(xml, target, options = [])
27
21
 
28
- def run(xml, target)
29
22
  if OS.java?
30
23
  # TODO: import library and execute in current VM. For now do exactly as in MRI.
31
24
  end
32
25
 
33
26
  timeout = Libis::Format::Config[:timeouts][:fop]
34
27
  result = Libis::Tools::Command.run(
35
- Libis::Format::Config[:java_cmd],
36
- "-Dfop.home=#{File.dirname(Libis::Format::Config[:fop_jar])}",
37
- '-Djava.awt.headless=true',
38
- '-jar', Libis::Format::Config[:fop_jar],
39
- '-fo', xml,
40
- '-pdf', target,
41
- timeout:,
42
- kill_after: timeout * 2
28
+ Libis::Format::Config[:java_cmd],
29
+ "-Dfop.home=#{File.dirname(Libis::Format::Config[:fop_jar])}",
30
+ '-jar', Libis::Format::Config[:fop_jar],
31
+ '-fo', xml,
32
+ '-pdf', target,
33
+ timeout: timeout,
34
+ kill_after: timeout * 2
43
35
  )
44
36
 
45
- raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
46
- raise "#{self.class} errors: #{result[:err].join("\n")}" unless (result[:status]).zero?
37
+ raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
38
+ raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0
47
39
 
48
- {
49
- command: result,
50
- files: [target]
51
- }
52
40
  end
53
41
  end
42
+
54
43
  end
55
44
  end
56
45
  end