lib/nanoc/data_sources/filesystem.rb in nanoc-3.6.7 vs lib/nanoc/data_sources/filesystem.rb in nanoc-3.6.8

- old
+ new

@@ -41,25 +41,25 @@ def layouts load_objects('layouts', 'layout', Nanoc::Layout) end # See {Nanoc::DataSource#create_item}. - def create_item(content, attributes, identifier, params={}) + def create_item(content, attributes, identifier, params = {}) create_object('content', content, attributes, identifier, params) end # See {Nanoc::DataSource#create_layout}. - def create_layout(content, attributes, identifier, params={}) + def create_layout(content, attributes, identifier, params = {}) create_object('layouts', content, attributes, identifier, params) end protected # Creates a new object (item or layout) on disk in dir_name according to # the given identifier. The file will have its attributes taken from the # attributes hash argument and its content from the content argument. - def create_object(dir_name, content, attributes, identifier, params={}) + def create_object(dir_name, content, attributes, identifier, params = {}) raise NotImplementedError.new( "#{self.class} does not implement ##{name}" ) end @@ -101,15 +101,15 @@ :file => content_filename ? Nanoc::Extra::FileProxy.new(content_filename) : nil }.merge(meta) # Get identifier if meta_filename - identifier = identifier_for_filename(meta_filename[(dir_name.length+1)..-1]) + identifier = identifier_for_filename(meta_filename[(dir_name.length + 1)..-1]) elsif content_filename - identifier = identifier_for_filename(content_filename[(dir_name.length+1)..-1]) + identifier = identifier_for_filename(content_filename[(dir_name.length + 1)..-1]) else - raise RuntimeError, "meta_filename and content_filename are both nil" + raise 'meta_filename and content_filename are both nil' end # Get modification times meta_mtime = meta_filename ? File.stat(meta_filename).mtime : nil content_mtime = content_filename ? File.stat(content_filename).mtime : nil @@ -118,11 +118,11 @@ elsif meta_mtime mtime = meta_mtime elsif content_mtime mtime = content_mtime else - raise RuntimeError, "meta_mtime and content_mtime are both nil" + raise 'meta_mtime and content_mtime are both nil' end # Create layout object klass.new( content_or_filename, attributes, identifier, @@ -141,37 +141,32 @@ # 'content/foo' => [ 'yaml', 'html' ], # 'content/bar' => [ 'yaml', nil ], # 'content/qux' => [ nil, 'html' ] # } def all_split_files_in(dir_name) - # Get all good file names - filenames = self.all_files_in(dir_name) - filenames.reject! { |fn| fn =~ /(~|\.orig|\.rej|\.bak)$/ } + grouped_filenames = all_files_in(dir_name). + reject { |fn| fn =~ /(~|\.orig|\.rej|\.bak)$/ }. + group_by { |fn| basename_of(fn) } - # Group by identifier - grouped_filenames = filenames.group_by { |fn| basename_of(fn) } - - # Convert values into metafile/content file extension tuple grouped_filenames.each_pair do |key, filenames| # Divide meta_filenames = filenames.select { |fn| ext_of(fn) == '.yaml' } content_filenames = filenames.select { |fn| ext_of(fn) != '.yaml' } # Check number of files per type if ![ 0, 1 ].include?(meta_filenames.size) - raise RuntimeError, "Found #{meta_filenames.size} meta files for #{key}; expected 0 or 1" + raise "Found #{meta_filenames.size} meta files for #{key}; expected 0 or 1" end if ![ 0, 1 ].include?(content_filenames.size) - raise RuntimeError, "Found #{content_filenames.size} content files for #{key}; expected 0 or 1" + raise "Found #{content_filenames.size} content files for #{key}; expected 0 or 1" end # Reorder elements and convert to extnames filenames[0] = meta_filenames[0] ? 'yaml' : nil - filenames[1] = content_filenames[0] ? ext_of(content_filenames[0])[1..-1] || '': nil + filenames[1] = content_filenames[0] ? ext_of(content_filenames[0])[1..-1] || '' : nil end - # Done grouped_filenames end # Returns all files in the given directory and directories below it. def all_files_in(dir_name) @@ -290,11 +285,18 @@ data.force_encoding(@config[:encoding]) else original_encoding = data.encoding end - data.encode!('UTF-8') rescue raise_encoding_error(filename, original_encoding) - raise_encoding_error(filename, original_encoding) if !data.valid_encoding? + begin + data.encode!('UTF-8') + rescue + raise_encoding_error(filename, original_encoding) + end + + if !data.valid_encoding? + raise_encoding_error(filename, original_encoding) + end end # Remove UTF-8 BOM (ugly) data.gsub!("\xEF\xBB\xBF", '')