nesta 0.9.2 → 0.9.3

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/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