pith 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,3 +1,7 @@
1
+ require 'bundler'
2
+
3
+ Bundler::GemHelper.install_tasks
4
+
1
5
  task :default => :spec
2
6
 
3
7
  require 'spec/rake/spectask'
@@ -0,0 +1,16 @@
1
+ Feature: error handling
2
+
3
+ I want to be told when something goes wrong
4
+
5
+ Scenario: bad haml
6
+
7
+ Given input file "index.html.haml" contains
8
+ """
9
+ %h2{class="this is not valid ruby"} Heading
10
+
11
+ %p Content
12
+ """
13
+
14
+ When I build the site
15
+
16
+ Then output file "index.html" should contain /syntax error/
@@ -1,37 +1,28 @@
1
1
  Feature: ignorable files are ignored
2
2
 
3
- I want any file (or directory) beginning with "_" to be ignored
3
+ I want certain files (or directories) to be ignored
4
4
  So that I can place supporting files anywhere within the input directory
5
-
6
- Scenario: a layout template at the input root
7
5
 
8
- Given input file "_layout.haml" contains
9
- """
10
- Blah de blah
11
- """
12
-
13
- When I build the site
14
-
15
- Then output file "_layout" should not exist
16
-
17
- Scenario: a partial in an ignored subdirectory
6
+ Scenario Outline: ignorable templates
18
7
 
19
- Given input file "_partials/foo.html.haml" contains
20
- """
21
- Blah de blah
22
- """
23
-
8
+ Given input file <input> exists
24
9
  When I build the site
25
-
26
- Then output file "_partials/foo.html" should not exist
10
+ Then output file <output> should not exist
27
11
 
28
- Scenario: an ignored partial in a subdirectory
12
+ Examples:
13
+ | input | output |
14
+ | "_layout.haml" | "_layout" |
15
+ | "_partials/foo.html.haml" | "_partials/foo.html" |
16
+ | "partials/_foo.html.haml" | "partials/_foo.html" |
29
17
 
30
- Given input file "partials/_foo.html.haml" contains
31
- """
32
- Blah de blah
33
- """
34
-
18
+ Scenario Outline: ignorable resources
19
+
20
+ Given input file <file> exists
35
21
  When I build the site
36
-
37
- Then output file "partials/_foo.html" should not exist
22
+ Then output file <file> should not exist
23
+
24
+ Examples:
25
+ | file |
26
+ | "_data/xyz.json" |
27
+ | ".git/config" |
28
+ | "xyz/.svn/blah" |
@@ -49,6 +49,10 @@ Then /^output file "([^\"]*)" should contain "([^\"]*)"$/ do |path, content|
49
49
  @outputs[path].clean.should == content.clean
50
50
  end
51
51
 
52
+ Then %r{^output file "([^\"]*)" should contain /([^\/]*)/$} do |path, regexp|
53
+ @outputs[path].clean.should =~ Regexp.compile(regexp)
54
+ end
55
+
52
56
  Then /^output file "([^\"]*)" should contain$/ do |path, content|
53
57
  @outputs[path].clean.should == content.clean
54
58
  end
@@ -64,3 +68,7 @@ end
64
68
  Then /^output file "([^"]*)" should not be re\-generated$/ do |path|
65
69
  @project.logger.messages.should_not contain(/--> +#{path}/)
66
70
  end
71
+
72
+ Then /^output file "([^\"]*)" should contain an error$/ do |path|
73
+ @outputs[path].clean.should == "foo"
74
+ end
@@ -1,3 +1,5 @@
1
+ require 'spec'
2
+
1
3
  Spec::Matchers.define :contain do |expected|
2
4
  match do |actual|
3
5
  actual.any? { |x| expected === x }
@@ -2,13 +2,24 @@ module Pith
2
2
 
3
3
  class ConsoleLogger
4
4
 
5
- def initialize(io = STDOUT)
6
- @io = io
5
+ def initialize(out = STDOUT, err = STDERR)
6
+ @out = out
7
+ @err = err
7
8
  end
8
9
 
9
10
  def info(message, &block)
10
11
  message ||= block.call
11
- @io.puts(message)
12
+ @out.puts(message)
13
+ end
14
+
15
+ def warn(message, &block)
16
+ message ||= block.call
17
+ @err.puts(message)
18
+ end
19
+
20
+ def error(message, &block)
21
+ message ||= block.call
22
+ @err.puts("ERROR: " + message)
12
23
  end
13
24
 
14
25
  end
@@ -0,0 +1,9 @@
1
+ class Exception
2
+
3
+ def summary(options = {})
4
+ max_backtrace = options[:max_backtrace] || 999
5
+ trimmed_backtrace = self.backtrace[0, max_backtrace]
6
+ (["#{self.class}: #{self.message}"] + trimmed_backtrace).join("\n ") + "\n"
7
+ end
8
+
9
+ end
@@ -59,7 +59,11 @@ module Pith
59
59
  # Returns true if it can.
60
60
  #
61
61
  def ignorable?
62
- path.to_s.split("/").any? { |component| component.to_s[0,1] == "_" }
62
+ path.each_filename do |path_component|
63
+ project.ignore_patterns.each do |pattern|
64
+ return true if File.fnmatch(pattern, path_component)
65
+ end
66
+ end
63
67
  end
64
68
 
65
69
  protected
@@ -1,5 +1,6 @@
1
1
  require "fileutils"
2
2
  require "pathname"
3
+ require "pith/exception_ext"
3
4
  require "pith/input/abstract"
4
5
  require "pith/render_context"
5
6
  require "tilt"
@@ -22,7 +23,6 @@ module Pith
22
23
  path.to_str =~ /^(.+)\.(.+)$/ || raise("huh?")
23
24
  @output_path = Pathname($1)
24
25
  @type = $2
25
- load
26
26
  end
27
27
 
28
28
  attr_reader :output_path, :type
@@ -41,7 +41,13 @@ module Pith
41
41
  output_file.parent.mkpath
42
42
  render_context = RenderContext.new(project)
43
43
  output_file.open("w") do |out|
44
- out.puts(render_context.render(self))
44
+ begin
45
+ out.puts(render_context.render(self))
46
+ rescue Exception => e
47
+ logger.warn e.summary(:max_backtrace => 5)
48
+ out.puts "<pre>"
49
+ out.puts e.summary
50
+ end
45
51
  end
46
52
  @dependencies = render_context.dependencies
47
53
  end
@@ -49,6 +55,7 @@ module Pith
49
55
  # Render this input using Tilt
50
56
  #
51
57
  def render(context, locals = {}, &block)
58
+ load
52
59
  @tilt_template.render(context, locals, &block)
53
60
  end
54
61
 
@@ -72,6 +79,7 @@ module Pith
72
79
  # Returns a Hash.
73
80
  #
74
81
  def meta
82
+ load
75
83
  @meta
76
84
  end
77
85
 
@@ -100,6 +108,7 @@ module Pith
100
108
  # Read input file, extracting YAML meta-data header, and template content.
101
109
  #
102
110
  def load
111
+ return false if @tilt_template
103
112
  @meta = {}
104
113
  file.open do |input|
105
114
  header = input.gets
@@ -8,13 +8,17 @@ module Pith
8
8
 
9
9
  class Project
10
10
 
11
+ DEFAULT_IGNORE_PATTERNS = ["_*", ".git", ".svn"].freeze
12
+
11
13
  def initialize(attributes = {})
14
+ @ignore_patterns = DEFAULT_IGNORE_PATTERNS.dup
12
15
  attributes.each do |k,v|
13
16
  send("#{k}=", v)
14
17
  end
15
18
  end
16
19
 
17
20
  attr_reader :input_dir
21
+ attr_reader :ignore_patterns
18
22
 
19
23
  def input_dir=(dir)
20
24
  @input_dir = Pathname(dir)
@@ -1,3 +1,3 @@
1
1
  module Pith
2
- VERSION = "0.0.11".freeze
2
+ VERSION = "0.0.12".freeze
3
3
  end
@@ -19,9 +19,6 @@ module Pith
19
19
  loop do
20
20
  begin
21
21
  project.build
22
- rescue Exception => e
23
- $stderr.puts "ERROR: #{e}"
24
- e.backtrace.each { |line| $stderr.puts line }
25
22
  end
26
23
  sleep(interval)
27
24
  end
@@ -34,8 +34,8 @@ describe Pith::Input::Template do
34
34
  end
35
35
 
36
36
  it "returns false for non-template paths" do
37
- Pith::Input::Template.can_handle?("foo.html").should be_false
38
- Pith::Input::Template.can_handle?("foo").should be_false
37
+ Pith::Input::Template.can_handle?("foo.html").should_not be_true
38
+ Pith::Input::Template.can_handle?("foo").should_not be_true
39
39
  end
40
40
 
41
41
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pith
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 7
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 11
10
- version: 0.0.11
9
+ - 12
10
+ version: 0.0.12
11
11
  platform: ruby
12
12
  authors:
13
13
  - Mike Williams
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-04 00:00:00 +11:00
18
+ date: 2010-11-30 00:00:00 +11:00
19
19
  default_executable: pith
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -26,11 +26,11 @@ dependencies:
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- hash: 25
29
+ hash: 13
30
30
  segments:
31
- - 0
32
- - 9
33
- version: "0.9"
31
+ - 1
32
+ - 1
33
+ version: "1.1"
34
34
  type: :runtime
35
35
  version_requirements: *id001
36
36
  - !ruby/object:Gem::Dependency
@@ -55,14 +55,14 @@ dependencies:
55
55
  requirement: &id003 !ruby/object:Gem::Requirement
56
56
  none: false
57
57
  requirements:
58
- - - ">="
58
+ - - ~>
59
59
  - !ruby/object:Gem::Version
60
- hash: 19
60
+ hash: 29
61
61
  segments:
62
62
  - 1
63
+ - 2
63
64
  - 1
64
- - 0
65
- version: 1.1.0
65
+ version: 1.2.1
66
66
  type: :runtime
67
67
  version_requirements: *id003
68
68
  - !ruby/object:Gem::Dependency
@@ -71,23 +71,37 @@ dependencies:
71
71
  requirement: &id004 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
- - - ">="
74
+ - - ~>
75
75
  - !ruby/object:Gem::Version
76
- hash: 19
76
+ hash: 17
77
77
  segments:
78
78
  - 1
79
79
  - 2
80
- - 6
81
- version: 1.2.6
80
+ - 7
81
+ version: 1.2.7
82
82
  type: :runtime
83
83
  version_requirements: *id004
84
84
  - !ruby/object:Gem::Dependency
85
- name: rspec
85
+ name: rake
86
86
  prerelease: false
87
87
  requirement: &id005 !ruby/object:Gem::Requirement
88
88
  none: false
89
89
  requirements:
90
90
  - - ">="
91
+ - !ruby/object:Gem::Version
92
+ hash: 3
93
+ segments:
94
+ - 0
95
+ version: "0"
96
+ type: :development
97
+ version_requirements: *id005
98
+ - !ruby/object:Gem::Dependency
99
+ name: rspec
100
+ prerelease: false
101
+ requirement: &id006 !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ~>
91
105
  - !ruby/object:Gem::Version
92
106
  hash: 13
93
107
  segments:
@@ -96,14 +110,14 @@ dependencies:
96
110
  - 9
97
111
  version: 1.2.9
98
112
  type: :development
99
- version_requirements: *id005
113
+ version_requirements: *id006
100
114
  - !ruby/object:Gem::Dependency
101
115
  name: cucumber
102
116
  prerelease: false
103
- requirement: &id006 !ruby/object:Gem::Requirement
117
+ requirement: &id007 !ruby/object:Gem::Requirement
104
118
  none: false
105
119
  requirements:
106
- - - ">="
120
+ - - ~>
107
121
  - !ruby/object:Gem::Version
108
122
  hash: 57
109
123
  segments:
@@ -112,7 +126,49 @@ dependencies:
112
126
  - 3
113
127
  version: 0.8.3
114
128
  type: :development
115
- version_requirements: *id006
129
+ version_requirements: *id007
130
+ - !ruby/object:Gem::Dependency
131
+ name: haml
132
+ prerelease: false
133
+ requirement: &id008 !ruby/object:Gem::Requirement
134
+ none: false
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ hash: 3
139
+ segments:
140
+ - 0
141
+ version: "0"
142
+ type: :development
143
+ version_requirements: *id008
144
+ - !ruby/object:Gem::Dependency
145
+ name: RedCloth
146
+ prerelease: false
147
+ requirement: &id009 !ruby/object:Gem::Requirement
148
+ none: false
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ hash: 3
153
+ segments:
154
+ - 0
155
+ version: "0"
156
+ type: :development
157
+ version_requirements: *id009
158
+ - !ruby/object:Gem::Dependency
159
+ name: rdiscount
160
+ prerelease: false
161
+ requirement: &id010 !ruby/object:Gem::Requirement
162
+ none: false
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ hash: 3
167
+ segments:
168
+ - 0
169
+ version: "0"
170
+ type: :development
171
+ version_requirements: *id010
116
172
  description: |
117
173
  Pith builds static websites, using markup/template languages including Haml, Sass, ERb, Liquid, Markdown and Textile.
118
174
 
@@ -126,6 +182,7 @@ extra_rdoc_files: []
126
182
  files:
127
183
  - lib/pith/console_logger.rb
128
184
  - lib/pith/console_logger.rb~
185
+ - lib/pith/exception_ext.rb
129
186
  - lib/pith/input/abstract.rb
130
187
  - lib/pith/input/abstract.rb~
131
188
  - lib/pith/input/base.rb~
@@ -181,6 +238,7 @@ files:
181
238
  - features/cleanup.feature
182
239
  - features/content_for.feature
183
240
  - features/content_for.feature~
241
+ - features/error_handling.feature
184
242
  - features/haml.feature
185
243
  - features/haml.feature~
186
244
  - features/helpers.feature
@@ -260,6 +318,7 @@ test_files:
260
318
  - features/cleanup.feature
261
319
  - features/content_for.feature
262
320
  - features/content_for.feature~
321
+ - features/error_handling.feature
263
322
  - features/haml.feature
264
323
  - features/haml.feature~
265
324
  - features/helpers.feature