ideaoforder-acts_as_disqusable 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ .DS_Store
2
+ package
3
+ coverage
4
+ test/config.yml
5
+ docs
6
+ pkg
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 [name of plugin creator]
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/Manifest.txt ADDED
@@ -0,0 +1,38 @@
1
+ History.txt
2
+ MIT-LICENSE
3
+ Manifest.txt
4
+ README.rdoc
5
+ Rakefile
6
+ config/website.yml
7
+ disqus.gemspec
8
+ init.rb
9
+ lib/disqus.rb
10
+ lib/disqus/api.rb
11
+ lib/disqus/author.rb
12
+ lib/disqus/forum.rb
13
+ lib/disqus/post.rb
14
+ lib/disqus/thread.rb
15
+ lib/disqus/version.rb
16
+ lib/disqus/view_helpers.rb
17
+ lib/disqus/widget.rb
18
+ tasks/rcov.rake
19
+ test/api_test.rb
20
+ test/config.yml.sample
21
+ test/forum_test.rb
22
+ test/merb_test.rb
23
+ test/post_test.rb
24
+ test/rails_test.rb
25
+ test/responses/bad_api_key.json
26
+ test/responses/create_post.json
27
+ test/responses/get_forum_api_key.json
28
+ test/responses/get_forum_list.json
29
+ test/responses/get_num_posts.json
30
+ test/responses/get_thread_by_url.json
31
+ test/responses/get_thread_list.json
32
+ test/responses/get_thread_posts.json
33
+ test/responses/thread_by_identifier.json
34
+ test/responses/update_thread.json
35
+ test/test_helper.rb
36
+ test/thread_test.rb
37
+ test/view_helpers_test.rb
38
+ test/widget_test.rb
data/README.rdoc ADDED
@@ -0,0 +1,149 @@
1
+ == Acts-As-Disqusable Ruby Gem
2
+
3
+ The Acts-As-Disqusable Gem helps you easily integrate the {Disqus}[http://disqus.com]
4
+ commenting system into your website. It should work for any site programmed in Ruby.
5
+
6
+ It's a fork of Norman Clarke's Disqus Gem and incorporates Thomas Reynolds's DisqusParty changes (namely,
7
+ switching to HTTParty and using Jeweler for gem creation, as well as ditching the view helpers).
8
+
9
+ Disqus API support is "beta." Right now we're using API version 1.1.
10
+
11
+ === What is Disqus?
12
+
13
+ From the Disqus website:
14
+
15
+ "Disqus, pronounced "discuss", is a service and tool for web comments and
16
+ discussions. The Disqus comment system can be plugged into any website, blog,
17
+ or application. Disqus makes commenting easier and more interactive, while
18
+ connecting websites and commenters across a thriving discussion community."
19
+
20
+ "Disqus is a free service to the general public with absolutely no inline advertisements."
21
+
22
+ === Get it
23
+
24
+ gem install ideaoforder-acts_as_disqusable
25
+
26
+ === Use it:
27
+
28
+ # easy!
29
+ class YOUR_MODEL
30
+ acts_as_disqusable
31
+ end
32
+
33
+ # For multiple forums
34
+ class YOUR_MODEL
35
+ acts_as_disqusable, :forum_id => X, :forum_shortname => X, :forum_api_key => X
36
+ end
37
+
38
+ # with nonstandard DB fields
39
+ class YOUR_MODEL
40
+ # title, slug, and thread_id default to title, slug, and thread_id...surprise!
41
+ acts_as_disqusable, :title_column => 'name',
42
+ :slug_column => 'permalink',
43
+ :thread_id => 'your_mom',
44
+ :prefix => false # this defaults to the associated controller
45
+ # so Post would create a link like: '/posts/slug/
46
+ # you can set this to false for just: '/slug'
47
+ # or to a different path: '/blog/slug'
48
+ end
49
+
50
+ OPTIONAL:
51
+ You should create a :thread_id field in the database for each model
52
+ that is disqusable. This will result in fewer requests to Disqus.
53
+ Everything but YOUR_MODEL.comment_count() should work without it.
54
+
55
+ ==== Configure it:
56
+
57
+ ===== Example - This goes in config/disqus.yml:
58
+ - :api_key: YOUR_API_KEY
59
+ - :account: YOUR_ACCOUNT_NAME
60
+ - :developer: true or false
61
+
62
+ If you're only connecting 1 forum to your site:
63
+
64
+ - :forum_api_key: YOUR_FORUM_API_KEY
65
+ - :forum_id: YOUR_FORUM_ID
66
+ - :forum_shortname: YOUR_FORUM_SHORTNAME
67
+
68
+ Otherwise, the forum info goes in the model that's disqusable.
69
+ You could use a different forum for each model.
70
+ It would be better to use the new category feature, however.
71
+ Sadly, I haven't had time to program that yet.
72
+
73
+ ===== Options
74
+
75
+ :api_key => "" # your api key
76
+ :account => "", # your disqus account
77
+ :developer => false, # allows for threads to work on localhost if set to true
78
+ :container_id => 'disqus_thread', # desired thread container
79
+ :avatar_size => 48, # squared pixel size of avatars
80
+ :num_items => 5, # number of comments to display / this is just the default
81
+ :forum_api_key => "" # your forum api key
82
+ :forum_id => "" # your forum id
83
+ :forum_shortname => "" # your forum shortname
84
+
85
+ ==== To get your forum info, in the console:
86
+
87
+ f = Disqus::Forum.all
88
+
89
+ # find your forum, let's say it's the first
90
+
91
+ f.first.id
92
+ f.first.key
93
+ f.first.shortname
94
+
95
+ ==== So:
96
+
97
+ Let's say Post are disqusable.
98
+
99
+ Then
100
+
101
+ Post.comments(:limit => 5, :exclude => 'spam') # class level
102
+
103
+ Will grab the 5 most recent non-spam comments. The default
104
+ limit and exclude are 5 and 'spam'.
105
+
106
+ @post.comments
107
+
108
+ Will grab the comments for a post.
109
+
110
+ @post.comment_count
111
+
112
+ Will grab the number of comments for a given post.
113
+
114
+ @post.comment_form
115
+
116
+ Will create a comment form appropriate to the @post. This still uses the
117
+ older javascript form.
118
+
119
+ ==== There are lots of other options for Threads/Forums etc.
120
+
121
+
122
+ ==== Work with the Disqus API:
123
+
124
+ See the Disqus::Api class for more info on the Disqus API. You can also read
125
+ the {Disqus developer info here}[http://disqus.com/docs/api/].
126
+
127
+ === Hack it:
128
+
129
+ Github repository:
130
+
131
+ http://github.com/ideaoforder/acts_as_disqusable/
132
+
133
+ === Learn more about Disqus:
134
+
135
+ {http://disqus.com}[http://disqus.com]
136
+
137
+ === Thanks to the following contributors:
138
+ * {Thomas Reynolds}[http://github.com/tdreyno] - DisqusParty Gem
139
+ * {Norman Clarke}[http://github.com/norman] - Disqus Gem
140
+ * {Matt Van Horn}[http://github.com/mattvanhorn] - Disqus API
141
+
142
+ === Legal Stuff
143
+
144
+ The Disqus Ruby gem was not created by, nor is officially supported by
145
+ Disqus.com or Big Head Labs, Inc. Use it at your own risk and your own
146
+ responsibility under the terms of the MIT License.
147
+
148
+ Copyright (c) 2008 {Mark Dickson}[mailto:mark@sitesteaders.com], released under
149
+ the MIT license
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ begin
2
+ require 'jeweler'
3
+ Jeweler::Tasks.new do |gemspec|
4
+ gemspec.name = "acts_as_disqusable"
5
+ gemspec.summary = "Uses the Disqus API to make model(s) comment-on-able"
6
+ gemspec.description = "Uses the Disqus API to make model(s) comment-on-able"
7
+ gemspec.email = "mark@sitesteaders.com"
8
+ gemspec.homepage = "http://github.com/ideaoforder/disqus"
9
+ gemspec.authors = ["Mark Dickson", "Thomas Reynolds", "Norman Clarke", "Matthew Van Horn"]
10
+ gemspec.add_dependency('httparty', '>= 0.4.4')
11
+ end
12
+ rescue LoadError
13
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
14
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.4.0
@@ -0,0 +1,80 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{acts_as_disqusable}
5
+ s.version = "0.4.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Mark Dickson", "Thomas Reynolds", "Norman Clarke", "Matthew Van Horn"]
9
+ s.date = %q{2009-08-05}
10
+ s.description = %q{Uses the Disqus API to make model(s) comment-on-able}
11
+ s.email = %q{mark@sitesteaders.com}
12
+ s.extra_rdoc_files = [
13
+ "README.rdoc"
14
+ ]
15
+ s.files = [
16
+ ".gitignore",
17
+ "MIT-LICENSE",
18
+ "Manifest.txt",
19
+ "README.rdoc",
20
+ "Rakefile",
21
+ "VERSION",
22
+ "acts_as_disqusable.gemspec",
23
+ "lib/acts_as_disqusable.rb",
24
+ "lib/acts_as_disqusable/author.rb",
25
+ "lib/acts_as_disqusable/forum.rb",
26
+ "lib/acts_as_disqusable/post.rb",
27
+ "lib/acts_as_disqusable/thread.rb",
28
+ "lib/disqus.rb",
29
+ "tasks/rcov.rake",
30
+ "test/api_test.rb",
31
+ "test/config.yml.sample",
32
+ "test/forum_test.rb",
33
+ "test/merb_test.rb",
34
+ "test/post_test.rb",
35
+ "test/rails_test.rb",
36
+ "test/responses/bad_api_key.json",
37
+ "test/responses/create_post.json",
38
+ "test/responses/get_forum_api_key.json",
39
+ "test/responses/get_forum_list.json",
40
+ "test/responses/get_num_posts.json",
41
+ "test/responses/get_thread_by_url.json",
42
+ "test/responses/get_thread_list.json",
43
+ "test/responses/get_thread_posts.json",
44
+ "test/responses/thread_by_identifier.json",
45
+ "test/responses/update_thread.json",
46
+ "test/test_helper.rb",
47
+ "test/thread_test.rb",
48
+ "test/view_helpers_test.rb",
49
+ "test/widget_test.rb"
50
+ ]
51
+ s.homepage = %q{http://github.com/ideaoforder/disqus}
52
+ s.rdoc_options = ["--charset=UTF-8"]
53
+ s.require_paths = ["lib"]
54
+ s.rubygems_version = %q{1.3.5}
55
+ s.summary = %q{Uses the Disqus API to make model(s) comment-on-able}
56
+ s.test_files = [
57
+ "test/merb_test.rb",
58
+ "test/view_helpers_test.rb",
59
+ "test/widget_test.rb",
60
+ "test/api_test.rb",
61
+ "test/post_test.rb",
62
+ "test/thread_test.rb",
63
+ "test/rails_test.rb",
64
+ "test/forum_test.rb",
65
+ "test/test_helper.rb"
66
+ ]
67
+
68
+ if s.respond_to? :specification_version then
69
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
70
+ s.specification_version = 3
71
+
72
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
73
+ s.add_runtime_dependency(%q<httparty>, [">= 0.4.4"])
74
+ else
75
+ s.add_dependency(%q<httparty>, [">= 0.4.4"])
76
+ end
77
+ else
78
+ s.add_dependency(%q<httparty>, [">= 0.4.4"])
79
+ end
80
+ end
@@ -0,0 +1,155 @@
1
+ module ActiveRecord #:nodoc:
2
+ module Acts #:nodoc:
3
+ module Disqusable #:nodoc:
4
+ require 'disqus'
5
+
6
+ def self.included(base)
7
+ base.extend(ClassMethods)
8
+ end
9
+
10
+ module ClassMethods
11
+ # Macro that adds theme for object
12
+ def acts_as_disqusable(options = {})
13
+ @@configuration = YAML::load(File.open("#{RAILS_ROOT}/config/disqus.yml"))
14
+ @@configuration.update(options) if options.is_a?(Hash)
15
+ include ActiveRecord::Acts::Disqusable::InstanceMethods
16
+
17
+ after_create :create_thread
18
+
19
+ def thread_column
20
+ @@configuration[:thread_column] || 'thread_id'
21
+ end
22
+
23
+ def title_column
24
+ @@configuration[:title_column] || 'title'
25
+ end
26
+
27
+ def slug_column
28
+ @@configuration[:slug_column] || 'slug'
29
+ end
30
+
31
+ def prefix
32
+ if @@configuration[:prefix].nil?
33
+ return self.to_s.downcase + '-'
34
+ elsif @@configuration[:prefix]
35
+ return @@configuration[:prefix] + '-'
36
+ else
37
+ return ''
38
+ end
39
+ end
40
+
41
+ def forum_id
42
+ @@configuration[:forum_id].to_s || nil
43
+ end
44
+
45
+ def forum_api_key
46
+ @@configuration[:forum_api_key] || nil
47
+ end
48
+
49
+ def forum_shortname
50
+ @@configuration[:forum_shortname] || nil
51
+ end
52
+
53
+ def threads
54
+ Disqus::Forum.find(self.forum_id).threads
55
+ end
56
+
57
+ def find_thread_by_url(url)
58
+ Disqus::Forum.get_thread_by_url(url, self.forum_api_key)
59
+ end
60
+
61
+ def comment_count(ids={})
62
+ if self.column_names.include? self.thread_column
63
+ if !ids.is_a? Hash
64
+ c = "id IN (" + ids.join(',')+ ")"
65
+ else
66
+ c = nil
67
+ end
68
+ thread_ids = Post.all(:conditions => c, :select => :thread_id).collect(&:thread_id).compact.join(',')
69
+ if thread_ids.length > 0
70
+ Disqus::Forum.posts_count(thread_ids, self.forum_api_key)
71
+ else
72
+ Hash.new
73
+ end
74
+ else
75
+ 'This operation is not supported without a thread_column.'
76
+ end
77
+ end
78
+
79
+ # limit — Number of entries that should be included in the response. Default is 25.
80
+ # start — Starting point for the query. Default is 0.
81
+ # filter — Type of entries that should be returned (new, spam or killed).
82
+ # exclude — Type of entries that should be excluded from the response (new, spam or killed).
83
+ def comments(opts={})
84
+ Disqus::Forum.posts(self.forum_api_key, opts)
85
+ end
86
+
87
+ def comment_permalink(comment, opts={})
88
+ title = comment.thread['title']
89
+ if comment.thread['url']
90
+ permalink = comment.thread['url']
91
+ else
92
+ url = comment.thread['identifier'].first.sub(self.prefix, '')
93
+ path = opts[:path] || self.to_s.pluralize.downcase
94
+ permalink = "/#{path}/#{url}"
95
+ end
96
+ return "<a href=\"#{permalink}\" class=\"#{opts[:class]}\" title=\"#{opts[:title]}\">#{title}</a>"
97
+ end
98
+ end
99
+ end
100
+
101
+ module InstanceMethods
102
+ def thread_identifier
103
+ self.class.prefix + self.send(self.class.slug_column)
104
+ end
105
+
106
+ def thread
107
+ Disqus::Thread.find_or_create(self.send(self.class.title_column), self.thread_identifier)
108
+ end
109
+
110
+ # limit — Number of entries that should be included in the response. Default is 25.
111
+ # start — Starting point for the query. Default is 0.
112
+ # filter — Type of entries that should be returned (new, spam or killed).
113
+ # exclude — Type of entries that should be excluded from the response (new, spam or killed).
114
+ def comments(opts={})
115
+ if self.respond_to? self.class.thread_column and self.send(self.class.thread_column)
116
+ Disqus::Thread.posts(self.send(self.class.thread_column), opts)
117
+ else # two separate calls
118
+ Disqus::Thread.find_or_create(title, slug).posts(opts)
119
+ end
120
+ end
121
+
122
+ def comment_count
123
+ if self.respond_to? self.class.thread_column and self.send(self.class.thread_column)
124
+ Disqus::Forum.posts_count(self.send(self.class.thread_column), self.class.forum_api_key)
125
+ else # two separate calls
126
+ Disqus::Thread.find_or_create(title, slug).posts_count
127
+ end
128
+ end
129
+
130
+ def comment_form
131
+ forum_shortname = self.class.forum_shortname
132
+ thread_indentifier = self.thread_identifier
133
+ url = 'http://disqus.com/api/reply.js?' +
134
+ "forum_shortname=#{forum_shortname}&" +
135
+ "thread_identifier=#{thread_identifier}"
136
+ s = '<div id="dsq-reply">'
137
+ s << '<script type="text/javascript" src="%s"></script>' % url
138
+ s << '</div>'
139
+ return s
140
+ end
141
+
142
+ private
143
+ def create_thread
144
+ t = Disqus::Thread.find_or_create(self.send(self.class.title_column), self.thread_identifier)
145
+ if self.respond_to? self.class.thread_column
146
+ self.write_attribute(self.class.thread_column, t.id)
147
+ self.save
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
154
+
155
+ ActiveRecord::Base.send(:include, ActiveRecord::Acts::Disqusable)