delayed_paperclip 3.0.0 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -0
- data/Appraisals +5 -0
- data/Gemfile +1 -1
- data/Rakefile +1 -0
- data/gemfiles/.bundle/config +1 -0
- data/gemfiles/5.0_paperclip_master.gemfile +8 -0
- data/lib/delayed_paperclip.rb +3 -3
- data/lib/delayed_paperclip/attachment.rb +63 -79
- data/lib/delayed_paperclip/railtie.rb +1 -1
- data/lib/delayed_paperclip/url_generator.rb +5 -1
- data/lib/delayed_paperclip/version.rb +1 -1
- data/spec/delayed_paperclip/attachment_spec.rb +14 -12
- data/spec/delayed_paperclip/url_generator_spec.rb +50 -32
- data/spec/delayed_paperclip_spec.rb +2 -11
- metadata +6 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee7342bcd21ac1c386a6856db5e168f555542b13
|
4
|
+
data.tar.gz: 14abfc99f34f048e8e7db32be2950a2fe3ba097d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a2126fd4538776b25d2e4f7e1e14880754807f3b2470fe6fac57d9ce1052adff8bca565333b7f2a12972513e5df2f1304e59de666084eda67fa1614c405e511
|
7
|
+
data.tar.gz: 2ba9ba29b2ef8a5ac1e1df24d412e035b7304e24224495edb751a95e03e42a5d38af1c198636a88a8cd2a4f4f00a60f6223cdb07777b78a3d26523334b290609
|
data/.travis.yml
CHANGED
@@ -11,6 +11,7 @@ rvm:
|
|
11
11
|
gemfile:
|
12
12
|
- gemfiles/4.2.gemfile
|
13
13
|
- gemfiles/5.0.gemfile
|
14
|
+
- gemfiles/5.0_paperclip_master.gemfile
|
14
15
|
|
15
16
|
# Rails 5.0 requires Ruby >= 2.2.2
|
16
17
|
matrix:
|
@@ -19,6 +20,10 @@ matrix:
|
|
19
20
|
gemfile: gemfiles/5.0.gemfile
|
20
21
|
- rvm: 2.0
|
21
22
|
gemfile: gemfiles/5.0.gemfile
|
23
|
+
- rvm: 2.1.10
|
24
|
+
gemfile: gemfiles/5.0_paperclip_master.gemfile
|
25
|
+
- rvm: 2.0
|
26
|
+
gemfile: gemfiles/5.0_paperclip_master.gemfile
|
22
27
|
# Paperclip >= 5.0 requires Ruby 2.1
|
23
28
|
- rvm: 2.0
|
24
29
|
gemfile: gemfiles/4.2.gemfile
|
data/Appraisals
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
--- {}
|
data/lib/delayed_paperclip.rb
CHANGED
@@ -23,9 +23,9 @@ module DelayedPaperclip
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def process_job(instance_klass, instance_id, attachment_name)
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
instance_klass.constantize.unscoped.find(instance_id).
|
27
|
+
send(attachment_name).
|
28
|
+
process_delayed!
|
29
29
|
end
|
30
30
|
|
31
31
|
end
|
@@ -1,105 +1,89 @@
|
|
1
1
|
module DelayedPaperclip
|
2
2
|
module Attachment
|
3
|
+
attr_accessor :job_is_processing
|
3
4
|
|
4
|
-
def
|
5
|
-
|
6
|
-
base.send :attr_accessor, :job_is_processing
|
7
|
-
|
8
|
-
base.send :alias_method, :post_processing_without_delay, :post_processing
|
9
|
-
base.send :alias_method, :post_processing, :post_processing_with_delay
|
10
|
-
|
11
|
-
base.send :alias_method, :post_processing_without_delay=, :post_processing=
|
12
|
-
base.send :alias_method, :post_processing=, :post_processing_with_delay=
|
13
|
-
|
14
|
-
base.send :alias_method, :save_without_prepare_enqueueing, :save
|
15
|
-
base.send :alias_method, :save, :save_with_prepare_enqueueing
|
5
|
+
def delayed_options
|
6
|
+
options[:delayed]
|
16
7
|
end
|
17
8
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
# Attr accessor in Paperclip
|
25
|
-
def post_processing_with_delay
|
26
|
-
!delay_processing? || split_processing?
|
27
|
-
end
|
9
|
+
# Attr accessor in Paperclip
|
10
|
+
def post_processing
|
11
|
+
!delay_processing? || split_processing?
|
12
|
+
end
|
28
13
|
|
29
|
-
|
30
|
-
|
31
|
-
|
14
|
+
def post_processing=(value)
|
15
|
+
@post_processing_with_delay = value
|
16
|
+
end
|
32
17
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
end
|
18
|
+
# if nil, returns whether it has delayed options
|
19
|
+
# if set, then it returns
|
20
|
+
def delay_processing?
|
21
|
+
if @post_processing_with_delay.nil?
|
22
|
+
!!delayed_options
|
23
|
+
else
|
24
|
+
!@post_processing_with_delay
|
41
25
|
end
|
26
|
+
end
|
42
27
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
28
|
+
def split_processing?
|
29
|
+
options[:only_process] && delayed_options &&
|
30
|
+
options[:only_process] != delayed_only_process
|
31
|
+
end
|
47
32
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
33
|
+
def processing?
|
34
|
+
column_name = :"#{@name}_processing?"
|
35
|
+
@instance.respond_to?(column_name) && @instance.send(column_name)
|
36
|
+
end
|
52
37
|
|
53
|
-
|
54
|
-
|
38
|
+
def processing_style?(style)
|
39
|
+
return false if !processing?
|
55
40
|
|
56
|
-
|
57
|
-
|
41
|
+
!split_processing? || delayed_only_process.include?(style)
|
42
|
+
end
|
58
43
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
44
|
+
def delayed_only_process
|
45
|
+
only_process = delayed_options.fetch(:only_process, []).dup
|
46
|
+
only_process = only_process.call(self) if only_process.respond_to?(:call)
|
47
|
+
only_process.map(&:to_sym)
|
48
|
+
end
|
64
49
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
50
|
+
def process_delayed!
|
51
|
+
self.job_is_processing = true
|
52
|
+
self.post_processing = true
|
53
|
+
reprocess!(*delayed_only_process)
|
54
|
+
self.job_is_processing = false
|
55
|
+
update_processing_column
|
56
|
+
end
|
72
57
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
58
|
+
def processing_image_url
|
59
|
+
processing_image_url = delayed_options[:processing_image_url]
|
60
|
+
processing_image_url = processing_image_url.call(self) if processing_image_url.respond_to?(:call)
|
61
|
+
processing_image_url
|
62
|
+
end
|
78
63
|
|
79
|
-
|
80
|
-
|
64
|
+
def save
|
65
|
+
was_dirty = @dirty
|
81
66
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
end
|
67
|
+
super.tap do
|
68
|
+
if delay_processing? && was_dirty
|
69
|
+
instance.prepare_enqueueing_for name
|
86
70
|
end
|
87
71
|
end
|
72
|
+
end
|
88
73
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
74
|
+
def reprocess_without_delay!(*style_args)
|
75
|
+
@post_processing_with_delay = true
|
76
|
+
reprocess!(*style_args)
|
77
|
+
end
|
93
78
|
|
94
|
-
|
79
|
+
private
|
95
80
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
end
|
81
|
+
def update_processing_column
|
82
|
+
if instance.respond_to?(:"#{name}_processing?")
|
83
|
+
instance.send("#{name}_processing=", false)
|
84
|
+
instance.class.where(instance.class.primary_key => instance.id).update_all({ "#{name}_processing" => false })
|
101
85
|
end
|
102
|
-
|
103
86
|
end
|
87
|
+
|
104
88
|
end
|
105
89
|
end
|
@@ -20,7 +20,7 @@ module DelayedPaperclip
|
|
20
20
|
# Attachment and URL Generator extends Paperclip
|
21
21
|
def self.insert
|
22
22
|
ActiveRecord::Base.send(:include, DelayedPaperclip::Glue)
|
23
|
-
Paperclip::Attachment.
|
23
|
+
Paperclip::Attachment.prepend(DelayedPaperclip::Attachment)
|
24
24
|
Paperclip::Attachment.default_options[:url_generator] = DelayedPaperclip::UrlGenerator
|
25
25
|
end
|
26
26
|
end
|
@@ -3,9 +3,13 @@ require 'paperclip/url_generator'
|
|
3
3
|
|
4
4
|
module DelayedPaperclip
|
5
5
|
class UrlGenerator < ::Paperclip::UrlGenerator
|
6
|
+
def initialize(attachment, _compatibility = nil)
|
7
|
+
@attachment = attachment
|
8
|
+
@attachment_options = attachment.options
|
9
|
+
end
|
10
|
+
|
6
11
|
def for(style_name, options)
|
7
12
|
most_appropriate_url = @attachment.processing_style?(style_name) ? most_appropriate_url(style_name) : most_appropriate_url()
|
8
|
-
|
9
13
|
timestamp_as_needed(
|
10
14
|
escape_url_as_needed(
|
11
15
|
@attachment_options[:interpolator].interpolate(most_appropriate_url, @attachment, style_name),
|
@@ -23,12 +23,12 @@ describe DelayedPaperclip::Attachment do
|
|
23
23
|
describe "#post_processing_with_delay" do
|
24
24
|
it "is true if delay_processing? is false" do
|
25
25
|
dummy.image.stubs(:delay_processing?).returns false
|
26
|
-
dummy.image.
|
26
|
+
dummy.image.post_processing.should be_truthy
|
27
27
|
end
|
28
28
|
|
29
29
|
it "is false if delay_processing? is true" do
|
30
30
|
dummy.image.stubs(:delay_processing?).returns true
|
31
|
-
dummy.image.
|
31
|
+
dummy.image.post_processing.should be_falsey
|
32
32
|
end
|
33
33
|
|
34
34
|
context "on a non-delayed image" do
|
@@ -36,19 +36,19 @@ describe DelayedPaperclip::Attachment do
|
|
36
36
|
|
37
37
|
it "is false if delay_processing? is true" do
|
38
38
|
dummy.image.stubs(:delay_processing?).returns true
|
39
|
-
dummy.image.
|
39
|
+
dummy.image.post_processing.should be_falsey
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
44
|
describe "#delay_processing?" do
|
45
|
-
it "returns delayed_options existence if
|
46
|
-
dummy.image.
|
45
|
+
it "returns delayed_options existence if post_processing is nil" do
|
46
|
+
dummy.image.post_processing = nil
|
47
47
|
dummy.image.delay_processing?.should be_truthy
|
48
48
|
end
|
49
49
|
|
50
|
-
it "returns inverse of
|
51
|
-
dummy.image.
|
50
|
+
it "returns inverse of post_processing if it's set" do
|
51
|
+
dummy.image.post_processing = true
|
52
52
|
dummy.image.delay_processing?.should be_falsey
|
53
53
|
end
|
54
54
|
end
|
@@ -151,7 +151,8 @@ describe DelayedPaperclip::Attachment do
|
|
151
151
|
reset_dummy(paperclip: { only_process: lambda { |a| [:small, :large] } } )
|
152
152
|
end
|
153
153
|
|
154
|
-
|
154
|
+
# Enable when https://github.com/thoughtbot/paperclip/pull/2289 is resolved
|
155
|
+
xit "returns [:small, :large]" do
|
155
156
|
expect(dummy.image.delayed_only_process).to eq [:small, :large]
|
156
157
|
end
|
157
158
|
end
|
@@ -192,7 +193,8 @@ describe DelayedPaperclip::Attachment do
|
|
192
193
|
reset_dummy(paperclip: { only_process: lambda { |a| [:small, :large] } } )
|
193
194
|
end
|
194
195
|
|
195
|
-
|
196
|
+
# Enable when https://github.com/thoughtbot/paperclip/pull/2289 is resolved
|
197
|
+
xit "calls reprocess! with options" do
|
196
198
|
dummy.image.expects(:reprocess!).with(:small, :large)
|
197
199
|
dummy.image.process_delayed!
|
198
200
|
end
|
@@ -237,7 +239,7 @@ describe DelayedPaperclip::Attachment do
|
|
237
239
|
end
|
238
240
|
end
|
239
241
|
|
240
|
-
describe "#
|
242
|
+
describe "#save" do
|
241
243
|
context "delay processing and it was dirty" do
|
242
244
|
before :each do
|
243
245
|
dummy.image.stubs(:delay_processing?).returns true
|
@@ -246,14 +248,14 @@ describe DelayedPaperclip::Attachment do
|
|
246
248
|
|
247
249
|
it "prepares the enqueing" do
|
248
250
|
dummy.expects(:prepare_enqueueing_for).with(:image)
|
249
|
-
dummy.image.
|
251
|
+
dummy.image.save
|
250
252
|
end
|
251
253
|
end
|
252
254
|
|
253
255
|
context "without dirty or delay_processing" do
|
254
256
|
it "does not prepare_enqueueing" do
|
255
257
|
dummy.expects(:prepare_enqueueing_for).with(:image).never
|
256
|
-
dummy.image.
|
258
|
+
dummy.image.save
|
257
259
|
end
|
258
260
|
end
|
259
261
|
end
|
@@ -2,12 +2,13 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe DelayedPaperclip::UrlGenerator do
|
4
4
|
before :each do
|
5
|
-
reset_dummy(
|
5
|
+
reset_dummy({})
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
def make_attachment(options = {})
|
9
|
+
reset_dummy(options)
|
10
|
+
Dummy.create.image
|
11
|
+
end
|
11
12
|
|
12
13
|
describe "for" do
|
13
14
|
before :each do
|
@@ -15,19 +16,21 @@ describe DelayedPaperclip::UrlGenerator do
|
|
15
16
|
end
|
16
17
|
|
17
18
|
context "with split processing" do
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
19
|
+
let(:attachment) do
|
20
|
+
make_attachment(
|
21
|
+
{
|
22
|
+
paperclip: {
|
23
|
+
styles: {
|
24
|
+
online: "400x400x",
|
25
|
+
background: "600x600x"
|
26
|
+
},
|
27
|
+
only_process: [:online]
|
28
|
+
},
|
29
|
+
|
30
|
+
only_process: [:background]
|
31
|
+
}
|
32
|
+
)
|
33
|
+
end
|
31
34
|
|
32
35
|
context "processing" do
|
33
36
|
before :each do
|
@@ -58,19 +61,30 @@ describe DelayedPaperclip::UrlGenerator do
|
|
58
61
|
end
|
59
62
|
|
60
63
|
context "should be able to escape (, ), [, and ]." do
|
61
|
-
def generate(expected, updated_at=nil)
|
62
|
-
|
63
|
-
|
64
|
-
|
64
|
+
def generate(expected, updated_at = nil)
|
65
|
+
attachment = make_attachment(
|
66
|
+
{
|
67
|
+
paperclip: {
|
68
|
+
styles: {
|
69
|
+
online: "400x400x",
|
70
|
+
background: "600x600x"
|
71
|
+
},
|
72
|
+
only_process: [:online],
|
73
|
+
interpolator: MockInterpolator.new(result: expected)
|
74
|
+
},
|
75
|
+
|
76
|
+
only_process: [:background]
|
77
|
+
}
|
78
|
+
)
|
79
|
+
url_generator = DelayedPaperclip::UrlGenerator.new(attachment, {})
|
65
80
|
attachment.stubs(:updated_at).returns updated_at
|
66
81
|
url_generator.for(:style_name, {escape: true, timestamp: !!updated_at})
|
67
82
|
end
|
68
83
|
|
69
|
-
|
70
84
|
it "interpolates correctly without timestamp" do
|
71
85
|
expect(
|
72
86
|
"the%28expected%29result%5B%5D"
|
73
|
-
).to
|
87
|
+
).to eq(generate("the(expected)result[]"))
|
74
88
|
end
|
75
89
|
|
76
90
|
it "does not interpolate timestamp" do
|
@@ -79,7 +93,7 @@ describe DelayedPaperclip::UrlGenerator do
|
|
79
93
|
|
80
94
|
expect(
|
81
95
|
"the%28expected%29result%5B%5D?#{updated_at}"
|
82
|
-
).to
|
96
|
+
).to eq(generate(expected, updated_at))
|
83
97
|
end
|
84
98
|
end
|
85
99
|
end
|
@@ -87,18 +101,20 @@ describe DelayedPaperclip::UrlGenerator do
|
|
87
101
|
|
88
102
|
describe "#most_appropriate_url" do
|
89
103
|
context "without delayed_default_url" do
|
90
|
-
|
104
|
+
let(:attachment) { make_attachment(paperclip: {url: "/blah/url.jpg"}) }
|
105
|
+
|
106
|
+
subject { DelayedPaperclip::UrlGenerator.new(attachment) }
|
91
107
|
|
92
108
|
before :each do
|
93
109
|
subject.stubs(:delayed_default_url?).returns false
|
94
110
|
end
|
95
|
-
context "with original file name" do
|
96
|
-
before :each do
|
97
|
-
attachment.stubs(:original_filename).returns "blah"
|
98
|
-
end
|
99
111
|
|
112
|
+
context "with original file name" do
|
100
113
|
it "returns options url" do
|
101
|
-
|
114
|
+
attachment.stubs(:original_filename).returns "blah"
|
115
|
+
subjec = DelayedPaperclip::UrlGenerator.new(attachment)
|
116
|
+
subjec.stubs(:delayed_default_url?).returns false
|
117
|
+
subjec.most_appropriate_url.should == "/blah/url.jpg"
|
102
118
|
end
|
103
119
|
end
|
104
120
|
|
@@ -162,7 +178,8 @@ describe DelayedPaperclip::UrlGenerator do
|
|
162
178
|
end
|
163
179
|
|
164
180
|
describe "#timestamp_possible?" do
|
165
|
-
|
181
|
+
let(:attachment) { make_attachment }
|
182
|
+
subject { DelayedPaperclip::UrlGenerator.new(attachment) }
|
166
183
|
|
167
184
|
context "with delayed_default_url" do
|
168
185
|
before :each do
|
@@ -187,7 +204,8 @@ describe DelayedPaperclip::UrlGenerator do
|
|
187
204
|
end
|
188
205
|
|
189
206
|
describe "#delayed_default_url?" do
|
190
|
-
|
207
|
+
let(:attachment) { make_attachment }
|
208
|
+
subject { DelayedPaperclip::UrlGenerator.new(attachment) }
|
191
209
|
|
192
210
|
before :each do
|
193
211
|
attachment.stubs(:job_is_processing).returns false
|
@@ -32,20 +32,11 @@ describe DelayedPaperclip do
|
|
32
32
|
|
33
33
|
it "finds dummy and calls #process_delayed!" do
|
34
34
|
dummy_stub = stub
|
35
|
-
dummy_stub.expects(:
|
35
|
+
dummy_stub.expects(:find).with(dummy.id).returns(dummy)
|
36
36
|
Dummy.expects(:unscoped).returns(dummy_stub)
|
37
37
|
dummy.image.expects(:process_delayed!)
|
38
38
|
DelayedPaperclip.process_job("Dummy", dummy.id, :image)
|
39
39
|
end
|
40
|
-
|
41
|
-
it "doesn't find dummy and it doesn't raise any exceptions" do
|
42
|
-
dummy_stub = stub
|
43
|
-
dummy_stub.expects(:where).with(id: dummy.id).returns([])
|
44
|
-
Dummy.expects(:unscoped).returns(dummy_stub)
|
45
|
-
expect do
|
46
|
-
DelayedPaperclip.process_job("Dummy", dummy.id, :image)
|
47
|
-
end.not_to raise_exception
|
48
|
-
end
|
49
40
|
end
|
50
41
|
|
51
42
|
describe "paperclip definitions" do
|
@@ -64,4 +55,4 @@ describe DelayedPaperclip do
|
|
64
55
|
})
|
65
56
|
end
|
66
57
|
end
|
67
|
-
end
|
58
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delayed_paperclip
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesse Storimer
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2016-08-
|
14
|
+
date: 2016-08-26 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: paperclip
|
@@ -171,8 +171,10 @@ files:
|
|
171
171
|
- README.md
|
172
172
|
- Rakefile
|
173
173
|
- delayed_paperclip.gemspec
|
174
|
+
- gemfiles/.bundle/config
|
174
175
|
- gemfiles/4.2.gemfile
|
175
176
|
- gemfiles/5.0.gemfile
|
177
|
+
- gemfiles/5.0_paperclip_master.gemfile
|
176
178
|
- lib/delayed_paperclip.rb
|
177
179
|
- lib/delayed_paperclip/attachment.rb
|
178
180
|
- lib/delayed_paperclip/process_job.rb
|
@@ -210,20 +212,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
210
212
|
version: '0'
|
211
213
|
requirements: []
|
212
214
|
rubyforge_project:
|
213
|
-
rubygems_version: 2.
|
215
|
+
rubygems_version: 2.6.6
|
214
216
|
signing_key:
|
215
217
|
specification_version: 4
|
216
218
|
summary: Process your Paperclip attachments in the background
|
217
|
-
test_files:
|
218
|
-
- spec/delayed_paperclip/attachment_spec.rb
|
219
|
-
- spec/delayed_paperclip/class_methods_spec.rb
|
220
|
-
- spec/delayed_paperclip/instance_methods_spec.rb
|
221
|
-
- spec/delayed_paperclip/url_generator_spec.rb
|
222
|
-
- spec/delayed_paperclip_spec.rb
|
223
|
-
- spec/fixtures/12k.png
|
224
|
-
- spec/fixtures/missing.png
|
225
|
-
- spec/integration/base_delayed_paperclip_spec.rb
|
226
|
-
- spec/integration/examples/base.rb
|
227
|
-
- spec/integration/process_job_spec.rb
|
228
|
-
- spec/spec_helper.rb
|
229
|
-
- spec/tmp/.keep
|
219
|
+
test_files: []
|