dynamic_paperclip 0.0.4 → 1.0.0a.1

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.
@@ -13,8 +13,6 @@ class InstallGeneratorTest < Rails::Generators::TestCase
13
13
 
14
14
  run_generator
15
15
 
16
- assert_file "config/initializers/dynamic_paperclip.rb", <<-init
17
- DynamicPaperclip.config.secret = 'supersecurestring'
18
- init
16
+ assert_file "config/initializers/dynamic_paperclip.rb", "DynamicPaperclip.config.secret = 'supersecurestring'"
19
17
  end
20
18
  end
@@ -1 +1 @@
1
- DynamicPaperclip.config.secret = 'supersecurestring'
1
+ DynamicPaperclip.config.secret = 'supersecurestring'
@@ -0,0 +1,95 @@
1
+ require 'test_helper'
2
+
3
+ class Foo < ActiveRecord::Base
4
+ has_dynamic_attached_file :image,
5
+ :url => '/system/:class/:attachment/:id/:style/:filename'
6
+
7
+ has_dynamic_attached_file :image_with_id_partition_in_url,
8
+ :url => '/system/:class/:attachment/:id_partition/:style/:filename'
9
+ end
10
+
11
+ class DynamicPaperclip::AttachmentStyleGeneratorTest < Test::Unit::TestCase
12
+ include Rack::Test::Methods
13
+
14
+ def app
15
+ DynamicPaperclip::AttachmentStyleGenerator.new(@app)
16
+ end
17
+
18
+ def setup
19
+ @app = stub('Application', :call => [200, {}, ''])
20
+
21
+ @foo = stub('foo')
22
+ @attachment = stub('image attachment', :path => File.join(FIXTURES_DIR, 'rails.png'), :content_type => 'image/jpeg')
23
+ @attachment.stubs(:exists?).returns(true)
24
+
25
+ Foo.stubs(:find).with(1).returns @foo
26
+ @foo.stubs(:image).returns @attachment
27
+ end
28
+
29
+ should 'not process style if it already exists' do
30
+ @attachment.expects(:exists?).with(:dynamic_42x42).returns(true)
31
+ @attachment.expects(:process_dynamic_style).never
32
+
33
+ get '/system/foos/images/1/dynamic_42x42/file', { s: DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42') }
34
+ end
35
+
36
+ should 'process style if it is dynamic and does not exist' do
37
+ @attachment.expects(:exists?).with(:dynamic_42x42).returns(false)
38
+ @attachment.expects(:process_dynamic_style).once
39
+
40
+ get '/system/foos/images/1/dynamic_42x42/file', { s: DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42') }
41
+ end
42
+
43
+ should 'find record when an ID is used' do
44
+ Foo.expects(:find).with(1).returns @foo
45
+
46
+ get '/system/foos/images/1/dynamic_42x42/file', { s: DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42') }
47
+ end
48
+
49
+ should 'find record when an ID partition is used' do
50
+ @foo.stubs(:image_with_id_partition_in_url).returns @attachment
51
+ Foo.expects(:find).with(10042).returns @foo
52
+
53
+ get '/system/foos/image_with_id_partition_in_urls/000/010/042/dynamic_42x42/file', { s: DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42') }
54
+ end
55
+
56
+ should 'respond with correct content type' do
57
+ get '/system/foos/images/1/dynamic_42x42/file', { s: DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42') }
58
+
59
+ assert_equal 'image/jpeg', last_response.header['Content-Type']
60
+ end
61
+
62
+ should 'respond with correct content-disposition' do
63
+ get '/system/foos/images/1/dynamic_42x42/file', { s: DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42') }
64
+
65
+ assert_equal 'inline; filename=rails.png', last_response.header['Content-Disposition']
66
+ end
67
+
68
+ should 'respond with correct content-transfer-encoding' do
69
+ get '/system/foos/images/1/dynamic_42x42/file', { s: DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42') }
70
+
71
+ assert_equal 'binary', last_response.header['Content-Transfer-Encoding']
72
+ end
73
+
74
+ should 'respond with FileBody' do
75
+ file_body = ActionController::DataStreaming::FileBody.new(File.join(FIXTURES_DIR, 'rails.png'))
76
+ ActionController::DataStreaming::FileBody.expects(:new).with(File.join(FIXTURES_DIR, 'rails.png')).returns(file_body)
77
+
78
+ response = app.call(Rack::MockRequest.env_for('/system/foos/images/1/dynamic_42x42/file?s='+DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42')))
79
+
80
+ assert_equal file_body, response[2]
81
+ end
82
+
83
+ should 'respond with success' do
84
+ get '/system/foos/images/1/dynamic_42x42/file', { s: DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42') }
85
+
86
+ assert last_response.ok?
87
+ end
88
+
89
+ should '403 with empty body if hash does not match style name' do
90
+ get '/system/foos/images/1/dynamic_42x42/file', { s: 'this is an invalid hash' }
91
+
92
+ assert_equal 403, last_response.status
93
+ assert_equal '', last_response.body
94
+ end
95
+ end
@@ -10,7 +10,7 @@ class AttachmentTest < ActiveSupport::TestCase
10
10
  should 'generate correct secure attachment URL when given a style definition' do
11
11
  DynamicPaperclip::Config.any_instance.stubs(:secret).returns('abc123')
12
12
 
13
- assert_equal "/system/photos/images/000/000/001/dynamic_50x50%23/rails.png?s=#{Digest::SHA1.hexdigest("abc123dynamic_50x50%23")}", photos(:rails).image.dynamic_url('50x50#')
13
+ assert_equal "/system/photos/images/000/000/001/dynamic_50x50%2523/rails.png?s=#{Digest::SHA1.hexdigest("abc123dynamic_50x50%23")}", photos(:rails).image.dynamic_url('50x50#')
14
14
  end
15
15
 
16
16
  should 'raise error if no secret has been configured' do
@@ -34,7 +34,7 @@ class AttachmentTest < ActiveSupport::TestCase
34
34
 
35
35
  attachment.expects(:reprocess!).with(:dynamic_42x42).once
36
36
 
37
- attachment.process_dynamic_style '42x42'
37
+ attachment.process_dynamic_style :dynamic_42x42
38
38
 
39
39
  assert_equal '42x42', attachment.styles[:dynamic_42x42].geometry
40
40
  end
@@ -1,29 +1,11 @@
1
1
  require 'test_helper'
2
2
 
3
- class Foo; end
3
+ class Foo < ActiveRecord::Base; end
4
4
 
5
5
  class HasAttachedFileTest < Test::Unit::TestCase
6
- should 'glob id_partition' do
7
- DynamicPaperclip::HasAttachedFile.new Foo, :bar, { url: '/system/foos/bars/:id_partition/:style/:filename' }
6
+ should 'register dynamic attachment' do
7
+ DynamicPaperclip::AttachmentRegistry.expects(:register).with(Foo, :bar, { url: '/system/foos/bars/:id_partition/:style/:filename' })
8
8
 
9
- assert Rails.application.routes.routes.any? do |route|
10
- route.path.spec == '/system/foos/bars/*id_partition/:style/:filename(.:format)'
11
- end
12
- end
13
-
14
- should 'interpolate :class' do
15
- DynamicPaperclip::HasAttachedFile.new Foo, :bar, { url: '/system/:class/bars/:id/:style/:filename' }
16
-
17
- assert Rails.application.routes.routes.any? do |route|
18
- route.path.spec == '/system/foos/bars/:id/:style/:filename(.:format)'
19
- end
20
- end
21
-
22
- should "use Paperclip's default URL if none is specified" do
23
- DynamicPaperclip::HasAttachedFile.new Foo, :bar, {}
24
-
25
- assert Rails.application.routes.routes.any? do |route|
26
- route.path.spec == '/system/foos/:attachment/*id_partition/:style/:filename(.:format)'
27
- end
9
+ DynamicPaperclip::HasAttachedFile.define_on Foo, :bar, { url: '/system/foos/bars/:id_partition/:style/:filename' }
28
10
  end
29
11
  end
metadata CHANGED
@@ -1,32 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynamic_paperclip
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
5
- prerelease:
4
+ version: 1.0.0a.1
5
+ prerelease: 5
6
6
  platform: ruby
7
7
  authors:
8
8
  - Jim Ryan
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-04 00:00:00.000000000 Z
12
+ date: 2014-05-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: rails
15
+ name: rack
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>'
19
+ - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: '3.2'
21
+ version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ! '>'
27
+ - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
- version: '3.2'
29
+ version: '0'
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: paperclip
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -34,7 +34,7 @@ dependencies:
34
34
  requirements:
35
35
  - - ! '>='
36
36
  - !ruby/object:Gem::Version
37
- version: 3.5.0
37
+ version: 3.5.1
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,7 +42,39 @@ dependencies:
42
42
  requirements:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
- version: 3.5.0
45
+ version: 3.5.1
46
+ - !ruby/object:Gem::Dependency
47
+ name: activesupport
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: actionpack
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '3.2'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '3.2'
46
78
  - !ruby/object:Gem::Dependency
47
79
  name: sqlite3
48
80
  requirement: !ruby/object:Gem::Requirement
@@ -91,6 +123,22 @@ dependencies:
91
123
  - - ! '>='
92
124
  - !ruby/object:Gem::Version
93
125
  version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rails
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>'
132
+ - !ruby/object:Gem::Version
133
+ version: '3.2'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>'
140
+ - !ruby/object:Gem::Version
141
+ version: '3.2'
94
142
  description: Let's your views define attachment styles, and delays processing all
95
143
  the way to the first user who requests it.
96
144
  email:
@@ -99,13 +147,14 @@ executables: []
99
147
  extensions: []
100
148
  extra_rdoc_files: []
101
149
  files:
102
- - app/controllers/dynamic_paperclip/attachment_styles_controller.rb
103
150
  - lib/dynamic_paperclip/attachment.rb
151
+ - lib/dynamic_paperclip/attachment_registry.rb
152
+ - lib/dynamic_paperclip/attachment_style_generator.rb
104
153
  - lib/dynamic_paperclip/config.rb
105
- - lib/dynamic_paperclip/engine.rb
106
154
  - lib/dynamic_paperclip/errors.rb
107
155
  - lib/dynamic_paperclip/has_attached_file.rb
108
156
  - lib/dynamic_paperclip/paperclip_shim.rb
157
+ - lib/dynamic_paperclip/railtie.rb
109
158
  - lib/dynamic_paperclip/style_naming.rb
110
159
  - lib/dynamic_paperclip/url_security.rb
111
160
  - lib/dynamic_paperclip/version.rb
@@ -114,7 +163,6 @@ files:
114
163
  - MIT-LICENSE
115
164
  - Rakefile
116
165
  - README.md
117
- - test/controllers/attachment_style_controller_test.rb
118
166
  - test/dummy/app/controllers/application_controller.rb
119
167
  - test/dummy/app/models/photo.rb
120
168
  - test/dummy/config/application.rb
@@ -150,6 +198,7 @@ files:
150
198
  - test/integration/dynamic_attachment_styles_test.rb
151
199
  - test/test_helper.rb
152
200
  - test/tmp/config/initializers/dynamic_paperclip.rb
201
+ - test/unit/attachment_style_generator_test.rb
153
202
  - test/unit/attachment_test.rb
154
203
  - test/unit/has_attached_file_test.rb
155
204
  homepage: http://github.com/room118solutions/dynamic_paperclip
@@ -164,12 +213,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
164
213
  - - ! '>='
165
214
  - !ruby/object:Gem::Version
166
215
  version: '0'
216
+ segments:
217
+ - 0
218
+ hash: 2045189592495985284
167
219
  required_rubygems_version: !ruby/object:Gem::Requirement
168
220
  none: false
169
221
  requirements:
170
- - - ! '>='
222
+ - - ! '>'
171
223
  - !ruby/object:Gem::Version
172
- version: '0'
224
+ version: 1.3.1
173
225
  requirements: []
174
226
  rubyforge_project:
175
227
  rubygems_version: 1.8.25
@@ -177,7 +229,6 @@ signing_key:
177
229
  specification_version: 3
178
230
  summary: Generate Paperclip attachment styles on the fly
179
231
  test_files:
180
- - test/controllers/attachment_style_controller_test.rb
181
232
  - test/dummy/app/controllers/application_controller.rb
182
233
  - test/dummy/app/models/photo.rb
183
234
  - test/dummy/config/application.rb
@@ -213,5 +264,6 @@ test_files:
213
264
  - test/integration/dynamic_attachment_styles_test.rb
214
265
  - test/test_helper.rb
215
266
  - test/tmp/config/initializers/dynamic_paperclip.rb
267
+ - test/unit/attachment_style_generator_test.rb
216
268
  - test/unit/attachment_test.rb
217
269
  - test/unit/has_attached_file_test.rb
@@ -1,43 +0,0 @@
1
- module DynamicPaperclip
2
- class AttachmentStylesController < ApplicationController
3
- def action_missing(name, *args, &block)
4
- if name =~ /^generate_(.+)$/
5
- send :generate, $1
6
- end
7
- end
8
-
9
- private
10
-
11
- def generate(class_name)
12
- klass = class_name.camelize.constantize
13
- attachment_name = params[:attachment].singularize.to_sym
14
-
15
- # Ensure that we have a valid attachment name and an ID
16
- raise Errors::UndefinedAttachment unless klass.attachment_definitions[attachment_name]
17
- raise Errors::MissingID unless params[:id] || params[:id_partition]
18
-
19
- id = params[:id] || id_from_partition(params[:id_partition])
20
-
21
- attachment = klass.find(id).send(attachment_name)
22
-
23
- # The definition will be escaped twice in the URL, Rails will unescape it once for us,
24
- # so it will already be escaped once, so we don't need to escape it again. We should always
25
- # reference dynamic style names after escaping once - that's how they reside on the FS.
26
- style_name = StyleNaming.dynamic_style_name_from_definition(params[:definition], false)
27
-
28
- # Validate URL hash against requested style name
29
- raise Errors::InvalidHash unless DynamicPaperclip::UrlSecurity.valid_hash?(params[:s], style_name)
30
-
31
- # Only process style if it doesn't exist,
32
- # otherwise we may just be fielding a request for
33
- # an existing style (i.e. serve_static_assets is true)
34
- attachment.process_dynamic_style style_name unless attachment.exists?(style_name)
35
-
36
- send_file attachment.path(style_name), :disposition => 'inline', :type => attachment.content_type
37
- end
38
-
39
- def id_from_partition(partition)
40
- partition.gsub('/', '').to_i
41
- end
42
- end
43
- end
@@ -1,4 +0,0 @@
1
- module DynamicPaperclip
2
- class Engine < ::Rails::Engine
3
- end
4
- end
@@ -1,129 +0,0 @@
1
- require 'test_helper'
2
-
3
- class Foo < ActiveRecord::Base
4
- has_dynamic_attached_file :image,
5
- :url => '/system/:class/:attachment/:id/:style/:filename'
6
-
7
- has_dynamic_attached_file :image_with_id_partition_in_url,
8
- :url => '/system/:class/:attachment/:id_partition/:style/:filename'
9
- end
10
-
11
- class DynamicPaperclip::AttachmentStylesControllerTest < ActionController::TestCase
12
- setup do
13
- @foo = stub('foo')
14
- @attachment = stub('image attachment', :path => File.join(FIXTURES_DIR, 'rails.png'), :content_type => 'image/jpeg')
15
- @attachment.stubs(:exists?).returns(true)
16
-
17
- Foo.stubs(:find).with('1').returns @foo
18
- @foo.stubs(:image).returns @attachment
19
- end
20
-
21
- should 'raise error if attachment is not defined on class' do
22
- assert_raises(DynamicPaperclip::Errors::UndefinedAttachment) {
23
- get :generate_foo,
24
- :attachment => 'bars',
25
- :id => '1',
26
- :style => 'style',
27
- :filename => 'file',
28
- :use_route => :dynamic_paperclip_engine
29
- }
30
- end
31
-
32
- should 'raise error if no ID is given' do
33
- assert_raises(DynamicPaperclip::Errors::MissingID) {
34
- get :generate_foo,
35
- :attachment => 'images',
36
- :style => 'style',
37
- :filename => 'file',
38
- :use_route => :dynamic_paperclip_engine
39
- }
40
- end
41
-
42
- should 'not process style if it already exists' do
43
- @attachment.expects(:exists?).with(:dynamic_42x42).returns(true)
44
- @attachment.expects(:process_dynamic_style).never
45
-
46
- get :generate_foo,
47
- :attachment => 'images',
48
- :id => '1',
49
- :definition => '42x42',
50
- :filename => 'file',
51
- :s => DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42'),
52
- :use_route => :dynamic_paperclip_engine
53
- end
54
-
55
- should 'process style if it is dynamic and does not exist' do
56
- @attachment.expects(:exists?).with(:dynamic_42x42).returns(false)
57
- @attachment.expects(:process_dynamic_style).once
58
-
59
- get :generate_foo,
60
- :attachment => 'images',
61
- :id => '1',
62
- :definition => '42x42',
63
- :filename => 'file',
64
- :s => DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42'),
65
- :use_route => :dynamic_paperclip_engine
66
- end
67
-
68
- should 'find record when an ID is used' do
69
- Foo.expects(:find).with('1').returns @foo
70
-
71
- get :generate_foo,
72
- :attachment => 'images',
73
- :id => '1',
74
- :definition => '42x42',
75
- :filename => 'file',
76
- :s => DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42'),
77
- :use_route => :dynamic_paperclip_engine
78
- end
79
-
80
- should 'find record when an ID partition is used' do
81
- @foo.stubs(:image_with_id_partition_in_url).returns @attachment
82
- Foo.expects(:find).with(10042).returns @foo
83
-
84
- get :generate_foo,
85
- :attachment => 'image_with_id_partition_in_urls',
86
- :id_partition => '000/010/042',
87
- :definition => '42x42',
88
- :filename => 'file',
89
- :s => DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42'),
90
- :use_route => :dynamic_paperclip_engine
91
- end
92
-
93
- should 'respond with correct content type' do
94
- get :generate_foo,
95
- :attachment => 'images',
96
- :id => '1',
97
- :definition => '42x42',
98
- :filename => 'file',
99
- :s => DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42'),
100
- :use_route => :dynamic_paperclip_engine
101
-
102
- assert_equal 'image/jpeg', @response.header['Content-Type']
103
- end
104
-
105
- should 'send image to client with correct content type and disposition' do
106
- @controller.stubs(:render)
107
- @controller.expects(:send_file).with(@attachment.path, :disposition => 'inline', :type => @attachment.content_type)
108
-
109
- get :generate_foo,
110
- :attachment => 'images',
111
- :id => '1',
112
- :definition => '42x42',
113
- :filename => 'file',
114
- :s => DynamicPaperclip::UrlSecurity.generate_hash('dynamic_42x42'),
115
- :use_route => :dynamic_paperclip_engine
116
- end
117
-
118
- should 'raise error if hash does not match style name' do
119
- assert_raises(DynamicPaperclip::Errors::InvalidHash) do
120
- get :generate_foo,
121
- :attachment => 'images',
122
- :id => '1',
123
- :definition => '42x42',
124
- :filename => 'file',
125
- :s => 'this is an invalid hash',
126
- :use_route => :dynamic_paperclip_engine
127
- end
128
- end
129
- end