massimo 0.3.9 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,64 @@
1
+ module Massimo
2
+ module Resource
3
+ module Processing
4
+ def self.included(base) # :nodoc:
5
+ base.extend ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ # Determine if this Resource type is processable. By default this is `false`.
10
+ def processable?
11
+ false
12
+ end
13
+
14
+ # This will override `processable?` to return `true`.
15
+ def processable!
16
+ def self.processable?
17
+ true
18
+ end
19
+ end
20
+
21
+ # Process all the Resources in this Resource type's directory.
22
+ def process!
23
+ all(true).each(&:process!)
24
+ end
25
+ end
26
+
27
+ # Writes the rendered body to the output file.
28
+ def process!
29
+ if self.class.processable?
30
+ # Make the full path to the directory of the output file
31
+ FileUtils.mkdir_p(output_path.dirname)
32
+ # write the filtered data to the output file
33
+ output_path.open("w") do |file|
34
+ file.write render
35
+ end
36
+ else
37
+ false
38
+ end
39
+ end
40
+
41
+ protected
42
+
43
+ # Reads the source page file, and populates the `@meta_data` and
44
+ # `@body` attributes.
45
+ def read_source!
46
+ raise Massimo::MissingResource unless @source_path.exist?
47
+ # try to read it now
48
+ begin
49
+ @line = 1
50
+ @body = @source_path.read
51
+ rescue
52
+ raise Massimo::InvalidResource
53
+ end
54
+ end
55
+
56
+ # Determine the output file path
57
+ def output_path
58
+ @output_path ||= Pathname.new(
59
+ @source_path.to_s.sub(site.source_dir, site.output_dir)
60
+ )
61
+ end
62
+ end
63
+ end
64
+ end
data/lib/massimo/site.rb CHANGED
@@ -5,60 +5,42 @@ module Massimo
5
5
  # Default options. Overriden by values given when creating a Site.
6
6
  DEFAULT_OPTIONS = {
7
7
  :source => ".",
8
- :output => ::File.join(".", "public"),
8
+ :output => File.join(".", "public"),
9
9
  :server_port => "1984"
10
10
  }.freeze
11
11
 
12
- SOURCE_DIRS = [ :pages, :views, :stylesheets, :javascripts, :helpers, :lib ].freeze # :nodoc:
13
-
14
12
  attr_accessor :options, :helpers
15
13
 
16
14
  # Setup the Site with the given options. These options may be overridden by the config file.
17
15
  def setup(options = {})
18
16
  @options = DEFAULT_OPTIONS.dup.merge(options.symbolize_keys)
17
+ reload
19
18
  self
20
19
  end
21
20
 
22
- # Processes all the Pages, Stylesheets, and Javascripts and outputs
23
- # them to the output dir.
24
- def process!
21
+ # Reload helpers and libs.
22
+ def reload
25
23
  reload_helpers
26
24
  reload_libs
27
- pages(true).each(&:process!)
28
- stylesheets(true).each(&:process!)
29
- javascripts(true).each(&:process!)
30
- end
31
-
32
- # Get all the Pages in the pages dir.
33
- def pages(reload = false)
34
- return @pages if defined?(@pages) && !reload
35
- page_paths = self.find_files_in(:pages)
36
- @pages = page_paths.collect { |path| ::Massimo::Page.new(path) }
37
- end
38
-
39
- # Get all the Stylesheets in the stylesheets dir.
40
- def stylesheets(reload = false)
41
- return @stylesheets if defined?(@stylesheets) && !reload
42
- stylesheet_paths = self.find_files_in(:stylesheets, [ :css, :sass, :less ])
43
- @stylesheets = stylesheet_paths.collect { |path| ::Massimo::Stylesheet.new(path) }
25
+ reload_resources
44
26
  end
45
27
 
46
- # Get all the Javascripts in the javascripts dir.
47
- def javascripts(reload = false)
48
- return @javascripts if defined?(@javascripts) && !reload
49
- javascript_paths = self.find_files_in(:javascripts, [ :js ])
50
- @javascripts = javascript_paths.collect { |path| ::Massimo::Javascript.new(path) }
28
+ # Processes all the Pages, Stylesheets, and Javascripts and outputs
29
+ # them to the output dir.
30
+ def process!
31
+ reload
32
+ Massimo.processable_resources.each(&:process!)
51
33
  end
52
34
 
53
35
  # Finds a view by the given name
54
36
  def find_view(name, meta_data = {})
55
- view_path = Dir.glob(self.views_dir("#{name}.*")).first
56
- view_path && ::Massimo::View.new(view_path, meta_data)
37
+ view_path = Dir.glob(dir_for(:views, "#{name}.*")).first
38
+ view_path && Massimo::View.new(view_path, meta_data)
57
39
  end
58
40
 
59
41
  # Finds a view then renders it with the given locals
60
42
  def render_view(name, locals = {}, &block)
61
- view = self.find_view(name)
43
+ view = find_view(name)
62
44
  view && view.render(locals, &block)
63
45
  end
64
46
 
@@ -78,107 +60,65 @@ module Massimo
78
60
 
79
61
  # The path to the source dir
80
62
  def source_dir(*path)
81
- ::File.join(@options[:source], *path)
63
+ File.join(@options[:source], *path)
82
64
  end
83
65
 
84
- # Get all the source directories as an array.
85
- def all_source_dirs
86
- SOURCE_DIRS.collect { |d| dir_for(d) }
66
+ # Get the directory to the given resource type (pages, views, etc.).
67
+ # If the path has been manually set in the options, you will get that
68
+ # path. Otherwise you will get the path relative to the source directory.
69
+ def dir_for(type, *path)
70
+ if type_path = @options["#{type}_path".to_sym]
71
+ File.join(type_path, *path)
72
+ else
73
+ source_dir(type.to_s, *path)
74
+ end
87
75
  end
88
76
 
89
- SOURCE_DIRS.each do |d|
90
- define_method("#{d}_dir") do |*path|
91
- dir_for(d, *path)
92
- end
77
+ # Get all the source directories as an array.
78
+ def all_source_dirs
79
+ Massimo.resources.collect(&:dir) + [ dir_for(:helpers), dir_for(:lib) ]
93
80
  end
94
81
 
95
82
  # The path to the output dir
96
83
  def output_dir(*path)
97
- ::File.join(@options[:output], *path)
84
+ File.join(@options[:output], *path)
98
85
  end
99
86
 
100
87
  protected
101
-
102
- # Get the directory to the given resource type (pages, views, etc.).
103
- # If the path has been manually set in the options, you will get that
104
- # path. Otherwise you will get the path relative to the source directory.
105
- def dir_for(type, *path)
106
- if type_path = @options["#{type}_path".to_sym]
107
- ::File.join(type_path, *path)
108
- else
109
- self.source_dir(type.to_s, *path)
110
- end
111
- end
112
-
113
- # Find all the files in the given resouce type's directory, optionally
114
- # selecting only those with the given extensions. This will return
115
- # an array with the full path to the files.
116
- def find_files_in(type, extensions = nil)
117
- # the directory where these files will be found
118
- type_dir = self.dir_for(type)
119
-
120
- # By default get the file list from the options
121
- files = @options[type] && @options[type].dup
122
-
123
- unless files && files.is_a?(::Array)
124
- # If files aren't listed in the options, get them
125
- # from the given block
126
- glob = (extensions.nil? || extensions.empty?) ? "*" : "*.{#{extensions.join(",")}}"
127
- files = ::Dir.glob(::File.join(type_dir, "**", glob))
128
-
129
- # normalize the files by removing the directory from the path
130
- files.collect! { |file| file.gsub("#{type_dir}/", "") }
131
-
132
- # reject the files in the skip_files option, which can
133
- # either be an array or a Proc.
134
- if skip_files = @options["skip_#{type}".to_sym]
135
- files.reject! do |file|
136
- case skip_files
137
- when ::Array
138
- skip_files.include?(file)
139
- else ::Proc
140
- skip_files.call(file)
141
- end
142
- end
143
- end
144
- end
145
-
146
- # Reject all files that begin with _ (like partials) and directories
147
- files.reject! { |file| ::File.basename(file) =~ /^_/ }
148
-
149
- # now add the directory back to the path
150
- files.collect! { |file| ::File.join(type_dir, file) }
151
-
152
- # And make sure we don't find directories
153
- files.reject! { |file| ::File.directory?(file) }
154
- files
155
- end
156
88
 
157
89
  # Reload the Helpers instance with the helper modules
158
90
  def reload_helpers
159
- @helpers = ::Massimo::Helpers.new(self.helper_modules.compact)
91
+ @helpers = Helpers.new(helper_modules.compact)
160
92
  end
161
93
 
162
94
  # Reload all the files in the source lib dir.
163
95
  def reload_libs
164
- reload_files ::Dir.glob(lib_dir("**", "*.rb"))
96
+ reload_files Dir.glob(dir_for(:lib, "**", "*.rb"))
97
+ end
98
+
99
+ # Load methods for listing all available files for each Resource type.
100
+ def reload_resources
101
+ class_eval do
102
+ # Define methods for getting all of the files for each Resource Type
103
+ Massimo.processable_resources.each do |type|
104
+ define_method(type.name.to_s.pluralize) do |*args|
105
+ type.all(*args)
106
+ end
107
+ end
108
+ end
165
109
  end
166
110
 
167
111
  # Find all the helper modules
168
112
  def helper_modules
169
- reload_files ::Dir.glob(helpers_dir("*.rb"))
113
+ reload_files Dir.glob(dir_for(:helpers, "*.rb"))
170
114
  end
171
115
 
172
116
  # Relod the given file by removing their constants and loading the file again.
173
117
  # Return an Array of the reloaded Constants.
174
118
  def reload_files(files)
175
119
  files.collect do |file|
176
- class_name = ::File.basename(file).gsub(::File.extname(file), "").classify
177
- # Unload the constant if it already exists
178
- ::Object.class_eval { remove_const(class_name) if const_defined?(class_name) }
179
- # Load the constant
180
120
  load(file)
181
- # return the constant
121
+ class_name = File.basename(file).gsub(File.extname(file), "").classify
182
122
  class_name.constantize rescue nil
183
123
  end
184
124
  end
@@ -1,26 +1,18 @@
1
1
  module Massimo
2
- class Stylesheet < Resource
2
+ class Stylesheet < Massimo::Resource::Base
3
+ processable!
4
+
3
5
  # Render the css based on the type of resource
4
6
  def render
5
7
  case resource_type.to_sym
6
- when :css
7
- @body.to_s
8
8
  when :sass
9
- require "sass" unless defined? ::Sass
10
- ::Sass::Files.tree_for(@source_path, sass_options).render
9
+ require "sass" unless defined?(Sass)
10
+ Sass::Files.tree_for(@source_path, sass_options).render
11
11
  when :less
12
- require "less" unless defined? ::Less
13
- ::Less.parse(@body)
14
- end
15
- end
16
-
17
- # Writes the rendered css to the output file.
18
- def process!
19
- # Make the full path to the directory of the output file
20
- ::FileUtils.mkdir_p(self.output_path.dirname)
21
- # write the filtered data to the output file
22
- self.output_path.open("w") do |file|
23
- file.write self.render
12
+ require "less" unless defined?(Less)
13
+ Less.parse(@body)
14
+ else
15
+ @body.to_s
24
16
  end
25
17
  end
26
18
 
@@ -28,9 +20,10 @@ module Massimo
28
20
 
29
21
  # Determine the output file path
30
22
  def output_path
31
- @output_path ||= ::Pathname.new(@source_path.to_s.
32
- sub(self.site.source_dir, self.site.output_dir). # move to output dir
33
- sub(/#{@source_path.extname}$/, ".css")) # replace extension with .css
23
+ @output_path ||= Pathname.new(@source_path.to_s.
24
+ sub(site.source_dir, site.output_dir). # move to output dir
25
+ sub(/#{@source_path.extname}$/, ".css") # replace extension with .css
26
+ )
34
27
  end
35
28
 
36
29
  # Gets the Sass options, with Site options merged in.
@@ -38,8 +31,8 @@ module Massimo
38
31
  options = {
39
32
  :style => site.production? ? :compressed : :nested
40
33
  }
41
- options.merge!(self.site.options[:sass]) if self.site.options[:sass].is_a?(Hash)
42
- options.merge(:css_filename => self.output_path)
34
+ options.merge!(site.options[:sass]) if site.options[:sass].is_a?(Hash)
35
+ options.merge(:css_filename => output_path)
43
36
  end
44
37
 
45
38
  end
@@ -1,18 +1,18 @@
1
1
  module Tilt
2
- register :html, ::Tilt::ERBTemplate
3
- register :php, ::Tilt::ERBTemplate
2
+ register :html, Tilt::ERBTemplate
3
+ register :php, Tilt::ERBTemplate
4
4
 
5
5
  # My Markdown implementation.
6
6
  class MarkdownTemplate < Template
7
7
  def compile!
8
- @erb_engine = ::Tilt::ERBTemplate.new { data }
8
+ @erb_engine = Tilt::ERBTemplate.new { data }
9
9
  end
10
10
 
11
11
  def evaluate(scope, locals, &block)
12
12
  # First evaluate the code using ERB
13
13
  erb_output = @erb_engine.render(scope, locals, &block)
14
14
  # Then evaluate the code using the RDiscountTemplate
15
- ::Tilt::RDiscountTemplate.new { erb_output }.render
15
+ Tilt::RDiscountTemplate.new { erb_output }.render
16
16
  end
17
17
  end
18
18
  register :markdown, MarkdownTemplate
data/lib/massimo/view.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Massimo
2
- class View < Resource
2
+ class View < Massimo::Resource::Base
3
3
  attr_reader :meta_data
4
4
 
5
5
  # Creates a new page associated with the given file path.
@@ -8,15 +8,15 @@ module Massimo
8
8
  super(source_path)
9
9
  end
10
10
 
11
- # Renders the page using the registered filters.
11
+ # Renders the page using the appropriate Tilt Template
12
12
  def render(locals = {}, &block)
13
- template = ::Tilt.new(self.file_name, @line || 1, self.options_for_resource_type) { @body }
14
- template.render(self.site.helpers, @meta_data.merge(locals), &block)
13
+ template = Tilt.new(file_name, @line || 1, options_for_resource_type) { @body }
14
+ template.render(site.helpers, @meta_data.merge(locals), &block)
15
15
  end
16
16
 
17
17
  protected
18
18
 
19
- # All undefined methods are sent to the meta_data hash.
19
+ # All undefined methods are sent to the `@meta_data` hash.
20
20
  def method_missing(method, *args, &block)
21
21
  if method.to_s.match(/(.*)\=$/) && args.length == 1
22
22
  @meta_data[$1.to_sym] = args.first
data/lib/massimo.rb CHANGED
@@ -1,6 +1,3 @@
1
- libdir = ::File.dirname(__FILE__)
2
- $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
3
-
4
1
  # Rubygems
5
2
  require "rubygems"
6
3
 
@@ -15,24 +12,38 @@ require "jsmin"
15
12
  require "tilt"
16
13
 
17
14
  # Internal
18
- require "massimo/helpers"
19
- require "massimo/templates"
20
- require "massimo/site"
21
- require "massimo/resource"
22
- require "massimo/view"
23
- require "massimo/page"
24
- require "massimo/stylesheet"
25
- require "massimo/javascript"
15
+ lib_dir = File.dirname(__FILE__)
16
+ require File.join(lib_dir, "massimo", "helpers")
17
+ require File.join(lib_dir, "massimo", "templates")
18
+ require File.join(lib_dir, "massimo", "site")
26
19
 
27
20
  module Massimo
28
- VERSION = ::File.read(::File.join(::File.dirname(__FILE__), *%w{.. VERSION})) # :nodoc:
21
+ VERSION = File.read(File.join(File.dirname(__FILE__), "..", "VERSION")) # :nodoc:
29
22
 
30
- MissingResource = ::Class.new(StandardError) # :nodoc:
31
- InvalidResource = ::Class.new(StandardError) # :nodoc:
23
+ MissingResource = Class.new(StandardError) # :nodoc:
24
+ InvalidResource = Class.new(StandardError) # :nodoc:
32
25
 
33
- #
26
+ # This will create an instance of Massimo::Site the first time it is called.
27
+ # Everytime it's called afterwords, without options, it returns the same
28
+ # instance.
34
29
  def self.Site(options = {})
35
30
  return @site if defined?(@site) && options.empty?
36
- @site = ::Massimo::Site.instance.setup(options)
31
+ @site = Massimo::Site.instance.setup(options)
32
+ end
33
+
34
+ # All the avaiable Resource types
35
+ def self.resources
36
+ @resources ||= []
37
+ end
38
+
39
+ # All the Resource types that are processable.
40
+ def self.processable_resources
41
+ resources.select { |resource| resource.processable? }
37
42
  end
38
43
  end
44
+
45
+ require File.join(lib_dir, "massimo", "resource", "base")
46
+ require File.join(lib_dir, "massimo", "view")
47
+ require File.join(lib_dir, "massimo", "page")
48
+ require File.join(lib_dir, "massimo", "stylesheet")
49
+ require File.join(lib_dir, "massimo", "javascript")
data/massimo.gemspec CHANGED
@@ -5,14 +5,14 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{massimo}
8
- s.version = "0.3.9"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Peter Browne"]
12
- s.date = %q{2009-12-24}
12
+ s.date = %q{2010-01-09}
13
13
  s.default_executable = %q{massimo}
14
14
  s.description = %q{Massimo builds HTML, Javascript, and CSS Files from your source.}
15
- s.email = %q{peter@peterbrowne.net}
15
+ s.email = %q{me@petebrowne.com}
16
16
  s.executables = ["massimo"]
17
17
  s.extra_rdoc_files = [
18
18
  "LICENSE",
@@ -31,7 +31,9 @@ Gem::Specification.new do |s|
31
31
  "lib/massimo/helpers.rb",
32
32
  "lib/massimo/javascript.rb",
33
33
  "lib/massimo/page.rb",
34
- "lib/massimo/resource.rb",
34
+ "lib/massimo/resource/base.rb",
35
+ "lib/massimo/resource/collection.rb",
36
+ "lib/massimo/resource/processing.rb",
35
37
  "lib/massimo/site.rb",
36
38
  "lib/massimo/stylesheet.rb",
37
39
  "lib/massimo/templates.rb",
@@ -71,6 +73,7 @@ Gem::Specification.new do |s|
71
73
  "test/source/views/with_helper.haml",
72
74
  "test/source/views/with_locals.haml",
73
75
  "test/source/views/without_locals.haml",
76
+ "test/test_helpers.rb",
74
77
  "test/test_javascript.rb",
75
78
  "test/test_page.rb",
76
79
  "test/test_resource.rb",
@@ -88,6 +91,7 @@ Gem::Specification.new do |s|
88
91
  "test/helper.rb",
89
92
  "test/source/helpers/test_helper.rb",
90
93
  "test/source/lib/site.rb",
94
+ "test/test_helpers.rb",
91
95
  "test/test_javascript.rb",
92
96
  "test/test_page.rb",
93
97
  "test/test_resource.rb",
@@ -104,7 +108,7 @@ Gem::Specification.new do |s|
104
108
  s.add_development_dependency(%q<shoulda>, [">= 2.10.2"])
105
109
  s.add_development_dependency(%q<yard>, [">= 0.5.2"])
106
110
  s.add_runtime_dependency(%q<activesupport>, [">= 2.3.5"])
107
- s.add_runtime_dependency(%q<sinatra_more>, [">= 0.3.26"])
111
+ s.add_runtime_dependency(%q<sinatra_more>, [">= 0.3.29"])
108
112
  s.add_runtime_dependency(%q<directory_watcher>, [">= 1.3.1"])
109
113
  s.add_runtime_dependency(%q<sprockets>, [">= 1.0.2"])
110
114
  s.add_runtime_dependency(%q<jsmin>, [">= 1.0.1"])
@@ -112,7 +116,7 @@ Gem::Specification.new do |s|
112
116
  s.add_dependency(%q<shoulda>, [">= 2.10.2"])
113
117
  s.add_dependency(%q<yard>, [">= 0.5.2"])
114
118
  s.add_dependency(%q<activesupport>, [">= 2.3.5"])
115
- s.add_dependency(%q<sinatra_more>, [">= 0.3.26"])
119
+ s.add_dependency(%q<sinatra_more>, [">= 0.3.29"])
116
120
  s.add_dependency(%q<directory_watcher>, [">= 1.3.1"])
117
121
  s.add_dependency(%q<sprockets>, [">= 1.0.2"])
118
122
  s.add_dependency(%q<jsmin>, [">= 1.0.1"])
@@ -121,7 +125,7 @@ Gem::Specification.new do |s|
121
125
  s.add_dependency(%q<shoulda>, [">= 2.10.2"])
122
126
  s.add_dependency(%q<yard>, [">= 0.5.2"])
123
127
  s.add_dependency(%q<activesupport>, [">= 2.3.5"])
124
- s.add_dependency(%q<sinatra_more>, [">= 0.3.26"])
128
+ s.add_dependency(%q<sinatra_more>, [">= 0.3.29"])
125
129
  s.add_dependency(%q<directory_watcher>, [">= 1.3.1"])
126
130
  s.add_dependency(%q<sprockets>, [">= 1.0.2"])
127
131
  s.add_dependency(%q<jsmin>, [">= 1.0.1"])
data/test/helper.rb CHANGED
@@ -9,8 +9,7 @@ require "assertions"
9
9
  require "rr"
10
10
 
11
11
  # Load Massimo
12
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
13
- require "massimo"
12
+ require File.join(File.dirname(__FILE__), "..", "lib", "massimo")
14
13
 
15
14
  class Test::Unit::TestCase
16
15
  include Assertions
@@ -33,7 +32,7 @@ class Test::Unit::TestCase
33
32
 
34
33
  #
35
34
  def site(options = {})
36
- @site = Massimo::Site({
35
+ @site = ::Massimo::Site({
37
36
  :source => source_dir,
38
37
  :output => output_dir,
39
38
  :sass => { :cache => false }
@@ -42,13 +41,20 @@ class Test::Unit::TestCase
42
41
 
43
42
  #
44
43
  def page(*path)
45
- @page ||= Massimo::Page.new(source_dir("pages", *path))
44
+ @page ||= ::Massimo::Page.new(source_dir("pages", *path))
46
45
  end
47
46
 
48
47
  #
49
48
  def view(*path)
50
49
  return @view if defined?(@view)
51
50
  meta_data = path.extract_options!
52
- @view = Massimo::View.new(source_dir("views", *path), meta_data)
51
+ @view = ::Massimo::View.new(source_dir("views", *path), meta_data)
52
+ end
53
+
54
+ #
55
+ def source_page_paths
56
+ @source_page_paths ||= Pathname.glob(source_dir("pages", "**", "*")).
57
+ reject { |p| p.basename.to_s =~ /^_/ || File.directory?(p) }.
58
+ collect { |p| p.basename }
53
59
  end
54
60
  end
@@ -0,0 +1,25 @@
1
+ require File.join(File.dirname(__FILE__), "helper")
2
+
3
+ class TestHelpers < Test::Unit::TestCase
4
+ context "A Site's Helpers" do
5
+ setup do
6
+ @helpers = site().helpers
7
+ end
8
+
9
+ should "include sinatra_more's helper methods" do
10
+ assert @helpers.class.include?(SinatraMore::OutputHelpers)
11
+ assert @helpers.class.include?(SinatraMore::TagHelpers)
12
+ assert @helpers.class.include?(SinatraMore::AssetTagHelpers)
13
+ assert @helpers.class.include?(SinatraMore::FormHelpers)
14
+ assert @helpers.class.include?(SinatraMore::FormatHelpers)
15
+ end
16
+
17
+ should "have a method for accessing the Site" do
18
+ assert_equal @site, @helpers.site
19
+ end
20
+
21
+ should "have a method for rendering views like partials" do
22
+ assert_equal "<h1>Testing</h1>\n", @helpers.render("with_locals", :title => "Testing")
23
+ end
24
+ end
25
+ end
data/test/test_page.rb CHANGED
@@ -104,11 +104,17 @@ class TestPage < Test::Unit::TestCase
104
104
  end
105
105
 
106
106
  end
107
+
107
108
  context "with layouts" do
108
109
 
109
110
  should "filter the content from the page file correctly" do
110
111
  assert_equal "<title>ERB With Layout</title>\n<body><h1>ERB With Layout</h1></body>\n", page("erb_with_layout.erb").render
111
112
  end
113
+
114
+ should "render the page without a layout when calling #to_s" do
115
+ page("erb_with_layout.erb")
116
+ assert_equal @page.render(false), @page.to_s
117
+ end
112
118
  end
113
119
  end
114
120
 
@@ -6,22 +6,65 @@ class TestResource < Test::Unit::TestCase
6
6
 
7
7
  should "raise an error when reading a non-existent resource" do
8
8
  assert_raise Massimo::MissingResource do
9
- Massimo::Resource.new("some/non-existent/file")
9
+ Massimo::Resource::Base.new("some/non-existent/file")
10
10
  end
11
11
  end
12
12
 
13
13
  should "raise an error when reading an invalid resource" do
14
14
  assert_raise Massimo::InvalidResource do
15
- Massimo::Resource.new(source_dir("views", "layouts"))
15
+ Massimo::Resource::Base.new(source_dir("views", "layouts"))
16
16
  end
17
17
  end
18
18
 
19
19
  should "have a method to get the resource's type (extension)" do
20
- assert_equal Massimo::Resource.new(source_dir("pages", "about_us.erb")).resource_type, "erb"
20
+ assert_equal Massimo::Resource::Base.new(source_dir("pages", "about_us.erb")).resource_type, "erb"
21
21
  end
22
22
 
23
23
  should "render the resource files data" do
24
- assert_equal Massimo::Resource.new(source_dir("pages", "without_meta_data.haml")).render, "%h1 A Page without meta_data"
24
+ assert_equal Massimo::Resource::Base.new(source_dir("pages", "without_meta_data.haml")).render, "%h1 A Page without meta_data"
25
+ end
26
+
27
+ context "with unprocessable Resources" do
28
+ should "not process resources when process! is called" do
29
+ assert Massimo::View.processable? == false
30
+ assert view("with_locals.haml").process! == false
31
+ end
32
+ end
33
+
34
+ context "with Resource collections" do
35
+ should "find only the pages set in the :pages option" do
36
+ only_pages = %w{about_us.erb feed.haml index.erb}
37
+ site(:pages => only_pages)
38
+ page_paths = Massimo::Page.all(true).collect { |page| page.source_path.basename }
39
+ assert_equal_arrays only_pages, page_paths
40
+ end
41
+
42
+ should "skip pages set in the :skip_pages option (as an Array)" do
43
+ site(:skip_pages => %w{about_us.erb erb.erb erb_with_layout.erb feed.haml posts/first-post.haml haml.haml html.html index.erb markdown.markdown})
44
+ page_paths = Massimo::Page.all(true).collect { |page| page.source_path.basename }
45
+ assert_equal_arrays [
46
+ "with_extension.haml",
47
+ "with_meta_data.haml",
48
+ "with_title.haml",
49
+ "with_url.haml",
50
+ "without_extension.haml",
51
+ "without_meta_data.haml",
52
+ "without_title.haml",
53
+ "without_url.haml"
54
+ ], page_paths
55
+ end
56
+
57
+ should "skip pages set in the :skip_pages option (as a Proc)" do
58
+ site(:skip_pages => lambda { |file| file.include?("with") })
59
+ page_paths = Massimo::Page.all(true).collect { |page| page.source_path.basename }
60
+ assert_equal_arrays %w{about_us.erb erb.erb feed.haml first-post.haml haml.haml html.html index.erb markdown.markdown}, page_paths
61
+ end
62
+
63
+ should "not skip any pages when :skip_pages is set incorrectly" do
64
+ site(:skip_pages => 15)
65
+ page_paths = Massimo::Page.all(true).collect { |page| page.source_path.basename }
66
+ assert_equal_arrays source_page_paths, page_paths
67
+ end
25
68
  end
26
69
  end
27
70
  end