nomo 0.0.4 → 0.0.5
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/lib/nomo/conditional_get.rb +14 -0
- data/lib/nomo/model.rb +14 -35
- data/lib/nomo/page.rb +47 -0
- data/lib/nomo/rails/engine.rb +13 -0
- data/lib/nomo/version.rb +1 -1
- data/lib/nomo.rb +5 -2
- metadata +9 -6
@@ -0,0 +1,14 @@
|
|
1
|
+
module Nomo
|
2
|
+
module ConditionalGet
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
def fresh_when(record_or_options, additional_options = {})
|
6
|
+
if record_or_options.is_a? Nomo::Page
|
7
|
+
record_or_options = { etag: record_or_options.etag,
|
8
|
+
last_modified: record_or_options.last_modified }
|
9
|
+
end
|
10
|
+
|
11
|
+
super
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/nomo/model.rb
CHANGED
@@ -2,42 +2,23 @@ module Nomo
|
|
2
2
|
module Model
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
-
included do
|
6
|
-
end
|
7
|
-
|
8
5
|
module ClassMethods
|
9
|
-
def has_page(name)
|
10
|
-
page_method
|
11
|
-
|
12
|
-
modify_page_method = :"modify_#{name}_page!"
|
13
|
-
page_key_method = :"#{name}_page_key"
|
6
|
+
def has_page(name, options = {})
|
7
|
+
page_method = :"#{name}_page"
|
8
|
+
modify_page_method = :"modify_#{name}_page!"
|
14
9
|
|
15
10
|
define_method page_method do
|
16
|
-
|
17
|
-
|
18
|
-
last_modified = (last_modified && last_modified > updated_at) ? last_modified : updated_at
|
19
|
-
{
|
20
|
-
etag: Digest::MD5.hexdigest([ send(page_key_method), last_modified ].join('-')),
|
21
|
-
last_modified: last_modified
|
22
|
-
}
|
23
|
-
end
|
24
|
-
|
25
|
-
define_method page_cache_key_method do
|
26
|
-
page = send(page_method)
|
27
|
-
[ cache_key, page_method, page[:etag] ].join('/')
|
11
|
+
@nomo_pages ||= {}
|
12
|
+
@nomo_pages[name] ||= Nomo::Page.new(self, name, options)
|
28
13
|
end
|
29
14
|
|
30
15
|
define_method modify_page_method do
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
define_method page_key_method do
|
35
|
-
[ self.class.to_s.downcase, id, name ].join('-')
|
16
|
+
page = send(page_method)
|
17
|
+
page.modify!
|
36
18
|
end
|
37
|
-
private page_key_method
|
38
19
|
end
|
39
20
|
|
40
|
-
def modifies_page(association, name
|
21
|
+
def modifies_page(association, name)
|
41
22
|
modify_page_method = :"modify_#{association}_#{name}_page!"
|
42
23
|
|
43
24
|
define_method modify_page_method do
|
@@ -45,27 +26,25 @@ module Nomo
|
|
45
26
|
record.send(:"modify_#{name}_page!")
|
46
27
|
end
|
47
28
|
|
48
|
-
|
49
|
-
after_update modify_page_method
|
50
|
-
after_destroy modify_page_method
|
29
|
+
after_save modify_page_method
|
51
30
|
after_touch modify_page_method
|
31
|
+
after_destroy modify_page_method
|
52
32
|
end
|
53
33
|
|
54
|
-
def modifies_pages(association, name
|
34
|
+
def modifies_pages(association, name)
|
55
35
|
modify_pages_method = :"modify_#{association}_#{name}_pages!"
|
56
36
|
|
57
37
|
define_method modify_pages_method do
|
58
38
|
Nomo.redis.multi do
|
59
|
-
send(association)
|
39
|
+
for record in send(association)
|
60
40
|
record.send(:"modify_#{name}_page!")
|
61
41
|
end
|
62
42
|
end
|
63
43
|
end
|
64
44
|
|
65
|
-
|
66
|
-
after_update modify_pages_method
|
67
|
-
after_destroy modify_pages_method
|
45
|
+
after_save modify_pages_method
|
68
46
|
after_touch modify_pages_method
|
47
|
+
after_destroy modify_pages_method
|
69
48
|
end
|
70
49
|
end
|
71
50
|
end
|
data/lib/nomo/page.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
module Nomo
|
2
|
+
class Page
|
3
|
+
attr_reader :record
|
4
|
+
attr_reader :name
|
5
|
+
attr_reader :options
|
6
|
+
|
7
|
+
def initialize(record, name, options)
|
8
|
+
@record = record
|
9
|
+
@name = name
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def etag
|
14
|
+
parts = [key, last_modified]
|
15
|
+
Digest::MD5.hexdigest(parts.join('/'))
|
16
|
+
end
|
17
|
+
|
18
|
+
def last_modified
|
19
|
+
@last_modified ||= Time.parse(redis.get(key) || record.updated_at.to_s).utc
|
20
|
+
@last_modified < record.updated_at ? record.updated_at.utc : @last_modified
|
21
|
+
end
|
22
|
+
|
23
|
+
def modify!
|
24
|
+
@last_modified = Time.now.utc
|
25
|
+
redis.set(key, @last_modified.to_s)
|
26
|
+
end
|
27
|
+
|
28
|
+
def cache_key
|
29
|
+
parts = [record.cache_key, name, etag]
|
30
|
+
parts.join('/')
|
31
|
+
end
|
32
|
+
|
33
|
+
def key
|
34
|
+
unless @key
|
35
|
+
parts = [record.class.to_s.tableize, record.id, name]
|
36
|
+
@key = parts.join('/')
|
37
|
+
end
|
38
|
+
|
39
|
+
@key
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def redis
|
44
|
+
Nomo.redis
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Nomo
|
2
|
+
module Rails
|
3
|
+
class Engine < ::Rails::Engine
|
4
|
+
initializer "nomo.model" do
|
5
|
+
config.to_prepare { ActiveRecord::Base.send :include, Nomo::Model }
|
6
|
+
end
|
7
|
+
|
8
|
+
initializer "nomo.conditional_get" do
|
9
|
+
config.to_prepare { ApplicationController.send :include, Nomo::ConditionalGet }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/nomo/version.rb
CHANGED
data/lib/nomo.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
require 'nomo/version'
|
2
|
+
require 'nomo/rails/engine'
|
2
3
|
require 'redis/namespace'
|
3
4
|
|
4
5
|
module Nomo
|
5
6
|
extend self
|
6
7
|
|
7
|
-
autoload :Model,
|
8
|
-
autoload :
|
8
|
+
autoload :Model, 'nomo/model'
|
9
|
+
autoload :Page, 'nomo/page'
|
10
|
+
autoload :ConditionalGet, 'nomo/conditional_get'
|
11
|
+
autoload :Helpers, 'nomo/helpers'
|
9
12
|
|
10
13
|
##
|
11
14
|
# Accepts:
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nomo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-06-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: redis
|
16
|
-
requirement: &
|
16
|
+
requirement: &70213358089320 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70213358089320
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: redis-namespace
|
27
|
-
requirement: &
|
27
|
+
requirement: &70213358087980 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70213358087980
|
36
36
|
description: 304 Not Modified Headers made easy.
|
37
37
|
email:
|
38
38
|
- sausman@stackd.com
|
@@ -46,8 +46,11 @@ files:
|
|
46
46
|
- README.md
|
47
47
|
- Rakefile
|
48
48
|
- lib/nomo.rb
|
49
|
+
- lib/nomo/conditional_get.rb
|
49
50
|
- lib/nomo/helpers.rb
|
50
51
|
- lib/nomo/model.rb
|
52
|
+
- lib/nomo/page.rb
|
53
|
+
- lib/nomo/rails/engine.rb
|
51
54
|
- lib/nomo/version.rb
|
52
55
|
- nomo.gemspec
|
53
56
|
homepage: https://github.com/stackd/nomo
|