ettu 0.0.3 → 0.0.4
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/README.md +41 -25
- data/lib/ettu/fresh_when.rb +2 -3
- data/lib/ettu/railtie.rb +21 -5
- data/lib/ettu/version.rb +2 -2
- data/lib/ettu.rb +81 -1
- metadata +1 -2
- data/lib/ettu/ettu.rb +0 -66
data/README.md
CHANGED
@@ -33,15 +33,15 @@ Rails 4 ETags can be used in the following way:
|
|
33
33
|
|
34
34
|
```ruby
|
35
35
|
class ProductsController < ApplicationController
|
36
|
-
|
37
|
-
|
36
|
+
def show
|
37
|
+
@product = Product.find(params[:id])
|
38
38
|
|
39
|
-
|
40
|
-
|
39
|
+
# Sugar syntax
|
40
|
+
fresh_when @product
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
42
|
+
# Hash syntax
|
43
|
+
fresh_when etag: @product, last_modified: @product.updated_at, public: true
|
44
|
+
end
|
45
45
|
end
|
46
46
|
```
|
47
47
|
|
@@ -53,23 +53,44 @@ browser.
|
|
53
53
|
|
54
54
|
### Configuring
|
55
55
|
|
56
|
-
|
57
|
-
|
56
|
+
Ettu can be disabled for any environment using the `ettu.disabled`
|
57
|
+
config option.
|
58
58
|
|
59
|
-
|
59
|
+
```ruby
|
60
|
+
# config/environments/*.rb
|
61
|
+
My::Application.configure do
|
62
|
+
config.ettu.disabled = true
|
63
|
+
end
|
64
|
+
```
|
60
65
|
|
61
|
-
|
66
|
+
Of course, you can override Ettu's default behavior:
|
62
67
|
|
63
|
-
|
68
|
+
```ruby
|
69
|
+
# config/initializers/ettu.rb
|
70
|
+
Ettu.configure do |config|
|
71
|
+
# Set the default js file
|
72
|
+
config.js = 'app.js'
|
73
|
+
# Or don't account for javascript
|
74
|
+
# config.js = false
|
75
|
+
|
76
|
+
# Set the default css file
|
77
|
+
config.css = 'style.css'
|
78
|
+
# Or don't account for css
|
79
|
+
# config.css = false
|
80
|
+
|
81
|
+
# Add in extra assets to account for
|
82
|
+
config.assets = ['first.js', 'second.css']
|
83
|
+
end
|
84
|
+
```
|
64
85
|
|
65
|
-
|
66
|
-
array with the `assets` key:
|
86
|
+
Or each can be passed on an individual basis:
|
67
87
|
|
68
|
-
fresh_when @product,
|
88
|
+
fresh_when @product, js: 'app.js', css: 'style.css', assets: 'super.css'
|
69
89
|
|
70
|
-
|
90
|
+
Additionally, you can specify a different template to calculate with the
|
91
|
+
`view` option:
|
71
92
|
|
72
|
-
fresh_when @product, "products/index"
|
93
|
+
fresh_when @product, view: "products/index"
|
73
94
|
|
74
95
|
You can even stop Ettu from accounting for any of them by setting the
|
75
96
|
value to `false`:
|
@@ -91,17 +112,12 @@ while in the **development** environment. This is not an issue that
|
|
91
112
|
affects staging or production, because the template cache will be
|
92
113
|
recreated after each deploy.
|
93
114
|
|
94
|
-
In the mean time, you can monkey-patch
|
115
|
+
In the mean time, you can enable a monkey-patch with:
|
95
116
|
|
96
117
|
```ruby
|
97
118
|
# config/environments/development.rb
|
98
|
-
|
99
|
-
|
100
|
-
end
|
101
|
-
module ActionView
|
102
|
-
class Digestor
|
103
|
-
@@cache = BlackHole.new
|
104
|
-
end
|
119
|
+
My::Application.configure do
|
120
|
+
config.ettu.development_hack = true
|
105
121
|
end
|
106
122
|
```
|
107
123
|
|
data/lib/ettu/fresh_when.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
class Ettu
|
2
2
|
module FreshWhen
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
@@ -17,8 +17,7 @@ module Ettu
|
|
17
17
|
etags << ettu.js_etag
|
18
18
|
etags << ettu.css_etag
|
19
19
|
end
|
20
|
-
|
21
|
-
etags.concat assets
|
20
|
+
etags.concat ettu.asset_etags
|
22
21
|
|
23
22
|
ettu_params = {etag: etags, last_modified: ettu.last_modified}
|
24
23
|
|
data/lib/ettu/railtie.rb
CHANGED
@@ -1,10 +1,26 @@
|
|
1
|
-
|
1
|
+
class Ettu
|
2
2
|
class Railtie < Rails::Railtie
|
3
|
-
|
4
|
-
|
3
|
+
config.ettu = ActiveSupport::OrderedOptions.new
|
4
|
+
|
5
|
+
initializer 'load' do |app|
|
6
|
+
|
7
|
+
unless app.config.ettu.disabled
|
8
|
+
require 'ettu'
|
9
|
+
ActiveSupport.on_load :action_controller do
|
10
|
+
ActionController::Base.send :include, FreshWhen
|
11
|
+
end
|
12
|
+
|
13
|
+
if app.config.ettu.development_hack
|
14
|
+
class BlackHole < Hash
|
15
|
+
def []=(k, v); end
|
16
|
+
end
|
17
|
+
module ::ActionView
|
18
|
+
class Digestor
|
19
|
+
@@cache = BlackHole.new
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
5
23
|
|
6
|
-
ActiveSupport.on_load :action_controller do
|
7
|
-
ActionController::Base.send :include, FreshWhen
|
8
24
|
end
|
9
25
|
end
|
10
26
|
end
|
data/lib/ettu/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION = '0.0.
|
1
|
+
class Ettu
|
2
|
+
VERSION = '0.0.4'
|
3
3
|
end
|
data/lib/ettu.rb
CHANGED
@@ -3,6 +3,86 @@ require 'active_support/core_ext/object/blank'
|
|
3
3
|
require 'active_support/core_ext/object/try'
|
4
4
|
|
5
5
|
require 'ettu/version'
|
6
|
-
require 'ettu/ettu'
|
7
6
|
require 'ettu/fresh_when'
|
8
7
|
require 'ettu/railtie' if defined? Rails
|
8
|
+
|
9
|
+
class Ettu
|
10
|
+
attr_reader :options
|
11
|
+
|
12
|
+
class << self
|
13
|
+
@@config = ActiveSupport::OrderedOptions.new
|
14
|
+
@@config.js = 'application.js'
|
15
|
+
@@config.css = 'application.css'
|
16
|
+
@@config.assets = []
|
17
|
+
|
18
|
+
def configure
|
19
|
+
yield @@config
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(record_or_options = nil, additional_options = {})
|
24
|
+
if record_or_options.is_a? Hash
|
25
|
+
@record = nil
|
26
|
+
@options = record_or_options
|
27
|
+
else
|
28
|
+
@record = record_or_options
|
29
|
+
@options = additional_options
|
30
|
+
end
|
31
|
+
@asset_etags = {}
|
32
|
+
end
|
33
|
+
|
34
|
+
def response_etag
|
35
|
+
@options.fetch(:etag, @record)
|
36
|
+
end
|
37
|
+
|
38
|
+
def last_modified
|
39
|
+
@options.fetch(:last_modified, @record.try(:updated_at))
|
40
|
+
end
|
41
|
+
|
42
|
+
def view_etag(view, format, lookup_context)
|
43
|
+
@view_etag ||= view_digest(view, format, lookup_context)
|
44
|
+
end
|
45
|
+
|
46
|
+
def js_etag
|
47
|
+
js = @options.fetch(:js, @@config.js)
|
48
|
+
asset_etag js
|
49
|
+
end
|
50
|
+
|
51
|
+
def css_etag
|
52
|
+
css = @options.fetch(:css, @@config.css)
|
53
|
+
asset_etag css
|
54
|
+
end
|
55
|
+
|
56
|
+
def asset_etags
|
57
|
+
assets = @config.fetch(:assets, @@config.assets)
|
58
|
+
[*assets].map { |asset| asset_etag(asset) }
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def asset_etag(asset)
|
64
|
+
@asset_etags[asset] ||= asset_digest(asset)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Jeremy Kemper
|
68
|
+
# https://gist.github.com/jeremy/4211803
|
69
|
+
def view_digest(view, format, lookup_context)
|
70
|
+
ActionView::Digestor.digest(
|
71
|
+
view,
|
72
|
+
format,
|
73
|
+
lookup_context
|
74
|
+
)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Jeremy Kemper
|
78
|
+
# https://gist.github.com/jeremy/4211803
|
79
|
+
# Check precompiled asset manifest (production) or compute the digest (dev).
|
80
|
+
def asset_digest(asset)
|
81
|
+
return nil unless asset.present?
|
82
|
+
if manifest = Rails.application.config.assets.digests
|
83
|
+
manifest[asset]
|
84
|
+
else
|
85
|
+
Rails.application.assets[asset].digest
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ettu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -91,7 +91,6 @@ files:
|
|
91
91
|
- Rakefile
|
92
92
|
- ettu.gemspec
|
93
93
|
- lib/ettu.rb
|
94
|
-
- lib/ettu/ettu.rb
|
95
94
|
- lib/ettu/fresh_when.rb
|
96
95
|
- lib/ettu/railtie.rb
|
97
96
|
- lib/ettu/version.rb
|
data/lib/ettu/ettu.rb
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
module Ettu
|
2
|
-
class Ettu
|
3
|
-
attr_reader :options
|
4
|
-
|
5
|
-
def initialize(record_or_options = nil, additional_options = {})
|
6
|
-
if record_or_options.is_a? Hash
|
7
|
-
@record = nil
|
8
|
-
@options = record_or_options
|
9
|
-
else
|
10
|
-
@record = record_or_options
|
11
|
-
@options = additional_options
|
12
|
-
end
|
13
|
-
@asset_etags = {}
|
14
|
-
end
|
15
|
-
|
16
|
-
def response_etag
|
17
|
-
@options.fetch(:etag, @record)
|
18
|
-
end
|
19
|
-
|
20
|
-
def last_modified
|
21
|
-
@options.fetch(:last_modified, @record.try(:updated_at))
|
22
|
-
end
|
23
|
-
|
24
|
-
def view_etag(view, format, lookup_context)
|
25
|
-
@view_etag ||= view_digest(view, format, lookup_context)
|
26
|
-
end
|
27
|
-
|
28
|
-
def asset_etag(asset)
|
29
|
-
@asset_etags[asset] ||= asset_digest(asset)
|
30
|
-
end
|
31
|
-
|
32
|
-
def js_etag
|
33
|
-
js = @options.fetch(:js, 'application.js')
|
34
|
-
asset_etag js
|
35
|
-
end
|
36
|
-
|
37
|
-
def css_etag
|
38
|
-
css = @options.fetch(:css, 'application.css')
|
39
|
-
asset_etag css
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
# Jeremy Kemper
|
45
|
-
# https://gist.github.com/jeremy/4211803
|
46
|
-
def view_digest(view, format, lookup_context)
|
47
|
-
ActionView::Digestor.digest(
|
48
|
-
view,
|
49
|
-
format,
|
50
|
-
lookup_context
|
51
|
-
)
|
52
|
-
end
|
53
|
-
|
54
|
-
# Jeremy Kemper
|
55
|
-
# https://gist.github.com/jeremy/4211803
|
56
|
-
# Check precompiled asset manifest (production) or compute the digest (dev).
|
57
|
-
def asset_digest(asset)
|
58
|
-
return nil unless asset.present?
|
59
|
-
if manifest = Rails.application.config.assets.digests
|
60
|
-
manifest[asset]
|
61
|
-
else
|
62
|
-
Rails.application.assets[asset].digest
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|