radiant-images-extension 0.1.1 → 0.3.2

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.
data/CHANGELOG ADDED
@@ -0,0 +1,9 @@
1
+ == Change Log
2
+
3
+
4
+ === 0.1.1 (September 16, 2010)
5
+
6
+ * Fixed a bug where passenger wouldn't pickup the ImageMagick install [Dirk Kelly, Mario Visic]
7
+
8
+ === 0.1.0 (September 16, 2010)
9
+ * Initial Release [Dirk Kelly, Mario Visic]
data/README.md CHANGED
@@ -26,6 +26,17 @@ Radiant Images is an IMAGE management tool, meant only to be useful to pages and
26
26
 
27
27
  rake radiant:extensions:images:migrate_from_paperclipped
28
28
 
29
+ ## Installation
30
+
31
+ The recommended way to install the radiant images extension is by installing the gem and configuring it in your radiant app, here are the instructions:
32
+
33
+ gem install radiant-images-extension
34
+ # add the following line to your config/environment.rb: config.gem 'radiant-images-extension', :lib => false
35
+ rake radiant:extensions:images:update
36
+ rake radiant:extensions:images:migrate
37
+
38
+ If you want to run a development copy of images simply clone a copy into radiant's vendor/extensions folder and then run a update/migrate on the extension.
39
+
29
40
  ## Host Alias Settings
30
41
 
31
42
  By default the images extension uses the following url for images:
data/Rakefile CHANGED
@@ -14,6 +14,7 @@ begin
14
14
  gem.add_development_dependency 'rr', '>= 1.0.0'
15
15
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
16
  end
17
+ Jeweler::GemcutterTasks.new
17
18
  rescue LoadError
18
19
  puts "Jeweler (or a dependency) not available. This is only required if you plan to package images as a gem."
19
20
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.3.2
@@ -2,13 +2,7 @@ class Admin::ImagesController < Admin::ResourceController
2
2
 
3
3
  before_filter :index_assets, :only => [ :index ]
4
4
  before_filter :edit_assets, :only => [ :show, :edit ]
5
- around_filter :rescue_exceptions, :only => [:create, :edit, :destroy]
6
-
7
- # GET /admin/images
8
- # GET /admin/images.js
9
- # GET /admin/images.xml
10
- # GET /admin/images.json AJAX and HTML
11
- #----------------------------------------------------------------------------
5
+ around_filter :rescue_s3_exceptions, :only => [:create, :edit, :destroy]
12
6
 
13
7
  def index
14
8
  @images = Image.paginate :page => params[:page], :per_page => 20
@@ -38,7 +32,7 @@ private
38
32
  include_stylesheet 'admin/extensions/images/edit'
39
33
  end
40
34
 
41
- def rescue_exceptions
35
+ def rescue_s3_exceptions
42
36
  begin
43
37
  yield
44
38
  rescue AWS::S3::ResponseError => e
data/app/models/image.rb CHANGED
@@ -9,7 +9,7 @@ class Image < ActiveRecord::Base
9
9
 
10
10
  default_scope :order => 'position ASC'
11
11
  acts_as_list
12
-
12
+
13
13
  has_attached_file :asset,
14
14
  :styles => lambda { Image.config_styles },
15
15
  :whiny_thumbnails => false,
@@ -25,13 +25,16 @@ class Image < ActiveRecord::Base
25
25
 
26
26
  validates_attachment_presence :asset
27
27
  validates_attachment_content_type :asset, :content_type => ['image/jpeg', 'image/png', 'image/gif']
28
-
28
+
29
29
  def assign_title
30
30
  self.title = self.asset_file_name if title.blank?
31
31
  end
32
-
33
32
 
34
- # We need to ovveried the url method for our attachment so
33
+ def url(style = :original, include_updated_timestamp = true, secure = false)
34
+ self.asset.url(style, include_updated_timestamp, secure)
35
+ end
36
+
37
+ # We need to overide the url method for our attachment so
35
38
  # we can dynamically swap between aliased and non aliased domain names
36
39
  module ::Paperclip
37
40
  class Attachment
@@ -58,7 +61,7 @@ class Image < ActiveRecord::Base
58
61
  end
59
62
 
60
63
  private
61
-
64
+
62
65
  class << self
63
66
  def search(search, page)
64
67
  unless search.blank?
@@ -66,7 +69,7 @@ private
66
69
  queries << 'LOWER(title) LIKE (:term)'
67
70
  queries << 'LOWER(caption) LIKE (:term)'
68
71
  queries << 'LOWER(asset_file_name) LIKE (:term)'
69
-
72
+
70
73
  sql = queries.join(' OR ')
71
74
  @conditions = [sql, {:term => "%#{search.downcase}%" }]
72
75
  else
@@ -79,7 +82,7 @@ private
79
82
 
80
83
  def config_styles
81
84
  styles = []
82
-
85
+
83
86
  if Radiant::Config['images.styles']
84
87
  styles = Radiant::Config['images.styles'].gsub(/\s+/,'').split(',')
85
88
  styles = styles.collect{|s| s.split('=')}.inject({}) {|ha, (k, v)| ha[k.to_sym] = v; ha}
@@ -7,7 +7,7 @@
7
7
  %li
8
8
  - form_tag nil, :method => 'get' do
9
9
  = text_field_tag 'search', params[:search], :type => 'search'
10
- = observe_field 'search', :frequency => 2, :update => 'images', :url => { :controller => 'images', :action=> 'search' }, :method => 'get', :with => "'search=' + escape(value)"
10
+ = observe_field 'search', :frequency => 2, :update => 'images', :url => { :controller => 'images', :action=> 'index' }, :method => 'get', :with => "'search=' + escape(value)"
11
11
  - render_region :paginate do |paginate|
12
12
  - paginate.pagination do
13
- = will_paginate(@images)
13
+ = pagination_for(@images)
@@ -2,9 +2,9 @@
2
2
  = t('remove_image')
3
3
 
4
4
  %p
5
- = t('text.remove_image.warning')
5
+ = t('remove_image_warning')
6
6
 
7
- - form_for [:admin, @image.becomes(Image)], :html => {:method => :delete, 'data-onsubmit_status'=>"Removing Image&#8230;"} do
7
+ - form_for [:admin, @image.becomes(Image)], :html => {:method => :delete, 'data-onsubmit_status'=>"#{t('deleting_image')}&#8230;"} do
8
8
 
9
9
  %p.buttons
10
10
  %input.button{:type=>"submit", :value => t('delete_image') }/
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  en:
3
3
  images: Images
4
- new_image: 'New Image'
5
- remove_image: 'Remove Image'
6
- delete_image: 'Delete Image'
7
- text.remove_image.warning: 'Are you sure you want to permanently remove the following Images?'
8
-
4
+ new_image: New Image
5
+ remove_image: Remove Image
6
+ remove_image_warning: Are you sure you want to delete this image as well as its ties to any other parts of the site?
7
+ delete_image: Delete Image
8
+ deleting_image: Deleting Image
@@ -0,0 +1,15 @@
1
+ class ChangeImagesToCreatedById < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :images, :created_by_id, :integer
4
+ add_column :images, :updated_by_id, :integer
5
+ remove_column :images, :created_by
6
+ remove_column :images, :updated_by
7
+ end
8
+
9
+ def self.down
10
+ add_column :images, :created_by_id, :integer
11
+ add_column :images, :updated_by_id, :integer
12
+ remove_column :images, :created_by
13
+ remove_column :images, :updated_by
14
+ end
15
+ end
data/images_extension.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  # Uncomment this if you reference any of your controllers in activate
2
2
  # require_dependency 'application_controller'
3
3
 
4
+ require 'paperclip'
5
+
4
6
  class ImagesExtension < Radiant::Extension
5
7
  version "0.1"
6
8
  description "Images stores images on s3"
@@ -32,7 +34,7 @@ class ImagesExtension < Radiant::Extension
32
34
  end
33
35
 
34
36
 
35
- Page.send :include, Images::Tags::Image
37
+ Page.send :include, Images::Tags::Core
36
38
 
37
39
  UserActionObserver.instance.send :add_observer!, Image
38
40
 
@@ -0,0 +1,295 @@
1
+ module Images
2
+ module Tags
3
+ module Core
4
+ include Radiant::Taggable
5
+
6
+ class TagError < StandardError; end
7
+
8
+ desc %{
9
+ The namespace for referencing images. You may specify the title
10
+ attribute for this tag to use only images with the specified title.
11
+
12
+ *Usage:*
13
+ <pre><code><r:images>...</r:images></code></pre>
14
+ }
15
+ tag 'images' do |tag|
16
+ tag.locals.images = Helpers.current_images(tag)
17
+
18
+ tag.expand
19
+ end
20
+
21
+ desc %{
22
+ Expands if images exist
23
+ }
24
+ tag 'images:if_images' do |tag|
25
+ tag.expand if tag.locals.images.present?
26
+ end
27
+
28
+ desc %{
29
+ Expands unless images exist
30
+ }
31
+ tag 'images:unless_images' do |tag|
32
+ tag.expand unless tag.locals.images.present?
33
+ end
34
+
35
+ desc %{
36
+ Goes through each of the available images.
37
+ Use the limit and offset attributes to render a specific number of images.
38
+ Use the by and order attributes to control the order of images.
39
+
40
+ *Usage:*
41
+ <pre><code><r:images:each [limit=0] [offset=0] [order="asc|desc"] [by="position|title|..."]>...</r:images:each></code></pre>
42
+ }
43
+ tag 'images:each' do |tag|
44
+ context = ''
45
+
46
+ tag.locals.images.each do |image|
47
+ tag.locals.image = image
48
+ context << tag.expand
49
+ end
50
+
51
+ content
52
+ end
53
+
54
+ desc %{
55
+ Expands the current image context
56
+
57
+ *Usage:*
58
+ <pre><code><r:image>...</r:image></code></pre>
59
+ }
60
+ tag 'image' do |tag|
61
+ tag.locals.image = Helpers.current_image(tag)
62
+
63
+ tag.expand if tag.locals.image.present?
64
+ end
65
+
66
+ desc %{
67
+ Outputs the full URL of the image including the filename. Specify the style
68
+ using the style option.
69
+
70
+ *Usage:*
71
+ <pre><code><r:image title='image'><r:url [style="preview|original"] /></r:image></code></pre>
72
+ }
73
+ tag 'image:url' do |tag|
74
+ style = tag.attr['style'] || :original
75
+
76
+ tag.locals.image.url(style, false)
77
+ end
78
+
79
+ [:id, :title].each do |method|
80
+ desc %{
81
+ Outputs the title of the current image
82
+
83
+ *Usage:*
84
+ <pre><code><r:image title='image'><r:#{method} /></code></pre>
85
+ }
86
+ tag "image:#{method}" do |tag|
87
+ tag.locals.image.send(method)
88
+ end
89
+ end
90
+
91
+ end
92
+ end
93
+ end
94
+
95
+
96
+
97
+ # describe '<r:images:each>' do
98
+ #
99
+ # it 'should expand on all images' do
100
+ # content = '<r:images:each>test!</r:images:each>'
101
+ # expected = ''
102
+ # @images.length.times { expected += 'test!' }
103
+ # pages(:home).should render(content).as(expected)
104
+ # end
105
+ #
106
+ # it 'should be running through the image objects' do
107
+ # content = '<r:images:each><r:images:url/></r:images:each>'
108
+ # expected = ''
109
+ # @images.each { |image| expected += image.asset.url }
110
+ # pages(:home).should render(content).as(expected)
111
+ # end
112
+ #
113
+ # it 'should only run through however many images we specify with limit' do
114
+ # content = '<r:images:each limit="2"><r:images:url/></r:images:each>'
115
+ # expected = ''
116
+ # @images[0..1].each { |image| expected += image.asset.url }
117
+ # pages(:home).should render(content).as(expected)
118
+ # end
119
+ #
120
+ # it 'should start at the image number we give it using offset' do
121
+ # content = '<r:images:each limit="2" offset="1"><r:images:url/></r:images:each>'
122
+ # expected = ''
123
+ # @images[1..2].each { |image| expected += image.asset.url }
124
+ # pages(:home).should render(content).as(expected)
125
+ # end
126
+ #
127
+ # it 'should display images in the order we give' do
128
+ # # asc
129
+ # content = '<r:images:each order="asc" by="position"><r:images:url/></r:images:each>'
130
+ # expected = ''
131
+ # @images.each { |image| expected += image.asset.url }
132
+ # pages(:home).should render(content).as(expected)
133
+ #
134
+ # #desc
135
+ # content = '<r:images:each order="desc" by="position"><r:images:url/></r:images:each>'
136
+ # expected = ''
137
+ # @images.reverse.each { |image| expected += image.asset.url }
138
+ # pages(:home).should render(content).as(expected)
139
+ # end
140
+ #
141
+ # it 'should allow us to order images by title' do
142
+ # content = '<r:images:each order="asc" by="title"><r:images:url/></r:images:each>'
143
+ # expected = ''
144
+ # @images.sort! { |a,b| a.title <=> b.title }
145
+ # @images.each { |image| expected += image.asset.url }
146
+ # pages(:home).should render(content).as(expected)
147
+ # end
148
+ #
149
+ # end
150
+ #
151
+ # describe '<r:images:first>' do
152
+ #
153
+ # it 'should render the first image' do
154
+ # content = '<r:images:first><r:images:url/></r:images:first>'
155
+ # expected = @images.first.asset.url
156
+ # pages(:home).should render(content).as(expected)
157
+ # end
158
+ #
159
+ # end
160
+ #
161
+ # describe '<r:images:if_first>' do
162
+ #
163
+ # it 'should expand the tag if the image is the first' do
164
+ # content = '<r:images><r:each><r:if_first><r:url /></r:if_first></r:each></r:images>'
165
+ # expected = @images.first.asset.url
166
+ # pages(:home).should render(content).as(expected)
167
+ # end
168
+ #
169
+ # end
170
+ #
171
+ # describe '<r:images:unless_first>' do
172
+ #
173
+ # it 'should expand the tag if the image is not the first' do
174
+ # content = '<r:images><r:each><r:unless_first><r:url /></r:unless_first></r:each></r:images>'
175
+ # expected = ''
176
+ #
177
+ # @images.each do |image|
178
+ # expected += image.asset.url unless image == @images.first
179
+ # end
180
+ #
181
+ # pages(:home).should render(content).as(expected)
182
+ # end
183
+ #
184
+ # end
185
+ #
186
+ # describe '<r:if_images>' do
187
+ #
188
+ # it 'should expand the contents if there are images' do
189
+ # content = '<r:images:if_images>test text</r:images:if_images>'
190
+ # expected = 'test text'
191
+ # pages(:home).should render(content).as(expected)
192
+ # end
193
+ #
194
+ # it 'should not expand the contents if there are no images' do
195
+ # Image.delete_all
196
+ # content = '<r:images:if_images>test text</r:images:if_images>'
197
+ # expected = ''
198
+ # pages(:home).should render(content).as(expected)
199
+ # end
200
+ #
201
+ # it 'should expand if the min count is equal to the image count' do
202
+ # min_count = Image.count
203
+ # content = '<r:images:if_images min_count="' + min_count.to_s + '">test text</r:images:if_images>'
204
+ # expected = 'test text'
205
+ # pages(:home).should render(content).as(expected)
206
+ # end
207
+ #
208
+ # it 'should not expand if the min count is greater than the image count' do
209
+ # min_count = Image.count + 1
210
+ # content = '<r:images:if_images min_count="' + min_count.to_s + '">test text</r:images:if_images>'
211
+ # expected = ''
212
+ # pages(:home).should render(content).as(expected)
213
+ # end
214
+ #
215
+ # end
216
+ #
217
+ # describe '<r:unless_images>' do
218
+ #
219
+ # it 'should not the contents if there are images' do
220
+ # content = '<r:images:unless_images>test text</r:images:unless_images>'
221
+ # expected = ''
222
+ # pages(:home).should render(content).as(expected)
223
+ # end
224
+ #
225
+ # it 'should expand the contents if there are no images' do
226
+ # Image.delete_all
227
+ # content = '<r:images:unless_images>test text</r:images:unless_images>'
228
+ # expected = 'test text'
229
+ # pages(:home).should render(content).as(expected)
230
+ # end
231
+ #
232
+ # it 'should not expand if the min count is equal to the image count' do
233
+ # min_count = Image.count
234
+ # content = '<r:images:unless_images min_count="' + min_count.to_s + '">test text</r:images:unless_images>'
235
+ # expected = ''
236
+ # pages(:home).should render(content).as(expected)
237
+ # end
238
+ #
239
+ # it 'should expand if the min count is greater than the image count' do
240
+ # min_count = Image.count + 1
241
+ # content = '<r:images:unless_images min_count="' + min_count.to_s + '">test text</r:images:unless_images>'
242
+ # expected = 'test text'
243
+ # pages(:home).should render(content).as(expected)
244
+ # end
245
+ #
246
+ # end
247
+ #
248
+ # describe '<r:images:url/>' do
249
+ #
250
+ # it 'should output the url for a valid image' do
251
+ # content = '<r:images title="' + @images.first.title + '"><r:images:url/></r:images>'
252
+ # expected = @images.first.asset.url
253
+ # pages(:home).should render(content).as(expected)
254
+ # end
255
+ #
256
+ # end
257
+ #
258
+ # describe '<r:images:title/>' do
259
+ #
260
+ # it 'should output the title for a valid image' do
261
+ # content = '<r:images title="' + @images.first.title + '"><r:images:title/></r:images>'
262
+ # expected = @images.first.title
263
+ # pages(:home).should render(content).as(expected)
264
+ # end
265
+ #
266
+ # end
267
+ #
268
+ # describe '<r:images:tag/>' do
269
+ #
270
+ # it 'should output a valid image tag when given a valid image' do
271
+ # content = '<r:images title="' + @images.first.title + '"><r:images:tag /></r:images>'
272
+ # expected = '<img src="' + @images.first.asset.url + '" alt="' + @images.first.title + '" />'
273
+ # pages(:home).should render(content).as(expected)
274
+ # end
275
+ #
276
+ # it 'should output a valid image tag when specifying an image by title' do
277
+ # content = '<r:images:tag title="' + @images.first.title + '" />'
278
+ # expected = '<img src="' + @images.first.asset.url + '" alt="' + @images.first.title + '" />'
279
+ # pages(:home).should render(content).as(expected)
280
+ # end
281
+ #
282
+ # it 'should output an image tag with the specified size' do
283
+ # content = '<r:images:tag title="' + @images.first.title + '" size="icon" />'
284
+ # expected = '<img src="' + @images.first.asset.url(:icon) + '" alt="' + @images.first.title + '" />'
285
+ # pages(:home).should render(content).as(expected)
286
+ # end
287
+ #
288
+ # it 'should use the given alt text specified' do
289
+ # content = '<r:images:tag title="' + @images.first.title + '" alt="new alt text" />'
290
+ # expected = '<img src="' + @images.first.asset.url + '" alt="new alt text" />'
291
+ # pages(:home).should render(content).as(expected)
292
+ # end
293
+ #
294
+ # end
295
+ #