massimo 0.3.9 → 0.4.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.
@@ -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