puffer_pages 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  gem 'rails', '~> 3.0.3'
4
- gem 'liquid'
4
+ gem 'liquid', :git => 'git://github.com/tobi/liquid.git'
5
5
  gem 'nested_set'
6
6
  gem 'puffer', '>= 0.0.17'
7
7
 
data/Gemfile.lock CHANGED
@@ -1,3 +1,9 @@
1
+ GIT
2
+ remote: git://github.com/tobi/liquid.git
3
+ revision: 7bbb4ff84f192a6a2292e8bf16e1049cad34d763
4
+ specs:
5
+ liquid (2.2.2)
6
+
1
7
  GEM
2
8
  remote: http://rubygems.org/
3
9
  specs:
@@ -65,7 +71,6 @@ GEM
65
71
  git (>= 1.2.5)
66
72
  rake
67
73
  json_pure (1.5.1)
68
- liquid (2.2.2)
69
74
  mail (2.2.15)
70
75
  activesupport (>= 2.3.6)
71
76
  i18n (>= 0.4.0)
@@ -146,7 +151,7 @@ DEPENDENCIES
146
151
  fabrication (= 0.9.2)
147
152
  forgery
148
153
  jeweler
149
- liquid
154
+ liquid!
150
155
  mongrel
151
156
  mysql
152
157
  nested_set
data/README.md CHANGED
@@ -1,3 +1,6 @@
1
+ # Warning! This puffer_pages version requires liquid from repo. So, add following line to your Gemfile until new liquid version will release.
2
+ <pre>gem 'liquid', :git => 'git://github.com/tobi/liquid.git'</pre>
3
+
1
4
  # Puffer_pages is lightweight rails 3 CMS
2
5
 
3
6
  Interface of pages based on [puffer](https://github.com/puffer/puffer)
@@ -44,20 +47,19 @@ Puffer_pages use liquid as template language.
44
47
  ## Pages
45
48
  Pages - tree-based structure of site.
46
49
  Every page has one or more page parts.
47
- Every page part must have main page part, named by default `body`. You can configure main page part name in config/initializers/puffer_pages.rb
48
50
 
49
51
  ## PageParts
50
- Page_parts are the same as content_for block in rails. You can insert current page page_patrs at layout.
52
+ Page_parts are the same as content_for block content in rails. You can insert current page page_patrs at layout.
51
53
  Also, page_parts are inheritable. It means, that if root has page_part named `sidebar`, all its children will have the same page_part until this page_part will be redefined.
54
+ Every page part must have main page part, named by default `body`. You can configure main page part name in config/initializers/puffer_pages.rb
52
55
 
53
56
  ## Layouts
54
57
  Layout is page canvas, so you can draw page parts on it.
55
- You can use layouts from database or applcation for pages.
58
+ You can use layouts from database or rails applcation layouts for pages.
56
59
 
57
- ### Application layouts
60
+ ### Rails application layouts
58
61
  For application layout page_part body will be inserted instead of SUDDENLY! <%= yield %>
59
- Rules are the same. If no page part name specified puffer will use page part with default name.
60
- See `yield` liquid tag reference
62
+ For yield with no parans specified puffer will use page part with default page_part name.
61
63
 
62
64
  So, main page part is action view and other are partials. So easy.
63
65
 
@@ -72,29 +74,22 @@ This variables accessible from every page:
72
74
  <pre>{{ root.name }}</pre>
73
75
  Both `self` and `root` are instances of page drop. View [this](https://github.com/puffer/puffer_pages/blob/master/lib/puffer_pages/liquid/page_drop.rb) to find list of possible page drop methods
74
76
 
75
- ### yield
76
- <pre>{% yield [page_part_name] %}</pre>
77
- `yield` tag is page part or actionview `content_for` placeholder.
78
-
79
- If no page_part_name specified, puffer layout will use page part with default name ('body'). You can change defaul page part name in puffer_pages setup initializer.
77
+ ### include
78
+ `include` is standart liquid tag with pudder data model 'file_system'
80
79
 
81
- Usage example:
82
- <pre>
83
- {% yield %} # renders body
84
- {% yield 'sidebar' %} # renders sidebar
85
- {% assign sb = 'sidebar' %}
86
- {% yield sb %} # renders sidebar too
87
- </pre>
80
+ #### for page_parts
81
+ Use include tag for current page page_parts inclusion:
82
+ <pre>{% include 'page_part_name' %}</pre>
88
83
 
89
- ### render_snippet
90
- <pre>{% render_snippet snippet_name %}</pre>
91
- Renders specified snippet`s content.
84
+ #### for snippets
85
+ To include snippet use this path form:
86
+ <pre>{% include 'snippets/snippet_name' %}</pre>
92
87
 
93
88
  Usage example:
94
89
  <pre>
95
- {% render_snippet 'navigation' %}
96
- {% assign nav = 'navigation' %}
97
- {% render_snippet nav %}
90
+ {% include 'sidebar' %} # this will render 'sidebar' page_part
91
+ {% assign navigation = 'snippets/navigation' %}
92
+ {% include navigation %} # this will render 'navigation' snippet
98
93
  </pre>
99
94
 
100
95
  ### stylesheets, javascripts
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.9
1
+ 0.0.10
data/app/models/page.rb CHANGED
@@ -68,9 +68,9 @@ class Page < ActiveRecord::Base
68
68
  def render(drops_or_context)
69
69
  if inherited_layout
70
70
  @template = Liquid::Template.parse(inherited_layout.body)
71
- tracker.cleanup @template.render(drops_or_context, :registers => {:tracker => tracker, :page => self})
71
+ tracker.cleanup @template.render(drops_or_context, :registers => {:tracker => tracker, :page => self, :file_system => PufferPages::Liquid::FileSystem.new})
72
72
  else
73
- inherited_page_parts.map{|part| part.render(drops_or_context, true)}.join
73
+ inherited_page_parts.map{|part| part.render(drops_or_context, self)}.join
74
74
  end
75
75
  end
76
76
 
@@ -4,10 +4,10 @@ class PagePart < ActiveRecord::Base
4
4
  validates_presence_of :name
5
5
  validates_uniqueness_of :name, :scope => :page_id
6
6
 
7
- def render(drops_or_context, wrap = false)
7
+ def render(drops_or_context, page = nil)
8
8
  template = Liquid::Template.parse(body)
9
- result = tracker.cleanup template.render(drops_or_context, :registers => {:tracker => tracker})
10
- main? ? result : (wrap ? "<% content_for :#{name} do %>#{result}<% end %>" : result)
9
+ result = tracker.cleanup template.render(drops_or_context, :registers => {:tracker => tracker, :page => page, :file_system => PufferPages::Liquid::FileSystem.new})
10
+ main? ? result : "<% content_for :#{name} do %>#{result}<% end %>"
11
11
  end
12
12
 
13
13
  def tracker
@@ -1,14 +1,4 @@
1
1
  class Snippet < ActiveRecord::Base
2
2
  validates_presence_of :name
3
3
  validates_uniqueness_of :name
4
-
5
- def render(drops_or_context)
6
- template = Liquid::Template.parse(body)
7
- tracker.cleanup template.render(drops_or_context, :registers => {:tracker => tracker})
8
- end
9
-
10
- def tracker
11
- @tracker ||= PufferPages::Liquid::Tracker.new
12
- end
13
-
14
4
  end
data/lib/puffer_pages.rb CHANGED
@@ -19,8 +19,7 @@ require 'nested_set'
19
19
  require 'puffer_pages/engine'
20
20
  require 'puffer_pages/extensions/core'
21
21
  require 'puffer_pages/extensions/mapper'
22
- require 'puffer_pages/liquid/tags/yield'
23
- require 'puffer_pages/liquid/tags/render_snippet'
22
+ #require 'puffer_pages/liquid/tags/yield'
24
23
  require 'puffer_pages/liquid/tags/stylesheets'
25
24
  require 'puffer_pages/liquid/tags/javascripts'
26
25
 
@@ -0,0 +1,28 @@
1
+ module PufferPages
2
+ module Liquid
3
+ class FileSystem < ::Liquid::BlankFileSystem
4
+
5
+ def read_template_file(context, template_name)
6
+ template_path = context[template_name]
7
+
8
+ case template_type template_path
9
+ when :snippet then
10
+ template_path = template_path.gsub(/^snippets\//, '')
11
+ snippet = Snippet.find_by_name(template_path)
12
+ raise FileSystemError, "No such snippet '#{template_path}' found" unless snippet
13
+ snippet.body
14
+ when :page_part then
15
+ page_part = context.registers[:page].part(template_path)
16
+ raise FileSystemError, "No such page_part '#{template_path}' found for current page" unless page_part
17
+ page_part.body
18
+ end
19
+ end
20
+
21
+ def template_type template_path
22
+ return :snippet if template_path.start_with? 'snippets/'
23
+ return :page_part
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -2,40 +2,61 @@ module PufferPages
2
2
  module Liquid
3
3
  class PageDrop < ::Liquid::Drop
4
4
 
5
+ include ActionController::UrlFor
6
+ include Rails.application.routes.url_helpers
7
+
5
8
  def initialize page, request = nil
6
9
  @page, @request = page, request
7
10
  end
8
11
 
9
12
  (%w(name title description keywords created_at updated_at) + Page.statuses.map{|s| "#{s}?"}).each do |attribute|
10
13
  define_method attribute do
11
- @page.send(attribute)
14
+ page.send(attribute)
12
15
  end
13
16
  end
14
17
 
15
18
  def parent
16
- @parent ||= self.class.new(@page.parent, @request)
19
+ @parent ||= self.class.new(page.parent, @request)
17
20
  end
18
21
 
19
- %w(children ancestors).each do |attribute|
22
+ %w(ancestors children).each do |attribute|
20
23
  define_method attribute do
21
- instance_variable_get("@#{attribute}") || instance_variable_set("@#{attribute}", @page.send(attribute).map{ |page| self.class.new(page, @request)})
24
+ instance_variable_get("@#{attribute}") || instance_variable_set("@#{attribute}", page.send(attribute).map{ |ac| self.class.new(ac, request)})
22
25
  end
23
26
  end
24
27
 
25
28
  def ancestors?
26
- !@page.root?
29
+ !page.root?
27
30
  end
28
31
 
29
32
  def children?
30
- @page.children.present?
33
+ page.children.present?
31
34
  end
32
35
 
33
36
  def path
34
-
37
+ puffer_page_path page.location
35
38
  end
36
39
 
37
40
  def url
38
-
41
+ puffer_page_url page.location
42
+ end
43
+
44
+ def current?
45
+ path == request.path_info
46
+ end
47
+
48
+ def ancestor?
49
+ request.path_info.start_with? path
50
+ end
51
+
52
+ private
53
+
54
+ def request
55
+ @request
56
+ end
57
+
58
+ def page
59
+ @page
39
60
  end
40
61
 
41
62
  end
data/puffer_pages.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{puffer_pages}
8
- s.version = "0.0.9"
8
+ s.version = "0.0.10"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["pyromaniac"]
@@ -62,9 +62,9 @@ Gem::Specification.new do |s|
62
62
  "lib/puffer_pages/engine.rb",
63
63
  "lib/puffer_pages/extensions/core.rb",
64
64
  "lib/puffer_pages/extensions/mapper.rb",
65
+ "lib/puffer_pages/liquid/file_system.rb",
65
66
  "lib/puffer_pages/liquid/page_drop.rb",
66
67
  "lib/puffer_pages/liquid/tags/javascripts.rb",
67
- "lib/puffer_pages/liquid/tags/render_snippet.rb",
68
68
  "lib/puffer_pages/liquid/tags/stylesheets.rb",
69
69
  "lib/puffer_pages/liquid/tags/yield.rb",
70
70
  "lib/puffer_pages/liquid/tracker.rb",
@@ -130,6 +130,7 @@ Gem::Specification.new do |s|
130
130
  "spec/fabricators/pages_fabricator.rb",
131
131
  "spec/fabricators/snippets_fabricator.rb",
132
132
  "spec/integration/navigation_spec.rb",
133
+ "spec/lib/drops_spec.rb",
133
134
  "spec/lib/tags_spec.rb",
134
135
  "spec/models/page_spec.rb",
135
136
  "spec/puffer_pages_spec.rb",
@@ -172,6 +173,7 @@ Gem::Specification.new do |s|
172
173
  "spec/fabricators/pages_fabricator.rb",
173
174
  "spec/fabricators/snippets_fabricator.rb",
174
175
  "spec/integration/navigation_spec.rb",
176
+ "spec/lib/drops_spec.rb",
175
177
  "spec/lib/tags_spec.rb",
176
178
  "spec/models/page_spec.rb",
177
179
  "spec/puffer_pages_spec.rb",
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Drops' do
4
+
5
+ include
6
+
7
+ def render_page(page, one_more = nil)
8
+ request = ActionController::TestRequest.new
9
+ request.env["rack.url_scheme"] = "http"
10
+ request.host = 'test.com'
11
+ request.port = 80
12
+ request.path = "/#{page.location}"
13
+ page.render 'self' => PufferPages::Liquid::PageDrop.new(page, request),
14
+ 'page' => (PufferPages::Liquid::PageDrop.new(one_more, request) if one_more)
15
+ end
16
+
17
+ describe 'page drop' do
18
+
19
+ before :each do
20
+ @root = Fabricate :page, :layout_name => 'foo_layout'
21
+ @foo = Fabricate :page, :slug => 'hello', :parent => @root
22
+ @bar = Fabricate :page, :slug => 'world', :parent => @foo
23
+ end
24
+
25
+ it 'should render proper url and path' do
26
+ @layout = Fabricate :layout, :name => 'foo_layout', :body => "{{ self.path }} {{ self.url }}"
27
+
28
+ render_page(@bar).should == '/hello/world http://test.com/hello/world'
29
+ end
30
+
31
+ it 'should render proper current?' do
32
+ @layout = Fabricate :layout, :name => 'foo_layout', :body => "{{ page.current? }}"
33
+
34
+ render_page(@foo, @foo).should == 'true'
35
+ render_page(@foo, @root).should == 'false'
36
+ render_page(@foo, @bar).should == 'false'
37
+ end
38
+
39
+ it 'should render proper ancestor?' do
40
+ @layout = Fabricate :layout, :name => 'foo_layout', :body => "{{ page.ancestor? }}"
41
+
42
+ render_page(@foo, @foo).should == 'true'
43
+ render_page(@foo, @root).should == 'true'
44
+ render_page(@foo, @bar).should == 'false'
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -6,7 +6,7 @@ describe 'Tags' do
6
6
  page.render 'self' => PufferPages::Liquid::PageDrop.new(page)
7
7
  end
8
8
 
9
- describe 'yield' do
9
+ describe 'include page part' do
10
10
 
11
11
  before :each do
12
12
  @page = Fabricate :page, :layout_name => 'foo_layout'
@@ -15,37 +15,32 @@ describe 'Tags' do
15
15
  @page.page_parts = [@main, @sidebar]
16
16
  end
17
17
 
18
- it 'should render yield without params' do
19
- @layout = Fabricate :layout, :name => 'foo_layout', :body => "{% yield %}"
18
+ it 'should include page_part with string param' do
19
+ @layout = Fabricate :layout, :name => 'foo_layout', :body => "{% include 'body' %}"
20
20
  render_page(@page).should == @main.body
21
21
  end
22
22
 
23
- it 'should render yield with string param' do
24
- @layout = Fabricate :layout, :name => 'foo_layout', :body => "{% yield 'sidebar' %}"
25
- render_page(@page).should == @sidebar.body
26
- end
27
-
28
- it 'should render yield with variable param' do
29
- @layout = Fabricate :layout, :name => 'foo_layout', :body => "{% assign sb = 'sidebar' %}{% yield sb %}"
23
+ it 'should include page_part with variable param' do
24
+ @layout = Fabricate :layout, :name => 'foo_layout', :body => "{% assign sb = 'sidebar' %}{% include sb %}"
30
25
  render_page(@page).should == @sidebar.body
31
26
  end
32
27
 
33
28
  end
34
29
 
35
- describe 'render_snippet' do
30
+ describe 'include snippet' do
36
31
 
37
32
  before :each do
38
33
  @page = Fabricate :page, :layout_name => 'foo_layout'
39
34
  @snippet = Fabricate :snippet, :name => 'snip', :body => 'snippet body'
40
35
  end
41
36
 
42
- it 'should render render_snippet with string param' do
43
- @layout = Fabricate :layout, :name => 'foo_layout', :body => "{% render_snippet 'snip' %}"
37
+ it 'should include snippet with string param' do
38
+ @layout = Fabricate :layout, :name => 'foo_layout', :body => "{% include 'snippets/snip' %}"
44
39
  render_page(@page).should == @snippet.body
45
40
  end
46
41
 
47
- it 'should render render_snippet with variable param' do
48
- @layout = Fabricate :layout, :name => 'foo_layout', :body => "{% assign sn = 'snip' %}{% render_snippet sn %}"
42
+ it 'should include snippet with variable param' do
43
+ @layout = Fabricate :layout, :name => 'foo_layout', :body => "{% assign sn = 'snippets/snip' %}{% include sn %}"
49
44
  render_page(@page).should == @snippet.body
50
45
  end
51
46
 
@@ -122,7 +122,7 @@ describe Page do
122
122
  end
123
123
 
124
124
  it 'should render layout' do
125
- @layout = Fabricate :layout, :name => 'foo_layout', :body => "{% yield %} {% yield 'sidebar' %}"
125
+ @layout = Fabricate :layout, :name => 'foo_layout', :body => "{% include 'body' %} {% include 'sidebar' %}"
126
126
  result = @root.render 'self' => PufferPages::Liquid::PageDrop.new(@root)
127
127
  result.should == "#{@root.title} #{@root.name}"
128
128
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puffer_pages
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 11
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 9
10
- version: 0.0.9
9
+ - 10
10
+ version: 0.0.10
11
11
  platform: ruby
12
12
  authors:
13
13
  - pyromaniac
@@ -277,9 +277,9 @@ files:
277
277
  - lib/puffer_pages/engine.rb
278
278
  - lib/puffer_pages/extensions/core.rb
279
279
  - lib/puffer_pages/extensions/mapper.rb
280
+ - lib/puffer_pages/liquid/file_system.rb
280
281
  - lib/puffer_pages/liquid/page_drop.rb
281
282
  - lib/puffer_pages/liquid/tags/javascripts.rb
282
- - lib/puffer_pages/liquid/tags/render_snippet.rb
283
283
  - lib/puffer_pages/liquid/tags/stylesheets.rb
284
284
  - lib/puffer_pages/liquid/tags/yield.rb
285
285
  - lib/puffer_pages/liquid/tracker.rb
@@ -345,6 +345,7 @@ files:
345
345
  - spec/fabricators/pages_fabricator.rb
346
346
  - spec/fabricators/snippets_fabricator.rb
347
347
  - spec/integration/navigation_spec.rb
348
+ - spec/lib/drops_spec.rb
348
349
  - spec/lib/tags_spec.rb
349
350
  - spec/models/page_spec.rb
350
351
  - spec/puffer_pages_spec.rb
@@ -416,6 +417,7 @@ test_files:
416
417
  - spec/fabricators/pages_fabricator.rb
417
418
  - spec/fabricators/snippets_fabricator.rb
418
419
  - spec/integration/navigation_spec.rb
420
+ - spec/lib/drops_spec.rb
419
421
  - spec/lib/tags_spec.rb
420
422
  - spec/models/page_spec.rb
421
423
  - spec/puffer_pages_spec.rb
@@ -1,33 +0,0 @@
1
- module PufferPages
2
- module Liquid
3
- module Tags
4
-
5
- class RenderSnippet < ::Liquid::Tag
6
- Syntax = /^(#{::Liquid::QuotedFragment})/
7
-
8
- def initialize(tag_name, markup, tokens)
9
- if markup =~ Syntax
10
- @name = $1
11
- else
12
- raise SyntaxError.new("Syntax Error in 'render_snippet' - Valid syntax: render_snippet snipper_name")
13
- end
14
-
15
- super
16
- end
17
-
18
- def render(context)
19
- name = context[@name]
20
- snippet = Snippet.find_by_name(name)
21
- if snippet
22
- snippet.render(context)
23
- else
24
- raise ArgumentError.new("Argument error in 'render_snippet' - Can not find snippet named '#{name}'")
25
- end
26
- end
27
- end
28
-
29
- end
30
- end
31
- end
32
-
33
- Liquid::Template.register_tag('render_snippet', PufferPages::Liquid::Tags::RenderSnippet)