pith 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +10 -3
- data/Rakefile +13 -3
- data/cucumber.yml +1 -6
- data/features/helpers.feature~ +23 -0
- data/features/ignorance.feature +12 -1
- data/features/ignorance.feature~ +12 -1
- data/features/incremental_rebuild.feature~ +24 -0
- data/features/layouts.feature +22 -2
- data/features/layouts.feature~ +20 -0
- data/features/metadata.feature +1 -1
- data/features/{linking.feature → relative_linking.feature} +32 -2
- data/features/relative_linking.feature~ +109 -0
- data/features/step_definitions/build_steps.rb +20 -16
- data/features/step_definitions/build_steps.rb~ +32 -11
- data/features/support/env.rb +6 -6
- data/features/support/env.rb~ +36 -4
- data/features/support/rspec_matchers.rb~ +5 -0
- data/lib/pith/input/abstract.rb +120 -0
- data/lib/pith/input/abstract.rb~ +120 -0
- data/lib/pith/input/template.rb +56 -0
- data/lib/pith/input/template.rb~ +46 -0
- data/lib/pith/input/verbatim.rb +31 -0
- data/lib/pith/input/verbatim.rb~ +31 -0
- data/lib/pith/input.rb +5 -176
- data/lib/pith/input.rb~ +10 -85
- data/lib/pith/project.rb +14 -7
- data/lib/pith/project.rb~ +36 -11
- data/lib/pith/render_context.rb +34 -13
- data/lib/pith/render_context.rb~ +54 -17
- data/lib/pith/server.rb +0 -1
- data/lib/pith/server.rb~ +13 -17
- data/lib/pith/version.rb +1 -1
- data/lib/pith/version.rb~ +1 -1
- data/lib/pith.rb~ +0 -1
- data/sample/_out/index.html +14 -0
- data/sample/_out/stylesheets/app.css +38 -0
- data/sample/index.html.haml +1 -2
- data/spec/pith/input/abstract_spec.rb +31 -0
- data/spec/pith/input/abstract_spec.rb~ +31 -0
- data/spec/pith/metadata_spec.rb +2 -2
- data/spec/pith/project_spec.rb +21 -8
- data/spec/pith/project_spec.rb~ +74 -0
- data/spec/spec_helper.rb~ +27 -0
- metadata +76 -6
data/README.markdown
CHANGED
@@ -5,11 +5,13 @@ Pith is a static web-site generator, written in Ruby.
|
|
5
5
|
|
6
6
|
Using Pith, you can:
|
7
7
|
|
8
|
-
* __Express yourself succintly__ using
|
8
|
+
* __Express yourself succintly__ using Markdown or Textile.
|
9
9
|
|
10
|
-
*
|
10
|
+
* __Layout your pages__ written in ERb, [Haml][haml], or Liquid.
|
11
11
|
|
12
|
-
*
|
12
|
+
* __Style things up using__ [Sass][sass].
|
13
|
+
|
14
|
+
* __Encapsulate common markup__ in "layout" and "partial" templates.
|
13
15
|
|
14
16
|
* __Easily link pages and resources__ using relative links.
|
15
17
|
|
@@ -17,6 +19,11 @@ Using Pith, you can:
|
|
17
19
|
|
18
20
|
* __Define custom helper-methods__ to increase expressiveness.
|
19
21
|
|
22
|
+
Why Pith?
|
23
|
+
---------
|
24
|
+
|
25
|
+
Why another static web-site generator, when there are other good options out there? Pith's main differentiating factor is that structure of the output slavishly mirrors the structure of the input; there are no magic input directories for layouts, or dynamic content, or anything else.
|
26
|
+
|
20
27
|
Install it
|
21
28
|
----------
|
22
29
|
|
data/Rakefile
CHANGED
@@ -10,7 +10,17 @@ task :default => :cucumber
|
|
10
10
|
|
11
11
|
require 'cucumber/rake/task'
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
namespace :cucumber do
|
14
|
+
|
15
|
+
[:wip, :default].each do |profile|
|
16
|
+
|
17
|
+
Cucumber::Rake::Task.new(profile) do |t|
|
18
|
+
t.fork = true
|
19
|
+
t.profile = profile
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
16
24
|
end
|
25
|
+
|
26
|
+
task :cucumber => ["cucumber:wip", "cucumber:default"]
|
data/cucumber.yml
CHANGED
@@ -1,7 +1,2 @@
|
|
1
|
-
|
2
|
-
rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
|
3
|
-
rerun_opts = rerun.to_s.strip.empty? ? "--format progress features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
|
4
|
-
std_opts = "#{rerun_opts} --format rerun --out rerun.txt --strict --tags ~@wip --require features/support --require features/step_definitions"
|
5
|
-
%>
|
6
|
-
default: <%= std_opts %>
|
1
|
+
default: --tags ~@wip features
|
7
2
|
wip: --tags @wip:3 --wip features
|
@@ -0,0 +1,23 @@
|
|
1
|
+
Feature: helper methods
|
2
|
+
|
3
|
+
I want to extend Pith with helper methods
|
4
|
+
So that I can use them in templates
|
5
|
+
|
6
|
+
Scenario: call a helper from a template
|
7
|
+
|
8
|
+
Given input file "_pith/config.rb" contains
|
9
|
+
"""
|
10
|
+
project.helpers do
|
11
|
+
|
12
|
+
def greet(subject = "mate")
|
13
|
+
"Hello, #{subject}"
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
"""
|
18
|
+
|
19
|
+
And input file "index.html.haml" contains "= greet('World')"
|
20
|
+
|
21
|
+
When I build the site
|
22
|
+
|
23
|
+
Then output file "index.html" should contain "Hello, World"
|
data/features/ignorance.feature
CHANGED
@@ -14,7 +14,7 @@ Scenario: a layout template at the input root
|
|
14
14
|
|
15
15
|
Then output file "_layout" should not exist
|
16
16
|
|
17
|
-
Scenario: a partial in
|
17
|
+
Scenario: a partial in an ignored subdirectory
|
18
18
|
|
19
19
|
Given input file "_partials/foo.html.haml" contains
|
20
20
|
"""
|
@@ -24,3 +24,14 @@ Scenario: a partial in a subdirectory
|
|
24
24
|
When I build the site
|
25
25
|
|
26
26
|
Then output file "_partials/foo.html" should not exist
|
27
|
+
|
28
|
+
Scenario: an ignored partial in a subdirectory
|
29
|
+
|
30
|
+
Given input file "partials/_foo.html.haml" contains
|
31
|
+
"""
|
32
|
+
Blah de blah
|
33
|
+
"""
|
34
|
+
|
35
|
+
When I build the site
|
36
|
+
|
37
|
+
Then output file "partials/_foo.html" should not exist
|
data/features/ignorance.feature~
CHANGED
@@ -14,7 +14,7 @@ Scenario: a layout template at the input root
|
|
14
14
|
|
15
15
|
Then output file "_layout" should not exist
|
16
16
|
|
17
|
-
Scenario: a partial in
|
17
|
+
Scenario: a partial in an ignored subdirectory
|
18
18
|
|
19
19
|
Given input file "_partials/foo.html.haml" contains
|
20
20
|
"""
|
@@ -24,3 +24,14 @@ Scenario: a partial in a subdirectory
|
|
24
24
|
When I build the site
|
25
25
|
|
26
26
|
Then output file "_partials/foo.html" should not exist
|
27
|
+
|
28
|
+
Scenario: an ignored partial in a subdirectory
|
29
|
+
|
30
|
+
Given input file "partials/_foo.html.haml" contains
|
31
|
+
"""
|
32
|
+
Blah de blah
|
33
|
+
"""
|
34
|
+
|
35
|
+
When I build the site
|
36
|
+
|
37
|
+
Then output file "partials/_foo.html" should not exist
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Feature: incremental rebuilding
|
2
|
+
|
3
|
+
I want to rebuild just the outputs whose inputs have changed
|
4
|
+
So that that I can bring the project up-to-date efficiently
|
5
|
+
|
6
|
+
Scenario: alter an input, and the output changes
|
7
|
+
|
8
|
+
Given input file "page.html.haml" contains "Old content"
|
9
|
+
And the site is up-to-date
|
10
|
+
|
11
|
+
When I change input file "page.html.haml" to contain "New content"
|
12
|
+
And I rebuild the site
|
13
|
+
|
14
|
+
Then output file "page.html" should be re-generated
|
15
|
+
And output file "page.html" should contain "New content"
|
16
|
+
|
17
|
+
Scenario: don't alter an input, and the output is untouched
|
18
|
+
|
19
|
+
Given input file "page.html.haml" contains "Content"
|
20
|
+
And the site is up-to-date
|
21
|
+
|
22
|
+
When I rebuild the site
|
23
|
+
|
24
|
+
Then output file "page.html" should not be re-generated
|
data/features/layouts.feature
CHANGED
@@ -7,7 +7,7 @@ Scenario: Haml template with a layout
|
|
7
7
|
|
8
8
|
Given input file "index.html.haml" contains
|
9
9
|
"""
|
10
|
-
=
|
10
|
+
= inside "layouts/_simple.haml" do
|
11
11
|
blah blah
|
12
12
|
"""
|
13
13
|
And input file "layouts/_simple.haml" contains
|
@@ -25,7 +25,7 @@ Scenario: instance variable assigned within the layed-out block
|
|
25
25
|
|
26
26
|
Given input file "index.html.haml" contains
|
27
27
|
"""
|
28
|
-
=
|
28
|
+
= inside "layouts/_with_header.haml" do
|
29
29
|
- @title = "XXX"
|
30
30
|
%p blah blah
|
31
31
|
"""
|
@@ -41,3 +41,23 @@ Scenario: instance variable assigned within the layed-out block
|
|
41
41
|
<h1>XXX</h1>
|
42
42
|
<p>blah blah</p>
|
43
43
|
"""
|
44
|
+
|
45
|
+
Scenario: Layout specified in meta-data
|
46
|
+
|
47
|
+
Given input file "index.html.haml" contains
|
48
|
+
"""
|
49
|
+
-# ---
|
50
|
+
-# layout: layouts/_simple.haml
|
51
|
+
-#...
|
52
|
+
blah blah
|
53
|
+
"""
|
54
|
+
And input file "layouts/_simple.haml" contains
|
55
|
+
"""
|
56
|
+
%p= yield
|
57
|
+
"""
|
58
|
+
|
59
|
+
When I build the site
|
60
|
+
Then output file "index.html" should contain
|
61
|
+
"""
|
62
|
+
<p>blah blah</p>
|
63
|
+
"""
|
data/features/layouts.feature~
CHANGED
@@ -41,3 +41,23 @@ Scenario: instance variable assigned within the layed-out block
|
|
41
41
|
<h1>XXX</h1>
|
42
42
|
<p>blah blah</p>
|
43
43
|
"""
|
44
|
+
|
45
|
+
Scenario: Layout specified in meta-data
|
46
|
+
|
47
|
+
Given input file "index.html.haml" contains
|
48
|
+
"""
|
49
|
+
-# ---
|
50
|
+
-# layout: layouts/_simple.haml
|
51
|
+
-#...
|
52
|
+
blah blah
|
53
|
+
"""
|
54
|
+
And input file "layouts/_simple.haml" contains
|
55
|
+
"""
|
56
|
+
%p= yield
|
57
|
+
"""
|
58
|
+
|
59
|
+
When I build the site
|
60
|
+
Then output file "index.html" should contain
|
61
|
+
"""
|
62
|
+
<p>blah blah</p>
|
63
|
+
"""
|
data/features/metadata.feature
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
Feature: linking between files
|
2
2
|
|
3
|
-
I want to be able to
|
3
|
+
I want to be able to generate relative reference to other pages
|
4
|
+
So that the generated site is re-locateable
|
4
5
|
|
5
6
|
Scenario: link from one top-level page to another
|
6
7
|
|
@@ -8,7 +9,8 @@ Scenario: link from one top-level page to another
|
|
8
9
|
"""
|
9
10
|
= link("page.html", "Page")
|
10
11
|
"""
|
11
|
-
|
12
|
+
And input file "page.html" exists
|
13
|
+
|
12
14
|
When I build the site
|
13
15
|
Then output file "index.html" should contain
|
14
16
|
"""
|
@@ -21,6 +23,7 @@ Scenario: link from a sub-directory to a root-level page
|
|
21
23
|
"""
|
22
24
|
= link("/help.html", "Help")
|
23
25
|
"""
|
26
|
+
And input file "help.html" exists
|
24
27
|
|
25
28
|
When I build the site
|
26
29
|
Then output file "subdir/page.html" should contain
|
@@ -34,6 +37,7 @@ Scenario: link to an image
|
|
34
37
|
"""
|
35
38
|
%img{:src => href("/logo.png")}
|
36
39
|
"""
|
40
|
+
And input file "logo.png" exists
|
37
41
|
|
38
42
|
When I build the site
|
39
43
|
Then output file "subdir/page.html" should contain
|
@@ -54,6 +58,8 @@ Scenario: links within a layout block
|
|
54
58
|
= yield
|
55
59
|
"""
|
56
60
|
|
61
|
+
And input file "subdir/other.html" exists
|
62
|
+
|
57
63
|
When I build the site
|
58
64
|
Then output file "subdir/page.html" should contain
|
59
65
|
"""
|
@@ -72,8 +78,32 @@ Scenario: links included from a partial
|
|
72
78
|
%link{ :href=>href("/stylesheets/app.css"), :rel=>"stylesheet", :type=>"text/css" }
|
73
79
|
"""
|
74
80
|
|
81
|
+
And input file "stylesheets/app.css" exists
|
82
|
+
|
75
83
|
When I build the site
|
76
84
|
Then output file "subdir/page.html" should contain
|
77
85
|
"""
|
78
86
|
<link href='../stylesheets/app.css' rel='stylesheet' type='text/css' />
|
79
87
|
"""
|
88
|
+
|
89
|
+
Scenario: use "title" meta-data attribute in link
|
90
|
+
|
91
|
+
Given input file "index.html.haml" contains
|
92
|
+
"""
|
93
|
+
= link("page.html")
|
94
|
+
"""
|
95
|
+
|
96
|
+
And input file "page.html.haml" contains
|
97
|
+
"""
|
98
|
+
-# ---
|
99
|
+
-# title: "Title from meta-data"
|
100
|
+
-# ...
|
101
|
+
Target content
|
102
|
+
"""
|
103
|
+
|
104
|
+
When I build the site
|
105
|
+
|
106
|
+
Then output file "index.html" should contain
|
107
|
+
"""
|
108
|
+
<a href="page.html">Title from meta-data</a>
|
109
|
+
"""
|
@@ -0,0 +1,109 @@
|
|
1
|
+
Feature: linking between files
|
2
|
+
|
3
|
+
I want to be able to generate relative reference to other pages
|
4
|
+
So that the generated site is re-locateable
|
5
|
+
|
6
|
+
Scenario: link from one top-level page to another
|
7
|
+
|
8
|
+
Given input file "index.html.haml" contains
|
9
|
+
"""
|
10
|
+
= link("page.html", "Page")
|
11
|
+
"""
|
12
|
+
And input file "page.html" exists
|
13
|
+
|
14
|
+
When I build the site
|
15
|
+
Then output file "index.html" should contain
|
16
|
+
"""
|
17
|
+
<a href="page.html">Page</a>
|
18
|
+
"""
|
19
|
+
|
20
|
+
Scenario: link from a sub-directory to a root-level page
|
21
|
+
|
22
|
+
Given input file "subdir/page.html.haml" contains
|
23
|
+
"""
|
24
|
+
= link("/help.html", "Help")
|
25
|
+
"""
|
26
|
+
And input file "help.html" exists
|
27
|
+
|
28
|
+
When I build the site
|
29
|
+
Then output file "subdir/page.html" should contain
|
30
|
+
"""
|
31
|
+
<a href="../help.html">Help</a>
|
32
|
+
"""
|
33
|
+
|
34
|
+
Scenario: link to an image
|
35
|
+
|
36
|
+
Given input file "subdir/page.html.haml" contains
|
37
|
+
"""
|
38
|
+
%img{:src => href("/logo.png")}
|
39
|
+
"""
|
40
|
+
And input file "logo.png" exists
|
41
|
+
|
42
|
+
When I build the site
|
43
|
+
Then output file "subdir/page.html" should contain
|
44
|
+
"""
|
45
|
+
<img src='../logo.png' />
|
46
|
+
"""
|
47
|
+
|
48
|
+
Scenario: links within a layout block
|
49
|
+
|
50
|
+
Given input file "subdir/page.html.haml" contains
|
51
|
+
"""
|
52
|
+
= include "/common/_layout.haml" do
|
53
|
+
= link "other.html", "Other page"
|
54
|
+
"""
|
55
|
+
|
56
|
+
And input file "common/_layout.haml" contains
|
57
|
+
"""
|
58
|
+
= yield
|
59
|
+
"""
|
60
|
+
|
61
|
+
And input file "subdir/other.html" exists
|
62
|
+
|
63
|
+
When I build the site
|
64
|
+
Then output file "subdir/page.html" should contain
|
65
|
+
"""
|
66
|
+
<a href="other.html">Other page</a>
|
67
|
+
"""
|
68
|
+
|
69
|
+
Scenario: links included from a partial
|
70
|
+
|
71
|
+
Given input file "subdir/page.html.haml" contains
|
72
|
+
"""
|
73
|
+
= include "/common/_partial.haml"
|
74
|
+
"""
|
75
|
+
|
76
|
+
And input file "common/_partial.haml" contains
|
77
|
+
"""
|
78
|
+
%link{ :href=>href("/stylesheets/app.css"), :rel=>"stylesheet", :type=>"text/css" }
|
79
|
+
"""
|
80
|
+
|
81
|
+
And input file "stylesheets/app.css" exists
|
82
|
+
|
83
|
+
When I build the site
|
84
|
+
Then output file "subdir/page.html" should contain
|
85
|
+
"""
|
86
|
+
<link href='../stylesheets/app.css' rel='stylesheet' type='text/css' />
|
87
|
+
"""
|
88
|
+
|
89
|
+
Scenario: use "title" meta-data attribute in link
|
90
|
+
|
91
|
+
Given input file "index.html.haml" contains
|
92
|
+
"""
|
93
|
+
= link("page.html")
|
94
|
+
"""
|
95
|
+
|
96
|
+
And input file "page.html.haml" contains
|
97
|
+
"""
|
98
|
+
-# ---
|
99
|
+
-# title: "Title from meta-data"
|
100
|
+
-# ...
|
101
|
+
Target content
|
102
|
+
"""
|
103
|
+
|
104
|
+
When I build the site
|
105
|
+
|
106
|
+
Then output file "index.html" should contain
|
107
|
+
"""
|
108
|
+
<a href="page.html">Title from meta-data</a>
|
109
|
+
"""
|
@@ -1,17 +1,21 @@
|
|
1
|
-
Given /^input file "([^\"]*)" contains "([^\"]*)"$/ do |
|
2
|
-
@inputs.write(
|
1
|
+
Given /^input file "([^\"]*)" contains "([^\"]*)"$/ do |path, content|
|
2
|
+
@inputs.write(path, content, :mtime => (Time.now - 5))
|
3
3
|
end
|
4
4
|
|
5
|
-
Given /^input file "([^\"]*)" contains$/ do |
|
6
|
-
@inputs.write(
|
5
|
+
Given /^input file "([^\"]*)" contains$/ do |path, content|
|
6
|
+
@inputs.write(path, content, :mtime => (Time.now - 5))
|
7
|
+
end
|
8
|
+
|
9
|
+
Given /^input file "([^\"]*)" exists$/ do |path|
|
10
|
+
Given %{input file "#{path}" contains "something"}
|
7
11
|
end
|
8
12
|
|
9
13
|
Given "the site is up-to-date" do
|
10
14
|
When "I build the site"
|
11
15
|
end
|
12
16
|
|
13
|
-
When /^I change input file "([^\"]*)" to contain "([^\"]*)"$/ do |
|
14
|
-
@inputs[
|
17
|
+
When /^I change input file "([^\"]*)" to contain "([^\"]*)"$/ do |path, content|
|
18
|
+
@inputs[path] = content
|
15
19
|
end
|
16
20
|
|
17
21
|
When /^I (?:re)?build the site$/ do
|
@@ -25,22 +29,22 @@ class String
|
|
25
29
|
end
|
26
30
|
end
|
27
31
|
|
28
|
-
Then /^output file "([^\"]*)" should contain "([^\"]*)"$/ do |
|
29
|
-
@outputs[
|
32
|
+
Then /^output file "([^\"]*)" should contain "([^\"]*)"$/ do |path, content|
|
33
|
+
@outputs[path].clean.should == content.clean
|
30
34
|
end
|
31
35
|
|
32
|
-
Then /^output file "([^\"]*)" should contain$/ do |
|
33
|
-
@outputs[
|
36
|
+
Then /^output file "([^\"]*)" should contain$/ do |path, content|
|
37
|
+
@outputs[path].clean.should == content.clean
|
34
38
|
end
|
35
39
|
|
36
|
-
Then /^output file "([^\"]*)" should not exist$/ do |
|
37
|
-
@outputs[
|
40
|
+
Then /^output file "([^\"]*)" should not exist$/ do |path|
|
41
|
+
@outputs[path].should == nil
|
38
42
|
end
|
39
43
|
|
40
|
-
Then /^output file "([^"]*)" should be re\-generated$/ do |
|
41
|
-
@project.logger.messages.should contain(/--> +#{
|
44
|
+
Then /^output file "([^"]*)" should be re\-generated$/ do |path|
|
45
|
+
@project.logger.messages.should contain(/--> +#{path}/)
|
42
46
|
end
|
43
47
|
|
44
|
-
Then /^output file "([^"]*)" should not be re\-generated$/ do |
|
45
|
-
@project.logger.messages.should_not contain(/--> +#{
|
48
|
+
Then /^output file "([^"]*)" should not be re\-generated$/ do |path|
|
49
|
+
@project.logger.messages.should_not contain(/--> +#{path}/)
|
46
50
|
end
|
@@ -1,12 +1,25 @@
|
|
1
|
-
Given /^input file "([^\"]*)" contains "([^\"]*)"$/ do |
|
2
|
-
@inputs
|
1
|
+
Given /^input file "([^\"]*)" contains "([^\"]*)"$/ do |path, content|
|
2
|
+
@inputs.write(path, content, :mtime => (Time.now - 5))
|
3
3
|
end
|
4
4
|
|
5
|
-
Given /^input file "([^\"]*)" contains$/ do |
|
6
|
-
@inputs
|
5
|
+
Given /^input file "([^\"]*)" contains$/ do |path, content|
|
6
|
+
@inputs.write(path, content, :mtime => (Time.now - 5))
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
Given /^input file "([^\"]*)" exists$/ do |path|
|
10
|
+
Given %{input file "#{path}" contains "something"}
|
11
|
+
end
|
12
|
+
|
13
|
+
Given "the site is up-to-date" do
|
14
|
+
When "I build the site"
|
15
|
+
end
|
16
|
+
|
17
|
+
When /^I change input file "([^\"]*)" to contain "([^\"]*)"$/ do |path, content|
|
18
|
+
@inputs[path] = content
|
19
|
+
end
|
20
|
+
|
21
|
+
When /^I (?:re)?build the site$/ do
|
22
|
+
@project.logger.clear
|
10
23
|
@project.build
|
11
24
|
end
|
12
25
|
|
@@ -16,14 +29,22 @@ class String
|
|
16
29
|
end
|
17
30
|
end
|
18
31
|
|
19
|
-
Then /^output file "([^\"]*)" should contain "([^\"]*)"$/ do |
|
20
|
-
@outputs[
|
32
|
+
Then /^output file "([^\"]*)" should contain "([^\"]*)"$/ do |path, content|
|
33
|
+
@outputs[path].clean.should == content.clean
|
34
|
+
end
|
35
|
+
|
36
|
+
Then /^output file "([^\"]*)" should contain$/ do |path, content|
|
37
|
+
@outputs[path].clean.should == content.clean
|
38
|
+
end
|
39
|
+
|
40
|
+
Then /^output file "([^\"]*)" should not exist$/ do |path|
|
41
|
+
@outputs[path].should == nil
|
21
42
|
end
|
22
43
|
|
23
|
-
Then /^output file "([
|
24
|
-
@
|
44
|
+
Then /^output file "([^"]*)" should be re\-generated$/ do |path|
|
45
|
+
@project.logger.messages.should contain(/--> +#{path}/)
|
25
46
|
end
|
26
47
|
|
27
|
-
Then /^output file "([
|
28
|
-
@
|
48
|
+
Then /^output file "([^"]*)" should not be re\-generated$/ do |path|
|
49
|
+
@project.logger.messages.should_not contain(/--> +#{path}/)
|
29
50
|
end
|
data/features/support/env.rb
CHANGED
@@ -6,17 +6,17 @@ class DirHash
|
|
6
6
|
@dir = Pathname(dir)
|
7
7
|
end
|
8
8
|
|
9
|
-
def [](
|
10
|
-
file_path = @dir +
|
9
|
+
def [](file)
|
10
|
+
file_path = @dir + file
|
11
11
|
file_path.read if file_path.exist?
|
12
12
|
end
|
13
13
|
|
14
|
-
def []=(
|
15
|
-
write(
|
14
|
+
def []=(file, content)
|
15
|
+
write(file, content)
|
16
16
|
end
|
17
17
|
|
18
|
-
def write(
|
19
|
-
file_path = @dir +
|
18
|
+
def write(file, content, options = {})
|
19
|
+
file_path = @dir + file
|
20
20
|
file_path.parent.mkpath
|
21
21
|
file_path.open("w") do |io|
|
22
22
|
io << content
|
data/features/support/env.rb~
CHANGED
@@ -6,19 +6,50 @@ class DirHash
|
|
6
6
|
@dir = Pathname(dir)
|
7
7
|
end
|
8
8
|
|
9
|
-
def [](
|
10
|
-
file_path = @dir +
|
9
|
+
def [](file)
|
10
|
+
file_path = @dir + file
|
11
11
|
file_path.read if file_path.exist?
|
12
12
|
end
|
13
13
|
|
14
|
-
def []=(
|
15
|
-
|
14
|
+
def []=(file, content)
|
15
|
+
write(file, content)
|
16
|
+
end
|
17
|
+
|
18
|
+
def write(file, content, options = {})
|
19
|
+
file_path = @dir + file
|
16
20
|
file_path.parent.mkpath
|
17
21
|
file_path.open("w") do |io|
|
18
22
|
io << content
|
19
23
|
end
|
24
|
+
if options[:mtime]
|
25
|
+
timestamp = options[:mtime]
|
26
|
+
file_path.utime(timestamp, timestamp)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
class InternalLogger
|
33
|
+
|
34
|
+
def initialize
|
35
|
+
@messages = []
|
36
|
+
end
|
37
|
+
|
38
|
+
attr_reader :messages
|
39
|
+
|
40
|
+
def clear
|
41
|
+
@messages.clear
|
20
42
|
end
|
21
43
|
|
44
|
+
def info(message, &block)
|
45
|
+
message ||= block.call
|
46
|
+
write(message)
|
47
|
+
end
|
48
|
+
|
49
|
+
def write(message)
|
50
|
+
@messages << message
|
51
|
+
end
|
52
|
+
|
22
53
|
end
|
23
54
|
|
24
55
|
$project_dir = Pathname(__FILE__).expand_path.parent.parent.parent
|
@@ -38,6 +69,7 @@ Before do
|
|
38
69
|
dir.mkpath
|
39
70
|
end
|
40
71
|
@project = Pith::Project.new(:input_dir => $input_dir, :output_dir => $output_dir)
|
72
|
+
@project.logger = InternalLogger.new
|
41
73
|
@inputs = DirHash.new($input_dir)
|
42
74
|
@outputs = DirHash.new($output_dir)
|
43
75
|
end
|