serious 0.2.1 → 0.2.2
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/.gitignore +2 -0
- data/README.rdoc +37 -5
- data/VERSION +1 -1
- data/bin/serious +9 -1
- data/lib/ruby_ext.rb +6 -0
- data/lib/serious/article.rb +36 -1
- data/lib/serious/tasks.rb +64 -0
- data/lib/site/public/css/serious.css +28 -7
- data/lib/site/public/fonts/YanoneKaffeesatz-Thin.otf +0 -0
- data/lib/site/public/fonts/vollkorn.otf +0 -0
- data/lib/site/views/layout.erb +8 -1
- data/serious.gemspec +7 -2
- data/test/helper.rb +56 -0
- data/test/test_article.rb +74 -0
- data/test/test_bin.rb +133 -0
- data/test/test_ruby_ext.rb +10 -0
- metadata +6 -1
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -59,6 +59,7 @@ The directory basic directory structure of your Serious site would be something
|
|
59
59
|
- articles/2010-02-14-will-you-be-my-valentine.txt
|
60
60
|
- config.ru
|
61
61
|
- .gems
|
62
|
+
- Rakefile
|
62
63
|
|
63
64
|
The config.ru is pretty straight-forward if you want to stick to the defaults:
|
64
65
|
|
@@ -70,12 +71,16 @@ The config.ru is pretty straight-forward if you want to stick to the defaults:
|
|
70
71
|
|
71
72
|
The .gems file if you want to host on heroku:
|
72
73
|
|
73
|
-
stupid_formatter
|
74
74
|
serious
|
75
75
|
|
76
76
|
Note that sinatra is not included in the gemfile since heroku has it installed by default, but serious
|
77
77
|
will install it as a gem dependency on other systems as well.
|
78
78
|
|
79
|
+
The Rakefile, which is obviously totally optional but highly recommended.
|
80
|
+
|
81
|
+
require 'serious'
|
82
|
+
require 'serious/tasks'
|
83
|
+
|
79
84
|
== Creating heroku app manually
|
80
85
|
|
81
86
|
Assuming you've got the heroku gem installed and set up and you've set up git for your blog with
|
@@ -86,10 +91,12 @@ Assuming you've got the heroku gem installed and set up and you've set up git fo
|
|
86
91
|
|
87
92
|
Point your browser to the url, and bang, you're ready!
|
88
93
|
|
89
|
-
== Running
|
94
|
+
== Running locally
|
90
95
|
|
91
|
-
You might also want to test your blog locally
|
92
|
-
|
96
|
+
You might also want to test your blog locally. Use the <code>rake server</code> command inside
|
97
|
+
your site's directory.
|
98
|
+
|
99
|
+
You can also use thin (<code>sudo gem install thin</code>) with:
|
93
100
|
|
94
101
|
thin -R config.ru start
|
95
102
|
|
@@ -101,6 +108,26 @@ The whole archives can be accessed at <code>/archives</code>. Archives by year,
|
|
101
108
|
are available at <code>/2009</code> (all of 2009), <code>/2009/05</code> (May 2009),
|
102
109
|
<code>/2009/05/15</code> (May 15th 2009).
|
103
110
|
|
111
|
+
== Rake tasks
|
112
|
+
|
113
|
+
If you've set up the Rakefile in your site's main directory like mentioned above (this happens
|
114
|
+
automatically when generating with the <code>serious</code> executable), you have the following
|
115
|
+
tasks available:
|
116
|
+
|
117
|
+
rake article:create # Creates a new article
|
118
|
+
rake article:validate # Validates all articles, making sure they can be processed correctly
|
119
|
+
rake server # Runs a server hosting your site on localhost:3000 using rackup
|
120
|
+
|
121
|
+
The default is article:create, so to create a new article, just type <code>rake</code>,
|
122
|
+
specify your title and optionally a date and you're ready to go!
|
123
|
+
|
124
|
+
It's highly recommended that you run the <code>article:validate</code> task before publishing,
|
125
|
+
since it will make sure everything gets processed correctly.
|
126
|
+
|
127
|
+
Please be aware that you have to run the Rake tasks from the top level directory (where your
|
128
|
+
<code>config.ru</code> file resides) since the config.ru file will be loaded to reflect your
|
129
|
+
settings.
|
130
|
+
|
104
131
|
== Comments with disqus
|
105
132
|
|
106
133
|
You can activate comments for articles very easily with disqus (http://disqus.com) by setting
|
@@ -267,7 +294,6 @@ to learn how to add your own formatters or erb helpers.
|
|
267
294
|
* make caching better
|
268
295
|
* make it possible to host in subdirectories
|
269
296
|
* valid xhtml in demo setup
|
270
|
-
* rake tasks for generating new posts and validating existing
|
271
297
|
* allow for choice between erb/haml templates
|
272
298
|
|
273
299
|
== Note on Patches/Pull Requests
|
@@ -280,6 +306,12 @@ to learn how to add your own formatters or erb helpers.
|
|
280
306
|
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
281
307
|
* Send me a pull request. Bonus points for topic branches.
|
282
308
|
|
309
|
+
== Font credits
|
310
|
+
|
311
|
+
The fonts supplied with the gem and used by the default theme are Yanone Kaffeesatz
|
312
|
+
(http://www.fonts.info/info/en_yanone-kaffeesatz.htm) and Vollkorn (http://friedrichalthausen.de/2006/01/01/vollkorn/),
|
313
|
+
licensed under Creative Commons Attribution 2.0 Generic (http://creativecommons.org/licenses/by/2.0/).
|
314
|
+
|
283
315
|
== Thanks
|
284
316
|
|
285
317
|
Alexis Sellier for toto, the main inspiration for this gem
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.2
|
data/bin/serious
CHANGED
@@ -31,6 +31,7 @@ end
|
|
31
31
|
|
32
32
|
require 'fileutils'
|
33
33
|
puts "Creating directory #{DIRNAME}"
|
34
|
+
ORIGINAL_DIR = Dir.getwd
|
34
35
|
FileUtils.mkdir_p(File.join(DIRNAME, 'articles'))
|
35
36
|
Dir.chdir(DIRNAME)
|
36
37
|
|
@@ -84,10 +85,15 @@ end
|
|
84
85
|
|
85
86
|
puts "Creating .gems file"
|
86
87
|
File.open(".gems", "w+") do |gems|
|
87
|
-
gems.puts "stupid_formatter"
|
88
88
|
gems.puts "serious --version '>= #{File.read(File.join(GEM_ROOT, 'VERSION')).strip.chomp}'"
|
89
89
|
end
|
90
90
|
|
91
|
+
puts "Creating Rakefile"
|
92
|
+
File.open('Rakefile', "w+") do |rake|
|
93
|
+
rake.puts "require 'serious'"
|
94
|
+
rake.puts "require 'serious/tasks'"
|
95
|
+
end
|
96
|
+
|
91
97
|
if git?
|
92
98
|
puts "Creating git repo"
|
93
99
|
system "git init"
|
@@ -115,3 +121,5 @@ if heroku?
|
|
115
121
|
end
|
116
122
|
|
117
123
|
puts "Done!"
|
124
|
+
|
125
|
+
Dir.chdir(ORIGINAL_DIR)
|
data/lib/ruby_ext.rb
CHANGED
data/lib/serious/article.rb
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
# Backend for file-system based articles
|
3
3
|
#
|
4
4
|
class Serious::Article
|
5
|
+
# Exception for invalid filenames
|
6
|
+
class InvalidFilename < StandardError
|
7
|
+
end
|
8
|
+
|
5
9
|
class << self
|
6
10
|
#
|
7
11
|
# Returns all articles. Can be drilled down by (optional) :limit and :offset options
|
@@ -86,6 +90,35 @@ class Serious::Article
|
|
86
90
|
false
|
87
91
|
end
|
88
92
|
|
93
|
+
# Collection of validation errors
|
94
|
+
def errors
|
95
|
+
@errors || valid?
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# Loads the article and makes sure it can be loaded, formatted etc..
|
100
|
+
# Error messages can be read through errors array
|
101
|
+
#
|
102
|
+
def valid?
|
103
|
+
@errors = []
|
104
|
+
errors << "No title given" unless title.kind_of?(String) and title.length > 0
|
105
|
+
errors << "No author given" unless author.kind_of?(String) and author.length > 0
|
106
|
+
|
107
|
+
begin
|
108
|
+
summary.formatted
|
109
|
+
rescue => err
|
110
|
+
errors << "Failed to format summary"
|
111
|
+
end
|
112
|
+
|
113
|
+
begin
|
114
|
+
body.formatted
|
115
|
+
rescue => err
|
116
|
+
errors << "Failed to format body"
|
117
|
+
end
|
118
|
+
ensure
|
119
|
+
return errors.length == 0
|
120
|
+
end
|
121
|
+
|
89
122
|
private
|
90
123
|
|
91
124
|
# Will extract the date and permalink from the filename.
|
@@ -93,6 +126,8 @@ class Serious::Article
|
|
93
126
|
match = File.basename(path).match(/(\d{4})-(\d{1,2})-(\d{1,2})-([^\.]+)/)
|
94
127
|
@date = Date.new(match[1].to_i, match[2].to_i, match[3].to_i)
|
95
128
|
@permalink = match[4]
|
129
|
+
rescue NoMethodError => err
|
130
|
+
raise InvalidFilename, "Failed to extract date or permalink from #{File.basename(path)}"
|
96
131
|
end
|
97
132
|
|
98
133
|
#
|
@@ -100,7 +135,7 @@ class Serious::Article
|
|
100
135
|
# the content in @content
|
101
136
|
#
|
102
137
|
def load!
|
103
|
-
return
|
138
|
+
return true if @yaml and @content
|
104
139
|
yaml, @content = File.read(path).split(/\n\n/, 2)
|
105
140
|
@yaml = YAML.load(yaml)
|
106
141
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# Swallow the actual run method from config.ru
|
2
|
+
def run(*args)
|
3
|
+
end
|
4
|
+
|
5
|
+
begin
|
6
|
+
config = File.read('config.ru')
|
7
|
+
eval config
|
8
|
+
rescue Errno::ENOENT => err
|
9
|
+
puts "ERROR: Failed to load your config from config.ru!"
|
10
|
+
exit 1
|
11
|
+
end
|
12
|
+
|
13
|
+
def ask(q)
|
14
|
+
print "#{q} "
|
15
|
+
STDIN.gets.strip.chomp
|
16
|
+
end
|
17
|
+
|
18
|
+
namespace :article do
|
19
|
+
desc "Validates all articles, making sure they can be processed correctly"
|
20
|
+
task :validate do
|
21
|
+
Serious::Article.all.each do |article|
|
22
|
+
unless article.valid?
|
23
|
+
puts "", "Article #{File.basename(article.path)} is not valid!"
|
24
|
+
puts " Errors: #{article.errors.sort.join(", ")}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
puts
|
29
|
+
puts "Validated #{Serious::Article.all.length} article(s)!"
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "Creates a new article"
|
33
|
+
task :create do
|
34
|
+
title = ask('Title?')
|
35
|
+
if date = ask("Date (defaults to #{Date.today})? ") and date.length > 0
|
36
|
+
begin
|
37
|
+
article_date = Date.new(*date.split('-').map(&:to_i))
|
38
|
+
rescue => err
|
39
|
+
puts "Whoops, failed to process the date! The format must be #{Date.today}, you gave #{date}"
|
40
|
+
raise err
|
41
|
+
exit 1
|
42
|
+
end
|
43
|
+
else
|
44
|
+
article_date = Date.today
|
45
|
+
end
|
46
|
+
|
47
|
+
filename = "#{article_date}-#{title.slugize}.txt"
|
48
|
+
File.open(File.join(Serious.articles, filename), "w") do |article|
|
49
|
+
article.puts "title: #{title}", ""
|
50
|
+
article.puts "Summary here", "~", "Body here"
|
51
|
+
end
|
52
|
+
|
53
|
+
puts "Created article #{filename}!"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
desc "Runs a server hosting your site on localhost:3000 using rackup"
|
58
|
+
task :server do
|
59
|
+
puts "Server listening on http://localhost:3000"
|
60
|
+
system "rackup -p 3000 -o localhost"
|
61
|
+
puts "Bye!"
|
62
|
+
end
|
63
|
+
|
64
|
+
task :default => :"article:create"
|
@@ -1,17 +1,28 @@
|
|
1
1
|
body {
|
2
2
|
margin: 0 auto;
|
3
|
-
font-family: 'Baskerville', Georgia, Times, serif;
|
3
|
+
font-family: 'Junction', 'Baskerville', Georgia, Times, serif;
|
4
4
|
font-size: 20px;
|
5
5
|
line-height: 30px;
|
6
6
|
width: 800px;
|
7
7
|
}
|
8
8
|
|
9
|
+
@font-face {
|
10
|
+
font-family: Vollkorn;
|
11
|
+
src: url('/fonts/vollkorn.otf') format("opentype");
|
12
|
+
}
|
13
|
+
|
14
|
+
@font-face {
|
15
|
+
font-family: 'Yanone Kaffeesatz Thin';
|
16
|
+
src: url('/fonts/YanoneKaffeesatz-Thin.otf') format("opentype");
|
17
|
+
}
|
18
|
+
|
19
|
+
|
9
20
|
div, p {
|
10
|
-
font-family: '
|
21
|
+
font-family: 'Vollkorn', Georgia, Times, serif;
|
11
22
|
}
|
12
23
|
|
13
24
|
h1, h2, h3, h4 {
|
14
|
-
font-family: "Helvetica", "Arial", "Verdana", sans-serif;
|
25
|
+
font-family: 'Yanone Kaffeesatz Thin', "Helvetica", "Arial", "Verdana", sans-serif;
|
15
26
|
padding: 0;
|
16
27
|
margin: 0;
|
17
28
|
}
|
@@ -31,14 +42,14 @@ h1, h2, h3, h4 {
|
|
31
42
|
}
|
32
43
|
|
33
44
|
#header {
|
34
|
-
margin: 0px 0px
|
35
|
-
padding:
|
45
|
+
margin: 0px 0px 60px 0px;
|
46
|
+
padding: 30px;
|
36
47
|
text-align: center;
|
37
|
-
border-bottom:
|
48
|
+
border-bottom: 2px solid #BE2805;
|
38
49
|
}
|
39
50
|
|
40
51
|
#header h1 {
|
41
|
-
font-family: '
|
52
|
+
font-family: 'Yanone Kaffeesatz Thin', "Helvetica", "Arial", "Verdana", sans-serif;
|
42
53
|
font-size: 28px;
|
43
54
|
}
|
44
55
|
|
@@ -94,15 +105,25 @@ h1, h2, h3, h4 {
|
|
94
105
|
padding-top: 25px;
|
95
106
|
}
|
96
107
|
|
108
|
+
#disqus_thread h3 {
|
109
|
+
padding: 15px 0px;
|
110
|
+
font-size: 20px;
|
111
|
+
}
|
97
112
|
|
98
113
|
#footer {
|
99
114
|
margin-top: 50px;
|
100
115
|
color: #666;
|
101
116
|
text-align: right;
|
102
117
|
font-size: 14px;
|
118
|
+
line-height: 18px;
|
103
119
|
}
|
104
120
|
|
105
121
|
#footer a {
|
106
122
|
text-decoration: none;
|
107
123
|
color: black;
|
108
124
|
}
|
125
|
+
|
126
|
+
#footer p {
|
127
|
+
margin: 0;
|
128
|
+
padding: 0;
|
129
|
+
}
|
Binary file
|
Binary file
|
data/lib/site/views/layout.erb
CHANGED
@@ -15,7 +15,14 @@
|
|
15
15
|
</div>
|
16
16
|
|
17
17
|
<div id="footer">
|
18
|
-
|
18
|
+
<p>
|
19
|
+
This blog is <a href="http://github.com/colszowka/serious">serious</a>.
|
20
|
+
</p>
|
21
|
+
<p>
|
22
|
+
Fonts used are <a href="http://www.fonts.info/info/en_yanone-kaffeesatz.htm">Yanone Kaffeesatz</a> and
|
23
|
+
<a href="http://friedrichalthausen.de/2006/01/01/vollkorn/">Vollkorn</a>, licensed under
|
24
|
+
<a href="http://creativecommons.org/licenses/by/2.0/">CC 2.0</a>.
|
25
|
+
</p>
|
19
26
|
</div>
|
20
27
|
|
21
28
|
<%= render_partial :google_analytics if Serious.google_analytics %>
|
data/serious.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{serious}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.2"
|
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"]
|
@@ -29,8 +29,11 @@ Gem::Specification.new do |s|
|
|
29
29
|
"lib/ruby_ext.rb",
|
30
30
|
"lib/serious.rb",
|
31
31
|
"lib/serious/article.rb",
|
32
|
+
"lib/serious/tasks.rb",
|
32
33
|
"lib/site/public/css/coderay.css",
|
33
34
|
"lib/site/public/css/serious.css",
|
35
|
+
"lib/site/public/fonts/YanoneKaffeesatz-Thin.otf",
|
36
|
+
"lib/site/public/fonts/vollkorn.otf",
|
34
37
|
"lib/site/views/404.erb",
|
35
38
|
"lib/site/views/_archives.erb",
|
36
39
|
"lib/site/views/_article.erb",
|
@@ -47,6 +50,7 @@ Gem::Specification.new do |s|
|
|
47
50
|
"test/articles/2009-12-24-merry-christmas.txt",
|
48
51
|
"test/helper.rb",
|
49
52
|
"test/test_article.rb",
|
53
|
+
"test/test_bin.rb",
|
50
54
|
"test/test_ruby_ext.rb",
|
51
55
|
"test/test_serious.rb"
|
52
56
|
]
|
@@ -56,7 +60,8 @@ Gem::Specification.new do |s|
|
|
56
60
|
s.rubygems_version = %q{1.3.5}
|
57
61
|
s.summary = %q{Serious is a simple, file-driven blog engine inspired by toto and driven by sinatra}
|
58
62
|
s.test_files = [
|
59
|
-
"test/
|
63
|
+
"test/test_bin.rb",
|
64
|
+
"test/test_serious.rb",
|
60
65
|
"test/helper.rb",
|
61
66
|
"test/test_ruby_ext.rb",
|
62
67
|
"test/test_article.rb"
|
data/test/helper.rb
CHANGED
@@ -59,4 +59,60 @@ class Test::Unit::TestCase
|
|
59
59
|
assert_equal "public, max-age=#{Serious.cache_timeout}", last_response.headers['Cache-Control']
|
60
60
|
end
|
61
61
|
end
|
62
|
+
|
63
|
+
def self.should_slugize(input, expectation)
|
64
|
+
should "return '#{expectation}' for '#{input}'.slugize" do
|
65
|
+
assert_equal expectation, input.slugize
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.should_have_file(name, content=nil)
|
70
|
+
should "have file #{name}" do
|
71
|
+
assert File.exist?(name), "#{name} does not exist"
|
72
|
+
end
|
73
|
+
|
74
|
+
if content and not block_given?
|
75
|
+
should "have content in file #{name} match /#{content}/" do
|
76
|
+
assert_match /#{content}/, File.read(name)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
yield(File.read(name)) if block_given? and File.exist?(name)
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.should_have_dir(name)
|
84
|
+
should "have directory #{name}" do
|
85
|
+
assert File.directory?(name), "#{name} is not a directory"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.should_not_have_path(name)
|
90
|
+
should "not have directory #{name}" do
|
91
|
+
assert !File.exist?(name), "#{name} exists!"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.should_contain(expect, item)
|
96
|
+
should "contain #{expect}" do
|
97
|
+
assert_match /#{expect}/, item
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.should_not_contain(expect, item)
|
102
|
+
should "not contain #{expect}" do
|
103
|
+
assert_no_match /#{expect}/, item
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def self.when_running_serious_with(site_name, arguments="", cache=true)
|
108
|
+
context "when running serious #{site_name} #{arguments}" do
|
109
|
+
setup { assert @output = serious(site_name, arguments, cache) }
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def self.should_print(expect)
|
114
|
+
should("print #{expect}") do
|
115
|
+
assert_match /#{expect}/, @output
|
116
|
+
end
|
117
|
+
end
|
62
118
|
end
|
data/test/test_article.rb
CHANGED
@@ -152,6 +152,10 @@ class TestArticle < Test::Unit::TestCase
|
|
152
152
|
context "the found article" do
|
153
153
|
setup { @article = @articles.first }
|
154
154
|
|
155
|
+
should "be valid" do
|
156
|
+
assert @article.valid?
|
157
|
+
end
|
158
|
+
|
155
159
|
should "have date 2009-12-24" do
|
156
160
|
assert_equal Date.new(2009, 12, 24), @article.date
|
157
161
|
end
|
@@ -254,6 +258,9 @@ class TestArticle < Test::Unit::TestCase
|
|
254
258
|
@article = Serious::Article.first('foo-bar')
|
255
259
|
end
|
256
260
|
|
261
|
+
should "be valid" do
|
262
|
+
assert @article.valid?
|
263
|
+
end
|
257
264
|
should("have title 'Foo Bar'") { assert_equal 'Foo Bar', @article.title }
|
258
265
|
should('have summary "Baz!"') { assert_equal "Baz!\n", @article.summary }
|
259
266
|
should('have body "Baz!"') { assert_equal "Baz!\n", @article.body }
|
@@ -261,4 +268,71 @@ class TestArticle < Test::Unit::TestCase
|
|
261
268
|
should('have summary equal to body') { assert_equal @article.summary, @article.body}
|
262
269
|
end
|
263
270
|
|
271
|
+
# ========================================================================
|
272
|
+
# Tests for validation
|
273
|
+
# ========================================================================
|
274
|
+
context "An article with invalid ERb content" do
|
275
|
+
setup do
|
276
|
+
@article = Serious::Article.new('2009-12-12-foo-bar.txt')
|
277
|
+
@article.instance_variable_set :@yaml, {"title" => "Foo Bar"}
|
278
|
+
@article.instance_variable_set :@content, "Some stupid text with <% invalid %>"
|
279
|
+
end
|
280
|
+
|
281
|
+
should("not be valid") { assert !@article.valid? }
|
282
|
+
context "after validating" do
|
283
|
+
setup { @article.valid? }
|
284
|
+
|
285
|
+
should "include 'Failed to format body' in errors" do
|
286
|
+
assert @article.errors.include?('Failed to format body'), @article.errors.inspect
|
287
|
+
end
|
288
|
+
|
289
|
+
should "include 'Failed to format summary' in errors" do
|
290
|
+
assert @article.errors.include?('Failed to format summary'), @article.errors.inspect
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
context "An article with missing title and author" do
|
296
|
+
setup do
|
297
|
+
@article = Serious::Article.new('2009-12-12-foo-bar.txt')
|
298
|
+
@article.instance_variable_set :@yaml, {"title" => nil, "author" => nil}
|
299
|
+
@article.instance_variable_set :@content, "Some stupid text"
|
300
|
+
end
|
301
|
+
|
302
|
+
should("not be valid") { assert !@article.valid? }
|
303
|
+
context "after validating" do
|
304
|
+
setup { @article.valid? }
|
305
|
+
|
306
|
+
should "include 'No title given' in errors" do
|
307
|
+
assert @article.errors.include?('No title given'), @article.errors.inspect
|
308
|
+
end
|
309
|
+
|
310
|
+
should "not include 'No author given' in errors" do
|
311
|
+
assert !@article.errors.include?('No author given'), @article.errors.inspect
|
312
|
+
end
|
313
|
+
|
314
|
+
context "after setting @author to '' and revalidating" do
|
315
|
+
setup do
|
316
|
+
@article.instance_variable_set :@author, ''
|
317
|
+
@article.valid?
|
318
|
+
end
|
319
|
+
|
320
|
+
should "include 'No title given' in errors" do
|
321
|
+
assert @article.errors.include?('No title given'), @article.errors.inspect
|
322
|
+
end
|
323
|
+
|
324
|
+
should "include 'No author given' in errors" do
|
325
|
+
assert @article.errors.include?('No author given'), @article.errors.inspect
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
context "An article with invalid Filename" do
|
332
|
+
should "raise Serious::Article::InvalidFilename exception on load" do
|
333
|
+
assert_raise Serious::Article::InvalidFilename do
|
334
|
+
@article = Serious::Article.new('2009-12_12-foo-bar.txt')
|
335
|
+
end
|
336
|
+
end
|
337
|
+
end
|
264
338
|
end
|
data/test/test_bin.rb
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
#
|
5
|
+
# Tests for the serious executable
|
6
|
+
#
|
7
|
+
class TestBin < Test::Unit::TestCase
|
8
|
+
context "In tmp" do
|
9
|
+
setup do
|
10
|
+
@original_working_dir ||= Dir.getwd
|
11
|
+
Dir.chdir(File.dirname(__FILE__))
|
12
|
+
FileUtils.mkdir('tmp') if not File.exist?('tmp')
|
13
|
+
Dir.chdir('tmp')
|
14
|
+
end
|
15
|
+
|
16
|
+
when_running_serious_with '' do
|
17
|
+
should_print "Usage: serious DIRNAME"
|
18
|
+
should_print "Note: Only lowercase letters and dashes ('-') are allowed for DIRNAME"
|
19
|
+
end
|
20
|
+
|
21
|
+
when_running_serious_with '-foo-' do
|
22
|
+
should_print "Only lowercase-letters and '-' allowed in dirname!"
|
23
|
+
should_not_have_path '-foo-'
|
24
|
+
end
|
25
|
+
|
26
|
+
when_running_serious_with 'foo-123' do
|
27
|
+
should_print "Only lowercase-letters and '-' allowed in dirname!"
|
28
|
+
end
|
29
|
+
|
30
|
+
when_running_serious_with 'foo-ABC' do
|
31
|
+
should_print "Only lowercase-letters and '-' allowed in dirname!"
|
32
|
+
end
|
33
|
+
|
34
|
+
when_running_serious_with 'foo_bar' do
|
35
|
+
should_print "Only lowercase-letters and '-' allowed in dirname!"
|
36
|
+
end
|
37
|
+
|
38
|
+
when_running_serious_with 'foo' do
|
39
|
+
should_have_dir 'foo/articles'
|
40
|
+
should_have_dir 'foo/.git'
|
41
|
+
should_have_file 'foo/.gems', 'serious --version'
|
42
|
+
should_not_have_path 'foo/public'
|
43
|
+
should_not_have_path 'foo/views'
|
44
|
+
|
45
|
+
should "match git log with 'Initial commit'" do
|
46
|
+
Dir.chdir('foo')
|
47
|
+
assert_match /Initial commit/, `git log`
|
48
|
+
Dir.chdir('..')
|
49
|
+
end
|
50
|
+
|
51
|
+
should_have_file 'foo/config.ru' do |file|
|
52
|
+
should_contain "require 'serious'", file
|
53
|
+
should_contain "Serious.set :title, 'foo'", file
|
54
|
+
should_contain "Serious.set :author, 'Your Name here'", file
|
55
|
+
should_contain "Serious.set :url, 'http://foo.heroku.com'", file
|
56
|
+
should_contain "run Serious", file
|
57
|
+
end
|
58
|
+
|
59
|
+
should_have_file 'foo/Rakefile' do |file|
|
60
|
+
should_contain "require 'serious'", file
|
61
|
+
should_contain "require 'serious/tasks'", file
|
62
|
+
end
|
63
|
+
|
64
|
+
when_running_serious_with 'foo', '', false do
|
65
|
+
should("respond with 'foo exists!'") { assert_match /foo exists\!/, @output }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
when_running_serious_with 'public-included', '--public' do
|
70
|
+
should_have_dir 'public-included/articles'
|
71
|
+
should_not_have_path 'public-included/views'
|
72
|
+
should_have_file 'public-included/.gems'
|
73
|
+
should_have_file 'public-included/config.ru' do |file|
|
74
|
+
should_contain "Serious.set :public, File.join(Dir.getwd, 'public')"
|
75
|
+
should_not_contain ":views"
|
76
|
+
should_not_contain ":root"
|
77
|
+
end
|
78
|
+
should_have_file "public-included/public/css/serious.css"
|
79
|
+
end
|
80
|
+
|
81
|
+
when_running_serious_with 'views-included', '--views' do
|
82
|
+
should_have_dir 'views-included/articles'
|
83
|
+
should_not_have_path 'views-included/public'
|
84
|
+
should_have_file 'views-included/.gems'
|
85
|
+
should_have_file 'views-included/config.ru' do |file|
|
86
|
+
should_contain "Serious.set :views, File.join(Dir.getwd, 'views')"
|
87
|
+
should_not_contain ":public"
|
88
|
+
should_not_contain ":root"
|
89
|
+
end
|
90
|
+
should_have_file "views-included/views/layout.erb"
|
91
|
+
end
|
92
|
+
|
93
|
+
when_running_serious_with 'views-and-public', '--views --public' do
|
94
|
+
should_have_dir 'views-and-public/articles'
|
95
|
+
should_have_file 'views-and-public/.gems'
|
96
|
+
should_have_file 'views-and-public/config.ru' do |file|
|
97
|
+
should_contain "Serious.set :root, Dir.getwd"
|
98
|
+
should_not_contain ":public"
|
99
|
+
should_not_contain ":views"
|
100
|
+
end
|
101
|
+
should_have_file "views-and-public/public/css/serious.css"
|
102
|
+
should_have_file "views-and-public/views/layout.erb"
|
103
|
+
end
|
104
|
+
|
105
|
+
when_running_serious_with 'no-git', '--no-git' do
|
106
|
+
should_not_have_path 'no-git/.git'
|
107
|
+
end
|
108
|
+
|
109
|
+
teardown do
|
110
|
+
Dir.chdir(@original_working_dir)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Run this only once...
|
115
|
+
context "zzz" do
|
116
|
+
should "remove tmp at the end" do
|
117
|
+
FileUtils.rm_rf File.expand_path(File.join(File.dirname(__FILE__), 'tmp'))
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def serious(site_name="", arguments="", cache=true)
|
122
|
+
if cache
|
123
|
+
@cache ||= {}
|
124
|
+
return @cache[site_name] if @cache[site_name]
|
125
|
+
end
|
126
|
+
|
127
|
+
executable = File.expand_path(File.join(File.dirname(__FILE__), '..', '../../bin/serious'))
|
128
|
+
output = `#{executable} #{site_name} #{arguments}`
|
129
|
+
@cache[site_name] = output if cache
|
130
|
+
output
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
data/test/test_ruby_ext.rb
CHANGED
@@ -66,4 +66,14 @@ class TestRubyExt < Test::Unit::TestCase
|
|
66
66
|
should("return '4th' for 4.ordinal") { assert_equal '4th', 4.ordinal}
|
67
67
|
should("return '31st' for 31.ordinal") { assert_equal '31st', 31.ordinal}
|
68
68
|
|
69
|
+
# ========================================================================
|
70
|
+
# Tests for slugize
|
71
|
+
# ========================================================================
|
72
|
+
should_slugize 'Foo Bar Baz', 'foo-bar-baz'
|
73
|
+
should_slugize ' Foo Bar_Baz ', 'foo-bar-baz'
|
74
|
+
should_slugize 'A Crazy Title with: Special Chars!', 'a-crazy-title-with-special-chars'
|
75
|
+
should_slugize 'We have 0123 numbers in here', 'we-have-0123-numbers-in-here'
|
76
|
+
should_slugize 'and we have !? more special char$', 'and-we-have-more-special-char'
|
77
|
+
should_slugize 'should--squeeze$', 'should-squeeze'
|
78
|
+
|
69
79
|
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.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christoph Olszowka
|
@@ -92,8 +92,11 @@ files:
|
|
92
92
|
- lib/ruby_ext.rb
|
93
93
|
- lib/serious.rb
|
94
94
|
- lib/serious/article.rb
|
95
|
+
- lib/serious/tasks.rb
|
95
96
|
- lib/site/public/css/coderay.css
|
96
97
|
- lib/site/public/css/serious.css
|
98
|
+
- lib/site/public/fonts/YanoneKaffeesatz-Thin.otf
|
99
|
+
- lib/site/public/fonts/vollkorn.otf
|
97
100
|
- lib/site/views/404.erb
|
98
101
|
- lib/site/views/_archives.erb
|
99
102
|
- lib/site/views/_article.erb
|
@@ -110,6 +113,7 @@ files:
|
|
110
113
|
- test/articles/2009-12-24-merry-christmas.txt
|
111
114
|
- test/helper.rb
|
112
115
|
- test/test_article.rb
|
116
|
+
- test/test_bin.rb
|
113
117
|
- test/test_ruby_ext.rb
|
114
118
|
- test/test_serious.rb
|
115
119
|
has_rdoc: true
|
@@ -141,6 +145,7 @@ signing_key:
|
|
141
145
|
specification_version: 3
|
142
146
|
summary: Serious is a simple, file-driven blog engine inspired by toto and driven by sinatra
|
143
147
|
test_files:
|
148
|
+
- test/test_bin.rb
|
144
149
|
- test/test_serious.rb
|
145
150
|
- test/helper.rb
|
146
151
|
- test/test_ruby_ext.rb
|