nomo 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 = :"#{name}_page"
11
- page_cache_key_method = :"#{name}_page_cache_key"
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
- last_modified = Nomo.redis.get send(page_key_method)
17
- last_modified = Time.parse(last_modified) if last_modified
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
- Nomo.redis.set send(page_key_method), Time.now.utc.to_s
32
- end
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, options = {})
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
- after_create modify_page_method
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, options = {})
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).each do |record|
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
- after_create modify_pages_method
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
@@ -1,3 +1,3 @@
1
1
  module Nomo
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
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, 'nomo/model'
8
- autoload :Helpers, 'nomo/helpers'
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
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-04-27 00:00:00.000000000 Z
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: &70126712991120 !ruby/object:Gem::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: *70126712991120
24
+ version_requirements: *70213358089320
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: redis-namespace
27
- requirement: &70126712990680 !ruby/object:Gem::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: *70126712990680
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