cachai 0.0.1 → 0.0.2

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.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/cachai.gemspec +2 -1
  3. data/db/schema.rb +1 -0
  4. data/lib/cachai.rb +39 -8
  5. metadata +16 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7d0befb3a839b4323421a53cd76689d3b17f631c
4
- data.tar.gz: 53f40303c117b425d195244f8b1fe541125dd505
3
+ metadata.gz: 30fc83e3066f50a0c604c9491d162620e656abe2
4
+ data.tar.gz: 230bbda6e5ea18c7423232aef1b77140684b6118
5
5
  SHA512:
6
- metadata.gz: 58bb54f64b485bf09c84db2afc4663640edb5e7e934508f377afe7c3bcecacff9ff9914e418bcb900fed6cafe07954bf57418964e6e0a723320151750bccc768
7
- data.tar.gz: bd4b23febe2c4e8c36b061aaa5f3d939287f335461b6b35d5ab7ca2055f2e681a1719b050a7ab41ebbe939a3787104b10b7a362a13890d46bce5420669cf64f6
6
+ metadata.gz: da12f0377d0f63859e1a11e7f634c4d4a3586360e077d7eb10b17919fe75b81a03da04d4b4c57d2d3a91d537bd519169f49815e041cb8bdcca794bdb3166faf1
7
+ data.tar.gz: 5274c7264da974acf125f72dae62f7c30256867dc9718e8117bfa5f354bf8ee122051ed9027472965b3be8f394f7f18e9b2154e33cf8c69992c21190e8701c97
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.0.1'
7
+ spec.version = '0.0.2'
8
8
  spec.authors = ["Tomás Pollak"]
9
9
  spec.email = ["tomas@forkhq.com"]
10
10
  spec.description = %q{Middleware for embedabble comments.}
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.add_development_dependency "bundler", "~> 1.3"
21
21
  spec.add_development_dependency "rspec", "~> 2.6"
22
22
 
23
+ spec.add_dependency "redis"
23
24
  spec.add_dependency "sinatra"
24
25
  spec.add_dependency "sinatra-activerecord"
25
26
  spec.add_dependency "sqlite3"
data/db/schema.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  # This file is auto-generated from the current state of the database. Instead
2
3
  # of editing this file, please use the migrations feature of Active Record to
3
4
  # incrementally modify your database, and then regenerate this schema definition.
data/lib/cachai.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'sinatra/base'
2
+ require 'redis'
2
3
  require 'json'
3
4
  require 'rake'
5
+
4
6
  require_relative 'comment'
5
7
  require_relative 'akismet'
6
8
 
@@ -11,6 +13,10 @@ module Cachai
11
13
  # set :database_file, "config/database.yml"
12
14
  # set :public_folder, File.join(settings.root, 'public')
13
15
  # set :protection, true
16
+ # set :logging, nil
17
+
18
+ # use Rack::CommonLogger, LOGGER
19
+ # use Rack::Static, :urls => %w(/css /img /js /favicon.ico), :root => 'public'
14
20
  use ActiveRecord::ConnectionAdapters::ConnectionManagement
15
21
 
16
22
  def initialize(app, opts = nil)
@@ -19,6 +25,9 @@ module Cachai
19
25
 
20
26
  load_schema unless schema_loaded?
21
27
 
28
+ redis_host = opts.delete(:redis_host) || 'localhost'
29
+ @redis = Redis.new(:host => redis_host)
30
+
22
31
  if key = opts.delete(:akismet_key)
23
32
  @akismet = Akismet.new(:api_key => key, :blog => "http://#{@domain}")
24
33
  else
@@ -32,18 +41,17 @@ module Cachai
32
41
  check_domain!(params[:domain])
33
42
 
34
43
  # puts "Comments for: #{params[:domain]}#{params[:path]}"
35
- list = get_comments(params[:path])
44
+ json_list = get_comments(params[:path])
36
45
 
37
46
  if params[:callback]
38
47
  content_type 'application/javascript'
39
- "#{params[:callback]}(#{list.to_json});"
48
+ "#{params[:callback]}(#{json_list});"
40
49
  else
41
50
  json(list)
42
51
  end
43
52
  end
44
53
 
45
54
  post '/comments.?:format?' do
46
-
47
55
  begin
48
56
  data = JSON.parse(request.body.read)
49
57
  check_domain!(data['domain'])
@@ -62,6 +70,8 @@ module Cachai
62
70
  }
63
71
 
64
72
  comment = Comment.create!(attrs)
73
+
74
+ @redis.del(redis_key(data['path']))
65
75
  json({ :status => 'ok', :comment => comment })
66
76
 
67
77
  rescue JSON::ParserError
@@ -73,9 +83,19 @@ module Cachai
73
83
 
74
84
  private
75
85
 
86
+ def set_cache(timestamp)
87
+ return if timestamp.nil?
88
+ last_modified timestamp
89
+ cache_control :public, :must_revalidate, :max_age => 60
90
+ end
91
+
92
+ def prevent_cache
93
+ cache_control :public, :no_cache, :no_store, :must_revalidate, :max_age => 0
94
+ # expires 1.year.ago
95
+ end
96
+
76
97
  def load_schema
77
98
  require 'sinatra/activerecord/rake'
78
- # Rake::Task['db:schema:load'].invoke
79
99
  require_relative '../db/schema.rb'
80
100
  end
81
101
 
@@ -83,7 +103,7 @@ module Cachai
83
103
  Comment.first
84
104
  true
85
105
  rescue ActiveRecord::StatementInvalid => e
86
- # SQLite3::SQLException => e
106
+ # SQLite3::SQLException => e
87
107
  # return !e.message['no such table']
88
108
  false
89
109
  end
@@ -98,11 +118,22 @@ module Cachai
98
118
 
99
119
  def json(obj)
100
120
  content_type 'application/json'
101
- obj.to_json
121
+ return obj.is_a?(String) ? obj : obj.to_json
122
+ end
123
+
124
+ def get_comments(path)
125
+ key = redis_key(path)
126
+ unless json_list = @redis.get(key)
127
+ puts "Not cached. Getting from DB: #{path}"
128
+ json_list = Comment.where({ :path => path }).to_json
129
+ @redis.set(key, json_list)
130
+ @redis.expire(key, 60 * 60) # one hour
131
+ end
132
+ json_list
102
133
  end
103
134
 
104
- def get_comments(document_path)
105
- Comment.where({ :path => document_path })
135
+ def redis_key(path)
136
+ "comments:#{@domain}:#{path}"
106
137
  end
107
138
 
108
139
  def is_spam?(data, link, request)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cachai
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomás Pollak
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: redis
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: sinatra
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -134,10 +148,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
148
  version: '0'
135
149
  requirements: []
136
150
  rubyforge_project:
137
- rubygems_version: 2.2.0
151
+ rubygems_version: 2.4.5
138
152
  signing_key:
139
153
  specification_version: 4
140
154
  summary: Middleware for embedabble comments.
141
155
  test_files:
142
156
  - test/app_test.rb
143
- has_rdoc: