georgi-shinmun 0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/.gitignore +3 -0
  2. data/LICENSE +18 -0
  3. data/README.md +361 -0
  4. data/Rakefile +17 -0
  5. data/bin/shinmun +12 -0
  6. data/example/Rakefile +41 -0
  7. data/example/assets/images/favicon.ico +0 -0
  8. data/example/assets/images/loading.gif +0 -0
  9. data/example/assets/javascripts/coderay.js +13 -0
  10. data/example/assets/javascripts/comments.js +45 -0
  11. data/example/assets/javascripts/jquery-form.min.js +5 -0
  12. data/example/assets/javascripts/jquery.min.js +32 -0
  13. data/example/assets/stylesheets/article.css +15 -0
  14. data/example/assets/stylesheets/coderay.css +100 -0
  15. data/example/assets/stylesheets/comments.css +20 -0
  16. data/example/assets/stylesheets/form.css +12 -0
  17. data/example/assets/stylesheets/list.css +13 -0
  18. data/example/assets/stylesheets/print.css +76 -0
  19. data/example/assets/stylesheets/reset.css +23 -0
  20. data/example/assets/stylesheets/style.css +83 -0
  21. data/example/assets/stylesheets/table.css +24 -0
  22. data/example/assets/stylesheets/typo.css +40 -0
  23. data/example/assets/wmd/images/bg-fill.png +0 -0
  24. data/example/assets/wmd/images/bg.png +0 -0
  25. data/example/assets/wmd/images/blockquote.png +0 -0
  26. data/example/assets/wmd/images/bold.png +0 -0
  27. data/example/assets/wmd/images/code.png +0 -0
  28. data/example/assets/wmd/images/h1.png +0 -0
  29. data/example/assets/wmd/images/hr.png +0 -0
  30. data/example/assets/wmd/images/img.png +0 -0
  31. data/example/assets/wmd/images/italic.png +0 -0
  32. data/example/assets/wmd/images/link.png +0 -0
  33. data/example/assets/wmd/images/ol.png +0 -0
  34. data/example/assets/wmd/images/redo.png +0 -0
  35. data/example/assets/wmd/images/separator.png +0 -0
  36. data/example/assets/wmd/images/ul.png +0 -0
  37. data/example/assets/wmd/images/undo.png +0 -0
  38. data/example/assets/wmd/images/wmd-on.png +0 -0
  39. data/example/assets/wmd/images/wmd.png +0 -0
  40. data/example/assets/wmd/showdown.js +421 -0
  41. data/example/assets/wmd/wmd-base.js +1799 -0
  42. data/example/assets/wmd/wmd-plus.js +311 -0
  43. data/example/assets/wmd/wmd.js +73 -0
  44. data/example/config.ru +8 -0
  45. data/example/config/aggregations.yml +1 -0
  46. data/example/config/assets.yml +13 -0
  47. data/example/config/blog.yml +10 -0
  48. data/example/map.rb +100 -0
  49. data/example/pages/about.md +6 -0
  50. data/example/password +1 -0
  51. data/example/templates/_comment_form.rhtml +90 -0
  52. data/example/templates/_comments.rhtml +11 -0
  53. data/example/templates/_pagination.rhtml +10 -0
  54. data/example/templates/admin/commit.rhtml +27 -0
  55. data/example/templates/admin/commits.rhtml +9 -0
  56. data/example/templates/admin/edit.rhtml +17 -0
  57. data/example/templates/admin/pages.rhtml +19 -0
  58. data/example/templates/admin/posts.rhtml +24 -0
  59. data/example/templates/category.rhtml +12 -0
  60. data/example/templates/category.rxml +20 -0
  61. data/example/templates/index.rhtml +12 -0
  62. data/example/templates/index.rxml +21 -0
  63. data/example/templates/layout.rhtml +82 -0
  64. data/example/templates/page.rhtml +7 -0
  65. data/example/templates/post.rhtml +48 -0
  66. data/lib/shinmun.rb +21 -0
  67. data/lib/shinmun/aggregations/delicious.rb +57 -0
  68. data/lib/shinmun/aggregations/flickr.rb +81 -0
  69. data/lib/shinmun/blog.rb +165 -0
  70. data/lib/shinmun/bluecloth_coderay.rb +21 -0
  71. data/lib/shinmun/comment.rb +17 -0
  72. data/lib/shinmun/helpers.rb +64 -0
  73. data/lib/shinmun/post.rb +161 -0
  74. data/lib/shinmun/post_handler.rb +17 -0
  75. data/templates/_comments.rhtml +11 -0
  76. data/templates/archive.rhtml +6 -0
  77. data/templates/category.rhtml +6 -0
  78. data/templates/category.rxml +20 -0
  79. data/templates/index.rhtml +4 -0
  80. data/templates/index.rxml +21 -0
  81. data/templates/layout.rhtml +9 -0
  82. data/templates/page.rhtml +2 -0
  83. data/templates/post.rhtml +3 -0
  84. data/test/blog_spec.rb +177 -0
  85. data/test/map.rb +51 -0
  86. metadata +172 -0
@@ -0,0 +1,17 @@
1
+ module Shinmun
2
+
3
+ class PostHandler
4
+ def read(id, name, data)
5
+ Post.new(:filename => name, :src => data)
6
+ end
7
+
8
+ def write(post)
9
+ post.dump
10
+ end
11
+ end
12
+
13
+ end
14
+
15
+ GitStore::Handler['md'] = Shinmun::PostHandler.new
16
+
17
+
@@ -0,0 +1,11 @@
1
+ <% for comment in @comments %>
2
+ <div class="comment">
3
+ <div class="top">
4
+ <%= comment.website.empty? ? comment.name : link_to(comment.name, comment.website) %> said
5
+ <%= distance_of_time_in_words(comment.time, Time.now, true) %> ago:
6
+ </div>
7
+ <div class="body">
8
+ <%= markdown(comment.text, :filter_html, :filter_styles) %>
9
+ </div>
10
+ </div>
11
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <h1><%= "#{Date::MONTHNAMES[@month]} #{@year}" %></h1>
2
+
3
+ <% for post in @blog.posts_for_month(@year, @month) %>
4
+ <h2><%= post_link post %></h2>
5
+ <%= post.summary %>
6
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <h1><%= @name %></h1>
2
+
3
+ <% for post in @posts[0, 20] %>
4
+ <h2><%= post_link post %></h2>
5
+ <%= post.summary %>
6
+ <% end %>
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <rss version="2.0">
3
+ <channel>
4
+ <title><%= @name %></title>
5
+ <link><%= @blog.url %>/categories/<%= urlify @name %>.html</link>
6
+ <language><%= @blog.language %></language>
7
+ <copyright><%= @blog.author %></copyright>
8
+ <pubDate><%= rfc822 Time.now %></pubDate>
9
+ <% for post in @posts[0, 20] %>
10
+ <item>
11
+ <title><%= post.title %></title>
12
+ <category><%= post.category %></category>
13
+ <description><%= strip_tags post.summary %></description>
14
+ <author><%= @author || @blog.author %></author>
15
+ <link><%= @blog.url %>/<%= post.path %></link>
16
+ <pubDate><%= rfc822 post.date %></pubDate>
17
+ </item>
18
+ <% end %>
19
+ </channel>
20
+ </rss>
@@ -0,0 +1,4 @@
1
+ <% for post in @blog.recent_posts %>
2
+ <h2><%= post_link post %></h2>
3
+ <%= post.summary %>
4
+ <% end %>
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <rss version="2.0">
3
+ <channel>
4
+ <title><%= @blog.title %></title>
5
+ <link><%= @blog.url %></link>
6
+ <description><%= @blog.description %></description>
7
+ <language><%= @blog.language %></language>
8
+ <copyright><%= @blog.author %></copyright>
9
+ <pubDate><%= rfc822 Time.now %></pubDate>
10
+ <% for post in @blog.recent_posts %>
11
+ <item>
12
+ <title><%= post.title %></title>
13
+ <category><%= post.category %></category>
14
+ <description><%= strip_tags post.summary %></description>
15
+ <author><%= @author || @blog.author %></author>
16
+ <link><%= @blog.url %>/<%= post.path %>.html</link>
17
+ <pubDate><%= rfc822 post.date %></pubDate>
18
+ </item>
19
+ <% end %>
20
+ </channel>
21
+ </rss>
@@ -0,0 +1,9 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <title><%= @blog.title %></title>
5
+ </head>
6
+ <body>
7
+ <%= @content %>
8
+ </body>
9
+ </html>
@@ -0,0 +1,2 @@
1
+ <h1><%= @post.title %></h1>
2
+ <%= @post.body_html %>
@@ -0,0 +1,3 @@
1
+ <h1><%= @post.title %></h1>
2
+ <%= human_date @post.date %>
3
+ <%= @post.body_html %>
data/test/blog_spec.rb ADDED
@@ -0,0 +1,177 @@
1
+ require 'shinmun'
2
+ require 'rack/mock'
3
+ require 'rexml/xpath'
4
+ require 'pp'
5
+
6
+ describe Shinmun::Blog do
7
+
8
+ TEST_DIR = File.expand_path(File.dirname(__FILE__))
9
+ TEMPLATES_DIR = File.expand_path(TEST_DIR + '/../templates')
10
+ REPO = TEST_DIR + '/test_repo'
11
+
12
+ before do
13
+ FileUtils.rm_rf REPO
14
+ Dir.mkdir REPO
15
+ Dir.chdir REPO
16
+
17
+ `git init`
18
+
19
+ file 'config/blog.yml', {
20
+ 'title' => 'Title',
21
+ 'description' => 'Description',
22
+ 'language' => 'en',
23
+ 'author' => 'The Author',
24
+ 'url' => 'http://www.my-blog-url.com',
25
+ 'categories' => ['Ruby', 'Javascript']
26
+ }.to_yaml
27
+
28
+ @blog = Shinmun::Blog.new
29
+ @request = Rack::MockRequest.new(@blog)
30
+
31
+ file 'map.rb', File.read(TEST_DIR + '/map.rb')
32
+
33
+ Dir.mkdir 'templates'
34
+ Dir[TEMPLATES_DIR + '/*'].each do |path|
35
+ unless path.include?('~')
36
+ file 'templates/' + File.basename(path), File.read(path)
37
+ end
38
+ end
39
+ @blog.store.load
40
+
41
+ @posts = [@blog.create_post(:title => 'New post', :date => '2008-10-10', :category => 'Ruby', :body => 'Body1'),
42
+ @blog.create_post(:title => 'And this', :date => '2008-10-11', :category => 'Ruby', :body => 'Body2'),
43
+ @blog.create_post(:title => 'Again', :date => '2008-11-10', :category => 'Javascript', :body => 'Body3')]
44
+
45
+ @pages = [@blog.create_post(:title => 'Page 1', :body => 'Body1'),
46
+ @blog.create_post(:title => 'Page 2', :body => 'Body2')]
47
+
48
+ @blog.store.load
49
+ end
50
+
51
+ def get(*args)
52
+ @request.get(*args)
53
+ end
54
+
55
+ def post(*args)
56
+ @request.post(*args)
57
+ end
58
+
59
+ def file(file, data)
60
+ FileUtils.mkpath(File.dirname(file))
61
+ open(file, 'w') { |io| io << data }
62
+ `git add #{file}`
63
+ `git commit -m 'spec'`
64
+ File.unlink(file)
65
+ end
66
+
67
+ def xpath(xml, path)
68
+ REXML::XPath.match(REXML::Document.new(xml), path)
69
+ end
70
+
71
+ it "should find posts for a category" do
72
+ category = @blog.find_category('ruby')
73
+ category[:name].should == 'Ruby'
74
+ category[:posts].should include(@posts[0])
75
+ category[:posts].should include(@posts[1])
76
+
77
+ category = @blog.find_category('javascript')
78
+ category[:name].should == 'Javascript'
79
+ category[:posts].should include(@posts[2])
80
+ end
81
+
82
+ it "should create a post" do
83
+ @blog.create_post(:title => 'New post', :date => '2008-10-10')
84
+ @blog.store.load
85
+
86
+ post = @blog.find_post(2008, 10, 'new-post')
87
+ post.should_not be_nil
88
+ post.title.should == 'New post'
89
+ post.date.should == Date.new(2008, 10, 10)
90
+ post.name.should == 'new-post'
91
+ end
92
+
93
+ it "should update a post" do
94
+ post = @blog.create_post(:title => 'New post', :date => '2008-10-10')
95
+ @blog.update_post(post, "---\ndate: 2008-11-11\n\nThe title\n=========\n")
96
+ @blog.store.load
97
+
98
+ post = @blog.find_post(2008, 11, 'new-post')
99
+ post.should_not be_nil
100
+ post.title.should == 'The title'
101
+ post.date.should == Date.new(2008, 11, 11)
102
+ post.name.should == 'new-post'
103
+ end
104
+
105
+ it "should delete a post" do
106
+ post = @blog.create_post(:title => 'New post', :date => '2008-10-10')
107
+ @blog.delete_post(post)
108
+ @blog.store.load
109
+
110
+ @blog.find_post(2008, 10, 'new-post').should be_nil
111
+ end
112
+
113
+ it "should render posts" do
114
+ xml = get('/2008/10/new-post').body
115
+
116
+ xpath(xml, "//h1")[0].text.should == 'New post'
117
+ xpath(xml, "//p")[0].text.should == 'Body1'
118
+ end
119
+
120
+ def assert_listing(xml, list)
121
+ titles = xpath(xml, "//h2/a")
122
+ summaries = xpath(xml, "//p")
123
+
124
+ list.each_with_index do |(title, summary), i|
125
+ titles[i].text.should == title
126
+ summaries[i].text.strip.should == summary
127
+ end
128
+ end
129
+
130
+ it "should render categories" do
131
+ get('/categories/ruby.rss')['Content-Type'].should == 'application/rss+xml'
132
+
133
+ xml = get('/categories/ruby.rss').body
134
+
135
+ xpath(xml, '/rss/channel/title')[0].text.should == 'Ruby'
136
+ xpath(xml, '/rss/channel/item/title')[0].text.should == 'And this'
137
+ xpath(xml, '/rss/channel/item/pubDate')[0].text.should == "Sat, 11 Oct 2008 00:00:00 +0000"
138
+ xpath(xml, '/rss/channel/item/link')[0].text.should == "http://www.my-blog-url.com/2008/10/and-this"
139
+ xpath(xml, '/rss/channel/item/title')[1].text.should == 'New post'
140
+ xpath(xml, '/rss/channel/item/pubDate')[1].text.should == "Fri, 10 Oct 2008 00:00:00 +0000"
141
+ xpath(xml, '/rss/channel/item/link')[1].text.should == "http://www.my-blog-url.com/2008/10/new-post"
142
+
143
+ assert_listing(get('/categories/ruby').body, [['And this', 'Body2'], ['New post', 'Body1']])
144
+ end
145
+
146
+ it "should render index and archives" do
147
+ assert_listing(get('/2008/10').body, [['New post', 'Body1'], ['And this', 'Body2']])
148
+ assert_listing(get('/').body, [['Again', 'Body3'], ['And this', 'Body2'], ['New post', 'Body1']])
149
+ end
150
+
151
+ it "should render pages" do
152
+ xml = get('/page-1').body
153
+ xpath(xml, "//h1")[0].text.should == 'Page 1'
154
+ xpath(xml, "//p")[0].text.should == 'Body1'
155
+
156
+ xml = get('/page-2').body
157
+ xpath(xml, "//h1")[0].text.should == 'Page 2'
158
+ xpath(xml, "//p")[0].text.should == 'Body2'
159
+ end
160
+
161
+ it "should post a comment" do
162
+ post('/comments?' + Rack::Utils.build_query('path' => @posts[0].path, 'name' => 'Hans', 'website' => '', 'text' => 'Hello'))
163
+ post('/comments?' + Rack::Utils.build_query('path' => @posts[0].path, 'name' => 'Peter', 'website' => '', 'text' => 'Servus'))
164
+ @blog.store.load
165
+
166
+ comments = @blog.comments_for(@posts[0])
167
+
168
+ comments[0].should_not be_nil
169
+ comments[0].name.should == 'Hans'
170
+ comments[0].text.should == 'Hello'
171
+
172
+ comments[1].should_not be_nil
173
+ comments[1].name.should == 'Peter'
174
+ comments[1].text.should == 'Servus'
175
+ end
176
+
177
+ end
data/test/map.rb ADDED
@@ -0,0 +1,51 @@
1
+ Kontrol.map do
2
+ get '/categories/(.*)\.rss' do |category|
3
+ render 'category.rxml', find_category(category)
4
+ end
5
+
6
+ get '/categories/(.*)' do |category|
7
+ render 'category.rhtml', find_category(category)
8
+ end
9
+
10
+ get '/(\d+)/(\d+)/(.*)' do |year, month, name|
11
+ post = find_post(year.to_i, month.to_i, name)
12
+ render 'post.rhtml', :post => post, :comments => comments_for(post)
13
+ end
14
+
15
+ get '/(\d+)/(\d+)' do |year, month|
16
+ render 'archive.rhtml', :year => year.to_i, :month => month.to_i
17
+ end
18
+
19
+ get '/index\.rss' do
20
+ render 'index.rxml'
21
+ end
22
+
23
+ post '/comments' do
24
+ post = find_by_path(params['path'])
25
+ post_comment(post, params)
26
+ render '_comments.rhtml', :comments => comments_for(post)
27
+ end
28
+
29
+ get '/assets/javascripts\.js' do
30
+ render_javascripts
31
+ end
32
+
33
+ get '/assets/stylesheets\.css' do
34
+ render_stylesheets
35
+ end
36
+
37
+ get '/assets/(.*)' do |path|
38
+ if_modified_since do
39
+ assets[path] or raise "#{path} not found"
40
+ end
41
+ end
42
+
43
+ get '/$' do
44
+ render 'index.rhtml'
45
+ end
46
+
47
+ get '/(.*)' do |name|
48
+ post = find_page(name)
49
+ render 'page.rhtml', :post => post if post
50
+ end
51
+ end
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: georgi-shinmun
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.3"
5
+ platform: ruby
6
+ authors:
7
+ - Matthias Georgi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-12-17 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: BlueCloth
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
23
+ version:
24
+ - !ruby/object:Gem::Dependency
25
+ name: rubypants
26
+ version_requirement:
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: "0"
32
+ version:
33
+ - !ruby/object:Gem::Dependency
34
+ name: rack
35
+ version_requirement:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: "0"
41
+ version:
42
+ - !ruby/object:Gem::Dependency
43
+ name: coderay
44
+ version_requirement:
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: "0"
50
+ version:
51
+ description: git-based blog engine.
52
+ email: matti.georgi@gmail.com
53
+ executables:
54
+ - shinmun
55
+ extensions: []
56
+
57
+ extra_rdoc_files:
58
+ - README.md
59
+ files:
60
+ - .gitignore
61
+ - LICENSE
62
+ - README.md
63
+ - Rakefile
64
+ - bin/shinmun
65
+ - example/Rakefile
66
+ - example/assets/images/favicon.ico
67
+ - example/assets/images/loading.gif
68
+ - example/assets/javascripts/coderay.js
69
+ - example/assets/javascripts/comments.js
70
+ - example/assets/javascripts/jquery-form.min.js
71
+ - example/assets/javascripts/jquery.min.js
72
+ - example/assets/stylesheets/article.css
73
+ - example/assets/stylesheets/coderay.css
74
+ - example/assets/stylesheets/comments.css
75
+ - example/assets/stylesheets/form.css
76
+ - example/assets/stylesheets/list.css
77
+ - example/assets/stylesheets/print.css
78
+ - example/assets/stylesheets/reset.css
79
+ - example/assets/stylesheets/style.css
80
+ - example/assets/stylesheets/table.css
81
+ - example/assets/stylesheets/typo.css
82
+ - example/assets/wmd/images/bg-fill.png
83
+ - example/assets/wmd/images/bg.png
84
+ - example/assets/wmd/images/blockquote.png
85
+ - example/assets/wmd/images/bold.png
86
+ - example/assets/wmd/images/code.png
87
+ - example/assets/wmd/images/h1.png
88
+ - example/assets/wmd/images/hr.png
89
+ - example/assets/wmd/images/img.png
90
+ - example/assets/wmd/images/italic.png
91
+ - example/assets/wmd/images/link.png
92
+ - example/assets/wmd/images/ol.png
93
+ - example/assets/wmd/images/redo.png
94
+ - example/assets/wmd/images/separator.png
95
+ - example/assets/wmd/images/ul.png
96
+ - example/assets/wmd/images/undo.png
97
+ - example/assets/wmd/images/wmd-on.png
98
+ - example/assets/wmd/images/wmd.png
99
+ - example/assets/wmd/showdown.js
100
+ - example/assets/wmd/wmd-base.js
101
+ - example/assets/wmd/wmd-plus.js
102
+ - example/assets/wmd/wmd.js
103
+ - example/config.ru
104
+ - example/config/aggregations.yml
105
+ - example/config/assets.yml
106
+ - example/config/blog.yml
107
+ - example/map.rb
108
+ - example/pages/about.md
109
+ - example/password
110
+ - example/templates/_comment_form.rhtml
111
+ - example/templates/_comments.rhtml
112
+ - example/templates/_pagination.rhtml
113
+ - example/templates/admin/commit.rhtml
114
+ - example/templates/admin/commits.rhtml
115
+ - example/templates/admin/edit.rhtml
116
+ - example/templates/admin/pages.rhtml
117
+ - example/templates/admin/posts.rhtml
118
+ - example/templates/category.rhtml
119
+ - example/templates/category.rxml
120
+ - example/templates/index.rhtml
121
+ - example/templates/index.rxml
122
+ - example/templates/layout.rhtml
123
+ - example/templates/page.rhtml
124
+ - example/templates/post.rhtml
125
+ - lib/shinmun.rb
126
+ - lib/shinmun/aggregations/delicious.rb
127
+ - lib/shinmun/aggregations/flickr.rb
128
+ - lib/shinmun/blog.rb
129
+ - lib/shinmun/bluecloth_coderay.rb
130
+ - lib/shinmun/comment.rb
131
+ - lib/shinmun/helpers.rb
132
+ - lib/shinmun/post.rb
133
+ - lib/shinmun/post_handler.rb
134
+ - templates/_comments.rhtml
135
+ - templates/archive.rhtml
136
+ - templates/category.rhtml
137
+ - templates/category.rxml
138
+ - templates/index.rhtml
139
+ - templates/index.rxml
140
+ - templates/layout.rhtml
141
+ - templates/page.rhtml
142
+ - templates/post.rhtml
143
+ - test/blog_spec.rb
144
+ - test/map.rb
145
+ has_rdoc: true
146
+ homepage: http://github.com/georgi/shinmun
147
+ post_install_message:
148
+ rdoc_options: []
149
+
150
+ require_paths:
151
+ - lib
152
+ required_ruby_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: "0"
157
+ version:
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: "0"
163
+ version:
164
+ requirements: []
165
+
166
+ rubyforge_project:
167
+ rubygems_version: 1.2.0
168
+ signing_key:
169
+ specification_version: 2
170
+ summary: git-based blog engine
171
+ test_files: []
172
+