swiss_knife 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +9 -0
- data/Gemfile.lock +102 -0
- data/README.rdoc +183 -0
- data/Rakefile +26 -0
- data/lib/swiss_knife/action_controller.rb +43 -0
- data/lib/swiss_knife/assets.rb +81 -0
- data/lib/swiss_knife/dispatcher_js.rb +14 -0
- data/lib/swiss_knife/helpers.rb +178 -0
- data/lib/swiss_knife/i18n_js.rb +14 -0
- data/lib/swiss_knife/jquery.rb +14 -0
- data/lib/swiss_knife/jquery_ujs.rb +14 -0
- data/lib/swiss_knife/jsmin.rb +205 -0
- data/lib/swiss_knife/modernizr.rb +14 -0
- data/lib/swiss_knife/railtie.rb +19 -0
- data/lib/swiss_knife/rake_tasks.rb +31 -0
- data/lib/swiss_knife/rspec/have_tag.rb +115 -0
- data/lib/swiss_knife/rspec.rb +3 -0
- data/lib/swiss_knife/support/remote_file.rb +11 -0
- data/lib/swiss_knife/version.rb +8 -0
- data/lib/swiss_knife.rb +12 -0
- data/spec/controllers/application_controller_spec.rb +52 -0
- data/spec/helpers/helpers_spec.rb +314 -0
- data/spec/resources/assets/javascripts/application.js +1 -0
- data/spec/resources/assets/javascripts/jquery.js +1 -0
- data/spec/resources/assets/javascripts/rails.js +1 -0
- data/spec/resources/assets/stylesheets/main.css +1 -0
- data/spec/resources/assets/stylesheets/reset.css +1 -0
- data/spec/resources/assets/stylesheets/shared.css +1 -0
- data/spec/resources/assets.yml +16 -0
- data/spec/resources/stylesheets/_shared.less +1 -0
- data/spec/resources/stylesheets/main.less +3 -0
- data/spec/resources/stylesheets/reset.css +1 -0
- data/spec/resources/stylesheets/ui/tab.css +1 -0
- data/spec/resources/stylesheets/ui/window.less +1 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/support/app/controllers/application_controller.rb +2 -0
- data/spec/support/config/boot.rb +20 -0
- data/spec/support/config/locales/en.yml +7 -0
- data/spec/support/log/test.log +8 -0
- data/spec/support/rspec/remote_file_shared.rb +21 -0
- data/spec/swiss_knife/assets_spec.rb +73 -0
- data/spec/swiss_knife/dispatcher_js_spec.rb +8 -0
- data/spec/swiss_knife/i18n_js_spec.rb +8 -0
- data/spec/swiss_knife/jquery_spec.rb +8 -0
- data/spec/swiss_knife/jquery_ujs_spec.rb +8 -0
- data/spec/swiss_knife/modernizr_spec.rb +8 -0
- metadata +149 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
require "rails/railtie"
|
2
|
+
|
3
|
+
module SwissKnife
|
4
|
+
class Railtie < Rails::Railtie
|
5
|
+
generators do
|
6
|
+
# require "swiss_knife/generators"
|
7
|
+
end
|
8
|
+
|
9
|
+
rake_tasks do
|
10
|
+
require "swiss_knife/rake_tasks"
|
11
|
+
end
|
12
|
+
|
13
|
+
initializer "swiss_knife.initialize" do |app|
|
14
|
+
ApplicationController.send :include, SwissKnife::ActionController
|
15
|
+
ApplicationController.helper SwissKnife::Helpers
|
16
|
+
ApplicationController.helper_method :page_title
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
namespace :swiss_knife do
|
2
|
+
namespace :javascripts do
|
3
|
+
desc "Update all JavaScripts"
|
4
|
+
task :update => %w[ i18njs jquery jquery_ujs modernizr dispatcher ]
|
5
|
+
|
6
|
+
desc "Update I18n JS"
|
7
|
+
task :i18njs => :environment do
|
8
|
+
SwissKnife::I18nJs.update
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Update jQuery"
|
12
|
+
task :jquery => :environment do
|
13
|
+
SwissKnife::Jquery.update
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Update jQuery UJS"
|
17
|
+
task :jquery_ujs => :environment do
|
18
|
+
SwissKnife::JqueryUjs.update
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Update Modernizr"
|
22
|
+
task :modernizr => :environment do
|
23
|
+
SwissKnife::Modernizr.update
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "Update Dispatcher JS"
|
27
|
+
task :dispatcher => :environment do
|
28
|
+
SwissKnife::DispatcherJs.update
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
module SwissKnife
|
2
|
+
module RSpec
|
3
|
+
module Matchers
|
4
|
+
def have_tag(selector, options = {}, &block)
|
5
|
+
HaveTag.new(:html, selector, options, &block)
|
6
|
+
end
|
7
|
+
|
8
|
+
def have_node(selector, options = {}, &block)
|
9
|
+
HaveTag.new(:xml, selector, options, &block)
|
10
|
+
end
|
11
|
+
|
12
|
+
class HaveTag
|
13
|
+
attr_reader :options, :selector, :actual, :actual_count, :doc, :type
|
14
|
+
|
15
|
+
def initialize(type, selector, options = {}, &block)
|
16
|
+
@selector = selector
|
17
|
+
@type = type
|
18
|
+
|
19
|
+
case options
|
20
|
+
when Hash
|
21
|
+
@options = options
|
22
|
+
when Numeric
|
23
|
+
@options = {:count => options}
|
24
|
+
else
|
25
|
+
@options = {:text => options}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def doc_for(input)
|
30
|
+
engine = type == :xml ? Nokogiri::XML : Nokogiri::HTML
|
31
|
+
|
32
|
+
if input.respond_to?(:body)
|
33
|
+
engine.parse(input.body.to_s)
|
34
|
+
elsif Nokogiri::XML::Element === input
|
35
|
+
input
|
36
|
+
else
|
37
|
+
engine.parse(input.to_s)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def matches?(actual, &block)
|
42
|
+
@actual = actual
|
43
|
+
@doc = doc_for(actual)
|
44
|
+
|
45
|
+
matches = doc.css(selector)
|
46
|
+
|
47
|
+
return options[:count] == 0 if matches.empty?
|
48
|
+
matches = filter_on_inner_text(matches) if options[:text]
|
49
|
+
matches = filter_on_nested_expectations(matches, block) if block
|
50
|
+
|
51
|
+
@actual_count = matches.size
|
52
|
+
|
53
|
+
return false if not acceptable_count?(actual_count)
|
54
|
+
|
55
|
+
!matches.empty?
|
56
|
+
end
|
57
|
+
|
58
|
+
def failure_message
|
59
|
+
explanation = actual_count ? "but found #{actual_count}" : "but did not"
|
60
|
+
"expected\n#{doc.to_s}\nto have #{failure_count_phrase} #{failure_selector_phrase}, #{explanation}"
|
61
|
+
end
|
62
|
+
|
63
|
+
def negative_failure_message
|
64
|
+
explanation = actual_count ? "but found #{actual_count}" : "but did"
|
65
|
+
"expected\n#{doc.to_s}\nnot to have #{failure_count_phrase} #{failure_selector_phrase}, #{explanation}"
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
def filter_on_inner_text(elements)
|
70
|
+
elements.select do |el|
|
71
|
+
next(el.inner_text =~ options[:text]) if options[:text].is_a?(Regexp)
|
72
|
+
el.inner_text == options[:text]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def filter_on_nested_expectations(elements, block)
|
77
|
+
elements.select do |el|
|
78
|
+
begin
|
79
|
+
block.call(el)
|
80
|
+
rescue RSpec::Expectations::ExpectationNotMetError
|
81
|
+
false
|
82
|
+
else
|
83
|
+
true
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def acceptable_count?(count)
|
89
|
+
return false unless options[:count] === count if options[:count]
|
90
|
+
return false unless count >= options[:minimum] if options[:minimum]
|
91
|
+
return false unless count <= options[:maximum] if options[:maximum]
|
92
|
+
true
|
93
|
+
end
|
94
|
+
|
95
|
+
def failure_count_phrase
|
96
|
+
if options[:count]
|
97
|
+
"#{options[:count]} elements matching"
|
98
|
+
elsif options[:minimum] || options[:maximum]
|
99
|
+
count_explanations = []
|
100
|
+
count_explanations << "at least #{options[:minimum]}" if options[:minimum]
|
101
|
+
count_explanations << "at most #{options[:maximum]}" if options[:maximum]
|
102
|
+
"#{count_explanations.join(' and ')} elements matching"
|
103
|
+
else
|
104
|
+
"an element matching"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def failure_selector_phrase
|
109
|
+
phrase = selector.inspect
|
110
|
+
phrase << (options[:text] ? " with inner text #{options[:text].inspect}" : "")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
data/lib/swiss_knife.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require "open-uri"
|
2
|
+
require "swiss_knife/railtie"
|
3
|
+
require "swiss_knife/support/remote_file"
|
4
|
+
require "swiss_knife/assets"
|
5
|
+
require "swiss_knife/dispatcher_js"
|
6
|
+
require "swiss_knife/helpers"
|
7
|
+
require "swiss_knife/action_controller"
|
8
|
+
require "swiss_knife/i18n_js"
|
9
|
+
require "swiss_knife/jquery"
|
10
|
+
require "swiss_knife/jquery_ujs"
|
11
|
+
require "swiss_knife/modernizr"
|
12
|
+
require "swiss_knife/railtie"
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ApplicationController do
|
4
|
+
before do
|
5
|
+
controller.stub :controller_name => "products"
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should return inline title" do
|
9
|
+
controller.page_title "Viewing all products"
|
10
|
+
controller.page_title.should == "Viewing all products"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should return internationalized title" do
|
14
|
+
controller.stub :action_name => "index"
|
15
|
+
controller.page_title.should == "All products"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return internationalized title with interpolation options" do
|
19
|
+
controller.page_title :name => "Some product"
|
20
|
+
controller.stub :action_name => "edit"
|
21
|
+
controller.page_title.should == "Editing Some product"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return missing translation" do
|
25
|
+
controller.stub :action_name => "details"
|
26
|
+
|
27
|
+
expect {
|
28
|
+
controller.page_title.should match(/translation missing/)
|
29
|
+
}.to_not raise_error
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should alias create action" do
|
33
|
+
controller.stub :action_name => "create"
|
34
|
+
controller.page_title.should == "Add a new product"
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should alias update action" do
|
38
|
+
controller.page_title :name => "Some product"
|
39
|
+
controller.stub :action_name => "update"
|
40
|
+
controller.page_title.should == "Editing Some product"
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should alias remove action" do
|
44
|
+
controller.page_title :name => "Some product"
|
45
|
+
controller.stub :action_name => "remove"
|
46
|
+
controller.page_title.should == "Remove Some product"
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should be added as a helper method" do
|
50
|
+
ApplicationController._helper_methods.should include(:page_title)
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,314 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe SwissKnife::Helpers do
|
4
|
+
before do
|
5
|
+
I18n.locale = :en
|
6
|
+
@controller = helper.send(:controller)
|
7
|
+
@controller.stub(:controller_name => "sample", :action_name => "index")
|
8
|
+
helper.stub(:controller => @controller)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#flash_messages" do
|
12
|
+
before do
|
13
|
+
flash[:notice] = "Notice"
|
14
|
+
flash[:warning] = "Warning"
|
15
|
+
flash[:error] = "Error"
|
16
|
+
end
|
17
|
+
|
18
|
+
subject { helper.flash_messages }
|
19
|
+
|
20
|
+
it "should render multiple flash messages" do
|
21
|
+
subject.should have_tag("p.message", :count => 3)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should render error message" do
|
25
|
+
subject.should have_tag("p.error", "Error")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should render warning message" do
|
29
|
+
subject.should have_tag("p.warning", "Warning")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should render notice message" do
|
33
|
+
subject.should have_tag("p.notice", "Notice")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "block wrappers" do
|
38
|
+
context "body" do
|
39
|
+
it "should use defaults" do
|
40
|
+
html = helper.body { "Body" }
|
41
|
+
|
42
|
+
html.should have_tag("body", :count => 1)
|
43
|
+
html.should have_tag("body#sample-page")
|
44
|
+
html.should have_tag("body.sample-index")
|
45
|
+
html.should have_tag("body.en")
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should use alias for action" do
|
49
|
+
@controller.stub(:action_name => "create")
|
50
|
+
helper.body { "Body" }.should have_tag("body.sample-new")
|
51
|
+
|
52
|
+
@controller.stub(:action_name => "update")
|
53
|
+
helper.body { "Body" }.should have_tag("body.sample-edit")
|
54
|
+
|
55
|
+
@controller.stub(:action_name => "destroy")
|
56
|
+
helper.body { "Body" }.should have_tag("body.sample-destroy")
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should use custom settings" do
|
60
|
+
html = helper.body(:id => "page", :class => "dark", :onload => "init();") { "Body" }
|
61
|
+
|
62
|
+
html.should have_tag("body#page")
|
63
|
+
html.should have_tag("body.dark")
|
64
|
+
html.should have_tag("body[onload='init();']")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should append classes" do
|
68
|
+
html = helper.body(:append_class => "more classes") { "Body" }
|
69
|
+
|
70
|
+
html.should have_tag("body.more")
|
71
|
+
html.should have_tag("body.classes")
|
72
|
+
html.should have_tag("body.en")
|
73
|
+
html.should have_tag("body.sample-index")
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should not have append_class attribute" do
|
77
|
+
helper.body(:append_class => "more classes") { "Body" }.should_not have_tag("body[append_class]")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should wrap content into main div" do
|
82
|
+
helper.main { "Main" }.should have_tag("div#main", "Main")
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should wrap content into page div" do
|
86
|
+
helper.page { "Page" }.should have_tag("div#page", "Page")
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should wrap content into sidebar" do
|
90
|
+
helper.sidebar { "Sidebar" }.should have_tag("sidebar", "Sidebar")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should wrap content into footer" do
|
94
|
+
helper.footer { "Footer" }.should have_tag("footer", "Footer")
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should wrap content into header" do
|
98
|
+
helper.header { "Header" }.should have_tag("header", "Header")
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should wrap content into article" do
|
102
|
+
helper.article { "Article" }.should have_tag("article", "Article")
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should wrap content into section" do
|
106
|
+
helper.section { "Section" }.should have_tag("section", "Section")
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should use other options like css class" do
|
110
|
+
html = helper.wrapper(:div, :id => "container", :class => "rounded") { "Some content" }
|
111
|
+
html.should have_tag("div#container.rounded", "Some content")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "#dispatcher_tag" do
|
116
|
+
it "should contain meta tag" do
|
117
|
+
@controller.class.stub!(:name).and_return("SampleController")
|
118
|
+
|
119
|
+
html = helper.dispatcher_tag
|
120
|
+
html.should have_tag("meta")
|
121
|
+
html.should have_tag("meta[name=page][content='sample#index']")
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should return normalized controller name for namespaced controller" do
|
125
|
+
@controller.class.stub(:name => "Admin::SampleController")
|
126
|
+
helper.dispatcher_tag.should have_tag("meta[name=page][content='admin_sample#index']", :count => 1)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "#mail_to" do
|
131
|
+
subject { helper.mail_to("john@doe.com") }
|
132
|
+
|
133
|
+
it "should be encrypted" do
|
134
|
+
subject.should_not match(/john@doe\.com/)
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should not have plain-text protocol" do
|
138
|
+
subject.should_not match(/mailto:/)
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should use provided label" do
|
142
|
+
helper.mail_to("john@doe.com", "john's email").should have_tag("a", "john's email")
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
context "assets" do
|
147
|
+
before do
|
148
|
+
@assets_dir = Pathname.new(File.dirname(__FILE__) + "/../resources/assets")
|
149
|
+
SwissKnife::Assets.stub(:public_dir => @assets_dir)
|
150
|
+
SwissKnife::Assets.stub(:config_file => File.dirname(__FILE__) + "/../resources/assets.yml")
|
151
|
+
end
|
152
|
+
|
153
|
+
describe "javascript includes" do
|
154
|
+
it "should use defaults" do
|
155
|
+
html = helper.javascript_includes("application")
|
156
|
+
|
157
|
+
html.should have_tag("script[type='text/javascript']", :count => 1)
|
158
|
+
html.should match(%r{/javascripts/application.js(\?\d+)?})
|
159
|
+
end
|
160
|
+
|
161
|
+
it "should return several includes for bundle when not in production" do
|
162
|
+
SwissKnife::Assets.stub(:merge? => false)
|
163
|
+
html = helper.javascript_includes(:base)
|
164
|
+
|
165
|
+
html.should have_tag("script[type='text/javascript']", :count => 3)
|
166
|
+
html.should match(%r{/javascripts/application.js(\?\d+)?})
|
167
|
+
html.should match(%r{/javascripts/jquery.js(\?\d+)?})
|
168
|
+
html.should match(%r{/javascripts/rails.js(\?\d+)?})
|
169
|
+
end
|
170
|
+
|
171
|
+
it "should return bundle only when in production" do
|
172
|
+
SwissKnife::Assets.stub(:merge? => true)
|
173
|
+
html = helper.javascript_includes(:base)
|
174
|
+
|
175
|
+
html.should have_tag("script[type='text/javascript']", :count => 1)
|
176
|
+
html.should match(%r{/javascripts/base_packaged.js(\?\d+)?})
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
describe "stylesheet includes" do
|
181
|
+
it "should use defaults" do
|
182
|
+
html = helper.stylesheet_includes("application")
|
183
|
+
|
184
|
+
html.should have_tag("link[rel='stylesheet']", :count => 1)
|
185
|
+
html.should match(%r{/stylesheets/application.css(\?\d+)?})
|
186
|
+
end
|
187
|
+
|
188
|
+
it "should return several includes for bundle when not in production" do
|
189
|
+
SwissKnife::Assets.stub(:merge? => false)
|
190
|
+
html = helper.stylesheet_includes(:base)
|
191
|
+
|
192
|
+
html.should have_tag("link[rel='stylesheet']", :count => 2)
|
193
|
+
html.should match(%r{/stylesheets/reset.css(\?\d+)?})
|
194
|
+
html.should match(%r{/stylesheets/main.css(\?\d+)?})
|
195
|
+
end
|
196
|
+
|
197
|
+
it "should return only bundle when in production" do
|
198
|
+
SwissKnife::Assets.stub(:merge? => true)
|
199
|
+
html = helper.stylesheet_includes(:base)
|
200
|
+
|
201
|
+
html.should have_tag("link[rel='stylesheet']", :count => 1)
|
202
|
+
html.should match(%r{/stylesheets/base_packaged.css(\?\d+)?})
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
describe "#fieldset" do
|
208
|
+
before do
|
209
|
+
@html = helper.fieldset("Nice legend", :class => "sample") { "<p>Fieldset</p>" }
|
210
|
+
end
|
211
|
+
|
212
|
+
it "should use provided options" do
|
213
|
+
@html.should have_tag("fieldset.sample", :count => 1)
|
214
|
+
end
|
215
|
+
|
216
|
+
it "should use legend as text" do
|
217
|
+
@html.should have_tag("fieldset > legend", "Nice legend")
|
218
|
+
end
|
219
|
+
|
220
|
+
it "should use translated legend" do
|
221
|
+
I18n.locale = :pt
|
222
|
+
I18n.backend.should_receive(:translations).and_return(:pt => {:sample => "Legenda"})
|
223
|
+
|
224
|
+
@html = helper.fieldset("sample") {}
|
225
|
+
@html.should have_tag("fieldset > legend", "Legenda")
|
226
|
+
end
|
227
|
+
|
228
|
+
it "should return content" do
|
229
|
+
@html.should have_tag("fieldset > p", "Fieldset")
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
describe "#gravatar_tag" do
|
234
|
+
before do
|
235
|
+
ActionController::Base.asset_host = "http://example.com"
|
236
|
+
@email = "john@doe.com"
|
237
|
+
end
|
238
|
+
|
239
|
+
it "should return an image" do
|
240
|
+
helper.gravatar_tag(@email).should have_tag("img.gravatar", :count => 1)
|
241
|
+
end
|
242
|
+
|
243
|
+
it "should use default options" do
|
244
|
+
uri = uri_for(helper.gravatar_tag(@email))
|
245
|
+
uri.scheme.should == "http"
|
246
|
+
uri.host.should == "www.gravatar.com"
|
247
|
+
uri.path.should == "/avatar/#{Digest::MD5.hexdigest(@email)}.jpg"
|
248
|
+
uri.params.should == {"s" => "32", "r" => "g", "d" => "http://example.com/images/gravatar.jpg"}
|
249
|
+
end
|
250
|
+
|
251
|
+
it "should use gravatar hash" do
|
252
|
+
uri = uri_for(helper.gravatar_tag("098f6bcd4621d373cade4e832627b4f6"))
|
253
|
+
uri.path.should == "/avatar/098f6bcd4621d373cade4e832627b4f6.jpg"
|
254
|
+
end
|
255
|
+
|
256
|
+
it "should use custom default image" do
|
257
|
+
uri = uri_for(helper.gravatar_tag(@email, :default => "custom.jpg"))
|
258
|
+
uri.params["d"].should == "http://example.com/images/custom.jpg"
|
259
|
+
end
|
260
|
+
|
261
|
+
it "should use custom default image" do
|
262
|
+
uri = uri_for(helper.gravatar_tag(@email, :default => "custom.jpg"))
|
263
|
+
uri.params["d"].should == "http://example.com/images/custom.jpg"
|
264
|
+
end
|
265
|
+
|
266
|
+
it "should use predefined default image" do
|
267
|
+
uri = uri_for(helper.gravatar_tag(@email, :default => :mm))
|
268
|
+
uri.params["d"].should == "mm"
|
269
|
+
end
|
270
|
+
|
271
|
+
it "should use custom size" do
|
272
|
+
uri = uri_for(helper.gravatar_tag(@email, :size => 80))
|
273
|
+
uri.params["s"].should == "80"
|
274
|
+
end
|
275
|
+
|
276
|
+
it "should use custom rating" do
|
277
|
+
uri = uri_for(helper.gravatar_tag(@email, :rating => "pg"))
|
278
|
+
uri.params["r"].should == "pg"
|
279
|
+
end
|
280
|
+
|
281
|
+
it "should use secure host when in a secure request" do
|
282
|
+
helper.request.should_receive(:ssl?).and_return(true)
|
283
|
+
uri = uri_for(helper.gravatar_tag(@email))
|
284
|
+
uri.host.should == "secure.gravatar.com"
|
285
|
+
uri.scheme.should == "https"
|
286
|
+
end
|
287
|
+
|
288
|
+
it "should use secure host when using :ssl option" do
|
289
|
+
uri = uri_for(helper.gravatar_tag(@email, :ssl => true))
|
290
|
+
uri.host.should == "secure.gravatar.com"
|
291
|
+
uri.scheme.should == "https"
|
292
|
+
end
|
293
|
+
|
294
|
+
it "should use alt" do
|
295
|
+
helper.gravatar_tag(@email, :alt => "alt text").should match(/\balt="alt text"/)
|
296
|
+
end
|
297
|
+
|
298
|
+
it "should use title" do
|
299
|
+
helper.gravatar_tag(@email, :title => "title text").should match(/\btitle="title text"/)
|
300
|
+
end
|
301
|
+
|
302
|
+
def uri_for(html)
|
303
|
+
html = Nokogiri(html)
|
304
|
+
uri = URI.parse(html.css("img.gravatar").first["src"])
|
305
|
+
|
306
|
+
OpenStruct.new({
|
307
|
+
:scheme => uri.scheme,
|
308
|
+
:params => CGI.parse(uri.query).inject({}) {|buffer, (name, value)| buffer.merge(name => value.first)},
|
309
|
+
:host => uri.host,
|
310
|
+
:path => uri.path
|
311
|
+
})
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|