social-buttons 0.3.6

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/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/CHANGELOG.md ADDED
@@ -0,0 +1,8 @@
1
+ ## Changelog
2
+
3
+ ### 0.3.6
4
+
5
+ - Added Scripter for handling script logic
6
+ - Ensure script is only output once for each request, but again for next request
7
+ by moving state to instance level (fixes bug in 3.5)
8
+ - Specs added to test if script works correctly on multiple requests
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'rails', '>= 3.0.0'
4
+
5
+ group :test do
6
+ gem 'hashie', '~> 1.2.0'
7
+ end
8
+
9
+ group :development do
10
+ gem "rspec", ">= 2.8.0"
11
+ gem "rdoc", ">= 3.12"
12
+ gem "bundler", ">= 1.0.0"
13
+ gem "jeweler", "~> 1.8.4"
14
+ gem "simplecov", ">= 0.5"
15
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,111 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ actionmailer (3.2.8)
5
+ actionpack (= 3.2.8)
6
+ mail (~> 2.4.4)
7
+ actionpack (3.2.8)
8
+ activemodel (= 3.2.8)
9
+ activesupport (= 3.2.8)
10
+ builder (~> 3.0.0)
11
+ erubis (~> 2.7.0)
12
+ journey (~> 1.0.4)
13
+ rack (~> 1.4.0)
14
+ rack-cache (~> 1.2)
15
+ rack-test (~> 0.6.1)
16
+ sprockets (~> 2.1.3)
17
+ activemodel (3.2.8)
18
+ activesupport (= 3.2.8)
19
+ builder (~> 3.0.0)
20
+ activerecord (3.2.8)
21
+ activemodel (= 3.2.8)
22
+ activesupport (= 3.2.8)
23
+ arel (~> 3.0.2)
24
+ tzinfo (~> 0.3.29)
25
+ activeresource (3.2.8)
26
+ activemodel (= 3.2.8)
27
+ activesupport (= 3.2.8)
28
+ activesupport (3.2.8)
29
+ i18n (~> 0.6)
30
+ multi_json (~> 1.0)
31
+ arel (3.0.2)
32
+ builder (3.0.0)
33
+ diff-lcs (1.1.3)
34
+ erubis (2.7.0)
35
+ git (1.2.5)
36
+ hashie (1.2.0)
37
+ hike (1.2.1)
38
+ i18n (0.6.0)
39
+ jeweler (1.8.4)
40
+ bundler (~> 1.0)
41
+ git (>= 1.2.5)
42
+ rake
43
+ rdoc
44
+ journey (1.0.4)
45
+ json (1.7.5)
46
+ mail (2.4.4)
47
+ i18n (>= 0.4.0)
48
+ mime-types (~> 1.16)
49
+ treetop (~> 1.4.8)
50
+ mime-types (1.19)
51
+ multi_json (1.3.6)
52
+ polyglot (0.3.3)
53
+ rack (1.4.1)
54
+ rack-cache (1.2)
55
+ rack (>= 0.4)
56
+ rack-ssl (1.3.2)
57
+ rack
58
+ rack-test (0.6.1)
59
+ rack (>= 1.0)
60
+ rails (3.2.8)
61
+ actionmailer (= 3.2.8)
62
+ actionpack (= 3.2.8)
63
+ activerecord (= 3.2.8)
64
+ activeresource (= 3.2.8)
65
+ activesupport (= 3.2.8)
66
+ bundler (~> 1.0)
67
+ railties (= 3.2.8)
68
+ railties (3.2.8)
69
+ actionpack (= 3.2.8)
70
+ activesupport (= 3.2.8)
71
+ rack-ssl (~> 1.3.2)
72
+ rake (>= 0.8.7)
73
+ rdoc (~> 3.4)
74
+ thor (>= 0.14.6, < 2.0)
75
+ rake (0.9.2.2)
76
+ rdoc (3.12)
77
+ json (~> 1.4)
78
+ rspec (2.11.0)
79
+ rspec-core (~> 2.11.0)
80
+ rspec-expectations (~> 2.11.0)
81
+ rspec-mocks (~> 2.11.0)
82
+ rspec-core (2.11.1)
83
+ rspec-expectations (2.11.2)
84
+ diff-lcs (~> 1.1.3)
85
+ rspec-mocks (2.11.2)
86
+ simplecov (0.6.4)
87
+ multi_json (~> 1.0)
88
+ simplecov-html (~> 0.5.3)
89
+ simplecov-html (0.5.3)
90
+ sprockets (2.1.3)
91
+ hike (~> 1.2)
92
+ rack (~> 1.0)
93
+ tilt (~> 1.1, != 1.3.0)
94
+ thor (0.16.0)
95
+ tilt (1.3.3)
96
+ treetop (1.4.10)
97
+ polyglot
98
+ polyglot (>= 0.3.1)
99
+ tzinfo (0.3.33)
100
+
101
+ PLATFORMS
102
+ ruby
103
+
104
+ DEPENDENCIES
105
+ bundler (>= 1.0.0)
106
+ hashie (~> 1.2.0)
107
+ jeweler (~> 1.8.4)
108
+ rails (>= 3.0.0)
109
+ rdoc (>= 3.12)
110
+ rspec (>= 2.8.0)
111
+ simplecov (>= 0.5)
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Jeremy McAnally
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,188 @@
1
+ # Social Buttons
2
+
3
+ This gem is a Rails 3+ engine (but can be used without the engine).
4
+
5
+ Currently there is support for the following social buttons:
6
+
7
+ * Twitter *tweet* button
8
+ * Facebook *like* button
9
+ * Pinterest *pinit* button
10
+ * Google+ *+1* button
11
+
12
+ # Installation
13
+
14
+ Add the gem to your Gemfile and use Bundler to install the gem.
15
+
16
+ ```ruby
17
+ gem "social-buttons", '~> 0.3'
18
+ ```
19
+
20
+ # Usage
21
+
22
+ This gem is a Rails 3+ compatible engine and now automatically includes all the view helper modules into `ActionView::Base`
23
+
24
+ This gem includes the following view helper modules in `social_buttons/view_helpers`:
25
+
26
+ * `Tweet`
27
+ * `Like`
28
+ * `Pinit`
29
+ * `GooglePlus`
30
+
31
+ Using SocialButtons is as simple as adding a single method call to your views:
32
+
33
+ ERB example:
34
+ ```erb
35
+ <%= tweet_button %>
36
+ <%= like_button(app_id) %>
37
+ <%= pinit_button %>
38
+ <%= google_plus_button %>
39
+ ```
40
+
41
+ HAML example:
42
+
43
+ ```haml
44
+ = tweet_button
45
+ = like_button(app_id)
46
+ = pinit_button
47
+ = google_plus_button
48
+ ```
49
+
50
+ Bam. Done. You'll have a sweet lookin' Social Buttons all up in your view.
51
+
52
+ Of course, you can customize it. Depending on the type of button, there are different options.
53
+
54
+ ### Tweet Button
55
+
56
+ * `:url` - The URL to share; the default is the current URL.
57
+ * `:text` - The text that will appear in the tweet; the default is "Check this out!"
58
+ * `:via` - The attribution. Defaults to "tweetbutton", but you should change that.
59
+ * `:lang` - Set the language for the tweet (no default).
60
+ * `:related` - Related Twitter accounts (no default).
61
+ * `:count` - The tweet count box position (values can be "none", "horizontal", or "vertical"; default is "vertical").
62
+
63
+ More information can be found from [Twitter](https://twitter.com/about/resources/buttons#tweet)
64
+
65
+ So, if you wanted to tweet about Hacker News, attribute it to Peter Cooper, and add some custom text, all from a tweet button with a horizontal counter, you'd do this:
66
+
67
+ ```erb
68
+ <%= tweet_button(via: => "peterc", url: "http://news.ycombinator.com", :text => "AWESOME.") %>
69
+ ```
70
+
71
+ ### Like Button
72
+
73
+ NOTE: Facebook App Id is mandatory
74
+
75
+ * `:href` - The URL to like, the default is the current URL.
76
+ * `:send` - Whether to add a send button or not.
77
+ * `:layout` - Size and amount of social context next to button. Has 3 options `:standard`, `:button_count`, and `:box_count`
78
+ * `:width` - Width of the button
79
+ * `"show-faces"` - Show profile photos
80
+ * `:action` - Action name like 'like' or 'recommend'
81
+ * `:font` - Font for the button
82
+ * `:colorscheme` - Current colorscheme
83
+
84
+ More information can be found from [Facebook](http://developers.facebook.com/docs/reference/plugins/like/)
85
+
86
+ So, a simple like button can be added like this:
87
+
88
+ ```erb
89
+ <%= like_button(app_id) %>
90
+ ```
91
+
92
+ ### Pinit Button
93
+
94
+ * `:url` - The URL to share; the default is the current URL.
95
+ * `:media` - The image to be shared.
96
+ * `:description` - Description for the link.
97
+ * `"count-layout"` - Specify pinit count. It can be `horizontal`, `vertical` or `none`.
98
+
99
+ More information can be found from [Pinterest](http://pinterest.com/about/goodies/)
100
+
101
+ So, a simple pinit button can be added like this:
102
+
103
+ ```erb
104
+ <%= pinit_button(url: request.url, media: @picture.image.url, description: "Amazing Picture") %>
105
+ ```
106
+
107
+ ### Google Plus Button
108
+
109
+ * `:href` - The URL to share; the default is the current URL.
110
+ * `:size` - Size of button: 'small', 'tall' or 'medium'
111
+ * `:annotation` - The style of button: 'inline', 'bubble', 'none'
112
+ * `:lang` - The locale, fx 'es' for Spanish (alias :locale)
113
+
114
+ See [Google+ button](http://www.google.com/intl/en/webmasters/+1/button/index.html) for more info.
115
+
116
+ ### Setting universal defaults
117
+
118
+ You can set a new default for any option in your `social_buttons.rb` initializer (in `config/initializers`.
119
+
120
+ Set the `default_options` on any of the social view helper modules.
121
+
122
+ For example:
123
+
124
+ ```ruby
125
+ # config/initializers/social_buttons.rb
126
+ SocialButtons::Tweet.default_options = {:via => "myself"}
127
+ ```
128
+
129
+ Or even sweeter...
130
+
131
+ ```ruby
132
+ # config/initializers/social_buttons.rb
133
+ SocialButtons.config :tweet do |tweet|
134
+ tweet.default_options = {:via => "myself"}
135
+ end
136
+
137
+ # or
138
+ SocialButtons.config(:tweet).default_options = {:via => "myself"}
139
+ ```
140
+
141
+ Or simply :)
142
+
143
+ ```ruby
144
+ # config/initializers/social_buttons.rb
145
+ SocialButtons.config do |social|
146
+ social.tweet do |tweet|
147
+ tweet.default_options = {:via => "myself"}
148
+ end
149
+
150
+ social.like.default_options = {:via => "myself"}
151
+ end
152
+ end
153
+ ```
154
+
155
+ This little DSL makes the configuration more extensible for the future ;)
156
+
157
+ Only the options you specify will be overridden; so if you only specify a new default `:via`, then the other defaults will stay intact.
158
+
159
+ ## Help
160
+
161
+ We have started adding suport for help directly in the api:
162
+
163
+ `puts SocialButtons.config(:google_plus).help`
164
+
165
+ Should output some help info on how to use that particular method, options available etc. So far only works for Google+ button.
166
+
167
+ # TODO
168
+
169
+ * Improve specs
170
+ * Add more options to customize buttons (fx localization on all if available)
171
+ * Add even more social buttons...
172
+
173
+ ## Note on Patches/Pull Requests
174
+
175
+ * Fork the project.
176
+ * Make your feature addition or bug fix.
177
+ * Add tests for it. This is important so I don't break it in a
178
+ future version unintentionally.
179
+ * Commit, do not mess with rakefile, version, or history.
180
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
181
+ * Send me a pull request. Bonus points for topic branches.
182
+
183
+ ## Copyright
184
+
185
+ Copyright (c) 2012 Kristian Mandrup & Yuva Kumar
186
+ Copyright (c) 2010 Jeremy McAnally.
187
+
188
+ See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,52 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "social-buttons"
8
+ gem.summary = %Q{Generate new Social Buttons}
9
+ gem.description = %Q{Generate Social Buttons for your Rails apps}
10
+ gem.email = "yuva@codemancers.com"
11
+ gem.homepage = "https://github.com/iffyuva/social-buttons"
12
+ gem.authors = ["Jeremy McAnally", "Yuva"]
13
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
14
+ end
15
+ Jeweler::GemcutterTasks.new
16
+ rescue LoadError
17
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
18
+ end
19
+
20
+ require 'rake/testtask'
21
+ Rake::TestTask.new(:test) do |test|
22
+ test.libs << 'lib' << 'test'
23
+ test.pattern = 'test/**/test_*.rb'
24
+ test.verbose = true
25
+ end
26
+
27
+ begin
28
+ require 'rcov/rcovtask'
29
+ Rcov::RcovTask.new do |test|
30
+ test.libs << 'test'
31
+ test.pattern = 'test/**/test_*.rb'
32
+ test.verbose = true
33
+ end
34
+ rescue LoadError
35
+ task :rcov do
36
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
37
+ end
38
+ end
39
+
40
+ task :test => :check_dependencies
41
+
42
+ task :default => :test
43
+
44
+ require 'rdoc/task'
45
+ Rake::RDocTask.new do |rdoc|
46
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
47
+
48
+ rdoc.rdoc_dir = 'rdoc'
49
+ rdoc.title = "tweet-button #{version}"
50
+ rdoc.rdoc_files.include('README*')
51
+ rdoc.rdoc_files.include('lib/**/*.rb')
52
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.3.6
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), 'lib', 'tweet-button')
@@ -0,0 +1,29 @@
1
+ module SocialButtons
2
+ def self.names
3
+ %w{pinit tweet like google_plus}
4
+ end
5
+
6
+ def self.helpers
7
+ %w{assistant scripter}
8
+ end
9
+
10
+ def self.all
11
+ names + helpers
12
+ end
13
+
14
+ def self.config name = nil, &block
15
+ context = name ? "SocialButtons::#{name.to_s.camelize}".constantize : self
16
+ block_given? ? yield(context) : context
17
+ end
18
+
19
+ # add class method for each social button registered
20
+ names.each do |name|
21
+ (class << self; self; end).send :define_method, name do |&block|
22
+ clazz = "SocialButtons::#{name.to_s.camelize}".constantize
23
+ block_given? ? clazz.instance_eval(&block) : clazz
24
+ end
25
+ end
26
+ end
27
+
28
+ require "social_buttons/view_helper"
29
+ require "social_buttons/engine" if defined?(::Rails::Engine)
@@ -0,0 +1,9 @@
1
+ module SocialButtons
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+ initializer 'social buttons config' do
5
+ ActionView::Base.send :include, SocialButtons::ViewHelper
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,30 @@
1
+ module SocialButtons
2
+ SocialButtons.all.flatten.each do |name|
3
+ autoload name.to_s.camelize.to_sym, "social_buttons/view_helpers/#{name}"
4
+ end
5
+
6
+ module ViewHelper
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ # Include all Social Buttons into ViewHelper to be made available
11
+ # to be included into a View as one module (see engine)
12
+ SocialButtons.names.each do |name|
13
+ self.send :include, "SocialButtons::#{name.to_s.camelize}".constantize
14
+
15
+ attr_accessor :"#{name}_widgetized"
16
+ alias_method :"#{name}_widgetized?", :"#{name}_widgetized"
17
+ end
18
+ end
19
+
20
+ def widgetized! name
21
+ meth = "#{name}_widgetized="
22
+ self.send(meth, name) if respond_to? meth
23
+ end
24
+
25
+ def widgetized? name
26
+ meth = "#{name}_widgetized?"
27
+ self.send(meth) if respond_to? meth
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,36 @@
1
+ module SocialButtons
2
+ module Assistant
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ attr_writer :default_options
7
+
8
+ def myname
9
+ self.name.demodulize
10
+ end
11
+
12
+ def help
13
+ "Please HELP by filling in the help of the #{myname} button :) (see google+ button code)"
14
+ end
15
+
16
+ def options_to_data_params(opts)
17
+ params = {}
18
+ opts.each {|k, v| params["data-#{k}"] = v}
19
+ params
20
+ end
21
+
22
+ def options_to_query_string(subject, opts)
23
+ # formulate the url, and then strip the part before first '?'
24
+ query_params = opts.slice(:url, :media, :description)
25
+ full_url = subject.url_for(query_params)
26
+ full_url.sub(/^([^?]*)/, '')
27
+ end
28
+
29
+ protected
30
+
31
+ def help_note
32
+ "Note: SocialButons will ensure that the button script is only rendered once!"
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,79 @@
1
+ module SocialButtons
2
+ module GooglePlus
3
+ include SocialButtons::Assistant
4
+
5
+ autoload :Help, "social_buttons/view_helpers/google_plus/help"
6
+
7
+ CLASS = "g-plusone"
8
+
9
+ # http://www.google.com/intl/en/webmasters/+1/button/index.html
10
+
11
+ # Async script mode:
12
+ # To only output script
13
+ # = google_button :script, locale: 'es'
14
+
15
+ # To NOT output script
16
+ # = google_button :locale => 'es', script: false
17
+ def google_plus_button *args
18
+ options = args.extract_options!
19
+ clazz = SocialButtons::GooglePlus
20
+ return clazz.script(options) if args.first == :script
21
+
22
+ use_script = options.delete :script
23
+ locale = options.delete(:locale) || options.delete(:lang)
24
+
25
+ params = clazz.options_to_data_params(clazz.default_options.merge(options))
26
+ params.merge!(class: CLASS)
27
+
28
+ scripter_class = use_script == :async ? clazz::AsyncScripter : clazz::Scripter
29
+
30
+ html = "".html_safe
31
+ html << content_tag(:div, nil, params)
32
+ html << scripter_class.new(self).script(locale) if use_script
33
+ html
34
+ end
35
+
36
+ class << self
37
+ include Help
38
+
39
+ def default_options
40
+ @default_options ||= {
41
+ annotations: "inline"
42
+ }
43
+ end
44
+ end
45
+
46
+ class Scripter < SocialButtons::Scripter
47
+ def script lang = nil
48
+ return empty_content if widgetized? :google_plus
49
+ widgetized! :google_plus
50
+ %q{<script type="text/javascript">
51
+ #{language lang}
52
+ (function() {
53
+ var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
54
+ po.src = 'https://apis.google.com/js/plusone.js';
55
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
56
+ })();
57
+ </script>}.html_safe
58
+ end
59
+
60
+ def language lang = nil
61
+ "window.___gcfg = {lang: '#{lang}'};" if lang
62
+ end
63
+ end
64
+
65
+
66
+ class AsyncScripter < SocialButtons::Scripter
67
+ # Place this tag in your head or just before your close body tag
68
+ def script lang = nil
69
+ %Q{<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
70
+ #{language lang}
71
+ </script>}
72
+ end
73
+
74
+ def language lang = nil
75
+ "{lang: '#{lang}'}" if lang
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,42 @@
1
+ module SocialButtons
2
+ module GooglePlus
3
+ module Help
4
+ # Usage
5
+ # SocialButtons::Google.help
6
+ #
7
+ # SocialButtons.config(:google).help
8
+ def help
9
+ %Q{Google+ button (options)
10
+ #{Help.show_data_attributes}
11
+ #{Help.other_options}
12
+ #{Help.async_help}
13
+ #{help_note}
14
+ }
15
+ end
16
+
17
+ module Help
18
+ def show_data_attributes
19
+ "'data-' attributes: #{data_attributes.inspect}"
20
+ end
21
+
22
+ def other_options
23
+ "options: lang"
24
+ end
25
+
26
+ def data_attributes
27
+ %w{size href annotation}
28
+ end
29
+
30
+ def async_help
31
+ %q{Async script mode:
32
+ To only output script
33
+ = google_button :script, lang: 'es'
34
+
35
+ To NOT output script tag
36
+ = google_button :lang => 'es', script: false
37
+ }
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,45 @@
1
+ module SocialButtons
2
+ module Like
3
+ include SocialButtons::Assistant
4
+
5
+ CLASS = "fb-like"
6
+
7
+ def like_button(app_id, options = {})
8
+ clazz = SocialButtons::Like
9
+ params = clazz.options_to_data_params(clazz.default_options.merge(options))
10
+ params.merge!(class: CLASS)
11
+
12
+ html = "".html_safe
13
+ html << content_tag(:div, nil, id: "fb-root")
14
+ html << clazz::Scripter.new(self).script(app_id)
15
+ html << content_tag(:div, nil, params)
16
+ html
17
+ end
18
+
19
+ # To avoid polluting namespace where module is included with util functions!
20
+ class << self
21
+ def default_options
22
+ @default_options ||= {
23
+ send: "false",
24
+ layout: "button_count",
25
+ width: "450",
26
+ action: "like",
27
+ font: "arial",
28
+ colorscheme: "light"
29
+ }.merge("show-faces" => "false")
30
+ end
31
+ end
32
+
33
+ class Scripter < SocialButtons::Scripter
34
+ def script(app_id)
35
+ return empty_content if widgetized? :like
36
+ widgetized! :like
37
+ "<script src=#{js_sdk(app_id)} type='text/javascript'></script>".html_safe
38
+ end
39
+
40
+ def js_sdk app_id
41
+ "https://connect.facebook.net/en_US/all.js#xfbml=1&appId=#{app_id}"
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,48 @@
1
+ module SocialButtons
2
+ module Pinit
3
+ include SocialButtons::Assistant
4
+
5
+ PINIT_CREATE_BUTTON = "http://pinterest.com/pin/create/button/"
6
+ PINIT_BUTTON_IMAGE = "http://assets.pinterest.com/images/PinExt.png"
7
+ CLASS = "pin-it-button"
8
+ TITLE = "Pin It"
9
+
10
+ def pinit_button(options = {})
11
+ clazz = SocialButtons::Pinit
12
+ default_options = {url: request.url, media: request.url}
13
+ params = clazz.default_options.merge(clazz.default_options).merge(options)
14
+ params.merge!(:class => CLASS)
15
+
16
+ query_string = clazz.options_to_query_string(self, params)
17
+ option_params = params.except(:url, :media, :description)
18
+ pinit_link = PINIT_CREATE_BUTTON + query_string
19
+
20
+ html = "".html_safe
21
+ html << link_to(pinit_link, option_params) do
22
+ image_tag PINIT_BUTTON_IMAGE, border: ("0" || options[:border]), title: (TITLE || options[:title])
23
+ end
24
+ html << clazz::Scripter.new(self).script
25
+ html
26
+ end
27
+
28
+ class << self
29
+ def default_options
30
+ @default_options ||= {
31
+ description: "Pin Me!"
32
+ }.merge("count-layout" => "none")
33
+ end
34
+ end
35
+
36
+ class Scripter < SocialButtons::Scripter
37
+ def script
38
+ return empty_content if widgetized? :pinit
39
+ widgetized! :pinit
40
+ "<script src=#{pinit_js} type='text/javascript'></script>".html_safe
41
+ end
42
+
43
+ def pinit_js
44
+ "https://assets.pinterest.com/js/pinit.js"
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,22 @@
1
+ module SocialButtons
2
+ class Scripter
3
+ attr_accessor :caller, :options
4
+
5
+ def initialize caller, options = {}
6
+ @caller = caller
7
+ @options = options
8
+ end
9
+
10
+ def script lang = nil
11
+ raise NotImplementedError, "Must be implemented by subclass"
12
+ end
13
+
14
+ protected
15
+
16
+ delegate :widgetized!, :widgetized?, to: :caller
17
+
18
+ def empty_content
19
+ "".html_safe
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,45 @@
1
+ module SocialButtons
2
+ module Tweet
3
+ include SocialButtons::Assistant
4
+
5
+ TWITTER_SHARE_URL = "http://twitter.com/share"
6
+ CLASS = "twitter-share-button"
7
+
8
+ def tweet_button(options = {})
9
+ clazz = SocialButtons::Tweet
10
+ params = clazz.options_to_data_params(clazz.default_options.merge(options))
11
+ params.merge!(class: CLASS)
12
+
13
+ html = "".html_safe
14
+ html << clazz::Scripter.new(self).script
15
+ html << link_to("Tweet", TWITTER_SHARE_URL, params)
16
+ html
17
+ end
18
+
19
+ class << self
20
+ def default_options
21
+ @default_options ||= {
22
+ url: request.url,
23
+ via: "tweetbutton",
24
+ text: "",
25
+ count: "vertical",
26
+ lang: "en",
27
+ related: ""
28
+ }
29
+ end
30
+ end
31
+
32
+ class Scripter < SocialButtons::Scripter
33
+ def script
34
+ return empty_content if widgetized? :tweet
35
+ widgetized! :tweet
36
+
37
+ "<script src=#{twitter_wjs} type='text/javascript'></script>".html_safe
38
+ end
39
+
40
+ def twitter_wjs
41
+ "http://platform.twitter.com/widgets.js"
42
+ end
43
+ end # class
44
+ end
45
+ end
@@ -0,0 +1,81 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "social-buttons"
8
+ s.version = "0.3.6"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jeremy McAnally", "Yuva"]
12
+ s.date = "2012-08-26"
13
+ s.description = "Generate Social Buttons for your Rails apps"
14
+ s.email = "yuva@codemancers.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rspec",
22
+ "CHANGELOG.md",
23
+ "Gemfile",
24
+ "Gemfile.lock",
25
+ "LICENSE",
26
+ "README.md",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "init.rb",
30
+ "lib/social_buttons.rb",
31
+ "lib/social_buttons/engine.rb",
32
+ "lib/social_buttons/view_helper.rb",
33
+ "lib/social_buttons/view_helpers/assistant.rb",
34
+ "lib/social_buttons/view_helpers/google_plus.rb",
35
+ "lib/social_buttons/view_helpers/google_plus/help.rb",
36
+ "lib/social_buttons/view_helpers/like.rb",
37
+ "lib/social_buttons/view_helpers/pinit.rb",
38
+ "lib/social_buttons/view_helpers/scripter.rb",
39
+ "lib/social_buttons/view_helpers/tweet.rb",
40
+ "social-buttons.gemspec",
41
+ "spec/social_buttons/config_spec.rb",
42
+ "spec/social_buttons/google_plus_spec.rb",
43
+ "spec/social_buttons/like_spec.rb",
44
+ "spec/social_buttons/pinit_spec.rb",
45
+ "spec/social_buttons/tweet_spec.rb",
46
+ "spec/spec_helper.rb",
47
+ "spec/view_helper_config.rb"
48
+ ]
49
+ s.homepage = "https://github.com/iffyuva/social-buttons"
50
+ s.require_paths = ["lib"]
51
+ s.rubygems_version = "1.8.24"
52
+ s.summary = "Generate new Social Buttons"
53
+
54
+ if s.respond_to? :specification_version then
55
+ s.specification_version = 3
56
+
57
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
58
+ s.add_runtime_dependency(%q<rails>, [">= 3.0.0"])
59
+ s.add_development_dependency(%q<rspec>, [">= 2.8.0"])
60
+ s.add_development_dependency(%q<rdoc>, [">= 3.12"])
61
+ s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
62
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
63
+ s.add_development_dependency(%q<simplecov>, [">= 0.5"])
64
+ else
65
+ s.add_dependency(%q<rails>, [">= 3.0.0"])
66
+ s.add_dependency(%q<rspec>, [">= 2.8.0"])
67
+ s.add_dependency(%q<rdoc>, [">= 3.12"])
68
+ s.add_dependency(%q<bundler>, [">= 1.0.0"])
69
+ s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
70
+ s.add_dependency(%q<simplecov>, [">= 0.5"])
71
+ end
72
+ else
73
+ s.add_dependency(%q<rails>, [">= 3.0.0"])
74
+ s.add_dependency(%q<rspec>, [">= 2.8.0"])
75
+ s.add_dependency(%q<rdoc>, [">= 3.12"])
76
+ s.add_dependency(%q<bundler>, [">= 1.0.0"])
77
+ s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
78
+ s.add_dependency(%q<simplecov>, [">= 0.5"])
79
+ end
80
+ end
81
+
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe SocialButtons do
4
+
5
+ # TODO: Generate for each!
6
+ # SocialButtons.names.each do |name|
7
+ context 'Tweet' do
8
+ subject { SocialButtons::Tweet }
9
+
10
+ describe 'Tweet' do
11
+ before :all do
12
+ SocialButtons::Tweet.default_options = {:via => "myself"}
13
+ end
14
+
15
+ its(:default_options) { should == {:via => "myself"} }
16
+ end
17
+
18
+ describe '#config' do
19
+ before :all do
20
+ SocialButtons.config(:tweet).default_options = {:via => "myself"}
21
+ end
22
+
23
+ its(:default_options) { should == {:via => "myself"} }
24
+ end
25
+
26
+ describe '#config &block' do
27
+ before :all do
28
+ SocialButtons.config(:tweet) {|c| c.default_options = {:via => "myself"} }
29
+ end
30
+
31
+ its(:default_options) { should == {:via => "myself"} }
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ require 'view_helper_config'
2
+
3
+ describe SocialButtons::ViewHelper do
4
+ include ControllerTestHelpers,
5
+ SocialButtons::ViewHelper
6
+
7
+ describe '#google_plus_button' do
8
+ context 'no arguments' do
9
+ it "should not any args" do
10
+ expect { google_plus_button }.to_not raise_error
11
+ end
12
+ end
13
+
14
+ context 'with script and options' do
15
+ it "should set annotation using option" do
16
+ output = google_plus_button(:annotation => 'bubble', script: true)
17
+ output.should match(/bubble/)
18
+ output.should match(/<script/)
19
+
20
+ output = google_plus_button(:annotation => 'none', script: true)
21
+ output.should match(/none/)
22
+ output.should_not match(/<script/)
23
+ end
24
+ end
25
+
26
+ context 'with script - on next request' do
27
+ it "should render script again on next request!" do
28
+ output = google_plus_button(:annotation => 'bubble', script: true)
29
+ output.should match(/bubble/)
30
+ output.should match(/<script/)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,39 @@
1
+ require 'view_helper_config'
2
+
3
+ describe SocialButtons::ViewHelper do
4
+ include ControllerTestHelpers,
5
+ SocialButtons::ViewHelper
6
+
7
+ describe '#like_button' do
8
+ context 'no arguments' do
9
+ it "should require a Facebook app id" do
10
+ expect { like_button }.to raise_error
11
+ end
12
+ end
13
+
14
+ context 'with app_id' do
15
+ it "should require a Facebook app id" do
16
+ expect { like_button('128085897213395') }.to_not raise_error
17
+ end
18
+ end
19
+
20
+ context 'with options' do
21
+ it "should set width using option" do
22
+ output = like_button('128085897213395', :width => '400')
23
+ output.should match(/width="400"/)
24
+ output.should match(/<script/)
25
+
26
+ output = like_button('128085897213395', :width => '400')
27
+ output.should_not match(/<script/)
28
+ end
29
+ end
30
+
31
+ context 'with script - on next request' do
32
+ it "should render script again on next request!" do
33
+ output = like_button('128085897213395', :width => '400')
34
+ output.should match(/width="400"/)
35
+ output.should match(/<script/)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,33 @@
1
+ require 'view_helper_config'
2
+
3
+ describe SocialButtons::ViewHelper do
4
+ include ControllerTestHelpers,
5
+ SocialButtons::ViewHelper
6
+
7
+ describe '#pinit_button' do
8
+ context 'no arguments' do
9
+ it "should not any args" do
10
+ expect { pinit_button }.to_not raise_error
11
+ end
12
+ end
13
+
14
+ context 'with options' do
15
+ it "should set description using option" do
16
+ output = pinit_button(:colorscheme => 'dark')
17
+ output.should match(/dark/)
18
+ output.should match(/<script/)
19
+
20
+ output = pinit_button(:colorscheme => 'dark')
21
+ output.should_not match(/<script/)
22
+ end
23
+ end
24
+
25
+ context 'with script - on next request' do
26
+ it "should render script again on next request!" do
27
+ output = pinit_button(:colorscheme => 'dark')
28
+ output.should match(/dark/)
29
+ output.should match(/<script/)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ require 'view_helper_config'
2
+
3
+ describe SocialButtons::ViewHelper do
4
+ include ControllerTestHelpers,
5
+ SocialButtons::ViewHelper
6
+
7
+ describe '#tweet_button' do
8
+ context 'no arguments' do
9
+ it "should not any args" do
10
+ expect { tweet_button }.to_not raise_error
11
+ end
12
+ end
13
+
14
+ context 'with options' do
15
+ it "should set description using option" do
16
+ output = tweet_button(:text => 'hello')
17
+ output.should match(/hello/)
18
+ output.should match(/<script/)
19
+
20
+ output = tweet_button(:text => 'hello')
21
+ output.should_not match(/<script/)
22
+ end
23
+ end
24
+
25
+ context 'with script - on next request' do
26
+ it "should render script again on next request!" do
27
+ output = tweet_button(:text => 'hello')
28
+ output.should match(/hello/)
29
+ output.should match(/<script/)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ # coding: utf-8
2
+ require 'rubygems'
3
+ require 'rails'
4
+ require 'json'
5
+ require 'active_support'
6
+ require 'action_pack'
7
+ require 'action_view'
8
+ require 'action_controller'
9
+ require 'action_view/template'
10
+
11
+ require 'active_support/core_ext/hash'
12
+
13
+ require 'rspec'
14
+ require 'social_buttons'
15
+
16
+ SPEC_DIR = File.dirname(__FILE__)
17
+
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+ require 'hashie'
3
+
4
+ class DummyController
5
+ def method_missing(meth, *args, &block)
6
+ meth
7
+ end
8
+ end
9
+
10
+ module ControllerTestHelpers
11
+
12
+ def self.included(base)
13
+ base.class_eval do
14
+
15
+ include ActionView::Helpers,
16
+ ActionView::Helpers::CaptureHelper,
17
+ ActionView::Helpers::JavaScriptHelper,
18
+ ActionView::Helpers::AssetTagHelper,
19
+ ActionDispatch::Routing,
20
+ ActionView::Helpers::UrlHelper
21
+
22
+ # allow tabs.create to run by stubbing an output_buffer
23
+ attr_accessor :output_buffer
24
+ @output_buffer = ""
25
+
26
+ def request
27
+ Hashie::Mash.new :url => 'www.hello.com'
28
+ end
29
+
30
+ def link_to adr, *args
31
+ options = args.extract_options!
32
+ content_tag :a, adr, {:href => adr}.merge(options)
33
+ end
34
+
35
+ def controller
36
+ @controller ||= DummyController.new
37
+ end
38
+
39
+ def url_for adr, *args
40
+ "dummy/path/#{adr}/#{args}".html_safe
41
+ end
42
+
43
+ def _routes_context
44
+ controller
45
+ end
46
+
47
+ # stub content_for for testing
48
+ def content_for(name, content = nil, &block)
49
+ # this doesn't exist, and causes errors
50
+ @_content_for = {} unless defined? @_content_for
51
+ # we've got to initialize this, so we can concat to it
52
+ @_content_for[name] = '' if @_content_for[name].nil?
53
+ # now the rest is the same as in rails
54
+ content = capture(&block) if block_given?
55
+ @_content_for[name] << content if content
56
+ @_content_for[name] unless content
57
+ end
58
+ end
59
+ end
60
+ end
metadata ADDED
@@ -0,0 +1,171 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: social-buttons
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.6
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jeremy McAnally
9
+ - Yuva
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-08-26 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rails
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 3.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: 3.0.0
31
+ - !ruby/object:Gem::Dependency
32
+ name: rspec
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: 2.8.0
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: 2.8.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: rdoc
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '3.12'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '3.12'
63
+ - !ruby/object:Gem::Dependency
64
+ name: bundler
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: 1.0.0
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: 1.0.0
79
+ - !ruby/object:Gem::Dependency
80
+ name: jeweler
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ~>
85
+ - !ruby/object:Gem::Version
86
+ version: 1.8.4
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: 1.8.4
95
+ - !ruby/object:Gem::Dependency
96
+ name: simplecov
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0.5'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0.5'
111
+ description: Generate Social Buttons for your Rails apps
112
+ email: yuva@codemancers.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files:
116
+ - LICENSE
117
+ - README.md
118
+ files:
119
+ - .document
120
+ - .rspec
121
+ - CHANGELOG.md
122
+ - Gemfile
123
+ - Gemfile.lock
124
+ - LICENSE
125
+ - README.md
126
+ - Rakefile
127
+ - VERSION
128
+ - init.rb
129
+ - lib/social_buttons.rb
130
+ - lib/social_buttons/engine.rb
131
+ - lib/social_buttons/view_helper.rb
132
+ - lib/social_buttons/view_helpers/assistant.rb
133
+ - lib/social_buttons/view_helpers/google_plus.rb
134
+ - lib/social_buttons/view_helpers/google_plus/help.rb
135
+ - lib/social_buttons/view_helpers/like.rb
136
+ - lib/social_buttons/view_helpers/pinit.rb
137
+ - lib/social_buttons/view_helpers/scripter.rb
138
+ - lib/social_buttons/view_helpers/tweet.rb
139
+ - social-buttons.gemspec
140
+ - spec/social_buttons/config_spec.rb
141
+ - spec/social_buttons/google_plus_spec.rb
142
+ - spec/social_buttons/like_spec.rb
143
+ - spec/social_buttons/pinit_spec.rb
144
+ - spec/social_buttons/tweet_spec.rb
145
+ - spec/spec_helper.rb
146
+ - spec/view_helper_config.rb
147
+ homepage: https://github.com/iffyuva/social-buttons
148
+ licenses: []
149
+ post_install_message:
150
+ rdoc_options: []
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ required_rubygems_version: !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ requirements: []
166
+ rubyforge_project:
167
+ rubygems_version: 1.8.24
168
+ signing_key:
169
+ specification_version: 3
170
+ summary: Generate new Social Buttons
171
+ test_files: []