postview 0.8.1 → 0.9.0

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 (110) hide show
  1. data/ABOUT +9 -0
  2. data/HISTORY +27 -1
  3. data/Rakefile +3 -1
  4. data/VERSION +4 -4
  5. data/bin/postview +2 -2
  6. data/lib/postview.rb +64 -13
  7. data/lib/postview/application.rb +34 -21
  8. data/lib/postview/authentication.rb +36 -0
  9. data/lib/postview/cli.rb +10 -0
  10. data/lib/postview/cli/create_command.rb +53 -37
  11. data/lib/postview/cli/server_command.rb +2 -2
  12. data/lib/postview/extensions.rb +10 -0
  13. data/lib/postview/helpers.rb +3 -0
  14. data/lib/postview/settings.rb +19 -17
  15. data/lib/postview/site.rb +13 -1
  16. data/lib/postview/version.rb +1 -1
  17. data/tasks/package.rake +80 -2
  18. data/test/application_test.rb +29 -14
  19. data/test/{extensions.rb → customizations.rb} +1 -0
  20. data/test/fixtures/application/config/settings.yml +4 -1
  21. data/test/fixtures/application/themes/{gemstone → mytheme}/images/banners/banner.jpg +0 -0
  22. data/test/fixtures/application/themes/{gemstone → mytheme}/images/favicon.ico +0 -0
  23. data/test/fixtures/application/themes/{gemstone → mytheme}/images/logo.png +0 -0
  24. data/test/fixtures/application/themes/{gemstone → mytheme}/images/navigation-bar.gif +0 -0
  25. data/test/fixtures/application/themes/{gemstone → mytheme}/images/postview.png +0 -0
  26. data/test/fixtures/application/themes/{gemstone → mytheme}/images/rack.png +0 -0
  27. data/test/fixtures/application/themes/{gemstone → mytheme}/images/ruby.png +0 -0
  28. data/test/fixtures/application/themes/{gemstone → mytheme}/images/sinatra.png +0 -0
  29. data/test/fixtures/application/themes/{gemstone → mytheme}/images/trojan.com +0 -0
  30. data/test/fixtures/application/themes/{gemstone/javascripts/gemstone.js → mytheme/javascripts/postview.js} +0 -0
  31. data/test/fixtures/application/themes/{gemstone → mytheme}/stylesheets/gemstone.css +0 -0
  32. data/test/fixtures/application/themes/{gemstone → mytheme}/stylesheets/postview.css +0 -0
  33. data/test/fixtures/application/themes/mytheme/templates/about.erb +1 -0
  34. data/test/fixtures/application/themes/mytheme/templates/archive/index.erb +3 -0
  35. data/test/fixtures/application/themes/mytheme/templates/archive/show.erb +1 -0
  36. data/test/fixtures/application/themes/mytheme/templates/drafts/index.erb +3 -0
  37. data/test/fixtures/application/themes/mytheme/templates/drafts/show.erb +1 -0
  38. data/test/fixtures/application/themes/mytheme/templates/error.erb +1 -0
  39. data/test/fixtures/application/themes/mytheme/templates/index.erb +3 -0
  40. data/{themes/default → test/fixtures/application/themes/mytheme/templates}/layout.erb +2 -2
  41. data/test/fixtures/application/themes/mytheme/templates/posts/index.erb +3 -0
  42. data/test/fixtures/application/themes/mytheme/templates/posts/show.erb +1 -0
  43. data/test/fixtures/application/themes/mytheme/templates/search.erb +6 -0
  44. data/test/fixtures/application/themes/mytheme/templates/tags/index.erb +3 -0
  45. data/test/fixtures/application/themes/mytheme/templates/tags/show.erb +6 -0
  46. data/test/fixtures/site/blog/config.ru +6 -0
  47. data/test/fixtures/site/blog/config/settings.yml +25 -0
  48. data/test/fixtures/{application/themes/gemstone/error.erb → site/blog/empty.yml} +0 -0
  49. data/test/fixtures/site/blog/posts/20090529-third_article.t1.t2.t3.mkd +4 -0
  50. data/test/fixtures/site/blog/posts/20090602-fourth_article.t1.t2.t3.t4.mkd +4 -0
  51. data/test/fixtures/site/blog/posts/archive/20080529-first_article.t1.mkd +4 -0
  52. data/test/fixtures/site/blog/posts/archive/20080602-second_article.t1.t2.mkd +4 -0
  53. data/test/fixtures/site/blog/posts/drafts/20090730-fifth_article.t1.t2.t3.t4.t5.mkd +4 -0
  54. data/{themes/default/error.erb → test/fixtures/site/themes/mytheme/images/banners/banner.jpg} +0 -0
  55. data/test/fixtures/site/themes/mytheme/images/favicon.ico +0 -0
  56. data/test/fixtures/site/themes/mytheme/images/logo.png +0 -0
  57. data/test/fixtures/site/themes/mytheme/images/navigation-bar.gif +0 -0
  58. data/test/fixtures/site/themes/mytheme/images/postview.png +0 -0
  59. data/test/fixtures/site/themes/mytheme/images/rack.png +0 -0
  60. data/test/fixtures/site/themes/mytheme/images/ruby.png +0 -0
  61. data/test/fixtures/site/themes/mytheme/images/sinatra.png +0 -0
  62. data/test/fixtures/site/themes/mytheme/images/trojan.com +0 -0
  63. data/test/fixtures/site/themes/mytheme/javascripts/postview.js +1 -0
  64. data/test/fixtures/site/themes/mytheme/stylesheets/gemstone.css +1 -0
  65. data/test/fixtures/site/themes/mytheme/stylesheets/postview.css +238 -0
  66. data/test/fixtures/site/themes/mytheme/templates/about.erb +1 -0
  67. data/test/fixtures/site/themes/mytheme/templates/archive/index.erb +3 -0
  68. data/test/fixtures/site/themes/mytheme/templates/archive/show.erb +1 -0
  69. data/test/fixtures/site/themes/mytheme/templates/drafts/index.erb +3 -0
  70. data/test/fixtures/site/themes/mytheme/templates/drafts/show.erb +1 -0
  71. data/test/fixtures/site/themes/mytheme/templates/error.erb +1 -0
  72. data/test/fixtures/site/themes/mytheme/templates/index.erb +3 -0
  73. data/test/fixtures/{application/themes/gemstone → site/themes/mytheme/templates}/layout.erb +20 -14
  74. data/test/fixtures/site/themes/mytheme/templates/posts/index.erb +3 -0
  75. data/test/fixtures/site/themes/mytheme/templates/posts/show.erb +1 -0
  76. data/test/fixtures/site/themes/mytheme/templates/search.erb +6 -0
  77. data/test/fixtures/site/themes/mytheme/templates/tags/index.erb +3 -0
  78. data/test/fixtures/site/themes/mytheme/templates/tags/show.erb +6 -0
  79. data/test/helpers_test.rb +1 -2
  80. data/test/settings_test.rb +12 -3
  81. data/test/site_test.rb +3 -4
  82. data/themes/default/stylesheets/postview.css +1 -0
  83. data/themes/default/{about.erb → templates/about.erb} +1 -1
  84. data/{test/fixtures/application/themes/gemstone → themes/default/templates}/archive/index.erb +0 -0
  85. data/{test/fixtures/application/themes/gemstone → themes/default/templates}/archive/show.erb +0 -0
  86. data/{test/fixtures/application/themes/gemstone → themes/default/templates}/drafts/index.erb +1 -1
  87. data/{test/fixtures/application/themes/gemstone → themes/default/templates}/drafts/show.erb +0 -0
  88. data/themes/default/templates/error.erb +13 -0
  89. data/themes/default/{index.erb → templates/index.erb} +1 -1
  90. data/themes/default/templates/layout.erb +130 -0
  91. data/{test/fixtures/application/themes/gemstone → themes/default/templates}/posts/index.erb +0 -0
  92. data/{test/fixtures/application/themes/gemstone → themes/default/templates}/posts/show.erb +0 -0
  93. data/{test/fixtures/application/themes/gemstone → themes/default/templates}/search.erb +0 -0
  94. data/{test/fixtures/application/themes/gemstone → themes/default/templates}/tags/index.erb +0 -0
  95. data/{test/fixtures/application/themes/gemstone → themes/default/templates}/tags/show.erb +0 -0
  96. metadata +164 -61
  97. data/INFO +0 -14
  98. data/lib/postview/about.rb +0 -34
  99. data/test/fixtures/application/themes/gemstone/about.erb +0 -22
  100. data/test/fixtures/application/themes/gemstone/index.erb +0 -38
  101. data/test/helper.rb +0 -9
  102. data/themes/default/archive/index.erb +0 -21
  103. data/themes/default/archive/show.erb +0 -17
  104. data/themes/default/drafts/index.erb +0 -21
  105. data/themes/default/drafts/show.erb +0 -17
  106. data/themes/default/posts/index.erb +0 -21
  107. data/themes/default/posts/show.erb +0 -17
  108. data/themes/default/search.erb +0 -40
  109. data/themes/default/tags/index.erb +0 -12
  110. data/themes/default/tags/show.erb +0 -40
@@ -47,7 +47,7 @@ private
47
47
  @arguments.summary_indent = " "
48
48
  @arguments.summary_width = 24
49
49
  @arguments.banner = <<-end_banner.gsub(/^[ ]{6}/, '')
50
- #{Postview::Version}
50
+ #{Postview::version_summary}
51
51
 
52
52
  Usage:
53
53
  #{Postview.name.downcase} server <path> [options]
@@ -68,7 +68,7 @@ private
68
68
  puts error
69
69
  puts @arguments
70
70
  end
71
- puts "#{Postview::Version}\n\n"
71
+ puts "#{Postview::version_summary}\n\n"
72
72
  end
73
73
 
74
74
  def load_server
@@ -6,3 +6,13 @@ class Array
6
6
  end
7
7
 
8
8
  end
9
+
10
+ class String
11
+
12
+ # Clean all spaces, non-words and digits.
13
+ def clean
14
+ gsub(/[ \W\d]/,'').downcase
15
+ end
16
+
17
+ end
18
+
@@ -33,6 +33,9 @@ module Helpers
33
33
  # All archived posts found by search.
34
34
  attr_reader :archived_posts_found
35
35
 
36
+ # HTTP status error message
37
+ attr_reader :error_message
38
+
36
39
  # Returns latest posts.
37
40
  def latest_posts(limit = 5)
38
41
  @all_posts.limit(limit) || []
@@ -7,16 +7,18 @@ class Settings
7
7
  :site => {
8
8
  :title => "Postview",
9
9
  :subtitle => "Post your articles",
10
- :author => "Hallison Batista",
11
- :email => "email@example.com",
10
+ :author => "Postview",
11
+ :email => "postview@example.com",
12
12
  :domain => "example.com",
13
13
  :directory => "/var/www/example",
14
- :theme => "default"
14
+ :theme => "default",
15
+ :token => "e44257415827b00557ae5505f93e112d6158c4ba3c567aefbbff47288c6bf7cd" # Password: admin
15
16
  },
16
17
  :directories => {
17
18
  :posts => "posts",
18
19
  :archive => "posts/archive",
19
- :drafts => "posts/drafts"
20
+ :drafts => "posts/drafts",
21
+ :themes => "themes"
20
22
  },
21
23
  :sections => {
22
24
  :root => "/",
@@ -25,14 +27,14 @@ class Settings
25
27
  :archive => "/archive",
26
28
  :drafts => "/drafts",
27
29
  :search => "/search",
28
- :about => "/about"
30
+ :about => "/about",
31
+ :manager => "/manager"
29
32
  }
30
33
  }
31
34
  FILE_NAME = "settings.yml"
32
35
  FILE_DIR = "config"
33
- FILE = Postview::PATH.join(FILE_DIR, FILE_NAME)
34
36
 
35
- attr_reader :site, :theme, :directories, :sections
37
+ attr_reader :site, :directories, :sections
36
38
 
37
39
  # Initialize the settings using attributes passed by arguments.
38
40
  # Only attributes valid are read. See DEFAULTS.
@@ -63,12 +65,12 @@ class Settings
63
65
 
64
66
  # Build a specific finder for directory.
65
67
  def build_finder_for(directory)
66
- Postage::Finder.new(directory_for(directory))
68
+ Postage::Finder.new(path_to(directory))
67
69
  end
68
70
 
69
71
  # Load a default settings values from file placed in +config/settings.yml+.
70
72
  def self.load
71
- load_file(FILE)
73
+ load_file(file)
72
74
  end
73
75
 
74
76
  # Load a specific settings file.
@@ -89,25 +91,25 @@ class Settings
89
91
 
90
92
  # Build settings file using DEFAULTS.
91
93
  def self.build_default_file
92
- FILE.open "w+" do |file|
94
+ file.open "w+" do |file|
93
95
  file << DEFAULTS.to_yaml
94
- end unless FILE.exist?
96
+ end unless file.exist?
95
97
  end
96
98
 
97
99
  # Returns settings file.
98
- def file
99
- FILE
100
+ def self.file
101
+ Postview::path.join(FILE_DIR, FILE_NAME)
100
102
  end
101
103
 
102
104
  # Check directory and returns file that matches with a pattern.
103
- def file_names_for(directory, pattern = "**.*")
104
- directory_for(directory, pattern)
105
+ def file_names_from(directory, pattern = "**.*")
106
+ path_to(directory, pattern)
105
107
  end
106
108
 
107
109
  # Returns a valid directory loaded from settings file.
108
- def directory_for(name, *paths)
110
+ def path_to(name, *paths)
109
111
  return Pathname.new(directories[name], *paths) if directories[name].match(%r{^/.*})
110
- PATH.join(directories[name], *paths)
112
+ Postview::path.join(directories[name], *paths)
111
113
  end
112
114
 
113
115
  # Parse all attributes to hash.
data/lib/postview/site.rb CHANGED
@@ -24,6 +24,9 @@ class Site
24
24
  # Theme directory name.
25
25
  attr_accessor :theme
26
26
 
27
+ # Token pass.
28
+ attr_accessor :token
29
+
27
30
  # Finder for posts
28
31
  attr_accessor :find
29
32
 
@@ -49,7 +52,6 @@ class Site
49
52
  end
50
53
 
51
54
  # Find all posts tagged with a specific tag.
52
- # Returns two lists: posts and archived posts.
53
55
  def find_all_posts_tagged_with(tag)
54
56
  [ find.all_posts_by_tag(tag), find_in_archive.all_posts_by_tag(tag) ]
55
57
  end
@@ -60,6 +62,16 @@ class Site
60
62
  [ find.posts(*values), find_in_archive.posts(*values) ]
61
63
  end
62
64
 
65
+ # Check authentication for user.
66
+ def authenticate?(username, password)
67
+ @token == self.class.tokenize(username, password, domain)
68
+ end
69
+
70
+ # Generate digest token.
71
+ def self.tokenize(username, password, domain)
72
+ Digest::SHA256.hexdigest("$#{username}?#{password}@#{domain}")
73
+ end
74
+
63
75
  end # class Site
64
76
 
65
77
  end #module Postview
@@ -16,7 +16,7 @@ module Version #:nodoc: all
16
16
  end
17
17
 
18
18
  def to_s
19
- "#{name.sub(/::.*/,'')} v#{tag} (#{info.date.strftime('%B, %d %Y')}, #{info.cycle})"
19
+ "#{name.sub(/::.*/,'')} v#{tag} (#{info.date.strftime('%B %d, %Y')}, #{info.cycle})"
20
20
  end
21
21
 
22
22
  end
data/tasks/package.rake CHANGED
@@ -1,8 +1,86 @@
1
1
  require 'rake/gempackagetask'
2
2
 
3
+ def files
4
+ #`git ls-files`.split.sort.reject{ |out| out =~ /^\./ || out =~ /^doc/ }
5
+ @files ||= OpenStruct.new :documents => Dir[*%w{ABOUT HISTORY LICENSE Rakefile VERSION README.rdoc}],
6
+ :binaries => Dir[*%w{{bin,scripts}/**}],
7
+ :libraries => Dir[*%w{{lib,tasks}/**/**.rb tasks/**/**.rake}],
8
+ :tests => Dir[*%w{test/**.rb test/fixtures/**/**}],
9
+ :resources => Dir[*%w{themes/**/**}]
10
+ end
11
+
12
+ def manifest
13
+ files.documents +
14
+ files.binaries +
15
+ files.libraries +
16
+ files.tests +
17
+ files.resources
18
+ end
19
+
3
20
  def gemspec
4
- load 'postview.gemspec' unless @gemspec
5
- @gemspec
21
+ @gemspec ||= Gem::Specification.new do |spec|
22
+
23
+ # Global information
24
+ spec.platform = Gem::Platform::RUBY
25
+ spec.executable = "postview"
26
+ spec.name = Postview.name.downcase
27
+ spec.version = Postview::version_tag
28
+ spec.date = Postview::version_spec.date.to_s
29
+ spec.summary = Postview::about_info.summary
30
+ spec.description = Postview::about_info.description
31
+ spec.authors = Postview::about_info.authors
32
+ spec.email = Postview::about_info.email
33
+ spec.homepage = Postview::about_info.homepage
34
+
35
+ # Dependencies
36
+ spec.add_dependency "sinatra", ">= 0.9.1.1"
37
+ spec.add_dependency "sinatra-mapping", ">= 1.0.5"
38
+ spec.add_dependency "postage", ">= 0.1.4.1"
39
+
40
+ spec.files = manifest
41
+ spec.require_paths = ["lib"]
42
+ spec.test_files = files.tests
43
+ spec.has_rdoc = true
44
+ spec.extra_rdoc_files = %w{README.rdoc LICENSE}
45
+ spec.rdoc_options = [
46
+ "--line-numbers",
47
+ "--inline-source",
48
+ "--title", Postview::version_summary,
49
+ "--main", "README.rdoc"
50
+ ]
51
+ spec.rubyforge_project = spec.name
52
+ spec.rubygems_version = Gem::VERSION
53
+ spec.post_install_message = <<-end_message.gsub(/^[ ]{6}/,'')
54
+ #{'-'*78}
55
+ #{Postview::version_summary}
56
+
57
+ Thanks for use this lightweight blogware. Now, you can read your posts by
58
+ editing in your favorite editor.
59
+
60
+ Please, feedback in http://github.com/hallison/postview/issues.
61
+ #{'-'*78}
62
+ end_message
63
+ end
64
+ end
65
+
66
+ def gemspec_file
67
+ @gemspec_file ||= Pathname.new("#{gemspec.name}.gemspec")
68
+ end
69
+
70
+ namespace :gem do
71
+
72
+ file gemspec_file.to_s => gemspec.files do
73
+ when_writing "Creating #{gemspec_file}" do
74
+ gemspec_file.open "w+" do |spec|
75
+ spec << gemspec.to_yaml
76
+ end
77
+ end
78
+ puts "Successfully built #{gemspec_file}"
79
+ end
80
+
81
+ desc "Build #{gemspec_file}"
82
+ task :spec => [gemspec_file]
83
+
6
84
  end
7
85
 
8
86
  Rake::GemPackageTask.new gemspec do |pkg|
@@ -3,12 +3,16 @@ $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/..")
3
3
  require 'lib/postview'
4
4
  require 'test/unit'
5
5
  require 'rack/test'
6
- require 'test/helper'
6
+ require 'test/customizations'
7
7
 
8
8
  class ApplicationTest < Test::Unit::TestCase
9
9
 
10
10
  include Rack::Test::Methods
11
11
 
12
+ def setup
13
+ Postview::path = "test/fixtures/application"
14
+ end
15
+
12
16
  def app
13
17
  @app = Postview::Application
14
18
 
@@ -18,29 +22,24 @@ class ApplicationTest < Test::Unit::TestCase
18
22
  end
19
23
 
20
24
  def test_should_return_ok_for_theme_resources
21
- get app.theme_path "/images/favicon.ico" do |response|
25
+ get "/images/favicon.ico" do |response|
22
26
  assert response.ok?
23
- assert_equal "http://example.org/images/favicon.ico/", last_request.url
27
+ assert_equal "http://example.org/images/favicon.ico", last_request.url
24
28
  end
25
29
 
26
- get app.theme_path "/javascripts/gemstone.js" do |response|
30
+ get "/javascripts/postview.js" do |response|
27
31
  assert response.ok?
28
- assert_equal "http://example.org/javascripts/gemstone.js/", last_request.url
32
+ assert_equal "http://example.org/javascripts/postview.js", last_request.url
29
33
  end
30
34
 
31
- get app.theme_path "/stylesheets/gemstone.css" do |response|
35
+ get "/stylesheets/postview.css" do |response|
32
36
  assert response.ok?
33
- assert_equal "http://example.org/stylesheets/gemstone.css/", last_request.url
37
+ assert_equal "http://example.org/stylesheets/postview.css", last_request.url
34
38
  end
35
39
 
36
- get app.theme_path "/images/banners/banner.jpg" do |response|
40
+ get "/images/banners/banner.jpg" do |response|
37
41
  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?
42
+ assert_equal "http://example.org/images/banners/banner.jpg", last_request.url
44
43
  end
45
44
  end
46
45
 
@@ -91,6 +90,7 @@ class ApplicationTest < Test::Unit::TestCase
91
90
  end
92
91
 
93
92
  def test_should_return_ok_in_drafts_path
93
+ authorize("Jack Ducklet", "s3kr3t")
94
94
  get app.drafts_path do |response|
95
95
  assert response.ok?
96
96
  assert_equal "http://example.org/drafts/", last_request.url
@@ -98,6 +98,7 @@ class ApplicationTest < Test::Unit::TestCase
98
98
  end
99
99
 
100
100
  def test_should_return_ok_in_drafts_path_with_params
101
+ authorize("Jack Ducklet", "s3kr3t")
101
102
  get app.drafts_path "2009/07/30/fifth_article" do |response|
102
103
  assert response.ok?
103
104
  assert_equal "http://example.org/drafts/2009/07/30/fifth_article/", last_request.url
@@ -118,5 +119,19 @@ class ApplicationTest < Test::Unit::TestCase
118
119
  end
119
120
  end
120
121
 
122
+ should "return ok in authorize path" do
123
+ authorize("Jack Ducklet", "s3kr3t")
124
+ get app.manager_path do |response|
125
+ assert response.ok?
126
+ assert_equal "http://example.org/manager/", last_request.url
127
+ end
128
+ end
129
+
130
+ should "load shared themes" do
131
+ site_path = Pathname.new("test/fixtures/site").expand_path
132
+ Postview::path = site_path.join("blog")
133
+ assert_equal site_path.join("themes/mytheme"), app.theme
134
+ end
135
+
121
136
  end
122
137
 
@@ -21,3 +21,4 @@ module Test::Unit
21
21
 
22
22
  end
23
23
  end
24
+
@@ -7,11 +7,13 @@
7
7
  :title: Postview
8
8
  :theme: default
9
9
  :subtitle: Post your articles
10
- :theme: gemstone
10
+ :theme: mytheme
11
+ :token: 948632a3174ea34188f1f261d26941cabd8a5a42b27577ff8e400d2cd139c6e1
11
12
  :directories:
12
13
  :posts: posts
13
14
  :archive: posts/archive
14
15
  :drafts: posts/drafts
16
+ :themes: themes
15
17
  :sections:
16
18
  :about: about
17
19
  :posts: posts
@@ -20,3 +22,4 @@
20
22
  :search: search
21
23
  :tags: tags
22
24
  :drafts: drafts
25
+ :manager: manager
@@ -0,0 +1 @@
1
+ <%=Postview::about_to_html%>
@@ -0,0 +1,3 @@
1
+ <%for post in all_archived_posts%>
2
+ <%=post%>
3
+ <%end%>
@@ -0,0 +1,3 @@
1
+ <%for post in all_drafted_posts%>
2
+ <%=post%>
3
+ <%end%>
@@ -0,0 +1 @@
1
+ <%=error_message%>
@@ -0,0 +1,3 @@
1
+ <%for post in latest_posts%>
2
+ <%=post.summary%>
3
+ <%end%>
@@ -5,7 +5,7 @@
5
5
 
6
6
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7
7
  <title><%=site.title%> :: <%=page.title%></title>
8
- <meta name="generator" content="<%=Postview::Version%>" />
8
+ <meta name="generator" content="<%=Postview::version_summary%>" />
9
9
  <meta name="description" content="<%=site.subtitle%>" />
10
10
  <meta name="keywords" content="<%=page.keywords%>" />
11
11
  <link rel="shortcut icon" href="<%=path_to :images, "favicon.ico"%>" />
@@ -119,7 +119,7 @@
119
119
  <div id="footer">
120
120
 
121
121
  <p>
122
- <small><%=site.title%> &copy; 2009 <%=site.author%>. Powered by <%=link_to Postview::Version, "http://github.com/hallison/postview"%>.</small>
122
+ <small><%=site.title%> &copy; 2009 <%=site.author%>. Powered by <%=link_to Postview::version_summary, "http://github.com/hallison/postview"%>.</small>
123
123
  </p>
124
124
 
125
125
  </div><!-- footer -->