locomotive_cms 0.0.2.8 → 0.0.2.9
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/app/helpers/admin/pages_helper.rb +7 -6
- data/app/models/extensions/page/tree.rb +1 -7
- data/app/models/page.rb +5 -5
- data/app/views/admin/pages/_form.html.haml +1 -1
- data/app/views/admin/sessions/new.html.haml +2 -0
- data/config/locales/admin_ui_en.yml +5 -5
- data/config/locales/admin_ui_fr.yml +4 -3
- data/config/locales/default_fr.yml +1 -1
- data/lib/core_ext.rb +30 -0
- data/lib/locomotive/httparty/webservice.rb +2 -1
- data/lib/locomotive/render.rb +11 -3
- data/spec/lib/core_ext_spec.rb +37 -0
- data/spec/lib/locomotive/render_spec.rb +16 -8
- data/spec/models/page_spec.rb +5 -0
- data/spec/support/locomotive.rb +5 -11
- metadata +4 -3
@@ -20,13 +20,14 @@ module Admin::PagesHelper
|
|
20
20
|
list
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
23
|
+
def options_for_page_cache_strategy
|
24
24
|
[
|
25
|
-
[t('.
|
26
|
-
[t('.
|
27
|
-
[t('.
|
28
|
-
[t('.
|
29
|
-
[t('.
|
25
|
+
[t('.cache_strategy.none'), 'none'],
|
26
|
+
[t('.cache_strategy.simple'), 'simple'],
|
27
|
+
[t('.cache_strategy.hour'), 1.hour.to_s],
|
28
|
+
[t('.cache_strategy.day'), 1.day.to_s],
|
29
|
+
[t('.cache_strategy.week'), 1.week.to_s],
|
30
|
+
[t('.cache_strategy.month'), 1.month.to_s]
|
30
31
|
]
|
31
32
|
end
|
32
33
|
|
@@ -23,7 +23,6 @@ module Models
|
|
23
23
|
before_destroy :remove_from_list
|
24
24
|
|
25
25
|
# Fixme (Didier L.): Instances methods are defined before the include itself
|
26
|
-
alias :ancestors :hacked_ancestors
|
27
26
|
alias :fix_position :hacked_fix_position
|
28
27
|
end
|
29
28
|
|
@@ -42,12 +41,7 @@ module Models
|
|
42
41
|
self.fix_position(false)
|
43
42
|
self.instance_variable_set :@_will_move, true
|
44
43
|
end
|
45
|
-
|
46
|
-
def hacked_ancestors
|
47
|
-
return [] if root?
|
48
|
-
self.class.find(self.path.clone << nil) # bug in mongoid (it does not handle array with one element)
|
49
|
-
end
|
50
|
-
|
44
|
+
|
51
45
|
protected
|
52
46
|
|
53
47
|
def change_parent
|
data/app/models/page.rb
CHANGED
@@ -12,7 +12,7 @@ class Page
|
|
12
12
|
field :slug
|
13
13
|
field :fullpath
|
14
14
|
field :published, :type => Boolean, :default => false
|
15
|
-
field :
|
15
|
+
field :cache_strategy, :default => 'none'
|
16
16
|
|
17
17
|
## associations ##
|
18
18
|
belongs_to_related :site
|
@@ -35,7 +35,6 @@ class Page
|
|
35
35
|
named_scope :not_found, :where => { :slug => '404', :depth => 0, :published => true }
|
36
36
|
|
37
37
|
## behaviours ##
|
38
|
-
# liquid_methods :title, :fullpath
|
39
38
|
liquify_template :joined_parts
|
40
39
|
|
41
40
|
## methods ##
|
@@ -66,6 +65,10 @@ class Page
|
|
66
65
|
"http://#{self.site.domains.first}/#{self.fullpath}.html"
|
67
66
|
end
|
68
67
|
|
68
|
+
def with_cache?
|
69
|
+
self.cache_strategy != 'none'
|
70
|
+
end
|
71
|
+
|
69
72
|
def to_liquid(options = {})
|
70
73
|
Locomotive::Liquid::Drops::Page.new(self)
|
71
74
|
end
|
@@ -73,9 +76,6 @@ class Page
|
|
73
76
|
protected
|
74
77
|
|
75
78
|
def do_not_remove_index_and_404_pages
|
76
|
-
# safe_site = self.site rescue nil
|
77
|
-
|
78
|
-
# return if safe_site.nil?
|
79
79
|
return if (self.site rescue nil).nil?
|
80
80
|
|
81
81
|
if self.index? || self.not_found?
|
@@ -16,7 +16,7 @@
|
|
16
16
|
= f.custom_input :published, :css => 'toggle' do
|
17
17
|
= f.check_box :published
|
18
18
|
|
19
|
-
= f.input :
|
19
|
+
= f.input :cache_strategy, :as => :select, :collection => options_for_page_cache_strategy, :include_blank => false
|
20
20
|
|
21
21
|
#page-parts
|
22
22
|
.nav
|
@@ -25,8 +25,7 @@ en:
|
|
25
25
|
site: Site
|
26
26
|
theme_assets: Theme files
|
27
27
|
footer:
|
28
|
-
|
29
|
-
powered_by: and Powered by
|
28
|
+
who_is_behind: "Service developed by {{development}} and designed by <a href=\"http://www.sachagreif.com\">Sacha Greif</a>"
|
30
29
|
form_actions:
|
31
30
|
back: Back without saving
|
32
31
|
create: Create
|
@@ -97,8 +96,9 @@ en:
|
|
97
96
|
failed_create: "Page was not created."
|
98
97
|
failed_update: "Page was not updated."
|
99
98
|
form:
|
100
|
-
|
101
|
-
|
99
|
+
cache_strategy:
|
100
|
+
none: None
|
101
|
+
simple: Simple
|
102
102
|
hour: 1 hour
|
103
103
|
day: 1 day
|
104
104
|
week: 1 week
|
@@ -331,7 +331,7 @@ en:
|
|
331
331
|
hints:
|
332
332
|
page:
|
333
333
|
published: "Only authenticated accounts can view unpublished pages."
|
334
|
-
|
334
|
+
cache_strategy: "Cache the page for better performance. The 'Simple' choice is a good compromise."
|
335
335
|
snippet:
|
336
336
|
slug: "You need to know it in order to insert the snippet inside a page or a layout"
|
337
337
|
site:
|
@@ -118,8 +118,9 @@ fr:
|
|
118
118
|
failed_create: "La page n'a pas été créée."
|
119
119
|
failed_update: "La page n'a pas été mise à jour."
|
120
120
|
form:
|
121
|
-
|
122
|
-
|
121
|
+
cache_strategy:
|
122
|
+
none: Aucun
|
123
|
+
simple: Simple
|
123
124
|
hour: 1 heure
|
124
125
|
day: 1 jour
|
125
126
|
week: 1 semaine
|
@@ -352,7 +353,7 @@ fr:
|
|
352
353
|
hints:
|
353
354
|
page:
|
354
355
|
published: "Seuls les administrateurs authentifiés peuvent voir une page non publiée."
|
355
|
-
|
356
|
+
cache_strategy: "Cache la page pour de meilleure performance. L'option 'Simple' est le meilleur compromis."
|
356
357
|
snippet:
|
357
358
|
slug: "Utilisé pour insérer le snippet dans une page ou un gabarit."
|
358
359
|
site:
|
data/lib/core_ext.rb
CHANGED
@@ -29,4 +29,34 @@ class String
|
|
29
29
|
replace(self.slugify(options))
|
30
30
|
end
|
31
31
|
|
32
|
+
end
|
33
|
+
|
34
|
+
## Hash
|
35
|
+
|
36
|
+
class Hash
|
37
|
+
|
38
|
+
def underscore_keys
|
39
|
+
new_hash = {}
|
40
|
+
|
41
|
+
self.each_pair do |key, value|
|
42
|
+
if value.respond_to?(:collect!) # Array
|
43
|
+
value.collect do |item|
|
44
|
+
if item.respond_to?(:each_pair) # Hash item within
|
45
|
+
item.underscore_keys
|
46
|
+
else
|
47
|
+
item
|
48
|
+
end
|
49
|
+
end
|
50
|
+
elsif value.respond_to?(:each_pair) # Hash
|
51
|
+
value = value.underscore_keys
|
52
|
+
end
|
53
|
+
|
54
|
+
new_key = key.is_a?(String) ? key.underscore : key # only String keys
|
55
|
+
|
56
|
+
new_hash[new_key] = value
|
57
|
+
end
|
58
|
+
|
59
|
+
self.replace(new_hash)
|
60
|
+
end
|
61
|
+
|
32
62
|
end
|
data/lib/locomotive/render.rb
CHANGED
@@ -14,7 +14,7 @@ module Locomotive
|
|
14
14
|
|
15
15
|
output = @page.render(locomotive_context)
|
16
16
|
|
17
|
-
prepare_and_set_response(output
|
17
|
+
prepare_and_set_response(output)
|
18
18
|
end
|
19
19
|
|
20
20
|
def locomotive_page
|
@@ -48,9 +48,17 @@ module Locomotive
|
|
48
48
|
::Liquid::Context.new(assigns, registers)
|
49
49
|
end
|
50
50
|
|
51
|
-
def prepare_and_set_response(output
|
52
|
-
response.headers['Cache-Control'] = "public, max-age=#{cache_expiration}" if cache_expiration > 0
|
51
|
+
def prepare_and_set_response(output)
|
53
52
|
response.headers['Content-Type'] = 'text/html; charset=utf-8'
|
53
|
+
|
54
|
+
if @page.with_cache?
|
55
|
+
fresh_when :etag => @page, :last_modified => @page.updated_at.utc, :public => true
|
56
|
+
|
57
|
+
if @page.cache_strategy != 'simple' # varnish
|
58
|
+
response.cache_control[:max_age] = @page.cache_strategy
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
54
62
|
render :text => output, :layout => false, :status => :ok
|
55
63
|
end
|
56
64
|
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Core extensions' do
|
4
|
+
|
5
|
+
describe 'Adding new methods for Hash items' do
|
6
|
+
|
7
|
+
describe 'defining underscore_keys' do
|
8
|
+
|
9
|
+
context 'from simple plain hash' do
|
10
|
+
|
11
|
+
it 'underscores each key' do
|
12
|
+
{ 'foo-bar' => 42, :foo => 42, 'foo' => 42 }.underscore_keys.should == { 'foo_bar' => 42, :foo => 42, 'foo' => 42 }
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'from nested hashes' do
|
18
|
+
|
19
|
+
it 'underscores each key' do
|
20
|
+
{ 'foo-bar' => { 'bar-foo' => 42, :test => { 'bar-foo' => 42 } } }.underscore_keys.should == { 'foo_bar' => { 'bar_foo' => 42, :test => { 'bar_foo' => 42 } } }
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'from hash with arrays of hashes' do
|
26
|
+
|
27
|
+
it 'underscores each key' do
|
28
|
+
{ 'foo-bar' => [{ 'bar-foo' => 42 }, 42, { 'bar-foo' => 42 }] }.underscore_keys.should == { 'foo_bar' => [{ 'bar_foo' => 42 }, 42, { 'bar_foo' => 42 }] }
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -8,11 +8,13 @@ describe 'Locomotive rendering system' do
|
|
8
8
|
@site = Factory.build(:site)
|
9
9
|
Site.stubs(:find).returns(@site)
|
10
10
|
@controller.current_site = @site
|
11
|
+
@page = Factory.build(:page, :site => nil, :published => true)
|
11
12
|
end
|
12
13
|
|
13
14
|
context 'setting the response' do
|
14
15
|
|
15
16
|
before(:each) do
|
17
|
+
@controller.instance_variable_set(:@page, @page)
|
16
18
|
@controller.send(:prepare_and_set_response, 'Hello world !')
|
17
19
|
end
|
18
20
|
|
@@ -27,21 +29,27 @@ describe 'Locomotive rendering system' do
|
|
27
29
|
it 'does not set the cache' do
|
28
30
|
@controller.response.headers['Cache-Control'].should be_nil
|
29
31
|
end
|
32
|
+
|
33
|
+
it 'sets the cache by simply using etag' do
|
34
|
+
@page.cache_strategy = 'simple'
|
35
|
+
@page.stubs(:updated_at).returns(Time.now)
|
36
|
+
@controller.send(:prepare_and_set_response, 'Hello world !')
|
37
|
+
@controller.response.to_a # force to build headers
|
38
|
+
@controller.response.headers['Cache-Control'].should == 'public'
|
39
|
+
end
|
30
40
|
|
31
|
-
it 'sets the cache' do
|
32
|
-
@
|
33
|
-
@
|
41
|
+
it 'sets the cache for Varnish' do
|
42
|
+
@page.cache_strategy = '3600'
|
43
|
+
@page.stubs(:updated_at).returns(Time.now)
|
44
|
+
@controller.send(:prepare_and_set_response, 'Hello world !')
|
45
|
+
@controller.response.to_a # force to build headers
|
46
|
+
@controller.response.headers['Cache-Control'].should == 'max-age=3600, public'
|
34
47
|
end
|
35
48
|
|
36
49
|
end
|
37
50
|
|
38
51
|
context 'when retrieving page' do
|
39
52
|
|
40
|
-
before(:each) do
|
41
|
-
@page = Factory.build(:page, :site => nil, :published => true)
|
42
|
-
@controller
|
43
|
-
end
|
44
|
-
|
45
53
|
it 'should retrieve the index page /' do
|
46
54
|
@controller.request.fullpath = '/'
|
47
55
|
@controller.current_site.pages.expects(:where).with({ :fullpath => 'index' }).returns([@page])
|
data/spec/models/page_spec.rb
CHANGED
data/spec/support/locomotive.rb
CHANGED
@@ -4,7 +4,7 @@ Locomotive.configure do |config|
|
|
4
4
|
end
|
5
5
|
|
6
6
|
module Locomotive
|
7
|
-
class TestController
|
7
|
+
class TestController < ApplicationController
|
8
8
|
|
9
9
|
include Locomotive::Render
|
10
10
|
|
@@ -15,26 +15,20 @@ module Locomotive
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def response
|
18
|
-
@
|
18
|
+
@_response ||= TestResponse.new
|
19
19
|
end
|
20
20
|
|
21
21
|
def request
|
22
|
-
@
|
22
|
+
@_request ||= TestRequest.new
|
23
23
|
end
|
24
24
|
|
25
25
|
end
|
26
26
|
|
27
|
-
class TestResponse
|
28
|
-
|
29
|
-
attr_accessor :headers
|
30
|
-
|
31
|
-
def initialize
|
32
|
-
self.headers = {}
|
33
|
-
end
|
27
|
+
class TestResponse < ActionDispatch::TestResponse
|
34
28
|
|
35
29
|
end
|
36
30
|
|
37
|
-
class TestRequest
|
31
|
+
class TestRequest < ActionDispatch::TestRequest
|
38
32
|
|
39
33
|
attr_accessor :fullpath
|
40
34
|
|
metadata
CHANGED
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
|
|
6
6
|
- 0
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.0.2.
|
9
|
+
- 9
|
10
|
+
version: 0.0.2.9
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Didier Lafforgue
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-07-
|
18
|
+
date: 2010-07-09 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -1214,6 +1214,7 @@ specification_version: 3
|
|
1214
1214
|
summary: Locomotive cms engine
|
1215
1215
|
test_files:
|
1216
1216
|
- spec/factories.rb
|
1217
|
+
- spec/lib/core_ext_spec.rb
|
1217
1218
|
- spec/lib/locomotive/heroku_spec.rb
|
1218
1219
|
- spec/lib/locomotive/httparty/patches_spec.rb
|
1219
1220
|
- spec/lib/locomotive/httparty/webservice_spec.rb
|