pith 0.3.4 → 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.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Mike Williams <mdub@dogbiscuit.org>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,4 +1,4 @@
1
- Pith
1
+ Pith [![Build Status](https://secure.travis-ci.org/mdub/pith.png?branch=master)](http://travis-ci.org/mdub/pith)
2
2
  ====
3
3
 
4
4
  Pith is a static website generator, written in Ruby.
@@ -159,7 +159,7 @@ Any path beginning with a slash ("/") is resolved relative to the root of the si
159
159
  There's also a "`link`" function, for even easier hyper-linking:
160
160
 
161
161
  link("other.html", "Other page")
162
-
162
+
163
163
  Configuring Pith
164
164
  ----------------
165
165
 
@@ -214,6 +214,8 @@ For even quicker prototyping, Pith includes a simple HTTP server. Start it by u
214
214
 
215
215
  Pith will incrementally re-build the site as you browse -- that is, if you alter any input files, Pith will regenerate the affected outputs.
216
216
 
217
+ Add the "`--live`" option to "`serve`" to enable [Live.js][livejs]), for live-reloading of HTML, CSS and Javascript.
218
+
217
219
  Plugins
218
220
  -------
219
221
 
@@ -221,7 +223,7 @@ Pith includes a couple of optional "plugins". Actually, "plugin" is a bit stron
221
223
 
222
224
  ### Publication plugin
223
225
 
224
- The 'publication' plugin makes it easier to build a weblog using Pith.
226
+ The 'publication' plugin makes it easier to build a weblog using Pith.
225
227
 
226
228
  Enable it by requiring it in your "`config.rb`", like so:
227
229
 
@@ -229,12 +231,12 @@ Enable it by requiring it in your "`config.rb`", like so:
229
231
 
230
232
  Now you can specify a "published" date/time in the metadata of any pages you consider to be "articles", e.g.
231
233
 
232
- ---
234
+ ---
233
235
  title: Introducing ShamRack
234
236
  published: 3-July-2009, 15:50
235
237
  ...
236
238
 
237
- This exposes "`page.published_at`" for use in your templates.
239
+ This exposes "`page.published_at`" for use in your templates.
238
240
 
239
241
  In addition, "`project.published_inputs`" lists all the pages that have such a timestamp, in order of publication, making it easy to build index pages and XML feeds. Here's a example, used to build the article index for [dogbiscuit.org](http://dogbiscuit.org/mdub/weblog):
240
242
 
@@ -255,11 +257,11 @@ The Compass plugin gives you the full power of [Compass][compass] in your Sass s
255
257
  require "pith/plugins/compass"
256
258
 
257
259
  Note that if you're using Bundler, you'll also need to include the Compass gem in your `Gemfile`.
258
-
260
+
259
261
  gem "compass"
260
262
 
261
263
  [tilt]: http://github.com/rtomayko/tilt/
262
264
  [haml]: http://haml-lang.com
263
265
  [sass]: http://sass-lang.com
264
266
  [compass]: http://compass-style.org
265
-
267
+ [livejs]: http://livejs.com
data/bin/pith CHANGED
@@ -47,9 +47,13 @@ class PithCommand < Clamp::Command
47
47
  end
48
48
 
49
49
  subcommand "serve", "Serve the generated website" do
50
+
51
+ option ["-L", "--live"], :flag, "automatically reload changes"
52
+
50
53
  def execute
51
- serve
54
+ serve(:auto_reload => live?)
52
55
  end
56
+
53
57
  end
54
58
 
55
59
  protected
@@ -83,9 +87,11 @@ class PithCommand < Clamp::Command
83
87
  Pith::Watcher.new(project, :interval => interval).call
84
88
  end
85
89
 
86
- def serve
90
+ def serve(options = {})
87
91
  require "pith/server"
88
- server = Pith::Server.new(project)
92
+ project.sync
93
+ project.listen_for_changes
94
+ server = Pith::Server.new(project, options)
89
95
  puts %{>>> Now taking the Pith at "http://localhost:#{port}"}
90
96
  Rack::Handler.get("thin").run(server, :Port => port)
91
97
  end
@@ -5,10 +5,18 @@ Feature: automatic cleanup
5
5
 
6
6
  Scenario: output without matching input
7
7
 
8
+ Given output file "blah.txt" exists
9
+
10
+ When I build the site
11
+
12
+ Then output file "blah.txt" should not exist
13
+
14
+ Scenario: input removed
15
+
8
16
  Given input file "blah.txt" exists
9
-
17
+
10
18
  When I build the site
11
19
  And I remove input file "blah.txt"
12
20
  And I rebuild the site
13
-
21
+
14
22
  Then output file "blah.txt" should not exist
@@ -70,3 +70,34 @@ Scenario: delete a dependency
70
70
  <p>banana</p>
71
71
  """
72
72
 
73
+ Scenario: alter meta-data
74
+
75
+ Given input file "index.html.haml" contains
76
+ """
77
+ - project.inputs.select do |input|
78
+ - output.record_dependency_on(input)
79
+ - if input.meta["flavour"]
80
+ %p= input.meta["flavour"]
81
+ """
82
+
83
+ And input file "page.html.haml" contains
84
+ """
85
+ ---
86
+ flavour: Chocolate
87
+ ---
88
+ """
89
+
90
+ When I build the site
91
+ Then output file "index.html" should contain "<p>Chocolate</p>"
92
+
93
+ When I change input file "page.html.haml" to contain
94
+ """
95
+ ---
96
+ flavour: Strawberry
97
+ ---
98
+ """
99
+
100
+ And I rebuild the site
101
+
102
+ Then output file "index.html" should be re-generated
103
+ Then output file "index.html" should contain "<p>Strawberry</p>"
@@ -0,0 +1,37 @@
1
+ Feature: link method with attributes
2
+
3
+ I want to be able to pass arguments to the link method
4
+ So that additional attributes are generated
5
+
6
+ Scenario: link with class attribute
7
+
8
+ Given input file "index.html.haml" contains
9
+ """
10
+ = link("page.html", "Page", :class => 'active')
11
+ """
12
+ And input file "page.html" exists
13
+
14
+ When I build the site
15
+ Then output file "index.html" should contain /<a [class="active", href="page.html"]/
16
+
17
+ Scenario: link with title attribute
18
+
19
+ Given input file "index.html.haml" contains
20
+ """
21
+ = link("page.html", "Page", :title => 'click me')
22
+ """
23
+ And input file "page.html" exists
24
+
25
+ When I build the site
26
+ Then output file "index.html" should contain /<a [title="click me", href="page.html"]/
27
+
28
+ Scenario: link with title and class attributes
29
+
30
+ Given input file "index.html.haml" contains
31
+ """
32
+ = link("page.html", "Page", :title => 'click me', :class => 'active')
33
+ """
34
+ And input file "page.html" exists
35
+
36
+ When I build the site
37
+ Then output file "index.html" should contain /<a [title="click me", class="active", href="page.html"]/
@@ -31,6 +31,32 @@ Scenario: link from a sub-directory to a root-level page
31
31
  <a href="../help.html">Help</a>
32
32
  """
33
33
 
34
+ Scenario: link to an absolute url
35
+
36
+ Given input file "index.html.haml" contains
37
+ """
38
+ = link("http://example.com", "Go to example.com")
39
+ """
40
+
41
+ When I build the site
42
+ Then output file "index.html" should contain
43
+ """
44
+ <a href="http://example.com">Go to example.com</a>
45
+ """
46
+
47
+ Scenario: link to a (secure) absolute url
48
+
49
+ Given input file "index.html.haml" contains
50
+ """
51
+ = link("https://example.com", "Securely go to example.com")
52
+ """
53
+
54
+ When I build the site
55
+ Then output file "index.html" should contain
56
+ """
57
+ <a href="https://example.com">Securely go to example.com</a>
58
+ """
59
+
34
60
  Scenario: link to an image
35
61
 
36
62
  Given input file "subdir/page.html.haml" contains
@@ -10,6 +10,10 @@ Given /^input file "([^\"]*)" exists$/ do |path|
10
10
  step %{input file "#{path}" contains "something"}
11
11
  end
12
12
 
13
+ Given /^output file "([^\"]*)" exists$/ do |path|
14
+ @outputs.write(path, "something", :mtime => (Time.now - 4))
15
+ end
16
+
13
17
  Given "the site is up-to-date" do
14
18
  step "I build the site"
15
19
  end
@@ -16,8 +16,8 @@ module Pith
16
16
 
17
17
  attr_reader :ignore_patterns
18
18
 
19
- def ignore(pattern)
20
- ignore_patterns << pattern
19
+ def ignore(*pattern)
20
+ pattern.flatten.each {|p| ignore_patterns << p }
21
21
  end
22
22
 
23
23
  attr_reader :helper_module
@@ -188,7 +188,7 @@ module Pith
188
188
  end
189
189
  end
190
190
 
191
- YamlParseError = defined?(Psych) ? Psych::SyntaxError : ArgumentError
191
+ YamlParseError = defined?(Psych::SyntaxError) ? Psych::SyntaxError : ArgumentError
192
192
 
193
193
  def read_meta(io)
194
194
  header = io.gets
@@ -212,6 +212,7 @@ module Pith
212
212
  def unload
213
213
  logger.debug "unloading #{path}"
214
214
  @load_time = nil
215
+ @meta = nil
215
216
  end
216
217
 
217
218
  def logger
@@ -12,17 +12,19 @@ module Pith
12
12
  end
13
13
 
14
14
  def published_at
15
- parse_date(meta["published"])
15
+ parse_timestamp(meta["published"])
16
16
  end
17
17
 
18
18
  def updated_at
19
- parse_date(meta["updated"]) || published_at
19
+ parse_timestamp(meta["updated"]) || published_at
20
20
  end
21
21
 
22
22
  private
23
23
 
24
- def parse_date(date_string)
25
- Time.parse(date_string) if date_string
24
+ def parse_timestamp(arg)
25
+ return unless arg
26
+ return arg.to_time if arg.respond_to?(:to_time)
27
+ Time.parse(arg.to_s)
26
28
  end
27
29
 
28
30
  end
@@ -1,3 +1,4 @@
1
+ require "listen"
1
2
  require "logger"
2
3
  require "pith/config_provider"
3
4
  require "pith/input"
@@ -5,6 +6,7 @@ require "pith/pathname_ext"
5
6
  require "pith/reference_error"
6
7
  require "set"
7
8
  require "tilt"
9
+ require "thread"
8
10
 
9
11
  module Pith
10
12
 
@@ -13,12 +15,15 @@ module Pith
13
15
  def initialize(input_dir, output_dir = nil, attributes = {})
14
16
  @input_dir = Pathname(input_dir)
15
17
  @output_dir = output_dir ? Pathname(output_dir) : (@input_dir + "_out")
16
- @input_map = {}
17
- @output_map = {}
18
+ @logger = Logger.new(nil)
18
19
  attributes.each do |k,v|
19
20
  send("#{k}=", v)
20
21
  end
21
- FileUtils.rm_rf(output_dir.to_s)
22
+ @input_map = {}
23
+ @output_map = {}
24
+ @mtimes ||= {}
25
+ @config_provider ||= Pith::ConfigProvider.new(self)
26
+ @mutex = Mutex.new
22
27
  end
23
28
 
24
29
  attr_reader :input_dir
@@ -74,16 +79,18 @@ module Pith
74
79
  # Public: re-sync with the file-system.
75
80
  #
76
81
  def sync
77
- config_provider.sync
78
- sync_input_files
82
+ @mutex.synchronize do
83
+ config_provider.sync
84
+ sync_input_files
85
+ cleanup_output_files
86
+ end
79
87
  end
80
88
 
81
- def sync_every(period)
82
- @next_sync ||= 0
83
- now = Time.now.to_i
84
- if now >= @next_sync
89
+ # Public: start a Thread to automatically sync when inputs change.
90
+ #
91
+ def listen_for_changes
92
+ Listen.to(input_dir.to_s) do
85
93
  sync
86
- @next_sync = now + period
87
94
  end
88
95
  end
89
96
 
@@ -98,13 +105,8 @@ module Pith
98
105
  output_dir.mtime
99
106
  end
100
107
 
101
- def logger
102
- @logger ||= Logger.new(nil)
103
- end
104
-
105
- def config_provider
106
- @config_provider ||= Pith::ConfigProvider.new(self)
107
- end
108
+ attr_reader :logger
109
+ attr_reader :config_provider
108
110
 
109
111
  def config
110
112
  config_provider.config
@@ -115,7 +117,6 @@ module Pith
115
117
  attr_writer :logger
116
118
 
117
119
  def sync_input_files
118
- @mtimes ||= {}
119
120
  removed_paths = @mtimes.keys
120
121
  Pathname.glob(input_dir + "**/*", File::FNM_DOTMATCH) do |file|
121
122
  next unless file.file?
@@ -138,6 +139,17 @@ module Pith
138
139
  end
139
140
  end
140
141
 
142
+ def cleanup_output_files
143
+ Pathname.glob(output_dir + "**/*", File::FNM_DOTMATCH) do |file|
144
+ next unless file.file?
145
+ path = file.relative_path_from(output_dir)
146
+ unless output(path)
147
+ logger.info "XXX #{path}"
148
+ FileUtils.rm_f(file)
149
+ end
150
+ end
151
+ end
152
+
141
153
  def file_added(path)
142
154
  i = Input.new(self, path)
143
155
  i.when_added
@@ -32,9 +32,9 @@ module Pith
32
32
 
33
33
  def render(input, locals = {}, &block)
34
34
  with_input(input) do
35
- result = input.render(self, locals, &block)
35
+ result = input.render(self, locals, &block)
36
36
  layout_ref = input.meta["layout"]
37
- result = render_ref(layout_ref) { result } if layout_ref
37
+ result = render_ref(layout_ref) { result } if layout_ref
38
38
  result
39
39
  end
40
40
  end
@@ -65,21 +65,36 @@ module Pith
65
65
  relative_url_to(resolve_reference(target_ref))
66
66
  end
67
67
 
68
- def link(target_ref, label = nil)
69
- target_path = resolve_reference(target_ref)
70
- label ||= begin
71
- target_input = input(target_path)
72
- output.record_dependency_on(target_input)
73
- target_input.title
74
- rescue ReferenceError
75
- "???"
68
+ def link(target_ref, label = nil, attrs={})
69
+ if absolute_url?(target_ref)
70
+ attrs['href'] = target_ref
71
+ else
72
+ target_path = resolve_reference(target_ref)
73
+ attrs['href'] = relative_url_to(target_path)
74
+ label ||= begin
75
+ target_input = input(target_path)
76
+ output.record_dependency_on(target_input)
77
+ target_input.title
78
+ rescue ReferenceError
79
+ "???"
80
+ end
76
81
  end
77
- url = relative_url_to(target_path)
78
- %{<a href="#{url}">#{label}</a>}
82
+
83
+ # Loop through attrs hash, flatten the key, value
84
+ # pairs for appending to the dom element/link
85
+ attrs_flatten = attrs.each_pair.collect do |key, value|
86
+ %Q{#{key}="#{value}"}
87
+ end.join(' ')
88
+
89
+ "<a #{attrs_flatten}>#{label}</a>"
79
90
  end
80
91
 
81
92
  private
82
93
 
94
+ def absolute_url?(ref)
95
+ ref.respond_to?(:to_str) && ref.to_str =~ %r{^\w+:/}
96
+ end
97
+
83
98
  def resolve_reference(ref)
84
99
  if ref.kind_of?(Pith::Input)
85
100
  raise(ReferenceError, %{No output for "#{ref.path}"}) if ref.output.nil?
@@ -1,16 +1,16 @@
1
- require "rack"
2
1
  require "pathname"
3
- require "thread"
2
+ require "rack"
3
+ require "rack/livejs"
4
4
 
5
5
  module Pith
6
6
 
7
7
  module Server
8
8
 
9
- def new(project)
9
+ def new(project, options = {})
10
10
  Rack::Builder.new do
11
- use Rack::CommonLogger
12
11
  use Rack::ShowExceptions
13
12
  use Rack::Lint
13
+ use Rack::Livejs if options[:auto_reload]
14
14
  use Pith::Server::OutputFinder, project
15
15
  run Rack::Directory.new(project.output_dir)
16
16
  end
@@ -27,8 +27,6 @@ module Pith
27
27
 
28
28
  def call(env)
29
29
 
30
- @project.sync_every(1)
31
-
32
30
  path_info = ::Rack::Utils.unescape(env["PATH_INFO"])
33
31
  ends_with_slash = (path_info[-1] == '/')
34
32
 
@@ -1,3 +1,3 @@
1
1
  module Pith
2
- VERSION = "0.3.4".freeze
2
+ VERSION = "0.4.0".freeze
3
3
  end
@@ -23,7 +23,19 @@ describe Pith::Config do
23
23
 
24
24
  it "adds to ignore_patterns" do
25
25
  config.ignore("foo")
26
- config.ignore_patterns
26
+ config.ignore_patterns.should be_member('foo')
27
+ end
28
+
29
+ it "adds multiple patterns to ignore_patterns (when passed multiple arguments)" do
30
+ config.ignore("foo", "bar")
31
+ config.ignore_patterns.should be_member('foo')
32
+ config.ignore_patterns.should be_member('bar')
33
+ end
34
+
35
+ it "adds multiple patterns to ignore_patterns (when passed an array)" do
36
+ config.ignore(["foo", "bar"])
37
+ config.ignore_patterns.should be_member('foo')
38
+ config.ignore_patterns.should be_member('bar')
27
39
  end
28
40
 
29
41
  end
@@ -19,6 +19,16 @@ describe Pith::Plugins::Publication::TemplateMethods do
19
19
  @template.published_at.should == Time.local(1999, 12, 25, 22, 30)
20
20
  end
21
21
 
22
+ it "honours any parsing (of Time) that yaml may do on the 'published' meta-field" do
23
+ @template.meta["published"] = Time.local(1999, 12, 25, 22, 30)
24
+ @template.published_at.should == Time.local(1999, 12, 25, 22, 30)
25
+ end
26
+
27
+ it "honours any parsing (to Date) of time that yaml may do on the 'published' meta-field" do
28
+ @template.meta["published"] = Date.new(1999, 12, 25)
29
+ @template.published_at.should == Time.local(1999, 12, 25)
30
+ end
31
+
22
32
  end
23
33
 
24
34
  describe "#updated_at" do
@@ -30,9 +40,14 @@ describe Pith::Plugins::Publication::TemplateMethods do
30
40
 
31
41
  it "can be overridden with an 'updated' meta-field" do
32
42
  @template.meta["published"] = "25 Dec 1999 22:30"
33
- @template.meta["published"] = "1 Jan 2000 03:00"
43
+ @template.meta["updated"] = "1 Jan 2000 03:00"
34
44
  @template.updated_at.should == Time.local(2000, 1, 1, 3, 0)
35
45
  end
46
+
47
+ it "honours any parsing of time that yaml may do on the 'updated' meta-field" do
48
+ @template.meta["updated"] = Date.new(2000, 1, 1)
49
+ @template.updated_at.should == Time.local(2000, 1, 1)
50
+ end
36
51
 
37
52
  end
38
53
 
@@ -8,7 +8,7 @@ describe Pith::Server::OutputFinder do
8
8
  let(:output) { stub(:path => Pathname(output_path), :build => true) }
9
9
 
10
10
  let(:project) do
11
- stub(:outputs => [output], :sync_every => nil)
11
+ stub(:outputs => [output])
12
12
  end
13
13
 
14
14
  let(:app) do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pith
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,14 +9,14 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-18 00:00:00.000000000 Z
12
+ date: 2014-03-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: tilt
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
21
  version: '1.3'
22
22
  type: :runtime
@@ -24,7 +24,7 @@ dependencies:
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ! '>='
27
+ - - ~>
28
28
  - !ruby/object:Gem::Version
29
29
  version: '1.3'
30
30
  - !ruby/object:Gem::Dependency
@@ -75,6 +75,38 @@ dependencies:
75
75
  - - ! '>='
76
76
  - !ruby/object:Gem::Version
77
77
  version: 0.3.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: listen
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: '1.2'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '1.2'
94
+ - !ruby/object:Gem::Dependency
95
+ name: rack-livejs
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: 0.2.1
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: 0.2.1
78
110
  description: ! 'Pith builds static websites, using markup/template languages including
79
111
  Haml, Sass, ERb, Liquid, Markdown and Textile.
80
112
 
@@ -123,6 +155,7 @@ files:
123
155
  - sample/index.html.haml
124
156
  - sample/stylesheets/app.css.sass
125
157
  - README.markdown
158
+ - LICENSE
126
159
  - Rakefile
127
160
  - spec/pith/config_spec.rb
128
161
  - spec/pith/input_spec.rb
@@ -148,6 +181,7 @@ files:
148
181
  - features/incremental_rebuild.feature~
149
182
  - features/layouts.feature
150
183
  - features/layouts.feature~
184
+ - features/link_attributes.feature
151
185
  - features/linking.feature~
152
186
  - features/markdown.feature
153
187
  - features/metadata.feature
@@ -168,7 +202,8 @@ files:
168
202
  - cucumber.yml
169
203
  - bin/pith
170
204
  homepage: http://github.com/mdub/pith
171
- licenses: []
205
+ licenses:
206
+ - MIT
172
207
  post_install_message:
173
208
  rdoc_options: []
174
209
  require_paths:
@@ -181,7 +216,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
181
216
  version: '0'
182
217
  segments:
183
218
  - 0
184
- hash: -677330549993554291
219
+ hash: -2482242163062205897
185
220
  required_rubygems_version: !ruby/object:Gem::Requirement
186
221
  none: false
187
222
  requirements:
@@ -190,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
190
225
  version: '0'
191
226
  segments:
192
227
  - 0
193
- hash: -677330549993554291
228
+ hash: -2482242163062205897
194
229
  requirements: []
195
230
  rubyforge_project:
196
231
  rubygems_version: 1.8.23
@@ -223,6 +258,7 @@ test_files:
223
258
  - features/incremental_rebuild.feature~
224
259
  - features/layouts.feature
225
260
  - features/layouts.feature~
261
+ - features/link_attributes.feature
226
262
  - features/linking.feature~
227
263
  - features/markdown.feature
228
264
  - features/metadata.feature