nesta 0.9.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,3 +1,45 @@
1
+ = 0.9.3 / 18 January 2011
2
+
3
+ * The route and view for serving the home page (/) has been removed,
4
+ and the home page must now be created as an index page in
5
+ content/pages.
6
+
7
+ You will have to create `content/pages/index.haml` manually when
8
+ upgrading. Running `nesta new mysite.com` will create a
9
+ `content/pages/index.haml` file that is suitable for a blog.
10
+
11
+ * The URL /my-page can be served from `pages/my-page/index.mdown` as
12
+ well as pages/my-page.mdown (index pages can also be created with
13
+ Textile or Haml, just like any other page).
14
+
15
+ * The description and keywords settings have been removed from
16
+ config.yml as they can now be set on `content/pages/index.haml`.
17
+
18
+ * Added the Title metadata key to override a page's default title tag.
19
+
20
+ * Specify the sort order of pages that are listed on a category page.
21
+ Optionally append a colon and a number to a path in the 'Categories'
22
+ metadata to control the sort order of pages listed on the category
23
+ page.
24
+
25
+ See these files for the syntax:
26
+ https://github.com/gma/nesta-demo-content/tree/master/pages/examples
27
+
28
+ * Support arbitrarily deep hierarchies when generating the breadcrumb
29
+ (see the new helper method added to Nesta::Navigation).
30
+
31
+ * Dropped the --heroku switch (Heroku runs fine without it and there is
32
+ less chance that committing config.yml to your repository will be an
33
+ issue now that Nesta sites live in their own repositories).
34
+
35
+ * Re-implemented /articles.xml and /sitemap.xml in Haml, dropping the
36
+ dependency on builder. This side steps a bug in Ruby 1.9.1, so Nesta
37
+ can now run on 1.9.1 again. Also fixed a validity error in the Atom
38
+ feed.
39
+
40
+ * Bug fix: Don't output empty <li> tags for nested submenus that are
41
+ beneath the requested number of levels.
42
+
1
43
  = 0.9.2 / 10 January 2011
2
44
 
3
45
  * Made the FileModel.metadata method public, to allow for custom
data/Gemfile.lock CHANGED
@@ -1,9 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nesta (0.9.2)
4
+ nesta (0.9.3)
5
5
  RedCloth (~> 4.2)
6
- builder (~> 3.0)
7
6
  haml (~> 3.0)
8
7
  maruku (>= 0.6.0)
9
8
  shotgun (>= 0.8)
@@ -13,7 +12,6 @@ GEM
13
12
  remote: http://rubygems.org/
14
13
  specs:
15
14
  RedCloth (4.2.3)
16
- builder (3.0.0)
17
15
  haml (3.0.25)
18
16
  hoe (2.6.2)
19
17
  rake (>= 0.8.7)
@@ -45,7 +43,6 @@ PLATFORMS
45
43
 
46
44
  DEPENDENCIES
47
45
  RedCloth (~> 4.2)
48
- builder (~> 3.0)
49
46
  haml (~> 3.0)
50
47
  hpricot (= 0.8.3)
51
48
  maruku (>= 0.6.0)
data/bin/nesta CHANGED
@@ -22,7 +22,6 @@ COMMANDS
22
22
 
23
23
  OPTIONS FOR new
24
24
  --git Create a new git repository for the project.
25
- --heroku Include the heroku:config rake task.
26
25
  --vlad Include config/deploy.rb.
27
26
 
28
27
  EOF
@@ -33,7 +32,6 @@ exit 0
33
32
  opts = GetoptLong.new(
34
33
  ['--git', GetoptLong::NO_ARGUMENT],
35
34
  ['--help', '-h', GetoptLong::NO_ARGUMENT],
36
- ['--heroku', GetoptLong::NO_ARGUMENT],
37
35
  ['--vlad', GetoptLong::NO_ARGUMENT]
38
36
  )
39
37
  options = {}
data/lib/nesta/app.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'sinatra/base'
2
- require 'builder'
3
2
  require 'haml'
4
3
  require 'sass'
5
4
 
@@ -38,14 +37,6 @@ module Nesta
38
37
  end
39
38
  end
40
39
 
41
- def set_title(page)
42
- if page.respond_to?(:parent) && page.parent
43
- @title = "#{page.heading} - #{page.parent.heading}"
44
- else
45
- @title = "#{page.heading} - #{Nesta::Config.title}"
46
- end
47
- end
48
-
49
40
  def no_widow(text)
50
41
  text.split[0...-1].join(" ") + "&nbsp;#{text.split[-1]}"
51
42
  end
@@ -99,6 +90,18 @@ module Nesta
99
90
  haml_tag :link, :href => "/css/#{name}.css", :rel => "stylesheet"
100
91
  end
101
92
  end
93
+
94
+ def latest_articles(count = 8)
95
+ Nesta::Page.find_articles[0..count - 1]
96
+ end
97
+
98
+ def article_summaries(articles)
99
+ haml(
100
+ :summaries,
101
+ :layout => false,
102
+ :locals => { :pages => latest_articles }
103
+ )
104
+ end
102
105
  end
103
106
 
104
107
  not_found do
@@ -111,23 +114,6 @@ module Nesta
111
114
  haml(:error)
112
115
  end unless Nesta::App.environment == :development
113
116
 
114
- # If you want to change Nesta's behaviour, you have two options:
115
- #
116
- # 1. Create an app.rb file in your project's root directory.
117
- # 2. Make a theme or a plugin, and put the relevant code in there.
118
- #
119
- # You can add new routes, or modify the behaviour of any of the
120
- # default objects in app.rb, or replace any of the default view
121
- # templates by creating replacements of the same name in a ./views
122
- # folder situated in the root directory of the project for your
123
- # site.
124
- #
125
- # Your ./views folder gets searched first when rendering a template
126
- # or Sass file, then the currently configured theme is searched, and
127
- # finally Nesta will check if the template exists in the views
128
- # folder in the Nesta gem (which is where the default look and feel
129
- # is defined).
130
- #
131
117
  Overrides.load_local_app
132
118
  Overrides.load_theme_app
133
119
 
@@ -144,15 +130,6 @@ module Nesta
144
130
  cache sass(params[:sheet].to_sym)
145
131
  end
146
132
 
147
- get '/' do
148
- set_common_variables
149
- set_from_config(:title, :subtitle, :description, :keywords)
150
- @heading = @title
151
- @title = "#{@title} - #{@subtitle}"
152
- @articles = Page.find_articles[0..7]
153
- cache haml(:index)
154
- end
155
-
156
133
  get %r{/attachments/([\w/.-]+)} do
157
134
  file = File.join(Nesta::Config.attachment_path, params[:captures].first)
158
135
  send_file(file, :disposition => nil)
@@ -162,7 +139,7 @@ module Nesta
162
139
  content_type :xml, :charset => 'utf-8'
163
140
  set_from_config(:title, :subtitle, :author)
164
141
  @articles = Page.find_articles.select { |a| a.date }[0..9]
165
- cache builder(:atom)
142
+ cache haml(:atom, :format => :xhtml, :layout => false)
166
143
  end
167
144
 
168
145
  get '/sitemap.xml' do
@@ -171,15 +148,16 @@ module Nesta
171
148
  @last = @pages.map { |page| page.last_modified }.inject do |latest, page|
172
149
  (page > latest) ? page : latest
173
150
  end
174
- cache builder(:sitemap)
151
+ cache haml(:sitemap, :format => :xhtml, :layout => false)
175
152
  end
176
153
 
177
154
  get '*' do
178
155
  set_common_variables
156
+ @heading = @title
179
157
  parts = params[:splat].map { |p| p.sub(/\/$/, '') }
180
158
  @page = Nesta::Page.find_by_path(File.join(parts))
181
159
  raise Sinatra::NotFound if @page.nil?
182
- set_title(@page)
160
+ @title = @page.title
183
161
  set_from_page(:description, :keywords)
184
162
  cache haml(@page.template, :layout => @page.layout)
185
163
  end
@@ -66,7 +66,7 @@ module Nesta
66
66
  end
67
67
 
68
68
  def have_rake_tasks?
69
- @options['heroku'] || @options['vlad']
69
+ @options['vlad']
70
70
  end
71
71
 
72
72
  def create_repository
@@ -85,6 +85,7 @@ module Nesta
85
85
  templates = {
86
86
  'config.ru' => "#{@path}/config.ru",
87
87
  'config/config.yml' => "#{@path}/config/config.yml",
88
+ 'index.haml' => "#{@path}/content/pages/index.haml",
88
89
  'Gemfile' => "#{@path}/Gemfile"
89
90
  }
90
91
  templates['Rakefile'] = "#{@path}/Rakefile" if have_rake_tasks?
data/lib/nesta/config.rb CHANGED
@@ -6,8 +6,7 @@ require "sinatra"
6
6
  module Nesta
7
7
  class Config
8
8
  @settings = %w[
9
- title subtitle description keywords theme disqus_short_name
10
- cache content google_analytics_code
9
+ title subtitle theme disqus_short_name cache content google_analytics_code
11
10
  ]
12
11
  @author_settings = %w[name uri email]
13
12
  @yaml = nil
data/lib/nesta/models.rb CHANGED
@@ -29,10 +29,12 @@ module Nesta
29
29
 
30
30
  def self.load(path)
31
31
  FORMATS.each do |format|
32
- filename = model_path("#{path}.#{format}")
33
- if File.exist?(filename) && needs_loading?(path, filename)
34
- @@cache[path] = self.new(filename)
35
- break
32
+ [path, File.join(path, 'index')].each do |basename|
33
+ filename = model_path("#{basename}.#{format}")
34
+ if File.exist?(filename) && needs_loading?(path, filename)
35
+ @@cache[path] = self.new(filename)
36
+ break
37
+ end
36
38
  end
37
39
  end
38
40
  @@cache[path]
@@ -54,17 +56,25 @@ module Nesta
54
56
  @mtime = File.mtime(filename)
55
57
  end
56
58
 
57
- def permalink
58
- File.basename(@filename, ".*")
59
+ def index_page?
60
+ @filename =~ /\/?index\.\w+$/
61
+ end
62
+
63
+ def abspath
64
+ page_path = @filename.sub(Nesta::Config.page_path, '')
65
+ if index_page?
66
+ File.dirname(page_path)
67
+ else
68
+ File.join(File.dirname(page_path), File.basename(page_path, '.*'))
69
+ end
59
70
  end
60
71
 
61
72
  def path
62
- abspath.sub(/^\//, "")
73
+ abspath.sub(/^\//, '')
63
74
  end
64
75
 
65
- def abspath
66
- prefix = File.dirname(@filename).sub(Nesta::Config.page_path, "")
67
- File.join(prefix, permalink)
76
+ def permalink
77
+ File.basename(path)
68
78
  end
69
79
 
70
80
  def layout
@@ -149,16 +159,28 @@ module Nesta
149
159
 
150
160
  def heading
151
161
  regex = case @format
152
- when :mdown
153
- /^#\s*(.*)/
154
- when :haml
155
- /^\s*%h1\s+(.*)/
156
- when :textile
157
- /^\s*h1\.\s+(.*)/
158
- end
162
+ when :mdown
163
+ /^#\s*(.*)/
164
+ when :haml
165
+ /^\s*%h1\s+(.*)/
166
+ when :textile
167
+ /^\s*h1\.\s+(.*)/
168
+ end
159
169
  markup =~ regex
160
170
  Regexp.last_match(1)
161
171
  end
172
+
173
+ def title
174
+ if metadata('title')
175
+ metadata('title')
176
+ elsif parent
177
+ "#{heading} - #{parent.heading}"
178
+ elsif heading
179
+ "#{heading} - #{Nesta::Config.title}"
180
+ elsif abspath == '/'
181
+ Nesta::Config.title
182
+ end
183
+ end
162
184
 
163
185
  def date(format = nil)
164
186
  @date ||= if metadata("date")
@@ -205,22 +227,44 @@ module Nesta
205
227
  end
206
228
 
207
229
  def categories
208
- categories = metadata("categories")
209
- paths = categories.nil? ? [] : categories.split(",").map { |p| p.strip }
210
- valid_paths(paths).map { |p| Page.find_by_path(p) }.sort do |x, y|
230
+ paths = category_strings.map { |specifier| specifier.sub(/:-?\d+$/, '') }
231
+ pages = valid_paths(paths).map { |p| Page.find_by_path(p) }
232
+ pages.sort do |x, y|
211
233
  x.heading.downcase <=> y.heading.downcase
212
234
  end
213
235
  end
214
236
 
237
+ def priority(category)
238
+ category_string = category_strings.detect do |string|
239
+ string =~ /^#{category}([,:\s]|$)/
240
+ end
241
+ category_string && category_string.split(':', 2)[-1].to_i
242
+ end
243
+
215
244
  def parent
216
- Page.load(File.dirname(path))
245
+ if abspath == '/'
246
+ nil
247
+ else
248
+ parent_path = File.dirname(path)
249
+ while parent_path != '.' do
250
+ parent = Page.load(parent_path)
251
+ return parent unless parent.nil?
252
+ parent_path = File.dirname(parent_path)
253
+ end
254
+ Page.load('index')
255
+ end
217
256
  end
218
257
 
219
258
  def pages
220
259
  Page.find_all.select do |page|
221
260
  page.date.nil? && page.categories.include?(self)
222
261
  end.sort do |x, y|
223
- x.heading.downcase <=> y.heading.downcase
262
+ by_priority = y.priority(path) <=> x.priority(path)
263
+ if by_priority == 0
264
+ x.heading.downcase <=> y.heading.downcase
265
+ else
266
+ by_priority
267
+ end
224
268
  end
225
269
  end
226
270
 
@@ -229,10 +273,18 @@ module Nesta
229
273
  end
230
274
 
231
275
  private
276
+ def category_strings
277
+ strings = metadata('categories')
278
+ strings.nil? ? [] : strings.split(',').map { |string| string.strip }
279
+ end
280
+
232
281
  def valid_paths(paths)
282
+ page_dir = Nesta::Config.page_path
233
283
  paths.select do |path|
234
284
  FORMATS.detect do |format|
235
- File.exist?(File.join(Nesta::Config.page_path, "#{path}.#{format}"))
285
+ [path, File.join(path, 'index')].detect do |candidate|
286
+ File.exist?(File.join(page_dir, "#{candidate}.#{format}"))
287
+ end
236
288
  end
237
289
  end
238
290
  end
@@ -14,16 +14,47 @@ module Nesta
14
14
  end
15
15
 
16
16
  def display_menu_item(item, options = {})
17
- haml_tag :li do
18
- if item.respond_to?(:each)
19
- display_menu(item, :levels => (options[:levels] - 1))
20
- else
17
+ if item.respond_to?(:each)
18
+ if (options[:levels] - 1) > 0
19
+ haml_tag :li do
20
+ display_menu(item, :levels => (options[:levels] - 1))
21
+ end
22
+ end
23
+ else
24
+ haml_tag :li do
21
25
  haml_tag :a, :href => item.abspath do
22
26
  haml_concat item.heading
23
27
  end
24
28
  end
25
29
  end
26
30
  end
31
+
32
+ def breadcrumb_ancestors
33
+ ancestors = []
34
+ page = @page
35
+ while page
36
+ ancestors << page
37
+ page = page.parent
38
+ end
39
+ ancestors.reverse
40
+ end
41
+
42
+ def display_breadcrumbs(options = {})
43
+ haml_tag :ul, :class => options[:class] do
44
+ breadcrumb_ancestors[0...-1].each do |page|
45
+ haml_tag :li do
46
+ haml_tag :a, :href => page.abspath do
47
+ haml_concat breadcrumb_label(page)
48
+ end
49
+ end
50
+ end
51
+ haml_tag(:li) { haml_concat breadcrumb_label(@page) }
52
+ end
53
+ end
54
+
55
+ def breadcrumb_label(page)
56
+ (page.abspath == '/') ? 'Home' : page.heading
57
+ end
27
58
  end
28
59
  end
29
60
  end
data/lib/nesta/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Nesta
2
- VERSION = '0.9.2'
2
+ VERSION = '0.9.3'
3
3
  end
data/nesta.gemspec CHANGED
@@ -31,7 +31,6 @@ EOF
31
31
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
32
32
  s.require_paths = ["lib"]
33
33
 
34
- s.add_dependency('builder', '~> 3.0')
35
34
  s.add_dependency('haml', '~> 3.0')
36
35
  s.add_dependency('maruku', '>= 0.6.0')
37
36
  s.add_dependency('RedCloth', '~> 4.2')
@@ -44,6 +44,10 @@ describe "nesta" do
44
44
  should_exist('content/pages')
45
45
  end
46
46
 
47
+ it "should create the home page" do
48
+ should_exist('content/pages/index.haml')
49
+ end
50
+
47
51
  it "should create the rackup file" do
48
52
  should_exist('config.ru')
49
53
  end
@@ -82,22 +86,6 @@ describe "nesta" do
82
86
  end
83
87
  end
84
88
 
85
- describe "--heroku" do
86
- before(:each) do
87
- Nesta::Commands::New.new(@project_path, 'heroku' => '').execute
88
- end
89
-
90
- it "should add heroku to Gemfile" do
91
- gemfile_source.should match(/gem 'heroku'/)
92
- end
93
-
94
- it "should add the heroku:config Rake task" do
95
- should_exist('Rakefile')
96
- rakefile_source.should match(/namespace :heroku/)
97
- rakefile_source.should match(/task :config/)
98
- end
99
- end
100
-
101
89
  describe "--vlad" do
102
90
  before(:each) do
103
91
  Nesta::Commands::New.new(@project_path, 'vlad' => '').execute