radiant-images-extension 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/app/models/image.rb +2 -0
- data/images_extension.rb +1 -1
- data/lib/images/tags/core.rb +15 -28
- data/lib/images/tags/helpers.rb +48 -35
- data/radiant-images-extension.gemspec +2 -2
- data/spec/lib/images/tags/core_spec.rb +23 -53
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
data/app/models/image.rb
CHANGED
@@ -3,6 +3,8 @@ class Image < ActiveRecord::Base
|
|
3
3
|
belongs_to :created_by, :class_name => 'User'
|
4
4
|
belongs_to :updated_by, :class_name => 'User'
|
5
5
|
|
6
|
+
has_many :attachments, :dependent => :destroy
|
7
|
+
|
6
8
|
before_save :assign_title
|
7
9
|
validates_uniqueness_of :asset_file_name, :message => 'This file already exists', :allow_nil => true
|
8
10
|
validates_uniqueness_of :title
|
data/images_extension.rb
CHANGED
@@ -5,7 +5,7 @@ require 'will_paginate'
|
|
5
5
|
|
6
6
|
class ImagesExtension < Radiant::Extension
|
7
7
|
version YAML::load_file(File.join(File.dirname(__FILE__), 'VERSION'))
|
8
|
-
description "
|
8
|
+
description "Image management tool, meant only to be useful to pages and extensions that require images."
|
9
9
|
url "http://github.com/squaretalent/radiant-images-extension"
|
10
10
|
|
11
11
|
extension_config do |config|
|
data/lib/images/tags/core.rb
CHANGED
@@ -40,12 +40,10 @@ module Images
|
|
40
40
|
<pre><code><r:images:each [limit=0] [offset=0] [order="asc|desc"] [by="position|title|..."]>...</r:images:each></code></pre>
|
41
41
|
}
|
42
42
|
tag 'images:each' do |tag|
|
43
|
-
|
44
|
-
Helpers.all_images_with_options(tag).each do |image|
|
43
|
+
content = tag.locals.images.map { |image|
|
45
44
|
tag.locals.image = image
|
46
|
-
|
47
|
-
|
48
|
-
context
|
45
|
+
tag.expand
|
46
|
+
}
|
49
47
|
end
|
50
48
|
|
51
49
|
desc %{
|
@@ -57,7 +55,8 @@ module Images
|
|
57
55
|
}
|
58
56
|
tag 'image' do |tag|
|
59
57
|
tag.locals.image = Helpers.current_image(tag)
|
60
|
-
|
58
|
+
|
59
|
+
tag.expand if tag.locals.image.present?
|
61
60
|
end
|
62
61
|
|
63
62
|
desc %{
|
@@ -68,12 +67,8 @@ module Images
|
|
68
67
|
<pre><code><r:image title='image'><r:url [style="preview|original"] /></r:image></code></pre>
|
69
68
|
}
|
70
69
|
tag 'image:url' do |tag|
|
71
|
-
|
72
|
-
|
73
|
-
style = tag.attr['style'] || Radiant::Config['images.default'].to_sym
|
74
|
-
result = tag.locals.image.url(style, false)
|
75
|
-
end
|
76
|
-
result
|
70
|
+
style = tag.attr['style'] || Radiant::Config['images.default']
|
71
|
+
Helpers.current_image(tag).url(style.to_sym, false)
|
77
72
|
end
|
78
73
|
|
79
74
|
desc %{
|
@@ -81,30 +76,22 @@ module Images
|
|
81
76
|
The style of the image can be specified by passing the style attribute.
|
82
77
|
|
83
78
|
*Usage:*
|
84
|
-
<pre><code><r:image title='image'><r:tag [style="
|
79
|
+
<pre><code><r:image title='image' style='preview'><r:tag [style="original"] /></r:image></code></pre>
|
85
80
|
}
|
86
81
|
tag 'image:tag' do |tag|
|
87
|
-
|
88
|
-
|
89
|
-
style = tag.attr['style'] || Radiant::Config['images.default'].to_sym
|
90
|
-
result = %{<img src="#{tag.locals.image.url(style, false)}" />}
|
91
|
-
end
|
92
|
-
result
|
82
|
+
style = tag.attr['style'] || Radiant::Config['images.default']
|
83
|
+
%{<img src="#{Helpers.current_image(tag).url(style.to_sym, false)}" />}
|
93
84
|
end
|
94
85
|
|
95
|
-
[:id, :title, :position].each do |
|
86
|
+
[:id, :title, :position].each do |symbol|
|
96
87
|
desc %{
|
97
|
-
Outputs the #{
|
88
|
+
Outputs the #{symbol} of the current image
|
98
89
|
|
99
90
|
*Usage:*
|
100
|
-
<pre><code><r:image title='image'><r:#{
|
91
|
+
<pre><code><r:image title='image'><r:#{symbol} /></code></pre>
|
101
92
|
}
|
102
|
-
tag "image:#{
|
103
|
-
|
104
|
-
if tag.locals.image ||= Helpers.current_image(tag)
|
105
|
-
result = tag.locals.image.send(method)
|
106
|
-
end
|
107
|
-
result
|
93
|
+
tag "image:#{symbol}" do |tag|
|
94
|
+
Helpers.current_image(tag).send(symbol)
|
108
95
|
end
|
109
96
|
end
|
110
97
|
|
data/lib/images/tags/helpers.rb
CHANGED
@@ -1,64 +1,77 @@
|
|
1
1
|
module Images
|
2
2
|
module Tags
|
3
3
|
class Helpers
|
4
|
-
|
4
|
+
|
5
|
+
CONDITIONS = ['images.position','images.title','images.id']
|
6
|
+
|
5
7
|
class TagError < StandardError; end
|
6
8
|
|
7
9
|
class << self
|
8
10
|
|
9
|
-
def all_images_with_options(tag)
|
10
|
-
Image.all image_options(tag)
|
11
|
-
end
|
12
|
-
|
13
11
|
def current_images(tag)
|
14
|
-
|
12
|
+
@conditions = CONDITIONS.dup
|
15
13
|
|
16
|
-
if tag.locals.images.
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
14
|
+
if tag.locals.images.nil?
|
15
|
+
return Image.all image_conditions(tag).merge(image_options(tag))
|
16
|
+
end
|
17
|
+
|
18
|
+
if tag.locals.images.empty?
|
19
|
+
return tag.locals.images
|
20
|
+
end
|
21
|
+
|
22
|
+
images = tag.locals.images
|
23
|
+
if images.first.is_a?(Image)
|
24
|
+
images.all image_conditions(tag).merge(image_options(tag))
|
25
|
+
else
|
26
|
+
# We're looking based on attachment positions, not image positions
|
27
|
+
@conditions.map! { |term| term.gsub('images.position','attachments.position') }
|
28
|
+
images.all image_conditions(tag).merge(image_options(tag)).merge(:joins => 'JOIN images ON images.id = attachments.image_id')
|
22
29
|
end
|
23
|
-
|
24
|
-
result
|
25
30
|
end
|
26
31
|
|
27
32
|
def current_image(tag)
|
28
|
-
|
33
|
+
@conditions = CONDITIONS.dup
|
29
34
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
result = Image.find(tag.attr['id'])
|
34
|
-
elsif tag.attr['title']
|
35
|
-
result = Image.find_by_title(tag.attr['title'])
|
36
|
-
elsif tag.attr['position']
|
37
|
-
begin
|
38
|
-
result = tag.locals.images[(tag.attr['position']-1).to_i]
|
39
|
-
rescue
|
40
|
-
result = Image.find_by_position(tag.attr['position'].to_i)
|
41
|
-
end
|
35
|
+
# Images exist, and we're not looking to change the scope
|
36
|
+
if tag.locals.image.present? and image_conditions(tag).empty?
|
37
|
+
return tag.locals.image
|
42
38
|
end
|
43
39
|
|
44
|
-
|
40
|
+
unless tag.locals.images.nil?
|
41
|
+
images = tag.locals.images
|
42
|
+
if images.first.is_a?(Image)
|
43
|
+
query = Image.all image_conditions(tag).merge(image_options(tag))
|
44
|
+
else
|
45
|
+
@conditions.map! { |term| term.gsub('images.position','attachments.position') }
|
46
|
+
query = Attachment.all image_conditions(tag).merge(image_options(tag)).merge(:joins => 'JOIN images ON images.id = attachments.image_id')
|
47
|
+
query = query.map { |a| a.image }
|
48
|
+
end
|
49
|
+
return (query && images).first
|
50
|
+
else
|
51
|
+
return Image.first image_conditions(tag).merge(image_options(tag))
|
52
|
+
end
|
45
53
|
end
|
46
54
|
|
55
|
+
private
|
56
|
+
|
47
57
|
def image_options(tag)
|
48
58
|
attr = tag.attr.symbolize_keys
|
49
|
-
by = attr[:by] || 'position'
|
50
|
-
order = attr[:order] || 'asc'
|
51
59
|
|
52
60
|
options = {
|
53
|
-
:order
|
54
|
-
:limit
|
61
|
+
:order => "#{attr[:by] || 'position'} #{attr[:order] || 'asc'}",
|
62
|
+
:limit => attr[:limit] || nil,
|
55
63
|
:offset => attr[:offset] || nil
|
56
64
|
}
|
57
65
|
end
|
58
66
|
|
59
|
-
def
|
60
|
-
|
61
|
-
|
67
|
+
def image_conditions(tag)
|
68
|
+
attr = tag.attr.symbolize_keys
|
69
|
+
|
70
|
+
@conditions.reject! { |term| attr[term.split('.').last.to_sym].nil? }
|
71
|
+
|
72
|
+
query = @conditions.map { |term| %{#{term} = ?} }.join(' AND ')
|
73
|
+
values = @conditions.map { |term| %{#{attr[term.split('.').last.to_sym]}} }
|
74
|
+
query.blank? ? {} : { :conditions => [query,*values] }
|
62
75
|
end
|
63
76
|
|
64
77
|
end
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{radiant-images-extension}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.6.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Dirk Kelly", "Mario Visic"]
|
12
|
-
s.date = %q{2010-12-
|
12
|
+
s.date = %q{2010-12-13}
|
13
13
|
s.description = %q{Image Radiant Extension management tool, meant only to be useful to pages and extensions that need to require images.}
|
14
14
|
s.email = %q{info@squaretalent.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -5,8 +5,6 @@ describe Images::Tags::Core do
|
|
5
5
|
dataset :pages, :images
|
6
6
|
|
7
7
|
before(:all) do
|
8
|
-
@images = [ images(:first), images(:second), images(:third),
|
9
|
-
images(:fourth), images(:fifth), images(:sixth) ]
|
10
8
|
Radiant::Config['images.default'] = "original"
|
11
9
|
Radiant::Config['images.path'] = ":rails_root/public/:class/:basename-:style.:extension"
|
12
10
|
Radiant::Config['images.storage'] = "local"
|
@@ -42,7 +40,7 @@ describe Images::Tags::Core do
|
|
42
40
|
end
|
43
41
|
|
44
42
|
it 'should not render its contents when there are no images' do
|
45
|
-
mock(
|
43
|
+
mock(Images::Tags::Helpers).current_images(anything) { [] }
|
46
44
|
input = '<r:images><r:if_images>failure</r:if_images></r:images>'
|
47
45
|
expected = ''
|
48
46
|
pages(:home).should render(input).as(expected)
|
@@ -53,7 +51,7 @@ describe Images::Tags::Core do
|
|
53
51
|
describe '<r:images:unless_images>' do
|
54
52
|
|
55
53
|
it 'should render its contents when there are no images' do
|
56
|
-
mock(
|
54
|
+
mock(Images::Tags::Helpers).current_images(anything) { [] }
|
57
55
|
input = '<r:images><r:unless_images>success</r:unless_images></r:images>'
|
58
56
|
expected = 'success'
|
59
57
|
pages(:home).should render(input).as(expected)
|
@@ -76,39 +74,38 @@ describe Images::Tags::Core do
|
|
76
74
|
end
|
77
75
|
|
78
76
|
it 'should not expand its contents if there are no images available' do
|
79
|
-
mock(
|
80
|
-
mock(Image).all(anything) { [] }
|
77
|
+
mock(Images::Tags::Helpers).current_images(anything) { [] }
|
81
78
|
input = '<r:images:each>test </r:images:each>'
|
82
79
|
expected = ''
|
83
80
|
pages(:home).should render(input).as(expected)
|
84
81
|
end
|
85
82
|
|
86
83
|
it 'should limit the number of images based on the limit parameter passed' do
|
87
|
-
input = '<r:images
|
84
|
+
input = '<r:images limit="3"><r:each><r:image:title /> </r:each></r:images>'
|
88
85
|
expected = 'first second third '
|
89
86
|
pages(:home).should render(input).as(expected)
|
90
87
|
end
|
91
88
|
|
92
89
|
it 'should use the offset parameter to ignore results before the offset' do
|
93
|
-
input = '<r:images
|
90
|
+
input = '<r:images limit="3" offset="2"><r:each><r:image:title /> </r:each></r:images>'
|
94
91
|
expected = 'third fourth fifth '
|
95
92
|
pages(:home).should render(input).as(expected)
|
96
93
|
end
|
97
94
|
|
98
95
|
it 'should order the results based by the key passed' do
|
99
|
-
input = '<r:images
|
96
|
+
input = '<r:images by="title"><r:each><r:image:title /> </r:each></r:images>'
|
100
97
|
expected = 'fifth first fourth second sixth third '
|
101
98
|
pages(:home).should render(input).as(expected)
|
102
99
|
end
|
103
100
|
|
104
101
|
it 'should order the results by ascending order when asc is passed for the order' do
|
105
|
-
input = '<r:images
|
102
|
+
input = '<r:images by="position" order="asc"><r:each><r:image:title /> </r:each></r:images>'
|
106
103
|
expected = 'first second third fourth fifth sixth '
|
107
104
|
pages(:home).should render(input).as(expected)
|
108
105
|
end
|
109
106
|
|
110
107
|
it 'should order the results by descending order when desc is passed for the order' do
|
111
|
-
input = '<r:images
|
108
|
+
input = '<r:images by="position" order="desc"><r:each><r:image:title /> </r:each></r:images>'
|
112
109
|
expected = 'sixth fifth fourth third second first '
|
113
110
|
pages(:home).should render(input).as(expected)
|
114
111
|
end
|
@@ -117,54 +114,34 @@ describe Images::Tags::Core do
|
|
117
114
|
|
118
115
|
describe '<r:image>' do
|
119
116
|
|
120
|
-
it 'should
|
121
|
-
input = '<r:image title="first"><r:title /></r:image>'
|
122
|
-
expected = 'first'
|
123
|
-
pages(:home).should render(input).as(expected)
|
124
|
-
end
|
125
|
-
|
126
|
-
it 'should render its contents if there is a current image' do
|
117
|
+
it 'should render overide the above context' do
|
127
118
|
input = '<r:images:each><r:image title="first"><r:title /> </r:image></r:images:each>'
|
128
|
-
expected = 'first
|
119
|
+
expected = 'first first first first first first '
|
129
120
|
pages(:home).should render(input).as(expected)
|
130
121
|
end
|
131
122
|
|
132
|
-
it 'should
|
133
|
-
input =
|
134
|
-
expected = ''
|
123
|
+
it 'should allow images to be looked up by their title attribute' do
|
124
|
+
input = %{<r:image title="fifth"><r:title /></r:image>}
|
125
|
+
expected = 'fifth'
|
135
126
|
pages(:home).should render(input).as(expected)
|
136
127
|
end
|
137
128
|
|
138
129
|
it 'should allow images to be looked up by their id attribute' do
|
139
|
-
|
140
|
-
|
141
|
-
expected = 'fifth'
|
130
|
+
input = %{<r:image id="#{images(:second).id}"><r:title /></r:image>}
|
131
|
+
expected = 'second'
|
142
132
|
pages(:home).should render(input).as(expected)
|
143
133
|
end
|
144
134
|
|
145
135
|
it 'should allow images to be looked up by their position attribute' do
|
146
|
-
input =
|
136
|
+
input = %{<r:image:title position="3" />}
|
147
137
|
expected = 'third'
|
148
138
|
pages(:home).should render(input).as(expected)
|
149
139
|
end
|
150
|
-
|
151
|
-
it 'should allow images to be looked up by their title attribute' do
|
152
|
-
input = '<r:image title="sixth"><r:title /></r:image>'
|
153
|
-
expected = 'sixth'
|
154
|
-
pages(:home).should render(input).as(expected)
|
155
|
-
end
|
156
|
-
|
140
|
+
|
157
141
|
end
|
158
142
|
|
159
143
|
describe '<r:image:url>' do
|
160
144
|
|
161
|
-
before :each do
|
162
|
-
asset = Paperclip::Attachment.new('asset', @images[0], { :url => Radiant::Config['images.url'] })
|
163
|
-
stub(Image).find_by_title('first') { @images[0] }
|
164
|
-
stub.proxy(Image).find_by_title('invalid')
|
165
|
-
stub(@images[0]).asset { asset }
|
166
|
-
end
|
167
|
-
|
168
145
|
it 'should not render a valid url if there is no current image' do
|
169
146
|
input = '<r:image title="invalid"><r:url /></r:image>'
|
170
147
|
expected = ''
|
@@ -172,8 +149,8 @@ describe Images::Tags::Core do
|
|
172
149
|
end
|
173
150
|
|
174
151
|
it 'should render the url with the default style if not specified' do
|
175
|
-
input = '<r:image title="
|
176
|
-
expected = '/images/
|
152
|
+
input = '<r:image title="fourth"><r:url /></r:image>'
|
153
|
+
expected = '/images/fourth-original.png'
|
177
154
|
pages(:home).should render(input).as(expected)
|
178
155
|
end
|
179
156
|
|
@@ -187,13 +164,6 @@ describe Images::Tags::Core do
|
|
187
164
|
|
188
165
|
describe '<r:image:tag>' do
|
189
166
|
|
190
|
-
before :each do
|
191
|
-
asset = Paperclip::Attachment.new('asset', @images[0], { :url => Radiant::Config['images.url'] })
|
192
|
-
stub(Image).find_by_title('first') { @images[0] }
|
193
|
-
stub.proxy(Image).find_by_title('invalid')
|
194
|
-
stub(@images[0]).asset { asset }
|
195
|
-
end
|
196
|
-
|
197
167
|
it 'should not render a valid img tag if there is no current image' do
|
198
168
|
input = '<r:image title="invalid"><r:tag /></r:image>'
|
199
169
|
expected = ''
|
@@ -207,18 +177,18 @@ describe Images::Tags::Core do
|
|
207
177
|
end
|
208
178
|
|
209
179
|
it 'should render the img tag with the style specified by the user' do
|
210
|
-
input = '<r:image title="
|
211
|
-
expected = '<img src="/images/
|
180
|
+
input = '<r:image title="second"><r:tag style="icon"/></r:image>'
|
181
|
+
expected = '<img src="/images/second-icon.png" />'
|
212
182
|
pages(:home).should render(input).as(expected)
|
213
183
|
end
|
214
|
-
|
184
|
+
|
215
185
|
end
|
216
186
|
|
217
187
|
describe '<r:image:id>' do
|
218
188
|
|
219
189
|
it 'should render the id of the current image context' do
|
220
190
|
input = '<r:image title="sixth"><r:id /></r:image>'
|
221
|
-
expected =
|
191
|
+
expected = images(:sixth).id.to_s
|
222
192
|
pages(:home).should render(input).as(expected)
|
223
193
|
end
|
224
194
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: radiant-images-extension
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 7
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 6
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.6.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dirk Kelly
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-12-
|
19
|
+
date: 2010-12-13 00:00:00 +08:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|