aruba 2.0.0 → 2.0.1
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/CHANGELOG.md +19 -1
- data/CONTRIBUTING.md +0 -1
- data/README.md +10 -3
- data/lib/aruba/api/commands.rb +0 -2
- data/lib/aruba/api/filesystem.rb +1 -1
- data/lib/aruba/api/text.rb +0 -12
- data/lib/aruba/console.rb +1 -1
- data/lib/aruba/contracts/enum.rb +1 -0
- data/lib/aruba/cucumber/command.rb +31 -19
- data/lib/aruba/cucumber/file.rb +2 -2
- data/lib/aruba/matchers/command/be_successfully_executed.rb +0 -2
- data/lib/aruba/matchers/command/have_exit_status.rb +7 -13
- data/lib/aruba/matchers/command/have_finished_in_time.rb +0 -2
- data/lib/aruba/matchers/directory/be_an_existing_directory.rb +0 -2
- data/lib/aruba/matchers/directory/have_sub_directory.rb +0 -2
- data/lib/aruba/matchers/file/be_a_command_found_in_path.rb +0 -2
- data/lib/aruba/matchers/file/be_an_existing_executable.rb +0 -1
- data/lib/aruba/matchers/file/be_an_existing_file.rb +0 -2
- data/lib/aruba/matchers/file/have_file_content.rb +0 -2
- data/lib/aruba/matchers/file/have_file_size.rb +0 -2
- data/lib/aruba/matchers/file/have_same_file_content.rb +0 -1
- data/lib/aruba/matchers/path/a_path_matching_pattern.rb +0 -2
- data/lib/aruba/matchers/path/be_an_absolute_path.rb +0 -2
- data/lib/aruba/matchers/path/be_an_existing_path.rb +0 -2
- data/lib/aruba/matchers/path/have_permissions.rb +0 -2
- data/lib/aruba/platform.rb +2 -2
- data/lib/aruba/platforms/announcer.rb +0 -2
- data/lib/aruba/platforms/command_monitor.rb +2 -2
- data/lib/aruba/platforms/unix_environment_variables.rb +0 -2
- data/lib/aruba/platforms/unix_platform.rb +1 -0
- data/lib/aruba/processes/basic_process.rb +4 -0
- data/lib/aruba/version.rb +1 -1
- metadata +32 -17
- data/lib/aruba/matchers/base/base_matcher.rb +0 -87
- data/lib/aruba/matchers/base/object_formatter.rb +0 -104
- data/lib/aruba/matchers/collection/all.rb +0 -11
- data/lib/aruba/matchers/collection/include_an_object.rb +0 -120
- data/lib/aruba/matchers/collection.rb +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc48eb26abb5d1e638537ed9eaf53f5758c541ca48e9f979da107bb8a7bdcf6c
|
4
|
+
data.tar.gz: 75d8cc6d3c52b62538f688949ee212abd5c3dad8aca20fd3007860757eaf830e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bece1031dfa68f1fa9a80854758558596cc48d073996fb5d3f6440226d18e68c7408d478ffa6a9f7881aa52e3d172c1acaa1bf3bae5948b07af363e6a456c75d
|
7
|
+
data.tar.gz: 7f68b65140bbe200235a6e23aac68a5f4da28ca9cf47171cd28d758a2b70aaa5645b7a45f739a1fa803d5c5770864196224d4797685c0de40328a71db7697d90
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,16 @@ This project adheres to [Semantic Versioning][1].
|
|
6
6
|
|
7
7
|
This document is formatted according to the principles of [Keep A CHANGELOG][2].
|
8
8
|
|
9
|
+
## [2.0.1] / 2022-04-22
|
10
|
+
|
11
|
+
* Various cleanups of internal APIs ([#838] by [mvz])
|
12
|
+
* Make objects not pretend to be nil ([#843] by [mvz])
|
13
|
+
* Remove experimental variables replacement feature ([#846] by [mvz])
|
14
|
+
* Support Ruby 3.1 ([#850] by [mvz])
|
15
|
+
* Fix steps that wait for output from commands ([#856] by [mvz])
|
16
|
+
* Ensure `Gem.win_platform?` is available ([#858] by [mvz])
|
17
|
+
* Support JRuby 9.3 ([#867] by [mvz])
|
18
|
+
|
9
19
|
## [2.0.0] / 2021-07-26
|
10
20
|
|
11
21
|
Potentially breaking changes:
|
@@ -994,6 +1004,13 @@ Note: These are changes w.r.t. Aruba version 0.14.1.
|
|
994
1004
|
|
995
1005
|
<!-- issues & pull requests -->
|
996
1006
|
|
1007
|
+
[#867]: https://github.com/cucumber/aruba/pull/867
|
1008
|
+
[#858]: https://github.com/cucumber/aruba/pull/858
|
1009
|
+
[#856]: https://github.com/cucumber/aruba/pull/856
|
1010
|
+
[#850]: https://github.com/cucumber/aruba/pull/850
|
1011
|
+
[#846]: https://github.com/cucumber/aruba/pull/846
|
1012
|
+
[#843]: https://github.com/cucumber/aruba/pull/843
|
1013
|
+
[#838]: https://github.com/cucumber/aruba/pull/838
|
997
1014
|
[#829]: https://github.com/cucumber/aruba/pull/829
|
998
1015
|
[#828]: https://github.com/cucumber/aruba/pull/828
|
999
1016
|
[#822]: https://github.com/cucumber/aruba/pull/822
|
@@ -1295,7 +1312,8 @@ Note: These are changes w.r.t. Aruba version 0.14.1.
|
|
1295
1312
|
|
1296
1313
|
<!-- Releases -->
|
1297
1314
|
|
1298
|
-
[Unreleased]: https://github.com/cucumber/aruba/compare/v2.0.
|
1315
|
+
[Unreleased]: https://github.com/cucumber/aruba/compare/v2.0.1...main
|
1316
|
+
[2.0.1]: https://github.com/cucumber/aruba/compare/v2.0.0...v2.0.1
|
1299
1317
|
[2.0.0]: https://github.com/cucumber/aruba/compare/v1.1.2...v2.0.0
|
1300
1318
|
[1.1.2]: https://github.com/cucumber/aruba/compare/v1.1.1...v1.1.2
|
1301
1319
|
[1.1.1]: https://github.com/cucumber/aruba/compare/v1.1.0...v1.1.1
|
data/CONTRIBUTING.md
CHANGED
data/README.md
CHANGED
@@ -69,12 +69,19 @@ Currently, this gem is mainly maintained by this group of people:
|
|
69
69
|
|
70
70
|
## Release Policy
|
71
71
|
|
72
|
-
We
|
72
|
+
We use [Semantic Versioning 2.0.0](http://semver.org/spec/v2.0.0.html). We
|
73
|
+
depend on rubygems to ensure correct dependency versions, so dropping support
|
74
|
+
for older dependencies and Ruby versions will not result in a major version
|
75
|
+
bump.
|
73
76
|
|
74
77
|
## Supported Ruby versions
|
75
78
|
|
76
|
-
Aruba is supported on Ruby 2.5 and up, and tested against CRuby 2.5, 2.6 and
|
77
|
-
|
79
|
+
Aruba is supported on Ruby 2.5 and up, and tested against CRuby 2.5, 2.6, 2.7, 3.0 and
|
80
|
+
3.1, and JRuby 9.2 and 9.2.
|
81
|
+
|
82
|
+
## Supported Cucumber versions
|
83
|
+
|
84
|
+
Aruba is supported on and tested with Cucumber versions 4 through 7.
|
78
85
|
|
79
86
|
## Supported operating systems
|
80
87
|
|
data/lib/aruba/api/commands.rb
CHANGED
data/lib/aruba/api/filesystem.rb
CHANGED
@@ -406,7 +406,7 @@ module Aruba
|
|
406
406
|
# Bytes on disk
|
407
407
|
def disk_usage(*paths)
|
408
408
|
paths = paths.flatten
|
409
|
-
expect(paths).to
|
409
|
+
expect(paths).to all be_an_existing_path
|
410
410
|
expanded = paths.map { |path| expand_path(path) }
|
411
411
|
|
412
412
|
Aruba.platform.determine_disk_usage(expanded)
|
data/lib/aruba/api/text.rb
CHANGED
@@ -45,18 +45,6 @@ module Aruba
|
|
45
45
|
|
46
46
|
text.chomp
|
47
47
|
end
|
48
|
-
|
49
|
-
# Replace variables in command string (experimental)
|
50
|
-
#
|
51
|
-
# @param [#to_s] text
|
52
|
-
# The text to parse
|
53
|
-
def replace_variables(text)
|
54
|
-
if text.include? "<pid-last-command-started>"
|
55
|
-
text = text.gsub(/<pid-last-command-started>/, last_command_started.pid.to_s)
|
56
|
-
end
|
57
|
-
|
58
|
-
text
|
59
|
-
end
|
60
48
|
end
|
61
49
|
end
|
62
50
|
end
|
data/lib/aruba/console.rb
CHANGED
data/lib/aruba/contracts/enum.rb
CHANGED
@@ -85,21 +85,33 @@ rescue ChildProcess::TimeoutError, Timeout::Error
|
|
85
85
|
last_command_started.terminate
|
86
86
|
end
|
87
87
|
|
88
|
-
When "I wait for output/stdout to contain" do |expected|
|
88
|
+
When "I wait for output/stdout to contain:" do |expected|
|
89
89
|
Timeout.timeout(aruba.config.exit_timeout) do
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
90
|
+
loop do
|
91
|
+
output = last_command_started.public_send :stdout, wait_for_io: 0
|
92
|
+
|
93
|
+
output = sanitize_text(output)
|
94
|
+
expected = sanitize_text(expected)
|
95
|
+
|
96
|
+
break if output.include? expected
|
97
|
+
|
98
|
+
sleep 0.1
|
99
|
+
end
|
94
100
|
end
|
95
101
|
end
|
96
102
|
|
97
103
|
When "I wait for output/stdout to contain {string}" do |expected|
|
98
104
|
Timeout.timeout(aruba.config.exit_timeout) do
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
105
|
+
loop do
|
106
|
+
output = last_command_started.public_send :stdout, wait_for_io: 0
|
107
|
+
|
108
|
+
output = sanitize_text(output)
|
109
|
+
expected = sanitize_text(expected)
|
110
|
+
|
111
|
+
break if output.include? expected
|
112
|
+
|
113
|
+
sleep 0.1
|
114
|
+
end
|
103
115
|
end
|
104
116
|
end
|
105
117
|
|
@@ -292,35 +304,35 @@ end
|
|
292
304
|
Then(%r{^the output should( not)? match /([^/]*)/$}) do |negated, expected|
|
293
305
|
if negated
|
294
306
|
expect(all_commands)
|
295
|
-
.not_to
|
307
|
+
.not_to include have_output an_output_string_matching(expected)
|
296
308
|
else
|
297
309
|
expect(all_commands)
|
298
|
-
.to
|
310
|
+
.to include have_output an_output_string_matching(expected)
|
299
311
|
end
|
300
312
|
end
|
301
313
|
|
302
314
|
Then(/^the output should( not)? match %r<([^>]*)>$/) do |negated, expected|
|
303
315
|
if negated
|
304
316
|
expect(all_commands)
|
305
|
-
.not_to
|
317
|
+
.not_to include have_output an_output_string_matching(expected)
|
306
318
|
else
|
307
319
|
expect(all_commands)
|
308
|
-
.to
|
320
|
+
.to include have_output an_output_string_matching(expected)
|
309
321
|
end
|
310
322
|
end
|
311
323
|
|
312
324
|
Then(/^the output should( not)? match:$/) do |negated, expected|
|
313
325
|
if negated
|
314
326
|
expect(all_commands)
|
315
|
-
.not_to
|
327
|
+
.not_to include have_output an_output_string_matching(expected)
|
316
328
|
else
|
317
329
|
expect(all_commands)
|
318
|
-
.to
|
330
|
+
.to include have_output an_output_string_matching(expected)
|
319
331
|
end
|
320
332
|
end
|
321
333
|
|
322
334
|
Then(/^the exit status should( not)? be (\d+)$/) do |negated, exit_status|
|
323
|
-
last_command_started.stop if last_command_stopped.
|
335
|
+
last_command_started.stop if last_command_stopped.empty?
|
324
336
|
|
325
337
|
if negated
|
326
338
|
expect(last_command_stopped).not_to have_exit_status exit_status.to_i
|
@@ -432,7 +444,7 @@ Then(/^(?:the )?(output|stderr|stdout) should not contain anything$/) do |channe
|
|
432
444
|
when "stdout"; then :have_output_on_stdout
|
433
445
|
end
|
434
446
|
|
435
|
-
expect(all_commands).to
|
447
|
+
expect(all_commands).to include send(matcher, be_nil.or(be_empty))
|
436
448
|
end
|
437
449
|
|
438
450
|
Then(/^(?:the )?(output|stdout|stderr) should( not)? contain all of these lines:$/) \
|
@@ -448,10 +460,10 @@ Then(/^(?:the )?(output|stdout|stderr) should( not)? contain all of these lines:
|
|
448
460
|
|
449
461
|
if negated
|
450
462
|
expect(all_commands)
|
451
|
-
.not_to
|
463
|
+
.not_to include have_output an_output_string_including(expected)
|
452
464
|
else
|
453
465
|
expect(all_commands)
|
454
|
-
.to
|
466
|
+
.to include have_output an_output_string_including(expected)
|
455
467
|
end
|
456
468
|
end
|
457
469
|
end
|
data/lib/aruba/cucumber/file.rb
CHANGED
@@ -95,7 +95,7 @@ Then(/^the following files should (not )?exist:$/) do |negated, files|
|
|
95
95
|
if negated
|
96
96
|
expect(files).not_to include an_existing_file
|
97
97
|
else
|
98
|
-
expect(files).to
|
98
|
+
expect(files).to all be_an_existing_file
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
@@ -140,7 +140,7 @@ Then(/^the following directories should (not )?exist:$/) do |negated, directorie
|
|
140
140
|
if negated
|
141
141
|
expect(directories).not_to include an_existing_directory
|
142
142
|
else
|
143
|
-
expect(directories).to
|
143
|
+
expect(directories).to all be_an_existing_directory
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
@@ -18,33 +18,27 @@
|
|
18
18
|
# end
|
19
19
|
RSpec::Matchers.define :have_exit_status do |expected|
|
20
20
|
match do |actual|
|
21
|
-
|
21
|
+
actual.stop
|
22
|
+
@actual_exit_status = actual.exit_status
|
22
23
|
|
23
|
-
@
|
24
|
-
@actual = actual.exit_status
|
25
|
-
|
26
|
-
unless @old_actual.respond_to? :exit_status
|
27
|
-
raise "Expected #{@old_actual} to respond to #exit_status"
|
28
|
-
end
|
29
|
-
|
30
|
-
values_match? expected, @actual
|
24
|
+
values_match? expected, @actual_exit_status
|
31
25
|
end
|
32
26
|
|
33
27
|
failure_message do |actual|
|
34
28
|
format(
|
35
29
|
%(expected that command "%s" has exit status of "%s", but has "%s".),
|
36
|
-
|
30
|
+
actual.commandline,
|
37
31
|
expected.to_s,
|
38
|
-
|
32
|
+
@actual_exit_status.to_s
|
39
33
|
)
|
40
34
|
end
|
41
35
|
|
42
36
|
failure_message_when_negated do |actual|
|
43
37
|
format(
|
44
38
|
%(expected that command "%s" does not have exit status of "%s", but has "%s".),
|
45
|
-
|
39
|
+
actual.commandline,
|
46
40
|
expected.to_s,
|
47
|
-
|
41
|
+
@actual_exit_status.to_s
|
48
42
|
)
|
49
43
|
end
|
50
44
|
end
|
data/lib/aruba/platform.rb
CHANGED
@@ -5,10 +5,10 @@ require "aruba/platforms/windows_platform"
|
|
5
5
|
module Aruba
|
6
6
|
PLATFORM_MUTEX = Mutex.new
|
7
7
|
|
8
|
-
|
8
|
+
PLATFORM = [Platforms::WindowsPlatform, Platforms::UnixPlatform].find(&:match?)
|
9
9
|
|
10
10
|
PLATFORM_MUTEX.synchronize do
|
11
|
-
@platform =
|
11
|
+
@platform = PLATFORM.new
|
12
12
|
end
|
13
13
|
|
14
14
|
class << self
|
@@ -15,7 +15,7 @@ module Aruba
|
|
15
15
|
attr_reader :registered_commands, :last_command_started, :last_command_stopped
|
16
16
|
|
17
17
|
class DefaultLastCommandStopped
|
18
|
-
def
|
18
|
+
def empty?
|
19
19
|
true
|
20
20
|
end
|
21
21
|
|
@@ -29,7 +29,7 @@ module Aruba
|
|
29
29
|
end
|
30
30
|
|
31
31
|
class DefaultLastCommandStarted
|
32
|
-
def
|
32
|
+
def empty?
|
33
33
|
true
|
34
34
|
end
|
35
35
|
|
data/lib/aruba/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aruba
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aslak Hellesøy, Matt Wynne and other Aruba Contributors
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-04-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -174,6 +174,26 @@ dependencies:
|
|
174
174
|
- - "~>"
|
175
175
|
- !ruby/object:Gem::Version
|
176
176
|
version: '5.10'
|
177
|
+
- !ruby/object:Gem::Dependency
|
178
|
+
name: pry
|
179
|
+
requirement: !ruby/object:Gem::Requirement
|
180
|
+
requirements:
|
181
|
+
- - ">="
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
version: 0.13.0
|
184
|
+
- - "<"
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
version: 0.15.0
|
187
|
+
type: :development
|
188
|
+
prerelease: false
|
189
|
+
version_requirements: !ruby/object:Gem::Requirement
|
190
|
+
requirements:
|
191
|
+
- - ">="
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
version: 0.13.0
|
194
|
+
- - "<"
|
195
|
+
- !ruby/object:Gem::Version
|
196
|
+
version: 0.15.0
|
177
197
|
- !ruby/object:Gem::Dependency
|
178
198
|
name: pry-doc
|
179
199
|
requirement: !ruby/object:Gem::Requirement
|
@@ -228,28 +248,28 @@ dependencies:
|
|
228
248
|
requirements:
|
229
249
|
- - "~>"
|
230
250
|
- !ruby/object:Gem::Version
|
231
|
-
version: 3.
|
251
|
+
version: '3.11'
|
232
252
|
type: :development
|
233
253
|
prerelease: false
|
234
254
|
version_requirements: !ruby/object:Gem::Requirement
|
235
255
|
requirements:
|
236
256
|
- - "~>"
|
237
257
|
- !ruby/object:Gem::Version
|
238
|
-
version: 3.
|
258
|
+
version: '3.11'
|
239
259
|
- !ruby/object:Gem::Dependency
|
240
260
|
name: rubocop
|
241
261
|
requirement: !ruby/object:Gem::Requirement
|
242
262
|
requirements:
|
243
263
|
- - "~>"
|
244
264
|
- !ruby/object:Gem::Version
|
245
|
-
version: 1.
|
265
|
+
version: '1.28'
|
246
266
|
type: :development
|
247
267
|
prerelease: false
|
248
268
|
version_requirements: !ruby/object:Gem::Requirement
|
249
269
|
requirements:
|
250
270
|
- - "~>"
|
251
271
|
- !ruby/object:Gem::Version
|
252
|
-
version: 1.
|
272
|
+
version: '1.28'
|
253
273
|
- !ruby/object:Gem::Dependency
|
254
274
|
name: rubocop-packaging
|
255
275
|
requirement: !ruby/object:Gem::Requirement
|
@@ -270,28 +290,28 @@ dependencies:
|
|
270
290
|
requirements:
|
271
291
|
- - "~>"
|
272
292
|
- !ruby/object:Gem::Version
|
273
|
-
version: 1.
|
293
|
+
version: '1.13'
|
274
294
|
type: :development
|
275
295
|
prerelease: false
|
276
296
|
version_requirements: !ruby/object:Gem::Requirement
|
277
297
|
requirements:
|
278
298
|
- - "~>"
|
279
299
|
- !ruby/object:Gem::Version
|
280
|
-
version: 1.
|
300
|
+
version: '1.13'
|
281
301
|
- !ruby/object:Gem::Dependency
|
282
302
|
name: rubocop-rspec
|
283
303
|
requirement: !ruby/object:Gem::Requirement
|
284
304
|
requirements:
|
285
305
|
- - "~>"
|
286
306
|
- !ruby/object:Gem::Version
|
287
|
-
version: 2.
|
307
|
+
version: '2.8'
|
288
308
|
type: :development
|
289
309
|
prerelease: false
|
290
310
|
version_requirements: !ruby/object:Gem::Requirement
|
291
311
|
requirements:
|
292
312
|
- - "~>"
|
293
313
|
- !ruby/object:Gem::Version
|
294
|
-
version: 2.
|
314
|
+
version: '2.8'
|
295
315
|
- !ruby/object:Gem::Dependency
|
296
316
|
name: simplecov
|
297
317
|
requirement: !ruby/object:Gem::Requirement
|
@@ -383,12 +403,7 @@ files:
|
|
383
403
|
- lib/aruba/hooks.rb
|
384
404
|
- lib/aruba/in_config_wrapper.rb
|
385
405
|
- lib/aruba/initializer.rb
|
386
|
-
- lib/aruba/matchers/base/base_matcher.rb
|
387
406
|
- lib/aruba/matchers/base/message_indenter.rb
|
388
|
-
- lib/aruba/matchers/base/object_formatter.rb
|
389
|
-
- lib/aruba/matchers/collection.rb
|
390
|
-
- lib/aruba/matchers/collection/all.rb
|
391
|
-
- lib/aruba/matchers/collection/include_an_object.rb
|
392
407
|
- lib/aruba/matchers/command.rb
|
393
408
|
- lib/aruba/matchers/command/be_successfully_executed.rb
|
394
409
|
- lib/aruba/matchers/command/have_exit_status.rb
|
@@ -472,8 +487,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
472
487
|
- !ruby/object:Gem::Version
|
473
488
|
version: '0'
|
474
489
|
requirements: []
|
475
|
-
rubygems_version: 3.
|
490
|
+
rubygems_version: 3.3.7
|
476
491
|
signing_key:
|
477
492
|
specification_version: 4
|
478
|
-
summary: aruba-2.0.
|
493
|
+
summary: aruba-2.0.1
|
479
494
|
test_files: []
|
@@ -1,87 +0,0 @@
|
|
1
|
-
require "aruba/matchers/base/object_formatter"
|
2
|
-
|
3
|
-
# Aruba
|
4
|
-
module Aruba
|
5
|
-
# Matchers
|
6
|
-
module Matchers
|
7
|
-
# Base Matcher
|
8
|
-
class BaseMatcher
|
9
|
-
# @api private
|
10
|
-
# Used to detect when no arg is passed to `initialize`.
|
11
|
-
# `nil` cannot be used because it's a valid value to pass.
|
12
|
-
UNDEFINED = Object.new.freeze
|
13
|
-
|
14
|
-
# @private
|
15
|
-
attr_reader :actual, :expected, :rescued_exception
|
16
|
-
|
17
|
-
def initialize(expected = UNDEFINED)
|
18
|
-
@expected = expected unless UNDEFINED.equal?(expected)
|
19
|
-
end
|
20
|
-
|
21
|
-
# @api private
|
22
|
-
# Indicates if the match is successful. Delegates to `match`, which
|
23
|
-
# should be defined on a subclass. Takes care of consistently
|
24
|
-
# initializing the `actual` attribute.
|
25
|
-
def matches?(actual)
|
26
|
-
@actual = actual
|
27
|
-
match(expected, actual)
|
28
|
-
end
|
29
|
-
|
30
|
-
def iterable?
|
31
|
-
@actual.respond_to?(:each_with_index)
|
32
|
-
end
|
33
|
-
|
34
|
-
# @private
|
35
|
-
module HashFormatting
|
36
|
-
module_function
|
37
|
-
|
38
|
-
# `{ :a => 5, :b => 2 }.inspect` produces:
|
39
|
-
#
|
40
|
-
# {:a=>5, :b=>2}
|
41
|
-
#
|
42
|
-
# ...but it looks much better as:
|
43
|
-
#
|
44
|
-
# {:a => 5, :b => 2}
|
45
|
-
#
|
46
|
-
# This is idempotent and safe to run on a string multiple times.
|
47
|
-
def improve_hash_formatting(inspect_string)
|
48
|
-
inspect_string.gsub(/(\S)=>(\S)/, '\1 => \2')
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
include HashFormatting
|
53
|
-
|
54
|
-
# @api private
|
55
|
-
# Provides default implementations of failure messages, based on the `description`.
|
56
|
-
module DefaultFailureMessages
|
57
|
-
# @api private
|
58
|
-
# Provides a good generic failure message. Based on `description`.
|
59
|
-
# When subclassing, if you are not satisfied with this failure message
|
60
|
-
# you often only need to override `description`.
|
61
|
-
# @return [String]
|
62
|
-
def failure_message
|
63
|
-
"expected #{description_of @actual} to #{description}"
|
64
|
-
end
|
65
|
-
|
66
|
-
# @api private
|
67
|
-
# Provides a good generic negative failure message. Based on `description`.
|
68
|
-
# When subclassing, if you are not satisfied with this failure message
|
69
|
-
# you often only need to override `description`.
|
70
|
-
# @return [String]
|
71
|
-
def failure_message_when_negated
|
72
|
-
"expected #{description_of @actual} not to #{description}"
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
include DefaultFailureMessages
|
77
|
-
|
78
|
-
# Returns the description of the given object in a way that is
|
79
|
-
# aware of composed matchers. If the object is a matcher with
|
80
|
-
# a `description` method, returns the description; otherwise
|
81
|
-
# returns `object.inspect`.
|
82
|
-
def description_of(object)
|
83
|
-
Aruba::Matchers::ObjectFormatter.format(object)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
@@ -1,104 +0,0 @@
|
|
1
|
-
# Aruba
|
2
|
-
module Aruba
|
3
|
-
# Matchers
|
4
|
-
module Matchers
|
5
|
-
# Provide additional output details beyond what `inspect` provides when
|
6
|
-
# printing Time, DateTime, or BigDecimal
|
7
|
-
#
|
8
|
-
# @private
|
9
|
-
module ObjectFormatter
|
10
|
-
# @api private
|
11
|
-
def self.format(object)
|
12
|
-
prepare_for_inspection(object).inspect
|
13
|
-
end
|
14
|
-
|
15
|
-
# @private
|
16
|
-
# Prepares the provided object to be formatted by wrapping it as needed
|
17
|
-
# in something that, when `inspect` is called on it, will produce the
|
18
|
-
# desired output.
|
19
|
-
#
|
20
|
-
# This allows us to apply the desired formatting to hash/array data structures
|
21
|
-
# at any level of nesting, simply by walking that structure and replacing items
|
22
|
-
# with custom items that have `inspect` defined to return the desired output
|
23
|
-
# for that item. Then we can just use `Array#inspect` or `Hash#inspect` to
|
24
|
-
# format the entire thing.
|
25
|
-
def self.prepare_for_inspection(object)
|
26
|
-
case object
|
27
|
-
when Array
|
28
|
-
return object.map { |o| prepare_for_inspection(o) }
|
29
|
-
when Hash
|
30
|
-
return prepare_hash(object)
|
31
|
-
when Time
|
32
|
-
inspection = format_time(object)
|
33
|
-
else
|
34
|
-
if defined?(DateTime) && DateTime === object
|
35
|
-
inspection = format_date_time(object)
|
36
|
-
elsif defined?(BigDecimal) && BigDecimal === object
|
37
|
-
inspection = "#{object.to_s 'F'} (#{object.inspect})"
|
38
|
-
elsif RSpec::Support.is_a_matcher?(object) && object.respond_to?(:description)
|
39
|
-
inspection = object.description
|
40
|
-
else
|
41
|
-
return DelegatingInspector.new(object)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
InspectableItem.new(inspection)
|
46
|
-
end
|
47
|
-
|
48
|
-
# @private
|
49
|
-
def self.prepare_hash(input)
|
50
|
-
input.each_with_object({}) do |(k, v), hash|
|
51
|
-
hash[prepare_for_inspection(k)] = prepare_for_inspection(v)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
TIME_FORMAT = "%Y-%m-%d %H:%M:%S".freeze
|
56
|
-
|
57
|
-
if Time.method_defined?(:nsec)
|
58
|
-
# @private
|
59
|
-
def self.format_time(time)
|
60
|
-
time.strftime("#{TIME_FORMAT}.#{format('%09d', time.nsec)} %z")
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
DATE_TIME_FORMAT = "%a, %d %b %Y %H:%M:%S.%N %z".freeze
|
65
|
-
|
66
|
-
# ActiveSupport sometimes overrides inspect. If `ActiveSupport` is
|
67
|
-
# defined use a custom format string that includes more time precision.
|
68
|
-
# @private
|
69
|
-
def self.format_date_time(date_time)
|
70
|
-
if defined?(ActiveSupport)
|
71
|
-
date_time.strftime(DATE_TIME_FORMAT)
|
72
|
-
else
|
73
|
-
date_time.inspect
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
# @private
|
78
|
-
InspectableItem = Struct.new(:inspection) do
|
79
|
-
def inspect
|
80
|
-
inspection
|
81
|
-
end
|
82
|
-
|
83
|
-
def pretty_print(pp)
|
84
|
-
pp.text inspection
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
# @private
|
89
|
-
DelegatingInspector = Struct.new(:object) do
|
90
|
-
def inspect
|
91
|
-
if defined?(::Delegator) && ::Delegator === object
|
92
|
-
"#<#{object.class}(#{ObjectFormatter.format(object.__getobj__)})>"
|
93
|
-
else
|
94
|
-
object.inspect
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def pretty_print(pp)
|
99
|
-
pp.text inspect
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
@@ -1,120 +0,0 @@
|
|
1
|
-
require "aruba/matchers/base/base_matcher"
|
2
|
-
require "aruba/matchers/base/message_indenter"
|
3
|
-
|
4
|
-
# Aruba
|
5
|
-
module Aruba
|
6
|
-
# Matchers
|
7
|
-
module Matchers
|
8
|
-
# @api private
|
9
|
-
# Provides the implementation for `include_an_object`.
|
10
|
-
# Not intended to be instantiated directly.
|
11
|
-
class IncludeAnObject < BaseMatcher
|
12
|
-
include Base::MessageIndenter
|
13
|
-
|
14
|
-
protected
|
15
|
-
|
16
|
-
# @private
|
17
|
-
attr_reader :matcher, :failed_objects
|
18
|
-
# @private
|
19
|
-
attr_accessor :any_succeeded_object
|
20
|
-
|
21
|
-
public
|
22
|
-
|
23
|
-
def initialize(matcher)
|
24
|
-
@matcher = matcher
|
25
|
-
@failed_objects = []
|
26
|
-
@any_succeeded_object = false
|
27
|
-
end
|
28
|
-
|
29
|
-
# @api private
|
30
|
-
# @return [String]
|
31
|
-
def failure_message
|
32
|
-
return "#{improve_hash_formatting(super)}, but was not iterable" unless iterable?
|
33
|
-
|
34
|
-
return failed_objects.first if failed_objects.size == 1
|
35
|
-
|
36
|
-
all_messages = [improve_hash_formatting(super)]
|
37
|
-
failed_objects.each_with_index do |matcher_failure_message, index|
|
38
|
-
all_messages << failure_message_for_item(index, matcher_failure_message)
|
39
|
-
end
|
40
|
-
all_messages.join("\n\n")
|
41
|
-
end
|
42
|
-
|
43
|
-
# @api private
|
44
|
-
# @return [String]
|
45
|
-
def description
|
46
|
-
improve_hash_formatting "include an object #{description_of matcher}"
|
47
|
-
end
|
48
|
-
|
49
|
-
def does_not_match?(actual)
|
50
|
-
@actual = actual
|
51
|
-
|
52
|
-
return false unless iterable?
|
53
|
-
|
54
|
-
index_objects
|
55
|
-
|
56
|
-
any_succeeded_object == false
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def match(expected, actual)
|
62
|
-
@actual = actual
|
63
|
-
@expected = expected
|
64
|
-
|
65
|
-
return false unless iterable?
|
66
|
-
|
67
|
-
index_objects
|
68
|
-
|
69
|
-
any_succeeded_object == true
|
70
|
-
end
|
71
|
-
|
72
|
-
def index_objects
|
73
|
-
actual.each_with_index do |actual_item, index|
|
74
|
-
cloned_matcher = matcher.clone
|
75
|
-
begin
|
76
|
-
matches = cloned_matcher.matches?(actual_item)
|
77
|
-
rescue StandardError
|
78
|
-
matches = nil
|
79
|
-
end
|
80
|
-
|
81
|
-
if matches
|
82
|
-
self.any_succeeded_object = true
|
83
|
-
break
|
84
|
-
else
|
85
|
-
failed_objects[index] = cloned_matcher.failure_message
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
def failure_message_for_item(index, failure_message)
|
91
|
-
failure_message = indent_multiline_message(add_new_line_if_needed(failure_message))
|
92
|
-
indent_multiline_message(
|
93
|
-
"object at index #{index} failed to match:#{failure_message}"
|
94
|
-
)
|
95
|
-
end
|
96
|
-
|
97
|
-
def add_new_line_if_needed(message)
|
98
|
-
message.start_with?("\n") ? message : "\n#{message}"
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
module RSpec
|
105
|
-
module Matchers
|
106
|
-
# Passes if the provided matcher passes when checked against any
|
107
|
-
# element of the collection.
|
108
|
-
#
|
109
|
-
# @example
|
110
|
-
# expect([1, 4, 5]).to include_an_object be_odd
|
111
|
-
#
|
112
|
-
# @note You can also use this with compound matchers as well.
|
113
|
-
#
|
114
|
-
# @example
|
115
|
-
# expect([1, 4, 'a']).to include_an_object( be_odd.and be_an(Integer) )
|
116
|
-
def include_an_object(expected)
|
117
|
-
::Aruba::Matchers::IncludeAnObject.new(expected)
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
Aruba.platform.require_matching_files("../collection/**/*.rb", __FILE__)
|