saviour 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.travis.yml +4 -13
- data/DECOMPOSE.md +66 -0
- data/Gemfile +1 -0
- data/README.md +39 -8
- data/lib/saviour/attribute_name_calculator.rb +15 -0
- data/lib/saviour/base_integrator.rb +53 -0
- data/lib/saviour/basic_model.rb +7 -0
- data/lib/saviour/config.rb +0 -1
- data/lib/saviour/file.rb +13 -34
- data/lib/saviour/life_cycle.rb +57 -0
- data/lib/saviour/source_filename_extractor.rb +21 -0
- data/lib/saviour/url_source.rb +1 -1
- data/lib/saviour/utils/class_attribute.rb +26 -0
- data/lib/saviour/version.rb +1 -1
- data/lib/saviour.rb +7 -155
- data/saviour.gemspec +1 -5
- data/spec/feature/access_to_model_and_mounted_as_spec.rb +13 -5
- data/spec/feature/versions_spec.rb +72 -49
- data/spec/models/attribute_name_calculator_spec.rb +11 -0
- data/spec/models/basic_model_spec.rb +51 -0
- data/spec/models/file_spec.rb +32 -55
- data/spec/models/url_source_spec.rb +5 -5
- data/spec/spec_helper.rb +2 -30
- data/spec/support/models.rb +7 -2
- metadata +12 -72
- data/Appraisals +0 -19
- data/gemfiles/4.0.gemfile +0 -9
- data/gemfiles/4.1.gemfile +0 -9
- data/gemfiles/4.2.gemfile +0 -9
- data/gemfiles/5.0.gemfile +0 -9
- data/lib/saviour/processors/digest.rb +0 -16
- data/spec/feature/crud_workflows_spec.rb +0 -143
- data/spec/feature/persisted_path_spec.rb +0 -34
- data/spec/feature/reload_model_spec.rb +0 -24
- data/spec/feature/validations_spec.rb +0 -171
- data/spec/models/processors/digest_spec.rb +0 -22
- data/spec/models/saviour_spec.rb +0 -80
- data/spec/support/schema.rb +0 -9
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "persisted path" do
|
4
|
-
before { allow(Saviour::Config).to receive(:storage).and_return(Saviour::LocalStorage.new(local_prefix: @tmpdir, public_url_prefix: "http://domain.com")) }
|
5
|
-
|
6
|
-
context "can change the default_path on the uploader and previous instances are not affected" do
|
7
|
-
it do
|
8
|
-
uploader = Class.new(Saviour::BaseUploader) { store_dir { "/store/dir" } }
|
9
|
-
klass = Class.new(Test) { include Saviour }
|
10
|
-
klass.attach_file :file, uploader
|
11
|
-
|
12
|
-
with_test_file("example.xml") do |example|
|
13
|
-
a = klass.create!
|
14
|
-
expect(a.update_attributes(file: example)).to be_truthy
|
15
|
-
expect(Saviour::Config.storage.exists?(a[:file])).to be_truthy
|
16
|
-
expect(File.dirname(a[:file])).to eq "/store/dir"
|
17
|
-
|
18
|
-
|
19
|
-
uploader.class_eval { store_dir { "/another/dir" } }
|
20
|
-
|
21
|
-
with_test_file("camaloon.jpg") do |example_2|
|
22
|
-
b = klass.create!
|
23
|
-
expect(b.update_attributes(file: example_2)).to be_truthy
|
24
|
-
|
25
|
-
expect(Saviour::Config.storage.exists?(b[:file])).to be_truthy
|
26
|
-
expect(Saviour::Config.storage.exists?(a[:file])).to be_truthy
|
27
|
-
|
28
|
-
expect(File.dirname(b[:file])).to eq "/another/dir"
|
29
|
-
expect(File.dirname(a[:file])).to eq "/store/dir"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "reload model" do
|
4
|
-
before { allow(Saviour::Config).to receive(:storage).and_return(Saviour::LocalStorage.new(local_prefix: @tmpdir, public_url_prefix: "http://domain.com")) }
|
5
|
-
|
6
|
-
context "updates the Saviour::File instance" do
|
7
|
-
it do
|
8
|
-
uploader = Class.new(Saviour::BaseUploader) { store_dir { "/store/dir" } }
|
9
|
-
klass = Class.new(Test) { include Saviour }
|
10
|
-
klass.attach_file :file, uploader
|
11
|
-
a = klass.create!
|
12
|
-
b = klass.find(a.id)
|
13
|
-
|
14
|
-
with_test_file("example.xml") do |example|
|
15
|
-
a.update_attributes! file: example
|
16
|
-
expect(a.file.exists?).to be_truthy
|
17
|
-
expect(b.file.exists?).to be_falsey
|
18
|
-
|
19
|
-
b.reload
|
20
|
-
expect(b.file.exists?).to be_truthy
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,171 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "validations saving a new file" do
|
4
|
-
before { allow(Saviour::Config).to receive(:storage).and_return(Saviour::LocalStorage.new(local_prefix: @tmpdir, public_url_prefix: "http://domain.com")) }
|
5
|
-
|
6
|
-
let(:uploader) {
|
7
|
-
Class.new(Saviour::BaseUploader) {
|
8
|
-
store_dir { "/store/dir" }
|
9
|
-
}
|
10
|
-
}
|
11
|
-
|
12
|
-
let(:base_klass) {
|
13
|
-
a = Class.new(Test) { include Saviour }
|
14
|
-
a.attach_file :file, uploader
|
15
|
-
a
|
16
|
-
}
|
17
|
-
|
18
|
-
it "fails at block validation" do
|
19
|
-
klass = Class.new(base_klass) do
|
20
|
-
attach_validation(:file) do |contents, _|
|
21
|
-
errors.add(:file, "Cannot start with X") if contents[0] == 'X'
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
with_test_file("example.xml") do |example|
|
26
|
-
allow(example).to receive(:read).and_return("X-Extra contents for the file")
|
27
|
-
a = klass.new
|
28
|
-
a.file = example
|
29
|
-
expect(a).not_to be_valid
|
30
|
-
expect(a.errors[:file][0]).to eq "Cannot start with X"
|
31
|
-
end
|
32
|
-
|
33
|
-
with_test_file("example.xml") do |example|
|
34
|
-
a = klass.new
|
35
|
-
a.file = example
|
36
|
-
expect(a).to be_valid
|
37
|
-
expect(a.save).to be_truthy
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
|
-
it "fails at method validation" do
|
43
|
-
klass = Class.new(base_klass) do
|
44
|
-
attach_validation :file, :check_filesize
|
45
|
-
|
46
|
-
def check_filesize(contents, _)
|
47
|
-
errors.add(:file, "Filesize must be less than 10 bytes") if contents.bytesize >= 10
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
with_test_file("example.xml") do |example|
|
52
|
-
allow(example).to receive(:read).and_return("1234567890")
|
53
|
-
a = klass.new
|
54
|
-
a.file = example
|
55
|
-
expect(a).not_to be_valid
|
56
|
-
expect(a.errors[:file][0]).to eq "Filesize must be less than 10 bytes"
|
57
|
-
end
|
58
|
-
|
59
|
-
with_test_file("example.xml") do |example|
|
60
|
-
allow(example).to receive(:read).and_return("123456789")
|
61
|
-
a = klass.new
|
62
|
-
a.file = example
|
63
|
-
expect(a).to be_valid
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
it "combined validatinos" do
|
68
|
-
klass = Class.new(base_klass) do
|
69
|
-
attach_validation :file, :check_filesize
|
70
|
-
attach_validation(:file) do |contents, _|
|
71
|
-
errors.add(:file, "Cannot start with X") if contents[0] == 'X'
|
72
|
-
end
|
73
|
-
|
74
|
-
def check_filesize(contents, _)
|
75
|
-
errors.add(:file, "Filesize must be less than 10 bytes") if contents.bytesize >= 10
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
with_test_file("example.xml") do |example|
|
80
|
-
allow(example).to receive(:read).and_return("X-Ex")
|
81
|
-
a = klass.new
|
82
|
-
a.file = example
|
83
|
-
expect(a).not_to be_valid
|
84
|
-
expect(a.errors[:file][0]).to eq "Cannot start with X"
|
85
|
-
end
|
86
|
-
|
87
|
-
with_test_file("example.xml") do |example|
|
88
|
-
allow(example).to receive(:read).and_return("Ex too long content")
|
89
|
-
a = klass.new
|
90
|
-
a.file = example
|
91
|
-
expect(a).not_to be_valid
|
92
|
-
expect(a.errors[:file][0]).to eq "Filesize must be less than 10 bytes"
|
93
|
-
end
|
94
|
-
|
95
|
-
# Consistent order
|
96
|
-
with_test_file("example.xml") do |example|
|
97
|
-
allow(example).to receive(:read).and_return("X-Ex too long content")
|
98
|
-
a = klass.new
|
99
|
-
a.file = example
|
100
|
-
expect(a).not_to be_valid
|
101
|
-
expect(a.errors[:file][0]).to eq "Filesize must be less than 10 bytes"
|
102
|
-
expect(a.errors[:file][1]).to eq "Cannot start with X"
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
it "validates by filename" do
|
107
|
-
klass = Class.new(base_klass) do
|
108
|
-
attach_validation :file, :check_filename
|
109
|
-
|
110
|
-
def check_filename(_, filename)
|
111
|
-
errors.add(:file, "Only .jpg files") unless filename =~ /\.jpg/
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
with_test_file("example.xml") do |example|
|
116
|
-
allow(example).to receive(:read).and_return("X-Ex")
|
117
|
-
a = klass.new
|
118
|
-
a.file = example
|
119
|
-
expect(a).not_to be_valid
|
120
|
-
expect(a.errors[:file][0]).to eq "Only .jpg files"
|
121
|
-
end
|
122
|
-
|
123
|
-
with_test_file("camaloon.jpg") do |example|
|
124
|
-
allow(example).to receive(:read).and_return("X-Ex")
|
125
|
-
a = klass.new
|
126
|
-
a.file = example
|
127
|
-
expect(a).to be_valid
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
it "receives the attached_as information" do
|
132
|
-
klass = Class.new(base_klass) do
|
133
|
-
attach_validation :file, :check_filename
|
134
|
-
|
135
|
-
def check_filename(_, _, opts)
|
136
|
-
errors.add(:file, "Received error in #{opts[:attached_as]}")
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
with_test_file("example.xml") do |example|
|
141
|
-
a = klass.new file: example
|
142
|
-
expect(a).not_to be_valid
|
143
|
-
expect(a.errors[:file][0]).to eq "Received error in file"
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
context "versions are validated" do
|
148
|
-
let(:uploader) {
|
149
|
-
Class.new(Saviour::BaseUploader) {
|
150
|
-
store_dir { "/store/dir" }
|
151
|
-
version(:thumb)
|
152
|
-
}
|
153
|
-
}
|
154
|
-
let(:klass) {
|
155
|
-
Class.new(base_klass) do
|
156
|
-
attach_validation(:file) do |contents, _, opts|
|
157
|
-
errors.add(:file, "Cannot start with X in version #{opts[:version]}") if contents[0] == 'X'
|
158
|
-
end
|
159
|
-
end
|
160
|
-
}
|
161
|
-
|
162
|
-
it do
|
163
|
-
a = klass.create!
|
164
|
-
a.file.assign Saviour::StringSource.new("correct contents")
|
165
|
-
a.file(:thumb).assign Saviour::StringSource.new("X Incorrect contents")
|
166
|
-
|
167
|
-
expect(a).not_to be_valid
|
168
|
-
expect(a.errors[:file][0]).to eq "Cannot start with X in version thumb"
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Saviour::Processors::Digest do
|
4
|
-
describe "#digest_filename" do
|
5
|
-
subject {
|
6
|
-
Class.new { include Saviour::Processors::Digest }.new
|
7
|
-
}
|
8
|
-
|
9
|
-
let(:filename) { "name.jpg" }
|
10
|
-
let(:contents) { "bynary contents for a file" }
|
11
|
-
|
12
|
-
it do
|
13
|
-
_, new_name = subject.digest_filename(contents, filename)
|
14
|
-
expect(new_name).to eq "name-ab54d187b7909ff4bba34777073d4654.jpg"
|
15
|
-
end
|
16
|
-
|
17
|
-
it do
|
18
|
-
_, new_name = subject.digest_filename(contents, filename, separator: '/')
|
19
|
-
expect(new_name).to eq "name/ab54d187b7909ff4bba34777073d4654.jpg"
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
data/spec/models/saviour_spec.rb
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Saviour do
|
4
|
-
it "raises error if included in a non active record class" do
|
5
|
-
expect {
|
6
|
-
Class.new do
|
7
|
-
include Saviour
|
8
|
-
end
|
9
|
-
}.to raise_error(Saviour::NoActiveRecordDetected)
|
10
|
-
end
|
11
|
-
|
12
|
-
it "error if column not present" do
|
13
|
-
expect {
|
14
|
-
Class.new(Test) do
|
15
|
-
include Saviour
|
16
|
-
|
17
|
-
attach_file :not_present, Saviour::BaseUploader
|
18
|
-
end
|
19
|
-
}.to raise_error(RuntimeError)
|
20
|
-
end
|
21
|
-
|
22
|
-
context do
|
23
|
-
it "error if column not present on version" do
|
24
|
-
uploader = Class.new(Saviour::BaseUploader) do
|
25
|
-
store_dir { "/store/dir" }
|
26
|
-
|
27
|
-
version(:thumb) do
|
28
|
-
store_dir { "/versions/store/dir" }
|
29
|
-
end
|
30
|
-
|
31
|
-
version(:not_present)
|
32
|
-
end
|
33
|
-
|
34
|
-
expect {
|
35
|
-
Class.new(Test) do
|
36
|
-
include Saviour
|
37
|
-
|
38
|
-
attach_file :file, uploader
|
39
|
-
end
|
40
|
-
}.to raise_error(RuntimeError)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
it "does not raise error if table is not present" do
|
45
|
-
allow(Test).to receive(:table_exists?).and_return(false)
|
46
|
-
|
47
|
-
expect {
|
48
|
-
Class.new(Test) do
|
49
|
-
include Saviour
|
50
|
-
|
51
|
-
attach_file :not_present, Saviour::BaseUploader
|
52
|
-
end
|
53
|
-
}.to_not raise_error
|
54
|
-
end
|
55
|
-
|
56
|
-
describe ".attached_files" do
|
57
|
-
it "includes a mapping of the currently attached files and their versions" do
|
58
|
-
uploader = Class.new(Saviour::BaseUploader) do
|
59
|
-
store_dir { "/store/dir" }
|
60
|
-
|
61
|
-
version(:thumb)
|
62
|
-
version(:thumb_2)
|
63
|
-
end
|
64
|
-
|
65
|
-
klass = Class.new(Test) do
|
66
|
-
include Saviour
|
67
|
-
attach_file :file, uploader
|
68
|
-
end
|
69
|
-
|
70
|
-
expect(klass.attached_files).to eq({file: [:thumb, :thumb_2]})
|
71
|
-
|
72
|
-
klass2 = Class.new(Test) do
|
73
|
-
include Saviour
|
74
|
-
attach_file :file, Saviour::BaseUploader
|
75
|
-
end
|
76
|
-
|
77
|
-
expect(klass2.attached_files).to eq({file: []})
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|