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.
@@ -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