georgi-shinmun 0.3

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.
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
+