puffer_pages 0.0.19 → 0.1.0

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.
Files changed (40) hide show
  1. data/.gitignore +8 -0
  2. data/Gemfile +2 -22
  3. data/Gemfile.lock +15 -19
  4. data/README.md +0 -4
  5. data/Rakefile +1 -11
  6. data/app/components/page_part_body/form.html.erb +3 -1
  7. data/app/components/page_parts/form.html.erb +27 -25
  8. data/app/{views/puffer_pages/pages_base → components/render}/_tree_page.html.erb +0 -0
  9. data/app/controllers/puffer_pages/pages_base.rb +2 -2
  10. data/app/helpers/puffer_pages_helper.rb +1 -1
  11. data/app/models/puffer_pages/page.rb +19 -10
  12. data/app/models/puffer_pages/page_part.rb +2 -2
  13. data/app/views/layouts/puffer_pages_layout.html.erb +1 -0
  14. data/lib/puffer_pages/extensions/controller.rb +34 -0
  15. data/lib/puffer_pages/extensions/mapper.rb +3 -5
  16. data/lib/puffer_pages/liquid/file_system.rb +2 -2
  17. data/lib/puffer_pages/liquid/tags/javascripts.rb +2 -2
  18. data/lib/puffer_pages/liquid/tags/stylesheets.rb +2 -2
  19. data/lib/puffer_pages/liquid/tags/yield.rb +4 -8
  20. data/lib/puffer_pages/liquid/tracker.rb +2 -8
  21. data/lib/puffer_pages/version.rb +3 -0
  22. data/lib/puffer_pages.rb +11 -1
  23. data/puffer_pages.gemspec +31 -185
  24. data/spec/controllers/articles_controller_spec.rb +65 -0
  25. data/spec/dummy/app/assets/javascripts/application.js +0 -4
  26. data/spec/dummy/app/assets/stylesheets/application.css +2 -2
  27. data/spec/dummy/app/controllers/admin/articles_controller.rb +18 -0
  28. data/spec/dummy/app/controllers/articles_controller.rb +9 -0
  29. data/spec/dummy/app/models/article.rb +16 -0
  30. data/spec/dummy/app/views/articles/show.html.erb +1 -0
  31. data/spec/dummy/app/views/layouts/articles.html.erb +1 -0
  32. data/spec/dummy/config/routes.rb +3 -0
  33. data/spec/dummy/db/migrate/20111117081813_create_articles.rb +11 -0
  34. data/spec/dummy/db/schema.rb +9 -1
  35. data/spec/fabricators/articles_fabricator.rb +4 -0
  36. data/spec/lib/tags_spec.rb +1 -1
  37. data/spec/models/page_spec.rb +101 -5
  38. data/spec/spec_helper.rb +2 -2
  39. metadata +54 -51
  40. data/VERSION +0 -1
data/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ .bundle/
2
+ .rvmrc
3
+ log/*.log
4
+ pkg/
5
+ spec/dummy/db/*.sqlite3
6
+ spec/dummy/log/*.log
7
+ spec/dummy/tmp/
8
+ *.orig
data/Gemfile CHANGED
@@ -1,25 +1,5 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem 'rails', '~> 3.1.0'
4
- gem 'puffer', :git => 'git://github.com/puffer/puffer.git'
5
- gem 'liquid', :git => 'git://github.com/puffer/liquid.git'
6
- gem 'nested_set'
7
-
8
- group :development, :test, :pg_test do
9
- gem "sqlite3-ruby", :require => "sqlite3"
10
- gem "pg"
11
- gem "mysql"
12
-
13
- gem "rspec-rails"
14
- gem "capybara", ">= 0.4.0"
15
- gem 'database_cleaner'
16
-
17
- gem 'guard'
18
- gem 'libnotify'
19
- gem 'guard-rspec'
20
-
21
- gem 'forgery'
22
- gem 'fabrication'
23
- gem "jeweler"
24
- end
3
+ gemspec
25
4
 
5
+ gem 'puffer', :git => 'git://github.com/puffer/puffer.git'
data/Gemfile.lock CHANGED
@@ -1,18 +1,21 @@
1
- GIT
2
- remote: git://github.com/puffer/liquid.git
3
- revision: 3885290fefa0e6f92cfd812455a7cbd8eee9871b
4
- specs:
5
- liquid (2.2.2)
6
-
7
1
  GIT
8
2
  remote: git://github.com/puffer/puffer.git
9
- revision: 9b392031c0c1264d963c632794f92ede1895968b
3
+ revision: cdbcc66e5b205cd8f95a48e84568c6748640f349
10
4
  specs:
11
- puffer (0.0.30)
5
+ puffer (0.1.0)
12
6
  kaminari
13
7
  orm_adapter
14
8
  rails (~> 3.1.0)
15
9
 
10
+ PATH
11
+ remote: .
12
+ specs:
13
+ puffer_pages (0.1.0)
14
+ liquid
15
+ nested_set
16
+ puffer
17
+ rails (~> 3.1.0)
18
+
16
19
  GEM
17
20
  remote: http://rubygems.org/
18
21
  specs:
@@ -61,22 +64,18 @@ GEM
61
64
  fabrication (1.1.0)
62
65
  ffi (1.0.9)
63
66
  forgery (0.5.0)
64
- git (1.2.5)
65
67
  guard (0.6.3)
66
68
  thor (~> 0.14.6)
67
69
  guard-rspec (0.4.5)
68
70
  guard (>= 0.4.0)
69
71
  hike (1.2.1)
70
72
  i18n (0.6.0)
71
- jeweler (1.6.4)
72
- bundler (~> 1.0)
73
- git (>= 1.2.5)
74
- rake
75
73
  json (1.6.1)
76
74
  json_pure (1.6.0)
77
75
  kaminari (0.12.4)
78
76
  rails (>= 3.0.0)
79
77
  libnotify (0.5.7)
78
+ liquid (2.3.0)
80
79
  mail (2.3.0)
81
80
  i18n (>= 0.4.0)
82
81
  mime-types (~> 1.16)
@@ -90,7 +89,7 @@ GEM
90
89
  nokogiri (1.5.0)
91
90
  orm_adapter (0.0.5)
92
91
  pg (0.11.0)
93
- polyglot (0.3.2)
92
+ polyglot (0.3.3)
94
93
  rack (1.3.5)
95
94
  rack-cache (1.1)
96
95
  rack (>= 0.4)
@@ -149,7 +148,7 @@ GEM
149
148
  treetop (1.4.10)
150
149
  polyglot
151
150
  polyglot (>= 0.3.1)
152
- tzinfo (0.3.30)
151
+ tzinfo (0.3.31)
153
152
  xpath (0.1.4)
154
153
  nokogiri (~> 1.3)
155
154
 
@@ -163,13 +162,10 @@ DEPENDENCIES
163
162
  forgery
164
163
  guard
165
164
  guard-rspec
166
- jeweler
167
165
  libnotify
168
- liquid!
169
166
  mysql
170
- nested_set
171
167
  pg
172
168
  puffer!
173
- rails (~> 3.1.0)
169
+ puffer_pages!
174
170
  rspec-rails
175
171
  sqlite3-ruby
data/README.md CHANGED
@@ -1,7 +1,3 @@
1
- # Warning! This puffer_pages version requires liquid from puffer repo. So, add following line to your Gemfile until new liquid version will release.
2
- <pre>gem 'liquid', :git => 'git://github.com/puffer/liquid.git'</pre>
3
- I hope, it's temporarly
4
-
5
1
  # Puffer_pages is lightweight rails 3.1 CMS
6
2
 
7
3
  Interface of pages based on [puffer](https://github.com/puffer/puffer)
data/Rakefile CHANGED
@@ -24,14 +24,4 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
24
24
  rdoc.rdoc_files.include('lib/**/*.rb')
25
25
  end
26
26
 
27
- require 'jeweler'
28
-
29
- Jeweler::Tasks.new do |gem|
30
- gem.name = "puffer_pages"
31
- gem.summary = %Q{Content management system}
32
- gem.description = %Q{Puffer pages is integratable rails CMS with puffer admin interface}
33
- gem.email = "kinwizard@gmail.com"
34
- gem.homepage = "http://github.com/puffer/puffer_pages"
35
- gem.authors = ["pyromaniac"]
36
- end
37
- Jeweler::GemcutterTasks.new
27
+ require "bundler/gem_tasks"
@@ -1 +1,3 @@
1
- <%= opts[:form].text_area field, field.input_options %>
1
+ <%= component_fields_for @record do |f| %>
2
+ <%= f.text_area field, field.input_options %>
3
+ <% end %>
@@ -1,31 +1,33 @@
1
- <ul id="<%= field.name %>" data-tabs="{closable: true, onRemove: page_part_tab_remove, addButton: page_part_tab_add}">
2
- <ul>
3
- <% opts[:form].object.send(field.name).each_with_index do |page_part, index| %>
4
- <li><%= link_to page_part.name, "#page_part_tab_#{index}" %></li>
5
- <% end %>
6
- </ul>
7
- <% opts[:form].object.send(field.name).each_with_index do |page_part, index| -%>
8
- <li id="<%= "page_part_tab_#{index}" %>">
9
- <% opts[:form].fields_for field.name, page_part, :hidden_field_id => true do |page_part_builder| %>
10
- <% field.children.each do |field| %>
11
- <%= field.render parent_controller, :form, :form => page_part_builder %>
12
- <% end %>
13
- <%= page_part_builder.hidden_field :id unless page_part_builder.object.persisted? %>
1
+ <%= fields_for @record do |f| %>
2
+ <ul id="<%= field.name %>" data-tabs="{closable: true, onRemove: page_part_tab_remove, addButton: page_part_tab_add}">
3
+ <ul>
4
+ <% @record.send(field.name).each_with_index do |page_part, index| %>
5
+ <li><%= link_to page_part.name, "#page_part_tab_#{index}" %></li>
14
6
  <% end %>
15
- </li>
16
- <% end -%>
17
- </ul>
18
- <div id="page_parts_marked_for_destroy">
19
- </div>
7
+ </ul>
8
+ <% @record.send(field.name).each_with_index do |page_part, index| -%>
9
+ <li id="<%= "page_part_tab_#{index}" %>">
10
+ <%= f.fields_for field.name, page_part do |page_part_builder| %>
11
+ <% field.children.each do |field| %>
12
+ <%= field.render :form, parent_controller, page_part_builder.object, :builder => page_part_builder %>
13
+ <% end %>
14
+ <%= page_part_builder.hidden_field :id unless page_part_builder.object.persisted? %>
15
+ <% end %>
16
+ </li>
17
+ <% end -%>
18
+ </ul>
19
+ <div id="page_parts_marked_for_destroy">
20
+ </div>
20
21
 
21
- <% new_page_part_tab_panel = capture do %>
22
- <% opts[:form].fields_for field.name, PagePart.new, :child_index => 'new_page_part_tab_panel_index' do |page_part_builder| %>
23
- <% field.children.each do |field| %>
24
- <%= field.render parent_controller, :form, :form => page_part_builder %>
22
+ <% new_page_part_tab_panel = capture do %>
23
+ <%= f.fields_for field.name, PagePart.new, :child_index => 'new_page_part_tab_panel_index' do |page_part_builder| %>
24
+ <% field.children.each do |field| %>
25
+ <%= field.render :form, parent_controller, page_part_builder.object, :builder => page_part_builder %>
26
+ <% end %>
25
27
  <% end %>
26
28
  <% end %>
27
- <% end %>
28
29
 
29
- <%= javascript_tag do %>
30
- var new_page_part_tab_panel = '<%= j new_page_part_tab_panel.strip.html_safe %>'
30
+ <%= javascript_tag do %>
31
+ var new_page_part_tab_panel = '<%= j new_page_part_tab_panel.strip.html_safe %>'
32
+ <% end %>
31
33
  <% end %>
@@ -27,8 +27,8 @@ class PufferPages::PagesBase < Puffer::TreeBase
27
27
  field :name, :type => :hidden
28
28
  field :_destroy, :type => :hidden, :html => { :class => 'destroy_mark' }
29
29
  end
30
- field :layout_name, :select => :possible_layouts
31
- field :status, :select => :possible_statuses
30
+ field :layout_name, :select => :possible_layouts, :include_blank => false
31
+ field :status, :select => :possible_statuses, :include_blank => false
32
32
  field :title
33
33
  field :description
34
34
  field :keywords
@@ -20,7 +20,7 @@ module PufferPagesHelper
20
20
  Page.statuses
21
21
  end
22
22
 
23
- def tree_page record
23
+ def tree_page
24
24
  render :partial => 'tree_page', :object => record
25
25
  end
26
26
 
@@ -15,8 +15,16 @@ class PufferPages::Page < ActiveRecord::Base
15
15
 
16
16
  def self.find_page location
17
17
  page = PufferPages.single_section_page_path ?
18
- ::Page.find_by_slug(location) : ::Page.find_by_location(location)
19
- raise ActiveRecord::RecordNotFound if page.nil? || page.draft?
18
+ find_by_slug(location) : find_by_location(location)
19
+ raise ActiveRecord::RecordNotFound unless page
20
+ raise PufferPages::DraftPage.new("PufferPages can`t show this page because it is draft") if page.draft?
21
+ page
22
+ end
23
+
24
+ def self.find_layout_page location
25
+ location.gsub!(/^\/|\/$/, '')
26
+ page = where(['? like location', location]).where(['status not in (?)', 'draft']).order('lft desc').first
27
+ raise PufferPages::LayoutMissed.new("PufferPages can`t render this page because layout page missed or draft") unless page
20
28
  page
21
29
  end
22
30
 
@@ -28,7 +36,7 @@ class PufferPages::Page < ActiveRecord::Base
28
36
  validates_uniqueness_of :slug, :scope => (:parent_id unless PufferPages.single_section_page_path)
29
37
  validates_inclusion_of :status, :in => statuses
30
38
  validates_format_of :slug, :with => /\A\s*\Z/, :message => :root_slug_format, :if => :root?
31
- validates_format_of :slug, :with => /\A([\w]+[\w-]*(\.[\w]+)?|\*)\Z/, :message => :slug_format, :unless => :root?
39
+ validates_format_of :slug, :with => /\A([\w]+[\w-]*(\.[\w]+)?|%)\Z/, :message => :slug_format, :unless => :root?
32
40
  validate do |page|
33
41
  page.errors.add(:layout_name, :blank) unless page.inherited_layout_name.present?
34
42
  end
@@ -42,14 +50,15 @@ class PufferPages::Page < ActiveRecord::Base
42
50
  self.location = [swallow_nil{parent.location}, slug].compact.join('/').presence
43
51
  end
44
52
 
45
- before_update :update_locations
53
+ before_update :update_locations, :if => :location_changed?
46
54
  def update_locations
47
- self.class.update_all "location = replace(location, '#{location_was}', '#{location}')", ["location like ?", location_was + '%'] if location_changed?
55
+ self.class.update_all "location = replace(location, '#{location_was}', '#{location}')", ["location like ?", location_was + '%']
48
56
  end
49
57
 
50
- after_save :create_main_part
51
- def create_main_part
52
- page_parts.create(:name => PufferPages.primary_page_part_name) if root?
58
+ after_initialize :build_main_part, :if => :root?
59
+ before_save :build_main_part, :if => :root?
60
+ def build_main_part
61
+ page_parts.build(:name => PufferPages.primary_page_part_name) unless page_parts.map(&:name).include?(PufferPages.primary_page_part_name)
53
62
  end
54
63
 
55
64
  statuses.each do |status_name|
@@ -63,9 +72,9 @@ class PufferPages::Page < ActiveRecord::Base
63
72
  def render(drops_or_context)
64
73
  if inherited_layout
65
74
  @template = Liquid::Template.parse(inherited_layout.body)
66
- tracker.cleanup @template.render(drops_or_context, :registers => {:tracker => tracker, :page => self, :file_system => PufferPages::Liquid::FileSystem.new})
75
+ tracker.cleanup @template.render!(drops_or_context, :registers => {:tracker => tracker, :page => self, :file_system => PufferPages::Liquid::FileSystem.new})
67
76
  else
68
- inherited_page_parts.map{|part| part.render(drops_or_context, self)}.join
77
+ inherited_page_parts.reverse.map{|part| part.render(drops_or_context, self)}.join
69
78
  end
70
79
  end
71
80
 
@@ -6,10 +6,10 @@ class PufferPages::PagePart < ActiveRecord::Base
6
6
  validates_presence_of :name
7
7
  validates_uniqueness_of :name, :scope => :page_id
8
8
 
9
- def render(drops_or_context, page = nil)
9
+ def render(drops_or_context, page = page)
10
10
  template = Liquid::Template.parse(body)
11
11
  result = tracker.cleanup template.render(drops_or_context, :registers => {:tracker => tracker, :page => page, :file_system => PufferPages::Liquid::FileSystem.new})
12
- main? ? result : "<% content_for :#{name} do %>#{result}<% end %>"
12
+ main? ? result : "<% content_for :'#{name}' do %>#{result}<% end %>"
13
13
  end
14
14
 
15
15
  def tracker
@@ -0,0 +1 @@
1
+ <%= render :inline => layout_page.render(layout_page_drops), :layout => ("layouts/#{layout_page.render_layout}" if layout_page.render_layout) %>
@@ -0,0 +1,34 @@
1
+ module PufferPages
2
+ module Extensions
3
+ module ActionController
4
+ module Base
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ helper_method :layout_page, :layout_page_drops
9
+ end
10
+
11
+ module InstanceMethods
12
+ def puffer_pages
13
+ 'puffer_pages_layout'
14
+ end
15
+
16
+ def layout_page
17
+ @layout_page ||= ::Page.find_layout_page(request.path_info)
18
+ end
19
+
20
+ def layout_page_drops
21
+ {
22
+ :self => PufferPages::Liquid::PageDrop.new(layout_page, layout_page, self),
23
+ :root => PufferPages::Liquid::PageDrop.new(layout_page.root, layout_page, self)
24
+ }.merge(@drops.presence || {}).stringify_keys
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ ActionController::Base.send :include, PufferPages::Extensions::ActionController::Base
@@ -1,12 +1,10 @@
1
1
  module PufferPages
2
2
  module Extensions
3
3
  module Mapper
4
+ extend ActiveSupport::Concern
4
5
 
5
- def self.included base
6
- base.class_eval do
7
- class_attribute :_puffer_pages
8
- include InstanceMethods
9
- end
6
+ included do
7
+ class_attribute :_puffer_pages
10
8
  end
11
9
 
12
10
  module InstanceMethods
@@ -6,12 +6,12 @@ module PufferPages
6
6
  case template_type template_path
7
7
  when :snippet then
8
8
  template_path = template_path.gsub(/^snippets\//, '')
9
- snippet = Snippet.find_by_name(template_path)
9
+ snippet = ::Snippet.find_by_name(template_path)
10
10
  raise ::Liquid::FileSystemError, "No such snippet '#{template_path}' found" unless snippet
11
11
  snippet.body
12
12
  when :layout then
13
13
  template_path = template_path.gsub(/^layouts\//, '')
14
- layout = Layout.find_by_name(template_path)
14
+ layout = ::Layout.find_by_name(template_path)
15
15
  raise ::Liquid::FileSystemError, "No such layout '#{template_path}' found" unless layout
16
16
  layout.body
17
17
  when :page_part then
@@ -24,8 +24,8 @@ module PufferPages
24
24
 
25
25
  def variables_from_string(markup)
26
26
  markup.split(',').map do |var|
27
- var.strip =~ /\s*(#{::Liquid::QuotedFragment})\s*/
28
- $1 ? $1 : nil
27
+ var.strip =~ /\s*(#{::Liquid::QuotedFragment})\s*/
28
+ $1 ? $1 : nil
29
29
  end.compact
30
30
  end
31
31
 
@@ -24,8 +24,8 @@ module PufferPages
24
24
 
25
25
  def variables_from_string(markup)
26
26
  markup.split(',').map do |var|
27
- var.strip =~ /\s*(#{::Liquid::QuotedFragment})\s*/
28
- $1 ? $1 : nil
27
+ var.strip =~ /\s*(#{::Liquid::QuotedFragment})\s*/
28
+ $1 ? $1 : nil
29
29
  end.compact
30
30
  end
31
31
 
@@ -8,21 +8,17 @@ module PufferPages
8
8
  def initialize(tag_name, markup, tokens)
9
9
  if markup =~ Syntax
10
10
  @name = $1
11
+ elsif markup.blank?
12
+ @name = nil
11
13
  else
12
- @name = "'#{PufferPages.primary_page_part_name}'"
14
+ raise SyntaxError.new("Syntax Error in 'yield' - Valid syntax: yield [content_name]")
13
15
  end
14
16
 
15
17
  super
16
18
  end
17
19
 
18
20
  def render(context)
19
- name = context[@name]
20
- part = context.registers[:page].part(name)
21
- if part
22
- part.render(context)
23
- else
24
- raise ArgumentError.new("Argument error in 'yield' - Can not find page part named '#{name}'")
25
- end
21
+ context.registers[:tracker].register(@name ? "<%= yield :'#{@name}' %>" : "<%= yield %>")
26
22
  end
27
23
  end
28
24
 
@@ -7,23 +7,17 @@ module PufferPages
7
7
  end
8
8
 
9
9
  def register content
10
- @ids << uid
10
+ @ids << Digest::MD5.hexdigest(SecureRandom.uuid)
11
11
  content.gsub(/<%/, "<#{@ids.last}%").gsub(/%>/, "%#{@ids.last}>")
12
12
  end
13
13
 
14
14
  def cleanup text
15
15
  ids = @ids.join('|')
16
16
  @ids = []
17
- text = text.gsub(/<%/, "&lt;%").gsub(/%>/, "%&gt;")# unless Cobalt.config[:allow_erb]
17
+ text = text.gsub(/<%/, "&lt;%").gsub(/%>/, "%&gt;")# unless PufferPages.config[:allow_erb]
18
18
  text.gsub(/<(#{ids})%/, "<%").gsub(/%(#{ids})>/, "%>")
19
19
  end
20
20
 
21
- private
22
-
23
- def uid
24
- Digest::MD5.hexdigest("#{rand}#{Time.now.to_f}")
25
- end
26
-
27
21
  end
28
22
  end
29
23
  end
@@ -0,0 +1,3 @@
1
+ module PufferPages
2
+ VERSION = "0.1.0"
3
+ end
data/lib/puffer_pages.rb CHANGED
@@ -1,5 +1,14 @@
1
1
  module PufferPages
2
2
 
3
+ class PufferPagesError < StandardError
4
+ end
5
+
6
+ class DraftPage < PufferPagesError
7
+ end
8
+
9
+ class LayoutMissed < PufferPagesError
10
+ end
11
+
3
12
  mattr_accessor :primary_page_part_name
4
13
  self.primary_page_part_name = 'body'
5
14
 
@@ -19,6 +28,7 @@ require 'nested_set'
19
28
  require 'puffer_pages/engine'
20
29
  require 'puffer_pages/extensions/core'
21
30
  require 'puffer_pages/extensions/mapper'
22
- #require 'puffer_pages/liquid/tags/yield'
31
+ require 'puffer_pages/extensions/controller'
32
+ require 'puffer_pages/liquid/tags/yield'
23
33
  require 'puffer_pages/liquid/tags/stylesheets'
24
34
  require 'puffer_pages/liquid/tags/javascripts'