pith 0.3.4 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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