collapsium 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +8 -8
- data/collapsium.gemspec +2 -2
- data/lib/collapsium/environment_override.rb +65 -52
- data/lib/collapsium/pathed_access.rb +54 -89
- data/lib/collapsium/support/array_methods.rb +48 -0
- data/lib/collapsium/support/methods.rb +69 -5
- data/lib/collapsium/support/path_components.rb +95 -0
- data/lib/collapsium/version.rb +1 -1
- data/lib/collapsium/viral_capabilities.rb +206 -40
- data/spec/environment_override_spec.rb +43 -18
- data/spec/pathed_access_spec.rb +96 -31
- data/spec/support_methods_spec.rb +247 -5
- data/spec/support_path_components.rb +85 -0
- data/spec/viral_capabilities_spec.rb +42 -15
- metadata +10 -6
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../lib/collapsium/support/path_components'
|
3
|
+
|
4
|
+
describe ::Collapsium::Support::PathComponents do
|
5
|
+
let(:tester) { Class.new { extend ::Collapsium::Support::PathComponents } }
|
6
|
+
|
7
|
+
context "#separator" do
|
8
|
+
it "defaults to DEFAULT_SEPARATOR" do
|
9
|
+
expect(tester.separator).to eql \
|
10
|
+
::Collapsium::Support::PathComponents::DEFAULT_SEPARATOR
|
11
|
+
end
|
12
|
+
|
13
|
+
it "can be set" do
|
14
|
+
expect { tester.separator = ':' }.not_to raise_error
|
15
|
+
expect(tester.separator).to eql ':'
|
16
|
+
|
17
|
+
tester.separator = ::Collapsium::Support::PathComponents::DEFAULT_SEPARATOR
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "#path_prefix" do
|
22
|
+
it "defaults to an empty string" do
|
23
|
+
expect(tester.path_prefix).to eql '.' # == DEFAULT_SEPARATOR
|
24
|
+
end
|
25
|
+
|
26
|
+
it "can be set, but normalizes its value" do
|
27
|
+
expect { tester.path_prefix = 'foo' }.not_to raise_error
|
28
|
+
expect(tester.path_prefix).to eql '.foo' # == DEFAULT_SEPARATOR + 'foo'
|
29
|
+
|
30
|
+
tester.path_prefix = ''
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "#path_components" do
|
35
|
+
it "splits a path into components" do
|
36
|
+
expect(tester.path_components("foo.bar")).to eql %w(foo bar)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "strips empty components at the beginning" do
|
40
|
+
expect(tester.path_components("..foo.bar")).to eql %w(foo bar)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "strips empty components at the end" do
|
44
|
+
expect(tester.path_components("foo.bar..")).to eql %w(foo bar)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "strips empty components in the middle" do
|
48
|
+
expect(tester.path_components("foo...bar")).to eql %w(foo bar)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "#join_path" do
|
53
|
+
it "joins path components" do
|
54
|
+
expect(tester.join_path(%w(foo bar))).to eql "foo.bar"
|
55
|
+
end
|
56
|
+
|
57
|
+
it "joins empty components to an empty string" do
|
58
|
+
expect(tester.join_path([])).to eql ""
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "#normalize_path" do
|
63
|
+
it "normalizes a path" do
|
64
|
+
expect(tester.normalize_path("foo..bar..baz.")).to eql ".foo.bar.baz"
|
65
|
+
end
|
66
|
+
|
67
|
+
it "normalizes an array path" do
|
68
|
+
expect(tester.normalize_path(['foo', '', 'bar'])).to eql ".foo.bar"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "#parent_path" do
|
73
|
+
it "returns the parent of a path" do
|
74
|
+
expect(tester.parent_path(".foo.bar")).to eql ".foo"
|
75
|
+
end
|
76
|
+
|
77
|
+
it "can deal with children of the root" do
|
78
|
+
expect(tester.parent_path(".foo")).to eql "."
|
79
|
+
end
|
80
|
+
|
81
|
+
it "can deal with empty paths" do
|
82
|
+
expect(tester.parent_path("")).to eql "."
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -20,6 +20,10 @@ class ExtendedHash < Hash
|
|
20
20
|
extend TestModule
|
21
21
|
end
|
22
22
|
|
23
|
+
class IncludedArray < Array
|
24
|
+
include TestModule
|
25
|
+
end
|
26
|
+
|
23
27
|
class DirectPrependedHash < Hash
|
24
28
|
prepend ::Collapsium::ViralCapabilities
|
25
29
|
|
@@ -67,7 +71,7 @@ module ViralityModule
|
|
67
71
|
extend ::Collapsium::ViralCapabilities
|
68
72
|
include ::Collapsium::Support::Methods
|
69
73
|
|
70
|
-
def virality(value)
|
74
|
+
def virality(value, *_)
|
71
75
|
# Wrap :delete to become a no-op
|
72
76
|
wrap_method(value, :delete) do
|
73
77
|
next true
|
@@ -80,7 +84,7 @@ describe ::Collapsium::ViralCapabilities do
|
|
80
84
|
context PrependedHash do
|
81
85
|
let(:tester) do
|
82
86
|
x = PrependedHash.new
|
83
|
-
x.merge!(foo: { bar: { baz: true } })
|
87
|
+
x.merge!(foo: { bar: [{ baz: true }] })
|
84
88
|
end
|
85
89
|
|
86
90
|
before do
|
@@ -89,14 +93,15 @@ describe ::Collapsium::ViralCapabilities do
|
|
89
93
|
|
90
94
|
it "replicates itself" do
|
91
95
|
expect(tester[:foo].respond_to?(:find_me)).to be_truthy
|
92
|
-
expect(tester[:foo][:bar].respond_to?(:find_me)).to be_truthy
|
96
|
+
expect(tester[:foo][:bar][0].respond_to?(:find_me)).to be_truthy
|
97
|
+
expect(tester[:foo][:bar][0].class).to eql PrependedHash
|
93
98
|
end
|
94
99
|
end
|
95
100
|
|
96
101
|
context IncludedHash do
|
97
102
|
let(:tester) do
|
98
103
|
x = IncludedHash.new
|
99
|
-
x.merge!(foo: { bar: { baz: true } })
|
104
|
+
x.merge!(foo: { bar: [{ baz: true }] })
|
100
105
|
end
|
101
106
|
|
102
107
|
before do
|
@@ -105,14 +110,32 @@ describe ::Collapsium::ViralCapabilities do
|
|
105
110
|
|
106
111
|
it "replicates itself" do
|
107
112
|
expect(tester[:foo].respond_to?(:find_me)).to be_truthy
|
108
|
-
expect(tester[:foo][:bar].respond_to?(:find_me)).to be_truthy
|
113
|
+
expect(tester[:foo][:bar][0].respond_to?(:find_me)).to be_truthy
|
114
|
+
expect(tester[:foo][:bar][0].class).to eql IncludedHash
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context IncludedArray do
|
119
|
+
let(:tester) do
|
120
|
+
x = IncludedArray.new
|
121
|
+
x << { foo: { bar: [{ baz: true }, 42] } }
|
122
|
+
end
|
123
|
+
|
124
|
+
before do
|
125
|
+
expect(tester.respond_to?(:find_me)).to be_truthy
|
126
|
+
end
|
127
|
+
|
128
|
+
it "replicates itself" do
|
129
|
+
expect(tester[0][:foo].respond_to?(:find_me)).to be_truthy
|
130
|
+
expect(tester[0][:foo][:bar][0].respond_to?(:find_me)).to be_truthy
|
131
|
+
expect(tester[0][:foo][:bar].class).to eql IncludedArray
|
109
132
|
end
|
110
133
|
end
|
111
134
|
|
112
135
|
context ExtendedHash do
|
113
136
|
let(:tester) do
|
114
137
|
x = ExtendedHash.new
|
115
|
-
x.merge!(foo: { bar: { baz: true } })
|
138
|
+
x.merge!(foo: { bar: [{ baz: true }] })
|
116
139
|
end
|
117
140
|
|
118
141
|
it "does not receive viral capabilities" do
|
@@ -123,7 +146,7 @@ describe ::Collapsium::ViralCapabilities do
|
|
123
146
|
context DirectPrependedHash do
|
124
147
|
let(:tester) do
|
125
148
|
x = DirectPrependedHash.new
|
126
|
-
x.merge!(foo: { bar: { baz: true } })
|
149
|
+
x.merge!(foo: { bar: [{ baz: true }] })
|
127
150
|
end
|
128
151
|
|
129
152
|
before do
|
@@ -138,7 +161,7 @@ describe ::Collapsium::ViralCapabilities do
|
|
138
161
|
context DirectIncludedHash do
|
139
162
|
let(:tester) do
|
140
163
|
x = DirectIncludedHash.new
|
141
|
-
x.merge!(foo: { bar: { baz: true } })
|
164
|
+
x.merge!(foo: { bar: [{ baz: true }] })
|
142
165
|
end
|
143
166
|
|
144
167
|
before do
|
@@ -147,14 +170,14 @@ describe ::Collapsium::ViralCapabilities do
|
|
147
170
|
|
148
171
|
it "replicates itself" do
|
149
172
|
expect(tester[:foo].respond_to?(:find_me)).to be_truthy
|
150
|
-
expect(tester[:foo][:bar].respond_to?(:find_me)).to be_truthy
|
173
|
+
expect(tester[:foo][:bar][0].respond_to?(:find_me)).to be_truthy
|
151
174
|
end
|
152
175
|
end
|
153
176
|
|
154
177
|
context DirectExtendedHash do
|
155
178
|
let(:tester) do
|
156
179
|
x = DirectExtendedHash.new
|
157
|
-
x.merge!(foo: { bar: { baz: true } })
|
180
|
+
x.merge!(foo: { bar: [{ baz: true }] })
|
158
181
|
end
|
159
182
|
|
160
183
|
before do
|
@@ -163,7 +186,7 @@ describe ::Collapsium::ViralCapabilities do
|
|
163
186
|
|
164
187
|
it "replicates itself" do
|
165
188
|
expect(tester[:foo].respond_to?(:find_me)).to be_truthy
|
166
|
-
expect(tester[:foo][:bar].respond_to?(:find_me)).to be_truthy
|
189
|
+
expect(tester[:foo][:bar][0].respond_to?(:find_me)).to be_truthy
|
167
190
|
end
|
168
191
|
end
|
169
192
|
|
@@ -186,7 +209,7 @@ describe ::Collapsium::ViralCapabilities do
|
|
186
209
|
let(:tester) do
|
187
210
|
x = {}
|
188
211
|
x.extend(TestModule)
|
189
|
-
x.merge!(foo: { bar: { baz: true } })
|
212
|
+
x.merge!(foo: { bar: [{ baz: { quux: true } }] })
|
190
213
|
end
|
191
214
|
|
192
215
|
before do
|
@@ -195,7 +218,7 @@ describe ::Collapsium::ViralCapabilities do
|
|
195
218
|
|
196
219
|
it "replicates itself" do
|
197
220
|
expect(tester[:foo].respond_to?(:find_me)).to be_truthy
|
198
|
-
expect(tester[:foo][:bar].respond_to?(:find_me)).to be_truthy
|
221
|
+
expect(tester[:foo][:bar][0][:baz].respond_to?(:find_me)).to be_truthy
|
199
222
|
end
|
200
223
|
end
|
201
224
|
|
@@ -203,7 +226,7 @@ describe ::Collapsium::ViralCapabilities do
|
|
203
226
|
let(:tester) do
|
204
227
|
x = {}
|
205
228
|
x.extend(ViralityModule)
|
206
|
-
x.merge!(foo: { bar: { baz: true } })
|
229
|
+
x.merge!(foo: { bar: [{ baz: true }] })
|
207
230
|
end
|
208
231
|
|
209
232
|
before do
|
@@ -214,7 +237,7 @@ describe ::Collapsium::ViralCapabilities do
|
|
214
237
|
# Just check that the module went viral; it doesn't check the viral
|
215
238
|
# enhancements work.
|
216
239
|
expect(tester[:foo].respond_to?(:virality)).to be_truthy
|
217
|
-
expect(tester[:foo][:bar].respond_to?(:virality)).to be_truthy
|
240
|
+
expect(tester[:foo][:bar][0].respond_to?(:virality)).to be_truthy
|
218
241
|
|
219
242
|
# Now also check the viral enhancements. In this case, :delete becomes a
|
220
243
|
# no-op.
|
@@ -226,19 +249,23 @@ describe ::Collapsium::ViralCapabilities do
|
|
226
249
|
end
|
227
250
|
|
228
251
|
context "values already of the same class" do
|
252
|
+
# rubocop:disable Performance/RedundantMerge
|
229
253
|
let(:innermost) do
|
230
254
|
innermost = PrependedHash.new
|
231
255
|
innermost.merge!(quux: true)
|
256
|
+
innermost
|
232
257
|
end
|
233
258
|
|
234
259
|
let(:inner) do
|
235
260
|
inner = {}
|
236
261
|
inner.merge!(foo: true, bar: innermost)
|
262
|
+
inner
|
237
263
|
end
|
238
264
|
|
239
265
|
let(:tester) do
|
240
266
|
PrependedHash.new
|
241
267
|
end
|
268
|
+
# rubocop:enable Performance/RedundantMerge
|
242
269
|
|
243
270
|
it "peforms a no-op when adding the right class" do
|
244
271
|
tester[:bar] = inner
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: collapsium
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jens Finkhaeuser
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -30,28 +30,28 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
33
|
+
version: '0.44'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0.
|
40
|
+
version: '0.44'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '11.
|
47
|
+
version: '11.3'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '11.
|
54
|
+
version: '11.3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -121,8 +121,10 @@ files:
|
|
121
121
|
- lib/collapsium/recursive_dup.rb
|
122
122
|
- lib/collapsium/recursive_merge.rb
|
123
123
|
- lib/collapsium/recursive_sort.rb
|
124
|
+
- lib/collapsium/support/array_methods.rb
|
124
125
|
- lib/collapsium/support/hash_methods.rb
|
125
126
|
- lib/collapsium/support/methods.rb
|
127
|
+
- lib/collapsium/support/path_components.rb
|
126
128
|
- lib/collapsium/uber_hash.rb
|
127
129
|
- lib/collapsium/version.rb
|
128
130
|
- lib/collapsium/viral_capabilities.rb
|
@@ -135,6 +137,7 @@ files:
|
|
135
137
|
- spec/recursive_sort_spec.rb
|
136
138
|
- spec/spec_helper.rb
|
137
139
|
- spec/support_methods_spec.rb
|
140
|
+
- spec/support_path_components.rb
|
138
141
|
- spec/uber_hash_spec.rb
|
139
142
|
- spec/viral_capabilities_spec.rb
|
140
143
|
homepage: https://github.com/jfinkhaeuser/collapsium
|
@@ -171,5 +174,6 @@ test_files:
|
|
171
174
|
- spec/recursive_sort_spec.rb
|
172
175
|
- spec/spec_helper.rb
|
173
176
|
- spec/support_methods_spec.rb
|
177
|
+
- spec/support_path_components.rb
|
174
178
|
- spec/uber_hash_spec.rb
|
175
179
|
- spec/viral_capabilities_spec.rb
|