radiant-images-extension 0.5.0 → 0.6.0
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/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
|