aruba 1.0.0.pre.alpha.5 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +153 -28
- data/CONTRIBUTING.md +0 -9
- data/LICENSE +1 -1
- data/README.md +37 -30
- data/lib/aruba/api.rb +0 -1
- data/lib/aruba/api/bundler.rb +17 -2
- data/lib/aruba/api/commands.rb +15 -16
- data/lib/aruba/api/core.rb +64 -50
- data/lib/aruba/api/environment.rb +12 -4
- data/lib/aruba/api/filesystem.rb +32 -46
- data/lib/aruba/api/text.rb +15 -3
- data/lib/aruba/aruba_path.rb +23 -95
- data/lib/aruba/basic_configuration.rb +46 -65
- data/lib/aruba/basic_configuration/option.rb +2 -2
- data/lib/aruba/cli.rb +4 -1
- data/lib/aruba/config/jruby.rb +1 -1
- data/lib/aruba/config_wrapper.rb +17 -4
- data/lib/aruba/configuration.rb +29 -22
- data/lib/aruba/console.rb +0 -2
- data/lib/aruba/console/help.rb +8 -5
- data/lib/aruba/contracts/absolute_path.rb +3 -3
- data/lib/aruba/contracts/is_power_of_two.rb +2 -2
- data/lib/aruba/contracts/relative_path.rb +3 -3
- data/lib/aruba/cucumber/command.rb +93 -82
- data/lib/aruba/cucumber/file.rb +43 -23
- data/lib/aruba/cucumber/hooks.rb +4 -1
- data/lib/aruba/cucumber/testing_frameworks.rb +14 -12
- data/lib/aruba/event_bus.rb +4 -2
- data/lib/aruba/event_bus/name_resolver.rb +9 -8
- data/lib/aruba/events.rb +2 -1
- data/lib/aruba/hooks.rb +2 -4
- data/lib/aruba/in_config_wrapper.rb +8 -5
- data/lib/aruba/initializer.rb +9 -3
- data/lib/aruba/matchers/base/base_matcher.rb +2 -11
- data/lib/aruba/matchers/base/message_indenter.rb +1 -1
- data/lib/aruba/matchers/base/object_formatter.rb +0 -5
- data/lib/aruba/matchers/collection/include_an_object.rb +4 -4
- data/lib/aruba/matchers/command/be_successfully_executed.rb +3 -1
- data/lib/aruba/matchers/command/have_exit_status.rb +3 -1
- data/lib/aruba/matchers/command/have_finished_in_time.rb +3 -1
- data/lib/aruba/matchers/command/have_output.rb +3 -1
- data/lib/aruba/matchers/command/have_output_on_stderr.rb +3 -1
- data/lib/aruba/matchers/command/have_output_on_stdout.rb +3 -1
- data/lib/aruba/matchers/directory/have_sub_directory.rb +8 -3
- data/lib/aruba/matchers/file/have_file_size.rb +4 -2
- data/lib/aruba/matchers/path/have_permissions.rb +7 -4
- data/lib/aruba/platforms/announcer.rb +25 -11
- data/lib/aruba/platforms/aruba_file_creator.rb +3 -1
- data/lib/aruba/platforms/aruba_fixed_size_file_creator.rb +7 -2
- data/lib/aruba/platforms/aruba_logger.rb +10 -9
- data/lib/aruba/platforms/command_monitor.rb +4 -6
- data/lib/aruba/platforms/determine_disk_usage.rb +55 -20
- data/lib/aruba/platforms/filesystem_status.rb +19 -13
- data/lib/aruba/platforms/simple_table.rb +2 -2
- data/lib/aruba/platforms/unix_environment_variables.rb +9 -4
- data/lib/aruba/platforms/unix_platform.rb +10 -10
- data/lib/aruba/platforms/unix_which.rb +1 -1
- data/lib/aruba/platforms/windows_command_string.rb +1 -1
- data/lib/aruba/platforms/windows_environment_variables.rb +2 -1
- data/lib/aruba/platforms/windows_platform.rb +3 -3
- data/lib/aruba/platforms/windows_which.rb +6 -2
- data/lib/aruba/processes/basic_process.rb +4 -6
- data/lib/aruba/processes/debug_process.rb +4 -2
- data/lib/aruba/processes/in_process.rb +5 -3
- data/lib/aruba/processes/spawn_process.rb +27 -16
- data/lib/aruba/rspec.rb +25 -15
- data/lib/aruba/runtime.rb +11 -4
- data/lib/aruba/setup.rb +23 -10
- data/lib/aruba/tasks/docker_helpers.rb +3 -1
- data/lib/aruba/version.rb +1 -1
- metadata +96 -109
- data/.cucumberproignore +0 -3
- data/.document +0 -5
- data/.github/ISSUE_TEMPLATE.md +0 -48
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -41
- data/.gitignore +0 -38
- data/.rspec +0 -3
- data/.rubocop.yml +0 -31
- data/.rubocop_todo.yml +0 -258
- data/.simplecov +0 -34
- data/.travis.yml +0 -73
- data/.yardopts +0 -11
- data/Dockerfile +0 -67
- data/Gemfile +0 -15
- data/Rakefile +0 -92
- data/TODO.md +0 -13
- data/appveyor.yml +0 -30
- data/aruba.gemspec +0 -46
- data/bin/console +0 -7
- data/bin/test +0 -9
- data/config/.gitignore +0 -1
- data/cucumber.yml +0 -6
- data/docker-compose.yml +0 -26
- data/fixtures/cli-app/.gitignore +0 -9
- data/fixtures/cli-app/.rspec +0 -2
- data/fixtures/cli-app/README.md +0 -39
- data/fixtures/cli-app/Rakefile +0 -1
- data/fixtures/cli-app/bin/aruba-test-cli +0 -6
- data/fixtures/cli-app/cli-app.gemspec +0 -25
- data/fixtures/cli-app/features/support/aruba.rb +0 -1
- data/fixtures/cli-app/features/support/env.rb +0 -1
- data/fixtures/cli-app/lib/cli/app.rb +0 -9
- data/fixtures/cli-app/lib/cli/app/suppress_simple_cov_output.rb +0 -15
- data/fixtures/cli-app/lib/cli/app/version.rb +0 -5
- data/fixtures/cli-app/script/console +0 -14
- data/fixtures/cli-app/spec/spec_helper.rb +0 -7
- data/fixtures/cli-app/spec/support/aruba.rb +0 -1
- data/fixtures/copy/file.txt +0 -1
- data/fixtures/empty-app/.gitignore +0 -9
- data/fixtures/empty-app/.rspec +0 -2
- data/fixtures/empty-app/README.md +0 -24
- data/fixtures/empty-app/Rakefile +0 -1
- data/fixtures/empty-app/cli-app.gemspec +0 -25
- data/fixtures/empty-app/lib/cli/app.rb +0 -7
- data/fixtures/empty-app/lib/cli/app/version.rb +0 -5
- data/fixtures/getting-started-app/.gitignore +0 -4
- data/fixtures/getting-started-app/Gemfile +0 -4
- data/fixtures/getting-started-app/README.md +0 -3
- data/fixtures/getting-started-app/features/support/env.rb +0 -1
- data/lib/aruba/extensions/string/strip.rb +0 -25
- data/lib/aruba/platforms/disk_usage_calculator.rb +0 -20
@@ -12,9 +12,6 @@ module Aruba
|
|
12
12
|
prepare_for_inspection(object).inspect
|
13
13
|
end
|
14
14
|
|
15
|
-
# rubocop:disable MethodLength
|
16
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
17
|
-
|
18
15
|
# @private
|
19
16
|
# Prepares the provided object to be formatted by wrapping it as needed
|
20
17
|
# in something that, when `inspect` is called on it, will produce the
|
@@ -47,8 +44,6 @@ module Aruba
|
|
47
44
|
|
48
45
|
InspectableItem.new(inspection)
|
49
46
|
end
|
50
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
51
|
-
# rubocop:enable MethodLength
|
52
47
|
|
53
48
|
# @private
|
54
49
|
def self.prepare_hash(input)
|
@@ -29,9 +29,7 @@ module Aruba
|
|
29
29
|
# @api private
|
30
30
|
# @return [String]
|
31
31
|
def failure_message
|
32
|
-
unless iterable?
|
33
|
-
return "#{improve_hash_formatting(super)}, but was not iterable"
|
34
|
-
end
|
32
|
+
return "#{improve_hash_formatting(super)}, but was not iterable" unless iterable?
|
35
33
|
|
36
34
|
return failed_objects.first if failed_objects.size == 1
|
37
35
|
|
@@ -91,7 +89,9 @@ module Aruba
|
|
91
89
|
|
92
90
|
def failure_message_for_item(index, failure_message)
|
93
91
|
failure_message = indent_multiline_message(add_new_line_if_needed(failure_message))
|
94
|
-
indent_multiline_message(
|
92
|
+
indent_multiline_message(
|
93
|
+
"object at index #{index} failed to match:#{failure_message}"
|
94
|
+
)
|
95
95
|
end
|
96
96
|
|
97
97
|
def add_new_line_if_needed(message)
|
@@ -29,7 +29,9 @@ RSpec::Matchers.define :be_successfully_executed do
|
|
29
29
|
end
|
30
30
|
|
31
31
|
failure_message do |_actual|
|
32
|
-
"Expected `#{@actual}` to succeed
|
32
|
+
"Expected `#{@actual}` to succeed" \
|
33
|
+
' but got non-zero exit status and the following output:' \
|
34
|
+
"\n\n#{@old_actual.output}\n"
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
@@ -23,7 +23,9 @@ RSpec::Matchers.define :have_exit_status do |expected|
|
|
23
23
|
@old_actual.stop
|
24
24
|
@actual = actual.exit_status
|
25
25
|
|
26
|
-
|
26
|
+
unless @old_actual.respond_to? :exit_status
|
27
|
+
raise "Expected #{@old_actual} to respond to #exit_status"
|
28
|
+
end
|
27
29
|
|
28
30
|
values_match? expected, @actual
|
29
31
|
end
|
@@ -24,7 +24,9 @@ RSpec::Matchers.define :have_finished_in_time do
|
|
24
24
|
@old_actual = actual
|
25
25
|
@actual = @old_actual.commandline
|
26
26
|
|
27
|
-
|
27
|
+
unless @old_actual.respond_to? :timed_out?
|
28
|
+
raise "Expected #{@old_actual} to respond to #timed_out?"
|
29
|
+
end
|
28
30
|
|
29
31
|
@old_actual.stop
|
30
32
|
|
@@ -19,7 +19,9 @@ RSpec::Matchers.define :have_output do |expected|
|
|
19
19
|
match do |actual|
|
20
20
|
@old_actual = actual
|
21
21
|
|
22
|
-
|
22
|
+
unless @old_actual.respond_to? :output
|
23
|
+
raise "Expected #{@old_actual} to respond to #output"
|
24
|
+
end
|
23
25
|
|
24
26
|
@old_actual.stop
|
25
27
|
|
@@ -17,7 +17,9 @@ RSpec::Matchers.define :have_output_on_stderr do |expected|
|
|
17
17
|
match do |actual|
|
18
18
|
@old_actual = actual
|
19
19
|
|
20
|
-
|
20
|
+
unless @old_actual.respond_to? :stderr
|
21
|
+
raise "Expected #{@old_actual} to respond to #stderr"
|
22
|
+
end
|
21
23
|
|
22
24
|
@old_actual.stop
|
23
25
|
|
@@ -17,7 +17,9 @@ RSpec::Matchers.define :have_output_on_stdout do |expected|
|
|
17
17
|
match do |actual|
|
18
18
|
@old_actual = actual
|
19
19
|
|
20
|
-
|
20
|
+
unless @old_actual.respond_to? :stdout
|
21
|
+
raise "Expected #{@old_actual} to respond to #stdout"
|
22
|
+
end
|
21
23
|
|
22
24
|
@old_actual.stop
|
23
25
|
|
@@ -23,7 +23,8 @@ require 'rspec/expectations/version'
|
|
23
23
|
#
|
24
24
|
# RSpec.describe do
|
25
25
|
# it { expect('dir1.d').to have_sub_directory(['subdir.1.d', 'subdir.2.d']) }
|
26
|
-
# it { expect(directories)
|
26
|
+
# it { expect(directories)
|
27
|
+
# . to include a_directory_with_sub_directory(['subdir.1.d', 'subdir.2.d']) }
|
27
28
|
# end
|
28
29
|
RSpec::Matchers.define :have_sub_directory do |expected|
|
29
30
|
match do |actual|
|
@@ -40,11 +41,15 @@ RSpec::Matchers.define :have_sub_directory do |expected|
|
|
40
41
|
diffable
|
41
42
|
|
42
43
|
failure_message do |actual|
|
43
|
-
format('expected that directory "%s" has the following sub-directories: %s.',
|
44
|
+
format('expected that directory "%s" has the following sub-directories: %s.',
|
45
|
+
actual.join(', '),
|
46
|
+
expected)
|
44
47
|
end
|
45
48
|
|
46
49
|
failure_message_when_negated do |actual|
|
47
|
-
format('expected that directory "%s" does not have the following sub-directories: %s.',
|
50
|
+
format('expected that directory "%s" does not have the following sub-directories: %s.',
|
51
|
+
actual.join(', '),
|
52
|
+
expected)
|
48
53
|
end
|
49
54
|
end
|
50
55
|
|
@@ -34,11 +34,13 @@ RSpec::Matchers.define :have_file_size do |expected|
|
|
34
34
|
end
|
35
35
|
|
36
36
|
failure_message do |_actual|
|
37
|
-
format('expected that file "%s" has size "%s", but has "%s"',
|
37
|
+
format('expected that file "%s" has size "%s", but has "%s"',
|
38
|
+
@old_actual, @actual, @expected)
|
38
39
|
end
|
39
40
|
|
40
41
|
failure_message_when_negated do |_actual|
|
41
|
-
format('expected that file "%s" does not have size "%s", but has "%s"',
|
42
|
+
format('expected that file "%s" does not have size "%s", but has "%s"',
|
43
|
+
@old_actual, @actual, @expected)
|
42
44
|
end
|
43
45
|
end
|
44
46
|
|
@@ -39,9 +39,10 @@ RSpec::Matchers.define :have_permissions do |expected|
|
|
39
39
|
@old_actual = actual
|
40
40
|
@actual = permissions(expand_path(@old_actual))
|
41
41
|
|
42
|
-
@expected =
|
42
|
+
@expected = case expected
|
43
|
+
when Integer
|
43
44
|
expected.to_s(8)
|
44
|
-
|
45
|
+
when String
|
45
46
|
expected.gsub(/^0*/, '')
|
46
47
|
else
|
47
48
|
expected
|
@@ -51,11 +52,13 @@ RSpec::Matchers.define :have_permissions do |expected|
|
|
51
52
|
end
|
52
53
|
|
53
54
|
failure_message do |_actual|
|
54
|
-
format('expected that path "%s" has permissions "%s", but has "%s".',
|
55
|
+
format('expected that path "%s" has permissions "%s", but has "%s".',
|
56
|
+
@old_actual, @expected, @actual)
|
55
57
|
end
|
56
58
|
|
57
59
|
failure_message_when_negated do |_actual|
|
58
|
-
format('expected that path "%s" does not have permissions "%s", but has "%s".',
|
60
|
+
format('expected that path "%s" does not have permissions "%s", but has "%s".',
|
61
|
+
@old_actual, @expected, @actual)
|
59
62
|
end
|
60
63
|
end
|
61
64
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'shellwords'
|
2
2
|
require 'aruba/colorizer'
|
3
3
|
|
4
|
-
Aruba::Colorizer.coloring = false if
|
4
|
+
Aruba::Colorizer.coloring = false if !$stdout.tty? && !ENV.key?('AUTOTEST')
|
5
5
|
|
6
6
|
# Aruba
|
7
7
|
module Aruba
|
@@ -21,7 +21,9 @@ module Aruba
|
|
21
21
|
#
|
22
22
|
# before do
|
23
23
|
# current_example = context.example
|
24
|
-
#
|
24
|
+
# if current_example.metadata[:announce_my_channel]
|
25
|
+
# aruba.announcer.activate :my_channel
|
26
|
+
# end
|
25
27
|
# end
|
26
28
|
#
|
27
29
|
# Aruba.announcer.announce(:my_channel, 'my message')
|
@@ -80,25 +82,37 @@ module Aruba
|
|
80
82
|
|
81
83
|
def after_init
|
82
84
|
output_format :changed_configuration, proc { |n, v| format('# %s = %s', n, v) }
|
83
|
-
output_format :changed_environment,
|
85
|
+
output_format :changed_environment,
|
86
|
+
proc { |n, v| format('$ export %s=%s', n, Shellwords.escape(v)) }
|
84
87
|
output_format :command, '$ %s'
|
85
88
|
output_format :directory, '$ cd %s'
|
86
|
-
output_format :environment,
|
87
|
-
|
88
|
-
output_format :
|
89
|
+
output_format :environment,
|
90
|
+
proc { |n, v| format('$ export %s=%s', n, Shellwords.escape(v)) }
|
91
|
+
output_format :full_environment,
|
92
|
+
proc { |h|
|
93
|
+
format("<<-ENVIRONMENT\n%s\nENVIRONMENT",
|
94
|
+
Aruba.platform.simple_table(h))
|
95
|
+
}
|
96
|
+
output_format :modified_environment,
|
97
|
+
proc { |n, v| format('$ export %s=%s', n, Shellwords.escape(v)) }
|
89
98
|
output_format :stderr, "<<-STDERR\n%s\nSTDERR"
|
90
99
|
output_format :stdout, "<<-STDOUT\n%s\nSTDOUT"
|
91
100
|
output_format :command_content, "<<-COMMAND\n%s\nCOMMAND"
|
92
|
-
output_format :stop_signal,
|
101
|
+
output_format :stop_signal,
|
102
|
+
proc { |p, s|
|
103
|
+
format('Command will be stopped with `kill -%s %s`', s, p)
|
104
|
+
}
|
93
105
|
output_format :timeout, '# %s-timeout: %s seconds'
|
94
106
|
output_format :wait_time, '# %s: %s seconds'
|
95
|
-
output_format :command_filesystem_status,
|
96
|
-
|
97
|
-
|
107
|
+
output_format :command_filesystem_status,
|
108
|
+
proc { |status|
|
109
|
+
format("<<-COMMAND FILESYSTEM STATUS\n%s\nCOMMAND FILESYSTEM STATUS",
|
110
|
+
Aruba.platform.simple_table(status.to_h, sort: false))
|
111
|
+
}
|
98
112
|
end
|
99
113
|
|
100
114
|
def output_format(channel, string = '%s', &block)
|
101
|
-
output_formats[channel.to_sym] = if
|
115
|
+
output_formats[channel.to_sym] = if block
|
102
116
|
block
|
103
117
|
elsif string.is_a?(Proc)
|
104
118
|
string
|
@@ -18,7 +18,9 @@ module Aruba
|
|
18
18
|
# @param [Boolean] check_presence (false)
|
19
19
|
# Check if file exist
|
20
20
|
def call(path, content, check_presence = false)
|
21
|
-
|
21
|
+
if check_presence && !Aruba.platform.file?(path)
|
22
|
+
raise "Expected #{path} to be present"
|
23
|
+
end
|
22
24
|
|
23
25
|
Aruba.platform.mkdir(File.dirname(path))
|
24
26
|
|
@@ -22,11 +22,16 @@ module Aruba
|
|
22
22
|
# @param [Boolean] check_presence (false)
|
23
23
|
# Check if file exist
|
24
24
|
def call(path, size, check_presence)
|
25
|
-
|
25
|
+
if check_presence && !Aruba.platform.file?(path)
|
26
|
+
raise "Expected #{path} to be present"
|
27
|
+
end
|
26
28
|
|
27
29
|
Aruba.platform.mkdir(File.dirname(path))
|
28
30
|
|
29
|
-
File.open(path, 'wb')
|
31
|
+
File.open(path, 'wb') do |f|
|
32
|
+
f.seek(size - 1)
|
33
|
+
f.write("\0")
|
34
|
+
end
|
30
35
|
|
31
36
|
self
|
32
37
|
end
|
@@ -47,20 +47,21 @@ module Aruba
|
|
47
47
|
def logger
|
48
48
|
l = ::Logger.new($stderr)
|
49
49
|
|
50
|
-
|
51
|
-
when :debug
|
52
|
-
l.level = ::Logger::DEBUG
|
50
|
+
if mode == :debug
|
53
51
|
format_debug(l)
|
54
|
-
when :silent
|
55
|
-
l.level = 9_999
|
56
|
-
when :info
|
57
|
-
l.level = ::Logger::INFO
|
58
|
-
format_standard(l)
|
59
52
|
else
|
60
|
-
l.level = ::Logger::INFO
|
61
53
|
format_standard(l)
|
62
54
|
end
|
63
55
|
|
56
|
+
l.level = case mode
|
57
|
+
when :debug
|
58
|
+
::Logger::DEBUG
|
59
|
+
when :silent
|
60
|
+
9_999
|
61
|
+
else
|
62
|
+
::Logger::INFO
|
63
|
+
end
|
64
|
+
|
64
65
|
l
|
65
66
|
end
|
66
67
|
|
@@ -12,7 +12,7 @@ module Aruba
|
|
12
12
|
|
13
13
|
public
|
14
14
|
|
15
|
-
attr_reader :registered_commands, :last_command_started
|
15
|
+
attr_reader :registered_commands, :last_command_started, :last_command_stopped
|
16
16
|
|
17
17
|
class DefaultLastCommandStopped
|
18
18
|
def nil?
|
@@ -20,7 +20,7 @@ module Aruba
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def method_missing(*)
|
23
|
-
|
23
|
+
raise NoCommandHasBeenStoppedError, 'No last command stopped available'
|
24
24
|
end
|
25
25
|
|
26
26
|
def respond_to_missing?(*)
|
@@ -34,7 +34,7 @@ module Aruba
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def method_missing(*)
|
37
|
-
|
37
|
+
raise NoCommandHasBeenStartedError, 'No last command started available'
|
38
38
|
end
|
39
39
|
|
40
40
|
def respond_to_missing?(*)
|
@@ -52,8 +52,6 @@ module Aruba
|
|
52
52
|
raise ArgumentError, e.message
|
53
53
|
end
|
54
54
|
|
55
|
-
attr_reader :last_command_stopped
|
56
|
-
|
57
55
|
# Set last command started
|
58
56
|
#
|
59
57
|
# @param [String] cmd
|
@@ -78,7 +76,7 @@ module Aruba
|
|
78
76
|
cmd = cmd.commandline if cmd.respond_to? :commandline
|
79
77
|
command = registered_commands.reverse.find { |c| c.commandline == cmd }
|
80
78
|
|
81
|
-
|
79
|
+
raise CommandNotFoundError, "No command named '#{cmd}' has been started" if command.nil?
|
82
80
|
|
83
81
|
command
|
84
82
|
end
|
@@ -1,33 +1,68 @@
|
|
1
|
-
require 'aruba/
|
1
|
+
require 'aruba/file_size'
|
2
2
|
|
3
|
-
# Aruba
|
4
3
|
module Aruba
|
5
|
-
# Platforms
|
6
4
|
module Platforms
|
7
5
|
# Determinate disk usage
|
8
6
|
#
|
9
7
|
# @private
|
10
8
|
class DetermineDiskUsage
|
11
|
-
def call(
|
12
|
-
|
13
|
-
|
14
|
-
deprecated_block_size = args.pop
|
15
|
-
paths = args
|
16
|
-
|
17
|
-
size = paths.flatten.map do |p|
|
18
|
-
# TODO: replace the `call` methods signature so that you can use just
|
19
|
-
# p.minimum_disk_space_used
|
20
|
-
#
|
21
|
-
# (Same result, since the values are multiplied, so
|
22
|
-
# deprecated_block_size is canceled out
|
23
|
-
DiskUsageCalculator.new.call(
|
24
|
-
(p.minimum_disk_space_used / deprecated_block_size),
|
25
|
-
deprecated_block_size
|
26
|
-
)
|
27
|
-
end.inject(0, &:+)
|
9
|
+
def call(paths)
|
10
|
+
size = paths.flatten.sum { |path| minimum_disk_space_used path }
|
28
11
|
|
29
12
|
FileSize.new(size)
|
30
13
|
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
# TODO: Aruba.config.physical_block_size could be allowed to be nil
|
18
|
+
# (So the unit size can be autodetected)
|
19
|
+
|
20
|
+
# Report minimum disk space used
|
21
|
+
#
|
22
|
+
# This estimates the minimum bytes allocated by the path.
|
23
|
+
#
|
24
|
+
# E.g. a 1-byte text file on a typical EXT-3 filesystem takes up 4096 bytes
|
25
|
+
# (could be more if it was truncated or less for sparse files).
|
26
|
+
#
|
27
|
+
# Both `File::Stat` and the `stat()` system call will report 8 `blocks`
|
28
|
+
# (each "usually" represents 512 bytes). So 8 * 512 is exactly 4096 bytes.
|
29
|
+
#
|
30
|
+
# (The "magic" 512 bye implied makes the value of "blocks" so confusing).
|
31
|
+
#
|
32
|
+
# Currently Aruba allows you to set what's called the `physical_block_size`,
|
33
|
+
# which is a bit misleading - it's the "512" value. So if you somehow have a
|
34
|
+
# "filesystem unit size" of 8192 (instead of a typical 4KB), set the
|
35
|
+
# `physical_block_size` to 1024 (yes, divide by 8: 8192/8 = 1024).
|
36
|
+
#
|
37
|
+
# Ideally, Aruba should provide e.g. `Aruba.config.fs_allocation_unit`
|
38
|
+
# (with 4096 as the default), so you wouldn't have to "divide by 8".
|
39
|
+
#
|
40
|
+
# (typical_fs_unit / typical_dev_bsize = 4096 / 512 = 8)
|
41
|
+
#
|
42
|
+
#
|
43
|
+
# @return [Integer]
|
44
|
+
# Total bytes allocate
|
45
|
+
#
|
46
|
+
# TODO: this is recommended over the above "blocks"
|
47
|
+
def minimum_disk_space_used(path)
|
48
|
+
# TODO: replace Aruba.config.physical_block_size
|
49
|
+
# with something like Aruba.config.fs_allocation_unit
|
50
|
+
dev_bsize = Aruba.config.physical_block_size
|
51
|
+
|
52
|
+
stat = File::Stat.new(path.to_s)
|
53
|
+
|
54
|
+
blocks = stat.blocks
|
55
|
+
return (blocks * dev_bsize) if blocks
|
56
|
+
|
57
|
+
typical_fs_unit = 4096
|
58
|
+
typical_dev_bsize = 512 # google dev_bsize for more info
|
59
|
+
|
60
|
+
block_multiplier = typical_fs_unit / typical_dev_bsize
|
61
|
+
fs_unit_size = dev_bsize * block_multiplier
|
62
|
+
fs_units = (stat.size + fs_unit_size - 1) / fs_unit_size
|
63
|
+
fs_units = 1 if fs_units.zero?
|
64
|
+
fs_units * fs_unit_size
|
65
|
+
end
|
31
66
|
end
|
32
67
|
end
|
33
68
|
end
|