nanoc3 3.1.4 → 3.1.5

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/NEWS.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # nanoc news
2
2
 
3
+ ## 3.1.5 (2010-08-24)
4
+
5
+ * Improved `#render` documentation
6
+ * Improved metadata section check so that e.g. raw diffs are handled properly
7
+ * Deprecated using `Nanoc3::Site#initialize` with a non-`"."` argument
8
+ * Added Ruby engine to version string
9
+ * Allowed the `created_at` and `updated_at` attributes used in the `Blogging`
10
+ helper to be `Date` instances
11
+
3
12
  ## 3.1.4 (2010-07-25)
4
13
 
5
14
  * Made INT and TERM signals always quit the CLI
data/README.md CHANGED
@@ -78,6 +78,7 @@ may be interested in the development dependencies:
78
78
  * Chris Eppstein
79
79
  * Felix Hanley
80
80
  * Starr Horne
81
+ * Tuomas Kareinen
81
82
  * Nicky Peeters
82
83
  * Christian Plessl
83
84
  * Šime Ramov
@@ -344,6 +344,9 @@ module Nanoc3
344
344
  # Get basic path by applying matching rule
345
345
  basic_path = rule.apply_to(rep)
346
346
  next if basic_path.nil?
347
+ if basic_path !~ %r{^/}
348
+ raise RuntimeError, "The path returned for the #{rep.inspect} item representation, “#{basic_path}”, does not start with a slash. Please ensure that all routing rules return a path that starts with a slash.".make_compatible_with_env
349
+ end
347
350
 
348
351
  # Get raw path by prepending output directory
349
352
  rep.raw_path = self.config[:output_dir] + basic_path
@@ -364,6 +367,11 @@ module Nanoc3
364
367
  # #initialize for details.
365
368
  def build_config(dir_or_config_hash)
366
369
  if dir_or_config_hash.is_a? String
370
+ # Check whether it is supported
371
+ if dir_or_config_hash != '.'
372
+ warn 'WARNING: Calling Nanoc3::Site.new with a directory that is not the current working directory is not supported. It is recommended to change the directory before calling Nanoc3::Site.new. For example, instead of Nanoc3::Site.new(\'abc\'), use Dir.chdir(\'abc\') { Nanoc3::Site.new(\'.\') }.'
373
+ end
374
+
367
375
  # Read config from config.yaml in given dir
368
376
  config_path = File.join(dir_or_config_hash, 'config.yaml')
369
377
  @config = DEFAULT_CONFIG.merge(YAML.load_file(config_path).symbolize_keys)
@@ -23,12 +23,20 @@ module Nanoc3::CLI
23
23
  add_command(Nanoc3::CLI::Commands::View.new)
24
24
  end
25
25
 
26
+ # Returns a fully initialised base instance. It is recommended to use this
27
+ # shared instance than to create new ones, as this will be the instance
28
+ # that will be used when reading all code from the `lib/` directory.
29
+ #
30
+ # @return [Nanoc3::CLI::Base]
26
31
  def self.shared_base
27
32
  @shared_base ||= Nanoc3::CLI::Base.new
28
33
  end
29
34
 
30
- # Helper function which can be called when a command is executed that
31
- # requires a site, such as the compile command.
35
+ # Asserts that the current working directory contains a site
36
+ # ({Nanoc3::Site} instance). If no site is present, prints an error
37
+ # message and exits.
38
+ #
39
+ # @return [void]
32
40
  def require_site
33
41
  if site.nil?
34
42
  $stderr.puts 'The current working directory does not seem to be a ' +
@@ -37,7 +45,10 @@ module Nanoc3::CLI
37
45
  end
38
46
  end
39
47
 
40
- # Gets the site (Nanoc3::Site) in the current directory and loads its data.
48
+ # Gets the site ({Nanoc3::Site} instance) in the current directory and
49
+ # loads its data.
50
+ #
51
+ # @return [Nanoc3::Site] The site in the current working directory
41
52
  def site
42
53
  # Load site if possible
43
54
  if File.file?('config.yaml') && (!self.instance_variable_defined?(:@site) || @site.nil?)
@@ -52,7 +63,7 @@ module Nanoc3::CLI
52
63
  @site
53
64
  end
54
65
 
55
- # Inherited from ::Cri::Base
66
+ # @see ::Cri::Base#run
56
67
  def run(args)
57
68
  # Set exit handler
58
69
  [ 'INT', 'TERM' ].each do |signal|
@@ -70,8 +81,12 @@ module Nanoc3::CLI
70
81
  exit(1)
71
82
  end
72
83
 
73
- # Prints the given error to stderr. Includes message, possible resolution,
74
- # compilation stack, backtrace, etc.
84
+ # Prints the given error to stderr. Includes message, possible resolution
85
+ # (see {#resolution_for}), compilation stack, backtrace, etc.
86
+ #
87
+ # @param [Error] error The error that should be described
88
+ #
89
+ # @return [void]
75
90
  def print_error(error)
76
91
  $stderr.puts
77
92
 
@@ -115,8 +130,12 @@ module Nanoc3::CLI
115
130
  $stderr.puts error.backtrace.to_enum(:each_with_index).map { |item, index| " #{index}. #{item}" }.join("\n")
116
131
  end
117
132
 
118
- # Returns a string containing hints for resolving the given error, or nil
119
- # if no resolution can be automatically obtained.
133
+ # Attempts to find a resolution for the given error, or nil if no
134
+ # resolution can be automatically obtained.
135
+ #
136
+ # @param [Error] error The error to find a resolution for
137
+ #
138
+ # @return [String] The resolution for the given error
120
139
  def resolution_for(error)
121
140
  # FIXME this should probably go somewhere else so that 3rd-party code can add other gem names too
122
141
  gem_names = {
@@ -158,6 +177,10 @@ module Nanoc3::CLI
158
177
  # Sets the data source's VCS to the VCS with the given name. Does nothing
159
178
  # when the site's data source does not support VCSes (i.e. does not
160
179
  # implement #vcs=).
180
+ #
181
+ # @param [String] vcs_name The name of the VCS that should be used
182
+ #
183
+ # @return [void]
161
184
  def set_vcs(vcs_name)
162
185
  # Skip if not possible
163
186
  return if vcs_name.nil? || site.nil?
@@ -178,7 +201,7 @@ module Nanoc3::CLI
178
201
  end
179
202
  end
180
203
 
181
- # Returns the list of global option definitionss.
204
+ # @return [Array] The list of global option definitions
182
205
  def global_option_definitions
183
206
  [
184
207
  {
@@ -208,13 +231,15 @@ module Nanoc3::CLI
208
231
  ]
209
232
  end
210
233
 
234
+ # @see Cri::Base#handle_option
211
235
  def handle_option(option)
212
236
  case option
213
237
  when :version
214
238
  gem_info = defined?(Gem) ? "with RubyGems #{Gem::VERSION}" : "without RubyGems"
239
+ engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
215
240
 
216
241
  puts "nanoc #{Nanoc3::VERSION} (c) 2007-2010 Denis Defreyne."
217
- puts "Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) running on #{RUBY_PLATFORM} #{gem_info}"
242
+ puts "Running #{engine} #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) on #{RUBY_PLATFORM} #{gem_info}"
218
243
  exit 0
219
244
  when :verbose
220
245
  Nanoc3::CLI::Logger.instance.level = :low
@@ -8,6 +8,8 @@ module Nanoc3::CLI
8
8
  # feedback in the terminal.
9
9
  class Logger
10
10
 
11
+ # Maps actions (`:create`, `:update`, `:identical` and `:skip`) onto their
12
+ # ANSI color codes.
11
13
  ACTION_COLORS = {
12
14
  :create => "\e[1m" + "\e[32m", # bold + green
13
15
  :update => "\e[1m" + "\e[33m", # bold + yellow
@@ -17,12 +19,14 @@ module Nanoc3::CLI
17
19
 
18
20
  include Singleton
19
21
 
20
- # The log level, which can be :high, :low or :off (which will log all
21
- # messages, only high-priority messages, or no messages at all,
22
+ # Returns the log level, which can be :high, :low or :off (which will log
23
+ # all messages, only high-priority messages, or no messages at all,
22
24
  # respectively).
25
+ #
26
+ # @return [Symbol] The log level
23
27
  attr_accessor :level
24
28
 
25
- # Whether to use color in log messages or not
29
+ # @return [Boolean] True if color should be used, false otherwise
26
30
  attr_accessor :color
27
31
  alias_method :color?, :color
28
32
 
@@ -40,12 +44,13 @@ module Nanoc3::CLI
40
44
 
41
45
  # Logs a file-related action.
42
46
  #
43
- # +level+:: The importance of this action. Can be :high or :low.
47
+ # @param [:high, :low] level The importance of this action
48
+ #
49
+ # @param [:create, :update, :identical] action The kind of file action
44
50
  #
45
- # +action+:: The kind of file action. Can be :create, :update or
46
- # :identical.
51
+ # @param [String] name The name of the file the action was performed on
47
52
  #
48
- # +identifier+:: The identifier of the item the action was performed on.
53
+ # @return [void]
49
54
  def file(level, action, identifier, duration=nil)
50
55
  log(
51
56
  level,
@@ -61,18 +66,19 @@ module Nanoc3::CLI
61
66
 
62
67
  # Logs a message.
63
68
  #
64
- # +level+:: The importance of this message. Can be :high or :low.
69
+ # @param [:high, :low] level The importance of this message
70
+ #
71
+ # @param [String] message The message to be logged
65
72
  #
66
- # +s+:: The message to be logged.
73
+ # @param [#puts] io The stream to which the message should be written
67
74
  #
68
- # +io+:: The IO instance to which the message will be written. Defaults to
69
- # standard output.
70
- def log(level, s, io=$stdout)
75
+ # @return [void]
76
+ def log(level, message, io=$stdout)
71
77
  # Don't log when logging is disabled
72
78
  return if @level == :off
73
79
 
74
80
  # Log when level permits it
75
- io.puts(s) if (@level == :low or @level == level)
81
+ io.puts(message) if (@level == :low or @level == level)
76
82
  end
77
83
 
78
84
  end
@@ -239,7 +239,7 @@ module Nanoc3::DataSources
239
239
  data = File.read(content_filename)
240
240
 
241
241
  # Check presence of metadata section
242
- if data[0, 3] != '-'*3 && data[0, 5] != '-'*5
242
+ if data !~ /\A-{3,5}\s*$/
243
243
  return [ {}, data ]
244
244
  end
245
245
 
@@ -39,8 +39,7 @@ module Nanoc3::Helpers
39
39
  def sorted_articles
40
40
  require 'time'
41
41
  articles.sort_by do |a|
42
- time = a[:created_at]
43
- time.is_a?(String) ? Time.parse(time) : time
42
+ attribute_to_time(a[:created_at])
44
43
  end.reverse
45
44
  end
46
45
 
@@ -183,8 +182,7 @@ module Nanoc3::Helpers
183
182
 
184
183
  # Get sorted relevant articles
185
184
  sorted_relevant_articles = relevant_articles.sort_by do |a|
186
- time = a[:created_at]
187
- time.is_a?(String) ? Time.parse(time) : time
185
+ attribute_to_time(a[:created_at])
188
186
  end.reverse.first(limit)
189
187
 
190
188
  # Get most recent article
@@ -204,8 +202,7 @@ module Nanoc3::Helpers
204
202
  xml.title title
205
203
 
206
204
  # Add date
207
- time = last_article[:created_at]
208
- xml.updated((time.is_a?(String) ? Time.parse(time) : time).to_iso8601_time)
205
+ xml.updated(attribute_to_time(last_article[:created_at]).to_iso8601_time)
209
206
 
210
207
  # Add links
211
208
  xml.link(:rel => 'alternate', :href => root_url)
@@ -229,10 +226,8 @@ module Nanoc3::Helpers
229
226
  xml.title a[:title], :type => 'html'
230
227
 
231
228
  # Add dates
232
- create_time = a[:created_at]
233
- update_time = a[:updated_at] || a[:created_at]
234
- xml.published((create_time.is_a?(String) ? Time.parse(create_time) : create_time).to_iso8601_time)
235
- xml.updated( (update_time.is_a?(String) ? Time.parse(update_time) : update_time).to_iso8601_time)
229
+ xml.published attribute_to_time(a[:created_at]).to_iso8601_time
230
+ xml.updated attribute_to_time(a[:updated_at] || a[:created_at]).to_iso8601_time
236
231
 
237
232
  # Add link
238
233
  xml.link(:rel => 'alternate', :href => url)
@@ -297,12 +292,24 @@ module Nanoc3::Helpers
297
292
 
298
293
  hostname, base_dir = %r{^.+?://([^/]+)(.*)$}.match(@site.config[:base_url])[1..2]
299
294
 
300
- time = item[:created_at]
301
- formatted_date = (time.is_a?(String) ? Time.parse(time) : time).to_iso8601_date
295
+ formatted_date = attribute_to_time(item[:created_at]).to_iso8601_date
302
296
 
303
297
  'tag:' + hostname + ',' + formatted_date + ':' + base_dir + (item.path || item.identifier)
304
298
  end
305
299
 
300
+ # Converts the given attribute (which can be a string, a Time or a Date)
301
+ # into a Time.
302
+ #
303
+ # @param [String, Time, Date] time Something that contains time
304
+ # information but is not necessarily a Time instance yet
305
+ #
306
+ # @return [Time] The Time instance corresponding to the given input
307
+ def attribute_to_time(time)
308
+ time = Time.local(time.year, time.month, time.day) if time.is_a?(Date)
309
+ time = Time.parse(time) if time.is_a?(String)
310
+ time
311
+ end
312
+
306
313
  end
307
314
 
308
315
  end
@@ -7,13 +7,24 @@ module Nanoc3::Helpers
7
7
 
8
8
  include Nanoc3::Helpers::Capturing
9
9
 
10
- # Returns a string containing the rendered given layout.
10
+ # Returns a string containing the rendered given layout. The given layout
11
+ # will first be run through the matching layout rule.
12
+ #
13
+ # The assigns (`@item`, `@config`, …) will not be available in the
14
+ # partial, but it is possible to pass custom assigns to the method. These
15
+ # assigns will be made available as instance variables inside the partial.
16
+ #
17
+ # The method can also take a block. In this case, the content of the block
18
+ # will be captured (using the {Nanoc3::Helpers::Capturing} helper) and
19
+ # this content will be made available with `yield`. In other words, a
20
+ # `yield` inside the partial will output the content of the block passed
21
+ # to the method.
11
22
  #
12
23
  # @param [String] identifier The identifier of the layout that should be
13
- # rendered
24
+ # rendered
14
25
  #
15
26
  # @param [Hash] other_assigns A hash containing assigns that will be made
16
- # available as instance variables in the partial
27
+ # available as instance variables in the partial
17
28
  #
18
29
  # @example Rendering a head and a foot partial around some text
19
30
  #
@@ -29,8 +40,20 @@ module Nanoc3::Helpers
29
40
  # <%= render 'head', :title => 'Foo' %>
30
41
  # # => "<h1>Foo</h1>"
31
42
  #
43
+ # @example Yielding inside a partial
44
+ #
45
+ # # The 'box' partial
46
+ # <div class="box">
47
+ # <%= yield %>
48
+ # </div>
49
+ #
50
+ # # The item/layout where the partial is rendered
51
+ # <% render 'box' do %>
52
+ # I'm boxy! Luvz!
53
+ # <% end %>
54
+ #
32
55
  # @raise [Nanoc3::Errors::UnknownLayout] if the given layout does not
33
- # exist
56
+ # exist
34
57
  #
35
58
  # @return [String] The rendered partial
36
59
  def render(identifier, other_assigns={}, &block)
data/lib/nanoc3.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  module Nanoc3
4
4
 
5
5
  # The current nanoc version.
6
- VERSION = '3.1.4'
6
+ VERSION = '3.1.5'
7
7
 
8
8
  end
9
9
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nanoc3
3
3
  version: !ruby/object:Gem::Version
4
- hash: 11
4
+ hash: 9
5
5
  prerelease: false
6
6
  segments:
7
7
  - 3
8
8
  - 1
9
- - 4
10
- version: 3.1.4
9
+ - 5
10
+ version: 3.1.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Denis Defreyne
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-25 00:00:00 +02:00
18
+ date: 2010-08-24 00:00:00 +02:00
19
19
  default_executable: nanoc3
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -47,7 +47,6 @@ extra_rdoc_files:
47
47
  - NEWS.md
48
48
  files:
49
49
  - ChangeLog
50
- - Gemfile
51
50
  - LICENSE
52
51
  - NEWS.md
53
52
  - Rakefile
data/Gemfile DELETED
@@ -1,31 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gem "cri"
4
-
5
- group :development do
6
- gem "minitest"
7
- gem "mocha"
8
- gem "yard"
9
- end
10
-
11
- group :extra do
12
- gem "adsf"
13
- gem "bluecloth"
14
- gem "builder"
15
- gem "coderay"
16
- gem "erubis"
17
- gem "haml"
18
- gem "kramdown"
19
- gem "less"
20
- gem "markaby"
21
- gem "maruku"
22
- gem "mime-types"
23
- gem "nokogiri"
24
- gem "rack"
25
- gem "rainpress"
26
- gem "rdiscount"
27
- gem "rdoc"
28
- gem "RedCloth"
29
- gem "rubypants"
30
- gem "w3c_validators"
31
- end