radiant-clipped-extension 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/admin/assets_controller.rb +10 -4
- data/app/models/asset.rb +19 -14
- data/app/models/asset_tags.rb +0 -14
- data/app/models/asset_type.rb +20 -6
- data/app/views/admin/assets/new.html.haml +1 -1
- data/app/views/admin/pages/_asset_popups.html.haml +1 -1
- data/clipped_extension.rb +4 -3
- data/lib/radiant-clipped-extension/version.rb +1 -1
- data/radiant-clipped-extension-1.0.0.gem +0 -0
- data/spec/fixtures/5k.png +0 -0
- data/spec/lib/asset_tags_spec.rb +0 -4
- data/spec/models/asset_spec.rb +2 -2
- data/spec/models/asset_type_spec.rb +9 -6
- data/spec/models/post_processing_spec.rb +61 -0
- metadata +10 -5
@@ -25,11 +25,17 @@ class Admin::AssetsController < Admin::ResourceController
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def create
|
28
|
-
@
|
28
|
+
@assets, @page_attachments = [], []
|
29
|
+
params[:asset][:asset].to_a.each do |uploaded_asset|
|
30
|
+
@asset = Asset.create(:asset => uploaded_asset, :title => params[:asset][:title], :caption => params[:asset][:caption])
|
31
|
+
if params[:for_attachment]
|
32
|
+
@page = Page.find_by_id(params[:page_id]) || Page.new
|
33
|
+
@page_attachments << @page_attachment = @asset.page_attachments.build(:page => @page)
|
34
|
+
end
|
35
|
+
@assets << @asset
|
36
|
+
end
|
29
37
|
if params[:for_attachment]
|
30
|
-
|
31
|
-
@page_attachment = @asset.page_attachments.build(:page => @page)
|
32
|
-
render :partial => 'admin/page_attachments/attachment', :object => @page_attachment
|
38
|
+
render :partial => 'admin/page_attachments/attachment', :collection => @page_attachments
|
33
39
|
else
|
34
40
|
response_for :create
|
35
41
|
end
|
data/app/models/asset.rb
CHANGED
@@ -34,7 +34,7 @@ class Asset < ActiveRecord::Base
|
|
34
34
|
|
35
35
|
has_attached_file :asset,
|
36
36
|
:styles => lambda { |attachment|
|
37
|
-
AssetType.
|
37
|
+
AssetType.for(attachment).paperclip_styles
|
38
38
|
},
|
39
39
|
:processors => lambda { |asset|
|
40
40
|
asset.paperclip_processors
|
@@ -52,7 +52,8 @@ class Asset < ActiveRecord::Base
|
|
52
52
|
|
53
53
|
before_save :assign_title
|
54
54
|
before_save :assign_uuid
|
55
|
-
|
55
|
+
|
56
|
+
after_post_process :read_dimensions
|
56
57
|
|
57
58
|
validates_attachment_presence :asset, :message => "You must choose a file to upload!"
|
58
59
|
if Radiant.config["paperclip.skip_filetype_validation"] != "true" && Radiant.config['paperclip.content_types']
|
@@ -61,7 +62,7 @@ class Asset < ActiveRecord::Base
|
|
61
62
|
validates_attachment_size :asset, :less_than => ( Radiant.config["assets.max_asset_size"] || 5 ).to_i.megabytes
|
62
63
|
|
63
64
|
def asset_type
|
64
|
-
AssetType.
|
65
|
+
AssetType.for(asset)
|
65
66
|
end
|
66
67
|
delegate :paperclip_processors, :paperclip_styles, :style_dimensions, :style_format, :to => :asset_type
|
67
68
|
|
@@ -82,7 +83,7 @@ class Asset < ActiveRecord::Base
|
|
82
83
|
def extension(style_name='original')
|
83
84
|
if style_name == 'original'
|
84
85
|
return original_extension
|
85
|
-
elsif style =
|
86
|
+
elsif style = paperclip_styles[style_name.to_sym]
|
86
87
|
return style.format
|
87
88
|
else
|
88
89
|
return original_extension
|
@@ -104,8 +105,8 @@ class Asset < ActiveRecord::Base
|
|
104
105
|
def geometry(style_name='original')
|
105
106
|
if style_name == 'original'
|
106
107
|
original_geometry
|
107
|
-
elsif style = asset.styles[style_name.to_sym]
|
108
|
-
original_geometry
|
108
|
+
elsif style = asset.styles[style_name.to_sym] # asset.styles is normalised, but self.paperclip_styles is not
|
109
|
+
original_geometry.transformed_by(style.geometry)
|
109
110
|
end
|
110
111
|
end
|
111
112
|
|
@@ -150,16 +151,20 @@ class Asset < ActiveRecord::Base
|
|
150
151
|
|
151
152
|
private
|
152
153
|
|
154
|
+
# at this point the file queue will not have been written
|
155
|
+
# but the upload should be in place. We read dimensions from the
|
156
|
+
# original file and calculate thumbnail dimensions later, on demand.
|
157
|
+
|
153
158
|
def read_dimensions
|
154
|
-
if image?
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
geometry
|
159
|
+
if image?
|
160
|
+
if file = asset.queued_for_write[:original]
|
161
|
+
geometry = Paperclip::Geometry.from_file(file)
|
162
|
+
self.original_width = geometry.width
|
163
|
+
self.original_height = geometry.height
|
164
|
+
self.original_extension = File.extname(file.path)
|
165
|
+
end
|
162
166
|
end
|
167
|
+
true
|
163
168
|
end
|
164
169
|
|
165
170
|
def assign_title
|
data/app/models/asset_tags.rb
CHANGED
@@ -75,20 +75,6 @@ module AssetTags
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
-
desc %{
|
79
|
-
References the last asset attached to the current page.
|
80
|
-
|
81
|
-
*Usage:*
|
82
|
-
<pre><code><r:assets:last>...</r:assets:last></code></pre>
|
83
|
-
}
|
84
|
-
tag 'assets:last' do |tag|
|
85
|
-
p "tag.locals.page.assets is #{tag.locals.page.assets.join(',')} and tag.locals.page.assets.last is #{tag.locals.page.assets.last}"
|
86
|
-
|
87
|
-
if tag.locals.asset = tag.locals.page.assets.last
|
88
|
-
tag.expand
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
78
|
desc %{
|
93
79
|
Renders the contained elements only if the current contextual page has one or
|
94
80
|
more assets. The @min_count@ attribute specifies the minimum number of required
|
data/app/models/asset_type.rb
CHANGED
@@ -12,6 +12,7 @@ class AssetType
|
|
12
12
|
|
13
13
|
@@types = []
|
14
14
|
@@type_lookup = {}
|
15
|
+
@@extension_lookup = {}
|
15
16
|
@@mime_lookup = {}
|
16
17
|
@@default_type = nil
|
17
18
|
attr_reader :name, :processors, :styles, :icon_name, :catchall, :default_radius_tag
|
@@ -22,11 +23,12 @@ class AssetType
|
|
22
23
|
@icon_name = options[:icon] || name
|
23
24
|
@processors = options[:processors] || []
|
24
25
|
@styles = options[:styles] || {}
|
25
|
-
@mimes = options[:mime_types] || []
|
26
26
|
@default_radius_tag = options[:default_radius_tag] || 'link'
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
@extensions = options[:extensions] || []
|
28
|
+
@extensions.each { |ext| @@extension_lookup[ext] ||= self }
|
29
|
+
@mimes = options[:mime_types] || []
|
30
|
+
@mimes.each { |mimetype| @@mime_lookup[mimetype] ||= self }
|
31
|
+
|
30
32
|
this = self
|
31
33
|
Asset.send :define_method, "#{name}?".intern do this.mime_types.include?(asset_content_type) end
|
32
34
|
Asset.send :define_class_method, "#{name}_condition".intern do this.condition; end
|
@@ -119,8 +121,17 @@ class AssetType
|
|
119
121
|
|
120
122
|
# class methods
|
121
123
|
|
122
|
-
def self.
|
123
|
-
|
124
|
+
def self.for(attachment)
|
125
|
+
extension = File.extname(attachment.original_filename).sub(/^\.+/, "")
|
126
|
+
from_extension(extension) || from_mimetype(attachment.instance_read(:content_type)) || catchall
|
127
|
+
end
|
128
|
+
|
129
|
+
def self.from_extension(extension)
|
130
|
+
@@extension_lookup[extension]
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.from_mimetype(mimetype)
|
134
|
+
@@mime_lookup[mimetype]
|
124
135
|
end
|
125
136
|
|
126
137
|
def self.catchall
|
@@ -138,6 +149,9 @@ class AssetType
|
|
138
149
|
def self.find(type)
|
139
150
|
@@type_lookup[type] if type
|
140
151
|
end
|
152
|
+
def self.[](type)
|
153
|
+
find(type)
|
154
|
+
end
|
141
155
|
|
142
156
|
def self.all
|
143
157
|
@@types
|
data/clipped_extension.rb
CHANGED
@@ -22,11 +22,12 @@ class ClippedExtension < Radiant::Extension
|
|
22
22
|
Page.send :include, AssetTags # radius tags for selecting sets of assets and presenting each one
|
23
23
|
UserActionObserver.instance.send :add_observer!, Asset # the usual creator- and updater-stamping
|
24
24
|
|
25
|
-
AssetType.new :image, :icon => 'image', :default_radius_tag => 'image', :processors => [:thumbnail], :styles => {:icon => ['42x42#', :png], :thumbnail => ['100x100#', :png]}, :mime_types => %w[image/png image/x-png image/jpeg image/pjpeg image/jpg image/gif]
|
25
|
+
AssetType.new :image, :icon => 'image', :default_radius_tag => 'image', :processors => [:thumbnail], :styles => {:icon => ['42x42#', :png], :thumbnail => ['100x100#', :png]}, :extensions => %w[jpg jpeg png gif], :mime_types => %w[image/png image/x-png image/jpeg image/pjpeg image/jpg image/gif]
|
26
26
|
AssetType.new :video, :icon => 'video', :processors => [:frame_grab], :styles => {:native => ['', :jpg], :icon => ['42x42#', :png], :thumbnail => ['100x100#', :png]}, :mime_types => %w[application/x-mp4 video/mpeg video/quicktime video/x-la-asf video/x-ms-asf video/x-msvideo video/x-sgi-movie video/x-flv flv-application/octet-stream video/3gpp video/3gpp2 video/3gpp-tt video/BMPEG video/BT656 video/CelB video/DV video/H261 video/H263 video/H263-1998 video/H263-2000 video/H264 video/JPEG video/MJ2 video/MP1S video/MP2P video/MP2T video/mp4 video/MP4V-ES video/MPV video/mpeg4 video/mpeg4-generic video/nv video/parityfec video/pointer video/raw video/rtx video/ogg video/webm]
|
27
27
|
AssetType.new :audio, :icon => 'audio', :mime_types => %w[audio/mpeg audio/mpg audio/ogg application/ogg audio/x-ms-wma audio/vnd.rn-realaudio audio/x-wav]
|
28
|
-
AssetType.new :
|
29
|
-
AssetType.new :
|
28
|
+
AssetType.new :font, :icon => 'font', :extensions => %w[ttf otf eot woff]
|
29
|
+
AssetType.new :flash, :icon => 'flash', :default_radius_tag => 'flash', :extensions => %w{swf}, :mime_types => %w[application/x-shockwave-flash]
|
30
|
+
AssetType.new :pdf, :icon => 'pdf', :processors => [:thumbnail], :extensions => %w{pdf}, :mime_types => %w[application/pdf application/x-pdf], :styles => {:icon => ['42x42#', :png], :thumbnail => ['100x100#', :png]}
|
30
31
|
AssetType.new :document, :icon => 'document', :mime_types => %w[application/msword application/rtf application/vnd.ms-excel application/vnd.ms-powerpoint application/vnd.ms-project application/vnd.ms-works text/plain text/html]
|
31
32
|
AssetType.new :other, :icon => 'unknown'
|
32
33
|
|
Binary file
|
Binary file
|
data/spec/lib/asset_tags_spec.rb
CHANGED
@@ -33,10 +33,6 @@ describe AssetTags do
|
|
33
33
|
page.should render('<r:assets:first><r:asset:id /></r:assets:first>').as( "#{asset_id(:test2)}" )
|
34
34
|
end
|
35
35
|
|
36
|
-
it "assets:last" do
|
37
|
-
page.should render('<r:assets:last><r:asset:id /></r:assets:last>').as( "#{asset_id(:test1)}" )
|
38
|
-
end
|
39
|
-
|
40
36
|
it "should retreive an asset by name" do
|
41
37
|
page.should render('<r:asset:id name="video" />').as( "#{asset_id(:video)}" )
|
42
38
|
end
|
data/spec/models/asset_spec.rb
CHANGED
@@ -23,7 +23,7 @@ describe Asset do
|
|
23
23
|
it 'should be valid when saved' do
|
24
24
|
create_asset.should be_valid
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
describe '#thumbnail' do
|
28
28
|
describe 'without argument' do
|
29
29
|
it 'should return paperclip asset url for image' do
|
@@ -63,7 +63,7 @@ describe Asset do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
it 'should return icon for non-image with a given size' do
|
66
|
-
document = new_asset :asset_content_type => 'application/msword'
|
66
|
+
document = new_asset :asset_content_type => 'application/msword', :asset_file_name => "document.doc"
|
67
67
|
document.thumbnail('icon').should == "/images/admin/assets/document_icon.png"
|
68
68
|
document.thumbnail('anything_but_icon').should == "/images/admin/assets/document_icon.png"
|
69
69
|
end
|
@@ -15,9 +15,9 @@ end
|
|
15
15
|
AssetType.new :simple, :mime_types => %w[test/this test/that]
|
16
16
|
AssetType.new :complex, :processors => [:dummy], :styles => {:something => "99x99>"}, :mime_types => %w[test/complex], :icon => 'document'
|
17
17
|
AssetType.new :configured, :processors => [:dummy], :mime_types => %w[test/configured]
|
18
|
-
|
18
|
+
AssetType.new :unstandard, :extensions => %w[unstandard nomimetype]
|
19
|
+
|
19
20
|
describe AssetType do
|
20
|
-
|
21
21
|
context 'without thumbnails' do
|
22
22
|
subject{ AssetType.find(:simple) }
|
23
23
|
its(:plural) { should == "simples" }
|
@@ -54,10 +54,13 @@ describe AssetType do
|
|
54
54
|
AssetType.slice('simple', 'complex').should =~ [AssetType.find(:simple), AssetType.find(:complex)]
|
55
55
|
end
|
56
56
|
|
57
|
-
describe '.
|
58
|
-
AssetType.
|
59
|
-
|
57
|
+
describe '.from_extension' do
|
58
|
+
AssetType.from_extension('nomimetype').should == AssetType.find(:unstandard)
|
59
|
+
end
|
60
|
+
|
61
|
+
describe '.from_mimetype' do
|
62
|
+
AssetType.from_mimetype('test/this').should == AssetType.find(:simple)
|
60
63
|
end
|
61
64
|
end
|
62
|
-
|
65
|
+
|
63
66
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe Asset do
|
4
|
+
dataset :assets
|
5
|
+
|
6
|
+
# these are here to check that paperclip and our various add-ons are all working together.
|
7
|
+
# most of the components are also tested individually but in more abstract ways.
|
8
|
+
|
9
|
+
let(:asset) {
|
10
|
+
asset = assets(:test1)
|
11
|
+
asset.asset = File.new(File.join(File.dirname(__FILE__), "..", "fixtures", "5k.png"))
|
12
|
+
asset
|
13
|
+
}
|
14
|
+
|
15
|
+
describe "on assigning a file to an asset" do
|
16
|
+
before do
|
17
|
+
Radiant.config["assets.create_image_thumbnails?"] = true
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should have saved the asset" do
|
21
|
+
asset.new_record?.should be_false
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should have calculated asset type" do
|
25
|
+
asset.asset_type.should == AssetType[:image]
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should have recorded width and height and original extension" do
|
29
|
+
asset.original_width.should == 434
|
30
|
+
asset.original_height.should == 66
|
31
|
+
asset.original_extension.should == 'png'
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should respond to original geometry" do
|
35
|
+
asset.original_geometry.should == Paperclip::Geometry.new(434,66)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should calculate thumbnail geometry" do
|
39
|
+
original_geometry = Paperclip::Geometry.new(434,66)
|
40
|
+
asset.geometry.should == original_geometry
|
41
|
+
asset.geometry(:icon).should == original_geometry * Paperclip::Geometry.parse("42x42#")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should respond to image dimension methods" do
|
45
|
+
asset.width.should == 434
|
46
|
+
asset.height.should == 66
|
47
|
+
asset.width(:icon).should == 42
|
48
|
+
asset.height(:icon).should == 42
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should respond to image shape methods" do
|
52
|
+
asset.horizontal?.should be_true
|
53
|
+
asset.vertical?.should be_false
|
54
|
+
asset.square?.should be_false
|
55
|
+
asset.square?(:icon).should be_true
|
56
|
+
asset.orientation.should == 'horizontal'
|
57
|
+
asset.aspect.should == 434.0/66.0
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: radiant-clipped-extension
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 1
|
10
|
+
version: 1.0.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Keith Bingman
|
@@ -18,7 +18,7 @@ autorequire:
|
|
18
18
|
bindir: bin
|
19
19
|
cert_chain: []
|
20
20
|
|
21
|
-
date: 2011-06-
|
21
|
+
date: 2011-06-22 00:00:00 Z
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
24
24
|
name: acts_as_list
|
@@ -178,18 +178,21 @@ files:
|
|
178
178
|
- public/images/admin/assets/zip_icon.png
|
179
179
|
- public/javascripts/admin/assets.js
|
180
180
|
- public/stylesheets/sass/admin/assets.sass
|
181
|
+
- radiant-clipped-extension-1.0.0.gem
|
181
182
|
- radiant-clipped-extension.gemspec
|
182
183
|
- Rakefile
|
183
184
|
- README.md
|
184
185
|
- spec/controllers/admin/assets_controller_spec.rb
|
185
186
|
- spec/controllers/admin/page_attachments_controller_spec.rb
|
186
187
|
- spec/datasets/assets_dataset.rb
|
188
|
+
- spec/fixtures/5k.png
|
187
189
|
- spec/fixtures/test.flv
|
188
190
|
- spec/lib/asset_tags_spec.rb
|
189
191
|
- spec/lib/frame_grab_spec.rb
|
190
192
|
- spec/lib/geometry_transformation_spec.rb
|
191
193
|
- spec/models/asset_spec.rb
|
192
194
|
- spec/models/asset_type_spec.rb
|
195
|
+
- spec/models/post_processing_spec.rb
|
193
196
|
- spec/spec.opts
|
194
197
|
- spec/spec_helper.rb
|
195
198
|
- wireframes/edit-page-assets-2.bmml
|
@@ -203,7 +206,7 @@ files:
|
|
203
206
|
homepage: http://radiantcms.org
|
204
207
|
licenses: []
|
205
208
|
|
206
|
-
post_install_message: "\n Add this to your radiant project with:\n config.gem 'radiant-clipped-extension', :version => '~>1.0.
|
209
|
+
post_install_message: "\n Add this to your radiant project with:\n config.gem 'radiant-clipped-extension', :version => '~>1.0.1'\n "
|
207
210
|
rdoc_options: []
|
208
211
|
|
209
212
|
require_paths:
|
@@ -237,12 +240,14 @@ test_files:
|
|
237
240
|
- spec/controllers/admin/assets_controller_spec.rb
|
238
241
|
- spec/controllers/admin/page_attachments_controller_spec.rb
|
239
242
|
- spec/datasets/assets_dataset.rb
|
243
|
+
- spec/fixtures/5k.png
|
240
244
|
- spec/fixtures/test.flv
|
241
245
|
- spec/lib/asset_tags_spec.rb
|
242
246
|
- spec/lib/frame_grab_spec.rb
|
243
247
|
- spec/lib/geometry_transformation_spec.rb
|
244
248
|
- spec/models/asset_spec.rb
|
245
249
|
- spec/models/asset_type_spec.rb
|
250
|
+
- spec/models/post_processing_spec.rb
|
246
251
|
- spec/spec.opts
|
247
252
|
- spec/spec_helper.rb
|
248
253
|
- features/support/env.rb
|