radiant-images-extension 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/.gitignore +1 -0
  2. data/LICENSE +19 -0
  3. data/README.md +41 -0
  4. data/Rakefile +141 -0
  5. data/VERSION +1 -0
  6. data/app/controllers/admin/images_controller.rb +50 -0
  7. data/app/models/image.rb +91 -0
  8. data/app/views/admin/images/_bottom.haml +13 -0
  9. data/app/views/admin/images/_fields.haml +22 -0
  10. data/app/views/admin/images/_fields_bottom.haml +10 -0
  11. data/app/views/admin/images/_fields_top.haml +7 -0
  12. data/app/views/admin/images/_image.haml +12 -0
  13. data/app/views/admin/images/edit.haml +14 -0
  14. data/app/views/admin/images/index.haml +16 -0
  15. data/app/views/admin/images/new.haml +12 -0
  16. data/app/views/admin/images/remove.haml +12 -0
  17. data/config/locales/en.yml +8 -0
  18. data/config/routes.rb +7 -0
  19. data/cucumber.yml +1 -0
  20. data/db/migrate/20100601042237_create_images.rb +22 -0
  21. data/db/migrate/20100602044124_add_position_to_images.rb +13 -0
  22. data/features/support/env.rb +16 -0
  23. data/features/support/paths.rb +14 -0
  24. data/images_extension.rb +53 -0
  25. data/lib/images/interface/admin/images.rb +37 -0
  26. data/lib/images/tags/image.rb +171 -0
  27. data/lib/tasks/images_extension_tasks.rake +77 -0
  28. data/public/images/extensions/images/missing_icon.png +0 -0
  29. data/public/images/extensions/images/missing_normal.png +0 -0
  30. data/public/images/extensions/images/missing_preview.png +0 -0
  31. data/public/javascripts/admin/extensions/images/edit.js +0 -0
  32. data/public/stylesheets/sass/admin/extensions/images/edit.sass +8 -0
  33. data/public/stylesheets/sass/admin/extensions/images/index.sass +103 -0
  34. data/radiant-images-extension.gemspec +99 -0
  35. data/spec/controllers/admin/images_controller_spec.rb +135 -0
  36. data/spec/datasets/images.rb +15 -0
  37. data/spec/lib/images/tags/image_spec.rb +240 -0
  38. data/spec/models/image_spec.rb +65 -0
  39. data/spec/spec.opts +4 -0
  40. data/spec/spec_helper.rb +22 -0
  41. metadata +191 -0
@@ -0,0 +1,8 @@
1
+ #asset
2
+
3
+ img
4
+ :border 2px solid #ababab
5
+ :display block
6
+ :margin
7
+ :bottom 3px
8
+
@@ -0,0 +1,103 @@
1
+ #images_map
2
+
3
+ #images_headings
4
+ :background
5
+ :color #9e9e9e
6
+ :padding
7
+ :top 2px
8
+ :bottom 2px
9
+
10
+ h2
11
+ :font
12
+ :size 12px
13
+ :weight normal
14
+ :display inline
15
+ :color #ffffff
16
+ :text
17
+ :shadow #666 1px 1px 0px
18
+
19
+ h2.images
20
+ :padding
21
+ :left 9px
22
+
23
+ h2.modify
24
+ :float right
25
+ :width 100px
26
+ :padding
27
+ :right 4px
28
+
29
+
30
+ #images
31
+
32
+ .image
33
+ :border
34
+ :bottom 1px solid #F0F0F0
35
+
36
+ .attributes
37
+ :overflow hidden
38
+ :padding 0
39
+
40
+ &:hover
41
+ :background
42
+ :color #e0f0ff
43
+
44
+ .attribute
45
+ :float left
46
+ :height 40px
47
+ :padding
48
+ :right 4px
49
+ :left 9px
50
+ :line
51
+ :height 40px
52
+
53
+ &.image
54
+ :margin
55
+ :right 5px
56
+
57
+ .icon
58
+ :height 30px
59
+ :width 30px
60
+ :margin
61
+ :top -4px
62
+
63
+ &.title
64
+
65
+ a
66
+ :color #000000
67
+ :font
68
+ :weight bold
69
+ :size 16px
70
+ :text
71
+ :decoration none
72
+
73
+ &:hover
74
+ :color #0066ce
75
+ :text
76
+ :decoration underline
77
+
78
+ &.modify
79
+ :float right
80
+ :width 100px
81
+ :font
82
+ :size 10px
83
+
84
+ a
85
+ :color #000000
86
+ :text
87
+ :decoration none
88
+
89
+ span
90
+ :padding
91
+ :left 15px
92
+ :right 15px
93
+
94
+ .add_child
95
+ :background url(/images/admin/plus.png) no-repeat 0 50%
96
+
97
+ .remove
98
+ :background url(/images/admin/minus.png) no-repeat 0 50%
99
+
100
+ #actions
101
+
102
+ form
103
+ :display inline
@@ -0,0 +1,99 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{radiant-images-extension}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["squaretalent"]
12
+ s.date = %q{2010-09-16}
13
+ s.description = %q{Image Radiant Extension management tool, meant only to be useful to pages and extensions that need to require images.}
14
+ s.email = %q{info@squaretalent.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ "LICENSE",
22
+ "README.md",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "app/controllers/admin/images_controller.rb",
26
+ "app/models/image.rb",
27
+ "app/views/admin/images/_bottom.haml",
28
+ "app/views/admin/images/_fields.haml",
29
+ "app/views/admin/images/_fields_bottom.haml",
30
+ "app/views/admin/images/_fields_top.haml",
31
+ "app/views/admin/images/_image.haml",
32
+ "app/views/admin/images/edit.haml",
33
+ "app/views/admin/images/index.haml",
34
+ "app/views/admin/images/new.haml",
35
+ "app/views/admin/images/remove.haml",
36
+ "config/locales/en.yml",
37
+ "config/routes.rb",
38
+ "cucumber.yml",
39
+ "db/migrate/20100601042237_create_images.rb",
40
+ "db/migrate/20100602044124_add_position_to_images.rb",
41
+ "features/support/env.rb",
42
+ "features/support/paths.rb",
43
+ "images_extension.rb",
44
+ "lib/images/interface/admin/images.rb",
45
+ "lib/images/tags/image.rb",
46
+ "lib/tasks/images_extension_tasks.rake",
47
+ "public/images/extensions/images/missing_icon.png",
48
+ "public/images/extensions/images/missing_normal.png",
49
+ "public/images/extensions/images/missing_preview.png",
50
+ "public/javascripts/admin/extensions/images/edit.js",
51
+ "public/stylesheets/sass/admin/extensions/images/edit.sass",
52
+ "public/stylesheets/sass/admin/extensions/images/index.sass",
53
+ "radiant-images-extension.gemspec",
54
+ "spec/controllers/admin/images_controller_spec.rb",
55
+ "spec/datasets/images.rb",
56
+ "spec/lib/images/tags/image_spec.rb",
57
+ "spec/models/image_spec.rb",
58
+ "spec/spec.opts",
59
+ "spec/spec_helper.rb"
60
+ ]
61
+ s.homepage = %q{http://github.com/squaretalent/radiant-images-extension}
62
+ s.rdoc_options = ["--charset=UTF-8"]
63
+ s.require_paths = ["lib"]
64
+ s.rubygems_version = %q{1.3.7}
65
+ s.summary = %q{Images Extension for Radiant CMS}
66
+ s.test_files = [
67
+ "spec/controllers/admin/images_controller_spec.rb",
68
+ "spec/datasets/images.rb",
69
+ "spec/lib/images/tags/image_spec.rb",
70
+ "spec/models/image_spec.rb",
71
+ "spec/spec_helper.rb"
72
+ ]
73
+
74
+ if s.respond_to? :specification_version then
75
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
76
+ s.specification_version = 3
77
+
78
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
79
+ s.add_runtime_dependency(%q<paperclip>, ["~> 2.3.1.1"])
80
+ s.add_runtime_dependency(%q<aws-s3>, [">= 0.6.2"])
81
+ s.add_runtime_dependency(%q<acts_as_list>, [">= 0.1.2"])
82
+ s.add_development_dependency(%q<rspec>, [">= 1.3.0"])
83
+ s.add_development_dependency(%q<rr>, [">= 1.0.0"])
84
+ else
85
+ s.add_dependency(%q<paperclip>, ["~> 2.3.1.1"])
86
+ s.add_dependency(%q<aws-s3>, [">= 0.6.2"])
87
+ s.add_dependency(%q<acts_as_list>, [">= 0.1.2"])
88
+ s.add_dependency(%q<rspec>, [">= 1.3.0"])
89
+ s.add_dependency(%q<rr>, [">= 1.0.0"])
90
+ end
91
+ else
92
+ s.add_dependency(%q<paperclip>, ["~> 2.3.1.1"])
93
+ s.add_dependency(%q<aws-s3>, [">= 0.6.2"])
94
+ s.add_dependency(%q<acts_as_list>, [">= 0.1.2"])
95
+ s.add_dependency(%q<rspec>, [">= 1.3.0"])
96
+ s.add_dependency(%q<rr>, [">= 1.0.0"])
97
+ end
98
+ end
99
+
@@ -0,0 +1,135 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Admin::ImagesController do
4
+ dataset :users
5
+ dataset :images
6
+
7
+ before :all do
8
+ @image = images(:first)
9
+ @images = Image.all
10
+ end
11
+
12
+
13
+ context 'user not logged in' do
14
+
15
+ it 'should redirect to login path' do
16
+ get :index
17
+ response.should redirect_to login_path
18
+ end
19
+
20
+ end
21
+
22
+ context 'user logged in' do
23
+
24
+ before :each do
25
+ login_as :admin
26
+ stub(AWS::S3::Base).establish_connection!
27
+ end
28
+
29
+ context 'index action' do
30
+
31
+ it 'should render the index template on index action' do
32
+ get :index
33
+ response.should render_template(:index)
34
+ end
35
+
36
+ it 'should have a list of images' do
37
+ get :index
38
+ assigns(:images).should == @images
39
+ end
40
+
41
+ end
42
+
43
+ context 'show action' do
44
+
45
+ it 'should redirect to the edit action' do
46
+ get :show, :id => @image.id
47
+ response.should redirect_to edit_admin_image_url(@image)
48
+ end
49
+
50
+ end
51
+
52
+ context 'edit action' do
53
+
54
+ it 'should render the edit template' do
55
+ get :edit, :id => @image.id
56
+ response.should render_template(:edit)
57
+ end
58
+
59
+ it 'should redirect to the index on invalid image id' do
60
+ get :edit, :id => 999999
61
+ response.should redirect_to admin_images_url
62
+ end
63
+
64
+ end
65
+
66
+ context 'new action' do
67
+
68
+ it 'should render the new template' do
69
+ get :new
70
+ response.should render_template(:new)
71
+ end
72
+
73
+ end
74
+
75
+ context 'update action' do
76
+
77
+ it 'should redirect to the index on valid image' do
78
+ put :update, :id => @image.id
79
+ response.should redirect_to admin_images_url
80
+ end
81
+
82
+ it 'should render the edit template on invalid model' do
83
+ any_instance_of(Image, :valid? => false)
84
+ put :update, :id => @image.id
85
+ response.should render_template(:edit)
86
+ end
87
+
88
+ end
89
+
90
+ context 'create action' do
91
+
92
+ it "create action should render new template when model is invalid" do
93
+ stub.instance_of(Image).valid? {false}
94
+ post :create
95
+ response.should render_template(:new)
96
+ end
97
+
98
+ it "create action should redirect when model is valid" do
99
+ stub.instance_of(Image).valid? {true}
100
+ post :create
101
+ response.should redirect_to admin_images_url
102
+ end
103
+
104
+
105
+ end
106
+
107
+ context 'remove action' do
108
+
109
+ it 'should render the remove template' do
110
+ get :remove, :id => @image.id
111
+ response.should render_template(:remove)
112
+
113
+ end
114
+
115
+ end
116
+
117
+ context 'destroy action' do
118
+
119
+ it 'should redirect to the index' do
120
+ # we need to stop destroy_attached_files running (as it'll error with no S3 details)
121
+ mock(@images[1]).destroy_attached_files
122
+
123
+ @images[1].destroy
124
+ delete :destroy, :id => @images[1].id
125
+ response.should redirect_to admin_images_url
126
+ Image.exists?(@images[1].id).should be_false
127
+ end
128
+
129
+ end
130
+
131
+
132
+ end
133
+
134
+
135
+ end
@@ -0,0 +1,15 @@
1
+ class ImagesDataset < Dataset::Base
2
+ def load
3
+ images = [ :first, :second, :third, :fourth, :fifth ]
4
+
5
+ images.each_with_index do |image, i|
6
+ create_record :image, image.to_sym,
7
+ :title => image.to_s,
8
+ :caption => 'brief description',
9
+ :asset_file_name => "#{image.to_s}.png",
10
+ :asset_content_type => "image/png",
11
+ :asset_file_size => i+1*1000,
12
+ :position => i+1
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,240 @@
1
+ require File.dirname(__FILE__) + '/../../../spec_helper'
2
+
3
+ describe Images::Tags::Image do
4
+ dataset :pages
5
+ dataset :images
6
+
7
+ before(:all) do
8
+ @images = Image.all
9
+ end
10
+
11
+ before(:each) do
12
+ stub(AWS::S3::Base).establish_connection!
13
+ end
14
+
15
+ describe '<r:images>' do
16
+
17
+ it 'should render without errors' do
18
+ content = '<r:images></r:images>'
19
+ pages(:home).should render(content)
20
+ end
21
+
22
+ it 'should allow tags in the images namespace to be used without defining their namespace' do
23
+ content = '<r:images><r:each></r:each></r:images>'
24
+ pages(:home).should render(content)
25
+ end
26
+
27
+ it 'should reference an image given its title' do
28
+ image = @images[2]
29
+ content = '<r:images title="' + image.title + '"><r:images:url /></r:images>'
30
+ pages(:home).should render(content).as(image.asset.url)
31
+ end
32
+
33
+ it 'should raise an exception if an image title is used that does not exist' do
34
+ content = '<r:images title="doesntreallyexist"><r:images:url /></r:images>'
35
+ lambda { pages(:home).render(content) }.should raise_error
36
+ end
37
+
38
+ end
39
+
40
+ describe '<r:images:each>' do
41
+
42
+ it 'should run through all of our images' do
43
+ content = '<r:images:each>test!</r:images:each>'
44
+ expected = ''
45
+ @images.length.times { expected += 'test!' }
46
+ pages(:home).should render(content).as(expected)
47
+ end
48
+
49
+ it 'should be running through the image objects' do
50
+ content = '<r:images:each><r:images:url/></r:images:each>'
51
+ expected = ''
52
+ @images.each { |image| expected += image.asset.url }
53
+ pages(:home).should render(content).as(expected)
54
+ end
55
+
56
+ it 'should only run through however many images we specify with limit' do
57
+ content = '<r:images:each limit="2"><r:images:url/></r:images:each>'
58
+ expected = ''
59
+ @images[0..1].each { |image| expected += image.asset.url }
60
+ pages(:home).should render(content).as(expected)
61
+ end
62
+
63
+ it 'should start at the image number we give it using offset' do
64
+ content = '<r:images:each limit="2" offset="1"><r:images:url/></r:images:each>'
65
+ expected = ''
66
+ @images[1..2].each { |image| expected += image.asset.url }
67
+ pages(:home).should render(content).as(expected)
68
+ end
69
+
70
+ it 'should display images in the order we give' do
71
+ # asc
72
+ content = '<r:images:each order="asc" by="position"><r:images:url/></r:images:each>'
73
+ expected = ''
74
+ @images.each { |image| expected += image.asset.url }
75
+ pages(:home).should render(content).as(expected)
76
+
77
+ #desc
78
+ content = '<r:images:each order="desc" by="position"><r:images:url/></r:images:each>'
79
+ expected = ''
80
+ @images.reverse.each { |image| expected += image.asset.url }
81
+ pages(:home).should render(content).as(expected)
82
+ end
83
+
84
+ it 'should allow us to order images by title' do
85
+ content = '<r:images:each order="asc" by="title"><r:images:url/></r:images:each>'
86
+ expected = ''
87
+ @images.sort! { |a,b| a.title <=> b.title }
88
+ @images.each { |image| expected += image.asset.url }
89
+ pages(:home).should render(content).as(expected)
90
+ end
91
+
92
+ end
93
+
94
+ describe '<r:images:first>' do
95
+
96
+ it 'should render the first image' do
97
+ content = '<r:images:first><r:images:url/></r:images:first>'
98
+ expected = @images.first.asset.url
99
+ pages(:home).should render(content).as(expected)
100
+ end
101
+
102
+ end
103
+
104
+ describe '<r:images:if_first>' do
105
+
106
+ it 'should expand the tag if the image is the first' do
107
+ content = '<r:images><r:each><r:if_first><r:url /></r:if_first></r:each></r:images>'
108
+ expected = @images.first.asset.url
109
+ pages(:home).should render(content).as(expected)
110
+ end
111
+
112
+ end
113
+
114
+ describe '<r:images:unless_first>' do
115
+
116
+ it 'should expand the tag if the image is not the first' do
117
+ content = '<r:images><r:each><r:unless_first><r:url /></r:unless_first></r:each></r:images>'
118
+ expected = ''
119
+
120
+ @images.each do |image|
121
+ expected += image.asset.url unless image == @images.first
122
+ end
123
+
124
+ pages(:home).should render(content).as(expected)
125
+ end
126
+
127
+ end
128
+
129
+ describe '<r:if_images>' do
130
+
131
+ it 'should expand the contents if there are images' do
132
+ content = '<r:images:if_images>test text</r:images:if_images>'
133
+ expected = 'test text'
134
+ pages(:home).should render(content).as(expected)
135
+ end
136
+
137
+ it 'should not expand the contents if there are no images' do
138
+ Image.delete_all
139
+ content = '<r:images:if_images>test text</r:images:if_images>'
140
+ expected = ''
141
+ pages(:home).should render(content).as(expected)
142
+ end
143
+
144
+ it 'should expand if the min count is equal to the image count' do
145
+ min_count = Image.count
146
+ content = '<r:images:if_images min_count="' + min_count.to_s + '">test text</r:images:if_images>'
147
+ expected = 'test text'
148
+ pages(:home).should render(content).as(expected)
149
+ end
150
+
151
+ it 'should not expand if the min count is greater than the image count' do
152
+ min_count = Image.count + 1
153
+ content = '<r:images:if_images min_count="' + min_count.to_s + '">test text</r:images:if_images>'
154
+ expected = ''
155
+ pages(:home).should render(content).as(expected)
156
+ end
157
+
158
+ end
159
+
160
+ describe '<r:unless_images>' do
161
+
162
+ it 'should not the contents if there are images' do
163
+ content = '<r:images:unless_images>test text</r:images:unless_images>'
164
+ expected = ''
165
+ pages(:home).should render(content).as(expected)
166
+ end
167
+
168
+ it 'should expand the contents if there are no images' do
169
+ Image.delete_all
170
+ content = '<r:images:unless_images>test text</r:images:unless_images>'
171
+ expected = 'test text'
172
+ pages(:home).should render(content).as(expected)
173
+ end
174
+
175
+ it 'should not expand if the min count is equal to the image count' do
176
+ min_count = Image.count
177
+ content = '<r:images:unless_images min_count="' + min_count.to_s + '">test text</r:images:unless_images>'
178
+ expected = ''
179
+ pages(:home).should render(content).as(expected)
180
+ end
181
+
182
+ it 'should expand if the min count is greater than the image count' do
183
+ min_count = Image.count + 1
184
+ content = '<r:images:unless_images min_count="' + min_count.to_s + '">test text</r:images:unless_images>'
185
+ expected = 'test text'
186
+ pages(:home).should render(content).as(expected)
187
+ end
188
+
189
+ end
190
+
191
+ describe '<r:images:url/>' do
192
+
193
+ it 'should output the url for a valid image' do
194
+ content = '<r:images title="' + @images.first.title + '"><r:images:url/></r:images>'
195
+ expected = @images.first.asset.url
196
+ pages(:home).should render(content).as(expected)
197
+ end
198
+
199
+ end
200
+
201
+ describe '<r:images:title/>' do
202
+
203
+ it 'should output the title for a valid image' do
204
+ content = '<r:images title="' + @images.first.title + '"><r:images:title/></r:images>'
205
+ expected = @images.first.title
206
+ pages(:home).should render(content).as(expected)
207
+ end
208
+
209
+ end
210
+
211
+ describe '<r:images:tag/>' do
212
+
213
+ it 'should output a valid image tag when given a valid image' do
214
+ content = '<r:images title="' + @images.first.title + '"><r:images:tag /></r:images>'
215
+ expected = '<img src="' + @images.first.asset.url + '" alt="' + @images.first.title + '" />'
216
+ pages(:home).should render(content).as(expected)
217
+ end
218
+
219
+ it 'should output a valid image tag when specifying an image by title' do
220
+ content = '<r:images:tag title="' + @images.first.title + '" />'
221
+ expected = '<img src="' + @images.first.asset.url + '" alt="' + @images.first.title + '" />'
222
+ pages(:home).should render(content).as(expected)
223
+ end
224
+
225
+ it 'should output an image tag with the specified size' do
226
+ content = '<r:images:tag title="' + @images.first.title + '" size="icon" />'
227
+ expected = '<img src="' + @images.first.asset.url(:icon) + '" alt="' + @images.first.title + '" />'
228
+ pages(:home).should render(content).as(expected)
229
+ end
230
+
231
+ it 'should use the given alt text specified' do
232
+ content = '<r:images:tag title="' + @images.first.title + '" alt="new alt text" />'
233
+ expected = '<img src="' + @images.first.asset.url + '" alt="new alt text" />'
234
+ pages(:home).should render(content).as(expected)
235
+ end
236
+
237
+ end
238
+
239
+
240
+ end