aruba 2.0.0 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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__)
|