pith 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/README.markdown +1 -1
  3. data/cucumber.yml +1 -1
  4. data/features/layouts.feature +7 -7
  5. data/features/relative_linking.feature +2 -2
  6. data/features/step_definitions/build_steps.rb +1 -1
  7. data/features/textile.feature +11 -5
  8. data/lib/pith/input.rb +1 -0
  9. data/lib/pith/plugins/compass.rb +1 -1
  10. data/lib/pith/render_context.rb +0 -3
  11. data/lib/pith/version.rb +1 -1
  12. data/spec/pith/config_spec.rb +9 -9
  13. data/spec/pith/input_spec.rb +17 -9
  14. data/spec/pith/pathname_ext_spec.rb +5 -5
  15. data/spec/pith/plugins/publication_spec.rb +7 -7
  16. data/spec/pith/project_spec.rb +13 -13
  17. data/spec/pith/server_spec.rb +8 -9
  18. data/spec/spec_helper.rb +2 -0
  19. metadata +74 -140
  20. data/features/content_for.feature~ +0 -29
  21. data/features/haml.feature~ +0 -24
  22. data/features/helpers.feature~ +0 -23
  23. data/features/ignorance.feature~ +0 -37
  24. data/features/include.feature~ +0 -84
  25. data/features/incremental_rebuild.feature~ +0 -24
  26. data/features/layouts.feature~ +0 -63
  27. data/features/linking.feature~ +0 -79
  28. data/features/metadata.feature~ +0 -20
  29. data/features/relative_linking.feature~ +0 -109
  30. data/features/step_definitions/build_steps.rb~ +0 -66
  31. data/features/support/env.rb~ +0 -86
  32. data/features/support/rspec_matchers.rb~ +0 -5
  33. data/features/textile.feature~ +0 -29
  34. data/features/verbatim.feature~ +0 -32
  35. data/lib/pith.rb~ +0 -1
  36. data/lib/pith/console_logger.rb~ +0 -16
  37. data/lib/pith/input.rb~ +0 -20
  38. data/lib/pith/metadata.rb~ +0 -26
  39. data/lib/pith/pathname_ext.rb~ +0 -16
  40. data/lib/pith/plugins/publication.rb~ +0 -2
  41. data/lib/pith/plugins/publication/input.rb~ +0 -50
  42. data/lib/pith/plugins/publication/project.rb~ +0 -14
  43. data/lib/pith/project.rb~ +0 -143
  44. data/lib/pith/reference_error.rb~ +0 -5
  45. data/lib/pith/render_context.rb~ +0 -117
  46. data/lib/pith/server.rb~ +0 -46
  47. data/lib/pith/version.rb~ +0 -3
  48. data/lib/pith/watcher.rb~ +0 -32
  49. data/sample/_out/index.html +0 -14
  50. data/sample/_out/stylesheets/app.css +0 -38
@@ -1,66 +0,0 @@
1
- Given /^input file "([^\"]*)" contains "([^\"]*)"$/ do |path, content|
2
- @inputs.write(path, content, :mtime => (Time.now - 5))
3
- end
4
-
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"}
11
- end
12
-
13
- Given "the site is up-to-date" do
14
- When "I build the site"
15
- end
16
-
17
- Given /^the "([^\"]*)" flag is enabled$/ do |flag|
18
- @project.send("#{flag}=", true)
19
- end
20
-
21
- Given /^the "([^\"]*)" flag is disabled$/ do |flag|
22
- @project.send("#{flag}=", false)
23
- end
24
-
25
- When /^I change input file "([^\"]*)" to contain "([^\"]*)"$/ do |path, content|
26
- @inputs[path] = content
27
- end
28
-
29
- When /^I change input file "([^\"]*)" to contain$/ do |path, content|
30
- @inputs[path] = content
31
- end
32
-
33
- When /^I remove input file "([^\"]*)"$/ do |path|
34
- @inputs[path] = nil
35
- end
36
-
37
- When /^I (?:re)?build the site$/ do
38
- @project.logger.clear
39
- @project.build
40
- end
41
-
42
- class String
43
- def clean
44
- strip.gsub(/\s+/, ' ')
45
- end
46
- end
47
-
48
- Then /^output file "([^\"]*)" should contain "([^\"]*)"$/ do |path, content|
49
- @outputs[path].clean.should == content.clean
50
- end
51
-
52
- Then /^output file "([^\"]*)" should contain$/ do |path, content|
53
- @outputs[path].clean.should == content.clean
54
- end
55
-
56
- Then /^output file "([^\"]*)" should not exist$/ do |path|
57
- @outputs[path].should == nil
58
- end
59
-
60
- Then /^output file "([^"]*)" should be re\-generated$/ do |path|
61
- @project.logger.messages.should contain(/--> +#{path}/)
62
- end
63
-
64
- Then /^output file "([^"]*)" should not be re\-generated$/ do |path|
65
- @project.logger.messages.should_not contain(/--> +#{path}/)
66
- end
@@ -1,86 +0,0 @@
1
- require "pathname"
2
-
3
- class DirHash
4
-
5
- def initialize(dir)
6
- @dir = Pathname(dir)
7
- end
8
-
9
- def [](file)
10
- file_path = @dir + file
11
- file_path.read if file_path.exist?
12
- end
13
-
14
- def []=(file, content)
15
- if content.nil?
16
- remove(file)
17
- else
18
- write(file, content)
19
- end
20
- end
21
-
22
- def remove(file)
23
- (@dir + file).unlink
24
- end
25
-
26
- def write(file, content, options = {})
27
- file_path = @dir + file
28
- file_path.parent.mkpath
29
- file_path.open("w") do |io|
30
- io << content
31
- end
32
- if options[:mtime]
33
- timestamp = options[:mtime]
34
- file_path.utime(timestamp, timestamp)
35
- end
36
- end
37
-
38
- end
39
-
40
- class InternalLogger
41
-
42
- def initialize
43
- @messages = []
44
- end
45
-
46
- attr_reader :messages
47
-
48
- def clear
49
- @messages.clear
50
- end
51
-
52
- def info(message, &block)
53
- message ||= block.call
54
- write(message)
55
- end
56
-
57
- alias :warn :info
58
- alias :debug :info
59
-
60
- def write(message)
61
- @messages << message
62
- end
63
-
64
- end
65
-
66
- $project_dir = Pathname(__FILE__).expand_path.parent.parent.parent
67
- $tmp_dir = $project_dir + "tmp"
68
-
69
- $input_dir = $tmp_dir + "input"
70
-
71
- $output_dir = $tmp_dir + "output"
72
- $output_dir.mkpath
73
-
74
- $: << ($project_dir + "lib").to_s
75
- require "pith"
76
-
77
- Before do
78
- [$input_dir, $output_dir].each do |dir|
79
- dir.rmtree if dir.exist?
80
- dir.mkpath
81
- end
82
- @project = Pith::Project.new(:input_dir => $input_dir, :output_dir => $output_dir)
83
- @project.logger = InternalLogger.new
84
- @inputs = DirHash.new($input_dir)
85
- @outputs = DirHash.new($output_dir)
86
- end
@@ -1,5 +0,0 @@
1
- Spec::Matchers.define :contain do |expected|
2
- match do |actual|
3
- actual.any? { |x| expected === x }
4
- end
5
- end
@@ -1,29 +0,0 @@
1
- Feature: support for Textile markup
2
-
3
- I want to use Textile fragments in pages
4
- So that I can express content succintly
5
-
6
- Scenario: Haml page with embedded Textile
7
-
8
- Given input file "page.html.haml" contains
9
- """
10
- :textile
11
-
12
- A paragraph.
13
-
14
- * one
15
- * two
16
- * three
17
- """
18
-
19
- When I build the site
20
-
21
- Then output file "page.html" should contain
22
- """
23
- <p>A paragraph.</p>
24
- <ul>
25
- <li>one</li>
26
- <li>two</li>
27
- <li>three</li>
28
- </ul>
29
- """
@@ -1,32 +0,0 @@
1
- Feature: unrecognised input files are copied into output intact
2
-
3
- I want any unrecognised file to be copied into the site verbatim
4
- So that I can mix dynamic and static content
5
-
6
- Scenario: text file
7
-
8
- Given input file "verbatim.txt" contains
9
- """
10
- Blah de blah
11
- """
12
-
13
- When I build the site
14
-
15
- Then output file "verbatim.txt" should contain
16
- """
17
- Blah de blah
18
- """
19
-
20
- Scenario: file in subdirectory
21
-
22
- Given input file "blah/verbatim.txt" contains
23
- """
24
- Blah de blah
25
- """
26
-
27
- When I build the site
28
-
29
- Then output file "blah/verbatim.txt" should contain
30
- """
31
- Blah de blah
32
- """
data/lib/pith.rb~ DELETED
@@ -1 +0,0 @@
1
- require 'pith/project'
@@ -1,16 +0,0 @@
1
- module Pith
2
-
3
- class ConsoleLogger
4
-
5
- def initialize(io = STDOUT)
6
- @io = io
7
- end
8
-
9
- def info(message, &block)
10
- message ||= block.call
11
- @io.puts(message)
12
- end
13
-
14
- end
15
-
16
- end
data/lib/pith/input.rb~ DELETED
@@ -1,20 +0,0 @@
1
- require "pith/input/template"
2
- require "pith/input/resource"
3
-
4
- module Pith
5
- module Input
6
-
7
- class << self
8
-
9
- def new(project, path)
10
- if Template.can_handle?(path)
11
- Template.new(project, path)
12
- else
13
- Resource.new(project, path)
14
- end
15
- end
16
-
17
- end
18
-
19
- end
20
- end
@@ -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
@@ -1,16 +0,0 @@
1
- require "pathname"
2
-
3
- class Pathname
4
-
5
- def touch(mtime = nil)
6
- FileUtils.touch(self.to_s)
7
- utime(mtime, mtime) if mtime
8
- end
9
-
10
- def all_files(pattern = "**/*")
11
- Pathname.glob(self + pattern, File::FNM_DOTMATCH).select do |path|
12
- path.file?
13
- end
14
- end
15
-
16
- end
@@ -1,2 +0,0 @@
1
- require "pith/plugins/publication/input"
2
- require "pith/plugins/publication/project"
@@ -1,50 +0,0 @@
1
- require "pith/input"
2
- require "time"
3
-
4
- module Pith
5
- module Plugins
6
- module Publication
7
-
8
- module TemplateMethods
9
-
10
- def published?
11
- !published_at.nil?
12
- end
13
-
14
- def published_at
15
- parse_date(meta["published"])
16
- end
17
-
18
- def updated_at
19
- parse_date(meta["updated"]) || published_at
20
- end
21
-
22
- private
23
-
24
- def parse_date(date_string)
25
- Time.parse(date_string) if date_string
26
- end
27
-
28
- end
29
-
30
- end
31
- end
32
- end
33
-
34
- module Pith
35
- module Input
36
-
37
- class Abstract
38
-
39
- def published?
40
- false
41
- end
42
-
43
- end
44
-
45
- class Template
46
- include Pith::Plugins::Publication::TemplateMethods
47
- end
48
-
49
- end
50
- end
@@ -1,14 +0,0 @@
1
- require "pith/project"
2
- require "pith/plugins/publication/input"
3
-
4
- module Pith
5
-
6
- class Project
7
-
8
- def published_inputs
9
- inputs.select { |i| i.published? }.sort_by { |i| i.published_at }
10
- end
11
-
12
- end
13
-
14
- end
data/lib/pith/project.rb~ DELETED
@@ -1,143 +0,0 @@
1
- require "logger"
2
- require "pith/input"
3
- require "pith/pathname_ext"
4
- require "pith/reference_error"
5
- require "tilt"
6
-
7
- module Pith
8
-
9
- class Project
10
-
11
- def initialize(attributes = {})
12
- attributes.each do |k,v|
13
- send("#{k}=", v)
14
- end
15
- end
16
-
17
- attr_reader :input_dir
18
-
19
- def input_dir=(dir)
20
- @input_dir = Pathname(dir)
21
- end
22
-
23
- attr_reader :output_dir
24
-
25
- def output_dir=(dir)
26
- @output_dir = Pathname(dir)
27
- end
28
-
29
- attr_accessor :assume_content_negotiation
30
- attr_accessor :assume_directory_index
31
-
32
- # Public: get inputs
33
- #
34
- # Returns Pith::Input objects representing the files in the input_dir.
35
- #
36
- # The list of inputs is cached after first load;
37
- # call #refresh to discard the cached data.
38
- #
39
- def inputs
40
- @inputs ||= input_dir.all_files.map do |input_file|
41
- path = input_file.relative_path_from(input_dir)
42
- find_or_create_input(path)
43
- end.compact
44
- end
45
-
46
- # Public: find an input.
47
- #
48
- # path - an path relative to either input_dir or output_dir
49
- #
50
- # Returns the first input whose input_path or output_path matches.
51
- # Returns nil if no match is found.
52
- #
53
- def input(path)
54
- path = Pathname(path)
55
- inputs.each do |input|
56
- return input if input.path == path || input.output_path == path
57
- end
58
- nil
59
- end
60
-
61
- # Public: build the project, generating output files.
62
- #
63
- def build
64
- refresh
65
- load_config
66
- remove_old_outputs
67
- generate_outputs
68
- output_dir.touch
69
- end
70
-
71
- # Public: discard cached data that is out-of-sync with the file-system.
72
- #
73
- def refresh
74
- @inputs = nil
75
- @config_files = nil
76
- end
77
-
78
- def last_built_at
79
- output_dir.mtime
80
- end
81
-
82
- def logger
83
- @logger ||= Logger.new(nil)
84
- end
85
-
86
- attr_writer :logger
87
-
88
- def helpers(&block)
89
- helper_module.module_eval(&block)
90
- end
91
-
92
- def helper_module
93
- @helper_module ||= Module.new
94
- end
95
-
96
- def config_files
97
- @config_files ||= begin
98
- input_dir.all_files("_pith/**")
99
- end.to_set
100
- end
101
-
102
- private
103
-
104
- def load_config
105
- config_file = input_dir + "_pith/config.rb"
106
- project = self
107
- if config_file.exist?
108
- eval(config_file.read, binding, config_file)
109
- end
110
- end
111
-
112
- def remove_old_outputs
113
- valid_output_paths = inputs.map { |i| i.output_path }
114
- output_dir.all_files.each do |output_file|
115
- output_path = output_file.relative_path_from(output_dir)
116
- unless valid_output_paths.member?(output_path)
117
- logger.info("removing #{output_path}")
118
- FileUtils.rm(output_file)
119
- end
120
- end
121
- end
122
-
123
- def generate_outputs
124
- inputs.each do |input|
125
- input.build
126
- end
127
- end
128
-
129
- def input_cache
130
- @input_cache ||= Hash.new do |h, cache_key|
131
- h[cache_key] = Input.new(self, cache_key.first)
132
- end
133
- end
134
-
135
- def find_or_create_input(path)
136
- file = input_dir + path
137
- cache_key = [path, file.mtime]
138
- input_cache[cache_key]
139
- end
140
-
141
- end
142
-
143
- end