ehbrs-tools 0.3.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 (158) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +13 -0
  3. data/exe/ehbrs +6 -0
  4. data/lib/ehbrs.rb +7 -0
  5. data/lib/ehbrs/executables.rb +28 -0
  6. data/lib/ehbrs/tools.rb +9 -0
  7. data/lib/ehbrs/tools/runner.rb +35 -0
  8. data/lib/ehbrs/tools/runner/vg.rb +26 -0
  9. data/lib/ehbrs/tools/runner/vg/ips.rb +90 -0
  10. data/lib/ehbrs/tools/runner/videos.rb +25 -0
  11. data/lib/ehbrs/tools/runner/videos/unsupported.rb +65 -0
  12. data/lib/ehbrs/tools/version.rb +7 -0
  13. data/lib/ehbrs/videos.rb +9 -0
  14. data/lib/ehbrs/videos/convert_job.rb +99 -0
  15. data/lib/ehbrs/videos/file.rb +70 -0
  16. data/lib/ehbrs/videos/profiles/base.rb +35 -0
  17. data/lib/ehbrs/videos/profiles/same_quality.rb +21 -0
  18. data/lib/ehbrs/videos/track.rb +27 -0
  19. data/lib/ehbrs/videos/unsupported/check_result.rb +24 -0
  20. data/lib/ehbrs/videos/unsupported/check_set.rb +43 -0
  21. data/lib/ehbrs/videos/unsupported/check_support.rb +68 -0
  22. data/lib/ehbrs/videos/unsupported/checks.rb +13 -0
  23. data/lib/ehbrs/videos/unsupported/checks/codec_extra_unlisted.rb +27 -0
  24. data/lib/ehbrs/videos/unsupported/checks/codec_extra_unsupported.rb +26 -0
  25. data/lib/ehbrs/videos/unsupported/checks/codec_unlisted.rb +23 -0
  26. data/lib/ehbrs/videos/unsupported/checks/codec_unsupported.rb +25 -0
  27. data/lib/ehbrs/videos/unsupported/checks/invalid_extension.rb +25 -0
  28. data/lib/ehbrs/videos/unsupported/file.rb +50 -0
  29. data/lib/ehbrs/videos/unsupported/file/fix.rb +45 -0
  30. data/lib/ehbrs/videos/unsupported/fix_profile.rb +56 -0
  31. data/lib/ehbrs/videos/unsupported/fixes/supported_codec.rb +36 -0
  32. data/lib/ehbrs/videos/unsupported/fixes/supported_container.rb +17 -0
  33. data/lib/ehbrs/videos/unsupported/profiles.rb +13 -0
  34. data/lib/ehbrs/videos/unsupported/profiles/base.rb +102 -0
  35. data/lib/ehbrs/videos/unsupported/profiles/philco.rb +27 -0
  36. data/lib/ehbrs/videos/unsupported/profiles/samsung.rb +32 -0
  37. data/lib/ehbrs/videos/unsupported/search.rb +72 -0
  38. data/lib/ehbrs/videos/unsupported/track.rb +32 -0
  39. data/vendor/eac_cli/Gemfile +5 -0
  40. data/vendor/eac_cli/eac_cli.gemspec +18 -0
  41. data/vendor/eac_cli/lib/eac_cli.rb +7 -0
  42. data/vendor/eac_cli/lib/eac_cli/default_runner.rb +22 -0
  43. data/vendor/eac_cli/lib/eac_cli/runner.rb +30 -0
  44. data/vendor/eac_cli/lib/eac_cli/runner/argument_option.rb +13 -0
  45. data/vendor/eac_cli/lib/eac_cli/runner/base_option.rb +22 -0
  46. data/vendor/eac_cli/lib/eac_cli/runner/boolean_option.rb +13 -0
  47. data/vendor/eac_cli/lib/eac_cli/runner/definition.rb +60 -0
  48. data/vendor/eac_cli/lib/eac_cli/runner/docopt_doc.rb +65 -0
  49. data/vendor/eac_cli/lib/eac_cli/runner/positional_argument.rb +15 -0
  50. data/vendor/eac_cli/lib/eac_cli/version.rb +5 -0
  51. data/vendor/eac_cli/spec/rubocop_spec.rb +7 -0
  52. data/vendor/eac_cli/spec/spec_helper.rb +100 -0
  53. data/vendor/eac_ruby_utils/Gemfile +16 -0
  54. data/vendor/eac_ruby_utils/MIT-LICENCE +16 -0
  55. data/vendor/eac_ruby_utils/README.rdoc +3 -0
  56. data/vendor/eac_ruby_utils/eac_ruby_utils.gemspec +25 -0
  57. data/vendor/eac_ruby_utils/lib/eac_ruby_utils.rb +23 -0
  58. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/arguments_consumer.rb +81 -0
  59. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/common_constructor.rb +133 -0
  60. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/configs.rb +82 -0
  61. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/configs/file.rb +66 -0
  62. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console.rb +5 -0
  63. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/configs.rb +135 -0
  64. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/docopt_runner.rb +39 -0
  65. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/docopt_runner/_class_methods.rb +18 -0
  66. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/docopt_runner/_doc.rb +25 -0
  67. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/docopt_runner/_settings.rb +19 -0
  68. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/docopt_runner/_subcommands.rb +139 -0
  69. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/speaker.rb +134 -0
  70. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/speaker/_class_methods.rb +39 -0
  71. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/speaker/list.rb +63 -0
  72. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/console/speaker/node.rb +25 -0
  73. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/contextualizable.rb +16 -0
  74. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/core_ext.rb +5 -0
  75. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs.rb +23 -0
  76. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/base_env.rb +28 -0
  77. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/command.rb +155 -0
  78. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/command/extra_options.rb +46 -0
  79. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/executable.rb +51 -0
  80. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/file.rb +22 -0
  81. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/local_env.rb +17 -0
  82. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/process.rb +19 -0
  83. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/ssh_env.rb +72 -0
  84. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/filesystem_cache.rb +53 -0
  85. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/filesystem_traverser.rb +56 -0
  86. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/fs_cache.rb +11 -0
  87. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/listable.rb +17 -0
  88. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/listable/class_methods.rb +14 -0
  89. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/listable/instance_methods.rb +30 -0
  90. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/listable/integer_list.rb +23 -0
  91. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/listable/list.rb +89 -0
  92. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/listable/lists.rb +61 -0
  93. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/listable/string_list.rb +19 -0
  94. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/listable/value.rb +38 -0
  95. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/on_clean_ruby_environment.rb +23 -0
  96. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb +62 -0
  97. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patch.rb +11 -0
  98. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches.rb +4 -0
  99. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/class.rb +4 -0
  100. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/class/common_constructor.rb +9 -0
  101. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/hash.rb +5 -0
  102. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/hash/options_consumer.rb +10 -0
  103. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/hash/sym_keys_hash.rb +10 -0
  104. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/module.rb +4 -0
  105. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/module/console_speaker.rb +10 -0
  106. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/module/listable.rb +10 -0
  107. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/module/patch.rb +9 -0
  108. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/module/require_sub.rb +9 -0
  109. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/module/simple_cache.rb +10 -0
  110. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/object.rb +5 -0
  111. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/object/asserts.rb +14 -0
  112. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/object/if_present.rb +12 -0
  113. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/object/template.rb +16 -0
  114. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/paths_hash.rb +95 -0
  115. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/require_sub.rb +11 -0
  116. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/rspec.rb +9 -0
  117. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/rspec/conditional.rb +38 -0
  118. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/rspec/stubbed_ssh.rb +44 -0
  119. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/settings_provider.rb +65 -0
  120. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/simple_cache.rb +42 -0
  121. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/templates.rb +9 -0
  122. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/templates/directory.rb +104 -0
  123. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/templates/file.rb +101 -0
  124. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/templates/searcher.rb +55 -0
  125. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/version.rb +5 -0
  126. data/vendor/eac_ruby_utils/lib/eac_ruby_utils/yaml.rb +13 -0
  127. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/arguments_consumer_spec.rb +17 -0
  128. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/common_constructor_spec.rb +36 -0
  129. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/configs_spec.rb +31 -0
  130. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/console/configs_spec.rb +14 -0
  131. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/console/docopt_runner_spec.rb +136 -0
  132. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/console/speaker_spec.rb +36 -0
  133. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/envs/executable_spec.rb +33 -0
  134. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/envs/ssh_env_spec.rb +25 -0
  135. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/filesystem_cache_spec.rb +32 -0
  136. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/listable_spec.rb +180 -0
  137. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/options_consumer_spec.rb +45 -0
  138. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/patches/hash/options_consumer_spec.rb +17 -0
  139. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/patches/hash/sym_keys_hash_spec.rb +13 -0
  140. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/patches/module/console_speaker_spec.rb +13 -0
  141. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/patches/module/listable_spec.rb +13 -0
  142. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/patches/module/simple_cache_spec.rb +13 -0
  143. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/patches/object/if_present_spec.rb +13 -0
  144. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/patches/object/template_spec.rb +23 -0
  145. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/patches/object/template_spec_files/path/my_stub_with_template +1 -0
  146. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/paths_hash_spec.rb +49 -0
  147. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/settings_provider_spec.rb +46 -0
  148. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/simple_cache_spec.rb +102 -0
  149. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/templates/file_spec.rb +34 -0
  150. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/templates/file_spec_files/expected_content +2 -0
  151. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/templates/file_spec_files/source.template +2 -0
  152. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/templates/searcher_spec.rb +30 -0
  153. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/templates/searcher_spec_files/path1/subdir1/file1.template +1 -0
  154. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/templates/searcher_spec_files/path1/subdir1/file2 +1 -0
  155. data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/templates/searcher_spec_files/path2/subdir1/file3.template +1 -0
  156. data/vendor/eac_ruby_utils/spec/locales/pt-BR.yml +38 -0
  157. data/vendor/eac_ruby_utils/spec/spec_helper.rb +12 -0
  158. metadata +227 -0
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/console/speaker/node'
4
+
5
+ module EacRubyUtils
6
+ module Console
7
+ module Speaker
8
+ class << self
9
+ def current_node
10
+ nodes_stack.last
11
+ end
12
+
13
+ def on_node(&block)
14
+ push
15
+ yield(*(block.arity.zero? ? [] : [current_node]))
16
+ ensure
17
+ pop
18
+ end
19
+
20
+ def push
21
+ nodes_stack << ::EacRubyUtils::Console::Speaker::Node.new
22
+ current_node
23
+ end
24
+
25
+ def pop
26
+ return nodes_stack.pop if nodes_stack.count > 1
27
+
28
+ raise "Cannot remove first node (nodes_stack.count: #{nodes_stack.count})"
29
+ end
30
+
31
+ private
32
+
33
+ def nodes_stack
34
+ @nodes_stack ||= [::EacRubyUtils::Console::Speaker::Node.new]
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/hash_with_indifferent_access'
4
+ require 'ostruct'
5
+
6
+ module EacRubyUtils
7
+ module Console
8
+ module Speaker
9
+ class List
10
+ class << self
11
+ def build(list)
12
+ return List.new(hash_to_values(list)) if list.is_a?(::Hash)
13
+ return List.new(array_to_values(list)) if list.is_a?(::Array)
14
+
15
+ raise "Invalid list: #{list} (#{list.class})"
16
+ end
17
+
18
+ private
19
+
20
+ def hash_to_values(list)
21
+ list.map { |key, value| ::OpenStruct.new(key: key, label: key, value: value) }
22
+ end
23
+
24
+ def array_to_values(list)
25
+ list.map { |value| ::OpenStruct.new(key: value, label: value, value: value) }
26
+ end
27
+ end
28
+
29
+ attr_reader :values
30
+
31
+ def initialize(values)
32
+ @values = values.map do |v|
33
+ ::OpenStruct.new(key: to_key(v.key), label: to_label(v.label), value: v.value)
34
+ end
35
+ end
36
+
37
+ def valid_labels
38
+ values.map(&:label)
39
+ end
40
+
41
+ def valid_value?(value)
42
+ values.any? { |v| v.key == to_key(value) }
43
+ end
44
+
45
+ def to_key(value)
46
+ to_label(value).downcase
47
+ end
48
+
49
+ def to_label(value)
50
+ value.to_s.strip
51
+ end
52
+
53
+ def build_value(value)
54
+ key = to_key(value)
55
+ values.each do |v|
56
+ return v.value if v.key == key
57
+ end
58
+ raise "Value not found: \"#{value}\" (#{values})"
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/patches/object/if_present'
4
+
5
+ module EacRubyUtils
6
+ module Console
7
+ module Speaker
8
+ class Node
9
+ attr_accessor :stdin, :stdout, :stderr, :stderr_line_prefix
10
+
11
+ def initialize(parent = nil)
12
+ self.stdin = parent.if_present(STDIN, &:stdin)
13
+ self.stdout = parent.if_present(STDOUT, &:stdout)
14
+ self.stderr = parent.if_present(STDERR, &:stderr)
15
+ self.stderr_line_prefix = parent.if_present('', &:stderr_line_prefix)
16
+ end
17
+
18
+ def configure
19
+ yield(self)
20
+ self
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacRubyUtils
4
+ # Provides the method context which search and call a method in self and ancestor objects.
5
+ module Contextualizable
6
+ def context(method)
7
+ current = self
8
+ while current
9
+ return current.send(method) if current.respond_to?(method)
10
+
11
+ current = current.respond_to?(:parent) ? current.parent : nil
12
+ end
13
+ raise "Context method \"#{method}\" not found for #{self.class}"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/patches'
4
+ require 'active_support/dependencies/autoload'
5
+ require 'active_support/core_ext'
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/envs/base_env'
4
+ require 'eac_ruby_utils/envs/command'
5
+ require 'eac_ruby_utils/envs/file'
6
+ require 'eac_ruby_utils/envs/local_env'
7
+ require 'eac_ruby_utils/envs/process'
8
+ require 'eac_ruby_utils/envs/ssh_env'
9
+ require 'eac_ruby_utils/envs/executable'
10
+
11
+ module EacRubyUtils
12
+ module Envs
13
+ class << self
14
+ def local
15
+ @local ||= ::EacRubyUtils::Envs::LocalEnv.new
16
+ end
17
+
18
+ def ssh(user_hostname)
19
+ ::EacRubyUtils::Envs::SshEnv.new(user_hostname)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/envs/command'
4
+ require 'eac_ruby_utils/envs/executable'
5
+ require 'eac_ruby_utils/envs/file'
6
+
7
+ module EacRubyUtils
8
+ module Envs
9
+ class BaseEnv
10
+ def command(*args)
11
+ ::EacRubyUtils::Envs::Command.new(self, args)
12
+ end
13
+
14
+ # <b>DEPRECATED:</b> Please use <tt>file(file).exist?</tt> instead.
15
+ def file_exist?(file)
16
+ self.file(file).exist?
17
+ end
18
+
19
+ def executable(*executable_new_args)
20
+ ::EacRubyUtils::Envs::Executable.new(self, *executable_new_args)
21
+ end
22
+
23
+ def file(path)
24
+ ::EacRubyUtils::Envs::File.new(self, path)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/hash/indifferent_access'
4
+ require 'eac_ruby_utils/console/speaker'
5
+ require 'eac_ruby_utils/envs/command/extra_options'
6
+ require 'eac_ruby_utils/envs/process'
7
+ require 'pp'
8
+ require 'shellwords'
9
+
10
+ module EacRubyUtils
11
+ module Envs
12
+ class Command
13
+ include EacRubyUtils::Console::Speaker
14
+ include EacRubyUtils::Envs::Command::ExtraOptions
15
+
16
+ def initialize(env, command, extra_options = {})
17
+ @env = env
18
+ @extra_options = extra_options.with_indifferent_access
19
+ if command.count == 1 && command.first.is_a?(Array)
20
+ @command = command.first
21
+ elsif command.is_a?(Array)
22
+ @command = command
23
+ else
24
+ raise "Invalid argument command: #{command}|#{command.class}"
25
+ end
26
+ end
27
+
28
+ def args
29
+ @command
30
+ end
31
+
32
+ def append(args)
33
+ duplicate_by_command(@command + args)
34
+ end
35
+
36
+ def prepend(args)
37
+ duplicate_by_command(args + @command)
38
+ end
39
+
40
+ def to_s
41
+ "#{@command} [ENV: #{@env}]"
42
+ end
43
+
44
+ def command(options = {})
45
+ c = @command
46
+ c = c.map { |x| escape(x) }.join(' ') if c.is_a?(Enumerable)
47
+ append_command_options(
48
+ @env.command_line(
49
+ append_chdir(append_pipe(append_envvars(c)))
50
+ ),
51
+ options
52
+ )
53
+ end
54
+
55
+ def execute!(options = {})
56
+ er = ExecuteResult.new(execute(options), options)
57
+ return er.result if er.success?
58
+
59
+ raise "execute! command failed: #{self}\n#{er.r.pretty_inspect}"
60
+ end
61
+
62
+ def execute(options = {})
63
+ c = command(options)
64
+ puts "BEFORE: #{c}".light_red if debug?
65
+ t1 = Time.now
66
+ r = ::EacRubyUtils::Envs::Process.new(c).to_h
67
+ i = Time.now - t1
68
+ puts "AFTER [#{i}]: #{c}".light_red if debug?
69
+ r
70
+ end
71
+
72
+ def system!(options = {})
73
+ return if system(options)
74
+
75
+ raise "system! command failed: #{self}"
76
+ end
77
+
78
+ def system(options = {})
79
+ c = command(options)
80
+ puts c.light_red if debug?
81
+ Kernel.system(c)
82
+ end
83
+
84
+ private
85
+
86
+ attr_reader :extra_options
87
+
88
+ def duplicate_by_command(new_command)
89
+ self.class.new(@env, new_command, @extra_options)
90
+ end
91
+
92
+ def duplicate_by_extra_options(set_extra_options)
93
+ self.class.new(@env, @command, @extra_options.merge(set_extra_options))
94
+ end
95
+
96
+ def debug?
97
+ ENV['DEBUG'].to_s.strip != ''
98
+ end
99
+
100
+ def append_command_options(command, options)
101
+ command = options[:input].command + ' | ' + command if options[:input]
102
+ if options[:input_file]
103
+ command = "cat #{Shellwords.escape(options[:input_file])}" \
104
+ " | #{command}"
105
+ end
106
+ command += ' > ' + Shellwords.escape(options[:output_file]) if options[:output_file]
107
+ command
108
+ end
109
+
110
+ def escape(arg)
111
+ arg = arg.to_s
112
+ m = /^\@ESC_(.+)$/.match(arg)
113
+ m ? m[1] : Shellwords.escape(arg)
114
+ end
115
+
116
+ class ExecuteResult
117
+ attr_reader :r, :options
118
+
119
+ def initialize(result, options)
120
+ @r = result
121
+ @options = options
122
+ end
123
+
124
+ def result
125
+ return exit_code_zero_result if exit_code_zero?
126
+ return expected_error_result if expected_error?
127
+
128
+ raise 'Failed!'
129
+ end
130
+
131
+ def success?
132
+ exit_code_zero? || expected_error?
133
+ end
134
+
135
+ private
136
+
137
+ def exit_code_zero?
138
+ r[:exit_code]&.zero?
139
+ end
140
+
141
+ def exit_code_zero_result
142
+ r[options[:output] || :stdout]
143
+ end
144
+
145
+ def expected_error_result
146
+ options[:exit_outputs][r[:exit_code]]
147
+ end
148
+
149
+ def expected_error?
150
+ options[:exit_outputs].is_a?(Hash) && options[:exit_outputs].key?(r[:exit_code])
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/hash/indifferent_access'
4
+ require 'active_support/core_ext/object/blank'
5
+ require 'shellwords'
6
+
7
+ module EacRubyUtils
8
+ module Envs
9
+ class Command
10
+ module ExtraOptions
11
+ def chdir(dir)
12
+ duplicate_by_extra_options(chdir: dir)
13
+ end
14
+
15
+ def envvar(name, value)
16
+ duplicate_by_extra_options(envvars: envvars.merge(name => value))
17
+ end
18
+
19
+ def pipe(other_command)
20
+ duplicate_by_extra_options(pipe: other_command)
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :extra_options
26
+
27
+ def envvars
28
+ extra_options[:envvars] ||= {}.with_indifferent_access
29
+ end
30
+
31
+ def append_envvars(command)
32
+ e = envvars.map { |k, v| "#{Shellwords.escape(k)}=#{Shellwords.escape(v)}" }.join(' ')
33
+ e.present? ? "#{e} #{command}" : command
34
+ end
35
+
36
+ def append_pipe(command)
37
+ extra_options[:pipe].present? ? "#{command} | #{extra_options[:pipe].command}" : command
38
+ end
39
+
40
+ def append_chdir(command)
41
+ extra_options[:chdir].present? ? "(cd '#{extra_options[:chdir]}' ; #{command} )" : command
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/simple_cache'
4
+
5
+ module EacRubyUtils
6
+ module Envs
7
+ class Executable
8
+ include ::EacRubyUtils::SimpleCache
9
+
10
+ attr_reader :env, :name, :check_args
11
+
12
+ def initialize(env, name, *check_args)
13
+ @env = env
14
+ @name = name
15
+ @check_args = check_args
16
+ end
17
+
18
+ def exist?
19
+ exist
20
+ end
21
+
22
+ def validate
23
+ return nil if exist?
24
+
25
+ "Program \"#{name}\" not found in environment #{env}"
26
+ end
27
+
28
+ def validate!
29
+ message = validate
30
+
31
+ raise ProgramNotFoundError, message if message
32
+ end
33
+
34
+ def command
35
+ validate!
36
+ env.command(name)
37
+ end
38
+
39
+ private
40
+
41
+ def exist_uncached
42
+ env.command(name, *check_args).execute!
43
+ true
44
+ rescue Errno::ENOENT
45
+ false
46
+ end
47
+
48
+ class ProgramNotFoundError < ::StandardError; end
49
+ end
50
+ end
51
+ end