nanoc 3.6.5 → 3.6.6

Sign up to get free protection for your applications and to get access to all the features.
data/NEWS.md CHANGED
@@ -1,11 +1,24 @@
1
1
  # nanoc news
2
2
 
3
+ ## 3.6.6 (2013-11-08)
4
+
5
+ Enhancements:
6
+
7
+ * Reduced number of dependencies generated by Sass filter (#306) [Gregory Pakosz]
8
+ * Recognised lowercase `utf` in language value (e.g. `en_US.utf8`) as being UTF-8 (#335)
9
+ * Set [Thin](http://code.macournoyer.com/thin/) as the default server for `nanoc view` (#342, #345)
10
+ * Removed watcher section from the default configuration file (#343, #344)
11
+
12
+ Fixes:
13
+
14
+ * Prevented capturing helper from erroneously compiling items twice (#337)
15
+
3
16
  ## 3.6.5 (2013-09-29)
4
17
 
5
18
  Fixes:
6
19
 
7
- * Fixed bug which could cause incorrect dependencies to be generated in some cases
8
- * Fixed handling of index filenames when allowing periods in identifiers
20
+ * Fixed bug which could cause incorrect dependencies to be generated in some cases (#329)
21
+ * Fixed handling of index filenames when allowing periods in identifiers (#330)
9
22
 
10
23
  ## 3.6.4 (2013-05-29)
11
24
 
@@ -2,9 +2,6 @@
2
2
 
3
3
  module Nanoc
4
4
 
5
- # The current nanoc version.
6
- VERSION = '3.6.5'
7
-
8
5
  # @return [String] A string containing information about this nanoc version
9
6
  # and its environment (Ruby engine and version, Rubygems version if any).
10
7
  def self.version_information
@@ -34,6 +31,7 @@ require 'time'
34
31
  require 'yaml'
35
32
 
36
33
  # Load nanoc
34
+ require 'nanoc/version'
37
35
  require 'nanoc/base'
38
36
  require 'nanoc/extra'
39
37
  require 'nanoc/data_sources'
@@ -33,7 +33,7 @@ module Nanoc
33
33
  attr_reader :raw_content
34
34
 
35
35
  # @return [String] The filename pointing to the file containing this
36
- # item’s content (only available for binary items)
36
+ # item’s content
37
37
  attr_reader :raw_filename
38
38
 
39
39
  # @return [Nanoc::Site] The site this item belongs to
@@ -82,6 +82,7 @@ module Nanoc
82
82
  if @is_binary
83
83
  @raw_filename = raw_content_or_raw_filename
84
84
  else
85
+ @raw_filename = attributes[:content_filename]
85
86
  @raw_content = raw_content_or_raw_filename
86
87
  end
87
88
 
@@ -184,7 +184,7 @@ protected
184
184
  def self.enable_utf8?(io)
185
185
  return true if !io.tty?
186
186
 
187
- %w( LC_ALL LC_CTYPE LANG ).any? { |e| ENV[e] =~ /UTF/ }
187
+ %w( LC_ALL LC_CTYPE LANG ).any? { |e| ENV[e] =~ /UTF/i }
188
188
  end
189
189
 
190
190
  # @return [Boolean] true if color support is present, false if not
@@ -196,7 +196,7 @@ protected
196
196
  rescue LoadError
197
197
  return false
198
198
  end
199
-
199
+
200
200
  return true
201
201
  end
202
202
 
@@ -84,24 +84,6 @@ data_sources:
84
84
  # will have the identifier “/about/” when turned off, but when turned on
85
85
  # it will become “/about.html/” instead.
86
86
  allow_periods_in_identifiers: false
87
-
88
- # Configuration for the “watch” command, which watches a site for changes and
89
- # recompiles if necessary.
90
- watcher:
91
- # A list of directories to watch for changes. When editing this, make sure
92
- # that the “output/” and “tmp/” directories are _not_ included in this list,
93
- # because recompiling the site will cause these directories to change, which
94
- # will cause the site to be recompiled, which will cause these directories
95
- # to change, which will cause the site to be recompiled again, and so on.
96
- dirs_to_watch: [ 'content', 'layouts', 'lib' ]
97
-
98
- # A list of single files to watch for changes. As mentioned above, don’t put
99
- # any files from the “output/” or “tmp/” directories in here.
100
- files_to_watch: [ 'nanoc.yaml', 'Rules' ]
101
-
102
- # When to send notifications (using Growl or notify-send).
103
- notify_on_compilation_success: true
104
- notify_on_compilation_failure: true
105
87
  EOS
106
88
 
107
89
  DEFAULT_RULES = <<EOS unless defined? DEFAULT_RULES
@@ -276,7 +258,7 @@ EOS
276
258
  <link rel="stylesheet" href="/style.css">
277
259
 
278
260
  <!-- you don't need to keep this, but it's cool for stats! -->
279
- <meta name="generator" content="nanoc <%= Nanoc::VERSION %>">
261
+ <meta name="generator" content="nanoc <%= Nanoc::VERSION %>">
280
262
  </head>
281
263
  <body>
282
264
  <div id="main">
@@ -14,6 +14,8 @@ module Nanoc::CLI::Commands
14
14
 
15
15
  class View < ::Nanoc::CLI::CommandRunner
16
16
 
17
+ DEFAULT_HANDLER_NAME = :thin
18
+
17
19
  def run
18
20
  load_adsf
19
21
  require 'rack'
@@ -27,11 +29,13 @@ module Nanoc::CLI::Commands
27
29
  :Host => (options[:host] || '0.0.0.0')
28
30
  }
29
31
 
30
- # Guess which handler we should use
31
- unless handler = Rack::Handler.get(options[:handler])
32
+ # Get handler
33
+ if options.has_key?(:handler)
34
+ handler = Rack::Handler.get(options[:handler])
35
+ else
32
36
  begin
33
- handler = Rack::Handler::Mongrel
34
- rescue LoadError => e
37
+ handler = Rack::Handler.get(DEFAULT_HANDLER_NAME)
38
+ rescue LoadError
35
39
  handler = Rack::Handler::WEBrick
36
40
  end
37
41
  end
@@ -5,12 +5,6 @@ module Nanoc::Filters
5
5
 
6
6
  requires 'sass', 'nanoc/filters/sass/sass_filesystem_importer'
7
7
 
8
- class << self
9
- # The current filter. This is definitely going to bite me if I ever get
10
- # to multithreading nanoc.
11
- attr_accessor :current
12
- end
13
-
14
8
  # Runs the content through [Sass](http://sass-lang.com/).
15
9
  # Parameters passed to this filter will be passed on to Sass.
16
10
  #
@@ -28,22 +22,22 @@ module Nanoc::Filters
28
22
 
29
23
  # Find items
30
24
  item_dirglob = Pathname.new(sass_filename).dirname.realpath.to_s + '**'
31
- clean_items = @items.reject { |i| i[:content_filename].nil? }
25
+ clean_items = @items.reject { |i| i.raw_filename.nil? }
32
26
  @scoped_items, @rest_items = clean_items.partition do |i|
33
- i[:content_filename] &&
34
- Pathname.new(i[:content_filename]).realpath.fnmatch(item_dirglob)
27
+ i.raw_filename &&
28
+ Pathname.new(i.raw_filename).realpath.fnmatch(item_dirglob)
35
29
  end
36
30
 
37
31
  # Render
32
+ options[:nanoc_current_filter] = self
38
33
  engine = ::Sass::Engine.new(content, options)
39
- self.class.current = self
40
34
  engine.render
41
35
  end
42
36
 
43
37
  def imported_filename_to_item(filename)
44
38
  filematch = lambda do |i|
45
- i[:content_filename] &&
46
- Pathname.new(i[:content_filename]).realpath == Pathname.new(filename).realpath
39
+ i.raw_filename &&
40
+ Pathname.new(i.raw_filename).realpath == Pathname.new(filename).realpath
47
41
  end
48
42
  @scoped_items.find(&filematch) || @rest_items.find(&filematch)
49
43
  end
@@ -13,7 +13,7 @@ module Nanoc::Filters
13
13
  full_filename, syntax = ::Sass::Util.destructure(find_real_file(dir, name, options))
14
14
  return unless full_filename && File.readable?(full_filename)
15
15
 
16
- filter = Nanoc::Filters::Sass.current # FIXME ew global
16
+ filter = options[:nanoc_current_filter]
17
17
  item = filter.imported_filename_to_item(full_filename)
18
18
  filter.depend_on([ item ]) unless item.nil?
19
19
 
@@ -101,7 +101,7 @@ module Nanoc::Helpers
101
101
  if block_given? # Set content
102
102
  # Get args
103
103
  if args.size != 1
104
- raise ArgumentError, "expected 1 argument (the name " +
104
+ raise ArgumentError, "expected 1 argument (the name " +
105
105
  "of the capture) but got #{args.size} instead"
106
106
  end
107
107
  name = args[0]
@@ -129,12 +129,12 @@ module Nanoc::Helpers
129
129
  # the content attribute to reset it. :(
130
130
  # FIXME clean this up
131
131
  if !@site.captures_store_compiled_items.include? item
132
- @site.captures_store_compiled_items << item
132
+ @site.captures_store_compiled_items << item
133
133
  item.forced_outdated = true
134
134
  item.reps.each do |r|
135
135
  raw_content = item.raw_content
136
136
  r.content = { :raw => raw_content, :last => raw_content }
137
- @site.compiler.send(:compile_rep, r)
137
+ raise Nanoc::Errors::UnmetDependency.new(r)
138
138
  end
139
139
  end
140
140
  end
@@ -0,0 +1,8 @@
1
+ # encoding: utf-8
2
+
3
+ module Nanoc
4
+
5
+ # The current nanoc version.
6
+ VERSION = '3.6.6'
7
+
8
+ end
@@ -102,4 +102,47 @@ EOS
102
102
  end
103
103
  end
104
104
 
105
+ def test_enable_utf8_only_on_tty
106
+ new_env_diff = {
107
+ 'LC_ALL' => 'en_US.ISO-8859-1',
108
+ 'LC_CTYPE' => 'en_US.ISO-8859-1',
109
+ 'LANG' => 'en_US.ISO-8859-1',
110
+ }
111
+ with_env_vars(new_env_diff) do
112
+ io = StringIO.new
113
+ def io.tty? ; true ; end
114
+ refute Nanoc::CLI.enable_utf8?(io)
115
+
116
+ io = StringIO.new
117
+ def io.tty? ; false ; end
118
+ assert Nanoc::CLI.enable_utf8?(io)
119
+ end
120
+ end
121
+
122
+ def test_enable_utf8
123
+ io = StringIO.new
124
+ def io.tty? ; true ; end
125
+
126
+ new_env_diff = {
127
+ 'LC_ALL' => 'en_US.ISO-8859-1',
128
+ 'LC_CTYPE' => 'en_US.ISO-8859-1',
129
+ 'LANG' => 'en_US.ISO-8859-1',
130
+ }
131
+ with_env_vars(new_env_diff) do
132
+ refute Nanoc::CLI.enable_utf8?(io)
133
+
134
+ with_env_vars({ 'LC_ALL' => 'en_US.UTF-8' }) { assert Nanoc::CLI.enable_utf8?(io) }
135
+ with_env_vars({ 'LC_CTYPE' => 'en_US.UTF-8' }) { assert Nanoc::CLI.enable_utf8?(io) }
136
+ with_env_vars({ 'LANG' => 'en_US.UTF-8' }) { assert Nanoc::CLI.enable_utf8?(io) }
137
+
138
+ with_env_vars({ 'LC_ALL' => 'en_US.utf-8' }) { assert Nanoc::CLI.enable_utf8?(io) }
139
+ with_env_vars({ 'LC_CTYPE' => 'en_US.utf-8' }) { assert Nanoc::CLI.enable_utf8?(io) }
140
+ with_env_vars({ 'LANG' => 'en_US.utf-8' }) { assert Nanoc::CLI.enable_utf8?(io) }
141
+
142
+ with_env_vars({ 'LC_ALL' => 'en_US.utf8' }) { assert Nanoc::CLI.enable_utf8?(io) }
143
+ with_env_vars({ 'LC_CTYPE' => 'en_US.utf8' }) { assert Nanoc::CLI.enable_utf8?(io) }
144
+ with_env_vars({ 'LANG' => 'en_US.utf8' }) { assert Nanoc::CLI.enable_utf8?(io) }
145
+ end
146
+ end
147
+
105
148
  end
@@ -181,7 +181,7 @@ EOS
181
181
  lines.each_slice(2) do |pair|
182
182
  actual_out = eval(pair.first, b)
183
183
  expected_out = eval(pair.last.match(/# ?=>(.*)/)[1], b)
184
-
184
+
185
185
  assert_equal expected_out, actual_out,
186
186
  "Incorrect example:\n#{pair.first}"
187
187
  end
@@ -205,6 +205,14 @@ EOS
205
205
  assert_match(/(^can't modify frozen |^unable to modify frozen object$)/, error.message)
206
206
  end
207
207
 
208
+ def with_env_vars(hash, &block)
209
+ orig_env_hash = ENV.to_hash
210
+ hash.each_pair { |k,v| ENV[k] = v }
211
+ yield
212
+ ensure
213
+ orig_env_hash.each_pair { |k,v| ENV[k] = v }
214
+ end
215
+
208
216
  end
209
217
 
210
218
  class Nanoc::TestCase < MiniTest::Unit::TestCase
@@ -209,18 +209,17 @@ EOS
209
209
  io.write 'Old-<%= content_for(@items.find { |i| i.identifier == \'/includee/\' }, :blah) %>'
210
210
  end
211
211
  Nanoc::CLI.run(%w(compile))
212
+ assert_equal '{}', File.read('output/includee/index.html')
212
213
  assert_equal 'Old-Content', File.read('output/includer/index.html')
213
214
 
214
215
  # Compile again
215
- $LOUD = true
216
216
  File.open('content/includer.erb', 'w') do |io|
217
217
  io.write 'New-<%= content_for(@items.find { |i| i.identifier == \'/includee/\' }, :blah) %>'
218
218
  end
219
219
  Nanoc::CLI.run(%w(compile))
220
+ assert_equal '{}', File.read('output/includee/index.html')
220
221
  assert_equal 'New-Content', File.read('output/includer/index.html')
221
222
  end
222
- ensure
223
- $LOUD = false
224
223
  end
225
224
 
226
225
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nanoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.6.5
4
+ version: 3.6.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-29 00:00:00.000000000 Z
12
+ date: 2013-11-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cri
@@ -289,6 +289,7 @@ files:
289
289
  - lib/nanoc/tasks/deploy/rsync.rake
290
290
  - lib/nanoc/tasks/validate.rake
291
291
  - lib/nanoc/tasks.rb
292
+ - lib/nanoc/version.rb
292
293
  - lib/nanoc.rb
293
294
  - lib/nanoc3/cli.rb
294
295
  - lib/nanoc3/tasks.rb