librarian 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -2
  3. data/CHANGELOG.md +15 -0
  4. data/Gemfile +2 -0
  5. data/VERSION +1 -0
  6. data/lib/librarian/algorithms.rb +133 -0
  7. data/lib/librarian/cli/manifest_presenter.rb +1 -5
  8. data/lib/librarian/dependency.rb +7 -1
  9. data/lib/librarian/environment.rb +20 -2
  10. data/lib/librarian/environment/runtime_cache.rb +101 -0
  11. data/lib/librarian/manifest.rb +7 -1
  12. data/lib/librarian/manifest_set.rb +11 -12
  13. data/lib/librarian/posix.rb +14 -5
  14. data/lib/librarian/resolver.rb +22 -9
  15. data/lib/librarian/resolver/implementation.rb +64 -49
  16. data/lib/librarian/source/git.rb +47 -11
  17. data/lib/librarian/source/git/repository.rb +33 -3
  18. data/lib/librarian/version.rb +1 -1
  19. data/librarian.gemspec +8 -6
  20. data/spec/functional/cli_spec.rb +1 -1
  21. data/spec/functional/posix_spec.rb +6 -8
  22. data/spec/functional/source/git/repository_spec.rb +55 -27
  23. data/spec/functional/source/git_spec.rb +152 -8
  24. data/spec/support/project_path_macro.rb +14 -0
  25. data/spec/unit/action/base_spec.rb +1 -1
  26. data/spec/unit/action/clean_spec.rb +6 -6
  27. data/spec/unit/action/install_spec.rb +5 -5
  28. data/spec/unit/algorithms_spec.rb +131 -0
  29. data/spec/unit/config/database_spec.rb +38 -38
  30. data/spec/unit/dependency/requirement_spec.rb +12 -0
  31. data/spec/unit/dsl_spec.rb +49 -49
  32. data/spec/unit/environment/runtime_cache_spec.rb +73 -0
  33. data/spec/unit/environment_spec.rb +28 -28
  34. data/spec/unit/lockfile/parser_spec.rb +18 -18
  35. data/spec/unit/lockfile_spec.rb +3 -3
  36. data/spec/unit/manifest/version_spec.rb +11 -0
  37. data/spec/unit/manifest_set_spec.rb +20 -20
  38. data/spec/unit/mock/environment_spec.rb +4 -4
  39. data/spec/unit/resolver_spec.rb +61 -20
  40. data/spec/unit/spec_change_set_spec.rb +19 -19
  41. metadata +19 -5
@@ -0,0 +1,73 @@
1
+ require "librarian/environment/runtime_cache"
2
+
3
+ module Librarian
4
+ class Environment
5
+ describe RuntimeCache do
6
+
7
+ let(:rtc) { described_class.new }
8
+ let(:key) { ["brah", "nick"] }
9
+ let(:key_x) { ["brah", "phar"] }
10
+ let(:key_y) { ["rost", "phar"] }
11
+
12
+ def triple(keypair)
13
+ [rtc.include?(*keypair), rtc.get(*keypair), rtc.memo(*keypair){yield}]
14
+ end
15
+
16
+ context "originally" do
17
+ specify { expect(triple(key){9}).to eql([false, nil, 9]) }
18
+ end
19
+
20
+ context "after put" do
21
+ before { rtc.put(*key){6} }
22
+
23
+ specify { expect(triple(key){9}).to eql([true, 6, 6]) }
24
+ specify { expect(triple(key_x){9}).to eql([false, nil, 9]) }
25
+ specify { expect(triple(key_y){9}).to eql([false, nil, 9]) }
26
+ end
27
+
28
+ context "after put then delete" do
29
+ before { rtc.put(*key){6} }
30
+ before { rtc.delete *key }
31
+
32
+ specify { expect(triple(key){9}).to eql([false, nil, 9]) }
33
+ specify { expect(triple(key_x){9}).to eql([false, nil, 9]) }
34
+ specify { expect(triple(key_y){9}).to eql([false, nil, 9]) }
35
+ end
36
+
37
+ context "after memo" do
38
+ before { rtc.memo(*key){6} }
39
+
40
+ specify { expect(triple(key){9}).to eql([true, 6, 6]) }
41
+ specify { expect(triple(key_x){9}).to eql([false, nil, 9]) }
42
+ specify { expect(triple(key_y){9}).to eql([false, nil, 9]) }
43
+ end
44
+
45
+ context "after memo then delete" do
46
+ before { rtc.memo(*key){6} }
47
+ before { rtc.delete *key }
48
+
49
+ specify { expect(triple(key){9}).to eql([false, nil, 9]) }
50
+ specify { expect(triple(key_x){9}).to eql([false, nil, 9]) }
51
+ specify { expect(triple(key_y){9}).to eql([false, nil, 9]) }
52
+ end
53
+
54
+ context "with keyspace wrapper" do
55
+ let(:krtc) { rtc.keyspace("brah") }
56
+ let(:key) { "nick" }
57
+ let(:key_x) { "phar" }
58
+
59
+ def triple(keypair)
60
+ [krtc.include?(key), krtc.get(key), krtc.memo(key){yield}]
61
+ end
62
+
63
+ context "after put" do
64
+ before { krtc.put(key){6} }
65
+
66
+ specify { expect(triple(key){9}).to eql([true, 6, 6]) }
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+ end
73
+ end
@@ -9,15 +9,15 @@ module Librarian
9
9
  let(:env) { described_class.new }
10
10
 
11
11
  describe "#adapter_module" do
12
- specify { env.adapter_module.should be nil }
12
+ specify { expect(env.adapter_module).to be nil }
13
13
  end
14
14
 
15
15
  describe "#adapter_name" do
16
- specify { env.adapter_name.should be nil }
16
+ specify { expect(env.adapter_name).to be nil }
17
17
  end
18
18
 
19
19
  describe "#adapter_version" do
20
- specify { env.adapter_version.should be nil }
20
+ specify { expect(env.adapter_version).to be nil }
21
21
  end
22
22
 
23
23
  describe "computing the home" do
@@ -27,7 +27,7 @@ module Librarian
27
27
 
28
28
  it "finds the home" do
29
29
  env.stub(:adapter_name).and_return("cat")
30
- env.config_db.underlying_home.to_s.should == "/path/to/home"
30
+ expect(env.config_db.underlying_home.to_s).to eq "/path/to/home"
31
31
  end
32
32
  end
33
33
 
@@ -37,7 +37,7 @@ module Librarian
37
37
 
38
38
  it "finds the home" do
39
39
  env.stub(:adapter_name).and_return("cat")
40
- env.config_db.underlying_home.to_s.should == real_home
40
+ expect(env.config_db.underlying_home.to_s).to eq real_home
41
41
  end
42
42
  end
43
43
 
@@ -49,7 +49,7 @@ module Librarian
49
49
  with_env "http_proxy" => nil
50
50
 
51
51
  it "should have a nil http proxy uri" do
52
- env.http_proxy_uri.should be_nil
52
+ expect(env.http_proxy_uri).to be_nil
53
53
  end
54
54
  end
55
55
 
@@ -57,19 +57,19 @@ module Librarian
57
57
  with_env "http_proxy" => "admin:secret@example.com"
58
58
 
59
59
  it "should have the expcted http proxy uri" do
60
- env.http_proxy_uri.should == URI("http://admin:secret@example.com")
60
+ expect(env.http_proxy_uri).to eq URI("http://admin:secret@example.com")
61
61
  end
62
62
 
63
63
  it "should have the expected host" do
64
- env.http_proxy_uri.host.should == "example.com"
64
+ expect(env.http_proxy_uri.host).to eq "example.com"
65
65
  end
66
66
 
67
67
  it "should have the expected user" do
68
- env.http_proxy_uri.user.should == "admin"
68
+ expect(env.http_proxy_uri.user).to eq "admin"
69
69
  end
70
70
 
71
71
  it "should have the expected password" do
72
- env.http_proxy_uri.password.should == "secret"
72
+ expect(env.http_proxy_uri.password).to eq "secret"
73
73
  end
74
74
  end
75
75
 
@@ -79,7 +79,7 @@ module Librarian
79
79
  "http_proxy_pass" => "secret"
80
80
 
81
81
  it "should have the expcted http proxy uri" do
82
- env.http_proxy_uri.should == URI("http://admin:secret@example.com")
82
+ expect(env.http_proxy_uri).to eq URI("http://admin:secret@example.com")
83
83
  end
84
84
  end
85
85
 
@@ -91,11 +91,11 @@ module Librarian
91
91
  with_env "http_proxy" => nil
92
92
 
93
93
  it "should have the normal class" do
94
- env.net_http_class(proxied_host).should be Net::HTTP
94
+ expect(env.net_http_class(proxied_host)).to be Net::HTTP
95
95
  end
96
96
 
97
97
  it "should not be marked as a proxy class" do
98
- env.net_http_class(proxied_host).should_not be_proxy_class
98
+ expect(env.net_http_class(proxied_host)).to_not be_proxy_class
99
99
  end
100
100
  end
101
101
 
@@ -103,18 +103,18 @@ module Librarian
103
103
  with_env "http_proxy" => "admin:secret@example.com"
104
104
 
105
105
  it "should not by marked as a proxy class for localhost" do
106
- env.net_http_class('localhost').should_not be_proxy_class
106
+ expect(env.net_http_class('localhost')).to_not be_proxy_class
107
107
  end
108
108
  it "should not have the normal class" do
109
- env.net_http_class(proxied_host).should_not be Net::HTTP
109
+ expect(env.net_http_class(proxied_host)).to_not be Net::HTTP
110
110
  end
111
111
 
112
112
  it "should have a subclass the normal class" do
113
- env.net_http_class(proxied_host).should < Net::HTTP
113
+ expect(env.net_http_class(proxied_host)).to be < Net::HTTP
114
114
  end
115
115
 
116
116
  it "should be marked as a proxy class" do
117
- env.net_http_class(proxied_host).should be_proxy_class
117
+ expect(env.net_http_class(proxied_host)).to be_proxy_class
118
118
  end
119
119
 
120
120
  it "should have the expected proxy attributes" do
@@ -132,7 +132,7 @@ module Librarian
132
132
  "pass" => http.proxy_pass,
133
133
  }
134
134
 
135
- actual_attributes.should == expected_attributes
135
+ expect(actual_attributes).to eq expected_attributes
136
136
  end
137
137
 
138
138
  end
@@ -145,11 +145,11 @@ module Librarian
145
145
  let(:proxied_host) { "noproxy.com" }
146
146
 
147
147
  it "should have the normal class" do
148
- env.net_http_class(proxied_host).should be Net::HTTP
148
+ expect(env.net_http_class(proxied_host)).to be Net::HTTP
149
149
  end
150
150
 
151
151
  it "should not be marked as a proxy class" do
152
- env.net_http_class(proxied_host).should_not be_proxy_class
152
+ expect(env.net_http_class(proxied_host)).to_not be_proxy_class
153
153
  end
154
154
  end
155
155
 
@@ -157,11 +157,11 @@ module Librarian
157
157
  let(:proxied_host) { "www.noproxy.com" }
158
158
 
159
159
  it "should have the normal class" do
160
- env.net_http_class(proxied_host).should be Net::HTTP
160
+ expect(env.net_http_class(proxied_host)).to be Net::HTTP
161
161
  end
162
162
 
163
163
  it "should not be marked as a proxy class" do
164
- env.net_http_class(proxied_host).should_not be_proxy_class
164
+ expect(env.net_http_class(proxied_host)).to_not be_proxy_class
165
165
  end
166
166
  end
167
167
 
@@ -169,11 +169,11 @@ module Librarian
169
169
  let(:proxied_host) { "localhost" }
170
170
 
171
171
  it "should have the normal class" do
172
- env.net_http_class(proxied_host).should be Net::HTTP
172
+ expect(env.net_http_class(proxied_host)).to be Net::HTTP
173
173
  end
174
174
 
175
175
  it "should not be marked as a proxy class" do
176
- env.net_http_class(proxied_host).should_not be_proxy_class
176
+ expect(env.net_http_class(proxied_host)).to_not be_proxy_class
177
177
  end
178
178
  end
179
179
 
@@ -181,11 +181,11 @@ module Librarian
181
181
  let(:proxied_host) { "127.0.0.1" }
182
182
 
183
183
  it "should have the normal class" do
184
- env.net_http_class(proxied_host).should be Net::HTTP
184
+ expect(env.net_http_class(proxied_host)).to be Net::HTTP
185
185
  end
186
186
 
187
187
  it "should not be marked as a proxy class" do
188
- env.net_http_class(proxied_host).should_not be_proxy_class
188
+ expect(env.net_http_class(proxied_host)).to_not be_proxy_class
189
189
  end
190
190
  end
191
191
 
@@ -193,11 +193,11 @@ module Librarian
193
193
  let(:proxied_host) { "www.example.com" }
194
194
 
195
195
  it "should have a subclass the normal class" do
196
- env.net_http_class(proxied_host).should < Net::HTTP
196
+ expect(env.net_http_class(proxied_host)).to be < Net::HTTP
197
197
  end
198
198
 
199
199
  it "should be marked as a proxy class" do
200
- env.net_http_class(proxied_host).should be_proxy_class
200
+ expect(env.net_http_class(proxied_host)).to be_proxy_class
201
201
  end
202
202
  end
203
203
 
@@ -22,11 +22,11 @@ module Librarian
22
22
  end
23
23
 
24
24
  it "should give an empty list of dependencies" do
25
- resolution.dependencies.should be_empty
25
+ expect(resolution.dependencies).to be_empty
26
26
  end
27
27
 
28
28
  it "should give an empty list of manifests" do
29
- resolution.manifests.should be_empty
29
+ expect(resolution.manifests).to be_empty
30
30
  end
31
31
  end
32
32
 
@@ -45,56 +45,56 @@ module Librarian
45
45
  end
46
46
 
47
47
  it "should give a list of one dependency" do
48
- resolution.should have(1).dependencies
48
+ expect(resolution).to have(1).dependencies
49
49
  end
50
50
 
51
51
  it "should give a dependency with the expected name" do
52
52
  dependency = resolution.dependencies.first
53
53
 
54
- dependency.name.should == "jelly"
54
+ expect(dependency.name).to eq "jelly"
55
55
  end
56
56
 
57
57
  it "should give a dependency with the expected requirement" do
58
58
  dependency = resolution.dependencies.first
59
59
 
60
60
  # Note: it must be this order because this order is lexicographically sorted.
61
- dependency.requirement.to_s.should == "!= 1.2.6, ~> 1.1"
61
+ expect(dependency.requirement.to_s).to eq "!= 1.2.6, ~> 1.1"
62
62
  end
63
63
 
64
64
  it "should give a dependency wth the expected source" do
65
65
  dependency = resolution.dependencies.first
66
66
  source = dependency.source
67
67
 
68
- source.name.should == "source-a"
68
+ expect(source.name).to eq "source-a"
69
69
  end
70
70
 
71
71
  it "should give a list of one manifest" do
72
- resolution.should have(1).manifests
72
+ expect(resolution).to have(1).manifests
73
73
  end
74
74
 
75
75
  it "should give a manifest with the expected name" do
76
76
  manifest = resolution.manifests.first
77
77
 
78
- manifest.name.should == "jelly"
78
+ expect(manifest.name).to eq "jelly"
79
79
  end
80
80
 
81
81
  it "should give a manifest with the expected version" do
82
82
  manifest = resolution.manifests.first
83
83
 
84
- manifest.version.to_s.should == "1.3.5"
84
+ expect(manifest.version.to_s).to eq "1.3.5"
85
85
  end
86
86
 
87
87
  it "should give a manifest with no dependencies" do
88
88
  manifest = resolution.manifests.first
89
89
 
90
- manifest.dependencies.should be_empty
90
+ expect(manifest.dependencies).to be_empty
91
91
  end
92
92
 
93
93
  it "should give a manifest with the expected source" do
94
94
  manifest = resolution.manifests.first
95
95
  source = manifest.source
96
96
 
97
- source.name.should == "source-a"
97
+ expect(source.name).to eq "source-a"
98
98
  end
99
99
 
100
100
  it "should give the dependency and the manifest the same source instance" do
@@ -104,7 +104,7 @@ module Librarian
104
104
  dependency_source = dependency.source
105
105
  manifest_source = manifest.source
106
106
 
107
- manifest_source.should be dependency_source
107
+ expect(manifest_source).to be dependency_source
108
108
  end
109
109
  end
110
110
 
@@ -125,36 +125,36 @@ module Librarian
125
125
  end
126
126
 
127
127
  it "should give a list of one dependency" do
128
- resolution.should have(1).dependencies
128
+ expect(resolution).to have(1).dependencies
129
129
  end
130
130
 
131
131
  it "should have the expected dependency" do
132
132
  dependency = resolution.dependencies.first
133
133
 
134
- dependency.name.should == "jelly"
134
+ expect(dependency.name).to eq "jelly"
135
135
  end
136
136
 
137
137
  it "should give a list of all the manifests" do
138
- resolution.should have(2).manifests
138
+ expect(resolution).to have(2).manifests
139
139
  end
140
140
 
141
141
  it "should include all the expected manifests" do
142
142
  manifests = ManifestSet.new(resolution.manifests)
143
143
 
144
- manifests.to_hash.keys.should =~ %w(butter jelly)
144
+ expect(manifests.to_hash.keys).to match_array( %w(butter jelly) )
145
145
  end
146
146
 
147
147
  it "should have an internally consistent set of manifests" do
148
148
  manifests = ManifestSet.new(resolution.manifests)
149
149
 
150
- manifests.should be_consistent
150
+ expect(manifests).to be_consistent
151
151
  end
152
152
 
153
153
  it "should have an externally consistent set of manifests" do
154
154
  dependencies = resolution.dependencies
155
155
  manifests = ManifestSet.new(resolution.manifests)
156
156
 
157
- manifests.should be_in_compliance_with dependencies
157
+ expect(manifests).to be_in_compliance_with dependencies
158
158
  end
159
159
  end
160
160
 
@@ -39,7 +39,7 @@ module Librarian
39
39
 
40
40
  context "just saving" do
41
41
  it "should return the lockfile text" do
42
- lockfile_text.should_not be_nil
42
+ expect(lockfile_text).to_not be_nil
43
43
  end
44
44
  end
45
45
 
@@ -47,7 +47,7 @@ module Librarian
47
47
  let(:reloaded_resolution) { lockfile.load(lockfile_text) }
48
48
 
49
49
  it "should have the expected manifests" do
50
- reloaded_resolution.manifests.count.should == resolution.manifests.count
50
+ expect(reloaded_resolution.manifests.count).to eq resolution.manifests.count
51
51
  end
52
52
  end
53
53
 
@@ -56,7 +56,7 @@ module Librarian
56
56
  let(:bounced_lockfile_text) { lockfile.save(bounced_resolution) }
57
57
 
58
58
  it "should return the same lockfile text after bouncing as before bouncing" do
59
- bounced_lockfile_text.should == lockfile_text
59
+ expect(bounced_lockfile_text).to eq lockfile_text
60
60
  end
61
61
  end
62
62
  end
@@ -0,0 +1,11 @@
1
+ require "librarian/manifest"
2
+
3
+ describe Librarian::Manifest::Version do
4
+
5
+ describe "#inspect" do
6
+ subject(:version) { described_class.new("3.2.1") }
7
+
8
+ specify { expect(version.inspect).to eq "#<Librarian::Manifest::Version 3.2.1>" }
9
+ end
10
+
11
+ end
@@ -15,11 +15,11 @@ module Librarian
15
15
  let(:set) { described_class.new(array) }
16
16
 
17
17
  it "should give back the array" do
18
- set.to_a.should =~ array
18
+ expect(set.to_a).to match_array( array )
19
19
  end
20
20
 
21
21
  it "should give back the hash" do
22
- set.to_hash.should == hash
22
+ expect(set.to_hash).to eq hash
23
23
  end
24
24
  end
25
25
 
@@ -27,11 +27,11 @@ module Librarian
27
27
  let(:set) { described_class.new(hash) }
28
28
 
29
29
  it "should give back the array" do
30
- set.to_a.should =~ array
30
+ expect(set.to_a).to match_array( array )
31
31
  end
32
32
 
33
33
  it "should give back the hash" do
34
- set.to_hash.should == hash
34
+ expect(set.to_hash).to eq hash
35
35
  end
36
36
  end
37
37
  end
@@ -48,19 +48,19 @@ module Librarian
48
48
  it "should not do anything when given no names" do
49
49
  set.shallow_strip!([])
50
50
 
51
- set.to_a.should =~ [jelly, butter, jam]
51
+ expect(set.to_a).to match_array( [jelly, butter, jam] )
52
52
  end
53
53
 
54
54
  it "should remove only the named elements" do
55
55
  set.shallow_strip!(["butter", "jam"])
56
56
 
57
- set.to_a.should =~ [jelly]
57
+ expect(set.to_a).to match_array( [jelly] )
58
58
  end
59
59
 
60
60
  it "should allow removing all the elements" do
61
61
  set.shallow_strip!(["jelly", "butter", "jam"])
62
62
 
63
- set.to_a.should =~ []
63
+ expect(set.to_a).to match_array( [] )
64
64
  end
65
65
  end
66
66
 
@@ -76,19 +76,19 @@ module Librarian
76
76
  it "should empty the set when given no names" do
77
77
  set.shallow_keep!([])
78
78
 
79
- set.to_a.should =~ []
79
+ expect(set.to_a).to match_array( [] )
80
80
  end
81
81
 
82
82
  it "should keep only the named elements" do
83
83
  set.shallow_keep!(["butter", "jam"])
84
84
 
85
- set.to_a.should =~ [butter, jam]
85
+ expect(set.to_a).to match_array( [butter, jam] )
86
86
  end
87
87
 
88
88
  it "should allow keeping all the elements" do
89
89
  set.shallow_keep!(["jelly", "butter", "jam"])
90
90
 
91
- set.to_a.should =~ [jelly, butter, jam]
91
+ expect(set.to_a).to match_array( [jelly, butter, jam] )
92
92
  end
93
93
  end
94
94
 
@@ -117,31 +117,31 @@ module Librarian
117
117
  it "should not do anything when given no names" do
118
118
  set.deep_strip!([])
119
119
 
120
- set.to_a.should =~ [a, b, c, d, e, f, g, h]
120
+ expect(set.to_a).to match_array( [a, b, c, d, e, f, g, h] )
121
121
  end
122
122
 
123
123
  it "should remove just the named elements if they have no dependencies" do
124
124
  set.deep_strip!(["c", "h"])
125
125
 
126
- set.to_a.should =~ [a, b, d, e, f, g]
126
+ expect(set.to_a).to match_array( [a, b, d, e, f, g] )
127
127
  end
128
128
 
129
129
  it "should remove the named elements and all their dependencies" do
130
130
  set.deep_strip!(["b"])
131
131
 
132
- set.to_a.should =~ [a, e, f, g, h]
132
+ expect(set.to_a).to match_array( [a, e, f, g, h] )
133
133
  end
134
134
 
135
135
  it "should remove an entire tree of dependencies" do
136
136
  set.deep_strip!(["e"])
137
137
 
138
- set.to_a.should =~ [a, b, c, d]
138
+ expect(set.to_a).to match_array( [a, b, c, d] )
139
139
  end
140
140
 
141
141
  it "should allow removing all the elements" do
142
142
  set.deep_strip!(["a", "e"])
143
143
 
144
- set.to_a.should =~ []
144
+ expect(set.to_a).to match_array( [] )
145
145
  end
146
146
  end
147
147
 
@@ -170,31 +170,31 @@ module Librarian
170
170
  it "should remove all the elements when given no names" do
171
171
  set.deep_keep!([])
172
172
 
173
- set.to_a.should =~ []
173
+ expect(set.to_a).to match_array( [] )
174
174
  end
175
175
 
176
176
  it "should keep just the named elements if they have no dependencies" do
177
177
  set.deep_keep!(["c", "h"])
178
178
 
179
- set.to_a.should =~ [c, h]
179
+ expect(set.to_a).to match_array( [c, h] )
180
180
  end
181
181
 
182
182
  it "should keep the named elements and all their dependencies" do
183
183
  set.deep_keep!(["b"])
184
184
 
185
- set.to_a.should =~ [b, c, d]
185
+ expect(set.to_a).to match_array( [b, c, d] )
186
186
  end
187
187
 
188
188
  it "should keep an entire tree of dependencies" do
189
189
  set.deep_keep!(["e"])
190
190
 
191
- set.to_a.should =~ [e, f, g, h]
191
+ expect(set.to_a).to match_array( [e, f, g, h] )
192
192
  end
193
193
 
194
194
  it "should allow keeping all the elements" do
195
195
  set.deep_keep!(["a", "e"])
196
196
 
197
- set.to_a.should =~ [a, b, c, d, e, f, g, h]
197
+ expect(set.to_a).to match_array( [a, b, c, d, e, f, g, h] )
198
198
  end
199
199
  end
200
200