radiant-layouts-extension 0.9.1 → 1.0.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 (39) hide show
  1. data/MIT-LICENSE +75 -4
  2. data/README.md +48 -1
  3. data/Rakefile +56 -15
  4. data/VERSION +1 -1
  5. data/app/models/haml_filter.rb +5 -0
  6. data/app/views/layouts/radiant.html.haml +1 -1
  7. data/config/routes.rb +5 -0
  8. data/layouts_extension.rb +13 -5
  9. data/lib/haml_layouts/models/layout.rb +34 -0
  10. data/lib/haml_layouts/models/page.rb +31 -0
  11. data/lib/nested_layouts/tags/core.rb +141 -0
  12. data/lib/share_layouts/controllers/action_controller.rb +25 -0
  13. data/lib/share_layouts/helpers/action_view.rb +50 -0
  14. data/lib/tasks/layouts_extension_tasks.rake +27 -6
  15. data/radiant-layouts-extension.gemspec +37 -26
  16. data/spec/controllers/{share_layouts_spec.rb → share_controller_spec.rb} +0 -0
  17. data/spec/datasets/layouts_layouts.rb +36 -0
  18. data/spec/datasets/layouts_pages.rb +43 -0
  19. data/spec/lib/haml_layouts/haml_layouts_extension_spec.rb +22 -0
  20. data/spec/lib/haml_layouts/models/layout_spec.rb +36 -0
  21. data/spec/lib/haml_layouts/models/page_spec.rb +40 -0
  22. data/spec/lib/nested_layouts/nested_layouts_extension_spec.rb +16 -0
  23. data/spec/lib/nested_layouts/{tags_spec.rb → tags/core_spec.rb} +41 -17
  24. data/spec/{controllers/nested_layouts_spec.rb → lib/share_layouts/controllers/action_controller_spec.rb} +0 -1
  25. data/spec/{helpers/share_layouts_helper_spec.rb → lib/share_layouts/helpers/action_view_spec.rb} +32 -29
  26. data/spec/lib/share_layouts/share_layouts_extension_spec.rb +22 -0
  27. data/spec/models/haml_filter_spec.rb +0 -0
  28. data/spec/models/rails_page_spec.rb +9 -9
  29. data/spec/spec.opts +2 -3
  30. metadata +43 -28
  31. data/lib/nested_layouts.rb +0 -2
  32. data/lib/nested_layouts/tags.rb +0 -127
  33. data/lib/share_layouts.rb +0 -2
  34. data/lib/share_layouts/helper.rb +0 -39
  35. data/lib/share_layouts/radiant_layouts.rb +0 -21
  36. data/spec/datasets/nested_layouts_dataset.rb +0 -38
  37. data/spec/datasets/share_layouts_dataset.rb +0 -38
  38. data/spec/lib/share_layouts_extension_spec.rb +0 -25
  39. data/spec/rcov.opts +0 -2
@@ -0,0 +1,25 @@
1
+ module ShareLayouts
2
+ module Controllers
3
+ module ActionController
4
+
5
+ def self.included(base)
6
+ base.extend ClassMethods
7
+ end
8
+
9
+ module ClassMethods
10
+ def radiant_layout(name=nil, options={}, &block)
11
+ raise ArgumentError, "A layout name or block is required!" unless name || block
12
+ write_inheritable_attribute 'radiant_layout', name || block
13
+ before_filter :set_radiant_layout
14
+ layout 'radiant', options
15
+ end
16
+ end
17
+
18
+ def set_radiant_layout
19
+ @radiant_layout = self.class.read_inheritable_attribute 'radiant_layout'
20
+ @radiant_layout = @radiant_layout.call(self) if @radiant_layout.is_a? Proc
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,50 @@
1
+ module ShareLayouts
2
+ module Helpers
3
+ module ActionView
4
+
5
+ def self.included(base)
6
+ base.class_eval do
7
+
8
+ def radiant_layout(name = @radiant_layout)
9
+ page = find_page
10
+ assign_attributes!(page, name)
11
+ page.build_parts_from_hash!(extract_captures)
12
+ page.render
13
+ end
14
+
15
+ def assign_attributes!(page, name = @radiant_layout)
16
+ page.layout = Layout.find_by_name(name) || page.layout
17
+ page.title = @title || @content_for_title || page.title || ''
18
+ page.breadcrumb = @breadcrumb || @content_for_breadcrumb || page.breadcrumb || page.title
19
+ page.breadcrumbs = @breadcrumbs || @content_for_breadcrumbs || nil
20
+ page.url = request.path
21
+ page.slug = page.url.split("/").last
22
+ page.published_at ||= Time.now
23
+ page.request = request
24
+ page.response = response
25
+ end
26
+
27
+ def extract_captures
28
+ variables = instance_variables.grep(/@content_for_/)
29
+ variables.inject({}) do |h, var|
30
+ var =~ /^@content_for_(.*)$/
31
+ key = $1.intern
32
+ key = :body if key == :layout
33
+ unless key == :title || key == :breadcrumbs
34
+ h[key] = instance_variable_get(var)
35
+ end
36
+ h
37
+ end
38
+ end
39
+
40
+ def find_page
41
+ page = Page.find_by_url(request.path) rescue nil
42
+ page.is_a?(RailsPage) ? page : RailsPage.new(:class_name => "RailsPage")
43
+ end
44
+
45
+ end
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -2,15 +2,37 @@ namespace :radiant do
2
2
  namespace :extensions do
3
3
  namespace :layouts do
4
4
 
5
- desc "Runs the migration of the Shop Products extension and its dependancies"
5
+ desc "Runs the migration of the Layouts extension"
6
6
  task :migrate => :environment do
7
- puts "radiant:layouts:migrate - Nohing to do"
7
+ require 'radiant/extension_migrator'
8
+ if ENV["VERSION"]
9
+ LayoutsExtension.migrator.migrate(ENV["VERSION"].to_i)
10
+ Rake::Task['db:schema:dump'].invoke
11
+ else
12
+ LayoutsExtension.migrator.migrate
13
+ Rake::Task['db:schema:dump'].invoke
14
+ end
8
15
  end
9
16
 
10
- desc "Copies public assets of the Shop Products to the instance public/ directory."
17
+ desc "Copies public assets of the Layouts to the instance public/ directory."
11
18
  task :update => :environment do
12
- puts "radiant:layouts:update - Nohing to do"
13
- end
19
+ is_svn_or_dir = proc {|path| path =~ /\.svn/ || File.directory?(path) }
20
+ puts "Copying assets from LayoutsExtension"
21
+ Dir[LayoutsExtension.root + "/public/**/*"].reject(&is_svn_or_dir).each do |file|
22
+ path = file.sub(LayoutsExtension.root, '')
23
+ directory = File.dirname(path)
24
+ mkdir_p RAILS_ROOT + directory, :verbose => false
25
+ cp file, RAILS_ROOT + path, :verbose => false
26
+ end
27
+ unless LayoutsExtension.root.starts_with? RAILS_ROOT # don't need to copy vendored tasks
28
+ puts "Copying rake tasks from LayoutsExtension"
29
+ local_tasks_path = File.join(RAILS_ROOT, %w(lib tasks))
30
+ mkdir_p local_tasks_path, :verbose => false
31
+ Dir[File.join LayoutsExtension.root, %w(lib tasks *.rake)].each do |file|
32
+ cp file, local_tasks_path, :verbose => false
33
+ end
34
+ end
35
+ end
14
36
 
15
37
  desc "Syncs all available translations for this ext to the English ext master"
16
38
  task :sync => :environment do
@@ -28,7 +50,6 @@ namespace :radiant do
28
50
  TranslationSupport.write_file(filename, basename, comments, other)
29
51
  end
30
52
  end
31
-
32
53
  end
33
54
  end
34
55
  end
@@ -5,13 +5,13 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{radiant-layouts-extension}
8
- s.version = "0.9.1"
8
+ s.version = "1.0.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Dirk Kelly"]
12
- s.date = %q{2010-08-30}
13
- s.description = %q{Provides extensions to standard layouts, including nesting of layouts within each other and sharing radiant layouts with rails controllers}
14
- s.email = %q{dk@squaretalent.com}
11
+ s.authors = ["Michael Klett", "Jim Gay", "William Ross", "Tony Issakov", "Dirk Kelly"]
12
+ s.date = %q{2010-10-20}
13
+ s.description = %q{Extends Radiant Layouts to support nesting, sharing with Rails Controllers and rendering HAML}
14
+ s.email = %q{dk@dirkkelly.com}
15
15
  s.extra_rdoc_files = [
16
16
  "README.md"
17
17
  ]
@@ -21,25 +21,31 @@ Gem::Specification.new do |s|
21
21
  "README.md",
22
22
  "Rakefile",
23
23
  "VERSION",
24
+ "app/models/haml_filter.rb",
24
25
  "app/models/rails_page.rb",
25
26
  "app/views/layouts/radiant.html.haml",
27
+ "config/routes.rb",
26
28
  "layouts_extension.rb",
27
- "lib/nested_layouts.rb",
28
- "lib/nested_layouts/tags.rb",
29
- "lib/share_layouts.rb",
30
- "lib/share_layouts/helper.rb",
31
- "lib/share_layouts/radiant_layouts.rb",
29
+ "lib/haml_layouts/models/layout.rb",
30
+ "lib/haml_layouts/models/page.rb",
31
+ "lib/nested_layouts/tags/core.rb",
32
+ "lib/share_layouts/controllers/action_controller.rb",
33
+ "lib/share_layouts/helpers/action_view.rb",
32
34
  "lib/tasks/layouts_extension_tasks.rake",
33
35
  "radiant-layouts-extension.gemspec",
34
- "spec/controllers/nested_layouts_spec.rb",
35
- "spec/controllers/share_layouts_spec.rb",
36
- "spec/datasets/nested_layouts_dataset.rb",
37
- "spec/datasets/share_layouts_dataset.rb",
38
- "spec/helpers/share_layouts_helper_spec.rb",
39
- "spec/lib/nested_layouts/tags_spec.rb",
40
- "spec/lib/share_layouts_extension_spec.rb",
36
+ "spec/controllers/share_controller_spec.rb",
37
+ "spec/datasets/layouts_layouts.rb",
38
+ "spec/datasets/layouts_pages.rb",
39
+ "spec/lib/haml_layouts/haml_layouts_extension_spec.rb",
40
+ "spec/lib/haml_layouts/models/layout_spec.rb",
41
+ "spec/lib/haml_layouts/models/page_spec.rb",
42
+ "spec/lib/nested_layouts/nested_layouts_extension_spec.rb",
43
+ "spec/lib/nested_layouts/tags/core_spec.rb",
44
+ "spec/lib/share_layouts/controllers/action_controller_spec.rb",
45
+ "spec/lib/share_layouts/helpers/action_view_spec.rb",
46
+ "spec/lib/share_layouts/share_layouts_extension_spec.rb",
47
+ "spec/models/haml_filter_spec.rb",
41
48
  "spec/models/rails_page_spec.rb",
42
- "spec/rcov.opts",
43
49
  "spec/spec.opts",
44
50
  "spec/spec_helper.rb"
45
51
  ]
@@ -47,15 +53,20 @@ Gem::Specification.new do |s|
47
53
  s.rdoc_options = ["--charset=UTF-8"]
48
54
  s.require_paths = ["lib"]
49
55
  s.rubygems_version = %q{1.3.7}
50
- s.summary = %q{Provides extensions to standard layouts, including nesting and sharing}
56
+ s.summary = %q{Extends Radiant Layouts to support nesting, sharing with Rails Controllers and rendering HAML}
51
57
  s.test_files = [
52
- "spec/controllers/nested_layouts_spec.rb",
53
- "spec/controllers/share_layouts_spec.rb",
54
- "spec/datasets/nested_layouts_dataset.rb",
55
- "spec/datasets/share_layouts_dataset.rb",
56
- "spec/helpers/share_layouts_helper_spec.rb",
57
- "spec/lib/nested_layouts/tags_spec.rb",
58
- "spec/lib/share_layouts_extension_spec.rb",
58
+ "spec/controllers/share_controller_spec.rb",
59
+ "spec/datasets/layouts_layouts.rb",
60
+ "spec/datasets/layouts_pages.rb",
61
+ "spec/lib/haml_layouts/haml_layouts_extension_spec.rb",
62
+ "spec/lib/haml_layouts/models/layout_spec.rb",
63
+ "spec/lib/haml_layouts/models/page_spec.rb",
64
+ "spec/lib/nested_layouts/nested_layouts_extension_spec.rb",
65
+ "spec/lib/nested_layouts/tags/core_spec.rb",
66
+ "spec/lib/share_layouts/controllers/action_controller_spec.rb",
67
+ "spec/lib/share_layouts/helpers/action_view_spec.rb",
68
+ "spec/lib/share_layouts/share_layouts_extension_spec.rb",
69
+ "spec/models/haml_filter_spec.rb",
59
70
  "spec/models/rails_page_spec.rb",
60
71
  "spec/spec_helper.rb"
61
72
  ]
@@ -0,0 +1,36 @@
1
+ class LayoutsLayoutsDataset < Dataset::Base
2
+
3
+ def load
4
+ create_record :layout, :parent,
5
+ :name => 'parent',
6
+ :content_type => 'haml',
7
+ :content => <<-CONTENT
8
+ !!! 5
9
+ %html
10
+ %head
11
+ %title Title
12
+ :plain
13
+ <r:body class="site">
14
+ <r:content_for_layout />
15
+ </r:body>
16
+ CONTENT
17
+
18
+ create_record :layout, :child,
19
+ :name => 'child',
20
+ :content => <<-CONTENT
21
+ <r:inside_layout name='parent'>
22
+ <h1><r:layout /></h1>
23
+ </r:inside_layout>
24
+ CONTENT
25
+
26
+ create_record :layout, :haml,
27
+ :name => 'haml',
28
+ :content_type => 'haml',
29
+ :content => <<-CONTENT
30
+ %r:inside_layout{:name=>"parent"}
31
+ %h1
32
+ %r:layout
33
+ CONTENT
34
+ end
35
+
36
+ end
@@ -0,0 +1,43 @@
1
+ class LayoutsPagesDataset < Dataset::Base
2
+
3
+ uses :layouts_layouts
4
+
5
+ def load
6
+ create_record :page, :parent,
7
+ :title => 'Parent',
8
+ :layout_id => layouts(:parent).id,
9
+ :breadcrumb => 'parent',
10
+ :slug => '/',
11
+ :status_id => 100
12
+
13
+ create_record :page, :child,
14
+ :title => 'Child',
15
+ :layout_id => layouts(:child).id,
16
+ :parent_id => pages(:parent).id,
17
+ :breadcrumb => 'child',
18
+ :slug => '/child',
19
+ :status_id => 100
20
+
21
+ create_record :page, :rails,
22
+ :title => 'App page',
23
+ :breadcrumb => 'App page',
24
+ :slug => 'app',
25
+ :class_name => 'RailsPage',
26
+ :status_id => 100,
27
+ :parent_id => pages(:parent).id
28
+
29
+ create_record :page, :rails_child,
30
+ :title => 'Child',
31
+ :breadcrumb => 'Child',
32
+ :slug => 'child-page',
33
+ :status_id => 100,
34
+ :parent_id => pages(:rails).id
35
+
36
+ create_record :page, :other,
37
+ :title => 'Other',
38
+ :breadcrumb => 'Other',
39
+ :slug => 'other',
40
+ :status_id => 100,
41
+ :parent_id => pages(:parent).id
42
+ end
43
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec/spec_helper'
2
+
3
+ # Ensures that the Extension initializes correctly
4
+ describe LayoutsExtension do
5
+
6
+ context 'activate' do
7
+
8
+ describe 'haml layouts' do
9
+ it 'should have a HamlFilter class to call' do
10
+ HamlFilter.should_not be_nil
11
+ end
12
+ it 'should extend Layout base methods' do
13
+ Layout.included_modules.include?(HamlLayouts::Models::Layout).should be_true
14
+ end
15
+ it 'should extend Page base methods' do
16
+ Page.included_modules.include?(HamlLayouts::Models::Page).should be_true
17
+ end
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe HamlLayouts::Models::Layout do
4
+
5
+ dataset :layouts_layouts, :layouts_pages
6
+
7
+ describe 'content' do
8
+ context 'a haml layout' do
9
+ it 'should return html rendered' do
10
+ expected = <<-CONTENT
11
+ <r:inside_layout name='parent'>
12
+ <h1>
13
+ <r:layout></r:layout>
14
+ </h1>
15
+ </r:inside_layout>
16
+ CONTENT
17
+ layouts(:haml).content.should === expected
18
+ end
19
+ end
20
+ end
21
+
22
+ describe 'is_haml?' do
23
+ context 'layout has a content type of haml' do
24
+ it 'should return true' do
25
+ layouts(:haml).is_haml?.should be_true
26
+ end
27
+ end
28
+
29
+ context 'layout does not have a content type of haml' do
30
+ it 'should return false' do
31
+ layouts(:child).is_haml?.should be_false
32
+ end
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe HamlLayouts::Models::Page do
4
+
5
+ dataset :layouts_layouts, :layouts_pages
6
+
7
+ describe 'parse_object' do
8
+ context 'haml filter type' do
9
+ it 'should render haml radius tags' do
10
+ @part = PagePart.new({
11
+ :content => '%r:title',
12
+ :filter_id => 'Haml'
13
+ })
14
+ @page = pages(:parent)
15
+
16
+ @page.parse_object(@part).should === "#{@page.title}\n"
17
+ end
18
+
19
+ it 'should render textile radius tags' do
20
+ @part = PagePart.new({
21
+ :content => 'h1. <r:title />',
22
+ :filter_id => 'Textile'
23
+ })
24
+ @page = pages(:parent)
25
+
26
+ @page.parse_object(@part).should === "<h1>#{@page.title}</h1>"
27
+ end
28
+
29
+ it 'should render non filtered tags' do
30
+ @part = PagePart.new({
31
+ :content => '<r:title />'
32
+ })
33
+ @page = pages(:parent)
34
+
35
+ @page.parse_object(@part).should === @page.title
36
+ end
37
+ end
38
+ end
39
+
40
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec/spec_helper'
2
+
3
+ # Ensures that the Extension initializes correctly
4
+ describe LayoutsExtension do
5
+
6
+ context 'activate' do
7
+
8
+ describe 'nested layouts' do
9
+ it 'should extend Page base methods' do
10
+ Page.included_modules.include?(NestedLayouts::Tags::Core).should be_true
11
+ end
12
+ end
13
+
14
+ end
15
+
16
+ end
@@ -1,33 +1,41 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
1
+ require 'spec/spec_helper'
2
2
 
3
- describe NestedLayouts::Tags do
4
- dataset :pages
5
- dataset :nested_layouts
3
+ describe NestedLayouts::Tags::Core do
6
4
 
7
- describe '<r:inside_layout>, <r:layout> and <r:content_for_layout>' do
5
+ dataset :layouts_pages, :layouts_layouts
6
+
7
+ describe '<r:inside_layout>, <r:layout>, <r:body /> and <r:content_for_layout>' do
8
8
 
9
9
  it 'should output tag within the body of class name for parent layout' do
10
10
  tag = %{<r:inside_layout name='parent'><h1>Hi</h1></r:inside_layout>}
11
11
  expected = <<-CONTENT
12
+ <!DOCTYPE html>
12
13
  <html>
13
- <body class="parent">
14
+ <head>
15
+ <title>Title</title>
16
+ </head>
17
+ <body class="site parent">
14
18
  <h1>Hi</h1>
15
19
  </body>
16
20
  </html>
17
21
  CONTENT
18
- pages(:parent_layout).should render(tag).as(expected)
22
+ pages(:parent).should render(tag).as(expected)
19
23
  end
20
24
 
21
25
  it 'should output tag within the body of class name for a child_layout' do
22
26
  tag = %{<r:inside_layout name='parent'><h1>Hi</h1></r:inside_layout>}
23
27
  expected = <<-CONTENT
28
+ <!DOCTYPE html>
24
29
  <html>
25
- <body class="child">
30
+ <head>
31
+ <title>Title</title>
32
+ </head>
33
+ <body class="site child">
26
34
  <h1>Hi</h1>
27
35
  </body>
28
36
  </html>
29
37
  CONTENT
30
- pages(:child_layout).should render(tag).as(expected)
38
+ pages(:child).should render(tag).as(expected)
31
39
  end
32
40
 
33
41
  end
@@ -37,25 +45,33 @@ CONTENT
37
45
  it 'it should render the contents if true' do
38
46
  tag = %{<r:inside_layout name='parent'><r:if_layout name='parent'><h1>Hi</h1></r:if_layout></r:inside_layout>}
39
47
  expected = <<-CONTENT
48
+ <!DOCTYPE html>
40
49
  <html>
41
- <body class="parent">
50
+ <head>
51
+ <title>Title</title>
52
+ </head>
53
+ <body class="site parent">
42
54
  <h1>Hi</h1>
43
55
  </body>
44
56
  </html>
45
57
  CONTENT
46
- pages(:parent_layout).should render(tag).as(expected)
58
+ pages(:parent).should render(tag).as(expected)
47
59
  end
48
60
 
49
61
  it 'it should not render the contents if false' do
50
62
  tag = %{<r:inside_layout name='parent'><r:if_layout name='not parent'><h1>Hi</h1></r:if_layout></r:inside_layout>}
51
63
  expected = <<-CONTENT
64
+ <!DOCTYPE html>
52
65
  <html>
53
- <body class="parent">
66
+ <head>
67
+ <title>Title</title>
68
+ </head>
69
+ <body class="site parent">
54
70
 
55
71
  </body>
56
72
  </html>
57
73
  CONTENT
58
- pages(:parent_layout).should render(tag).as(expected)
74
+ pages(:parent).should render(tag).as(expected)
59
75
  end
60
76
 
61
77
  end
@@ -65,25 +81,33 @@ CONTENT
65
81
  it 'it should not render the contents if true' do
66
82
  tag = %{<r:inside_layout name='parent'><r:unless_layout name='parent'><h1>Hi</h1></r:unless_layout></r:inside_layout>}
67
83
  expected = <<-CONTENT
84
+ <!DOCTYPE html>
68
85
  <html>
69
- <body class="parent">
86
+ <head>
87
+ <title>Title</title>
88
+ </head>
89
+ <body class="site parent">
70
90
 
71
91
  </body>
72
92
  </html>
73
93
  CONTENT
74
- pages(:parent_layout).should render(tag).as(expected)
94
+ pages(:parent).should render(tag).as(expected)
75
95
  end
76
96
 
77
97
  it 'it should not render the contents if false' do
78
98
  tag = %{<r:inside_layout name='parent'><r:unless_layout name='not parent'><h1>Hi</h1></r:unless_layout></r:inside_layout>}
79
99
  expected = <<-CONTENT
100
+ <!DOCTYPE html>
80
101
  <html>
81
- <body class="parent">
102
+ <head>
103
+ <title>Title</title>
104
+ </head>
105
+ <body class="site parent">
82
106
  <h1>Hi</h1>
83
107
  </body>
84
108
  </html>
85
109
  CONTENT
86
- pages(:parent_layout).should render(tag).as(expected)
110
+ pages(:parent).should render(tag).as(expected)
87
111
  end
88
112
 
89
113
  end