cachai 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +105 -20
- data/cachai.gemspec +1 -1
- data/lib/cachai.rb +10 -39
- data/lib/models.rb +36 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e22e87617ddb5c31c0323caa1669a6c6f113e22c
|
4
|
+
data.tar.gz: 4600b981f67a035759bf840cdb087e6d47250457
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f172f5bd47ce928fe0b021c14a37e36ae2f4b93cbe726dbd7f24fa55f60922278574ac0345bed005a7ce27a6541eca6175df45cd71b326c485448c17a8fff1cc
|
7
|
+
data.tar.gz: 384a50e683f10c8bcc632de7460789562e046dfcbc2fa2697a0ecb3b96bb232ac29f14f3ef761cbba449c463d1d0868b03893e0c4b85708e7f3045341f17442a
|
data/README.md
CHANGED
@@ -1,26 +1,111 @@
|
|
1
|
-
#
|
1
|
+
# Cachai
|
2
2
|
|
3
|
-
|
3
|
+
A clean way to add support for comments and pingbacks in your Rack app. Si pos weon.
|
4
4
|
|
5
|
-
##
|
6
|
-
* Edit `config/production.yml` to add your site. Specify a name and the domain where the site will be hosted. Example configuration will be like this:
|
5
|
+
## Setting up
|
7
6
|
|
8
|
-
|
9
|
-
name: Blog
|
10
|
-
domain: blog.sdqali.in
|
11
|
-
```
|
7
|
+
First you need to create a config/database.yml file, as you'd have on a regular Rails app, or if using Sinatra::ActiveRecord.
|
12
8
|
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
# database.yml
|
10
|
+
development:
|
11
|
+
adapter: sqlite3
|
12
|
+
database: db/development.sqlite3
|
13
|
+
pool: 16
|
16
14
|
|
17
|
-
|
18
|
-
<script type="text/javascript" src="<server>/jquery-1.10.2.min.js"></script>
|
19
|
-
<script type="text/javascript" src="<server>//commentary.js"></script>
|
20
|
-
<script type="text/javascript">
|
21
|
-
$(document).ready(function() {
|
22
|
-
Commentary.initialize("<server>", "<selector>");
|
23
|
-
});
|
24
|
-
</script>
|
15
|
+
Now insert the middleware before the app, either in your rackup file or in the app itself. We'll go with method one.
|
25
16
|
|
26
|
-
|
17
|
+
# rackup.ru
|
18
|
+
require 'sinatra'
|
19
|
+
require 'cachai'
|
20
|
+
|
21
|
+
map '/' do
|
22
|
+
use Cachai::Middleware, { domain: 'yourdomain.com' }
|
23
|
+
run Sinatra::Application
|
24
|
+
end
|
25
|
+
|
26
|
+
Now, the next time the app is loaded, Cachai will set up the necessary tables in the database provided. Basically a `posts` table and a `responses` one.
|
27
|
+
|
28
|
+
## Posting new comments
|
29
|
+
|
30
|
+
Now, to send our first comment to Cachai, let's insert a form within your blog post view.
|
31
|
+
|
32
|
+
# views/blog/post.erb (or something like it)
|
33
|
+
|
34
|
+
...
|
35
|
+
|
36
|
+
<form action="/comments" method="post" id="comment-form">
|
37
|
+
<input type="hidden" name="url" value="http://yourdomain.com/path/to/your/blog/post" />
|
38
|
+
<input type="text" name="author_name" />
|
39
|
+
<input type="email" name="author_email" />
|
40
|
+
<input type="text" name="author_url" />
|
41
|
+
<textarea name="content"></textarea>
|
42
|
+
</form>
|
43
|
+
|
44
|
+
Now load your app and try submitting a comment. It should work.
|
45
|
+
|
46
|
+
## Posting comment using AJAX
|
47
|
+
|
48
|
+
Using Javascript, you'd do something like this:
|
49
|
+
|
50
|
+
// app.js
|
51
|
+
|
52
|
+
$(function() {
|
53
|
+
|
54
|
+
$('#comment-form').on('submit', function(e) {
|
55
|
+
e.preventDefault();
|
56
|
+
|
57
|
+
var data = {
|
58
|
+
author_name : this.author_name.value,
|
59
|
+
author_email : this.author_email.value,
|
60
|
+
author_url : this.author_url.value,
|
61
|
+
content : this.content.value,
|
62
|
+
protocol : window.location.protocol,
|
63
|
+
domain : 'yourdomain.com',
|
64
|
+
path : encodeURI(window.location.pathname)
|
65
|
+
}
|
66
|
+
|
67
|
+
$.ajax({
|
68
|
+
type : 'post',
|
69
|
+
data : JSON.stringify(data),
|
70
|
+
url : '/comments.json',
|
71
|
+
success : function() { alert('Thanks!') },
|
72
|
+
error : function() { alert('Oh rats. Try again please.') },
|
73
|
+
})
|
74
|
+
})
|
75
|
+
|
76
|
+
})
|
77
|
+
|
78
|
+
## Reading comments via AJAX
|
79
|
+
|
80
|
+
You get them using GET /comments.json.
|
81
|
+
|
82
|
+
// app.js
|
83
|
+
|
84
|
+
var domain = 'yourdomain.com',
|
85
|
+
path = encodeURI(window.location.pathname),
|
86
|
+
url = '/comments.json?callback=?&domain=' + domain + '&path=' + path;
|
87
|
+
|
88
|
+
$.ajax({
|
89
|
+
dataType : 'json',
|
90
|
+
url : url,
|
91
|
+
success : function(list) { /* render comments */ }),
|
92
|
+
error : function(err) { alert('Damn!') }
|
93
|
+
});
|
94
|
+
}
|
95
|
+
|
96
|
+
Or if you wish to insert them in the view itself.
|
97
|
+
|
98
|
+
# views/blog/post.erb
|
99
|
+
|
100
|
+
<ul id="comments">
|
101
|
+
<% Cachai.get_comments_for(@post.url).each do |comment| %>
|
102
|
+
<li>
|
103
|
+
<strong><%= comment.author_name %></strong>
|
104
|
+
<strong><%= simple_format(comment.content) %></strong>
|
105
|
+
</li>
|
106
|
+
<% end %>
|
107
|
+
</ul>
|
108
|
+
|
109
|
+
# Small print.
|
110
|
+
|
111
|
+
(c) 2016 Tomas Pollak. MIT Licensed.
|
data/cachai.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "cachai"
|
7
|
-
spec.version = '0.
|
7
|
+
spec.version = '0.2.0'
|
8
8
|
spec.authors = ["Tomás Pollak"]
|
9
9
|
spec.email = ["tomas@forkhq.com"]
|
10
10
|
spec.description = %q{Middleware for embedabble comments.}
|
data/lib/cachai.rb
CHANGED
@@ -56,7 +56,7 @@ module Cachai
|
|
56
56
|
check_domain!(params[:domain])
|
57
57
|
|
58
58
|
# puts "Comments for: #{params[:domain]}#{params[:path]}"
|
59
|
-
json_list =
|
59
|
+
json_list = Cachai.get_comments_for(params[:path], params[:nocache])
|
60
60
|
|
61
61
|
if params[:callback]
|
62
62
|
content_type 'application/javascript'
|
@@ -68,9 +68,16 @@ module Cachai
|
|
68
68
|
|
69
69
|
post '/comments.?:format?' do
|
70
70
|
begin
|
71
|
-
data = JSON.parse(request.body.read)
|
72
|
-
|
71
|
+
data = params[:format] == 'json' ? JSON.parse(request.body.read) : params
|
72
|
+
|
73
|
+
if data[:url] # got single URL with protocol://domain/path
|
74
|
+
url = URI.parse(data)
|
75
|
+
data['domain'] = url.host
|
76
|
+
data['protocol'] = url.schema
|
77
|
+
data['path'] = url.path
|
78
|
+
end
|
73
79
|
|
80
|
+
check_domain!(data['domain'])
|
74
81
|
halt(400, "Missing params") if data['protocol'].blank? or data['path'].blank?
|
75
82
|
|
76
83
|
headers['Access-Control-Allow-Origin'] = data['protocol'] + '//' + data['domain']
|
@@ -132,42 +139,6 @@ module Cachai
|
|
132
139
|
return obj.is_a?(String) ? obj : obj.to_json
|
133
140
|
end
|
134
141
|
|
135
|
-
def get_comments(path, nocache = false)
|
136
|
-
key = Cachai.key_for(path)
|
137
|
-
|
138
|
-
unless !nocache && json_list = Cachai.cache.get(key)
|
139
|
-
puts "Not cached. Getting from DB: #{path}"
|
140
|
-
|
141
|
-
if post = Post.find_by_path(path)
|
142
|
-
json_list = get_and_sort_comments_for(post).to_json
|
143
|
-
else
|
144
|
-
json_list = '[]'
|
145
|
-
end
|
146
|
-
|
147
|
-
Cachai.cache.set(key, json_list)
|
148
|
-
Cachai.cache.expire(key, CACHE_MINUTES)
|
149
|
-
end
|
150
|
-
|
151
|
-
json_list
|
152
|
-
end
|
153
|
-
|
154
|
-
def get_and_sort_comments_for(post)
|
155
|
-
result = []
|
156
|
-
top_level = post.responses.comment.approved.top_level
|
157
|
-
nested = post.responses.comment.approved.nested
|
158
|
-
|
159
|
-
top_level.each_with_index do |comment, i|
|
160
|
-
obj = comment.as_json
|
161
|
-
children = nested.select do |nested|
|
162
|
-
nested.parent_id == comment.id
|
163
|
-
end
|
164
|
-
obj.merge!(:children => children) if children.any?
|
165
|
-
result.push(obj)
|
166
|
-
end
|
167
|
-
|
168
|
-
result
|
169
|
-
end
|
170
|
-
|
171
142
|
def is_spam?(data, link, request)
|
172
143
|
return false unless @akismet
|
173
144
|
# return true if blacklisted?(name, email, content)
|
data/lib/models.rb
CHANGED
@@ -52,6 +52,42 @@ module Cachai
|
|
52
52
|
"comments:#{@domain}:#{path}"
|
53
53
|
end
|
54
54
|
|
55
|
+
def self.get_comments_for(path, nocache = false)
|
56
|
+
key = key_for(path)
|
57
|
+
|
58
|
+
unless !nocache && json_list = cache.get(key)
|
59
|
+
# puts "Not cached. Getting from DB: #{path}"
|
60
|
+
|
61
|
+
if post = Post.find_by_path(path)
|
62
|
+
json_list = get_and_sort_comments_for(post).to_json
|
63
|
+
else
|
64
|
+
json_list = '[]'
|
65
|
+
end
|
66
|
+
|
67
|
+
cache.set(key, json_list)
|
68
|
+
cache.expire(key, CACHE_MINUTES)
|
69
|
+
end
|
70
|
+
|
71
|
+
json_list
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.get_and_sort_comments_for(post)
|
75
|
+
result = []
|
76
|
+
top_level = post.responses.comment.approved.top_level
|
77
|
+
nested = post.responses.comment.approved.nested
|
78
|
+
|
79
|
+
top_level.each_with_index do |comment, i|
|
80
|
+
obj = comment.as_json
|
81
|
+
children = nested.select do |nested|
|
82
|
+
nested.parent_id == comment.id
|
83
|
+
end
|
84
|
+
obj.merge!(:children => children) if children.any?
|
85
|
+
result.push(obj)
|
86
|
+
end
|
87
|
+
|
88
|
+
result
|
89
|
+
end
|
90
|
+
|
55
91
|
class Post < ActiveRecord::Base
|
56
92
|
has_many :responses
|
57
93
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cachai
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomás Pollak
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|