baron 1.0.12 → 1.0.13

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.11
1
+ 1.0.13
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "baron"
8
- s.version = "1.0.12"
8
+ s.version = "1.0.13"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Nathan Buggia"]
@@ -47,6 +47,7 @@ Gem::Specification.new do |s|
47
47
  "spec/sample_data/images/robert-frost.png",
48
48
  "spec/sample_data/pages/about.rhtml",
49
49
  "spec/sample_data/pages/test.rhtml",
50
+ "spec/sample_data/resources/feed.atom",
50
51
  "spec/sample_data/resources/redirects.txt",
51
52
  "spec/sample_data/resources/robots.txt",
52
53
  "spec/sample_data/supplemental-files/theme_config.yml",
@@ -4,6 +4,7 @@ $:.unshift File.dirname(__FILE__)
4
4
  require 'yaml'
5
5
  require 'date'
6
6
  require 'erb'
7
+ require 'time'
7
8
 
8
9
  # 3rd party
9
10
  require 'rack'
@@ -41,24 +42,22 @@ module Baron
41
42
  return [400, {}, []] unless @request.get?
42
43
 
43
44
  @response = Rack::Response.new
44
- path, mime = @request.path_info.split('.')
45
- redirected_url, status = @blog_engine.process_redirects(path)
45
+
46
+ path, ext = @request.path_info.split('.')
47
+ extension = ext.to_s.empty? ? '.html' : ".#{ext}"
48
+
49
+ redirected_url, status = @blog_engine.process_redirects(@request.path_info)
46
50
 
47
51
  if status
48
52
  @response.status = status
49
53
  @response['Location'] = redirected_url
50
54
  else
51
- baron_response = @blog_engine.process_request(path, env, *(mime ? mime : []))
55
+ baron_response = @blog_engine.process_request(@request.path_info, env)
52
56
  @response.body = [baron_response[:body]]
53
57
  @response.status = baron_response[:status]
54
58
  @response['Content-Length'] = baron_response[:body].bytesize.to_s unless baron_response[:body].empty?
55
- @response['Content-Type'] = Rack::Mime.mime_type(".#{baron_response[:type]}")
56
- @response['Cache-Control'] = if Baron.env == 'production'
57
- "public, max-age=#{@config[:cache]}"
58
- else
59
- "no-cache, must-revalidate"
60
- end
61
-
59
+ @response['Content-Type'] = Rack::Mime.mime_type(extension)
60
+ @response['Cache-Control'] = (Baron.env == 'production') ? "public, max-age=#{@config[:cache]}" : "no-cache, must-revalidate"
62
61
  @response['ETag'] = %("#{Digest::SHA1.hexdigest(baron_response[:body])}")
63
62
  end
64
63
 
@@ -16,27 +16,26 @@ module Baron
16
16
  end
17
17
  end
18
18
 
19
- def process_request path, env = {}, mime_type = :html
19
+ def process_request path, env = {}
20
20
  route = (path || '/').split('/').reject { |i| i.empty? }
21
21
  route << @config[:root] if route.empty?
22
- mime_type = (mime_type =~ /txt|rss|json/) ? mime_type.to_sym : :html
23
22
  categories = get_all_categories
24
- params = {:page_name => route.first, :rss_feed => get_feed_path}
23
+ params = {:page_name => route.first, :feed_permalink => @config.get_feed_permalink}
25
24
  params[:page_title] = (route.first == @config[:root] ? '' : "#{route.first.capitalize} #{@config[:title_delimiter]} ") + "#{@config[:title]}"
26
25
  theme = Theme.new(@config)
27
26
  theme.load_config
28
27
 
29
28
  begin
30
29
 
31
- # RSS feed... /feed.rss
32
- body = if mime_type == :rss
30
+ # Atom feed... /feed.atom
31
+ body = if route.first == 'feed.atom'
33
32
  PageController.new(get_all_articles, categories, @config[:article_max], params, theme, @config) .
34
- render_rss(get_system_resource('feed.rss'))
33
+ render(get_system_resource('feed.atom'))
35
34
 
36
35
  # Robots... /robots.txt
37
- elsif route.first == 'robots'
36
+ elsif route.first == 'robots.txt'
38
37
  PageController.new(get_all_articles, categories, @config[:article_max], params, theme, @config) .
39
- render_rss(get_system_resource('robots.txt'))
38
+ render(get_system_resource('robots.txt'))
40
39
 
41
40
  # Home page... /
42
41
  elsif route.first == @config[:root]
@@ -89,7 +88,7 @@ module Baron
89
88
  render_html(theme.get_template('article'), theme.get_template('layout'))
90
89
  end
91
90
 
92
- return :body => body, :type => mime_type, :status => 200
91
+ return :body => body, :status => 200
93
92
 
94
93
  rescue Errno::ENOENT => e
95
94
 
@@ -99,7 +98,7 @@ module Baron
99
98
  body = PageController.new([], categories, 0, params, theme, @config) .
100
99
  render_html(theme.get_template('error'), theme.get_template('layout'))
101
100
 
102
- return :body => body, :type => :html, :status => 404
101
+ return :body => body, :status => 404
103
102
  end
104
103
  end
105
104
 
@@ -176,10 +175,6 @@ module Baron
176
175
  def get_system_resource name
177
176
  "#{@config[:sample_data_path]}resources/#{name}".squeeze('/')
178
177
  end
179
-
180
- def get_feed_path
181
- "#{@config[:url]}/feed.rss"
182
- end
183
178
  end
184
179
 
185
180
  end
@@ -63,7 +63,8 @@ module Baron
63
63
  }
64
64
 
65
65
  def get_feed_permalink
66
- "#{self[:url]}feed.rss"
66
+ #"#{self[:url]}feed.atom"
67
+ "http://localhost:3000/feed.atom"
67
68
  end
68
69
 
69
70
  def initialize obj
@@ -1,5 +1,7 @@
1
1
  module Baron
2
+
2
3
  class Article < Hash
4
+
3
5
  def initialize file_parts, config = {}
4
6
  @config = config
5
7
  self[:filename_and_path] = file_parts[:filename_and_path]
@@ -36,12 +38,34 @@ module Baron
36
38
  "/#{permalink_prefix}/#{self[:category]}#{date_path}/#{slug}/".squeeze('/')
37
39
  end
38
40
 
39
- def title() self[:title] || 'Untitled' end
40
- def date() @config[:date].call(self[:date]) end
41
- def author() self[:author] || @config[:author] end
42
- def category() self[:category] end
43
- def permalink() "http://#{(@config[:url].sub("http://", '') + self.path).squeeze('/')}" end
44
- def slug() self[:slug] end
41
+ def title
42
+ self[:title] || 'Untitled'
43
+ end
44
+
45
+ def date
46
+ @config[:date].call(self[:date])
47
+ end
48
+
49
+ def date_iso8601
50
+ # "2009-10-26T04:47:09Z"
51
+ self[:date].strftime("%FT%T%:z")
52
+ end
53
+
54
+ def author
55
+ self[:author] || @config[:author]
56
+ end
57
+
58
+ def category
59
+ self[:category]
60
+ end
61
+
62
+ def permalink
63
+ "http://#{(@config[:url].sub("http://", '') + self.path).squeeze('/')}"
64
+ end
65
+
66
+ def slug
67
+ self[:slug]
68
+ end
45
69
 
46
70
  protected
47
71
 
@@ -57,5 +81,7 @@ module Baron
57
81
  text.strip
58
82
  end
59
83
  end
84
+
60
85
  end
86
+
61
87
  end
@@ -1,5 +1,7 @@
1
1
  module Baron
2
+
2
3
  class Theme < Hash
4
+
3
5
  def initialize config
4
6
  @config = config
5
7
  self[:root] = "/themes/#{config[:theme]}"
@@ -13,13 +15,16 @@ module Baron
13
15
  params = YAML.load(File.read(filename_and_path))
14
16
  params.each_pair { |key, value| self[key.downcase.to_sym] = value } unless !params
15
17
  rescue Errno::ENOENT => e
16
- puts "Warning: unable to load config file : " + filename_and_path
18
+ # puts "Warning: unable to load config file : " + filename_and_path
17
19
  end
18
20
 
19
- def root() self[:root] end
21
+ def root
22
+ self[:root]
23
+ end
20
24
 
21
25
  def get_template name
22
26
  "#{self[:file_root]}/templates/#{name}.rhtml".squeeze('/')
23
27
  end
24
28
  end
29
+
25
30
  end
@@ -17,7 +17,7 @@ module Baron
17
17
  end
18
18
  end
19
19
 
20
- def render_rss template
20
+ def render template
21
21
  ERB.new(File.read(template)).result(binding)
22
22
  end
23
23
  end
@@ -15,14 +15,6 @@ class Fixnum
15
15
  end
16
16
 
17
17
  # Avoid a collision with ActiveSupport
18
- class Date
19
- unless respond_to? :iso8601
20
- # Return the date as a String formatted according to ISO 8601.
21
- def iso8601
22
- ::Time.utc(year, month, day, 0, 0, 0, 0).iso8601
23
- end
24
- end
25
- end
26
18
 
27
19
  class String
28
20
  # Support String::bytesize in old versions of Ruby
@@ -17,37 +17,38 @@ describe "Baron::Article" do
17
17
 
18
18
  describe "Provides access to properties" do
19
19
  it "should return input parameters" do
20
- @article[:filename_and_path].should eq(@article_parts[:filename_and_path])
20
+ @article[:filename_and_path].should == @article_parts[:filename_and_path]
21
21
  @article[:date].should be_instance_of(Date)
22
- @article[:category].should eq(@article_parts[:category])
22
+ @article[:category].should == @article_parts[:category]
23
23
  end
24
24
 
25
25
  it "should return article data correctly" do
26
- @article[:title].should eq('The Road Not Taken')
27
- @article.title.should eq('The Road Not Taken')
28
- @article[:author].should eq('Robert Frost')
29
- @article.author.should eq('Robert Frost')
26
+ @article[:title].should == 'The Road Not Taken'
27
+ @article.title.should == 'The Road Not Taken'
28
+ @article.date.should == '01/01/1916'
29
+ @article.date_iso8601.should == '1916-01-01T00:00:00+00:00'
30
+ @article[:author].should == 'Robert Frost'
31
+ @article.author.should == 'Robert Frost'
30
32
  @article[:body].length.should > 0
31
- @article[:category].should eq('poems')
32
- @article.category.should eq('poems')
33
- @article[:slug].should eq('the-road-not-taken')
34
- @article.slug.should eq('the-road-not-taken')
33
+ @article[:category].should == 'poems'
34
+ @article.category.should == 'poems'
35
+ @article[:slug].should == 'the-road-not-taken'
36
+ @article.slug.should == 'the-road-not-taken'
35
37
  end
36
38
 
37
39
  it "should handle different path configuations" do
38
- @article.path('', :no_date).should eq('/poems/the-road-not-taken/')
39
- @article.path('', :year_month_day_date).should eq('/poems/1916/01/01/the-road-not-taken/')
40
- @article.path('', :year_month_date).should eq('/poems/1916/01/the-road-not-taken/')
41
- @article.path('', :year_date).should eq('/poems/1916/the-road-not-taken/')
42
- @article.path('posts', :no_date).should eq('/posts/poems/the-road-not-taken/')
43
- @article.path('posts', :year_month_day_date).should eq('/posts/poems/1916/01/01/the-road-not-taken/')
44
- @article.path('posts', :year_month_date).should eq('/posts/poems/1916/01/the-road-not-taken/')
45
- @article.path('posts', :year_date).should eq('/posts/poems/1916/the-road-not-taken/')
46
- @article.path('/foo/bar/', :no_date).should eq('/foo/bar/poems/the-road-not-taken/')
47
- @article.path('/foo/bar/', :no_date).should eq('/foo/bar/poems/the-road-not-taken/')
48
- @article.path('/foo/bar/', :year_month_day_date).should eq('/foo/bar/poems/1916/01/01/the-road-not-taken/')
49
- @article.path('/foo/bar/', :year_month_date).should eq('/foo/bar/poems/1916/01/the-road-not-taken/')
50
- @article.path('/foo/bar/', :year_date).should eq('/foo/bar/poems/1916/the-road-not-taken/')
40
+ @article.path('', :no_date).should == '/poems/the-road-not-taken/'
41
+ @article.path('', :year_month_day_date).should == '/poems/1916/01/01/the-road-not-taken/'
42
+ @article.path('', :year_month_date).should == '/poems/1916/01/the-road-not-taken/'
43
+ @article.path('', :year_date).should == '/poems/1916/the-road-not-taken/'
44
+ @article.path('posts', :no_date).should == '/posts/poems/the-road-not-taken/'
45
+ @article.path('posts', :year_month_day_date).should == '/posts/poems/1916/01/01/the-road-not-taken/'
46
+ @article.path('posts', :year_month_date).should == '/posts/poems/1916/01/the-road-not-taken/'
47
+ @article.path('posts', :year_date).should == '/posts/poems/1916/the-road-not-taken/'
48
+ @article.path('/foo/bar/', :no_date).should == '/foo/bar/poems/the-road-not-taken/'
49
+ @article.path('/foo/bar/', :year_month_day_date).should == '/foo/bar/poems/1916/01/01/the-road-not-taken/'
50
+ @article.path('/foo/bar/', :year_month_date).should == '/foo/bar/poems/1916/01/the-road-not-taken/'
51
+ @article.path('/foo/bar/', :year_date).should == '/foo/bar/poems/1916/the-road-not-taken/'
51
52
  end
52
53
  end
53
54
  end
@@ -19,7 +19,7 @@ describe "Baron::BlogEngine" do
19
19
  @blog_engine.get_page_template('about').should == SAMPLE_DATA_PATH + 'pages/about.rhtml'
20
20
  @blog_engine.get_system_resource('redirects.txt').should == SAMPLE_DATA_PATH + 'resources/redirects.txt'
21
21
  @blog_engine.get_system_resource('robots.txt').should == SAMPLE_DATA_PATH + 'resources/robots.txt'
22
- @blog_engine.get_system_resource('feeds.rss').should == SAMPLE_DATA_PATH + 'resources/feeds.rss'
22
+ @blog_engine.get_system_resource('feeds.atom').should == SAMPLE_DATA_PATH + 'resources/feeds.atom'
23
23
  end
24
24
 
25
25
  it "finds all categories" do
@@ -15,6 +15,10 @@ shared_examples_for "Server HTML Response" do
15
15
  it "should be instrumented" do
16
16
  @response.body.should include(GOOGLE_ANALYTICS) unless GOOGLE_ANALYTICS.empty?
17
17
  end
18
+
19
+ it "returns HTML content type" do
20
+ @response['Content-Type'].should == 'text/html'
21
+ end
18
22
 
19
23
  it "should generate valid HTML" do
20
24
  @response.body.scan(/<html/).count.should == 1
@@ -117,24 +121,24 @@ describe "Baron" do
117
121
 
118
122
  end
119
123
 
120
- describe "GET /feed.rss" do
124
+ describe "GET /feed.atom" do
121
125
  before :all do
122
- @response = @baron.get('/feed.rss')
126
+ @response = @baron.get('/feed.atom')
123
127
  end
124
128
 
125
129
  it_behaves_like "Server Response"
126
130
 
127
131
  it "returns expected content" do
128
132
  @response.body.should include(@config[:title])
129
- @response.body.should include("#{@config[:url]}/feed.rss")
133
+ @response.body.should include("http://localhost:3000/feed.atom")
130
134
  @response.body.scan(/<entry>/).count.should == 5
131
135
  @response.body.scan(/<\/entry>/).count.should == 5
132
136
  @response.body.should include('<feed')
133
137
  @response.body.should include('</feed>')
134
138
  end
135
139
 
136
- it "returns rss content type" do
137
- @response['Content-Type'].should == 'application/rss+xml'
140
+ it "returns atom content type" do
141
+ @response['Content-Type'].should == 'application/atom+xml'
138
142
  end
139
143
  end
140
144
 
@@ -146,7 +150,11 @@ describe "Baron" do
146
150
  it_behaves_like "Server Response"
147
151
 
148
152
  it "renders expected parameters" do
149
- @response.body.should include("#{@config[:url]}/feed.rss")
153
+ @response.body.should include("http://localhost:3000/feed.atom")
154
+ end
155
+
156
+ it "returns text content type" do
157
+ @response['Content-Type'].should == 'text/plain'
150
158
  end
151
159
  end
152
160
 
@@ -161,6 +169,8 @@ describe "Baron" do
161
169
  end
162
170
  end
163
171
 
172
+ # add a method to test CSS, and a downloaded file, like a ppt
173
+
164
174
  describe "Helper Functions" do
165
175
  it "should return a titleized string" do
166
176
  "the quick red fox".titleize.should == "The Quick Red Fox"
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <feed xmlns="http://www.w3.org/2005/Atom">
3
+ <title><%= @config[:title] %></title>
4
+ <subtitle></subtitle>
5
+ <link href="<%= @config.get_feed_permalink %>" />
6
+ <updated><%= @articles.first[:date].iso8601 %></updated>
7
+ <id><%= @config.get_feed_permalink %></id>
8
+
9
+ <% for @article in @articles %>
10
+ <entry>
11
+ <title><%= @article.title %></title>
12
+ <link href="<%= @article.permalink %>" />
13
+ <category><%= @article.category %></category>
14
+ <author>
15
+ <name><%= @article.author %></name>
16
+ </author>
17
+ <id><%= @article.permalink %></id>
18
+ <updated></updated>
19
+ <summary><%= @article.summary %></summary>
20
+ </entry>
21
+ <% end %>
22
+
23
+ </feed>
@@ -1,4 +1,6 @@
1
1
  # Robots.txt
2
+ #
3
+ # Mucho information on configuring this file:
4
+ # http://www.nathanbuggia.com/posts/search/managing-search-engine-access-to-your-site/
2
5
 
3
-
4
- Sitemap: <%= @params[:rss_feed] %>
6
+ Sitemap: <%= @config.get_feed_permalink %>
@@ -99,7 +99,7 @@
99
99
 
100
100
  <div class="span3">
101
101
  <ul>
102
- <li><a href="/feed.rss">RSS Feed</a></li>
102
+ <li><a href="<%= @config.get_feed_permalink %>">RSS Feed</a></li>
103
103
  </ul>
104
104
  </div>
105
105
  </div>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: baron
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.12
4
+ version: 1.0.13
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -84,6 +84,7 @@ files:
84
84
  - spec/sample_data/images/robert-frost.png
85
85
  - spec/sample_data/pages/about.rhtml
86
86
  - spec/sample_data/pages/test.rhtml
87
+ - spec/sample_data/resources/feed.atom
87
88
  - spec/sample_data/resources/redirects.txt
88
89
  - spec/sample_data/resources/robots.txt
89
90
  - spec/sample_data/supplemental-files/theme_config.yml