aruba 0.14.9 → 1.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.
- checksums.yaml +4 -4
- data/.cucumberproignore +3 -0
- data/.github/ISSUE_TEMPLATE.md +48 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +41 -0
- data/.gitignore +1 -0
- data/.rspec +1 -1
- data/.rubocop.yml +20 -179
- data/.rubocop_todo.yml +262 -0
- data/.simplecov +7 -5
- data/.travis.yml +54 -46
- data/.yardopts +3 -0
- data/CHANGELOG.md +613 -246
- data/CONTRIBUTING.md +247 -45
- data/Dockerfile +67 -0
- data/Gemfile +5 -96
- data/LICENSE +1 -1
- data/README.md +57 -180
- data/Rakefile +63 -32
- data/appveyor.yml +8 -11
- data/aruba.gemspec +47 -41
- data/bin/console +7 -0
- data/bin/test +9 -0
- data/cucumber.yml +4 -24
- data/doc/dependency_decisions.yml +42 -2
- data/docker-compose.yml +26 -0
- data/{bin → exe}/aruba +1 -1
- data/fixtures/cli-app/Rakefile +1 -1
- data/fixtures/cli-app/bin/aruba-test-cli +6 -0
- data/fixtures/cli-app/cli-app.gemspec +1 -2
- data/fixtures/cli-app/features/support/aruba.rb +1 -0
- data/fixtures/cli-app/features/support/env.rb +1 -1
- data/fixtures/cli-app/lib/cli/app/suppress_simple_cov_output.rb +3 -3
- data/fixtures/cli-app/lib/cli/app/version.rb +1 -1
- data/fixtures/cli-app/lib/cli/app.rb +1 -5
- data/fixtures/cli-app/spec/spec_helper.rb +4 -6
- data/fixtures/empty-app/Rakefile +1 -1
- data/fixtures/empty-app/cli-app.gemspec +1 -2
- data/fixtures/empty-app/lib/cli/app/version.rb +1 -1
- data/fixtures/empty-app/lib/cli/app.rb +0 -6
- data/fixtures/getting-started-app/Gemfile +1 -1
- data/lib/aruba/api/commands.rb +109 -143
- data/lib/aruba/api/core.rb +57 -43
- data/lib/aruba/api/environment.rb +16 -7
- data/lib/aruba/api/filesystem.rb +42 -29
- data/lib/aruba/api/text.rb +3 -9
- data/lib/aruba/api.rb +6 -11
- data/lib/aruba/aruba_path.rb +27 -89
- data/lib/aruba/basic_configuration.rb +4 -24
- data/lib/aruba/cli.rb +1 -1
- data/lib/aruba/colorizer.rb +10 -99
- data/lib/aruba/command.rb +2 -0
- data/lib/aruba/config/jruby.rb +15 -5
- data/lib/aruba/config_wrapper.rb +1 -1
- data/lib/aruba/configuration.rb +92 -0
- data/lib/aruba/console/help.rb +1 -7
- data/lib/aruba/console.rb +5 -5
- data/lib/aruba/contracts/absolute_path.rb +2 -2
- data/lib/aruba/contracts/relative_path.rb +2 -2
- data/lib/aruba/cucumber/command.rb +171 -160
- data/lib/aruba/cucumber/environment.rb +1 -1
- data/lib/aruba/cucumber/file.rb +21 -35
- data/lib/aruba/cucumber/hooks.rb +17 -56
- data/lib/aruba/cucumber/testing_frameworks.rb +74 -50
- data/lib/aruba/cucumber.rb +0 -5
- data/lib/aruba/event_bus/name_resolver.rb +5 -16
- data/lib/aruba/hooks.rb +1 -1
- data/lib/aruba/in_config_wrapper.rb +5 -1
- data/lib/aruba/initializer.rb +36 -42
- data/lib/aruba/matchers/base/base_matcher.rb +2 -2
- data/lib/aruba/matchers/base/message_indenter.rb +19 -0
- data/lib/aruba/matchers/base/object_formatter.rb +2 -9
- data/lib/aruba/matchers/collection/include_an_object.rb +7 -9
- data/lib/aruba/matchers/command/be_successfully_executed.rb +6 -4
- data/lib/aruba/matchers/command/have_exit_status.rb +14 -4
- data/lib/aruba/matchers/command/have_finished_in_time.rb +3 -5
- data/lib/aruba/matchers/command/have_output.rb +10 -5
- data/lib/aruba/matchers/command/have_output_on_stderr.rb +2 -2
- data/lib/aruba/matchers/command/have_output_on_stdout.rb +2 -2
- data/lib/aruba/matchers/command/have_output_size.rb +2 -2
- data/lib/aruba/matchers/directory/be_an_existing_directory.rb +5 -7
- data/lib/aruba/matchers/directory/have_sub_directory.rb +4 -6
- data/lib/aruba/matchers/file/be_a_command_found_in_path.rb +2 -4
- data/lib/aruba/matchers/file/be_an_existing_executable.rb +4 -6
- data/lib/aruba/matchers/file/be_an_existing_file.rb +5 -7
- data/lib/aruba/matchers/file/have_file_content.rb +4 -4
- data/lib/aruba/matchers/file/have_file_size.rb +6 -8
- data/lib/aruba/matchers/file/have_same_file_content.rb +5 -8
- data/lib/aruba/matchers/path/a_path_matching_pattern.rb +2 -4
- data/lib/aruba/matchers/path/be_an_absolute_path.rb +3 -5
- data/lib/aruba/matchers/path/be_an_existing_path.rb +4 -6
- data/lib/aruba/matchers/path/have_permissions.rb +6 -8
- data/lib/aruba/matchers/string/include_output_string.rb +8 -10
- data/lib/aruba/matchers/string/match_output_string.rb +9 -11
- data/lib/aruba/matchers/string/output_string_eq.rb +7 -9
- data/lib/aruba/platform.rb +0 -8
- data/lib/aruba/platforms/announcer.rb +42 -79
- data/lib/aruba/platforms/aruba_file_creator.rb +2 -6
- data/lib/aruba/platforms/aruba_fixed_size_file_creator.rb +2 -2
- data/lib/aruba/platforms/aruba_logger.rb +23 -7
- data/lib/aruba/platforms/command_monitor.rb +12 -107
- data/lib/aruba/platforms/determine_disk_usage.rb +56 -14
- data/lib/aruba/platforms/filesystem_status.rb +10 -14
- data/lib/aruba/platforms/local_environment.rb +2 -2
- data/lib/aruba/platforms/simple_table.rb +3 -11
- data/lib/aruba/platforms/unix_command_string.rb +7 -11
- data/lib/aruba/platforms/unix_environment_variables.rb +18 -27
- data/lib/aruba/platforms/unix_platform.rb +20 -51
- data/lib/aruba/platforms/unix_which.rb +2 -1
- data/lib/aruba/platforms/windows_command_string.rb +15 -10
- data/lib/aruba/platforms/windows_environment_variables.rb +43 -44
- data/lib/aruba/platforms/windows_platform.rb +4 -0
- data/lib/aruba/platforms/windows_which.rb +4 -3
- data/lib/aruba/processes/basic_process.rb +28 -30
- data/lib/aruba/processes/debug_process.rb +12 -3
- data/lib/aruba/processes/in_process.rb +17 -8
- data/lib/aruba/processes/spawn_process.rb +57 -46
- data/lib/aruba/rspec.rb +14 -36
- data/lib/aruba/runtime.rb +3 -6
- data/lib/aruba/setup.rb +6 -6
- data/lib/aruba/tasks/docker_helpers.rb +154 -0
- data/lib/aruba/version.rb +1 -1
- metadata +191 -244
- data/features/.nav +0 -72
- data/features/api/command/find_command.feature +0 -83
- data/features/api/command/last_command_started.feature +0 -50
- data/features/api/command/last_command_stopped.feature +0 -89
- data/features/api/command/run.feature +0 -414
- data/features/api/command/run_simple.feature +0 -242
- data/features/api/command/send_signal.feature +0 -53
- data/features/api/command/stderr.feature +0 -46
- data/features/api/command/stdout.feature +0 -46
- data/features/api/command/stop.feature +0 -131
- data/features/api/command/stop_all_commands.feature +0 -53
- data/features/api/command/terminate_all_commands.feature +0 -53
- data/features/api/command/which.feature +0 -37
- data/features/api/core/expand_path.feature +0 -88
- data/features/api/environment/append_environment_variable.feature +0 -128
- data/features/api/environment/delete_environment_variable.feature +0 -63
- data/features/api/environment/prepend_environment_variable.feature +0 -128
- data/features/api/environment/set_environment_variable.feature +0 -376
- data/features/api/filesystem/cd.feature +0 -184
- data/features/api/filesystem/create_directory.feature +0 -57
- data/features/api/filesystem/disk_usage.feature +0 -152
- data/features/api/filesystem/does_exist.feature +0 -62
- data/features/api/filesystem/fixtures.feature +0 -104
- data/features/api/filesystem/is_absolute.feature +0 -48
- data/features/api/filesystem/is_directory.feature +0 -53
- data/features/api/filesystem/is_file.feature +0 -54
- data/features/api/filesystem/is_relative.feature +0 -48
- data/features/api/filesystem/move.feature +0 -119
- data/features/api/text/extract_text.feature +0 -87
- data/features/api/text/replace_variables.feature +0 -45
- data/features/api/text/sanitize_text.feature +0 -228
- data/features/api/text/unescape_text.feature +0 -127
- data/features/cli/console.feature +0 -52
- data/features/cli/init.feature +0 -79
- data/features/configuration/activate_announcer_on_command_failure.feature +0 -38
- data/features/configuration/command_runtime_environment.feature +0 -129
- data/features/configuration/console_history_file.feature +0 -38
- data/features/configuration/exit_timeout.feature +0 -52
- data/features/configuration/fixtures_directories.feature +0 -38
- data/features/configuration/fixtures_path_prefix.feature +0 -23
- data/features/configuration/home_directory.feature +0 -80
- data/features/configuration/io_timeout.feature +0 -30
- data/features/configuration/keep_ansi.feature +0 -30
- data/features/configuration/log_level.feature +0 -38
- data/features/configuration/physical_block_size.feature +0 -53
- data/features/configuration/remove_ansi_escape_sequences.feature +0 -38
- data/features/configuration/root_directory.feature +0 -30
- data/features/configuration/startup_wait_time.feature +0 -48
- data/features/configuration/usage.feature +0 -159
- data/features/configuration/working_directory.feature +0 -33
- data/features/development/build.feature +0 -15
- data/features/getting_started/cleanup.feature +0 -58
- data/features/getting_started/run_commands.feature +0 -187
- data/features/getting_started/supported_testing_frameworks.feature +0 -104
- data/features/getting_started/writing_good_feature_tests.feature +0 -38
- data/features/hooks/after/command.feature +0 -46
- data/features/hooks/before/command.feature +0 -75
- data/features/matchers/collection/include_an_object.feature +0 -72
- data/features/matchers/directory/have_sub_directory.feature +0 -110
- data/features/matchers/file/be_a_command_found_in_path.feature +0 -115
- data/features/matchers/file/be_existing_executable.feature +0 -88
- data/features/matchers/file/be_existing_file.feature +0 -82
- data/features/matchers/file/have_file_content.feature +0 -123
- data/features/matchers/file/have_file_size.feature +0 -107
- data/features/matchers/path/be_an_absolute_path.feature +0 -74
- data/features/matchers/path/be_an_existing_path.feature +0 -97
- data/features/matchers/path/have_permissions.feature +0 -118
- data/features/matchers/timeouts.feature +0 -48
- data/features/platforms/jruby.feature +0 -14
- data/features/rspec/integration.feature +0 -179
- data/features/step_definitions/aruba_dev_steps.rb +0 -56
- data/features/step_definitions/hooks.rb +0 -156
- data/features/steps/command/debug.feature +0 -92
- data/features/steps/command/exit_statuses.feature +0 -136
- data/features/steps/command/in_process.feature +0 -485
- data/features/steps/command/interactive.feature +0 -90
- data/features/steps/command/output.feature +0 -567
- data/features/steps/command/run.feature +0 -66
- data/features/steps/command/send_signal.feature +0 -104
- data/features/steps/command/shell.feature +0 -155
- data/features/steps/command/stderr.feature +0 -68
- data/features/steps/command/stdout.feature +0 -109
- data/features/steps/command/stop.feature +0 -313
- data/features/steps/core/announce.feature +0 -283
- data/features/steps/environment/append_environment_variable.feature +0 -52
- data/features/steps/environment/disable_bunder.feature +0 -18
- data/features/steps/environment/home_variable.feature +0 -62
- data/features/steps/environment/prepend_environment_variable.feature +0 -52
- data/features/steps/environment/set_environment_variable.feature +0 -49
- data/features/steps/filesystem/append_to_file.feature +0 -45
- data/features/steps/filesystem/cd_to_directory.feature +0 -33
- data/features/steps/filesystem/check_file_content.feature +0 -61
- data/features/steps/filesystem/check_permissions_of_file.feature +0 -39
- data/features/steps/filesystem/compare_files.feature +0 -42
- data/features/steps/filesystem/copy.feature +0 -45
- data/features/steps/filesystem/create_directory.feature +0 -57
- data/features/steps/filesystem/create_file.feature +0 -76
- data/features/steps/filesystem/existence_of_directory.feature +0 -57
- data/features/steps/filesystem/existence_of_file.feature +0 -43
- data/features/steps/filesystem/file_content.feature +0 -86
- data/features/steps/filesystem/fixtures.feature +0 -64
- data/features/steps/filesystem/move.feature +0 -45
- data/features/steps/filesystem/non_existence_of_directory.feature +0 -69
- data/features/steps/filesystem/non_existence_of_file.feature +0 -80
- data/features/steps/filesystem/overwrite_file.feature +0 -72
- data/features/steps/filesystem/remove_directory.feature +0 -38
- data/features/steps/filesystem/remove_file.feature +0 -38
- data/features/steps/filesystem/use_fixture.feature +0 -77
- data/features/steps/overview.feature +0 -25
- data/features/support/aruba.rb +0 -7
- data/features/support/env.rb +0 -33
- data/features/support/jruby.rb +0 -5
- data/features/support/simplecov_setup.rb +0 -8
- data/fixtures/cli-app/bin/cli +0 -6
- data/fixtures/spawn_process/stderr.sh +0 -3
- data/lib/aruba/api/deprecated.rb +0 -1234
- data/lib/aruba/config.rb +0 -107
- data/lib/aruba/cucumber/core.rb +0 -5
- data/lib/aruba/cucumber/rvm.rb +0 -3
- data/lib/aruba/in_process.rb +0 -14
- data/lib/aruba/jruby.rb +0 -4
- data/lib/aruba/matchers/deprecated/file.rb +0 -17
- data/lib/aruba/matchers/deprecated.rb +0 -1
- data/lib/aruba/matchers/path/match_path_pattern.rb +0 -41
- data/lib/aruba/matchers/rspec_matcher_include_regexp.rb +0 -25
- data/lib/aruba/platforms/disk_usage_calculator.rb +0 -20
- data/lib/aruba/reporting.rb +0 -126
- data/lib/aruba/spawn_process.rb +0 -11
- data/script/bootstrap +0 -28
- data/script/console +0 -16
- data/script/test +0 -3
- data/spec/aruba/api/bundler_spec.rb +0 -15
- data/spec/aruba/api/deprecated_spec.rb +0 -308
- data/spec/aruba/api/environment/restore_env_spec.rb +0 -86
- data/spec/aruba/api/environment/set_env_spec.rb +0 -46
- data/spec/aruba/api/filesystem/file_size_spec.rb +0 -28
- data/spec/aruba/api/runtime_spec.rb +0 -28
- data/spec/aruba/api_spec.rb +0 -981
- data/spec/aruba/aruba_path_spec.rb +0 -103
- data/spec/aruba/basic_configuration_spec.rb +0 -5
- data/spec/aruba/configuration_spec.rb +0 -5
- data/spec/aruba/hooks_spec.rb +0 -17
- data/spec/aruba/in_config_wrapper_spec.rb +0 -25
- data/spec/aruba/jruby_spec.rb +0 -55
- data/spec/aruba/matchers/command/have_output_size_spec.rb +0 -25
- data/spec/aruba/matchers/command_spec.rb +0 -174
- data/spec/aruba/matchers/deprecated_spec.rb +0 -120
- data/spec/aruba/matchers/directory_spec.rb +0 -57
- data/spec/aruba/matchers/file_spec.rb +0 -208
- data/spec/aruba/matchers/path_spec.rb +0 -58
- data/spec/aruba/platform/simple_table_spec.rb +0 -23
- data/spec/aruba/platform/windows_environment_variables_spec.rb +0 -500
- data/spec/aruba/platforms/unix_command_string_spec.rb +0 -17
- data/spec/aruba/platforms/windows_command_string_spec.rb +0 -22
- data/spec/aruba/rspec_spec.rb +0 -15
- data/spec/aruba/runtime_spec.rb +0 -29
- data/spec/aruba/spawn_process_spec.rb +0 -96
- data/spec/event_bus/name_resolver_spec.rb +0 -68
- data/spec/event_bus_spec.rb +0 -158
- data/spec/spec_helper.rb +0 -20
- data/spec/support/configs/.keep +0 -0
- data/spec/support/configs/aruba.rb +0 -5
- data/spec/support/configs/pry.rb +0 -3
- data/spec/support/configs/rspec.rb +0 -15
- data/spec/support/helpers/.keep +0 -0
- data/spec/support/helpers/reporting.rb +0 -44
- data/spec/support/matchers/.keep +0 -0
- data/spec/support/matchers/option.rb +0 -35
- data/spec/support/shared_contexts/.keep +0 -0
- data/spec/support/shared_contexts/aruba.rb +0 -49
- data/spec/support/shared_examples/.keep +0 -0
- data/spec/support/shared_examples/configuration.rb +0 -116
- data/spec/support/shared_examples/directory.rb +0 -7
- data/spec/support/shared_examples/file.rb +0 -7
- data/templates/css/console.css +0 -24
- data/templates/css/filesystem.css +0 -42
- data/templates/css/pygments-autumn.css +0 -59
- data/templates/files.erb +0 -14
- data/templates/images/LICENSE +0 -22
- data/templates/images/folder.png +0 -0
- data/templates/images/page_white.png +0 -0
- data/templates/images/page_white_gherkin.png +0 -0
- data/templates/images/page_white_ruby.png +0 -0
- data/templates/index.erb +0 -20
- data/templates/js/filesystem.js +0 -5
- data/templates/js/jquery-1.11.3.min.js +0 -5
- data/templates/main.erb +0 -34
|
@@ -9,15 +9,7 @@ module Aruba
|
|
|
9
9
|
attr_reader :other_env, :block
|
|
10
10
|
|
|
11
11
|
def initialize(other_env, &block)
|
|
12
|
-
@other_env = other_env
|
|
13
|
-
|
|
14
|
-
@other_env = if RUBY_VERSION <= '1.9.3'
|
|
15
|
-
# rubocop:disable Style/EachWithObject
|
|
16
|
-
@other_env.to_hash.inject({}) { |a, (k, v)| a[k] = v.to_s; a }
|
|
17
|
-
# rubocop:enable Style/EachWithObject
|
|
18
|
-
else
|
|
19
|
-
@other_env.to_h.each_with_object({}) { |(k, v), a| a[k] = v.to_s }
|
|
20
|
-
end
|
|
12
|
+
@other_env = other_env.to_h.each_with_object({}) { |(k, v), a| a[k] = v.to_s }
|
|
21
13
|
|
|
22
14
|
@block = if block_given?
|
|
23
15
|
block
|
|
@@ -60,11 +52,7 @@ module Aruba
|
|
|
60
52
|
def initialize(env = ENV)
|
|
61
53
|
@actions = []
|
|
62
54
|
|
|
63
|
-
@env =
|
|
64
|
-
env.to_hash
|
|
65
|
-
else
|
|
66
|
-
env.to_h
|
|
67
|
-
end
|
|
55
|
+
@env = env.to_h
|
|
68
56
|
end
|
|
69
57
|
|
|
70
58
|
# Update environment with other en
|
|
@@ -77,7 +65,7 @@ module Aruba
|
|
|
77
65
|
def update(other_env)
|
|
78
66
|
actions << UpdateAction.new(other_env)
|
|
79
67
|
|
|
80
|
-
|
|
68
|
+
self
|
|
81
69
|
end
|
|
82
70
|
|
|
83
71
|
# Fetch variable from environment
|
|
@@ -137,7 +125,7 @@ module Aruba
|
|
|
137
125
|
name = name.to_s
|
|
138
126
|
value = self[name].to_s + value.to_s
|
|
139
127
|
|
|
140
|
-
actions << UpdateAction.new(name => value
|
|
128
|
+
actions << UpdateAction.new(name => value)
|
|
141
129
|
|
|
142
130
|
value
|
|
143
131
|
end
|
|
@@ -188,11 +176,7 @@ module Aruba
|
|
|
188
176
|
# @return [Hash]
|
|
189
177
|
# A new hash from environment
|
|
190
178
|
def to_h
|
|
191
|
-
|
|
192
|
-
Marshal.load(Marshal.dump(prepared_environment.to_hash))
|
|
193
|
-
else
|
|
194
|
-
Marshal.load(Marshal.dump(prepared_environment.to_h))
|
|
195
|
-
end
|
|
179
|
+
actions.inject(hash_from_env.merge(env)) { |a, e| e.call(a) }
|
|
196
180
|
end
|
|
197
181
|
|
|
198
182
|
# Reset environment
|
|
@@ -204,14 +188,21 @@ module Aruba
|
|
|
204
188
|
value
|
|
205
189
|
end
|
|
206
190
|
|
|
191
|
+
def nest
|
|
192
|
+
old_actions = @actions.dup
|
|
193
|
+
yield(self)
|
|
194
|
+
ensure
|
|
195
|
+
@actions = old_actions
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def self.hash_from_env
|
|
199
|
+
ENV.to_hash
|
|
200
|
+
end
|
|
201
|
+
|
|
207
202
|
private
|
|
208
203
|
|
|
209
|
-
def
|
|
210
|
-
|
|
211
|
-
actions.inject(ENV.to_hash.merge(env)) { |a, e| e.call(a) }
|
|
212
|
-
else
|
|
213
|
-
actions.each_with_object(ENV.to_hash.merge(env)) { |e, a| a = e.call(a) }
|
|
214
|
-
end
|
|
204
|
+
def hash_from_env
|
|
205
|
+
self.class.hash_from_env
|
|
215
206
|
end
|
|
216
207
|
end
|
|
217
208
|
end
|
|
@@ -62,8 +62,8 @@ module Aruba
|
|
|
62
62
|
DetermineFileSize.new.call(*args)
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
-
def determine_disk_usage(
|
|
66
|
-
DetermineDiskUsage.new.call(
|
|
65
|
+
def determine_disk_usage(paths)
|
|
66
|
+
DetermineDiskUsage.new.call(paths)
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
def create_file(*args)
|
|
@@ -83,7 +83,7 @@ module Aruba
|
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
def detect_ruby(cmd)
|
|
86
|
-
if
|
|
86
|
+
if /^ruby\s/.match?(cmd)
|
|
87
87
|
cmd.gsub(/^ruby\s/, "#{current_ruby} ")
|
|
88
88
|
else
|
|
89
89
|
cmd
|
|
@@ -98,20 +98,8 @@ module Aruba
|
|
|
98
98
|
::File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
|
|
99
99
|
end
|
|
100
100
|
|
|
101
|
-
# @deprecated
|
|
102
|
-
# Add newline at the end
|
|
103
|
-
def ensure_newline(str)
|
|
104
|
-
deprecated('The use of "#ensure_newline" is deprecated. It will be removed soon')
|
|
105
|
-
|
|
106
|
-
str.chomp << "\n"
|
|
107
|
-
end
|
|
108
|
-
|
|
109
101
|
def require_matching_files(pattern, base)
|
|
110
|
-
|
|
111
|
-
::Dir.glob(::File.expand_path(pattern, base)).each { |f| require File.join(File.dirname(f), File.basename(f, '.rb')) }
|
|
112
|
-
else
|
|
113
|
-
::Dir.glob(::File.expand_path(pattern, base)).each { |f| require_relative f }
|
|
114
|
-
end
|
|
102
|
+
::Dir.glob(::File.expand_path(pattern, base)).each { |f| require_relative f }
|
|
115
103
|
end
|
|
116
104
|
|
|
117
105
|
# Create directory and subdirectories
|
|
@@ -125,7 +113,7 @@ module Aruba
|
|
|
125
113
|
def rm(paths, options = {})
|
|
126
114
|
paths = Array(paths).map { |p| ::File.expand_path(p) }
|
|
127
115
|
|
|
128
|
-
FileUtils.rm_r(paths, options)
|
|
116
|
+
FileUtils.rm_r(paths, **options)
|
|
129
117
|
end
|
|
130
118
|
|
|
131
119
|
# Get current working directory
|
|
@@ -144,22 +132,22 @@ module Aruba
|
|
|
144
132
|
|
|
145
133
|
# Touch file, directory
|
|
146
134
|
def touch(args, options)
|
|
147
|
-
FileUtils.touch(args, options)
|
|
135
|
+
FileUtils.touch(args, **options)
|
|
148
136
|
end
|
|
149
137
|
|
|
150
138
|
# Copy file/directory
|
|
151
|
-
def cp(
|
|
152
|
-
FileUtils.cp_r(
|
|
139
|
+
def cp(src, dest)
|
|
140
|
+
FileUtils.cp_r(src, dest)
|
|
153
141
|
end
|
|
154
142
|
|
|
155
143
|
# Move file/directory
|
|
156
|
-
def mv(
|
|
157
|
-
FileUtils.mv(
|
|
144
|
+
def mv(src, dest)
|
|
145
|
+
FileUtils.mv(src, dest)
|
|
158
146
|
end
|
|
159
147
|
|
|
160
148
|
# Change mode of file/directory
|
|
161
149
|
def chmod(mode, args, options)
|
|
162
|
-
FileUtils.chmod_R(mode, args, options)
|
|
150
|
+
FileUtils.chmod_R(mode, args, **options)
|
|
163
151
|
end
|
|
164
152
|
|
|
165
153
|
# Exists and is file
|
|
@@ -199,7 +187,7 @@ module Aruba
|
|
|
199
187
|
|
|
200
188
|
# Check if command is relative
|
|
201
189
|
#
|
|
202
|
-
# @return [
|
|
190
|
+
# @return [Boolean]
|
|
203
191
|
# true
|
|
204
192
|
# * bin/command.sh
|
|
205
193
|
#
|
|
@@ -207,13 +195,13 @@ module Aruba
|
|
|
207
195
|
# * /bin/command.sh
|
|
208
196
|
# * command.sh
|
|
209
197
|
def relative_command?(path)
|
|
210
|
-
p =
|
|
211
|
-
p.relative? && p.
|
|
198
|
+
p = Pathname.new(path)
|
|
199
|
+
p.relative? && p.basename != p
|
|
212
200
|
end
|
|
213
201
|
|
|
214
202
|
# Check if command is relative
|
|
215
203
|
#
|
|
216
|
-
# @return [
|
|
204
|
+
# @return [Boolean]
|
|
217
205
|
# true
|
|
218
206
|
# * command.sh
|
|
219
207
|
#
|
|
@@ -227,30 +215,7 @@ module Aruba
|
|
|
227
215
|
|
|
228
216
|
# Write to file
|
|
229
217
|
def write_file(path, content)
|
|
230
|
-
|
|
231
|
-
File.open(path, 'wb') do |f|
|
|
232
|
-
f.print content
|
|
233
|
-
end
|
|
234
|
-
else
|
|
235
|
-
File.write(path, content)
|
|
236
|
-
end
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
# Unescape string
|
|
240
|
-
#
|
|
241
|
-
# @param [String] string
|
|
242
|
-
# The string which should be unescaped, e.g. the output of a command
|
|
243
|
-
#
|
|
244
|
-
# @return
|
|
245
|
-
# The string stripped from escape sequences
|
|
246
|
-
def unescape(string, keep_ansi = true)
|
|
247
|
-
# rubocop:disable Metrics/LineLength
|
|
248
|
-
deprecated('The use of "Aruba.platform.unescape" is deprecated. Please use "#unescape_text" and "#sanitize_text" instead. But be aware it uses a different implementation')
|
|
249
|
-
# rubocop:enable Metrics/LineLength
|
|
250
|
-
|
|
251
|
-
string = string.gsub('\n', "\n").gsub('\"', '"').gsub('\e', "\e")
|
|
252
|
-
string = string.gsub(/\e\[\d+(?>(;\d+)*)m/, '') unless keep_ansi
|
|
253
|
-
string
|
|
218
|
+
File.write(path, content)
|
|
254
219
|
end
|
|
255
220
|
|
|
256
221
|
# Transform hash to a string table which can be output on stderr/stdout
|
|
@@ -271,6 +236,10 @@ module Aruba
|
|
|
271
236
|
def which(program, path = ENV['PATH'])
|
|
272
237
|
UnixWhich.new.call(program, path)
|
|
273
238
|
end
|
|
239
|
+
|
|
240
|
+
def builtin_shell_commands
|
|
241
|
+
[]
|
|
242
|
+
end
|
|
274
243
|
end
|
|
275
244
|
end
|
|
276
245
|
end
|
|
@@ -23,7 +23,7 @@ module Aruba
|
|
|
23
23
|
Aruba.platform.absolute_path?(program) || Aruba.platform.relative_command?(program)
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
def call(program,
|
|
26
|
+
def call(program, _path)
|
|
27
27
|
return File.expand_path(program) if Aruba.platform.executable?(program)
|
|
28
28
|
|
|
29
29
|
nil
|
|
@@ -72,6 +72,7 @@ module Aruba
|
|
|
72
72
|
# ENV['PATH']
|
|
73
73
|
def call(program, path = ENV['PATH'])
|
|
74
74
|
raise ArgumentError, "ENV['PATH'] cannot be empty" if path.nil? || path.empty?
|
|
75
|
+
|
|
75
76
|
program = program.to_s
|
|
76
77
|
|
|
77
78
|
whiches.find { |w| w.match? program }.new.call(program, path)
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
require 'delegate'
|
|
2
|
-
|
|
3
1
|
# Aruba
|
|
4
2
|
module Aruba
|
|
5
3
|
# Platforms
|
|
@@ -9,20 +7,27 @@ module Aruba
|
|
|
9
7
|
# This adds `cmd.exec` in front of commmand
|
|
10
8
|
#
|
|
11
9
|
# @private
|
|
12
|
-
class WindowsCommandString
|
|
10
|
+
class WindowsCommandString
|
|
11
|
+
def initialize(command, *arguments)
|
|
12
|
+
@command = command
|
|
13
|
+
@arguments = arguments
|
|
14
|
+
end
|
|
15
|
+
|
|
13
16
|
# Convert to array
|
|
14
17
|
def to_a
|
|
15
|
-
[cmd_path, '/c',
|
|
18
|
+
[cmd_path, '/c', [escaped_command, *escaped_arguments].join(' ')]
|
|
16
19
|
end
|
|
17
20
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def escaped_arguments
|
|
24
|
+
@arguments.map { |arg| arg.gsub(/"/, '"""') }
|
|
25
|
+
.map { |arg| / /.match?(arg) ? "\"#{arg}\"" : arg }
|
|
23
26
|
end
|
|
24
27
|
|
|
25
|
-
|
|
28
|
+
def escaped_command
|
|
29
|
+
@command.gsub(/ /, '""" """')
|
|
30
|
+
end
|
|
26
31
|
|
|
27
32
|
def cmd_path
|
|
28
33
|
Aruba.platform.which('cmd.exe')
|
|
@@ -5,56 +5,41 @@ module Aruba
|
|
|
5
5
|
# Platforms
|
|
6
6
|
module Platforms
|
|
7
7
|
# Windows is case-insensitive when it accesses its environment variables.
|
|
8
|
-
# That means that at the Windows command line:
|
|
9
8
|
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
# C:>Path=.;.\bin;c:\rubys\ruby-2.1.6-p336\bin;
|
|
9
|
+
# To work around this we turn all of the environment variable keys to
|
|
10
|
+
# upper-case so that aruba is ensured that accessing environment variables
|
|
11
|
+
# with upper-case keys will always work. See the following examples.
|
|
14
12
|
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
13
|
+
# @example Setting Windows environment variables using mixed case
|
|
14
|
+
# C:>set Path
|
|
15
|
+
# C:>Path=.;.\bin;c:\rubys\ruby-2.1.6-p336\bin;
|
|
16
|
+
# C:>set PATH
|
|
17
|
+
# C:>Path=.;.\bin;c:\rubys\ruby-2.1.6-p336\bin;
|
|
17
18
|
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
# => ".;.\bin;c:\rubys\ruby-2.1.6-p336\bin;"
|
|
19
|
+
# @example If you access environment variables through ENV, you can access values no matter the case of the key:
|
|
20
|
+
# ENV["Path"] # => ".;.\bin;c:\rubys\ruby-2.1.6-p336\bin;"
|
|
21
|
+
# ENV["PATH"] # => ".;.\bin;c:\rubys\ruby-2.1.6-p336\bin;"
|
|
22
22
|
#
|
|
23
|
-
# But if you copy the ENV to a hash, Ruby treats the keys as case sensitive:
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
#
|
|
30
|
-
#
|
|
31
|
-
#
|
|
32
|
-
#
|
|
33
|
-
#
|
|
34
|
-
#
|
|
23
|
+
# @example But if you copy the ENV to a hash, Ruby treats the keys as case sensitive:
|
|
24
|
+
# env_copy = ENV.to_hash
|
|
25
|
+
# # => {
|
|
26
|
+
# "ALLUSERSPROFILE"=>
|
|
27
|
+
# "C:\\ProgramData",
|
|
28
|
+
# "ANSICON"=>"119x1000 (119x58)",
|
|
29
|
+
# "ANSICON_DEF"=>"7",
|
|
30
|
+
# APPDATA" => "C:\\Users\\blorf\\AppData\\Roaming", ....
|
|
31
|
+
# }
|
|
32
|
+
# env["Path"]
|
|
33
|
+
# # => ".;.\bin;c:\rubys\ruby-2.1.6-p336\bin;"
|
|
34
|
+
# env["PATH"]
|
|
35
|
+
# # => nil
|
|
35
36
|
class WindowsEnvironmentVariables < UnixEnvironmentVariables
|
|
36
|
-
def initialize(env = ENV
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
@env = if RUBY_VERSION <= '1.9.3'
|
|
40
|
-
# rubocop:disable Style/EachWithObject
|
|
41
|
-
env.inject({}) { |a, (k,v)| a[k.to_s.upcase] = v; a }
|
|
42
|
-
# rubocop:enable Style/EachWithObject
|
|
43
|
-
else
|
|
44
|
-
env.each_with_object({}) { |(k,v), a| a[k.to_s.upcase] = v }
|
|
45
|
-
end
|
|
37
|
+
def initialize(env = ENV)
|
|
38
|
+
super(upcase_env env)
|
|
46
39
|
end
|
|
47
40
|
|
|
48
41
|
def update(other_env, &block)
|
|
49
|
-
other_env
|
|
50
|
-
# rubocop:disable Style/EachWithObject
|
|
51
|
-
other_env.inject({}) { |a, (k,v)| a[k.to_s.upcase] = v; a }
|
|
52
|
-
# rubocop:enable Style/EachWithObject
|
|
53
|
-
else
|
|
54
|
-
other_env.each_with_object({}) { |(k,v), a| a[k.to_s.upcase] = v }
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
super(other_env, &block)
|
|
42
|
+
super(upcase_env(other_env), &block)
|
|
58
43
|
end
|
|
59
44
|
|
|
60
45
|
def fetch(name, default = UnixEnvironmentVariables::UNDEFINED)
|
|
@@ -81,8 +66,22 @@ module Aruba
|
|
|
81
66
|
super(name.upcase, value)
|
|
82
67
|
end
|
|
83
68
|
|
|
84
|
-
def delete(name
|
|
85
|
-
super(name.upcase
|
|
69
|
+
def delete(name)
|
|
70
|
+
super(name.upcase)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def self.hash_from_env
|
|
74
|
+
upcase_env(ENV)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def self.upcase_env(env)
|
|
78
|
+
env.each_with_object({}) { |(k, v), a| a[k.to_s.upcase] = v }
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
private
|
|
82
|
+
|
|
83
|
+
def upcase_env(env)
|
|
84
|
+
self.class.upcase_env(env)
|
|
86
85
|
end
|
|
87
86
|
end
|
|
88
87
|
end
|
|
@@ -23,11 +23,12 @@ module Aruba
|
|
|
23
23
|
Aruba.platform.absolute_path?(program) || Aruba.platform.relative_command?(program)
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
def call(program,
|
|
26
|
+
def call(program, _path)
|
|
27
27
|
# Expand `#path_exts`
|
|
28
28
|
found = Dir[program].first
|
|
29
29
|
|
|
30
30
|
return File.expand_path(found) if found && Aruba.platform.executable?(found)
|
|
31
|
+
|
|
31
32
|
nil
|
|
32
33
|
end
|
|
33
34
|
end
|
|
@@ -48,7 +49,7 @@ module Aruba
|
|
|
48
49
|
file = File.join(dir, program)
|
|
49
50
|
# Dir[] doesn't handle backslashes properly, so convert them. Also, if
|
|
50
51
|
# the program name doesn't have an extension, try them all.
|
|
51
|
-
file = file.tr(
|
|
52
|
+
file = file.tr('\\', '/')
|
|
52
53
|
|
|
53
54
|
found = Dir[file].first
|
|
54
55
|
|
|
@@ -95,7 +96,7 @@ module Aruba
|
|
|
95
96
|
private
|
|
96
97
|
|
|
97
98
|
def windows_executable_extentions
|
|
98
|
-
ENV['PATHEXT'] ? format('.{%s}', ENV['PATHEXT'].tr(';', ',').tr('.','')).downcase : '.{exe,com,bat}'
|
|
99
|
+
ENV['PATHEXT'] ? format('.{%s}', ENV['PATHEXT'].tr(';', ',').tr('.', '')).downcase : '.{exe,com,bat}'
|
|
99
100
|
end
|
|
100
101
|
end
|
|
101
102
|
end
|
|
@@ -11,9 +11,12 @@ module Aruba
|
|
|
11
11
|
#
|
|
12
12
|
# @private
|
|
13
13
|
class BasicProcess
|
|
14
|
-
attr_reader :exit_status, :environment, :working_directory, :main_class,
|
|
14
|
+
attr_reader :exit_status, :environment, :working_directory, :main_class,
|
|
15
|
+
:io_wait_timeout, :exit_timeout, :startup_wait_time, :stop_signal
|
|
15
16
|
|
|
16
|
-
def initialize(cmd, exit_timeout, io_wait_timeout, working_directory,
|
|
17
|
+
def initialize(cmd, exit_timeout, io_wait_timeout, working_directory,
|
|
18
|
+
environment = Aruba.platform.environment_variables.hash_from_env,
|
|
19
|
+
main_class = nil, stop_signal = nil, startup_wait_time = 0)
|
|
17
20
|
@cmd = cmd
|
|
18
21
|
@working_directory = working_directory
|
|
19
22
|
@environment = environment
|
|
@@ -36,7 +39,7 @@ module Aruba
|
|
|
36
39
|
|
|
37
40
|
# Output pid of process
|
|
38
41
|
def pid
|
|
39
|
-
|
|
42
|
+
raise NotImplementedError
|
|
40
43
|
end
|
|
41
44
|
|
|
42
45
|
# Output stderr and stdout
|
|
@@ -45,39 +48,39 @@ module Aruba
|
|
|
45
48
|
end
|
|
46
49
|
|
|
47
50
|
def write(*)
|
|
48
|
-
NotImplementedError
|
|
51
|
+
raise NotImplementedError
|
|
49
52
|
end
|
|
50
53
|
|
|
51
54
|
def stdin(*)
|
|
52
|
-
NotImplementedError
|
|
55
|
+
raise NotImplementedError
|
|
53
56
|
end
|
|
54
57
|
|
|
55
58
|
def stdout(*)
|
|
56
|
-
NotImplementedError
|
|
59
|
+
raise NotImplementedError
|
|
57
60
|
end
|
|
58
61
|
|
|
59
62
|
def stderr(*)
|
|
60
|
-
NotImplementedError
|
|
63
|
+
raise NotImplementedError
|
|
61
64
|
end
|
|
62
65
|
|
|
63
66
|
def close_io(*)
|
|
64
|
-
NotImplementedError
|
|
67
|
+
raise NotImplementedError
|
|
65
68
|
end
|
|
66
69
|
|
|
67
70
|
def send_signal(*)
|
|
68
|
-
NotImplementedError
|
|
71
|
+
raise NotImplementedError
|
|
69
72
|
end
|
|
70
73
|
|
|
71
74
|
def filesystem_status
|
|
72
|
-
NotImplementedError
|
|
75
|
+
raise NotImplementedError
|
|
73
76
|
end
|
|
74
77
|
|
|
75
78
|
def content
|
|
76
|
-
NotImplementedError
|
|
79
|
+
raise NotImplementedError
|
|
77
80
|
end
|
|
78
81
|
|
|
79
82
|
def wait
|
|
80
|
-
NotImplementedError
|
|
83
|
+
raise NotImplementedError
|
|
81
84
|
end
|
|
82
85
|
|
|
83
86
|
# Restart a command
|
|
@@ -101,14 +104,6 @@ module Aruba
|
|
|
101
104
|
@timed_out == true
|
|
102
105
|
end
|
|
103
106
|
|
|
104
|
-
# @deprecated
|
|
105
|
-
# @private
|
|
106
|
-
def run!
|
|
107
|
-
Aruba.platform.deprecated('The use of "command#run!" is deprecated. You can simply use "command#start" instead.')
|
|
108
|
-
|
|
109
|
-
start
|
|
110
|
-
end
|
|
111
|
-
|
|
112
107
|
# Hook which is run before command is run
|
|
113
108
|
def before_run; end
|
|
114
109
|
|
|
@@ -116,19 +111,14 @@ module Aruba
|
|
|
116
111
|
def after_run; end
|
|
117
112
|
|
|
118
113
|
def inspect
|
|
119
|
-
out = stdout(:
|
|
114
|
+
out = truncate(stdout(wait_for_io: 0).inspect, 35)
|
|
115
|
+
err = truncate(stderr(wait_for_io: 0).inspect, 35)
|
|
120
116
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
else
|
|
124
|
-
out
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
format '#<%s:%s commandline="%s": output="%s">', self.class, self.object_id, commandline, out
|
|
117
|
+
fmt = '#<%s:%s commandline="%s": stdout=%s stderr=%s>'
|
|
118
|
+
format fmt, self.class, object_id, commandline, out, err
|
|
128
119
|
end
|
|
129
|
-
alias to_s inspect
|
|
130
120
|
|
|
131
|
-
|
|
121
|
+
alias to_s inspect
|
|
132
122
|
|
|
133
123
|
def command
|
|
134
124
|
Shellwords.split(commandline).first
|
|
@@ -139,6 +129,14 @@ module Aruba
|
|
|
139
129
|
|
|
140
130
|
[]
|
|
141
131
|
end
|
|
132
|
+
|
|
133
|
+
private
|
|
134
|
+
|
|
135
|
+
def truncate(string, max_length)
|
|
136
|
+
return string if string.length <= max_length
|
|
137
|
+
|
|
138
|
+
string[0, max_length - 1] + ' ...'
|
|
139
|
+
end
|
|
142
140
|
end
|
|
143
141
|
end
|
|
144
142
|
end
|
|
@@ -4,10 +4,14 @@ require 'aruba/processes/spawn_process'
|
|
|
4
4
|
module Aruba
|
|
5
5
|
# Processes
|
|
6
6
|
module Processes
|
|
7
|
-
# Run your command in `
|
|
7
|
+
# Run your command in `system()` to make debugging it easier. This will
|
|
8
|
+
# make the process use the default input and output streams so the
|
|
9
|
+
# developer can interact with it directly. This means that part of Aruba's
|
|
10
|
+
# functionality is disabled. I.e., checks for output, and passing input
|
|
11
|
+
# programmatically will not work.
|
|
8
12
|
#
|
|
9
|
-
# `DebugProcess` is not meant for direct use - `
|
|
10
|
-
# users. Only
|
|
13
|
+
# `DebugProcess` is not meant for direct use - `DebugProcess.new` - by
|
|
14
|
+
# users. Only its public methods are part of the public API of aruba, e.g.
|
|
11
15
|
# `#stdin`, `#stdout`.
|
|
12
16
|
#
|
|
13
17
|
# @private
|
|
@@ -18,6 +22,7 @@ module Aruba
|
|
|
18
22
|
end
|
|
19
23
|
|
|
20
24
|
def start
|
|
25
|
+
@started = true
|
|
21
26
|
Dir.chdir @working_directory do
|
|
22
27
|
Aruba.platform.with_environment(environment) do
|
|
23
28
|
@exit_status = system(command, *arguments) ? 0 : 1
|
|
@@ -64,6 +69,10 @@ module Aruba
|
|
|
64
69
|
def terminate(*)
|
|
65
70
|
stop
|
|
66
71
|
end
|
|
72
|
+
|
|
73
|
+
def interactive?
|
|
74
|
+
true
|
|
75
|
+
end
|
|
67
76
|
end
|
|
68
77
|
end
|
|
69
78
|
end
|
|
@@ -33,19 +33,22 @@ module Aruba
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def exit(exitstatus)
|
|
36
|
-
@exitstatus =
|
|
36
|
+
@exitstatus =
|
|
37
|
+
case exitstatus
|
|
38
|
+
when Numeric then Integer(exitstatus)
|
|
39
|
+
when TrueClass then 0
|
|
40
|
+
when FalseClass then 1
|
|
41
|
+
else raise TypeError, "no implicit conversion of #{exitstatus.class} into Integer"
|
|
42
|
+
end
|
|
37
43
|
end
|
|
38
44
|
end
|
|
39
45
|
|
|
40
|
-
class << self
|
|
41
|
-
# @deprecated
|
|
42
|
-
attr_accessor :main_class
|
|
43
|
-
end
|
|
44
|
-
|
|
45
46
|
# @private
|
|
46
47
|
attr_reader :main_class
|
|
47
48
|
|
|
48
|
-
def initialize(cmd, exit_timeout, io_wait_timeout, working_directory,
|
|
49
|
+
def initialize(cmd, exit_timeout, io_wait_timeout, working_directory,
|
|
50
|
+
environment = Aruba.platform.environment_variables.hash_from_env,
|
|
51
|
+
main_class = nil, stop_signal = nil, startup_wait_time = 0)
|
|
49
52
|
@cmd = cmd
|
|
50
53
|
@argv = arguments
|
|
51
54
|
@stdin = StringIO.new
|
|
@@ -58,7 +61,9 @@ module Aruba
|
|
|
58
61
|
|
|
59
62
|
# Start command
|
|
60
63
|
def start
|
|
61
|
-
fail
|
|
64
|
+
fail 'You need to call aruba.config.main_class = YourMainClass' unless main_class
|
|
65
|
+
|
|
66
|
+
@started = true
|
|
62
67
|
|
|
63
68
|
Dir.chdir @working_directory do
|
|
64
69
|
before_run
|
|
@@ -120,6 +125,10 @@ module Aruba
|
|
|
120
125
|
def pid
|
|
121
126
|
$PROCESS_ID
|
|
122
127
|
end
|
|
128
|
+
|
|
129
|
+
def interactive?
|
|
130
|
+
false
|
|
131
|
+
end
|
|
123
132
|
end
|
|
124
133
|
end
|
|
125
134
|
end
|