pith 0.0.3 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/pith +4 -2
- data/features/layouts.feature +3 -3
- data/features/metadata.feature +19 -3
- data/features/relative_linking.feature +3 -3
- data/features/support/env.rb +3 -0
- data/features/support/env.rb~ +3 -0
- data/lib/pith/input/abstract.rb +1 -47
- data/lib/pith/input/abstract.rb~ +1 -47
- data/lib/pith/input/template.rb +72 -4
- data/lib/pith/input/template.rb~ +80 -2
- data/lib/pith/input.rb~ +3 -5
- data/lib/pith/project.rb +37 -8
- data/lib/pith/project.rb~ +37 -8
- data/lib/pith/render_context.rb +12 -5
- data/lib/pith/render_context.rb~ +7 -12
- data/lib/pith/server.rb +1 -1
- data/lib/pith/server.rb~ +1 -1
- data/lib/pith/version.rb +1 -1
- data/lib/pith/version.rb~ +1 -1
- data/sample/_out/blah/deblah.txt +1 -0
- data/sample/_out/features/stuff.html +1 -0
- data/spec/pith/input/abstract_spec.rb +3 -3
- data/spec/pith/input/abstract_spec.rb~ +3 -3
- data/spec/pith/project_spec.rb +47 -6
- data/spec/pith/project_spec.rb~ +47 -6
- data/spec/spec_helper.rb +2 -1
- data/spec/spec_helper.rb~ +2 -1
- metadata +6 -7
- data/lib/pith/metadata.rb +0 -26
- data/spec/pith/metadata_spec.rb +0 -46
data/bin/pith
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
|
3
|
+
$: << File.expand_path("../../lib", __FILE__)
|
4
|
+
|
3
5
|
require "rubygems"
|
4
6
|
require "optparse"
|
5
7
|
require "pathname"
|
8
|
+
require "pith/version"
|
6
9
|
|
7
10
|
$input_dir = Pathname(".")
|
8
11
|
|
@@ -19,6 +22,7 @@ EOF
|
|
19
22
|
|
20
23
|
OptionParser.new do |opts|
|
21
24
|
opts.banner = BANNER
|
25
|
+
opts.version = Pith::VERSION
|
22
26
|
opts.separator " Options:"
|
23
27
|
opts.on("-i", "--input INPUT_DIR", 'Input directory', ' (default: ".")') do |dir|
|
24
28
|
$input_dir = Pathname(dir)
|
@@ -37,8 +41,6 @@ unless $output_dir
|
|
37
41
|
puts %{Generating to "#{$output_dir}"}
|
38
42
|
end
|
39
43
|
|
40
|
-
$: << File.expand_path("../../lib", __FILE__)
|
41
|
-
|
42
44
|
require "pith/project"
|
43
45
|
require "pith/console_logger"
|
44
46
|
|
data/features/layouts.feature
CHANGED
@@ -46,9 +46,9 @@ Scenario: Layout specified in meta-data
|
|
46
46
|
|
47
47
|
Given input file "index.html.haml" contains
|
48
48
|
"""
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
---
|
50
|
+
layout: layouts/_simple.haml
|
51
|
+
...
|
52
52
|
blah blah
|
53
53
|
"""
|
54
54
|
And input file "layouts/_simple.haml" contains
|
data/features/metadata.feature
CHANGED
@@ -7,9 +7,9 @@ Scenario: use meta-data from YAML comment
|
|
7
7
|
|
8
8
|
Given input file "page.html.haml" contains
|
9
9
|
"""
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
---
|
11
|
+
title: PAGE TITLE
|
12
|
+
---
|
13
13
|
%h1= meta["title"]
|
14
14
|
"""
|
15
15
|
|
@@ -18,3 +18,19 @@ Scenario: use meta-data from YAML comment
|
|
18
18
|
"""
|
19
19
|
<h1>PAGE TITLE</h1>
|
20
20
|
"""
|
21
|
+
|
22
|
+
Scenario: corrupt meta-data
|
23
|
+
|
24
|
+
Given input file "page.html.haml" contains
|
25
|
+
"""
|
26
|
+
---
|
27
|
+
title: "This" is no well-formed YAML
|
28
|
+
...
|
29
|
+
%p PAGE BODY
|
30
|
+
"""
|
31
|
+
|
32
|
+
When I build the site
|
33
|
+
Then output file "page.html" should contain
|
34
|
+
"""
|
35
|
+
<p>PAGE BODY</p>
|
36
|
+
"""
|
data/features/support/env.rb
CHANGED
data/features/support/env.rb~
CHANGED
data/lib/pith/input/abstract.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require "pathname"
|
2
|
-
require "pith/metadata"
|
3
2
|
|
4
3
|
module Pith
|
5
4
|
module Input
|
@@ -25,56 +24,11 @@ module Pith
|
|
25
24
|
project.output_dir + output_path
|
26
25
|
end
|
27
26
|
|
28
|
-
# Public: Get YAML metadata declared in the header of of a template.
|
29
|
-
#
|
30
|
-
# The first line of the template must end with "---". Any preceding characters
|
31
|
-
# are considered to be a comment prefix, and are stripped from the following
|
32
|
-
# lines. The metadata block ends when the comment block ends, or a line ending
|
33
|
-
# with "..." is encountered.
|
34
|
-
#
|
35
|
-
# Examples
|
36
|
-
#
|
37
|
-
# Given input starting with:
|
38
|
-
#
|
39
|
-
# -# ---
|
40
|
-
# -# published: 2008-09-15
|
41
|
-
# -# ...
|
42
|
-
#
|
43
|
-
# input.meta
|
44
|
-
# #=> { "published" => "2008-09-15" }
|
45
|
-
#
|
46
|
-
# Returns a Hash.
|
47
|
-
#
|
48
|
-
def meta
|
49
|
-
if @metadata.nil?
|
50
|
-
file.open do |io|
|
51
|
-
@metadata = Pith::Metadata.extract_from(io).freeze
|
52
|
-
end
|
53
|
-
end
|
54
|
-
@metadata
|
55
|
-
end
|
56
|
-
|
57
|
-
# Public: Get page title.
|
58
|
-
#
|
59
|
-
# The default title is based on the input file-name, sans-extension, capitalised,
|
60
|
-
# but can be overridden by providing a "title" in the metadata block.
|
61
|
-
#
|
62
|
-
# Examples
|
63
|
-
#
|
64
|
-
# input.path.to_s
|
65
|
-
# #=> "some_page.html.haml"
|
66
|
-
# input.title
|
67
|
-
# #=> "Some page"
|
68
|
-
#
|
69
|
-
def title
|
70
|
-
meta["title"] || default_title
|
71
|
-
end
|
72
|
-
|
73
27
|
# Public: Generate a corresponding output file.
|
74
28
|
#
|
75
29
|
def build
|
76
30
|
return false if ignorable? || uptodate?
|
77
|
-
logger.info("%-
|
31
|
+
logger.info("%-14s%s" % ["--(#{type})-->", output_path])
|
78
32
|
generate_output
|
79
33
|
end
|
80
34
|
|
data/lib/pith/input/abstract.rb~
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require "pathname"
|
2
|
-
require "pith/metadata"
|
3
2
|
|
4
3
|
module Pith
|
5
4
|
module Input
|
@@ -25,56 +24,11 @@ module Pith
|
|
25
24
|
project.output_dir + output_path
|
26
25
|
end
|
27
26
|
|
28
|
-
# Public: Get YAML metadata declared in the header of of a template.
|
29
|
-
#
|
30
|
-
# The first line of the template must end with "---". Any preceding characters
|
31
|
-
# are considered to be a comment prefix, and are stripped from the following
|
32
|
-
# lines. The metadata block ends when the comment block ends, or a line ending
|
33
|
-
# with "..." is encountered.
|
34
|
-
#
|
35
|
-
# Examples
|
36
|
-
#
|
37
|
-
# Given input starting with:
|
38
|
-
#
|
39
|
-
# -# ---
|
40
|
-
# -# published: 2008-09-15
|
41
|
-
# -# ...
|
42
|
-
#
|
43
|
-
# input.meta
|
44
|
-
# #=> { "published" => "2008-09-15" }
|
45
|
-
#
|
46
|
-
# Returns a Hash.
|
47
|
-
#
|
48
|
-
def meta
|
49
|
-
if @metadata.nil?
|
50
|
-
file.open do |io|
|
51
|
-
@metadata = Pith::Metadata.extract_from(io).freeze
|
52
|
-
end
|
53
|
-
end
|
54
|
-
@metadata
|
55
|
-
end
|
56
|
-
|
57
|
-
# Public: Get page title.
|
58
|
-
#
|
59
|
-
# The default title is based on the input file-name, sans-extension, capitalised,
|
60
|
-
# but can be overridden by providing a "title" in the metadata block.
|
61
|
-
#
|
62
|
-
# Examples
|
63
|
-
#
|
64
|
-
# input.path.to_s
|
65
|
-
# #=> "some_page.html.haml"
|
66
|
-
# input.title
|
67
|
-
# #=> "Some page"
|
68
|
-
#
|
69
|
-
def title
|
70
|
-
meta["title"] || default_title
|
71
|
-
end
|
72
|
-
|
73
27
|
# Public: Generate a corresponding output file.
|
74
28
|
#
|
75
29
|
def build
|
76
30
|
return false if ignorable? || uptodate?
|
77
|
-
logger.info("%-
|
31
|
+
logger.info("%-14s%s" % ["--(#{type})-->", output_path])
|
78
32
|
generate_output
|
79
33
|
end
|
80
34
|
|
data/lib/pith/input/template.rb
CHANGED
@@ -3,6 +3,7 @@ require "pathname"
|
|
3
3
|
require "pith/input/abstract"
|
4
4
|
require "pith/render_context"
|
5
5
|
require "tilt"
|
6
|
+
require "yaml"
|
6
7
|
|
7
8
|
module Pith
|
8
9
|
module Input
|
@@ -17,10 +18,15 @@ module Pith
|
|
17
18
|
@output_path = Pathname($1)
|
18
19
|
@type = $2
|
19
20
|
raise(UnrecognisedType, @type) unless Tilt.registered?(@type)
|
21
|
+
load
|
20
22
|
end
|
21
23
|
|
22
24
|
attr_reader :output_path, :type
|
23
25
|
|
26
|
+
# Check whether output is up-to-date.
|
27
|
+
#
|
28
|
+
# Return true unless output needs to be re-generated.
|
29
|
+
#
|
24
30
|
def uptodate?
|
25
31
|
all_input_files && FileUtils.uptodate?(output_file, all_input_files)
|
26
32
|
end
|
@@ -33,19 +39,81 @@ module Pith
|
|
33
39
|
output_file.open("w") do |out|
|
34
40
|
out.puts(render_context.render(self))
|
35
41
|
end
|
36
|
-
remember_dependencies(render_context.
|
42
|
+
remember_dependencies(render_context.referenced_inputs)
|
37
43
|
end
|
38
44
|
|
39
45
|
# Render this input using Tilt
|
40
46
|
#
|
41
47
|
def render(context, locals = {}, &block)
|
42
|
-
|
48
|
+
@tilt_template.render(context, locals, &block)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Public: Get YAML metadata declared in the header of of a template.
|
52
|
+
#
|
53
|
+
# If the first line of the template starts with "---" it is considered to be
|
54
|
+
# the start of a YAML 'document', which is loaded and returned.
|
55
|
+
#
|
56
|
+
# Examples
|
57
|
+
#
|
58
|
+
# Given input starting with:
|
59
|
+
#
|
60
|
+
# ---
|
61
|
+
# published: 2008-09-15
|
62
|
+
# ...
|
63
|
+
# OTHER STUFF
|
64
|
+
#
|
65
|
+
# input.meta
|
66
|
+
# #=> { "published" => "2008-09-15" }
|
67
|
+
#
|
68
|
+
# Returns a Hash.
|
69
|
+
#
|
70
|
+
def meta
|
71
|
+
@meta
|
72
|
+
end
|
73
|
+
|
74
|
+
# Public: Get page title.
|
75
|
+
#
|
76
|
+
# The default title is based on the input file-name, sans-extension, capitalised,
|
77
|
+
# but can be overridden by providing a "title" in the metadata block.
|
78
|
+
#
|
79
|
+
# Examples
|
80
|
+
#
|
81
|
+
# input.path.to_s
|
82
|
+
# #=> "some_page.html.haml"
|
83
|
+
# input.title
|
84
|
+
# #=> "Some page"
|
85
|
+
#
|
86
|
+
def title
|
87
|
+
meta["title"] || default_title
|
43
88
|
end
|
44
89
|
|
45
90
|
private
|
46
91
|
|
47
|
-
|
48
|
-
|
92
|
+
# Read input file, extracting YAML meta-data header, and template content.
|
93
|
+
#
|
94
|
+
def load
|
95
|
+
@meta = {}
|
96
|
+
file.open do |input|
|
97
|
+
header = input.gets
|
98
|
+
if header =~ /^---/
|
99
|
+
while line = input.gets
|
100
|
+
break if line =~ /^(---|\.\.\.)/
|
101
|
+
header << line
|
102
|
+
end
|
103
|
+
begin
|
104
|
+
@meta = YAML.load(header)
|
105
|
+
rescue
|
106
|
+
logger.warn "#{file}:1: badly-formed YAML header"
|
107
|
+
end
|
108
|
+
else
|
109
|
+
input.rewind
|
110
|
+
end
|
111
|
+
@tilt_template = Tilt.new(file, input.lineno + 1) { input.read }
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def remember_dependencies(referenced_inputs)
|
116
|
+
@all_input_files = referenced_inputs.map { |input| input.file }
|
49
117
|
end
|
50
118
|
|
51
119
|
attr_accessor :all_input_files
|
data/lib/pith/input/template.rb~
CHANGED
@@ -2,38 +2,116 @@ require "fileutils"
|
|
2
2
|
require "pathname"
|
3
3
|
require "pith/input/abstract"
|
4
4
|
require "pith/render_context"
|
5
|
+
require "tilt"
|
6
|
+
require "yaml"
|
5
7
|
|
6
8
|
module Pith
|
7
9
|
module Input
|
8
10
|
|
9
11
|
class Template < Abstract
|
10
12
|
|
13
|
+
class UnrecognisedType < StandardError; end
|
14
|
+
|
11
15
|
def initialize(project, path)
|
12
16
|
super(project, path)
|
13
17
|
path.to_s =~ /^(.*)\.(.*)$/
|
14
18
|
@output_path = Pathname($1)
|
15
19
|
@type = $2
|
20
|
+
raise(UnrecognisedType, @type) unless Tilt.registered?(@type)
|
21
|
+
load
|
16
22
|
end
|
17
23
|
|
18
24
|
attr_reader :output_path, :type
|
19
25
|
|
26
|
+
# Check whether output is up-to-date.
|
27
|
+
#
|
28
|
+
# Return true unless output needs to be re-generated.
|
29
|
+
#
|
20
30
|
def uptodate?
|
21
31
|
all_input_files && FileUtils.uptodate?(output_file, all_input_files)
|
22
32
|
end
|
23
33
|
|
24
|
-
#
|
34
|
+
# Generate output for this template
|
25
35
|
#
|
26
36
|
def generate_output
|
27
37
|
output_file.parent.mkpath
|
28
38
|
render_context = RenderContext.new(project)
|
29
39
|
output_file.open("w") do |out|
|
30
|
-
out.puts(render_context.
|
40
|
+
out.puts(render_context.render(self))
|
31
41
|
end
|
32
42
|
remember_dependencies(render_context.rendered_inputs)
|
33
43
|
end
|
34
44
|
|
45
|
+
# Render this input using Tilt
|
46
|
+
#
|
47
|
+
def render(context, locals = {}, &block)
|
48
|
+
@tilt_template.render(context, locals, &block)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Public: Get YAML metadata declared in the header of of a template.
|
52
|
+
#
|
53
|
+
# If the first line of the template starts with "---" it is considered to be
|
54
|
+
# the start of a YAML 'document', which is loaded and returned.
|
55
|
+
#
|
56
|
+
# Examples
|
57
|
+
#
|
58
|
+
# Given input starting with:
|
59
|
+
#
|
60
|
+
# ---
|
61
|
+
# published: 2008-09-15
|
62
|
+
# ...
|
63
|
+
# OTHER STUFF
|
64
|
+
#
|
65
|
+
# input.meta
|
66
|
+
# #=> { "published" => "2008-09-15" }
|
67
|
+
#
|
68
|
+
# Returns a Hash.
|
69
|
+
#
|
70
|
+
def meta
|
71
|
+
@meta
|
72
|
+
end
|
73
|
+
|
74
|
+
# Public: Get page title.
|
75
|
+
#
|
76
|
+
# The default title is based on the input file-name, sans-extension, capitalised,
|
77
|
+
# but can be overridden by providing a "title" in the metadata block.
|
78
|
+
#
|
79
|
+
# Examples
|
80
|
+
#
|
81
|
+
# input.path.to_s
|
82
|
+
# #=> "some_page.html.haml"
|
83
|
+
# input.title
|
84
|
+
# #=> "Some page"
|
85
|
+
#
|
86
|
+
def title
|
87
|
+
meta["title"] || default_title
|
88
|
+
end
|
89
|
+
|
35
90
|
private
|
36
91
|
|
92
|
+
# Read input file, extracting YAML meta-data header, and template content.
|
93
|
+
#
|
94
|
+
def load
|
95
|
+
@meta = {}
|
96
|
+
file.open do |input|
|
97
|
+
header = input.gets
|
98
|
+
if header =~ /^---/
|
99
|
+
while line = input.gets
|
100
|
+
break if line =~ /^(---|\.\.\.)/
|
101
|
+
header << line
|
102
|
+
end
|
103
|
+
begin
|
104
|
+
@meta = YAML.load(header)
|
105
|
+
rescue
|
106
|
+
logger.warn "#{file}:1: badly-formed YAML header"
|
107
|
+
end
|
108
|
+
else
|
109
|
+
input.rewind
|
110
|
+
end
|
111
|
+
@tilt_template = Tilt.new(file, input.lineno + 1) { input.read }
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
37
115
|
def remember_dependencies(rendered_inputs)
|
38
116
|
@all_input_files = rendered_inputs.map { |input| input.file }
|
39
117
|
end
|
data/lib/pith/input.rb~
CHANGED
@@ -7,11 +7,9 @@ module Pith
|
|
7
7
|
class << self
|
8
8
|
|
9
9
|
def new(project, path)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
Verbatim.new(project, path)
|
14
|
-
end
|
10
|
+
Template.new(project, path)
|
11
|
+
rescue Template::UnrecognisedType
|
12
|
+
Verbatim.new(project, path)
|
15
13
|
end
|
16
14
|
|
17
15
|
end
|
data/lib/pith/project.rb
CHANGED
@@ -14,15 +14,29 @@ module Pith
|
|
14
14
|
end
|
15
15
|
|
16
16
|
attr_accessor :input_dir, :output_dir
|
17
|
-
|
17
|
+
|
18
|
+
# Public: get inputs
|
19
|
+
#
|
20
|
+
# Returns Pith::Input objects representing the files in the input_dir.
|
21
|
+
#
|
22
|
+
# The list of inputs is cached after first load;
|
23
|
+
# call #refresh to discard the cached data.
|
24
|
+
#
|
18
25
|
def inputs
|
19
|
-
Pathname.glob(input_dir + "**/*").map do |input_file|
|
26
|
+
@inputs ||= Pathname.glob(input_dir + "**/*").map do |input_file|
|
20
27
|
next if input_file.directory?
|
21
28
|
path = input_file.relative_path_from(input_dir)
|
22
|
-
|
29
|
+
find_or_create_input(path)
|
23
30
|
end.compact
|
24
31
|
end
|
25
|
-
|
32
|
+
|
33
|
+
# Public: find an input.
|
34
|
+
#
|
35
|
+
# path - an path relative to either input_dir or output_dir
|
36
|
+
#
|
37
|
+
# Returns the first input whose input_path or output_path matches.
|
38
|
+
# Returns nil if no match is found.
|
39
|
+
#
|
26
40
|
def input(path)
|
27
41
|
path = Pathname(path)
|
28
42
|
inputs.each do |input|
|
@@ -30,14 +44,23 @@ module Pith
|
|
30
44
|
end
|
31
45
|
raise ReferenceError, "Can't find #{path.inspect}"
|
32
46
|
end
|
33
|
-
|
47
|
+
|
48
|
+
# Public: build the project, generating output files.
|
49
|
+
#
|
34
50
|
def build
|
51
|
+
refresh
|
35
52
|
load_config
|
36
53
|
inputs.each do |input|
|
37
54
|
input.build
|
38
55
|
end
|
39
56
|
end
|
40
57
|
|
58
|
+
# Public: discard cached data that is out-of-sync with the file-system.
|
59
|
+
#
|
60
|
+
def refresh
|
61
|
+
@inputs = nil
|
62
|
+
end
|
63
|
+
|
41
64
|
def logger
|
42
65
|
@logger ||= Logger.new(nil)
|
43
66
|
end
|
@@ -63,13 +86,19 @@ module Pith
|
|
63
86
|
end
|
64
87
|
|
65
88
|
def input_cache
|
66
|
-
@input_cache ||= Hash.new do |h,
|
67
|
-
h[
|
89
|
+
@input_cache ||= Hash.new do |h, cache_key|
|
90
|
+
h[cache_key] = Input.new(self, cache_key.first)
|
68
91
|
end
|
69
92
|
end
|
70
93
|
|
94
|
+
def find_or_create_input(path)
|
95
|
+
file = input_dir + path
|
96
|
+
cache_key = [path, file.mtime]
|
97
|
+
input_cache[cache_key]
|
98
|
+
end
|
99
|
+
|
71
100
|
end
|
72
|
-
|
101
|
+
|
73
102
|
class ReferenceError < StandardError; end
|
74
103
|
|
75
104
|
end
|
data/lib/pith/project.rb~
CHANGED
@@ -14,15 +14,29 @@ module Pith
|
|
14
14
|
end
|
15
15
|
|
16
16
|
attr_accessor :input_dir, :output_dir
|
17
|
-
|
17
|
+
|
18
|
+
# Public: get inputs
|
19
|
+
#
|
20
|
+
# Returns Pith::Input objects representing the files in the input_dir.
|
21
|
+
#
|
22
|
+
# The list of inputs is cached after first load;
|
23
|
+
# call #refresh to discard the cached data.
|
24
|
+
#
|
18
25
|
def inputs
|
19
|
-
Pathname.glob(input_dir + "**/*").map do |input_file|
|
26
|
+
@inputs ||= Pathname.glob(input_dir + "**/*").map do |input_file|
|
20
27
|
next if input_file.directory?
|
21
28
|
path = input_file.relative_path_from(input_dir)
|
22
|
-
|
29
|
+
find_or_create_input(path)
|
23
30
|
end.compact
|
24
31
|
end
|
25
|
-
|
32
|
+
|
33
|
+
# Public: find an input.
|
34
|
+
#
|
35
|
+
# path - an path relative to either input_dir or output_dir
|
36
|
+
#
|
37
|
+
# Returns the first input whose input_path or output_path matches.
|
38
|
+
# Returns nil if no match is found.
|
39
|
+
#
|
26
40
|
def input(path)
|
27
41
|
path = Pathname(path)
|
28
42
|
inputs.each do |input|
|
@@ -30,14 +44,23 @@ module Pith
|
|
30
44
|
end
|
31
45
|
raise ReferenceError, "Can't find #{path.inspect}"
|
32
46
|
end
|
33
|
-
|
47
|
+
|
48
|
+
# Public: build the project, generating output files.
|
49
|
+
#
|
34
50
|
def build
|
51
|
+
refresh
|
35
52
|
load_config
|
36
53
|
inputs.each do |input|
|
37
54
|
input.build
|
38
55
|
end
|
39
56
|
end
|
40
57
|
|
58
|
+
# Public: discard cached data that is out-of-sync with the file-system.
|
59
|
+
#
|
60
|
+
def refresh
|
61
|
+
@inputs = nil
|
62
|
+
end
|
63
|
+
|
41
64
|
def logger
|
42
65
|
@logger ||= Logger.new(nil)
|
43
66
|
end
|
@@ -63,13 +86,19 @@ module Pith
|
|
63
86
|
end
|
64
87
|
|
65
88
|
def input_cache
|
66
|
-
@input_cache ||= Hash.new do |h,
|
67
|
-
h[
|
89
|
+
@input_cache ||= Hash.new do |h, cache_key|
|
90
|
+
h[cache_key] = Input.new(self, cache_key.first)
|
68
91
|
end
|
69
92
|
end
|
70
93
|
|
94
|
+
def find_or_create_input(path)
|
95
|
+
file = input_dir + path
|
96
|
+
cache_key = [path, file.mtime]
|
97
|
+
input_cache[cache_key]
|
98
|
+
end
|
99
|
+
|
71
100
|
end
|
72
|
-
|
101
|
+
|
73
102
|
class ReferenceError < StandardError; end
|
74
103
|
|
75
104
|
end
|
data/lib/pith/render_context.rb
CHANGED
@@ -11,7 +11,7 @@ module Pith
|
|
11
11
|
def initialize(project)
|
12
12
|
@project = project
|
13
13
|
@input_stack = []
|
14
|
-
@
|
14
|
+
@referenced_inputs = Set.new
|
15
15
|
self.extend(project.helper_module)
|
16
16
|
end
|
17
17
|
|
@@ -26,7 +26,6 @@ module Pith
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def render(input, locals = {}, &block)
|
29
|
-
@rendered_inputs << input
|
30
29
|
with_input(input) do
|
31
30
|
result = input.render(self, locals, &block)
|
32
31
|
layout_ref = current_input.meta["layout"]
|
@@ -35,7 +34,7 @@ module Pith
|
|
35
34
|
end
|
36
35
|
end
|
37
36
|
|
38
|
-
attr_reader :
|
37
|
+
attr_reader :referenced_inputs
|
39
38
|
|
40
39
|
def include(template_ref, locals = {}, &block)
|
41
40
|
content_block = if block_given?
|
@@ -62,7 +61,7 @@ module Pith
|
|
62
61
|
def link(target_ref, label = nil)
|
63
62
|
target_path = resolve_path(target_ref)
|
64
63
|
label ||= begin
|
65
|
-
|
64
|
+
find_input(target_path).title
|
66
65
|
rescue Pith::ReferenceError
|
67
66
|
"???"
|
68
67
|
end
|
@@ -79,7 +78,14 @@ module Pith
|
|
79
78
|
current_input.resolve_path(ref)
|
80
79
|
end
|
81
80
|
|
81
|
+
def find_input(path)
|
82
|
+
input = project.input(path)
|
83
|
+
@referenced_inputs << input if input
|
84
|
+
input
|
85
|
+
end
|
86
|
+
|
82
87
|
def with_input(input)
|
88
|
+
@referenced_inputs << input
|
83
89
|
@input_stack.push(input)
|
84
90
|
begin
|
85
91
|
yield
|
@@ -89,7 +95,8 @@ module Pith
|
|
89
95
|
end
|
90
96
|
|
91
97
|
def render_ref(template_ref, locals = {}, &block)
|
92
|
-
|
98
|
+
template_path = resolve_path(template_ref)
|
99
|
+
template = find_input(template_path)
|
93
100
|
render(template, locals, &block)
|
94
101
|
end
|
95
102
|
|
data/lib/pith/render_context.rb~
CHANGED
@@ -8,10 +8,6 @@ module Pith
|
|
8
8
|
|
9
9
|
include Tilt::CompileSite
|
10
10
|
|
11
|
-
def self.can_render?(extension)
|
12
|
-
Tilt.registered?(extension)
|
13
|
-
end
|
14
|
-
|
15
11
|
def initialize(project)
|
16
12
|
@project = project
|
17
13
|
@input_stack = []
|
@@ -29,16 +25,13 @@ module Pith
|
|
29
25
|
@input_stack.last
|
30
26
|
end
|
31
27
|
|
32
|
-
def
|
28
|
+
def render(input, locals = {}, &block)
|
33
29
|
@rendered_inputs << input
|
34
30
|
with_input(input) do
|
35
|
-
|
31
|
+
result = input.render(self, locals, &block)
|
36
32
|
layout_ref = current_input.meta["layout"]
|
37
|
-
if layout_ref
|
38
|
-
|
39
|
-
else
|
40
|
-
rendered
|
41
|
-
end
|
33
|
+
result = render_ref(layout_ref) { result } if layout_ref
|
34
|
+
result
|
42
35
|
end
|
43
36
|
end
|
44
37
|
|
@@ -52,6 +45,8 @@ module Pith
|
|
52
45
|
render_ref(template_ref, locals, &content_block)
|
53
46
|
end
|
54
47
|
|
48
|
+
alias :inside :include
|
49
|
+
|
55
50
|
def content_for
|
56
51
|
@content_for_hash ||= Hash.new { "" }
|
57
52
|
end
|
@@ -95,7 +90,7 @@ module Pith
|
|
95
90
|
|
96
91
|
def render_ref(template_ref, locals = {}, &block)
|
97
92
|
template = project.input(resolve_path(template_ref))
|
98
|
-
|
93
|
+
render(template, locals, &block)
|
99
94
|
end
|
100
95
|
|
101
96
|
end
|
data/lib/pith/server.rb
CHANGED
data/lib/pith/server.rb~
CHANGED
data/lib/pith/version.rb
CHANGED
data/lib/pith/version.rb~
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
dsfsdf
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -19,9 +19,9 @@ describe Pith::Input::Abstract do
|
|
19
19
|
|
20
20
|
it "can be over-ridden in metadata" do
|
21
21
|
@input_file.open("w") do |i|
|
22
|
-
i.puts "
|
23
|
-
i.puts "
|
24
|
-
i.puts "
|
22
|
+
i.puts "---"
|
23
|
+
i.puts "title: Blah blah"
|
24
|
+
i.puts "..."
|
25
25
|
end
|
26
26
|
@project.input("some_page.html").title.should == "Blah blah"
|
27
27
|
end
|
@@ -19,9 +19,9 @@ describe Pith::Input::Abstract do
|
|
19
19
|
|
20
20
|
it "can be over-ridden in metadata" do
|
21
21
|
@input_file.open("w") do |i|
|
22
|
-
i.puts "
|
23
|
-
i.puts "
|
24
|
-
i.puts "
|
22
|
+
i.puts "---"
|
23
|
+
i.puts "title: Blah blah"
|
24
|
+
i.puts "..."
|
25
25
|
end
|
26
26
|
@project.input("some_page.html").title.should == "Blah blah"
|
27
27
|
end
|
data/spec/pith/project_spec.rb
CHANGED
@@ -22,12 +22,6 @@ describe Pith::Project do
|
|
22
22
|
@input.should be_kind_of(Pith::Input::Verbatim)
|
23
23
|
@input.file.should == @input_file
|
24
24
|
end
|
25
|
-
|
26
|
-
it "returns the same Input output every time" do
|
27
|
-
first_time = @project.input("input.txt")
|
28
|
-
second_time = @project.input("input.txt")
|
29
|
-
second_time.should equal(first_time)
|
30
|
-
end
|
31
25
|
|
32
26
|
end
|
33
27
|
|
@@ -71,4 +65,51 @@ describe Pith::Project do
|
|
71
65
|
|
72
66
|
end
|
73
67
|
|
68
|
+
describe "when an input file is unchanged" do
|
69
|
+
|
70
|
+
before do
|
71
|
+
@input_file = $input_dir + "input.html.haml"
|
72
|
+
@input_file.touch
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "a second call to #input" do
|
76
|
+
it "returns the same Input object" do
|
77
|
+
|
78
|
+
first_time = @project.input("input.html.haml")
|
79
|
+
first_time.should_not be_nil
|
80
|
+
|
81
|
+
@project.refresh
|
82
|
+
second_time = @project.input("input.html.haml")
|
83
|
+
second_time.should equal(first_time)
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "when an input file is changed" do
|
91
|
+
|
92
|
+
before do
|
93
|
+
@input_file = $input_dir + "input.html.haml"
|
94
|
+
@input_file.touch(Time.now - 10)
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "a second call to #input" do
|
98
|
+
it "returns a different Input object" do
|
99
|
+
|
100
|
+
first_time = @project.input("input.html.haml")
|
101
|
+
first_time.should_not be_nil
|
102
|
+
|
103
|
+
@input_file.touch(Time.now)
|
104
|
+
|
105
|
+
@project.refresh
|
106
|
+
second_time = @project.input("input.html.haml")
|
107
|
+
second_time.should_not be_nil
|
108
|
+
second_time.should_not equal(first_time)
|
109
|
+
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
74
115
|
end
|
data/spec/pith/project_spec.rb~
CHANGED
@@ -22,12 +22,6 @@ describe Pith::Project do
|
|
22
22
|
@input.should be_kind_of(Pith::Input::Verbatim)
|
23
23
|
@input.file.should == @input_file
|
24
24
|
end
|
25
|
-
|
26
|
-
it "returns the same Input output every time" do
|
27
|
-
first_time = @project.input("input.txt")
|
28
|
-
second_time = @project.input("input.txt")
|
29
|
-
second_time.should equal(first_time)
|
30
|
-
end
|
31
25
|
|
32
26
|
end
|
33
27
|
|
@@ -71,4 +65,51 @@ describe Pith::Project do
|
|
71
65
|
|
72
66
|
end
|
73
67
|
|
68
|
+
describe "when an input file is unchanged" do
|
69
|
+
|
70
|
+
before do
|
71
|
+
@input_file = $input_dir + "input.html.haml"
|
72
|
+
@input_file.touch
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "a second call to #input" do
|
76
|
+
it "returns the same Input object" do
|
77
|
+
|
78
|
+
first_time = @project.input("input.html.haml")
|
79
|
+
first_time.should_not be_nil
|
80
|
+
|
81
|
+
@project.refresh
|
82
|
+
second_time = @project.input("input.html.haml")
|
83
|
+
second_time.should equal(first_time)
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "when an input file is changed" do
|
91
|
+
|
92
|
+
before do
|
93
|
+
@input_file = $input_dir + "input.html.haml"
|
94
|
+
@input_file.touch(Time.now - 10)
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "a second call to #input" do
|
98
|
+
it "returns a different Input object" do
|
99
|
+
|
100
|
+
first_time = @project.input("input.html.haml")
|
101
|
+
first_time.should_not be_nil
|
102
|
+
|
103
|
+
@input_file.touch(Time.now)
|
104
|
+
|
105
|
+
@project.refresh
|
106
|
+
second_time = @project.input("input.html.haml")
|
107
|
+
second_time.should_not be_nil
|
108
|
+
second_time.should_not equal(first_time)
|
109
|
+
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
74
115
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/spec_helper.rb~
CHANGED
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:
|
4
|
+
hash: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
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-
|
18
|
+
date: 2010-09-01 00:00:00 +10:00
|
19
19
|
default_executable: pith
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -102,7 +102,6 @@ files:
|
|
102
102
|
- lib/pith/input/verbatim.rb~
|
103
103
|
- lib/pith/input.rb
|
104
104
|
- lib/pith/input.rb~
|
105
|
-
- lib/pith/metadata.rb
|
106
105
|
- lib/pith/metadata.rb~
|
107
106
|
- lib/pith/project.rb
|
108
107
|
- lib/pith/project.rb~
|
@@ -115,6 +114,8 @@ files:
|
|
115
114
|
- lib/pith.rb
|
116
115
|
- lib/pith.rb~
|
117
116
|
- sample/_layouts/standard.haml
|
117
|
+
- sample/_out/blah/deblah.txt
|
118
|
+
- sample/_out/features/stuff.html
|
118
119
|
- sample/_out/index.html
|
119
120
|
- sample/_out/stylesheets/app.css
|
120
121
|
- sample/index.html.haml
|
@@ -123,7 +124,6 @@ files:
|
|
123
124
|
- Rakefile
|
124
125
|
- spec/pith/input/abstract_spec.rb
|
125
126
|
- spec/pith/input/abstract_spec.rb~
|
126
|
-
- spec/pith/metadata_spec.rb
|
127
127
|
- spec/pith/metadata_spec.rb~
|
128
128
|
- spec/pith/project_spec.rb
|
129
129
|
- spec/pith/project_spec.rb~
|
@@ -198,7 +198,6 @@ test_files:
|
|
198
198
|
- Rakefile
|
199
199
|
- spec/pith/input/abstract_spec.rb
|
200
200
|
- spec/pith/input/abstract_spec.rb~
|
201
|
-
- spec/pith/metadata_spec.rb
|
202
201
|
- spec/pith/metadata_spec.rb~
|
203
202
|
- spec/pith/project_spec.rb
|
204
203
|
- spec/pith/project_spec.rb~
|
data/lib/pith/metadata.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
require "yaml"
|
2
|
-
|
3
|
-
module Pith
|
4
|
-
|
5
|
-
module Metadata
|
6
|
-
|
7
|
-
extend self
|
8
|
-
|
9
|
-
def extract_from(io)
|
10
|
-
line = io.gets
|
11
|
-
if line =~ /---$/
|
12
|
-
metadata_prefix = $`
|
13
|
-
yaml = ""
|
14
|
-
while line && line.start_with?(metadata_prefix)
|
15
|
-
yaml << line[metadata_prefix.size .. -1]
|
16
|
-
line = io.gets
|
17
|
-
end
|
18
|
-
YAML.load(yaml)
|
19
|
-
else
|
20
|
-
Hash.new
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
data/spec/pith/metadata_spec.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'stringio'
|
3
|
-
|
4
|
-
require 'pith/metadata'
|
5
|
-
|
6
|
-
describe Pith::Metadata do
|
7
|
-
|
8
|
-
def metadata
|
9
|
-
Pith::Metadata.extract_from(StringIO.new(@input))
|
10
|
-
end
|
11
|
-
|
12
|
-
describe "when input contains no YAML metadata" do
|
13
|
-
|
14
|
-
before do
|
15
|
-
@input = "%p Blah blah"
|
16
|
-
end
|
17
|
-
|
18
|
-
it "returns an empty Hash" do
|
19
|
-
metadata.should == {}
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
describe "when input contains YAML metadata" do
|
25
|
-
|
26
|
-
before do
|
27
|
-
@input = <<-HAML.gsub(/^ +/, '')
|
28
|
-
-# ---
|
29
|
-
-# x: 1
|
30
|
-
-# y: "2"
|
31
|
-
-# ...
|
32
|
-
-# other stuff
|
33
|
-
HAML
|
34
|
-
end
|
35
|
-
|
36
|
-
it "extracts the metadata" do
|
37
|
-
metadata.should == {
|
38
|
-
"x" => 1,
|
39
|
-
"y" => "2"
|
40
|
-
}
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
46
|
-
|