serious 0.1.2 → 0.1.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.
- data/README.rdoc +203 -2
- data/Rakefile +7 -4
- data/VERSION +1 -1
- data/lib/serious.rb +19 -3
- data/lib/serious/article.rb +11 -1
- data/lib/site/public/css/serious.css +4 -0
- data/lib/site/views/_article.erb +7 -1
- data/lib/site/views/atom.builder +21 -0
- data/lib/site/views/index.erb +1 -1
- data/serious.gemspec +18 -14
- data/test/articles/2009-12-24-merry-christmas.txt +1 -0
- data/test/helper.rb +8 -0
- data/test/test_article.rb +9 -0
- data/test/test_serious.rb +25 -0
- metadata +17 -6
data/README.rdoc
CHANGED
@@ -1,6 +1,207 @@
|
|
1
|
-
=
|
1
|
+
= Serious
|
2
2
|
|
3
|
-
|
3
|
+
Serious is a blog engine inspired by other filesystem-based engines like jekyll (http://jekyllrb.com/)
|
4
|
+
and toto (http://cloudhead.io/toto), but is based upon Sinatra and rack and thus can be hosted
|
5
|
+
very easily (and for free) on heroku (http://heroku.com).
|
6
|
+
|
7
|
+
The articles are stored in plain text files with an opinionated naming scheme which is used for
|
8
|
+
getting the date and permalink of your article: <code>articles/2010-02-14-will-you-be-my-valentine.txt</code>
|
9
|
+
|
10
|
+
The actual content of the article is lazy-loaded only when accessed, so things don't get messy when a lot
|
11
|
+
of articles has to be maintained. Articles consist of a YAML front, an optional summary and the body,
|
12
|
+
so a basic article looks something like this:
|
13
|
+
|
14
|
+
title: My shiny article
|
15
|
+
author: Christoph Olszowka
|
16
|
+
|
17
|
+
Some nice summary.
|
18
|
+
~
|
19
|
+
## Some content. You can use markdown in your articles, and also <%= "erb" %>
|
20
|
+
<% highlight do %>
|
21
|
+
puts 'it will also syntax-highlight your codes'
|
22
|
+
<% end %>
|
23
|
+
|
24
|
+
There are quite a few assumptions made by this format: You have to specify your title in yaml format
|
25
|
+
upfront. You can also specify an author for this article. If you don't, it will fall-back to the
|
26
|
+
default one (see configuration). Then two newlines must follow to seperate the yaml from the actual
|
27
|
+
content. After this, you can type your blog post. If you want a summary, add in the summary/body
|
28
|
+
delimiter "~", so Serious knows what you want.
|
29
|
+
|
30
|
+
Serious makes use of StupidFormatter (http://github.com/colszowka/stupid_formatter) for formatting
|
31
|
+
your articles, so you get ERb, Markdown and Coderay syntax highlighting for free and can customize
|
32
|
+
the processing chain to your liking, add custom ERb helpers and so on. See the documentation of
|
33
|
+
stupid_formatter (http://rdoc.info/projects/colszowka/stupid_formatter) to learn how to
|
34
|
+
customize the formatting.
|
35
|
+
|
36
|
+
== Getting started
|
37
|
+
|
38
|
+
Install the gem:
|
39
|
+
|
40
|
+
sudo gem install serious
|
41
|
+
|
42
|
+
Since a basic template and css are provided inside the gem, all you've got to do is set up a directory
|
43
|
+
for your new blog, create an articles folder, a config.ru and (for heroku), a .gems file.
|
44
|
+
|
45
|
+
The directory structure would be something like:
|
46
|
+
|
47
|
+
serious_blog/
|
48
|
+
- articles
|
49
|
+
- articles/2010-02-14-will-you-be-my-valentine.txt
|
50
|
+
- config.ru
|
51
|
+
- .gems
|
52
|
+
|
53
|
+
The config.ru is pretty straight-forward if you want to stick to the defaults:
|
54
|
+
|
55
|
+
require 'serious'
|
56
|
+
Serious.set :title, "My Sweet Little Blog"
|
57
|
+
Serious.set :author, "Christoph Olszowka"
|
58
|
+
Serious.set :url, 'http://mysweetlittleblog.heroku.com'
|
59
|
+
run Serious
|
60
|
+
|
61
|
+
The .gems file if you want to host on heroku:
|
62
|
+
|
63
|
+
stupid_formatter --version '>= 0.2.0'
|
64
|
+
serious --version '>= 0.1.2'
|
65
|
+
|
66
|
+
Note that sinatra is not included in the gemfile since heroku has it installed by default, but serious
|
67
|
+
will install it as a gem dependency on other systems as well.
|
68
|
+
|
69
|
+
Assuming you've got the heroku gem installed and set up and you've set up git for your blog with
|
70
|
+
<code>git init</code>, you can now do:
|
71
|
+
|
72
|
+
heroku create mysweetlittleblog
|
73
|
+
git push heroku master
|
74
|
+
|
75
|
+
Point your browser to the url, and bang, you're ready!
|
76
|
+
|
77
|
+
You might also want to test your blog locally. Use thin (<code>sudo gem install thin</code>) with:
|
78
|
+
|
79
|
+
thin -R config.ru start
|
80
|
+
|
81
|
+
Go to <code>localhost:3000</code> and enjoy.
|
82
|
+
|
83
|
+
== Configuration
|
84
|
+
|
85
|
+
Inside your config.ru, you can customize the settings for your Serious site.
|
86
|
+
|
87
|
+
=== Custom view templates or public folder
|
88
|
+
|
89
|
+
==== Changing the path to the public folder
|
90
|
+
|
91
|
+
Say you want to stick with the default view templates, but are willing to customize the css
|
92
|
+
to make things prettier. You can do so. Get the provided css from <code>lib/serious/site/public</code>
|
93
|
+
and point Serious to your new public folder, which assumingly lies in the current working directory
|
94
|
+
(which is where your config.ru file is)
|
95
|
+
|
96
|
+
Serious.set :public, File.join(Dir.getwd, 'public')
|
97
|
+
|
98
|
+
Serious will now serve the public directory from your custom location, but still get the views
|
99
|
+
provided with the gem.
|
100
|
+
|
101
|
+
==== Changing the path to the views
|
102
|
+
|
103
|
+
Accordingly, if you want to stick with the default css, but want to customize the templates (would anyone
|
104
|
+
want to do this?), specify the views path and get the provided ones from the gem as a starting point.
|
105
|
+
|
106
|
+
Serious.set :views, File.join(Dir.getwd, 'views')
|
107
|
+
|
108
|
+
==== Setting the root
|
109
|
+
|
110
|
+
The most likely case though will surely be that you want to move both <code>public</code> and
|
111
|
+
<code>views</code> into your site. Again, just copy over the provided assets from the gems
|
112
|
+
<code>lib/serious/site/</code> folder into your own site and modify them to your liking.
|
113
|
+
You'll have to specify a new root for your site, set to the current working directory, where
|
114
|
+
your config.ru resides:
|
115
|
+
|
116
|
+
Serious.set :root, Dir.getwd
|
117
|
+
|
118
|
+
Note that you do not have to specify the views and public folders separately, they'll be hosted
|
119
|
+
from the roots views and public subdirectory.
|
120
|
+
|
121
|
+
=== Setting the articles path
|
122
|
+
|
123
|
+
You want your articles hosted from your home directory or fancy a different folder name?
|
124
|
+
Use the :article property, which defaults to the articles subdirectory of the current
|
125
|
+
working dir (a.k.a. where your config.ru sits)
|
126
|
+
|
127
|
+
Serious.set :articles, '/home/youruser/myblogposts'
|
128
|
+
|
129
|
+
=== The title
|
130
|
+
|
131
|
+
The title is used for your atom feed, the site name and so on. It defaults to 'Serious' and you
|
132
|
+
can specify it with:
|
133
|
+
|
134
|
+
Serious.set :title, "My Sweet Little Blog"
|
135
|
+
|
136
|
+
=== The author
|
137
|
+
|
138
|
+
If you don't want to specify the author for each article separately in the YAML front matter,
|
139
|
+
you can define the blog author, which will be used as a fall-back when no custom article author
|
140
|
+
is given in the YAML. It defaults to 'unknown'
|
141
|
+
|
142
|
+
Serious.set :author, "Christoph Olszowka"
|
143
|
+
|
144
|
+
=== The url
|
145
|
+
|
146
|
+
Well, your site has to know where it lives to provide proper links in your atom feed. Configure this
|
147
|
+
with the url setting, which defaults to 'http://localhost:3000'
|
148
|
+
|
149
|
+
Serious.set :url, 'http://localhost:3000'
|
150
|
+
|
151
|
+
=== Displayed items
|
152
|
+
|
153
|
+
You can specify how many items you want displayed across your site:
|
154
|
+
|
155
|
+
==== Amount of feed items
|
156
|
+
|
157
|
+
To customize the amount of items in your atom feed (living under /atom.xml), set the
|
158
|
+
items_in_feed property to an integer. This defaults to 25.
|
159
|
+
|
160
|
+
Serious.set :items_in_feed, 50
|
161
|
+
|
162
|
+
==== Amount of items with summary on index
|
163
|
+
|
164
|
+
On your index page, the most recent items will be displayed including the summary (or the whole
|
165
|
+
post if you did not use the summary/body delimiter). This defaults to 3 items, but can be customized:
|
166
|
+
|
167
|
+
Serious.set :items_on_index, 5
|
168
|
+
|
169
|
+
==== Amount of archive items on index
|
170
|
+
|
171
|
+
Below the items with summaries on your main page, there's also a list of 'archived' items, which
|
172
|
+
only includes the title and date. This defaults to 10 items, but can be customized as well:
|
173
|
+
|
174
|
+
Serious.set :archived_on_index, 10
|
175
|
+
|
176
|
+
=== Cache timeout
|
177
|
+
|
178
|
+
All pages served are automatically getting a Cache-Control header, so they get cached in your
|
179
|
+
visitor's browsers as well as in Varnish on Heroku (http://docs.heroku.com/http-caching)
|
180
|
+
(or some similar tool when you host yourself). The timeout is set to 300 seconds by default, but
|
181
|
+
can be customized with:
|
182
|
+
|
183
|
+
Serious.set :cache_timeout, 300
|
184
|
+
|
185
|
+
=== Article formatting
|
186
|
+
|
187
|
+
You can define the formatting chain for StupidFormatter with:
|
188
|
+
|
189
|
+
StupidFormatter.chain = [StupidFormatter::RDiscount]
|
190
|
+
|
191
|
+
You'll surely want to read the documentation of StupidFormatter (http://github.com/colszowka/stupid_formatter)
|
192
|
+
to learn how to add your own formatters or erb helpers.
|
193
|
+
|
194
|
+
== TODO
|
195
|
+
|
196
|
+
* static pages
|
197
|
+
* make summary delim configurable
|
198
|
+
* make caching better
|
199
|
+
* valid xhtml in demo setup
|
200
|
+
* generator for basic app?
|
201
|
+
* rake tasks for generating new posts and validating existing
|
202
|
+
* disqus (optional)
|
203
|
+
* google analytics (optional)
|
204
|
+
* allow for choice between erb/haml templates
|
4
205
|
|
5
206
|
== Note on Patches/Pull Requests
|
6
207
|
|
data/Rakefile
CHANGED
@@ -10,11 +10,14 @@ begin
|
|
10
10
|
gem.email = "christoph at olszowka dot de"
|
11
11
|
gem.homepage = "http://github.com/colszowka/serious"
|
12
12
|
gem.authors = ["Christoph Olszowka"]
|
13
|
+
|
13
14
|
gem.add_dependency 'sinatra', ">= 0.9.4"
|
14
|
-
gem.add_dependency 'stupid_formatter', '>= 0.
|
15
|
-
gem.
|
16
|
-
|
17
|
-
gem.add_development_dependency "
|
15
|
+
gem.add_dependency 'stupid_formatter', '>= 0.2.0'
|
16
|
+
gem.add_dependency 'builder', ">= 2.1.2"
|
17
|
+
|
18
|
+
gem.add_development_dependency "shoulda", ">= 2.10.0"
|
19
|
+
gem.add_development_dependency "hpricot", ">= 0.8.0"
|
20
|
+
gem.add_development_dependency "rack-test", ">= 0.5.0"
|
18
21
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
19
22
|
end
|
20
23
|
Jeweler::GemcutterTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.3
|
data/lib/serious.rb
CHANGED
@@ -3,6 +3,7 @@ gem 'sinatra', '~> 0.9.4'
|
|
3
3
|
require 'sinatra/base'
|
4
4
|
require 'stupid_formatter'
|
5
5
|
require 'yaml'
|
6
|
+
require 'builder'
|
6
7
|
|
7
8
|
class Serious < Sinatra::Base
|
8
9
|
|
@@ -13,6 +14,10 @@ class Serious < Sinatra::Base
|
|
13
14
|
erb :"404"
|
14
15
|
end
|
15
16
|
|
17
|
+
before do
|
18
|
+
headers['Cache-Control'] = "public, max-age=#{Serious.cache_timeout}"
|
19
|
+
end
|
20
|
+
|
16
21
|
helpers do
|
17
22
|
def format(text)
|
18
23
|
StupidFormatter.result(text)
|
@@ -30,11 +35,16 @@ class Serious < Sinatra::Base
|
|
30
35
|
|
31
36
|
# Index page
|
32
37
|
get '/' do
|
33
|
-
@recent = Article.all(:limit =>
|
34
|
-
@archived = Article.all(:limit =>
|
38
|
+
@recent = Article.all(:limit => Serious.items_on_index)
|
39
|
+
@archived = Article.all(:limit => Serious.archived_on_index, :offset => Serious.items_on_index)
|
35
40
|
erb :index
|
36
41
|
end
|
37
42
|
|
43
|
+
get '/atom.xml' do
|
44
|
+
@articles = Article.all(:limit => Serious.items_in_feed)
|
45
|
+
builder :atom
|
46
|
+
end
|
47
|
+
|
38
48
|
# Specific article route
|
39
49
|
get %r{^/(\d{4})/(\d{1,2})/(\d{1,2})/([^\\]+)} do
|
40
50
|
halt 404 unless @article = Article.first(*params[:captures])
|
@@ -59,9 +69,15 @@ require 'serious/article'
|
|
59
69
|
# Set up default stupid_formatter chain
|
60
70
|
StupidFormatter.chain = [StupidFormatter::Erb, StupidFormatter::RDiscount]
|
61
71
|
|
62
|
-
# Set up defaults for
|
72
|
+
# Set up defaults for app
|
63
73
|
Serious.set :root, File.join(File.dirname(__FILE__), 'site')
|
64
74
|
Serious.set :title, "Serious"
|
75
|
+
Serious.set :author, "unknown"
|
76
|
+
Serious.set :url, 'http://localhost:3000'
|
77
|
+
Serious.set :items_in_feed, 25 # Number of items to display in atom feed
|
78
|
+
Serious.set :items_on_index, 3 # Number of items to display with summary on main page
|
79
|
+
Serious.set :archived_on_index, 10 # Number of items to display small (title only) on main page
|
80
|
+
Serious.set :cache_timeout, 300
|
65
81
|
Serious.set :run, false
|
66
82
|
Serious.set :environment, :production
|
67
83
|
|
data/lib/serious/article.rb
CHANGED
@@ -52,6 +52,11 @@ class Serious::Article
|
|
52
52
|
@title ||= yaml["title"]
|
53
53
|
end
|
54
54
|
|
55
|
+
# Lazy-loading author accessor with fallback to Serious.author
|
56
|
+
def author
|
57
|
+
@author ||= yaml["author"] || Serious.author
|
58
|
+
end
|
59
|
+
|
55
60
|
# Cached lazy-loading of summary
|
56
61
|
def summary
|
57
62
|
return @summary if @summary
|
@@ -66,7 +71,12 @@ class Serious::Article
|
|
66
71
|
|
67
72
|
# Compiles the url for this article
|
68
73
|
def url
|
69
|
-
"/#{date.year}/#{"%02d" % date.month}/#{"%02d" % date.day}/#{permalink}"
|
74
|
+
@url ||= "/#{date.year}/#{"%02d" % date.month}/#{"%02d" % date.day}/#{permalink}"
|
75
|
+
end
|
76
|
+
|
77
|
+
# url combined with Serious.url
|
78
|
+
def full_url
|
79
|
+
@full_url ||= File.join(Serious.url, url)
|
70
80
|
end
|
71
81
|
|
72
82
|
# Equality comparison
|
data/lib/site/views/_article.erb
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
<span class="date right"><%= article.date %></span>
|
3
3
|
<h2><a href="<%= article.url %>"><%= article.title %></a></h2>
|
4
4
|
<div class="body">
|
5
|
-
|
5
|
+
<% if summary_only %>
|
6
|
+
<%= format article.summary %>
|
7
|
+
<% else %>
|
8
|
+
<%= format article.body %>
|
9
|
+
<span class="author right">Written by <%= article.author %></span>
|
10
|
+
<% end %>
|
6
11
|
</div>
|
12
|
+
|
7
13
|
</div>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
xml.instruct!
|
2
|
+
xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do
|
3
|
+
xml.title Serious.title
|
4
|
+
xml.id Serious.url
|
5
|
+
xml.updated @articles.first.date.to_s unless @articles.empty?
|
6
|
+
xml.author { xml.name Serious.author }
|
7
|
+
|
8
|
+
@articles.each do |article|
|
9
|
+
xml.entry do
|
10
|
+
xml.title article.title
|
11
|
+
xml.link "rel" => "alternate", "href" => article.full_url
|
12
|
+
xml.id article.full_url
|
13
|
+
xml.published article.date.to_s
|
14
|
+
xml.updated article.date.to_s
|
15
|
+
xml.author { xml.name article.author }
|
16
|
+
xml.summary format(article.summary), "type" => "html"
|
17
|
+
xml.content format(article.body), "type" => "html"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
data/lib/site/views/index.erb
CHANGED
data/serious.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{serious}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Christoph Olszowka"]
|
12
|
-
s.date = %q{2010-02-
|
12
|
+
s.date = %q{2010-02-13}
|
13
13
|
s.description = %q{Serious is a simple, file-driven blog engine inspired by toto and driven by sinatra}
|
14
14
|
s.email = %q{christoph at olszowka dot de}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
|
|
31
31
|
"lib/site/views/_archives.erb",
|
32
32
|
"lib/site/views/_article.erb",
|
33
33
|
"lib/site/views/archives.erb",
|
34
|
+
"lib/site/views/atom.builder",
|
34
35
|
"lib/site/views/index.erb",
|
35
36
|
"lib/site/views/layout.erb",
|
36
37
|
"serious.gemspec",
|
@@ -59,23 +60,26 @@ Gem::Specification.new do |s|
|
|
59
60
|
|
60
61
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
61
62
|
s.add_runtime_dependency(%q<sinatra>, [">= 0.9.4"])
|
62
|
-
s.add_runtime_dependency(%q<stupid_formatter>, [">= 0.
|
63
|
-
s.
|
64
|
-
s.add_development_dependency(%q<
|
65
|
-
s.add_development_dependency(%q<
|
63
|
+
s.add_runtime_dependency(%q<stupid_formatter>, [">= 0.2.0"])
|
64
|
+
s.add_runtime_dependency(%q<builder>, [">= 2.1.2"])
|
65
|
+
s.add_development_dependency(%q<shoulda>, [">= 2.10.0"])
|
66
|
+
s.add_development_dependency(%q<hpricot>, [">= 0.8.0"])
|
67
|
+
s.add_development_dependency(%q<rack-test>, [">= 0.5.0"])
|
66
68
|
else
|
67
69
|
s.add_dependency(%q<sinatra>, [">= 0.9.4"])
|
68
|
-
s.add_dependency(%q<stupid_formatter>, [">= 0.
|
69
|
-
s.add_dependency(%q<
|
70
|
-
s.add_dependency(%q<
|
71
|
-
s.add_dependency(%q<
|
70
|
+
s.add_dependency(%q<stupid_formatter>, [">= 0.2.0"])
|
71
|
+
s.add_dependency(%q<builder>, [">= 2.1.2"])
|
72
|
+
s.add_dependency(%q<shoulda>, [">= 2.10.0"])
|
73
|
+
s.add_dependency(%q<hpricot>, [">= 0.8.0"])
|
74
|
+
s.add_dependency(%q<rack-test>, [">= 0.5.0"])
|
72
75
|
end
|
73
76
|
else
|
74
77
|
s.add_dependency(%q<sinatra>, [">= 0.9.4"])
|
75
|
-
s.add_dependency(%q<stupid_formatter>, [">= 0.
|
76
|
-
s.add_dependency(%q<
|
77
|
-
s.add_dependency(%q<
|
78
|
-
s.add_dependency(%q<
|
78
|
+
s.add_dependency(%q<stupid_formatter>, [">= 0.2.0"])
|
79
|
+
s.add_dependency(%q<builder>, [">= 2.1.2"])
|
80
|
+
s.add_dependency(%q<shoulda>, [">= 2.10.0"])
|
81
|
+
s.add_dependency(%q<hpricot>, [">= 0.8.0"])
|
82
|
+
s.add_dependency(%q<rack-test>, [">= 0.5.0"])
|
79
83
|
end
|
80
84
|
end
|
81
85
|
|
data/test/helper.rb
CHANGED
@@ -12,6 +12,8 @@ class Test::Unit::TestCase
|
|
12
12
|
include Rack::Test::Methods
|
13
13
|
Serious.set :title, "Serious Test Blog"
|
14
14
|
Serious.set :articles, File.join(File.dirname(__FILE__), 'articles')
|
15
|
+
Serious.set :author, "TheDeadSerious"
|
16
|
+
Serious.set :url, 'http://example.com'
|
15
17
|
StupidFormatter.chain = [StupidFormatter::Erb, StupidFormatter::RDiscount]
|
16
18
|
|
17
19
|
def app
|
@@ -44,4 +46,10 @@ class Test::Unit::TestCase
|
|
44
46
|
assert_no_match /#{text}/, (doc/selector).inner_html
|
45
47
|
end
|
46
48
|
end
|
49
|
+
|
50
|
+
def self.should_set_cache_control_to(seconds)
|
51
|
+
should "set Cache-Control header with timeout of #{seconds} seconds" do
|
52
|
+
assert_equal "public, max-age=#{Serious.cache_timeout}", last_response.headers['Cache-Control']
|
53
|
+
end
|
54
|
+
end
|
47
55
|
end
|
data/test/test_article.rb
CHANGED
@@ -96,6 +96,10 @@ class TestArticle < Test::Unit::TestCase
|
|
96
96
|
should "return '/2010/01/15/foo-bar' as url" do
|
97
97
|
assert_equal '/2010/01/15/foo-bar', @article.url
|
98
98
|
end
|
99
|
+
|
100
|
+
should "return 'http://example.com/2010/01/15/foo-bar' as full_url" do
|
101
|
+
assert_equal 'http://example.com/2010/01/15/foo-bar', @article.full_url
|
102
|
+
end
|
99
103
|
end
|
100
104
|
|
101
105
|
# Making sure one-digit month and day work as well
|
@@ -216,6 +220,10 @@ class TestArticle < Test::Unit::TestCase
|
|
216
220
|
assert_nil @article.instance_variable_get(:@content)
|
217
221
|
end
|
218
222
|
|
223
|
+
should "have 'Christoph Olszowka' as author" do
|
224
|
+
assert_equal 'Christoph Olszowka', @article.author
|
225
|
+
end
|
226
|
+
|
219
227
|
context "after getting the article's title" do
|
220
228
|
setup { @title = @article.title }
|
221
229
|
|
@@ -249,6 +257,7 @@ class TestArticle < Test::Unit::TestCase
|
|
249
257
|
should("have title 'Foo Bar'") { assert_equal 'Foo Bar', @article.title }
|
250
258
|
should('have summary "Baz!"') { assert_equal "Baz!\n", @article.summary }
|
251
259
|
should('have body "Baz!"') { assert_equal "Baz!\n", @article.body }
|
260
|
+
should("have 'TheDeadSerious' as author") { assert_equal 'TheDeadSerious', @article.author }
|
252
261
|
should('have summary equal to body') { assert_equal @article.summary, @article.body}
|
253
262
|
end
|
254
263
|
|
data/test/test_serious.rb
CHANGED
@@ -9,6 +9,7 @@ class TestSerious < Test::Unit::TestCase
|
|
9
9
|
setup { get '/' }
|
10
10
|
|
11
11
|
should_respond_with 200
|
12
|
+
should_set_cache_control_to 300
|
12
13
|
|
13
14
|
should_contain_text "Serious Test Blog", "#header h1 a"
|
14
15
|
|
@@ -35,6 +36,7 @@ class TestSerious < Test::Unit::TestCase
|
|
35
36
|
setup { get '/2009' }
|
36
37
|
|
37
38
|
should_respond_with 200
|
39
|
+
should_set_cache_control_to 300
|
38
40
|
should_contain_text "Archives for 2009", "#container h2:first"
|
39
41
|
should_contain_elements 3, "ul.archives li"
|
40
42
|
should_contain_text "Merry Christmas!", "ul.archives li:first"
|
@@ -46,6 +48,7 @@ class TestSerious < Test::Unit::TestCase
|
|
46
48
|
setup { get '/2009/12' }
|
47
49
|
|
48
50
|
should_respond_with 200
|
51
|
+
should_set_cache_control_to 300
|
49
52
|
should_contain_text "Archives for 2009-12", "#container h2:first"
|
50
53
|
should_contain_elements 2, "ul.archives li"
|
51
54
|
should_contain_text "Merry Christmas!", "ul.archives li:first"
|
@@ -56,6 +59,7 @@ class TestSerious < Test::Unit::TestCase
|
|
56
59
|
setup { get '/2009/12/11' }
|
57
60
|
|
58
61
|
should_respond_with 200
|
62
|
+
should_set_cache_control_to 300
|
59
63
|
should_contain_text "Archives for 2009-12-11", "#container h2:first"
|
60
64
|
should_contain_elements 1, "ul.archives li"
|
61
65
|
should_contain_text "Ruby is the shit!", "ul.archives li:first"
|
@@ -65,6 +69,7 @@ class TestSerious < Test::Unit::TestCase
|
|
65
69
|
setup { get '/2000' }
|
66
70
|
|
67
71
|
should_respond_with 200
|
72
|
+
should_set_cache_control_to 300
|
68
73
|
should_contain_text "Archives for 2000", "#container h2:first"
|
69
74
|
should_contain_elements 1, "ul.archives li"
|
70
75
|
should_contain_text "Disco 2000", "ul.archives li:first"
|
@@ -74,6 +79,7 @@ class TestSerious < Test::Unit::TestCase
|
|
74
79
|
setup { get '/2005' }
|
75
80
|
|
76
81
|
should_respond_with 200
|
82
|
+
should_set_cache_control_to 300
|
77
83
|
should_contain_text "Archives for 2005", "#container h2:first"
|
78
84
|
should_contain_elements 0, "ul.archives li"
|
79
85
|
end
|
@@ -82,6 +88,7 @@ class TestSerious < Test::Unit::TestCase
|
|
82
88
|
setup { get '/2000/1' }
|
83
89
|
|
84
90
|
should_respond_with 200
|
91
|
+
should_set_cache_control_to 300
|
85
92
|
should_contain_text "Archives for 2000-01", "#container h2:first"
|
86
93
|
should_contain_elements 1, "ul.archives li"
|
87
94
|
should_contain_text "Disco 2000", "ul.archives li:first"
|
@@ -91,6 +98,7 @@ class TestSerious < Test::Unit::TestCase
|
|
91
98
|
setup { get '/2000/1/01' }
|
92
99
|
|
93
100
|
should_respond_with 200
|
101
|
+
should_set_cache_control_to 300
|
94
102
|
should_contain_text "Archives for 2000-01-01", "#container h2:first"
|
95
103
|
should_contain_elements 1, "ul.archives li"
|
96
104
|
should_contain_text "Disco 2000", "ul.archives li:first"
|
@@ -100,6 +108,7 @@ class TestSerious < Test::Unit::TestCase
|
|
100
108
|
setup { get '/archives' }
|
101
109
|
|
102
110
|
should_respond_with 200
|
111
|
+
should_set_cache_control_to 300
|
103
112
|
should_contain_text "Archives", "#container h2:first"
|
104
113
|
should_contain_elements 4, "ul.archives li"
|
105
114
|
should_contain_text "Merry Christmas!", "ul.archives li:first"
|
@@ -116,6 +125,7 @@ class TestSerious < Test::Unit::TestCase
|
|
116
125
|
setup { get '/2009/12/24/merry-christmas' }
|
117
126
|
|
118
127
|
should_respond_with 200
|
128
|
+
should_set_cache_control_to 300
|
119
129
|
should_contain_text "Merry Christmas!", "#container h2:first"
|
120
130
|
should_contain_text "Merry Christmas! - Serious Test Blog", "head title"
|
121
131
|
should_contain_text "Merry christmas, dear reader!", ".article .body"
|
@@ -126,6 +136,7 @@ class TestSerious < Test::Unit::TestCase
|
|
126
136
|
setup { get '/2009/12/11/ruby-is-the-shit' }
|
127
137
|
|
128
138
|
should_respond_with 200
|
139
|
+
should_set_cache_control_to 300
|
129
140
|
should_contain_text "Ruby is the shit!", "#container h2:first"
|
130
141
|
should_contain_text "Some kind of introduction and summary", ".article .body"
|
131
142
|
# Erb should evaluate properly
|
@@ -136,6 +147,7 @@ class TestSerious < Test::Unit::TestCase
|
|
136
147
|
setup { get '/2000/1/1/disco-2000' }
|
137
148
|
|
138
149
|
should_respond_with 200
|
150
|
+
should_set_cache_control_to 300
|
139
151
|
should_contain_text "Disco 2000", "#container h2:first"
|
140
152
|
should_contain_text "Well we were born within one hour of each other.", ".article .body"
|
141
153
|
# Markdown should evaluate properly
|
@@ -146,6 +158,7 @@ class TestSerious < Test::Unit::TestCase
|
|
146
158
|
setup { get '/2009/1/1/disco-2000' }
|
147
159
|
|
148
160
|
should_respond_with 404
|
161
|
+
should_set_cache_control_to 300
|
149
162
|
should_contain_text "The requested page could not be found!", "#container h2:first"
|
150
163
|
should_not_contain_text "Well we were born within one hour of each other.", ".article .body"
|
151
164
|
end
|
@@ -162,4 +175,16 @@ class TestSerious < Test::Unit::TestCase
|
|
162
175
|
setup { get '/foobar.baz' }
|
163
176
|
should_respond_with 404
|
164
177
|
end
|
178
|
+
|
179
|
+
# ===================================================================
|
180
|
+
# Tests for the atom feed
|
181
|
+
# ===================================================================
|
182
|
+
context "GET /atom.xml" do
|
183
|
+
setup { get '/atom.xml' }
|
184
|
+
should_respond_with 200
|
185
|
+
should_set_cache_control_to 300
|
186
|
+
|
187
|
+
should_contain_text "Merry Christmas!", "feed entry:first title"
|
188
|
+
should_contain_text "Christoph Olszowka", "feed entry:first author name:first"
|
189
|
+
end
|
165
190
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: serious
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christoph Olszowka
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-13 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -30,7 +30,17 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.2.0
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: builder
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 2.1.2
|
34
44
|
version:
|
35
45
|
- !ruby/object:Gem::Dependency
|
36
46
|
name: shoulda
|
@@ -40,7 +50,7 @@ dependencies:
|
|
40
50
|
requirements:
|
41
51
|
- - ">="
|
42
52
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
53
|
+
version: 2.10.0
|
44
54
|
version:
|
45
55
|
- !ruby/object:Gem::Dependency
|
46
56
|
name: hpricot
|
@@ -50,7 +60,7 @@ dependencies:
|
|
50
60
|
requirements:
|
51
61
|
- - ">="
|
52
62
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
63
|
+
version: 0.8.0
|
54
64
|
version:
|
55
65
|
- !ruby/object:Gem::Dependency
|
56
66
|
name: rack-test
|
@@ -60,7 +70,7 @@ dependencies:
|
|
60
70
|
requirements:
|
61
71
|
- - ">="
|
62
72
|
- !ruby/object:Gem::Version
|
63
|
-
version:
|
73
|
+
version: 0.5.0
|
64
74
|
version:
|
65
75
|
description: Serious is a simple, file-driven blog engine inspired by toto and driven by sinatra
|
66
76
|
email: christoph at olszowka dot de
|
@@ -86,6 +96,7 @@ files:
|
|
86
96
|
- lib/site/views/_archives.erb
|
87
97
|
- lib/site/views/_article.erb
|
88
98
|
- lib/site/views/archives.erb
|
99
|
+
- lib/site/views/atom.builder
|
89
100
|
- lib/site/views/index.erb
|
90
101
|
- lib/site/views/layout.erb
|
91
102
|
- serious.gemspec
|