nanoc 3.6.7 → 3.6.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/CONTRIBUTING.md +9 -13
- data/Gemfile +5 -1
- data/Gemfile.lock +70 -45
- data/NEWS.md +15 -1
- data/README.md +12 -119
- data/doc/yardoc_handlers/identifier.rb +34 -0
- data/lib/nanoc/base/compilation/checksum_store.rb +2 -2
- data/lib/nanoc/base/compilation/compiler.rb +3 -3
- data/lib/nanoc/base/compilation/compiler_dsl.rb +20 -15
- data/lib/nanoc/base/compilation/dependency_tracker.rb +4 -4
- data/lib/nanoc/base/compilation/filter.rb +5 -5
- data/lib/nanoc/base/compilation/item_rep_proxy.rb +2 -2
- data/lib/nanoc/base/compilation/item_rep_recorder_proxy.rb +3 -3
- data/lib/nanoc/base/compilation/outdatedness_checker.rb +49 -46
- data/lib/nanoc/base/compilation/rule.rb +6 -4
- data/lib/nanoc/base/compilation/rule_context.rb +10 -4
- data/lib/nanoc/base/compilation/rule_memory_calculator.rb +8 -7
- data/lib/nanoc/base/compilation/rule_memory_store.rb +2 -2
- data/lib/nanoc/base/compilation/rules_collection.rb +2 -2
- data/lib/nanoc/base/core_ext/array.rb +2 -2
- data/lib/nanoc/base/core_ext/date.rb +4 -2
- data/lib/nanoc/base/core_ext/hash.rb +3 -3
- data/lib/nanoc/base/core_ext/pathname.rb +1 -1
- data/lib/nanoc/base/directed_graph.rb +6 -6
- data/lib/nanoc/base/errors.rb +1 -1
- data/lib/nanoc/base/memoization.rb +4 -4
- data/lib/nanoc/base/notification_center.rb +1 -1
- data/lib/nanoc/base/ordered_hash.rb +207 -179
- data/lib/nanoc/base/plugin_registry.rb +7 -7
- data/lib/nanoc/base/result_data/item_rep.rb +25 -26
- data/lib/nanoc/base/source_data/code_snippet.rb +2 -2
- data/lib/nanoc/base/source_data/configuration.rb +1 -1
- data/lib/nanoc/base/source_data/data_source.rb +2 -2
- data/lib/nanoc/base/source_data/item.rb +16 -15
- data/lib/nanoc/base/source_data/item_array.rb +4 -4
- data/lib/nanoc/base/source_data/layout.rb +5 -5
- data/lib/nanoc/base/source_data/site.rb +6 -6
- data/lib/nanoc/base/store.rb +8 -8
- data/lib/nanoc/cli/cleaning_stream.rb +11 -12
- data/lib/nanoc/cli/command_runner.rb +8 -8
- data/lib/nanoc/cli/commands/autocompile.rb +5 -4
- data/lib/nanoc/cli/commands/check.rb +12 -11
- data/lib/nanoc/cli/commands/compile.rb +50 -52
- data/lib/nanoc/cli/commands/create-item.rb +6 -6
- data/lib/nanoc/cli/commands/create-layout.rb +6 -6
- data/lib/nanoc/cli/commands/create-site.rb +10 -13
- data/lib/nanoc/cli/commands/deploy.rb +11 -11
- data/lib/nanoc/cli/commands/prune.rb +10 -10
- data/lib/nanoc/cli/commands/shell.rb +7 -7
- data/lib/nanoc/cli/commands/show-data.rb +22 -23
- data/lib/nanoc/cli/commands/show-plugins.rb +3 -3
- data/lib/nanoc/cli/commands/show-rules.rb +8 -8
- data/lib/nanoc/cli/commands/sync.rb +4 -2
- data/lib/nanoc/cli/commands/update.rb +4 -4
- data/lib/nanoc/cli/commands/validate-css.rb +3 -3
- data/lib/nanoc/cli/commands/validate-html.rb +3 -3
- data/lib/nanoc/cli/commands/validate-links.rb +3 -3
- data/lib/nanoc/cli/commands/view.rb +5 -3
- data/lib/nanoc/cli/commands/watch.rb +12 -12
- data/lib/nanoc/cli/error_handler.rb +58 -58
- data/lib/nanoc/cli/logger.rb +6 -6
- data/lib/nanoc/cli/stream_cleaners/abstract.rb +1 -1
- data/lib/nanoc/cli/stream_cleaners.rb +0 -1
- data/lib/nanoc/cli.rb +24 -22
- data/lib/nanoc/data_sources/deprecated/delicious.rb +1 -1
- data/lib/nanoc/data_sources/deprecated/last_fm.rb +16 -14
- data/lib/nanoc/data_sources/deprecated/twitter.rb +1 -1
- data/lib/nanoc/data_sources/filesystem.rb +22 -20
- data/lib/nanoc/data_sources/filesystem_unified.rb +4 -5
- data/lib/nanoc/data_sources/filesystem_verbose.rb +2 -3
- data/lib/nanoc/data_sources/static.rb +2 -2
- data/lib/nanoc/extra/auto_compiler.rb +3 -3
- data/lib/nanoc/extra/checking/check.rb +3 -3
- data/lib/nanoc/extra/checking/checks/css.rb +2 -2
- data/lib/nanoc/extra/checking/checks/external_links.rb +9 -9
- data/lib/nanoc/extra/checking/checks/html.rb +2 -3
- data/lib/nanoc/extra/checking/checks/internal_links.rb +6 -7
- data/lib/nanoc/extra/checking/checks/stale.rb +6 -6
- data/lib/nanoc/extra/checking/dsl.rb +1 -1
- data/lib/nanoc/extra/checking/runner.rb +19 -19
- data/lib/nanoc/extra/chick.rb +11 -9
- data/lib/nanoc/extra/core_ext/pathname.rb +1 -2
- data/lib/nanoc/extra/core_ext/time.rb +2 -2
- data/lib/nanoc/extra/core_ext.rb +0 -1
- data/lib/nanoc/extra/deployer.rb +2 -2
- data/lib/nanoc/extra/deployers/fog.rb +12 -12
- data/lib/nanoc/extra/deployers/rsync.rb +6 -6
- data/lib/nanoc/extra/file_proxy.rb +1 -1
- data/lib/nanoc/extra/filesystem_tools.rb +5 -5
- data/lib/nanoc/extra/link_collector.rb +4 -3
- data/lib/nanoc/extra/pruner.rb +5 -5
- data/lib/nanoc/extra/validators/links.rb +3 -3
- data/lib/nanoc/extra/vcs.rb +1 -1
- data/lib/nanoc/filters/asciidoc.rb +3 -3
- data/lib/nanoc/filters/bluecloth.rb +1 -1
- data/lib/nanoc/filters/coderay.rb +2 -2
- data/lib/nanoc/filters/coffeescript.rb +2 -0
- data/lib/nanoc/filters/colorize_syntax.rb +16 -16
- data/lib/nanoc/filters/erb.rb +5 -5
- data/lib/nanoc/filters/erubis.rb +1 -1
- data/lib/nanoc/filters/haml.rb +1 -1
- data/lib/nanoc/filters/handlebars.rb +2 -2
- data/lib/nanoc/filters/kramdown.rb +1 -1
- data/lib/nanoc/filters/less.rb +1 -1
- data/lib/nanoc/filters/markaby.rb +1 -1
- data/lib/nanoc/filters/maruku.rb +1 -1
- data/lib/nanoc/filters/mustache.rb +1 -1
- data/lib/nanoc/filters/pandoc.rb +1 -1
- data/lib/nanoc/filters/rainpress.rb +1 -1
- data/lib/nanoc/filters/rdiscount.rb +1 -1
- data/lib/nanoc/filters/rdoc.rb +1 -1
- data/lib/nanoc/filters/redcarpet.rb +2 -2
- data/lib/nanoc/filters/redcloth.rb +9 -9
- data/lib/nanoc/filters/relativize_paths.rb +7 -8
- data/lib/nanoc/filters/rubypants.rb +1 -1
- data/lib/nanoc/filters/sass/sass_filesystem_importer.rb +1 -1
- data/lib/nanoc/filters/sass.rb +1 -1
- data/lib/nanoc/filters/slim.rb +1 -1
- data/lib/nanoc/filters/typogruby.rb +1 -1
- data/lib/nanoc/filters/uglify_js.rb +1 -1
- data/lib/nanoc/filters/xsl.rb +9 -7
- data/lib/nanoc/filters/yui_compressor.rb +2 -0
- data/lib/nanoc/helpers/blogging.rb +6 -6
- data/lib/nanoc/helpers/breadcrumbs.rb +1 -1
- data/lib/nanoc/helpers/capturing.rb +2 -2
- data/lib/nanoc/helpers/filtering.rb +1 -1
- data/lib/nanoc/helpers/html_escape.rb +3 -3
- data/lib/nanoc/helpers/link_to.rb +6 -6
- data/lib/nanoc/helpers/rendering.rb +2 -2
- data/lib/nanoc/helpers/tagging.rb +2 -2
- data/lib/nanoc/helpers/text.rb +1 -1
- data/lib/nanoc/helpers/xml_sitemap.rb +2 -2
- data/lib/nanoc/version.rb +1 -1
- data/lib/nanoc.rb +3 -2
- data/nanoc.gemspec +2 -6
- data/tasks/rubocop.rake +5 -0
- data/test/base/test_compiler_dsl.rb +20 -1
- data/test/cli/commands/test_compile.rb +4 -3
- data/test/cli/test_error_handler.rb +32 -0
- data/test/filters/test_erb.rb +1 -1
- data/test/filters/test_less.rb +1 -1
- data/test/filters/test_xsl.rb +95 -8
- metadata +30 -84
data/lib/nanoc/cli.rb
CHANGED
@@ -55,8 +55,8 @@ module Nanoc::CLI
|
|
55
55
|
# @return [void]
|
56
56
|
def self.run(args)
|
57
57
|
Nanoc::CLI::ErrorHandler.handle_while do
|
58
|
-
|
59
|
-
|
58
|
+
setup
|
59
|
+
root_command.run(args)
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
@@ -71,7 +71,7 @@ module Nanoc::CLI
|
|
71
71
|
#
|
72
72
|
# @return [void]
|
73
73
|
def self.add_command(cmd)
|
74
|
-
|
74
|
+
root_command.add_command(cmd)
|
75
75
|
end
|
76
76
|
|
77
77
|
protected
|
@@ -80,9 +80,9 @@ protected
|
|
80
80
|
#
|
81
81
|
# @return [void]
|
82
82
|
def self.setup
|
83
|
-
|
84
|
-
|
85
|
-
|
83
|
+
setup_cleaning_streams
|
84
|
+
setup_commands
|
85
|
+
load_custom_commands
|
86
86
|
end
|
87
87
|
|
88
88
|
# Sets up the root command and base subcommands.
|
@@ -93,19 +93,19 @@ protected
|
|
93
93
|
@root_command = nil
|
94
94
|
|
95
95
|
# Add root command
|
96
|
-
filename = File.dirname(__FILE__) +
|
97
|
-
@root_command =
|
96
|
+
filename = File.dirname(__FILE__) + '/cli/commands/nanoc.rb'
|
97
|
+
@root_command = load_command_at(filename)
|
98
98
|
|
99
99
|
# Add help command
|
100
100
|
help_cmd = Cri::Command.new_basic_help
|
101
|
-
|
101
|
+
add_command(help_cmd)
|
102
102
|
|
103
103
|
# Add other commands
|
104
104
|
cmd_filenames = Dir[File.dirname(__FILE__) + '/cli/commands/*.rb']
|
105
|
-
cmd_filenames.each do |
|
106
|
-
next if File.basename(
|
107
|
-
cmd =
|
108
|
-
|
105
|
+
cmd_filenames.each do |cmd_filename|
|
106
|
+
next if File.basename(cmd_filename, '.rb') == 'nanoc'
|
107
|
+
cmd = load_command_at(cmd_filename)
|
108
|
+
add_command(cmd)
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
@@ -113,15 +113,15 @@ protected
|
|
113
113
|
#
|
114
114
|
# @return [void]
|
115
115
|
def self.load_custom_commands
|
116
|
-
|
116
|
+
recursive_contents_of('commands').each do |filename|
|
117
117
|
# Create command
|
118
118
|
command = Nanoc::CLI.load_command_at(filename)
|
119
119
|
|
120
120
|
# Get supercommand
|
121
121
|
pieces = filename.gsub(/^commands\/|\.rb$/, '').split('/')
|
122
|
-
pieces = pieces[0, pieces.size-1] || []
|
122
|
+
pieces = pieces[0, pieces.size - 1] || []
|
123
123
|
root = Nanoc::CLI.root_command
|
124
|
-
supercommand = pieces.
|
124
|
+
supercommand = pieces.reduce(root) do |cmd, piece|
|
125
125
|
cmd.nil? ? nil : cmd.command_named(piece)
|
126
126
|
end
|
127
127
|
|
@@ -138,7 +138,7 @@ protected
|
|
138
138
|
# @param [String] filename The name of the file that contains the command
|
139
139
|
#
|
140
140
|
# @return [Cri::Command] The loaded command
|
141
|
-
def self.load_command_at(filename, command_name=nil)
|
141
|
+
def self.load_command_at(filename, command_name = nil)
|
142
142
|
# Load
|
143
143
|
code = File.read(filename)
|
144
144
|
cmd = Cri::Command.define(code, filename)
|
@@ -155,7 +155,7 @@ protected
|
|
155
155
|
def self.recursive_contents_of(path)
|
156
156
|
return [] unless File.directory?(path)
|
157
157
|
files, dirs = *Dir[path + '/*'].sort.partition { |e| File.file?(e) }
|
158
|
-
dirs.each { |d| files.concat
|
158
|
+
dirs.each { |d| files.concat recursive_contents_of(d) }
|
159
159
|
files
|
160
160
|
end
|
161
161
|
|
@@ -183,8 +183,8 @@ protected
|
|
183
183
|
#
|
184
184
|
# @return [void]
|
185
185
|
def self.setup_cleaning_streams
|
186
|
-
$stdout =
|
187
|
-
$stderr =
|
186
|
+
$stdout = wrap_in_cleaning_stream($stdout)
|
187
|
+
$stderr = wrap_in_cleaning_stream($stderr)
|
188
188
|
end
|
189
189
|
|
190
190
|
# @return [Boolean] true if UTF-8 support is present, false if not
|
@@ -196,13 +196,15 @@ protected
|
|
196
196
|
|
197
197
|
# @return [Boolean] true if color support is present, false if not
|
198
198
|
def self.enable_ansi_colors?(io)
|
199
|
-
|
199
|
+
if !io.tty?
|
200
|
+
return false
|
201
|
+
end
|
200
202
|
|
201
203
|
if Nanoc.on_windows?
|
202
204
|
return defined?(::Win32::Console::ANSI)
|
203
205
|
end
|
204
206
|
|
205
|
-
|
207
|
+
true
|
206
208
|
end
|
207
209
|
|
208
210
|
end
|
@@ -11,7 +11,7 @@ module Nanoc::DataSources
|
|
11
11
|
|
12
12
|
# Get data
|
13
13
|
@http_client ||= Nanoc::Extra::CHiCk::Client.new
|
14
|
-
|
14
|
+
_status, _headers, data = *@http_client.get("http://feeds.delicious.com/v2/json/#{config[:username]}")
|
15
15
|
|
16
16
|
# Parse as JSON
|
17
17
|
raw_items = JSON.parse(data)
|
@@ -11,21 +11,21 @@ module Nanoc::DataSources
|
|
11
11
|
require 'uri'
|
12
12
|
|
13
13
|
# Check configuration
|
14
|
-
if
|
15
|
-
raise
|
14
|
+
if config[:username].nil?
|
15
|
+
raise 'LastFM data source requires a username in the configuration'
|
16
16
|
end
|
17
|
-
if
|
18
|
-
raise
|
17
|
+
if config[:api_key].nil?
|
18
|
+
raise 'LastFM data source requires an API key in the configuration'
|
19
19
|
end
|
20
20
|
|
21
21
|
# Get data
|
22
22
|
@http_client ||= Nanoc::Extra::CHiCk::Client.new
|
23
|
-
|
23
|
+
_status, _headers, data = *@http_client.get(
|
24
24
|
'http://ws.audioscrobbler.com/2.0/' +
|
25
25
|
'?method=user.getRecentTracks' +
|
26
26
|
'&format=json' +
|
27
|
-
'&user=' + URI.escape(
|
28
|
-
'&api_key=' + URI.escape(
|
27
|
+
'&user=' + URI.escape(config[:username]) +
|
28
|
+
'&api_key=' + URI.escape(config[:api_key])
|
29
29
|
)
|
30
30
|
|
31
31
|
# Parse as JSON
|
@@ -35,16 +35,18 @@ module Nanoc::DataSources
|
|
35
35
|
# Convert to items
|
36
36
|
raw_items.enum_with_index.map do |raw_item, i|
|
37
37
|
# Get artist data
|
38
|
-
|
38
|
+
_artist_status, _artist_headers, artist_data = *@http_client.get(
|
39
39
|
'http://ws.audioscrobbler.com/2.0/' +
|
40
40
|
'?method=artist.getInfo' +
|
41
41
|
'&format=json' +
|
42
42
|
(
|
43
|
-
raw_item['artist']['mbid'].empty?
|
44
|
-
|
45
|
-
|
43
|
+
if raw_item['artist']['mbid'].empty?
|
44
|
+
'&artist=' + URI.escape(raw_item['artist']['#text'])
|
45
|
+
else
|
46
|
+
'&mbid=' + URI.escape(raw_item['artist']['mbid'])
|
47
|
+
end
|
46
48
|
) +
|
47
|
-
'&api_key=' + URI.escape(
|
49
|
+
'&api_key=' + URI.escape(config[:api_key])
|
48
50
|
)
|
49
51
|
|
50
52
|
# Parse as JSON
|
@@ -59,10 +61,10 @@ module Nanoc::DataSources
|
|
59
61
|
track_played_at = Time.now
|
60
62
|
now_playing = true
|
61
63
|
else
|
62
|
-
|
64
|
+
track_played_at = Time.parse(raw_item['date']['#text'])
|
63
65
|
now_playing = false
|
64
66
|
end
|
65
|
-
|
67
|
+
|
66
68
|
attributes = {
|
67
69
|
:name => raw_item['name'],
|
68
70
|
:artist => {
|
@@ -11,7 +11,7 @@ module Nanoc::DataSources
|
|
11
11
|
|
12
12
|
# Get data
|
13
13
|
@http_client ||= Nanoc::Extra::CHiCk::Client.new
|
14
|
-
|
14
|
+
_status, _headers, data = *@http_client.get("http://twitter.com/statuses/user_timeline/#{config[:username]}.json")
|
15
15
|
|
16
16
|
# Parse as JSON
|
17
17
|
raw_items = JSON.parse(data)
|
@@ -43,12 +43,12 @@ module Nanoc::DataSources
|
|
43
43
|
end
|
44
44
|
|
45
45
|
# See {Nanoc::DataSource#create_item}.
|
46
|
-
def create_item(content, attributes, identifier, params={})
|
46
|
+
def create_item(content, attributes, identifier, params = {})
|
47
47
|
create_object('content', content, attributes, identifier, params)
|
48
48
|
end
|
49
49
|
|
50
50
|
# See {Nanoc::DataSource#create_layout}.
|
51
|
-
def create_layout(content, attributes, identifier, params={})
|
51
|
+
def create_layout(content, attributes, identifier, params = {})
|
52
52
|
create_object('layouts', content, attributes, identifier, params)
|
53
53
|
end
|
54
54
|
|
@@ -57,7 +57,7 @@ module Nanoc::DataSources
|
|
57
57
|
# Creates a new object (item or layout) on disk in dir_name according to
|
58
58
|
# the given identifier. The file will have its attributes taken from the
|
59
59
|
# attributes hash argument and its content from the content argument.
|
60
|
-
def create_object(dir_name, content, attributes, identifier, params={})
|
60
|
+
def create_object(dir_name, content, attributes, identifier, params = {})
|
61
61
|
raise NotImplementedError.new(
|
62
62
|
"#{self.class} does not implement ##{name}"
|
63
63
|
)
|
@@ -103,11 +103,11 @@ module Nanoc::DataSources
|
|
103
103
|
|
104
104
|
# Get identifier
|
105
105
|
if meta_filename
|
106
|
-
identifier = identifier_for_filename(meta_filename[(dir_name.length+1)..-1])
|
106
|
+
identifier = identifier_for_filename(meta_filename[(dir_name.length + 1)..-1])
|
107
107
|
elsif content_filename
|
108
|
-
identifier = identifier_for_filename(content_filename[(dir_name.length+1)..-1])
|
108
|
+
identifier = identifier_for_filename(content_filename[(dir_name.length + 1)..-1])
|
109
109
|
else
|
110
|
-
raise
|
110
|
+
raise 'meta_filename and content_filename are both nil'
|
111
111
|
end
|
112
112
|
|
113
113
|
# Get modification times
|
@@ -120,7 +120,7 @@ module Nanoc::DataSources
|
|
120
120
|
elsif content_mtime
|
121
121
|
mtime = content_mtime
|
122
122
|
else
|
123
|
-
raise
|
123
|
+
raise 'meta_mtime and content_mtime are both nil'
|
124
124
|
end
|
125
125
|
|
126
126
|
# Create layout object
|
@@ -143,14 +143,10 @@ module Nanoc::DataSources
|
|
143
143
|
# 'content/qux' => [ nil, 'html' ]
|
144
144
|
# }
|
145
145
|
def all_split_files_in(dir_name)
|
146
|
-
|
147
|
-
|
148
|
-
|
146
|
+
grouped_filenames = all_files_in(dir_name).
|
147
|
+
reject { |fn| fn =~ /(~|\.orig|\.rej|\.bak)$/ }.
|
148
|
+
group_by { |fn| basename_of(fn) }
|
149
149
|
|
150
|
-
# Group by identifier
|
151
|
-
grouped_filenames = filenames.group_by { |fn| basename_of(fn) }
|
152
|
-
|
153
|
-
# Convert values into metafile/content file extension tuple
|
154
150
|
grouped_filenames.each_pair do |key, filenames|
|
155
151
|
# Divide
|
156
152
|
meta_filenames = filenames.select { |fn| ext_of(fn) == '.yaml' }
|
@@ -158,18 +154,17 @@ module Nanoc::DataSources
|
|
158
154
|
|
159
155
|
# Check number of files per type
|
160
156
|
if ![ 0, 1 ].include?(meta_filenames.size)
|
161
|
-
raise
|
157
|
+
raise "Found #{meta_filenames.size} meta files for #{key}; expected 0 or 1"
|
162
158
|
end
|
163
159
|
if ![ 0, 1 ].include?(content_filenames.size)
|
164
|
-
raise
|
160
|
+
raise "Found #{content_filenames.size} content files for #{key}; expected 0 or 1"
|
165
161
|
end
|
166
162
|
|
167
163
|
# Reorder elements and convert to extnames
|
168
164
|
filenames[0] = meta_filenames[0] ? 'yaml' : nil
|
169
|
-
filenames[1] = content_filenames[0] ? ext_of(content_filenames[0])[1..-1] || '': nil
|
165
|
+
filenames[1] = content_filenames[0] ? ext_of(content_filenames[0])[1..-1] || '' : nil
|
170
166
|
end
|
171
167
|
|
172
|
-
# Done
|
173
168
|
grouped_filenames
|
174
169
|
end
|
175
170
|
|
@@ -292,8 +287,15 @@ module Nanoc::DataSources
|
|
292
287
|
original_encoding = data.encoding
|
293
288
|
end
|
294
289
|
|
295
|
-
|
296
|
-
|
290
|
+
begin
|
291
|
+
data.encode!('UTF-8')
|
292
|
+
rescue
|
293
|
+
raise_encoding_error(filename, original_encoding)
|
294
|
+
end
|
295
|
+
|
296
|
+
if !data.valid_encoding?
|
297
|
+
raise_encoding_error(filename, original_encoding)
|
298
|
+
end
|
297
299
|
end
|
298
300
|
|
299
301
|
# Remove UTF-8 BOM (ugly)
|
@@ -67,11 +67,10 @@ module Nanoc::DataSources
|
|
67
67
|
private
|
68
68
|
|
69
69
|
# See {Nanoc::DataSources::Filesystem#create_object}.
|
70
|
-
def create_object(dir_name, content, attributes, identifier, params={})
|
70
|
+
def create_object(dir_name, content, attributes, identifier, params = {})
|
71
71
|
# Check for periods
|
72
72
|
if (@config.nil? || !@config[:allow_periods_in_identifiers]) && identifier.include?('.')
|
73
|
-
raise
|
74
|
-
"Attempted to create an object in #{dir_name} with identifier #{identifier} containing a period, but allow_periods_in_identifiers is not enabled in the site configuration. (Enabling allow_periods_in_identifiers may cause the site to break, though.)"
|
73
|
+
raise "Attempted to create an object in #{dir_name} with identifier #{identifier} containing a period, but allow_periods_in_identifiers is not enabled in the site configuration. (Enabling allow_periods_in_identifiers may cause the site to break, though.)"
|
75
74
|
end
|
76
75
|
|
77
76
|
# Determine path
|
@@ -109,9 +108,9 @@ module Nanoc::DataSources
|
|
109
108
|
# the given directory name off the filename.
|
110
109
|
def identifier_for_filename(filename)
|
111
110
|
if filename =~ /(^|\/)index(\.[^\/]+)?$/
|
112
|
-
regex =
|
111
|
+
regex = @config && @config[:allow_periods_in_identifiers] ? /\/?(index)?(\.[^\/\.]+)?$/ : /\/?index(\.[^\/]+)?$/
|
113
112
|
else
|
114
|
-
regex =
|
113
|
+
regex = @config && @config[:allow_periods_in_identifiers] ? /\.[^\/\.]+$/ : /\.[^\/]+$/
|
115
114
|
end
|
116
115
|
filename.sub(regex, '').cleaned_identifier
|
117
116
|
end
|
@@ -46,17 +46,16 @@ module Nanoc::DataSources
|
|
46
46
|
private
|
47
47
|
|
48
48
|
# See {Nanoc::DataSources::Filesystem#create_object}.
|
49
|
-
def create_object(dir_name, content, attributes, identifier, params={})
|
49
|
+
def create_object(dir_name, content, attributes, identifier, params = {})
|
50
50
|
# Determine base path
|
51
51
|
last_component = identifier.split('/')[-1] || dir_name
|
52
|
-
base_path = dir_name + identifier + last_component
|
53
52
|
|
54
53
|
# Get filenames
|
55
54
|
ext = params[:extension] || '.html'
|
56
55
|
dir_path = dir_name + identifier
|
57
56
|
meta_filename = dir_name + identifier + last_component + '.yaml'
|
58
57
|
content_filename = dir_name + identifier + last_component + ext
|
59
|
-
|
58
|
+
|
60
59
|
# Notify
|
61
60
|
Nanoc::NotificationCenter.post(:file_created, meta_filename)
|
62
61
|
Nanoc::NotificationCenter.post(:file_created, content_filename)
|
@@ -34,13 +34,13 @@ module Nanoc::DataSources
|
|
34
34
|
prefix = config[:prefix] || 'static'
|
35
35
|
|
36
36
|
# Convert filenames to items
|
37
|
-
|
37
|
+
all_files_in(prefix).map do |filename|
|
38
38
|
attributes = {
|
39
39
|
:extension => File.extname(filename)[1..-1],
|
40
40
|
:filename => filename,
|
41
41
|
}
|
42
42
|
attributes[:is_hidden] = true unless config[:hide_items] == false
|
43
|
-
identifier = filename[(prefix.length+1)..-1] + '/'
|
43
|
+
identifier = filename[(prefix.length + 1)..-1] + '/'
|
44
44
|
mtime = File.mtime(filename)
|
45
45
|
checksum = Pathname.new(filename).checksum
|
46
46
|
|
@@ -25,7 +25,7 @@ module Nanoc::Extra
|
|
25
25
|
end
|
26
26
|
|
27
27
|
# Calls the autocompiler. The behaviour of this method is defined by the
|
28
|
-
# [Rack specification](http://rack.rubyforge.org/doc/
|
28
|
+
# [Rack specification](http://rack.rubyforge.org/doc/SPEC.html).
|
29
29
|
#
|
30
30
|
# @param [Hash] env The environment, as defined by the Rack specification
|
31
31
|
#
|
@@ -37,7 +37,7 @@ module Nanoc::Extra
|
|
37
37
|
build_site
|
38
38
|
|
39
39
|
# Find rep
|
40
|
-
path = Rack::Utils
|
40
|
+
path = Rack::Utils.unescape(env['PATH_INFO'])
|
41
41
|
reps = site.items.map { |i| i.reps }.flatten
|
42
42
|
rep = reps.find do |r|
|
43
43
|
r.path == path ||
|
@@ -87,7 +87,7 @@ module Nanoc::Extra
|
|
87
87
|
|
88
88
|
def mime_type_of(path, fallback)
|
89
89
|
mime_type = MIME::Types.of(path).first
|
90
|
-
mime_type
|
90
|
+
mime_type.nil? ? fallback : mime_type.simplified
|
91
91
|
end
|
92
92
|
|
93
93
|
def file_server
|
@@ -15,17 +15,17 @@ module Nanoc::Extra::Checking
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def run
|
18
|
-
raise NotImplementedError.new(
|
18
|
+
raise NotImplementedError.new('Nanoc::Extra::Checking::Check subclasses must implement #run')
|
19
19
|
end
|
20
20
|
|
21
|
-
def add_issue(desc, params={})
|
21
|
+
def add_issue(desc, params = {})
|
22
22
|
subject = params.fetch(:subject, nil)
|
23
23
|
|
24
24
|
@issues << Issue.new(desc, subject, self.class)
|
25
25
|
end
|
26
26
|
|
27
27
|
def output_filenames
|
28
|
-
Dir[@site.config[:output_dir] + '/**/*'].select{ |f| File.file?(f) }
|
28
|
+
Dir[@site.config[:output_dir] + '/**/*'].select { |f| File.file?(f) }
|
29
29
|
end
|
30
30
|
|
31
31
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# encoding: utf-8
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
3
|
module ::Nanoc::Extra::Checking::Checks
|
4
4
|
|
@@ -13,7 +13,7 @@ module ::Nanoc::Extra::Checking::Checks
|
|
13
13
|
results = ::W3CValidators::CSSValidator.new.validate_file(filename)
|
14
14
|
results.errors.each do |e|
|
15
15
|
desc = e.message.gsub(%r{\s+}, ' ').strip
|
16
|
-
|
16
|
+
add_issue(desc, :subject => filename)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -16,16 +16,16 @@ module ::Nanoc::Extra::Checking::Checks
|
|
16
16
|
def run
|
17
17
|
# Find all broken external hrefs
|
18
18
|
# TODO de-duplicate this (duplicated in internal links check)
|
19
|
-
filenames =
|
19
|
+
filenames = output_filenames.select { |f| File.extname(f) == '.html' }
|
20
20
|
hrefs_with_filenames = ::Nanoc::Extra::LinkCollector.new(filenames, :external).filenames_per_href
|
21
|
-
results =
|
21
|
+
results = select_invalid(hrefs_with_filenames.keys)
|
22
22
|
|
23
23
|
# Report them
|
24
24
|
results.each do |res|
|
25
25
|
filenames = hrefs_with_filenames[res.href]
|
26
26
|
filenames.each do |filename|
|
27
|
-
|
28
|
-
"reference to #{res.href}: #{res.explanation}",
|
27
|
+
add_issue(
|
28
|
+
"broken reference to #{res.href}: #{res.explanation}",
|
29
29
|
:subject => filename)
|
30
30
|
end
|
31
31
|
end
|
@@ -54,7 +54,7 @@ module ::Nanoc::Extra::Checking::Checks
|
|
54
54
|
def next
|
55
55
|
@mutex.synchronize do
|
56
56
|
@index += 1
|
57
|
-
return @array[@index-1]
|
57
|
+
return @array[@index - 1]
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -71,7 +71,7 @@ module ::Nanoc::Extra::Checking::Checks
|
|
71
71
|
loop do
|
72
72
|
href = enum.next
|
73
73
|
break if href.nil?
|
74
|
-
res =
|
74
|
+
res = validate(href)
|
75
75
|
if res
|
76
76
|
mutex.synchronize do
|
77
77
|
invalid << res
|
@@ -101,7 +101,7 @@ module ::Nanoc::Extra::Checking::Checks
|
|
101
101
|
res = nil
|
102
102
|
5.times do |i|
|
103
103
|
begin
|
104
|
-
Timeout
|
104
|
+
Timeout.timeout(10) do
|
105
105
|
res = request_url_once(url)
|
106
106
|
if res.code == '405'
|
107
107
|
res = request_url_once(url, Net::HTTP::Get)
|
@@ -151,13 +151,13 @@ module ::Nanoc::Extra::Checking::Checks
|
|
151
151
|
end
|
152
152
|
|
153
153
|
def request_url_once(url, req_method = Net::HTTP::Head)
|
154
|
-
req = req_method.new(
|
154
|
+
req = req_method.new(path_for_url(url))
|
155
155
|
http = Net::HTTP.new(url.host, url.port)
|
156
156
|
if url.instance_of? URI::HTTPS
|
157
157
|
http.use_ssl = true
|
158
158
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
159
159
|
end
|
160
|
-
|
160
|
+
http.request(req)
|
161
161
|
end
|
162
162
|
|
163
163
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# encoding: utf-8
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
3
|
module ::Nanoc::Extra::Checking::Checks
|
4
4
|
|
@@ -13,7 +13,7 @@ module ::Nanoc::Extra::Checking::Checks
|
|
13
13
|
results = ::W3CValidators::MarkupValidator.new.validate_file(filename)
|
14
14
|
results.errors.each do |e|
|
15
15
|
desc = e.message.gsub(%r{\s+}, ' ').strip
|
16
|
-
|
16
|
+
add_issue(desc, :subject => filename)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -21,4 +21,3 @@ module ::Nanoc::Extra::Checking::Checks
|
|
21
21
|
end
|
22
22
|
|
23
23
|
end
|
24
|
-
|
@@ -12,13 +12,13 @@ module Nanoc::Extra::Checking::Checks
|
|
12
12
|
# @return [void]
|
13
13
|
def run
|
14
14
|
# TODO de-duplicate this (duplicated in external links check)
|
15
|
-
filenames =
|
15
|
+
filenames = output_filenames.select { |f| File.extname(f) == '.html' }
|
16
16
|
hrefs_with_filenames = ::Nanoc::Extra::LinkCollector.new(filenames, :internal).filenames_per_href
|
17
|
-
hrefs_with_filenames.each_pair do |href,
|
18
|
-
|
17
|
+
hrefs_with_filenames.each_pair do |href, fns|
|
18
|
+
fns.each do |filename|
|
19
19
|
unless valid?(href, filename)
|
20
|
-
|
21
|
-
"reference to #{href}",
|
20
|
+
add_issue(
|
21
|
+
"broken reference to #{href}",
|
22
22
|
:subject => filename)
|
23
23
|
end
|
24
24
|
end
|
@@ -57,10 +57,9 @@ module Nanoc::Extra::Checking::Checks
|
|
57
57
|
return true if File.directory?(path) && @site.config[:index_filenames].any? { |fn| File.file?(File.join(path, fn)) }
|
58
58
|
|
59
59
|
# Nope :(
|
60
|
-
|
60
|
+
false
|
61
61
|
end
|
62
62
|
|
63
63
|
end
|
64
64
|
|
65
65
|
end
|
66
|
-
|
@@ -7,19 +7,19 @@ module Nanoc::Extra::Checking::Checks
|
|
7
7
|
def run
|
8
8
|
require 'set'
|
9
9
|
|
10
|
-
item_rep_paths = Set.new(@site.items.
|
10
|
+
item_rep_paths = Set.new(@site.items.map { |i| i.reps }.flatten.map { |r| r.raw_path })
|
11
11
|
|
12
|
-
|
13
|
-
next if
|
12
|
+
output_filenames.each do |f|
|
13
|
+
next if pruner.filename_excluded?(f)
|
14
14
|
if !item_rep_paths.include?(f)
|
15
|
-
|
16
|
-
|
15
|
+
add_issue(
|
16
|
+
'file without matching item',
|
17
17
|
:subject => f)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
|
22
|
+
protected
|
23
23
|
|
24
24
|
def pruner
|
25
25
|
exclude_config = @site.config.fetch(:prune, {}).fetch(:exclude, [])
|