asset_cloud 2.5.3 → 2.6.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/.rubocop.yml +3 -0
- data/.rubocop_todo.yml +326 -0
- data/History.md +6 -0
- data/README.rdoc +8 -0
- data/Rakefile +5 -2
- data/asset_cloud.gemspec +2 -2
- data/lib/asset_cloud/asset.rb +4 -0
- data/lib/asset_cloud/metadata.rb +10 -3
- data/spec/active_record_bucket_spec.rb +27 -27
- data/spec/asset_cloud/metadata_spec.rb +31 -0
- data/spec/asset_extension_spec.rb +21 -18
- data/spec/asset_spec.rb +47 -56
- data/spec/base_spec.rb +60 -62
- data/spec/blackhole_bucket_spec.rb +6 -5
- data/spec/bucket_chain_spec.rb +50 -50
- data/spec/bucket_spec.rb +5 -4
- data/spec/callbacks_spec.rb +31 -31
- data/spec/file_system_spec.rb +15 -16
- data/spec/find_free_key_spec.rb +17 -19
- data/spec/gcs_bucket_remote_spec.rb +18 -19
- data/spec/gcs_bucket_spec.rb +29 -28
- data/spec/memory_bucket_spec.rb +8 -9
- data/spec/mock_s3_interface.rb +4 -3
- data/spec/remote_s3_bucket_spec.rb +17 -16
- data/spec/s3_bucket_spec.rb +12 -12
- data/spec/spec_helper.rb +2 -1
- data/spec/validations_spec.rb +18 -16
- data/spec/versioned_memory_bucket_spec.rb +6 -6
- metadata +9 -5
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'asset_cloud/metadata'
|
3
|
+
|
4
|
+
module AssetCloud
|
5
|
+
describe Metadata do
|
6
|
+
it "exposes the checksum" do
|
7
|
+
exist = true
|
8
|
+
size = 1
|
9
|
+
created_at = Time.utc(2020, 5, 19, 13, 14, 15)
|
10
|
+
updated_at = Time.utc(2020, 5, 19, 16, 17, 18)
|
11
|
+
value_hash = "abc123"
|
12
|
+
checksum = "def456"
|
13
|
+
|
14
|
+
metadata = Metadata.new(exist, size, created_at, updated_at, value_hash, checksum)
|
15
|
+
|
16
|
+
expect(metadata.checksum).to(eq("def456"))
|
17
|
+
end
|
18
|
+
|
19
|
+
it "defaults the checksum to nil if not provided" do
|
20
|
+
exist = true
|
21
|
+
size = 1
|
22
|
+
created_at = Time.utc(2020, 5, 19, 13, 14, 15)
|
23
|
+
updated_at = Time.utc(2020, 5, 19, 16, 17, 18)
|
24
|
+
value_hash = "abc123"
|
25
|
+
|
26
|
+
metadata = Metadata.new(exist, size, created_at, updated_at, value_hash)
|
27
|
+
|
28
|
+
expect(metadata.checksum).to(be(nil))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
class NoCatsAsset < AssetCloud::Asset
|
@@ -5,6 +6,7 @@ class NoCatsAsset < AssetCloud::Asset
|
|
5
6
|
before_store :asset_callback
|
6
7
|
|
7
8
|
private
|
9
|
+
|
8
10
|
def no_cats
|
9
11
|
add_error('no cats allowed!') if value =~ /cat/i
|
10
12
|
end
|
@@ -16,8 +18,9 @@ class CssAssetExtension < AssetCloud::AssetExtension
|
|
16
18
|
validate :valid_css
|
17
19
|
|
18
20
|
private
|
21
|
+
|
19
22
|
def valid_css
|
20
|
-
add_error
|
23
|
+
add_error("not enough curly brackets!") unless asset.value =~ /\{.*\}/
|
21
24
|
end
|
22
25
|
end
|
23
26
|
|
@@ -32,17 +35,18 @@ class XmlAssetExtension < AssetCloud::AssetExtension
|
|
32
35
|
end
|
33
36
|
|
34
37
|
private
|
38
|
+
|
35
39
|
def valid_xml
|
36
|
-
add_error
|
40
|
+
add_error("not enough angle brackets!") unless asset.value =~ /\<.*\>/
|
37
41
|
end
|
38
42
|
end
|
39
43
|
|
40
44
|
class CatsAndDogsCloud < AssetCloud::Base
|
41
|
-
bucket :dog_pound, AssetCloud::MemoryBucket, :
|
45
|
+
bucket :dog_pound, AssetCloud::MemoryBucket, asset_class: NoCatsAsset
|
42
46
|
bucket :cat_pen, AssetCloud::MemoryBucket
|
43
47
|
|
44
|
-
asset_extensions CssAssetExtension, :
|
45
|
-
asset_extensions XmlAssetExtension, :
|
48
|
+
asset_extensions CssAssetExtension, only: :cat_pen
|
49
|
+
asset_extensions XmlAssetExtension, except: :cat_pen
|
46
50
|
end
|
47
51
|
|
48
52
|
describe "AssetExtension" do
|
@@ -55,7 +59,7 @@ describe "AssetExtension" do
|
|
55
59
|
describe "applicability" do
|
56
60
|
it "should work" do
|
57
61
|
asset = @cloud['cat_pen/cats.xml']
|
58
|
-
XmlAssetExtension.applies_to_asset?(asset).
|
62
|
+
expect(XmlAssetExtension.applies_to_asset?(asset)).to(eq(true))
|
59
63
|
end
|
60
64
|
end
|
61
65
|
|
@@ -63,31 +67,31 @@ describe "AssetExtension" do
|
|
63
67
|
it "should be added to assets in the right bucket with the right extension" do
|
64
68
|
asset = @cloud['cat_pen/cats.css']
|
65
69
|
asset.value = 'foo'
|
66
|
-
asset.store.
|
67
|
-
asset.errors.
|
70
|
+
expect(asset.store).to(eq(false))
|
71
|
+
expect(asset.errors).to(eq(["not enough curly brackets!"]))
|
68
72
|
end
|
69
73
|
|
70
74
|
it "should not squash existing validations on the asset" do
|
71
75
|
asset = @cloud['dog_pound/cats.xml']
|
72
76
|
asset.value = 'cats!'
|
73
|
-
asset.store.
|
74
|
-
asset.errors.
|
77
|
+
expect(asset.store).to(eq(false))
|
78
|
+
expect(asset.errors).to(eq(['no cats allowed!', "not enough angle brackets!"]))
|
75
79
|
end
|
76
80
|
|
77
81
|
it "should not apply to non-matching assets or those in exempted buckets" do
|
78
82
|
asset = @cloud['cat_pen/cats.xml']
|
79
83
|
asset.value = "xml"
|
80
|
-
asset.store.
|
84
|
+
expect(asset.store).to(eq(true))
|
81
85
|
end
|
82
86
|
end
|
83
87
|
|
84
88
|
describe "callbacks" do
|
85
89
|
it "should run alongside the asset's callbacks" do
|
86
90
|
asset = @cloud['dog_pound/dogs.xml']
|
87
|
-
asset.
|
88
|
-
asset.extensions.first.
|
91
|
+
expect(asset).to(receive(:asset_callback))
|
92
|
+
expect(asset.extensions.first).to(receive(:xml_callback))
|
89
93
|
asset.value = '<dogs/>'
|
90
|
-
asset.store.
|
94
|
+
expect(asset.store).to(eq(true))
|
91
95
|
end
|
92
96
|
end
|
93
97
|
|
@@ -96,7 +100,7 @@ describe "AssetExtension" do
|
|
96
100
|
asset = @cloud['dog_pound/dogs.xml']
|
97
101
|
asset.value = 'dogs'
|
98
102
|
asset.turn_into_xml
|
99
|
-
asset.value.
|
103
|
+
expect(asset.value).to(eq('<xml>dogs</xml>'))
|
100
104
|
end
|
101
105
|
|
102
106
|
it "does not swallow NotImplementedError" do
|
@@ -106,9 +110,8 @@ describe "AssetExtension" do
|
|
106
110
|
|
107
111
|
asset = @cloud['dog_pound/dogs.xml']
|
108
112
|
|
109
|
-
expect(asset).to
|
110
|
-
expect { asset.my_unimplemented_extension }.to
|
113
|
+
expect(asset).to(respond_to(:my_unimplemented_extension))
|
114
|
+
expect { asset.my_unimplemented_extension }.to(raise_error(NotImplementedError))
|
111
115
|
end
|
112
116
|
end
|
113
|
-
|
114
117
|
end
|
data/spec/asset_spec.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
describe "Asset" do
|
4
5
|
include AssetCloud
|
5
6
|
|
6
7
|
before do
|
7
|
-
@cloud = double('Cloud', :
|
8
|
+
@cloud = double('Cloud', asset_extension_classes_for_bucket: [])
|
8
9
|
end
|
9
10
|
|
10
11
|
describe "when first created (without a value)" do
|
@@ -13,116 +14,109 @@ describe "Asset" do
|
|
13
14
|
end
|
14
15
|
|
15
16
|
it "should be return new_asset? => true" do
|
16
|
-
@asset.new_asset
|
17
|
+
expect(@asset.new_asset?).to(eq(true))
|
17
18
|
end
|
18
19
|
|
19
20
|
it "should have a key" do
|
20
|
-
@asset.key.
|
21
|
+
expect(@asset.key).to(eq('products/key.txt'))
|
21
22
|
end
|
22
23
|
|
23
24
|
it "should have a value of nil" do
|
24
|
-
|
25
|
-
@asset.value.should == nil
|
25
|
+
expect(@asset.value).to(eq(nil))
|
26
26
|
end
|
27
27
|
|
28
28
|
it "should have a basename" do
|
29
|
-
@asset.basename.
|
29
|
+
expect(@asset.basename).to(eq('key.txt'))
|
30
30
|
end
|
31
31
|
|
32
32
|
it "should have a basename without ext (if required)" do
|
33
|
-
@asset.basename_without_ext.
|
33
|
+
expect(@asset.basename_without_ext).to(eq('key'))
|
34
34
|
end
|
35
35
|
|
36
36
|
it "should have an ext" do
|
37
|
-
@asset.extname.
|
37
|
+
expect(@asset.extname).to(eq('.txt'))
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should have a relative_key_without_ext" do
|
41
|
-
@asset.relative_key_without_ext.
|
41
|
+
expect(@asset.relative_key_without_ext).to(eq('key'))
|
42
42
|
end
|
43
43
|
|
44
44
|
it "should have a bucket_name" do
|
45
|
-
@asset.bucket_name.
|
45
|
+
expect(@asset.bucket_name).to(eq('products'))
|
46
46
|
end
|
47
47
|
|
48
48
|
it "should have a bucket" do
|
49
|
-
@cloud.
|
50
|
-
@asset.bucket.
|
49
|
+
expect(@cloud).to(receive(:buckets).and_return(products: :products_bucket))
|
50
|
+
expect(@asset.bucket).to(eq(:products_bucket))
|
51
51
|
end
|
52
52
|
|
53
53
|
it "should store data to the bucket" do
|
54
|
-
@cloud.
|
54
|
+
expect(@cloud).to(receive(:write).with("products/key.txt", 'value'))
|
55
55
|
|
56
56
|
@asset.value = 'value'
|
57
57
|
@asset.store
|
58
58
|
end
|
59
59
|
|
60
60
|
it "should not try to store data when it's value is nil" do
|
61
|
-
@cloud.
|
61
|
+
expect(@cloud).to(receive(:write).never)
|
62
62
|
|
63
63
|
@asset.store
|
64
64
|
end
|
65
65
|
|
66
66
|
it "should not try to read data from bucket if its a new_asset" do
|
67
|
-
@cloud.
|
67
|
+
expect(@cloud).to(receive(:read).never)
|
68
68
|
|
69
|
-
@asset.value.
|
69
|
+
expect(@asset.value).to(eq(nil))
|
70
70
|
end
|
71
71
|
|
72
72
|
it "should simply ignore calls to delete" do
|
73
|
-
@cloud.
|
73
|
+
expect(@cloud).to(receive(:delete).never)
|
74
74
|
|
75
75
|
@asset.delete
|
76
76
|
end
|
77
|
-
|
78
77
|
end
|
79
78
|
|
80
|
-
|
81
79
|
describe "when first created (without a value) with subdirectory" do
|
82
80
|
before do
|
83
81
|
@asset = AssetCloud::Asset.new(@cloud, "products/retail/key.txt")
|
84
82
|
end
|
85
83
|
|
86
84
|
it "should have a relative_key_without_ext" do
|
87
|
-
@asset.relative_key_without_ext.
|
85
|
+
expect(@asset.relative_key_without_ext).to(eq('retail/key'))
|
88
86
|
end
|
89
87
|
|
90
88
|
it "should have a relative_key" do
|
91
|
-
@asset.relative_key.
|
89
|
+
expect(@asset.relative_key).to(eq('retail/key.txt'))
|
92
90
|
end
|
93
91
|
end
|
94
92
|
|
95
|
-
|
96
93
|
describe "when first created with value" do
|
97
94
|
before do
|
98
95
|
@asset = AssetCloud::Asset.new(@cloud, "products/key.txt", 'value')
|
99
96
|
end
|
100
97
|
|
101
98
|
it "should be return new_asset? => true" do
|
102
|
-
@asset.new_asset
|
99
|
+
expect(@asset.new_asset?).to(eq(true))
|
103
100
|
end
|
104
101
|
|
105
|
-
|
106
102
|
it "should have a value of 'value'" do
|
107
|
-
@asset.value.
|
103
|
+
expect(@asset.value).to(eq('value'))
|
108
104
|
end
|
109
105
|
|
110
106
|
it "should return false when asked if it exists because its still a new_asset" do
|
111
|
-
@asset.exist
|
107
|
+
expect(@asset.exist?).to(eq(false))
|
112
108
|
end
|
113
109
|
|
114
|
-
|
115
110
|
it "should not try to read data from bucket if its a new_asset" do
|
116
|
-
@cloud.
|
111
|
+
expect(@cloud).to(receive(:read).never)
|
117
112
|
|
118
|
-
@asset.value.
|
113
|
+
expect(@asset.value).to(eq('value'))
|
119
114
|
end
|
120
115
|
|
121
116
|
it "should write data to the bucket" do
|
122
|
-
@cloud.
|
117
|
+
expect(@cloud).to(receive(:write).with("products/key.txt", 'value'))
|
123
118
|
@asset.store
|
124
119
|
end
|
125
|
-
|
126
120
|
end
|
127
121
|
|
128
122
|
describe "when fetched from the bucket" do
|
@@ -131,45 +125,42 @@ describe "Asset" do
|
|
131
125
|
end
|
132
126
|
|
133
127
|
it "should be return new_asset? => false" do
|
134
|
-
@asset.new_asset
|
128
|
+
expect(@asset.new_asset?).to(eq(false))
|
135
129
|
end
|
136
130
|
|
137
131
|
it "should indicate that it exists" do
|
138
|
-
|
139
|
-
@asset.exist?.should == true
|
132
|
+
expect(@asset.exist?).to(eq(true))
|
140
133
|
end
|
141
134
|
|
142
|
-
|
143
135
|
it "should read the value from the bucket" do
|
144
|
-
@asset.value.
|
136
|
+
expect(@asset.value).to(eq('value'))
|
145
137
|
end
|
146
138
|
|
147
|
-
|
148
139
|
it "should simply ignore calls to delete" do
|
149
|
-
@cloud.
|
140
|
+
expect(@cloud).to(receive(:delete).and_return(true))
|
150
141
|
|
151
142
|
@asset.delete
|
152
143
|
end
|
153
144
|
|
154
145
|
it "should ask the bucket to create a full url" do
|
155
|
-
@cloud.
|
146
|
+
expect(@cloud).to(receive(:url_for).with('products/key.txt', {}).and_return('http://assets/products/key.txt'))
|
156
147
|
|
157
|
-
@asset.url.
|
148
|
+
expect(@asset.url).to(eq('http://assets/products/key.txt'))
|
158
149
|
end
|
159
150
|
|
160
151
|
it "should ask the bucket whether or not it is versioned" do
|
161
152
|
bucket = double('Bucket')
|
162
|
-
@cloud.
|
163
|
-
bucket.
|
153
|
+
expect(@cloud).to(receive(:buckets).and_return(products: bucket))
|
154
|
+
expect(bucket).to(receive(:versioned?).and_return(true))
|
164
155
|
|
165
|
-
@asset.versioned
|
156
|
+
expect(@asset.versioned?).to(eq(true))
|
166
157
|
end
|
167
158
|
|
168
159
|
it "should validate its key" do
|
169
160
|
asset = AssetCloud::Asset.new(@cloud, "products/foo, bar.txt", "data")
|
170
|
-
asset.store.
|
171
|
-
asset.errors.size.
|
172
|
-
asset.errors.first.
|
161
|
+
expect(asset.store).to(eq(false))
|
162
|
+
expect(asset.errors.size).to(eq(1))
|
163
|
+
expect(asset.errors.first).to(match(/illegal characters/))
|
173
164
|
end
|
174
165
|
end
|
175
166
|
|
@@ -183,14 +174,14 @@ describe "Asset" do
|
|
183
174
|
it "is equal if cloud and key of both assets are equal" do
|
184
175
|
other_asset = AssetCloud::Asset.new(@cloud, @key)
|
185
176
|
|
186
|
-
expect(@asset == other_asset).to
|
177
|
+
expect(@asset == other_asset).to(eq(true))
|
187
178
|
end
|
188
179
|
|
189
180
|
it "is not equal if key of both assets are not equal" do
|
190
181
|
other_key = "products/other_key.txt"
|
191
182
|
other_asset = AssetCloud::Asset.new(@cloud, other_key)
|
192
183
|
|
193
|
-
expect(@asset == other_asset).to
|
184
|
+
expect(@asset == other_asset).to(eq(false))
|
194
185
|
end
|
195
186
|
end
|
196
187
|
|
@@ -198,15 +189,15 @@ describe "Asset" do
|
|
198
189
|
it "is not equal to a non-Asset object" do
|
199
190
|
AssetCloud::Asset.new(@cloud, "products/foo, bar.txt", "data")
|
200
191
|
|
201
|
-
expect(@asset == "some_string").to
|
202
|
-
expect(@asset == :some_symbol).to
|
203
|
-
expect(@asset == []).to
|
204
|
-
expect(@asset
|
192
|
+
expect(@asset == "some_string").to(eq(false))
|
193
|
+
expect(@asset == :some_symbol).to(eq(false))
|
194
|
+
expect(@asset == []).to(eq(false))
|
195
|
+
expect(@asset.nil?).to(eq(false))
|
205
196
|
|
206
|
-
expect(@asset <=> "some_string").to
|
207
|
-
expect(@asset <=> :some_symbol).to
|
208
|
-
expect(@asset <=> []).to
|
209
|
-
expect(@asset <=> nil).to
|
197
|
+
expect(@asset <=> "some_string").to(eq(nil))
|
198
|
+
expect(@asset <=> :some_symbol).to(eq(nil))
|
199
|
+
expect(@asset <=> []).to(eq(nil))
|
200
|
+
expect(@asset <=> nil).to(eq(nil))
|
210
201
|
end
|
211
202
|
end
|
212
203
|
end
|
data/spec/base_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
class SpecialAsset < AssetCloud::Asset
|
@@ -8,7 +9,7 @@ end
|
|
8
9
|
|
9
10
|
class BasicCloud < AssetCloud::Base
|
10
11
|
bucket :special, AssetCloud::MemoryBucket, asset_class: SpecialAsset
|
11
|
-
bucket :conditional, AssetCloud::MemoryBucket, asset_class:
|
12
|
+
bucket :conditional, AssetCloud::MemoryBucket, asset_class: proc { |key|
|
12
13
|
LiquidAsset if key.ends_with?('.liquid')
|
13
14
|
}
|
14
15
|
end
|
@@ -17,71 +18,69 @@ describe BasicCloud do
|
|
17
18
|
directory = File.dirname(__FILE__) + '/files'
|
18
19
|
|
19
20
|
before do
|
20
|
-
@fs = BasicCloud.new(directory
|
21
|
+
@fs = BasicCloud.new(directory, 'http://assets/files')
|
21
22
|
end
|
22
23
|
|
23
24
|
it "should raise invalid bucket if none is given" do
|
24
|
-
@fs['image.jpg'].exist
|
25
|
+
expect(@fs['image.jpg'].exist?).to(eq(false))
|
25
26
|
end
|
26
27
|
|
27
|
-
|
28
28
|
it "should be backed by a file system bucket" do
|
29
|
-
@fs['products/key.txt'].exist
|
29
|
+
expect(@fs['products/key.txt'].exist?).to(eq(true))
|
30
30
|
end
|
31
31
|
|
32
32
|
it "should raise when listing non existing buckets" do
|
33
|
-
@fs.ls('products').
|
33
|
+
expect(@fs.ls('products')).to(eq([AssetCloud::Asset.new(@fs, 'products/key.txt')]))
|
34
34
|
end
|
35
35
|
|
36
|
-
|
37
36
|
it "should allow you to create new assets" do
|
38
37
|
obj = @fs.build('new_file.test')
|
39
|
-
obj.
|
40
|
-
obj.cloud.
|
38
|
+
expect(obj).to(be_an_instance_of(AssetCloud::Asset))
|
39
|
+
expect(obj.cloud).to(be_an_instance_of(BasicCloud))
|
41
40
|
end
|
42
41
|
|
43
42
|
it "should raise error when using with minus relative or absolute paths" do
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
43
|
+
expect { @fs['../test'] }.to(raise_error(AssetCloud::IllegalPath))
|
44
|
+
expect { @fs['/test'] }.to(raise_error(AssetCloud::IllegalPath))
|
45
|
+
expect { @fs['.../test'] }.to(raise_error(AssetCloud::IllegalPath))
|
46
|
+
expect { @fs['./test'] }.to(raise_error(AssetCloud::IllegalPath))
|
48
47
|
end
|
49
48
|
|
50
49
|
it "should raise error when filename has trailing period" do
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
50
|
+
expect { @fs['test.'] }.to(raise_error(AssetCloud::IllegalPath))
|
51
|
+
expect { @fs['/test/testfile.'] }.to(raise_error(AssetCloud::IllegalPath))
|
52
|
+
expect { @fs['test/directory/.'] }.to(raise_error(AssetCloud::IllegalPath))
|
53
|
+
expect { @fs['/test/testfile .'] }.to(raise_error(AssetCloud::IllegalPath))
|
54
|
+
expect { @fs['test/directory /.'] }.to(raise_error(AssetCloud::IllegalPath))
|
56
55
|
end
|
57
56
|
|
58
57
|
it "should raise error when filename ends with space" do
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
58
|
+
expect { @fs['test '] }.to(raise_error(AssetCloud::IllegalPath))
|
59
|
+
expect { @fs['/test/testfile '] }.to(raise_error(AssetCloud::IllegalPath))
|
60
|
+
expect { @fs['test/directory/ '] }.to(raise_error(AssetCloud::IllegalPath))
|
61
|
+
expect { @fs['test. '] }.to(raise_error(AssetCloud::IllegalPath))
|
62
|
+
expect { @fs['/test/testfile. '] }.to(raise_error(AssetCloud::IllegalPath))
|
63
|
+
expect { @fs['test/directory/. '] }.to(raise_error(AssetCloud::IllegalPath))
|
65
64
|
end
|
66
65
|
|
67
66
|
it "should raise error when filename ends with slash" do
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
67
|
+
expect { @fs['test/'] }.to(raise_error(AssetCloud::IllegalPath))
|
68
|
+
expect { @fs['test/directory/'] }.to(raise_error(AssetCloud::IllegalPath))
|
69
|
+
expect { @fs['test /'] }.to(raise_error(AssetCloud::IllegalPath))
|
70
|
+
expect { @fs['/test/testfile /'] }.to(raise_error(AssetCloud::IllegalPath))
|
71
|
+
expect { @fs['test/directory//'] }.to(raise_error(AssetCloud::IllegalPath))
|
73
72
|
end
|
74
73
|
|
75
74
|
it "should raise error when using with minus relative even after another directory" do
|
76
|
-
|
77
|
-
|
78
|
-
|
75
|
+
expect { @fs['test/../test'] }.to(raise_error(AssetCloud::IllegalPath))
|
76
|
+
expect { @fs['test/../../test'] }.to(raise_error(AssetCloud::IllegalPath))
|
77
|
+
expect { @fs['test/../../../test'] }.to(raise_error(AssetCloud::IllegalPath))
|
79
78
|
end
|
80
79
|
|
81
80
|
it "should raise an error when using names with combinations of '.' and ' '" do
|
82
|
-
|
83
|
-
|
84
|
-
|
81
|
+
expect { @fs['test. . . .. ... .. . '] }.to(raise_error(AssetCloud::IllegalPath))
|
82
|
+
expect { @fs['test. .'] }.to(raise_error(AssetCloud::IllegalPath))
|
83
|
+
expect { @fs['test. .test2'] }.to(raise_error(AssetCloud::IllegalPath))
|
85
84
|
end
|
86
85
|
|
87
86
|
it "should allow filenames with repeating dots" do
|
@@ -125,41 +124,41 @@ describe BasicCloud do
|
|
125
124
|
end
|
126
125
|
|
127
126
|
it "should compute complete urls to assets" do
|
128
|
-
@fs.url_for('products/[key] with spaces.txt?foo=1&bar=2').
|
127
|
+
expect(@fs.url_for('products/[key] with spaces.txt?foo=1&bar=2')).to(eq('http://assets/files/products/[key]%20with%20spaces.txt?foo=1&bar=2'))
|
129
128
|
end
|
130
129
|
|
131
130
|
describe "#find" do
|
132
131
|
it "should return the appropriate asset when one exists" do
|
133
132
|
asset = @fs.find('products/key.txt')
|
134
|
-
asset.key.
|
135
|
-
asset.value.
|
133
|
+
expect(asset.key).to(eq('products/key.txt'))
|
134
|
+
expect(asset.value).to(eq('value'))
|
136
135
|
end
|
137
136
|
it "should raise AssetNotFoundError when the asset doesn't exist" do
|
138
|
-
|
137
|
+
expect { @fs.find('products/not-there.txt') }.to(raise_error(AssetCloud::AssetNotFoundError))
|
139
138
|
end
|
140
139
|
end
|
141
140
|
|
142
141
|
describe "#[]" do
|
143
142
|
it "should return the appropriate asset when one exists" do
|
144
143
|
asset = @fs['products/key.txt']
|
145
|
-
asset.key.
|
146
|
-
asset.value.
|
144
|
+
expect(asset.key).to(eq('products/key.txt'))
|
145
|
+
expect(asset.value).to(eq('value'))
|
147
146
|
end
|
148
147
|
it "should not raise any errors when the asset doesn't exist" do
|
149
|
-
|
148
|
+
expect { @fs['products/not-there.txt'] }.not_to(raise_error)
|
150
149
|
end
|
151
150
|
end
|
152
151
|
|
153
152
|
describe "#move" do
|
154
153
|
it "should return move a resource" do
|
155
154
|
asset = @fs['products/key.txt']
|
156
|
-
asset.key.
|
157
|
-
asset.value.
|
155
|
+
expect(asset.key).to(eq('products/key.txt'))
|
156
|
+
expect(asset.value).to(eq('value'))
|
158
157
|
@fs.move('products/key.txt', 'products/key2.txt')
|
159
158
|
new_asset = @fs['products/key2.txt']
|
160
|
-
new_asset.key.
|
161
|
-
new_asset.value.
|
162
|
-
expect {@fs['products/key.txt'].value }.to
|
159
|
+
expect(new_asset.key).to(eq('products/key2.txt'))
|
160
|
+
expect(new_asset.value).to(eq('value'))
|
161
|
+
expect { @fs['products/key.txt'].value }.to(raise_error(AssetCloud::AssetNotFoundError))
|
163
162
|
@fs.move('products/key2.txt', 'products/key.txt')
|
164
163
|
end
|
165
164
|
end
|
@@ -167,46 +166,45 @@ describe BasicCloud do
|
|
167
166
|
describe "#[]=" do
|
168
167
|
it "should write through the Asset object (and thus run any callbacks on the asset)" do
|
169
168
|
special_asset = double(:special_asset)
|
170
|
-
special_asset.
|
171
|
-
special_asset.
|
172
|
-
SpecialAsset.
|
169
|
+
expect(special_asset).to(receive(:value=).with('fancy fancy!'))
|
170
|
+
expect(special_asset).to(receive(:store))
|
171
|
+
expect(SpecialAsset).to(receive(:at).and_return(special_asset))
|
173
172
|
@fs['special/fancy.txt'] = 'fancy fancy!'
|
174
173
|
end
|
175
174
|
end
|
176
175
|
|
177
176
|
describe "#bucket" do
|
178
177
|
it "should allow specifying a class to use for assets in this bucket" do
|
179
|
-
@fs['assets/rails_logo.gif'].
|
180
|
-
@fs['special/fancy.txt'].
|
178
|
+
expect(@fs['assets/rails_logo.gif']).to(be_instance_of(AssetCloud::Asset))
|
179
|
+
expect(@fs['special/fancy.txt']).to(be_instance_of(SpecialAsset))
|
181
180
|
|
182
|
-
@fs.build('assets/foo').
|
183
|
-
@fs.build('special/foo').
|
181
|
+
expect(@fs.build('assets/foo')).to(be_instance_of(AssetCloud::Asset))
|
182
|
+
expect(@fs.build('special/foo')).to(be_instance_of(SpecialAsset))
|
184
183
|
end
|
185
184
|
|
186
185
|
it "should allow specifying a proc that determines the class to use, using the default bucket when returning nil" do
|
187
|
-
@fs.build('conditional/default.js').
|
188
|
-
@fs.build('conditional/better.liquid').
|
186
|
+
expect(@fs.build('conditional/default.js')).to(be_instance_of(AssetCloud::Asset))
|
187
|
+
expect(@fs.build('conditional/better.liquid')).to(be_instance_of(LiquidAsset))
|
189
188
|
end
|
190
189
|
|
191
190
|
it "should raise " do
|
192
|
-
expect { BasicCloud.bucket(AssetCloud::MemoryBucket, asset_class:
|
191
|
+
expect { BasicCloud.bucket(AssetCloud::MemoryBucket, asset_class: proc {}) }.to(raise_error(ArgumentError))
|
193
192
|
end
|
194
193
|
end
|
195
194
|
|
196
195
|
describe "MATCH_BUCKET" do
|
197
196
|
it "should match following stuff " do
|
198
|
-
|
199
197
|
'products/key.txt' =~ AssetCloud::Base::MATCH_BUCKET
|
200
|
-
|
198
|
+
expect(Regexp.last_match(1)).to(eq('products'))
|
201
199
|
|
202
200
|
'products/subpath/key.txt' =~ AssetCloud::Base::MATCH_BUCKET
|
203
|
-
|
201
|
+
expect(Regexp.last_match(1)).to(eq('products'))
|
204
202
|
|
205
203
|
'key.txt' =~ AssetCloud::Base::MATCH_BUCKET
|
206
|
-
|
204
|
+
expect(Regexp.last_match(1)).to(eq(nil))
|
207
205
|
|
208
206
|
'products' =~ AssetCloud::Base::MATCH_BUCKET
|
209
|
-
|
207
|
+
expect(Regexp.last_match(1)).to(eq('products'))
|
210
208
|
end
|
211
209
|
end
|
212
210
|
end
|