aruba 0.8.1 → 0.9.0.pre

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 (101) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/.travis.yml +3 -1
  4. data/Gemfile +13 -10
  5. data/History.md +25 -7
  6. data/README.md +6 -1
  7. data/Rakefile +16 -3
  8. data/aruba.gemspec +10 -2
  9. data/bin/aruba +7 -0
  10. data/cucumber.yml +11 -2
  11. data/features/api/command/extract_text.feature +97 -0
  12. data/features/api/command/unescape_text.feature +119 -0
  13. data/features/api/core/expand_path.feature +16 -0
  14. data/features/api/{cd.feature → filesystem/cd.feature} +2 -1
  15. data/features/api/filesystem/create_directory.feature +57 -0
  16. data/features/api/filesystem/disk_usage.feature +151 -0
  17. data/features/api/filesystem/does_exist.feature +62 -0
  18. data/features/api/filesystem/is_absolute.feature +48 -0
  19. data/features/api/filesystem/is_directory.feature +53 -0
  20. data/features/api/filesystem/is_file.feature +54 -0
  21. data/features/api/filesystem/is_relative.feature +48 -0
  22. data/features/cli/console.feature +52 -0
  23. data/features/configuration/console_history_file.feature +38 -0
  24. data/features/configuration/exit_timeout.feature +2 -1
  25. data/features/configuration/fixtures_path_prefix.feature +0 -1
  26. data/features/configuration/home_directory.feature +0 -1
  27. data/features/configuration/io_timeout.feature +0 -1
  28. data/features/configuration/keep_ansi.feature +1 -2
  29. data/features/configuration/log_level.feature +38 -0
  30. data/features/configuration/physical_block_size.feature +53 -0
  31. data/features/configuration/remove_ansi_escape_sequences.feature +38 -0
  32. data/features/configuration/root_directory.feature +0 -1
  33. data/features/configuration/working_directory.feature +2 -1
  34. data/features/fixtures/cli-app/README.md +5 -0
  35. data/features/fixtures/cli-app/lib/cli/app.rb +1 -1
  36. data/features/fixtures/cli-app/spec/spec_helper.rb +1 -2
  37. data/features/fixtures/cli-app/spec/support/aruba.rb +1 -0
  38. data/features/fixtures/empty-app/lib/cli/app.rb +1 -1
  39. data/features/fixtures/empty-app/spec/spec_helper.rb +1 -1
  40. data/features/step_definitions/aruba_dev_steps.rb +12 -1
  41. data/features/support/env.rb +1 -1
  42. data/lib/aruba/announcer.rb +1 -14
  43. data/lib/aruba/api.rb +6 -6
  44. data/lib/aruba/api/command.rb +74 -12
  45. data/lib/aruba/api/core.rb +18 -11
  46. data/lib/aruba/api/deprecated.rb +60 -72
  47. data/lib/aruba/api/filesystem.rb +41 -16
  48. data/lib/aruba/aruba_logger.rb +77 -0
  49. data/lib/aruba/aruba_path.rb +33 -0
  50. data/lib/aruba/basic_configuration.rb +2 -2
  51. data/lib/aruba/cli.rb +11 -0
  52. data/lib/aruba/config.rb +13 -3
  53. data/lib/aruba/config/jruby.rb +5 -2
  54. data/lib/aruba/console.rb +66 -0
  55. data/lib/aruba/console/help.rb +33 -0
  56. data/lib/aruba/contracts/is_power_of_two.rb +15 -0
  57. data/lib/aruba/cucumber.rb +27 -10
  58. data/lib/aruba/cucumber/hooks.rb +15 -8
  59. data/lib/aruba/disk_usage_calculator.rb +7 -0
  60. data/lib/aruba/file_size.rb +52 -0
  61. data/lib/aruba/in_process.rb +1 -1
  62. data/lib/aruba/jruby.rb +1 -1
  63. data/lib/aruba/matchers/command.rb +1 -1
  64. data/lib/aruba/matchers/directory.rb +1 -1
  65. data/lib/aruba/matchers/environment.rb +1 -1
  66. data/lib/aruba/matchers/file.rb +1 -1
  67. data/lib/aruba/matchers/path.rb +1 -1
  68. data/lib/aruba/matchers/path/match_path_pattern.rb +1 -1
  69. data/lib/aruba/matchers/rspec_matcher_include_regexp.rb +1 -1
  70. data/lib/aruba/platform.rb +14 -242
  71. data/lib/aruba/{creators → platforms}/aruba_file_creator.rb +3 -3
  72. data/lib/aruba/{creators → platforms}/aruba_fixed_size_file_creator.rb +2 -2
  73. data/lib/aruba/platforms/simple_table.rb +36 -0
  74. data/lib/aruba/platforms/unix_command_string.rb +24 -0
  75. data/lib/aruba/platforms/unix_environment_variables.rb +130 -0
  76. data/lib/aruba/platforms/unix_platform.rb +226 -0
  77. data/lib/aruba/platforms/unix_which.rb +83 -0
  78. data/lib/aruba/platforms/windows_command_string.rb +23 -0
  79. data/lib/aruba/platforms/windows_environment_variables.rb +83 -0
  80. data/lib/aruba/platforms/windows_platform.rb +39 -0
  81. data/lib/aruba/platforms/windows_which.rb +104 -0
  82. data/lib/aruba/process_monitor.rb +3 -3
  83. data/lib/aruba/processes/basic_process.rb +23 -3
  84. data/lib/aruba/processes/debug_process.rb +2 -2
  85. data/lib/aruba/processes/in_process.rb +1 -1
  86. data/lib/aruba/processes/spawn_process.rb +10 -4
  87. data/lib/aruba/reporting.rb +1 -1
  88. data/lib/aruba/rspec.rb +8 -6
  89. data/lib/aruba/runtime.rb +8 -5
  90. data/lib/aruba/version.rb +1 -1
  91. data/spec/aruba/api_spec.rb +25 -23
  92. data/spec/aruba/aruba_path_spec.rb +37 -0
  93. data/spec/aruba/jruby_spec.rb +1 -1
  94. data/spec/aruba/matchers/file_spec.rb +2 -2
  95. data/spec/aruba/matchers/path_spec.rb +3 -3
  96. data/spec/aruba/platform/simple_table_spec.rb +23 -0
  97. data/spec/aruba/platform/windows_environment_variables_spec.rb +500 -0
  98. data/spec/aruba/spawn_process_spec.rb +3 -1
  99. metadata +90 -12
  100. data/lib/aruba/contracts/is_a.rb +0 -21
  101. data/lib/aruba/environment.rb +0 -121
@@ -0,0 +1,15 @@
1
+ require 'aruba/aruba_path'
2
+
3
+ module Aruba
4
+ module Contracts
5
+ class IsPowerOfTwo
6
+ def self.valid?(x)
7
+ # explanation for algorithm can be found here:
8
+ # http://www.exploringbinary.com/ten-ways-to-check-if-an-integer-is-a-power-of-two-in-c/
9
+ x != 0 && (x & (x - 1)) == 0 ? true : false
10
+ rescue
11
+ false
12
+ end
13
+ end
14
+ end
15
+ end
@@ -66,7 +66,7 @@ Given /^a mocked home directory$/ do
66
66
  end
67
67
 
68
68
  Given /^(?:a|the) directory(?: named)? "([^"]*)" does not exist$/ do |directory_name|
69
- remove_directory(directory_name, :force => true)
69
+ remove(directory_name, :force => true)
70
70
  end
71
71
 
72
72
  When /^I write to "([^"]*)" with:$/ do |file_name, file_content|
@@ -86,15 +86,15 @@ When /^I append to "([^"]*)" with "([^"]*)"$/ do |file_name, file_content|
86
86
  end
87
87
 
88
88
  When /^I remove (?:a|the) file(?: named)? "([^"]*)"$/ do |file_name|
89
- remove_file(file_name)
89
+ remove(file_name)
90
90
  end
91
91
 
92
92
  Given /^(?:a|the) file(?: named)? "([^"]*)" does not exist$/ do |file_name|
93
- remove_file(file_name, :force => true)
93
+ remove(file_name, :force => true)
94
94
  end
95
95
 
96
96
  When(/^I remove (?:a|the) directory(?: named)? "(.*?)"$/) do |directory_name|
97
- remove_directory(directory_name)
97
+ remove(directory_name)
98
98
  end
99
99
 
100
100
  When /^I cd to "([^"]*)"$/ do |dir|
@@ -121,22 +121,36 @@ end
121
121
 
122
122
  When /^I run "(.*)"$/ do |cmd|
123
123
  warn(%{\e[35m The /^I run "(.*)"$/ step definition is deprecated. Please use the `backticks` version\e[0m})
124
- run_simple(Aruba::Platform.unescape(cmd, aruba.config.keep_ansi), false)
124
+
125
+ cmd = unescape_text(cmd)
126
+ cmd = extract_text(cmd) if !aruba.config.keep_ansi || aruba.config.remove_ansi_escape_sequences
127
+
128
+ run_simple(cmd, false)
125
129
  end
126
130
 
127
131
  When /^I run `([^`]*)`$/ do |cmd|
128
- run_simple(Aruba::Platform.unescape(cmd, aruba.config.keep_ansi), false)
132
+ cmd = unescape_text(cmd)
133
+ cmd = extract_text(cmd) if !aruba.config.keep_ansi || aruba.config.remove_ansi_escape_sequences
134
+
135
+ run_simple(cmd, false)
129
136
  end
130
137
 
131
138
  When /^I successfully run "(.*)"$/ do |cmd|
132
139
  warn(%{\e[35m The /^I successfully run "(.*)"$/ step definition is deprecated. Please use the `backticks` version\e[0m})
133
- run_simple(Aruba::Platform.unescape(cmd, aruba.config.keep_ansi))
140
+
141
+ cmd = unescape_text(cmd)
142
+ cmd = extract_text(cmd) if !aruba.config.keep_ansi || aruba.config.remove_ansi_escape_sequences
143
+
144
+ run_simple(cmd)
134
145
  end
135
146
 
136
147
  ## I successfully run `echo -n "Hello"`
137
148
  ## I successfully run `sleep 29` for up to 30 seconds
138
149
  When /^I successfully run `(.*?)`(?: for up to (\d+) seconds)?$/ do |cmd, secs|
139
- run_simple(Aruba::Platform.unescape(cmd, aruba.config.keep_ansi), true, secs && secs.to_i)
150
+ cmd = unescape_text(cmd)
151
+ cmd = extract_text(cmd) if !aruba.config.keep_ansi || aruba.config.remove_ansi_escape_sequences
152
+
153
+ run_simple(cmd, true, secs && secs.to_i)
140
154
  end
141
155
 
142
156
  When /^I run "([^"]*)" interactively$/ do |cmd|
@@ -145,11 +159,14 @@ When /^I run "([^"]*)" interactively$/ do |cmd|
145
159
  end
146
160
 
147
161
  When /^I run `([^`]*)` interactively$/ do |cmd|
148
- @interactive = run(Aruba::Platform.unescape(cmd, aruba.config.keep_ansi))
162
+ cmd = unescape_text(cmd)
163
+ cmd = extract_text(cmd) if !aruba.config.keep_ansi || aruba.config.remove_ansi_escape_sequences
164
+
165
+ @interactive = run(cmd)
149
166
  end
150
167
 
151
168
  When /^I type "([^"]*)"$/ do |input|
152
- type(input)
169
+ type(unescape_text(input))
153
170
  end
154
171
 
155
172
  When /^I close the stdin stream$/ do
@@ -6,9 +6,9 @@ if Aruba::VERSION >= '1.0.0'
6
6
  Around do |_, block|
7
7
  begin
8
8
  if RUBY_VERSION < '1.9'
9
- old_env = ENV.to_hash
9
+ old_env = ENV.to_hash.dup
10
10
  else
11
- old_env = ENV.to_h
11
+ old_env = ENV.to_h.dup
12
12
  end
13
13
 
14
14
  block.call
@@ -47,7 +47,7 @@ Before('@announce-command') do
47
47
  end
48
48
 
49
49
  Before('@announce-cmd') do
50
- Aruba::Platform.deprecated 'The use of "@announce-cmd"-hook is deprecated. Please use "@announce-command"'
50
+ Aruba.platform.deprecated 'The use of "@announce-cmd"-hook is deprecated. Please use "@announce-command"'
51
51
 
52
52
  announcer.activate :command
53
53
  end
@@ -61,7 +61,7 @@ Before('@announce-stderr') do
61
61
  end
62
62
 
63
63
  Before('@announce-dir') do
64
- Aruba::Platform.deprecated 'The use of "@announce-dir"-hook is deprecated. Please use "@announce-directory"'
64
+ Aruba.platform.deprecated 'The use of "@announce-dir"-hook is deprecated. Please use "@announce-directory"'
65
65
 
66
66
  announcer.activate :directory
67
67
  end
@@ -71,13 +71,13 @@ Before('@announce-directory') do
71
71
  end
72
72
 
73
73
  Before('@announce-env') do
74
- Aruba::Platform.deprecated 'The use of "@announce-env"-hook is deprecated. Please use "@announce-modified-environment"'
74
+ Aruba.platform.deprecated 'The use of "@announce-env"-hook is deprecated. Please use "@announce-modified-environment"'
75
75
 
76
76
  announcer.activate :environment
77
77
  end
78
78
 
79
79
  Before('@announce-environment') do
80
- Aruba::Platform.deprecated '@announce-environment is deprecated. Use @announce-modified-environment instead'
80
+ Aruba.platform.deprecated '@announce-environment is deprecated. Use @announce-modified-environment instead'
81
81
 
82
82
  announcer.activate :modified_environment
83
83
  end
@@ -100,6 +100,7 @@ Before('@announce') do
100
100
  announcer.activate :stderr
101
101
  announcer.activate :directory
102
102
  announcer.activate :modified_environment
103
+ announcer.activate :full_environment
103
104
  announcer.activate :environment
104
105
  announcer.activate :timeout
105
106
  end
@@ -113,11 +114,17 @@ end
113
114
  # end
114
115
 
115
116
  Before('@ansi') do
116
- @aruba_keep_ansi = true
117
+ Aruba.platform.deprecated('The use of "@ansi" is deprecated. Use "@keep-ansi-escape-sequences" instead')
118
+
119
+ aruba.config.remove_ansi_escape_sequences = false
120
+ end
121
+
122
+ Before('@keep-ansi-escape-sequences') do
123
+ aruba.config.remove_ansi_escape_sequences = false
117
124
  end
118
125
 
119
126
  Before '@mocked_home_directory' do
120
- Aruba::Platform.deprecated('The use of "@mocked_home_directory" is deprecated. Use "@mocked-home-directory" instead')
127
+ Aruba.platform.deprecated('The use of "@mocked_home_directory" is deprecated. Use "@mocked-home-directory" instead')
121
128
 
122
129
  set_environment_variable 'HOME', expand_path('.')
123
130
  end
@@ -0,0 +1,7 @@
1
+ module Aruba
2
+ class DiskUsageCalculator
3
+ def calc(blocks, block_size)
4
+ FileSize.new(blocks * block_size)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,52 @@
1
+ require 'delegate'
2
+
3
+ module Aruba
4
+ class FileSize
5
+ include Comparable
6
+
7
+ private
8
+
9
+ attr_reader :bytes, :divisor
10
+
11
+ public
12
+
13
+ def initialize(bytes)
14
+ @bytes = bytes
15
+ @divisor = 1024
16
+ end
17
+
18
+ def to_byte
19
+ bytes
20
+ end
21
+ alias_method :to_i, :to_byte
22
+
23
+ def to_f
24
+ to_i.to_f
25
+ end
26
+
27
+ def to_s
28
+ to_i.to_s
29
+ end
30
+ alias_method :inspect, :to_s
31
+
32
+ def coerce(other)
33
+ [bytes, other]
34
+ end
35
+
36
+ def to_kibi_byte
37
+ to_byte.to_f / divisor
38
+ end
39
+
40
+ def to_mebi_byte
41
+ to_kibi_byte.to_f / divisor
42
+ end
43
+
44
+ def to_gibi_byte
45
+ to_mebi_byte.to_f / divisor
46
+ end
47
+
48
+ def <=>(other)
49
+ to_i <=> other.to_i
50
+ end
51
+ end
52
+ end
@@ -4,7 +4,7 @@ require 'aruba/platform'
4
4
  module Aruba
5
5
  class InProcess < Aruba::Processes::InProcess
6
6
  def initialize(*args)
7
- Aruba::Platform.deprecated('The use of "Aruba::InProcess" is deprecated. Use "Aruba::Processes::InProcess" instead.')
7
+ Aruba.platform.deprecated('The use of "Aruba::InProcess" is deprecated. Use "Aruba::Processes::InProcess" instead.')
8
8
 
9
9
  super
10
10
  end
@@ -1,4 +1,4 @@
1
1
  require 'aruba/platform'
2
- Aruba::Platform.deprecated('The use of "aruba/jruby" is deprecated. Use "aruba/config/jruby" instead')
2
+ Aruba.platform.deprecated('The use of "aruba/jruby" is deprecated. Use "aruba/config/jruby" instead')
3
3
 
4
4
  require 'aruba/config/jruby'
@@ -1 +1 @@
1
- Aruba::Platform.require_matching_files('../command/**/*.rb', __FILE__)
1
+ Aruba.platform.require_matching_files('../command/**/*.rb', __FILE__)
@@ -1 +1 @@
1
- Aruba::Platform.require_matching_files('../directory/**/*.rb', __FILE__)
1
+ Aruba.platform.require_matching_files('../directory/**/*.rb', __FILE__)
@@ -1 +1 @@
1
- Aruba::Platform.require_matching_files('../matchers/environment/*.rb', __FILE__)
1
+ Aruba.platform.require_matching_files('../matchers/environment/*.rb', __FILE__)
@@ -1 +1 @@
1
- Aruba::Platform.require_matching_files('../file/**/*.rb', __FILE__)
1
+ Aruba.platform.require_matching_files('../file/**/*.rb', __FILE__)
@@ -1 +1 @@
1
- Aruba::Platform.require_matching_files('../path/**/*.rb', __FILE__)
1
+ Aruba.platform.require_matching_files('../path/**/*.rb', __FILE__)
@@ -24,7 +24,7 @@
24
24
  # end
25
25
  RSpec::Matchers.define :match_path_pattern do |_|
26
26
  match do |actual|
27
- Aruba::Platform.deprecated('The use of `expect().to match_path_pattern` is deprecated. Please use `expect().to include pattern /regex/` instead.')
27
+ Aruba.platform.deprecated('The use of `expect().to match_path_pattern` is deprecated. Please use `expect().to include pattern /regex/` instead.')
28
28
 
29
29
  next !actual.select { |a| a == expected }.empty? if expected.is_a? String
30
30
 
@@ -18,7 +18,7 @@
18
18
  # end
19
19
  RSpec::Matchers.define :include_regexp do |expected|
20
20
  match do |actual|
21
- Aruba::Platform.deprecated('The use of "include_regexp"-matchers is deprecated. It will be removed soon.')
21
+ Aruba.platform.deprecated('The use of "include_regexp"-matchers is deprecated. It will be removed soon.')
22
22
 
23
23
  !actual.grep(expected).empty?
24
24
  end
@@ -1,249 +1,21 @@
1
- require 'rbconfig'
2
- require 'pathname'
1
+ require 'thread'
2
+ require 'aruba/platforms/unix_platform'
3
+ require 'aruba/platforms/windows_platform'
3
4
 
4
5
  module Aruba
5
- # WARNING:
6
- # All methods found here are not considered part of the public API of aruba.
7
- #
8
- # Those methods can be changed at any time in the feature or removed without
9
- # any further notice.
10
- module Platform
11
- def detect_ruby(cmd)
12
- if cmd =~ /^ruby\s/
13
- cmd.gsub(/^ruby\s/, "#{current_ruby} ")
14
- else
15
- cmd
16
- end
17
- end
18
-
19
- def deprecated(msg)
20
- warn(format('%s. Called by %s', msg, caller[1]))
21
- end
22
-
23
- def current_ruby
24
- ::File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
25
- end
26
-
27
- # @deprecated
28
- # Add newline at the end
29
- def ensure_newline(str)
30
- deprecated('The use of "#ensure_newline" is deprecated. It will be removed soon')
31
-
32
- str.chomp << "\n"
33
- end
34
-
35
- def require_matching_files(pattern, base)
36
- if RUBY_VERSION < '1.9.'
37
- ::Dir.glob(::File.expand_path(pattern, base)).each { |f| require File.join(File.dirname(f), File.basename(f, '.rb')) }
38
- else
39
- ::Dir.glob(::File.expand_path(pattern, base)).each { |f| require_relative f }
40
- end
41
- end
42
-
43
- # Create directory and subdirectories
44
- def mkdir(dir_name)
45
- dir_name = ::File.expand_path(dir_name)
46
-
47
- ::FileUtils.mkdir_p(dir_name) unless ::File.directory?(dir_name)
48
- end
49
-
50
- # Remove file, directory + sub-directories
51
- def rm(paths, options = {})
52
- paths = Array(paths).map { |p| ::File.expand_path(p) }
53
-
54
- FileUtils.rm_r(paths, options)
55
- end
56
-
57
- # Get current working directory
58
- def getwd
59
- Dir.getwd
60
- end
61
-
62
- # Change to directory
63
- def chdir(dir_name, &block)
64
- dir_name = ::File.expand_path(dir_name.to_s)
65
-
66
- begin
67
- if RUBY_VERSION <= '1.9.3'
68
- old_env = ENV.to_hash
69
- else
70
- old_env = ENV.to_h
71
- end
72
-
73
- ENV['OLDPWD'] = getwd
74
- ENV['PWD'] = dir_name
75
- ::Dir.chdir(dir_name, &block)
76
- ensure
77
- ENV.clear
78
- ENV.update old_env
79
- end
80
- end
81
-
82
- # Touch file, directory
83
- def touch(args, options)
84
- FileUtils.touch(args, options)
85
- end
86
-
87
- # Copy file/directory
88
- def cp(args, options)
89
- FileUtils.cp_r(args, options)
90
- end
91
-
92
- # Change mode of file/directory
93
- def chmod(mode, args, options)
94
- FileUtils.chmod_R(mode, args, options)
95
- end
96
-
97
- # Exists and is file
98
- def file?(f)
99
- File.file? f
100
- end
101
-
102
- # Exists and is directory
103
- def directory?(f)
104
- File.directory? f
105
- end
106
-
107
- # Path Exists
108
- def exist?(f)
109
- File.exist? f
110
- end
111
-
112
- # Path is executable
113
- def executable_file?(f)
114
- File.file?(f) && File.executable?(f)
115
- end
116
-
117
- # Expand path
118
- def expand_path(path, base)
119
- File.expand_path(path, base)
120
- end
121
-
122
- def absolute_path?(path)
123
- Pathname.new(path).absolute?
124
- end
125
-
126
- # Check if command is relative
127
- #
128
- # @return [TrueClass, FalseClass]
129
- # true
130
- # * bin/command.sh
131
- #
132
- # false
133
- # * /bin/command.sh
134
- # * command.sh
135
- def relative_command?(path)
136
- p = Pathname.new(path)
137
- p.relative? && p.basename != p
138
- end
139
-
140
- # Write to file
141
- def write_file(path, content)
142
- if RUBY_VERSION < '1.9'
143
- File.open(path, 'wb') do |f|
144
- f.print content
145
- end
146
- else
147
- File.write(path, content)
148
- end
149
- end
150
-
151
- # Unescape string
152
- #
153
- # @param [String] string
154
- # The string which should be unescaped, e.g. the output of a command
155
- #
156
- # @return
157
- # The string stripped from escape sequences
158
- def unescape(string, keep_ansi = true)
159
- string = string.gsub('\n', "\n").gsub('\"', '"').gsub('\e', "\e")
160
- string = string.gsub(/\e\[\d+(?>(;\d+)*)m/, '') unless keep_ansi
161
- string
162
- end
163
-
164
- # Resolve path for command using the PATH-environment variable
165
- #
166
- # Mostly taken from here: https://github.com/djberg96/ptools
167
- #
168
- # @param [#to_s] program
169
- # The name of the program which should be resolved
170
- #
171
- # @param [String] path
172
- # The PATH, a string concatenated with ":", e.g. /usr/bin/:/bin on a
173
- # UNIX-system
174
- #
175
- # rubocop:disable Metrics/MethodLength
176
- # rubocop:disable Metrics/CyclomaticComplexity
177
- def which(program, path = ENV['PATH'])
178
- on_windows = false
179
- on_windows = true if File::ALT_SEPARATOR
180
-
181
- program = program.to_s
182
-
183
- path_exts = ENV['PATHEXT'] ? ('.{' + ENV['PATHEXT'].tr(';', ',').tr('.','') + '}').downcase : '.{exe,com,bat}' if on_windows
184
-
185
- raise ArgumentError, "ENV['PATH'] cannot be empty" if path.nil? || path.empty?
186
-
187
- # Bail out early if an absolute path is provided or the command path is relative
188
- # Examples: /usr/bin/command or bin/command.sh
189
- if Aruba::Platform.absolute_path?(program) || Aruba::Platform.relative_command?(program)
190
- program += path_exts if on_windows && File.extname(program).empty?
191
-
192
- found = Dir[program].first
193
-
194
- return File.expand_path(found) if found && Aruba::Platform.executable_file?(found)
195
- return nil
196
- end
197
-
198
- # Iterate over each path glob the dir + program.
199
- path.split(File::PATH_SEPARATOR).each do |dir|
200
- dir = Aruba::Platform.expand_path(dir, Dir.getwd)
201
-
202
- next unless Aruba::Platform.exist?(dir) # In case of bogus second argument
203
- file = File.join(dir, program)
204
-
205
- # Dir[] doesn't handle backslashes properly, so convert them. Also, if
206
- # the program name doesn't have an extension, try them all.
207
- if on_windows
208
- file = file.tr("\\", "/")
209
- file += path_exts if File.extname(program).empty?
210
- end
211
-
212
- found = Dir[file].first
6
+ PLATFORM_MUTEX = Mutex.new
7
+ end
213
8
 
214
- # Convert all forward slashes to backslashes if supported
215
- if found && Aruba::Platform.executable_file?(found)
216
- found.tr!(File::SEPARATOR, File::ALT_SEPARATOR) if on_windows
217
- return found
218
- end
219
- end
9
+ module Aruba
10
+ Platform = [Platforms::WindowsPlatform, Platforms::UnixPlatform].find(&:match?)
11
+ end
220
12
 
221
- nil
222
- end
223
- # rubocop:enable Metrics/MethodLength
224
- # rubocop:enable Metrics/CyclomaticComplexity
13
+ module Aruba
14
+ PLATFORM_MUTEX.synchronize do
15
+ @platform = Platform.new
16
+ end
225
17
 
226
- module_function :detect_ruby, \
227
- :current_ruby, \
228
- :ensure_newline, \
229
- :require_matching_files, \
230
- :mkdir, \
231
- :rm, \
232
- :chdir, \
233
- :deprecated, \
234
- :touch, \
235
- :cp, \
236
- :chmod, \
237
- :file?, \
238
- :directory?, \
239
- :exist?, \
240
- :expand_path, \
241
- :absolute_path?, \
242
- :relative_command?, \
243
- :executable_file?, \
244
- :unescape, \
245
- :getwd, \
246
- :which, \
247
- :write_file
18
+ class << self
19
+ attr_reader :platform
248
20
  end
249
21
  end