postview 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY +67 -0
- data/INFO +14 -0
- data/LICENSE +0 -0
- data/README.rdoc +103 -0
- data/Rakefile +174 -0
- data/VERSION +8 -0
- data/bin/postview +51 -0
- data/lib/postview.rb +68 -0
- data/lib/postview/about.rb +34 -0
- data/lib/postview/application.rb +130 -0
- data/lib/postview/cli.rb +71 -0
- data/lib/postview/cli/create_command.rb +362 -0
- data/lib/postview/cli/server_command.rb +115 -0
- data/lib/postview/helpers.rb +21 -0
- data/lib/postview/patches.rb +11 -0
- data/lib/postview/settings.rb +107 -0
- data/lib/postview/site.rb +51 -0
- data/lib/postview/version.rb +27 -0
- data/tasks/documentation.rake +21 -0
- data/tasks/history.rake +7 -0
- data/tasks/homepage.rake +10 -0
- data/tasks/package.rake +11 -0
- data/tasks/version.rake +56 -0
- data/test/application_test.rb +122 -0
- data/test/extensions.rb +23 -0
- data/test/fixtures/application/config.ru +6 -0
- data/test/fixtures/application/config/settings.yml +22 -0
- data/test/fixtures/application/empty.yml +0 -0
- data/test/fixtures/application/posts/20090529-postview_blogware.ruby.sinatra.mkd +4 -0
- data/test/fixtures/application/posts/20090602-postview_blogware.ruby.sinatra.mkd +4 -0
- data/test/fixtures/application/posts/archive/20080529-postview_blogware.ruby.sinatra.mkd +4 -0
- data/test/fixtures/application/posts/archive/20080602-postview_blogware.ruby.sinatra.mkd +4 -0
- data/test/fixtures/application/posts/drafts/20090730-draft_postview_blogware.ruby.sinatra.mkd +4 -0
- data/test/fixtures/application/themes/gemstone/about.erb +0 -0
- data/test/fixtures/application/themes/gemstone/archive/index.erb +0 -0
- data/test/fixtures/application/themes/gemstone/archive/show.erb +17 -0
- data/test/fixtures/application/themes/gemstone/images/banners/banner.jpg +0 -0
- data/test/fixtures/application/themes/gemstone/images/favicon.ico +0 -0
- data/test/fixtures/application/themes/gemstone/images/trojan.com +0 -0
- data/test/fixtures/application/themes/gemstone/index.erb +0 -0
- data/test/fixtures/application/themes/gemstone/javascripts/gemstone.js +1 -0
- data/test/fixtures/application/themes/gemstone/layout.erb +0 -0
- data/test/fixtures/application/themes/gemstone/posts/index.erb +0 -0
- data/test/fixtures/application/themes/gemstone/posts/show.erb +0 -0
- data/test/fixtures/application/themes/gemstone/search.erb +0 -0
- data/test/fixtures/application/themes/gemstone/stylesheets/gemstone.css +1 -0
- data/test/fixtures/application/themes/gemstone/tags/index.erb +0 -0
- data/test/fixtures/application/themes/gemstone/tags/show.erb +0 -0
- data/test/helper.rb +9 -0
- data/test/settings_test.rb +72 -0
- data/test/site_test.rb +62 -0
- data/themes/default/about.erb +24 -0
- data/themes/default/archive/index.erb +21 -0
- data/themes/default/archive/show.erb +17 -0
- data/themes/default/error.erb +0 -0
- data/themes/default/images/favicon.ico +0 -0
- data/themes/default/images/logo.png +0 -0
- data/themes/default/images/navigation-bar.gif +0 -0
- data/themes/default/images/postview.png +0 -0
- data/themes/default/images/rack.png +0 -0
- data/themes/default/images/ruby.png +0 -0
- data/themes/default/images/sinatra.png +0 -0
- data/themes/default/index.erb +38 -0
- data/themes/default/layout.erb +117 -0
- data/themes/default/posts/index.erb +21 -0
- data/themes/default/posts/show.erb +17 -0
- data/themes/default/search.erb +40 -0
- data/themes/default/stylesheets/postview.css +238 -0
- data/themes/default/tags/index.erb +12 -0
- data/themes/default/tags/show.erb +40 -0
- metadata +158 -0
@@ -0,0 +1,122 @@
|
|
1
|
+
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/..")
|
2
|
+
|
3
|
+
require 'lib/postview'
|
4
|
+
require 'test/unit'
|
5
|
+
require 'rack/test'
|
6
|
+
require 'test/helper'
|
7
|
+
|
8
|
+
class TestApplication < Test::Unit::TestCase
|
9
|
+
|
10
|
+
include Rack::Test::Methods
|
11
|
+
|
12
|
+
def app
|
13
|
+
@app = Postview::Application
|
14
|
+
|
15
|
+
@app.set :root, "#{File.dirname(__FILE__)}/.."
|
16
|
+
@app.set :environment, :test
|
17
|
+
@app
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_should_return_ok_for_theme_resources
|
21
|
+
get app.theme_path "/images/favicon.ico" do |response|
|
22
|
+
assert response.ok?
|
23
|
+
assert_equal "http://example.org/images/favicon.ico/", last_request.url
|
24
|
+
end
|
25
|
+
|
26
|
+
get app.theme_path "/javascripts/gemstone.js" do |response|
|
27
|
+
assert response.ok?
|
28
|
+
assert_equal "http://example.org/javascripts/gemstone.js/", last_request.url
|
29
|
+
end
|
30
|
+
|
31
|
+
get app.theme_path "/stylesheets/gemstone.css" do |response|
|
32
|
+
assert response.ok?
|
33
|
+
assert_equal "http://example.org/stylesheets/gemstone.css/", last_request.url
|
34
|
+
end
|
35
|
+
|
36
|
+
get app.theme_path "/images/banners/banner.jpg" do |response|
|
37
|
+
assert response.ok?
|
38
|
+
assert_equal "http://example.org/images/banners/banner.jpg/", last_request.url
|
39
|
+
end
|
40
|
+
|
41
|
+
# TOFIX: Fix test to check security.
|
42
|
+
get app.theme_path "/images/trojan.com" do |response|
|
43
|
+
#assert !response.ok?
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_should_return_ok_in_root_path
|
48
|
+
get app.root_path do |response|
|
49
|
+
assert response.ok?
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_should_return_ok_in_posts_path
|
54
|
+
get app.posts_path do |response|
|
55
|
+
assert response.ok?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_should_return_ok_in_posts_path_with_params
|
60
|
+
get app.posts_path "/2009/06/02/postview_blogware" do |response|
|
61
|
+
assert response.ok?
|
62
|
+
assert_equal "http://example.org/posts/2009/06/02/postview_blogware/", last_request.url
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_should_return_ok_in_tags_path
|
67
|
+
get app.tags_path do |response|
|
68
|
+
assert response.ok?
|
69
|
+
assert_equal "http://example.org/tags/", last_request.url
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_should_return_ok_in_tags_path_with_params
|
74
|
+
get app.tags_path "ruby" do |response|
|
75
|
+
assert response.ok?
|
76
|
+
assert_equal "http://example.org/tags/ruby/", last_request.url
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_should_return_ok_in_archive_path
|
81
|
+
get app.archive_path do |response|
|
82
|
+
assert response.ok?
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_should_return_ok_in_archive_path_with_params
|
87
|
+
get app.archive_path "2008/06/02/postview_blogware" do |response|
|
88
|
+
assert response.ok?
|
89
|
+
assert_equal "http://example.org/archive/2008/06/02/postview_blogware/", last_request.url
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_should_return_ok_in_drafts_path
|
94
|
+
get app.drafts_path do |response|
|
95
|
+
assert response.ok?
|
96
|
+
assert_equal "http://example.org/drafts/", last_request.url
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_should_return_ok_in_drafts_path_with_params
|
101
|
+
get app.drafts_path "2009/07/30/draft_postview_blogware" do |response|
|
102
|
+
assert response.ok?
|
103
|
+
assert_equal "http://example.org/drafts/2009/07/30/draft_postview_blogware/", last_request.url
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_should_return_ok_in_about_path
|
108
|
+
get app.about_path do |response|
|
109
|
+
assert response.ok?
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_should_return_ok_in_search_path
|
114
|
+
get app.search_path, :anythink => "postview" do |response|
|
115
|
+
assert response.ok?
|
116
|
+
assert_equal "postview", last_request.params.values.to_s
|
117
|
+
assert_equal "http://example.org/search/?anythink=postview", last_request.url
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
data/test/extensions.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# This code extracted from book "Ruby Best Practices" and the code be found
|
2
|
+
# in http://github.com/sandal/rbp/blob/master/testing/test_unit_extensions.rb
|
3
|
+
module Test::Unit
|
4
|
+
# Used to fix a minor minitest/unit incompatibility in flexmock
|
5
|
+
AssertionFailedError = Class.new(StandardError)
|
6
|
+
|
7
|
+
class TestCase
|
8
|
+
|
9
|
+
def self.must(name, &block)
|
10
|
+
test_name = "test_#{name.gsub(/\s+/,'_')}".to_sym
|
11
|
+
defined = instance_method(test_name) rescue false
|
12
|
+
raise "#{test_name} is already defined in #{self}" if defined
|
13
|
+
if block_given?
|
14
|
+
define_method(test_name, &block)
|
15
|
+
else
|
16
|
+
define_method(test_name) do
|
17
|
+
flunk "No implementation provided for #{name}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
:site:
|
3
|
+
:author: Jack Ducklet
|
4
|
+
:domain: jackd.example.com
|
5
|
+
:directory: path/to/site
|
6
|
+
:email: jack.ducklet@example.com
|
7
|
+
:title: Postview
|
8
|
+
:theme: default
|
9
|
+
:subtitle: Post your articles
|
10
|
+
:theme: gemstone
|
11
|
+
:directories:
|
12
|
+
:posts: posts
|
13
|
+
:archive: posts/archive
|
14
|
+
:drafts: posts/drafts
|
15
|
+
:sections:
|
16
|
+
:about: about
|
17
|
+
:posts: posts
|
18
|
+
:root: /
|
19
|
+
:archive: archive
|
20
|
+
:search: search
|
21
|
+
:tags: tags
|
22
|
+
:drafts: drafts
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<div class="entry">
|
2
|
+
|
3
|
+
<h1><%= link_to post.title, posts_path, post %></h1>
|
4
|
+
|
5
|
+
<span class="entry-meta">
|
6
|
+
Published at <%= post.publish_date.strftime('%A, %B %d, %Y') %>,
|
7
|
+
tagged with <%= post.tags.map{ |tag| link_to tag.capitalize, tags_path, tag, :title => tag.capitalize }.join(', ') %>.
|
8
|
+
</span>
|
9
|
+
|
10
|
+
<div class="text">
|
11
|
+
|
12
|
+
<%= post.content %>
|
13
|
+
|
14
|
+
</div><!--text-->
|
15
|
+
|
16
|
+
</div><!--entry-->
|
17
|
+
|
File without changes
|
Binary file
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
gemstone='gemstone'
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
body { }
|
File without changes
|
File without changes
|
data/test/helper.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/..")
|
2
|
+
|
3
|
+
require 'lib/postview'
|
4
|
+
require 'test/unit'
|
5
|
+
require 'test/helper'
|
6
|
+
|
7
|
+
class SettingsTest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@attributes = {
|
11
|
+
:site => {
|
12
|
+
:title => "Postview",
|
13
|
+
:subtitle => "Post your articles",
|
14
|
+
:author => "Jack Ducklet",
|
15
|
+
:email => "jack.ducklet@example.com",
|
16
|
+
:domain => "jackd.example.com",
|
17
|
+
:directory => "path/to/site",
|
18
|
+
:theme => "gemstone"
|
19
|
+
},
|
20
|
+
:directories => {
|
21
|
+
:posts => "posts",
|
22
|
+
:archive => "posts/archive",
|
23
|
+
:drafts => "posts/drafts"
|
24
|
+
},
|
25
|
+
:sections => {
|
26
|
+
:root => "/",
|
27
|
+
:posts => "posts",
|
28
|
+
:tags => "tags",
|
29
|
+
:archive => "archive",
|
30
|
+
:drafts => "drafts",
|
31
|
+
:search => "search",
|
32
|
+
:about => "about"
|
33
|
+
}
|
34
|
+
}
|
35
|
+
@settings = Postview::Settings.load
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_should_check_settings
|
39
|
+
@attributes.each do |method, values|
|
40
|
+
values.collect do |key, value|
|
41
|
+
assert_equal value, @settings.send(method)[key]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_should_build_site
|
47
|
+
assert_not_nil @settings.build_site
|
48
|
+
assert_not_nil @settings.build_site.find
|
49
|
+
assert_not_nil @settings.build_site.find_archived
|
50
|
+
assert_not_nil @settings.build_site.find_drafted
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_should_rescue_exception_and_load_defaults
|
54
|
+
settings = Postview::Settings.load_file("file/not/found.yml")
|
55
|
+
@attributes.each do |method, values|
|
56
|
+
values.collect do |key, value|
|
57
|
+
assert_equal value, @settings.send(method)[key]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_should_rescue_exception_for_empty_file_and_load_defaults
|
63
|
+
settings = Postview::Settings.load_file("#{Postview::ROOT}/test/fixtures/empty.yml")
|
64
|
+
@attributes.each do |method, values|
|
65
|
+
values.collect do |key, value|
|
66
|
+
assert_not_nil settings.send(method)[key]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
data/test/site_test.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/..")
|
2
|
+
|
3
|
+
require 'lib/postview'
|
4
|
+
require 'test/unit'
|
5
|
+
require 'test/helper'
|
6
|
+
require 'test/extensions'
|
7
|
+
|
8
|
+
class TestSite < Test::Unit::TestCase
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@site = Postview::Settings.load.build_site
|
12
|
+
end
|
13
|
+
|
14
|
+
must "check all attributes" do
|
15
|
+
assert_equal 'Postview', @site.title
|
16
|
+
assert_equal 'Post your articles', @site.subtitle
|
17
|
+
assert_equal 'Jack Ducklet', @site.author
|
18
|
+
assert_equal 'jack.ducklet@example.com', @site.email
|
19
|
+
assert_equal 'jackd.example.com', @site.domain
|
20
|
+
assert_equal 'path/to/site', @site.directory
|
21
|
+
assert_equal 'gemstone', @site.theme
|
22
|
+
end
|
23
|
+
|
24
|
+
must "find all posts" do
|
25
|
+
posts = @site.find.all_posts
|
26
|
+
assert_not_nil posts
|
27
|
+
assert_equal 2, posts.size
|
28
|
+
posts.collect do |post|
|
29
|
+
assert_match %r{\d{4}\d{4}-(\.*)\.*}, post.file.to_s
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
must "find all tags" do
|
34
|
+
tags = @site.find.all_tags
|
35
|
+
assert_not_nil tags
|
36
|
+
assert_equal 2, tags.size
|
37
|
+
end
|
38
|
+
|
39
|
+
must "find all archived posts" do
|
40
|
+
assert 2, @site.find_archived.all_posts.size
|
41
|
+
@site.find_archived.all_posts.collect do |post|
|
42
|
+
assert_match %r{\d{4}\d{4}-(\.*)\.*}, post.file.to_s
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
must "find all drafts" do
|
47
|
+
assert 1, @site.find_drafted.all_posts.size
|
48
|
+
@site.find_drafted.all_posts.collect do |draft|
|
49
|
+
assert_match %r{\d{4}\d{4}-(\.*)\.*}, draft.file.to_s
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
must "find one post" do
|
54
|
+
assert_not_nil @site.find.post(*%w(2009 06 02 postview))
|
55
|
+
end
|
56
|
+
|
57
|
+
must "search posts" do
|
58
|
+
assert 2, @site.find.posts('postview').size
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<div class="entry">
|
2
|
+
|
3
|
+
<h1><%= link_to title_path(:about, site.title), :about %></h1>
|
4
|
+
|
5
|
+
<div class="text">
|
6
|
+
|
7
|
+
<%=Postview::About.to_html%>
|
8
|
+
|
9
|
+
<p>
|
10
|
+
<%=Postview.name%> uses the following libraries/projects:
|
11
|
+
</p>
|
12
|
+
|
13
|
+
<ul>
|
14
|
+
<li><%=link_to "#{Rack.name} v#{Rack::version}", "http://rack.rubyforge.org/"%></li>
|
15
|
+
<li><%=link_to "#{Sinatra.name} v#{Sinatra::VERSION}", "http://www.sinatrarb.com/"%></li>
|
16
|
+
<li><%=link_to "#{Sinatra::Mapping.name}", "http://sinatra-mapping.rubyforge.org/"%></li>
|
17
|
+
<li><%=link_to "#{Maruku.name} v#{Maruku::VERSION}", "http://maruku.rubyforge.org/"%></li>
|
18
|
+
<li><%=link_to "#{Postage::Version}", "http://postage.rubyforge.org/"%></li>
|
19
|
+
</ul>
|
20
|
+
|
21
|
+
</div><!--text-->
|
22
|
+
|
23
|
+
</div><!--entry-->
|
24
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<div class="entry">
|
2
|
+
|
3
|
+
<h1><%=title_path :archive%></h1>
|
4
|
+
|
5
|
+
<div class="text">
|
6
|
+
|
7
|
+
<dl>
|
8
|
+
<% for post in posts %>
|
9
|
+
<dt>
|
10
|
+
<b><%=link_to "#{post.publish_date} - #{post.title}", archive_path, post, :title => post.title%></b>
|
11
|
+
(<%= post.tags.map{ |tag| link_to tag.capitalize, tags_path, tag, :title => tag.capitalize }.join(', ') %>)
|
12
|
+
</dt>
|
13
|
+
|
14
|
+
<dd>
|
15
|
+
<%=post.summary%>
|
16
|
+
</dd>
|
17
|
+
<% end %>
|
18
|
+
</dl>
|
19
|
+
</div><!--text-->
|
20
|
+
</div><!--entry-->
|
21
|
+
|