tributary 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/.gitignore +1 -0
  2. data/.rspec +6 -0
  3. data/LICENCE +661 -0
  4. data/README.md +99 -0
  5. data/Rakefile +5 -0
  6. data/config.ru +9 -0
  7. data/lib/tributary/app.rb +61 -0
  8. data/lib/tributary/item.rb +66 -0
  9. data/lib/tributary/plugins/dummy.rb +7 -0
  10. data/lib/tributary/plugins/mnml.rb +14 -0
  11. data/lib/tributary/plugins/unbreak_my_art.rb +22 -0
  12. data/lib/tributary/stream.rb +51 -0
  13. data/lib/tributary.rb +8 -0
  14. data/spec/fixtures/index.en.en+pl.xml +50 -0
  15. data/spec/fixtures/index.en.en.xml +50 -0
  16. data/spec/fixtures/index.en.xml +50 -0
  17. data/spec/fixtures/index.pl.pl.xml +50 -0
  18. data/spec/fixtures/index.pl.xml +50 -0
  19. data/spec/fixtures/index.xml +50 -0
  20. data/spec/fixtures/layout.css +22 -0
  21. data/spec/fixtures/pages.css +2 -0
  22. data/spec/site/articles/600.en.md +5 -0
  23. data/spec/site/articles/600.md +5 -0
  24. data/spec/site/articles/bilingual.en.md +4 -0
  25. data/spec/site/articles/bilingual.pl.md +4 -0
  26. data/spec/site/articles/unix-millennium-bug.en.md +4 -0
  27. data/spec/site/articles/welcome.md +4 -0
  28. data/spec/site/beeps/beep.md +3 -0
  29. data/spec/site/beeps/dated.md +3 -0
  30. data/spec/site/beeps/english.en.md +3 -0
  31. data/spec/site/beeps/link.md +3 -0
  32. data/spec/site/beeps/polish.pl.md +3 -0
  33. data/spec/site/beeps/quote.md +4 -0
  34. data/spec/site/i18n/en.yml +12 -0
  35. data/spec/site/i18n/pl.yml +12 -0
  36. data/spec/site/pages/about.md +5 -0
  37. data/spec/site/views/articles.haml +4 -0
  38. data/spec/site/views/articles.index.haml +6 -0
  39. data/spec/site/views/articles.index.sass +0 -0
  40. data/spec/site/views/articles.sass +2 -0
  41. data/spec/site/views/beeps.haml +1 -0
  42. data/spec/site/views/beeps.sass +2 -0
  43. data/spec/site/views/error.haml +8 -0
  44. data/spec/site/views/error.sass +6 -0
  45. data/spec/site/views/index.haml +6 -0
  46. data/spec/site/views/index.sass +2 -0
  47. data/spec/site/views/index.xml.haml +17 -0
  48. data/spec/site/views/layout.haml +56 -0
  49. data/spec/site/views/layout.sass +22 -0
  50. data/spec/site/views/pages.haml +3 -0
  51. data/spec/site/views/pages.sass +2 -0
  52. data/spec/tributary/app_spec.rb +266 -0
  53. data/spec/tributary/item_spec.rb +129 -0
  54. data/spec/tributary/plugins/dummy_spec.rb +12 -0
  55. data/spec/tributary/plugins/mnml_spec.rb +16 -0
  56. data/spec/tributary/plugins/unbreak_my_art_spec.rb +36 -0
  57. data/spec/tributary/stream_spec.rb +155 -0
  58. data/tributary.gemspec +18 -0
  59. metadata +204 -0
@@ -0,0 +1,129 @@
1
+ # encoding: UTF-8
2
+
3
+ module Tributary describe Item do
4
+
5
+ before :all do
6
+ App.configure {}
7
+ @about = Item.new 'spec/site/pages/about.md'
8
+ @battle = Item.new 'spec/site/articles/600.md'
9
+ @battle_en = Item.new 'spec/site/articles/600.en.md'
10
+ @beep = Item.new 'spec/site/beeps/beep.md'
11
+ @bi_en = Item.new 'spec/site/articles/bilingual.en.md'
12
+ @bi_pl = Item.new 'spec/site/articles/bilingual.pl.md'
13
+ @unix = Item.new 'spec/site/articles/unix-millennium-bug.en.md'
14
+ @welcome = Item.new 'spec/site/articles/welcome.md'
15
+ end
16
+
17
+ context '#<=>' do
18
+
19
+ it 'sorts Items by date, date-less last' do
20
+ [@bi_en, @beep, @welcome, @about, @battle].sort.should == [@battle, @bi_en, @welcome, @beep, @about]
21
+ end
22
+
23
+ it 'sorts same-path Items by lang, based on App.locale' do
24
+ App.locale = 'pl'
25
+ [@bi_en, @bi_pl].sort.should == [@bi_pl, @bi_en]
26
+ [@battle_en, @battle].sort.should == [@battle, @battle_en]
27
+ App.locale = 'en'
28
+ [@bi_pl, @bi_en].sort.should == [@bi_en, @bi_pl]
29
+ [@battle, @battle_en].sort.should == [@battle_en, @battle]
30
+ App.locale = nil
31
+ [@bi_pl, @bi_en].sort.should == [@bi_en, @bi_pl]
32
+ [@battle_en, @battle].sort.should == [@battle, @battle_en]
33
+ end
34
+
35
+ end
36
+
37
+ context '#body' do
38
+
39
+ it 'returns the given Item’s markdown-processed body' do
40
+ @about.body.should == "<p>tributary <em>about</em> page</p>\n\n<p>about this tributary install</p>\n"
41
+ @welcome.body.should == "<p>tributary <em>welcome</em> article</p>\n"
42
+ end
43
+
44
+ end
45
+
46
+ context '#date' do
47
+
48
+ it 'returns the given Item’s parsed Time' do
49
+ @about.date.should == nil
50
+ @battle.date.should == Time.mktime(2010, 7, 15, 12, 00)
51
+ @unix.date.should == Time.utc(2038, 1, 19, 3, 14, 07)
52
+ @welcome.date.should == Time.mktime(2010, 7, 15)
53
+ end
54
+
55
+ end
56
+
57
+ context '#eql?' do
58
+
59
+ it 'returns predicate for sane use of Items as Hash keys' do
60
+ @about.should be_eql Item.new('spec/site/pages/about.md')
61
+ end
62
+
63
+ end
64
+
65
+ context '#hash' do
66
+
67
+ it 'returns static value for sane use of Items as Hash keys' do
68
+ @about.hash.should == Item.new('spec/site/pages/about.md').hash
69
+ end
70
+
71
+ end
72
+
73
+ context '#lang' do
74
+
75
+ it 'returns the Item’s language (if defined)' do
76
+ @about.lang.should == nil
77
+ @bi_en.lang.should == 'en'
78
+ @bi_pl.lang.should == 'pl'
79
+ end
80
+
81
+ end
82
+
83
+ context '#path' do
84
+
85
+ it 'returns the given Item’s path' do
86
+ @about.path.should == 'about'
87
+ @battle.path.should == '600'
88
+ @bi_en.path.should == 'bilingual'
89
+ @bi_pl.path.should == 'bilingual'
90
+ end
91
+
92
+ end
93
+
94
+ context '#published?' do
95
+
96
+ it 'returns whether the given Item has a date in the past' do
97
+ @about.should_not be_published
98
+ @battle.should be_published
99
+ @unix.should_not be_published
100
+ @welcome.should be_published
101
+ end
102
+
103
+ end
104
+
105
+ context '#title' do
106
+
107
+ it 'returns the given Item’s YAML-specified title' do
108
+ @about.title.should == 'about tributary'
109
+ @welcome.title.should == 'welcome to tributary'
110
+ end
111
+
112
+ it 'returns elided body if the YAML-specified title is missing' do
113
+ Item.new('spec/site/beeps/beep.md').title.should == 'beep…'
114
+ Item.new('spec/site/beeps/link.md').title.should == 'Qué…'
115
+ Item.new('spec/site/beeps/quote.md').title.should == 'An…'
116
+ end
117
+
118
+ end
119
+
120
+ context '#type' do
121
+
122
+ it 'returns the given Item’s type' do
123
+ @about.type.should == :pages
124
+ @welcome.type.should == :articles
125
+ end
126
+
127
+ end
128
+
129
+ end end
@@ -0,0 +1,12 @@
1
+ module Tributary describe Plugins::Dummy do
2
+
3
+ context '#handle' do
4
+
5
+ it 'returns an unmodified Item' do
6
+ item = mock Item
7
+ Plugins::Dummy.new.handle(item).should equal item
8
+ end
9
+
10
+ end
11
+
12
+ end end
@@ -0,0 +1,16 @@
1
+ # encoding: UTF-8
2
+
3
+ module Tributary describe Plugins::Mnml do
4
+
5
+ context '#handle' do
6
+
7
+ it 'minimalises the given Item’s title and body' do
8
+ item = mock Item, body: 'a wonderful body', title: 'an interesting title'
9
+ mnml = Plugins::Mnml.new.handle item
10
+ mnml.body.should == ' wndrfl bd'
11
+ mnml.title.should == 'n ntrstng ttl'
12
+ end
13
+
14
+ end
15
+
16
+ end end
@@ -0,0 +1,36 @@
1
+ # encoding: UTF-8
2
+
3
+ module Tributary describe Plugins::UnbreakMyArt do
4
+
5
+ def unbreak string
6
+ Plugins::UnbreakMyArt.new.handle(mock Item, body: string).body
7
+ end
8
+
9
+ describe '#handle' do
10
+
11
+ it 'prevents line wrapping after single-letter words' do
12
+ unbreak('give me a break').should == 'give me a break'
13
+ end
14
+
15
+ it 'prevents line wrapping after line-starting single-letter words' do
16
+ unbreak('a fish!').should == 'a fish!'
17
+ unbreak("this is\na fish!").should == "this is\na fish!"
18
+ end
19
+
20
+ it 'does not alter one-letter HTML tags' do
21
+ unbreak("<a href='http://en.wikipedia.org/wiki/Invisible_Pink_Unicorn'>I want to believe</a>").should == "<a href='http://en.wikipedia.org/wiki/Invisible_Pink_Unicorn'>I want to believe</a>"
22
+ end
23
+
24
+ it 'allows for optional trailing punctuation' do
25
+ unbreak('I, Clau-Clau-Claudius').should == 'I, Clau-Clau-Claudius'
26
+ end
27
+
28
+ it 'unbreaks bodies and titles' do
29
+ unbroken = Plugins::UnbreakMyArt.new.handle mock Item, title: 'about a ninja', body: 'and a pirate'
30
+ unbroken.title.should == 'about a ninja'
31
+ unbroken.body.should == 'and a pirate'
32
+ end
33
+
34
+ end
35
+
36
+ end end
@@ -0,0 +1,155 @@
1
+ # encoding: UTF-8
2
+
3
+ module Tributary describe Stream do
4
+
5
+ before :all do
6
+ @about = Item.new 'spec/site/pages/about.md'
7
+ @battle = Item.new 'spec/site/articles/600.md'
8
+ @btl_en = Item.new 'spec/site/articles/600.en.md'
9
+ @bi_en = Item.new 'spec/site/articles/bilingual.en.md'
10
+ @bi_pl = Item.new 'spec/site/articles/bilingual.pl.md'
11
+ @dated = Item.new 'spec/site/beeps/dated.md'
12
+ @english = Item.new 'spec/site/beeps/english.en.md'
13
+ @polish = Item.new 'spec/site/beeps/polish.pl.md'
14
+ @unix = Item.new 'spec/site/articles/unix-millennium-bug.en.md'
15
+ @welcome = Item.new 'spec/site/articles/welcome.md'
16
+ end
17
+
18
+ before :each do
19
+ App.configure { |config| config.set :root, 'spec/site' }
20
+ @stream = Stream.new
21
+ end
22
+
23
+ context '#initialize' do
24
+
25
+ it 'filters the Items through the provided Plugins' do
26
+ App.plugins = [Plugins::Mnml.new]
27
+ plugged = Stream.new
28
+ @stream.recent.map(&:title).should == ['ten…', 'this…', '600th anniversary (intl.)', 'bilinguality', 'a…', 'welcome to tributary']
29
+ plugged.recent.map(&:title).should == ['tn…', 'ths…', '600th nnvrsr (ntl.)', 'blnglt', '…', 'wlcm t trbtr']
30
+ end
31
+
32
+ end
33
+
34
+ context '#langs' do
35
+
36
+ it 'returns an Array of langs used in the Items' do
37
+ @stream.langs.should == ['en', 'pl']
38
+ end
39
+
40
+ end
41
+
42
+ context '#pick_item' do
43
+
44
+ it 'returns the relevant Item based on the provided path' do
45
+ @stream.pick_item('about').should == @about
46
+ @stream.pick_item('welcome').should == @welcome
47
+ @stream.pick_item('bilingual.en').should == @bi_en
48
+ @stream.pick_item('bilingual.pl').should == @bi_pl
49
+ end
50
+
51
+ it 'returns the first language version of an Item (if no Items match App.locale)' do
52
+ @stream.pick_item('bilingual').should == @bi_en
53
+ end
54
+
55
+ it 'returns an Item even if it’s outside of current App.lang_limit' do
56
+ App.lang_limit = ['pl']
57
+ @stream.pick_item('unix-millennium-bug').should == @unix
58
+ end
59
+
60
+ it 'returns the relevant language version of an Item' do
61
+ App.set :locale, 'en'
62
+ @stream.pick_item('bilingual').should == @bi_en
63
+ @stream.pick_item('about').should == @about
64
+ App.set :locale, 'pl'
65
+ @stream.pick_item('bilingual').should == @bi_pl
66
+ @stream.pick_item('about').should == @about
67
+ App.set :locale, nil
68
+ end
69
+
70
+ end
71
+
72
+ context '#previous' do
73
+
74
+ it 'returns an Item previous to the given Item' do
75
+ @stream.previous(@battle).should == @bi_en
76
+ @stream.previous(@welcome).should == nil
77
+ @stream.previous(@about).should == nil
78
+ end
79
+
80
+ it 'returns an Item previous to the Item with the same path (if the given Item’s lang != App.locale)' do
81
+ @stream.previous(@bi_en).should == @dated
82
+ @stream.previous(@bi_pl).should == @dated
83
+ end
84
+
85
+ it 'returns an Item previous to the given Item with the given type' do
86
+ @stream.previous(@bi_en).should == @dated
87
+ @stream.previous(@bi_en, type: :articles).should == @welcome
88
+ end
89
+
90
+ end
91
+
92
+ context '#recent' do
93
+
94
+ it 'returns published Items, newest-first' do
95
+ @stream.recent.should == [@polish, @english, @battle, @bi_en, @dated, @welcome]
96
+ end
97
+
98
+ it 'returns properly localised Items (if available)' do
99
+ App.locale = 'pl'
100
+ @stream.recent.should == [@polish, @english, @battle, @bi_pl, @dated, @welcome]
101
+ App.locale = 'en'
102
+ @stream.recent.should == [@polish, @english, @btl_en, @bi_en, @dated, @welcome]
103
+ App.locale = nil
104
+ @stream.recent.should == [@polish, @english, @battle, @bi_en, @dated, @welcome]
105
+ end
106
+
107
+ it 'returns lang_limited Items (if requested)' do
108
+ App.lang_limit = ['en']
109
+ @stream.recent.should == [@english, @battle, @bi_en, @dated, @welcome]
110
+ App.lang_limit = ['pl']
111
+ @stream.recent.should == [@polish, @battle, @bi_pl, @dated, @welcome]
112
+ App.lang_limit = []
113
+ @stream.recent.should == [@polish, @english, @battle, @bi_en, @dated, @welcome]
114
+ end
115
+
116
+ it 'returns a limited number of newest Items' do
117
+ @stream.recent(1).should == [@polish]
118
+ end
119
+
120
+ it 'returns a list of Items with a given type' do
121
+ @stream.recent(nil, type: :articles).should == [@battle, @bi_en, @welcome]
122
+ @stream.recent(2, type: :articles).should == [@battle, @bi_en]
123
+ end
124
+
125
+ end
126
+
127
+ context '#subsequent' do
128
+
129
+ it 'returns an Item subsequent to the given Item' do
130
+ @stream.subsequent(@welcome).should == @dated
131
+ @stream.subsequent(@polish).should == nil
132
+ @stream.subsequent(@about).should == nil
133
+ end
134
+
135
+ it 'returns an Item subsequent to the Item with the same path (if the given Item’s lang != App.locale)' do
136
+ @stream.subsequent(@bi_en).should == @battle
137
+ @stream.subsequent(@bi_pl).should == @battle
138
+ end
139
+
140
+ it 'returns an Item subsequent to the given Item with the given type' do
141
+ @stream.subsequent(@welcome).should == @dated
142
+ @stream.subsequent(@welcome, type: :articles).should == @bi_en
143
+ end
144
+
145
+ end
146
+
147
+ context '#types' do
148
+
149
+ it 'returns an Array of the Items’ types' do
150
+ @stream.types.should == [:articles, :beeps, :pages]
151
+ end
152
+
153
+ end
154
+
155
+ end end
data/tributary.gemspec ADDED
@@ -0,0 +1,18 @@
1
+ Gem::Specification.new do |gem|
2
+ gem.name = 'tributary'
3
+ gem.version = '0.0.1'
4
+ gem.summary = 'tributary: a tiny, toto-inspired blogging engine'
5
+ gem.homepage = 'http://github.com/chastell/tributary'
6
+ gem.author = 'Piotr Szotkowski'
7
+ gem.email = 'chastell@chastell.net'
8
+
9
+ gem.files = `git ls-files -z`.split "\0"
10
+ gem.test_files = Dir['spec/**/*.rb']
11
+
12
+ gem.add_dependency 'haml'
13
+ gem.add_dependency 'kramdown'
14
+ gem.add_dependency 'sinatra', '>= 1.1'
15
+ gem.add_dependency 'sinatra-r18n'
16
+ gem.add_development_dependency 'rack-test'
17
+ gem.add_development_dependency 'rspec', '>= 2'
18
+ end
metadata ADDED
@@ -0,0 +1,204 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tributary
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Piotr Szotkowski
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-10-31 01:00:00 +02:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: haml
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :runtime
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: kramdown
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :runtime
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: sinatra
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ segments:
55
+ - 1
56
+ - 1
57
+ version: "1.1"
58
+ type: :runtime
59
+ version_requirements: *id003
60
+ - !ruby/object:Gem::Dependency
61
+ name: sinatra-r18n
62
+ prerelease: false
63
+ requirement: &id004 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ segments:
69
+ - 0
70
+ version: "0"
71
+ type: :runtime
72
+ version_requirements: *id004
73
+ - !ruby/object:Gem::Dependency
74
+ name: rack-test
75
+ prerelease: false
76
+ requirement: &id005 !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ segments:
82
+ - 0
83
+ version: "0"
84
+ type: :development
85
+ version_requirements: *id005
86
+ - !ruby/object:Gem::Dependency
87
+ name: rspec
88
+ prerelease: false
89
+ requirement: &id006 !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ segments:
95
+ - 2
96
+ version: "2"
97
+ type: :development
98
+ version_requirements: *id006
99
+ description:
100
+ email: chastell@chastell.net
101
+ executables: []
102
+
103
+ extensions: []
104
+
105
+ extra_rdoc_files: []
106
+
107
+ files:
108
+ - .gitignore
109
+ - .rspec
110
+ - LICENCE
111
+ - README.md
112
+ - Rakefile
113
+ - config.ru
114
+ - lib/tributary.rb
115
+ - lib/tributary/app.rb
116
+ - lib/tributary/item.rb
117
+ - lib/tributary/plugins/dummy.rb
118
+ - lib/tributary/plugins/mnml.rb
119
+ - lib/tributary/plugins/unbreak_my_art.rb
120
+ - lib/tributary/stream.rb
121
+ - spec/fixtures/index.en.en+pl.xml
122
+ - spec/fixtures/index.en.en.xml
123
+ - spec/fixtures/index.en.xml
124
+ - spec/fixtures/index.pl.pl.xml
125
+ - spec/fixtures/index.pl.xml
126
+ - spec/fixtures/index.xml
127
+ - spec/fixtures/layout.css
128
+ - spec/fixtures/pages.css
129
+ - spec/site/articles/600.en.md
130
+ - spec/site/articles/600.md
131
+ - spec/site/articles/bilingual.en.md
132
+ - spec/site/articles/bilingual.pl.md
133
+ - spec/site/articles/unix-millennium-bug.en.md
134
+ - spec/site/articles/welcome.md
135
+ - spec/site/beeps/beep.md
136
+ - spec/site/beeps/dated.md
137
+ - spec/site/beeps/english.en.md
138
+ - spec/site/beeps/link.md
139
+ - spec/site/beeps/polish.pl.md
140
+ - spec/site/beeps/quote.md
141
+ - spec/site/i18n/en.yml
142
+ - spec/site/i18n/pl.yml
143
+ - spec/site/pages/about.md
144
+ - spec/site/views/articles.haml
145
+ - spec/site/views/articles.index.haml
146
+ - spec/site/views/articles.index.sass
147
+ - spec/site/views/articles.sass
148
+ - spec/site/views/beeps.haml
149
+ - spec/site/views/beeps.sass
150
+ - spec/site/views/error.haml
151
+ - spec/site/views/error.sass
152
+ - spec/site/views/index.haml
153
+ - spec/site/views/index.sass
154
+ - spec/site/views/index.xml.haml
155
+ - spec/site/views/layout.haml
156
+ - spec/site/views/layout.sass
157
+ - spec/site/views/pages.haml
158
+ - spec/site/views/pages.sass
159
+ - spec/tributary/app_spec.rb
160
+ - spec/tributary/item_spec.rb
161
+ - spec/tributary/plugins/dummy_spec.rb
162
+ - spec/tributary/plugins/mnml_spec.rb
163
+ - spec/tributary/plugins/unbreak_my_art_spec.rb
164
+ - spec/tributary/stream_spec.rb
165
+ - tributary.gemspec
166
+ has_rdoc: true
167
+ homepage: http://github.com/chastell/tributary
168
+ licenses: []
169
+
170
+ post_install_message:
171
+ rdoc_options: []
172
+
173
+ require_paths:
174
+ - lib
175
+ required_ruby_version: !ruby/object:Gem::Requirement
176
+ none: false
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ segments:
181
+ - 0
182
+ version: "0"
183
+ required_rubygems_version: !ruby/object:Gem::Requirement
184
+ none: false
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ segments:
189
+ - 0
190
+ version: "0"
191
+ requirements: []
192
+
193
+ rubyforge_project:
194
+ rubygems_version: 1.3.7
195
+ signing_key:
196
+ specification_version: 3
197
+ summary: "tributary: a tiny, toto-inspired blogging engine"
198
+ test_files:
199
+ - spec/tributary/app_spec.rb
200
+ - spec/tributary/stream_spec.rb
201
+ - spec/tributary/item_spec.rb
202
+ - spec/tributary/plugins/dummy_spec.rb
203
+ - spec/tributary/plugins/unbreak_my_art_spec.rb
204
+ - spec/tributary/plugins/mnml_spec.rb