From f8e5f8392ac83b1f6c2fe38189744e1e85cc30fc Mon Sep 17 00:00:00 2001 From: "Smile @rT" Date: Tue, 20 May 2014 14:20:24 +0300 Subject: [PATCH] Fixed file path detection bug in build method polymorphism (when string was recognised as path cause of "xml", "yml", etc. content in it) Refactored file detection duplication in few places Fixed xml file format detection (f variable assigned but never used) Deleted some trailing spaces in the refactored file --- lib/treat/entities/entity/buildable.rb | 42 ++++++++++++++------------ 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/lib/treat/entities/entity/buildable.rb b/lib/treat/entities/entity/buildable.rb index 3e36ef46..c2000af5 100644 --- a/lib/treat/entities/entity/buildable.rb +++ b/lib/treat/entities/entity/buildable.rb @@ -17,6 +17,9 @@ module Treat::Entities::Entity::Buildable EmailRegexp = /.+\@.+\..+/ Enclitics = %w['ll 'm 're 's 't 've 'nt] + # Accepted formats of serialized files + AcceptedFormats = ['.xml', '.yml', '.yaml', '.mongo'] + # Reserved folder names Reserved = ['.index'] @@ -24,7 +27,7 @@ module Treat::Entities::Entity::Buildable # a string, numeric,folder, or file name # representing a raw or serialized file). def build(*args) - + # This probably needs some doc. if args.size == 0 file_or_value = '' @@ -46,9 +49,7 @@ def build(*args) from_array(file_or_value) elsif file_or_value.is_a?(Hash) from_db(file_or_value) - elsif self == Treat::Entities::Document || - (fv.index('.yml') || fv.index('.yaml') || - fv.index('.xml')) + elsif self == Treat::Entities::Document || (is_serialized_file?(fv)) if fv =~ UriRegexp from_url(fv) else @@ -94,7 +95,7 @@ def from_string(string, enforce_type = false) end e end - + # Build a document from an array # of builders. def from_array(array) @@ -118,7 +119,7 @@ def from_url(url) begin folder = Treat.paths.files if folder[-1] == '/' - folder = folder[0..-2] + folder = folder[0..-2] end f = Schiphol.download(url, download_folder: folder, @@ -178,15 +179,15 @@ def from_folder(folder) c = Treat::Entities::Collection.new(folder) folder += '/' unless folder[-1] == '/' - + if !FileTest.directory?(folder) FileUtils.mkdir(folder) end - + c.set :folder, folder i = folder + '/.index' c.set :index, i if FileTest.directory?(i) - + Dir[folder + '*'].each do |f| if FileTest.directory?(f) c2 = Treat::Entities::Collection. @@ -197,7 +198,7 @@ def from_folder(folder) from_file(f), false) end end - + return c end @@ -205,9 +206,7 @@ def from_folder(folder) # Build a document from a raw or serialized file. def from_file(file,def_fmt=nil) - if file.index('.yml') || - file.index('.yaml') || - file.index('.xml') + if is_serialized_file?(file) from_serialized_file(file) else fmt = Treat::Workers::Formatters::Readers::Autoselect.detect_format(file,def_fmt) @@ -240,7 +239,7 @@ def from_raw_file(file, def_fmt='txt') # Build an entity from a serialized file. def from_serialized_file(file) - + unless File.readable?(file) raise Treat::Exception, "Path '#{file}' does not "+ @@ -249,11 +248,11 @@ def from_serialized_file(file) doc = Treat::Entities::Document.new doc.set :file, file format = nil - if file.index('yml') || - file.index('yaml') + if File.extname(file) == '.yml' || + File.extname(file) == '.yaml' format = :yaml - elsif file.index('xml') - f = :xml + elsif File.extname(file) == '.xml' + format = :xml else raise Treat::Exception, "Unreadable serialized format for #{file}." @@ -261,7 +260,10 @@ def from_serialized_file(file) doc.unserialize(format) doc.children[0].set_as_root! # Fix this doc.children[0] + end + def is_serialized_file?(path_to_check) + (AcceptedFormats.include? File.extname(path_to_check)) && (File.file?(path_to_check)) end def from_db(hash) @@ -285,7 +287,7 @@ def anything_from_string(string) if folder[-1] == '/' folder = folder[0..-2] end - + now = Time.now.to_f doc_file = folder+ "/#{now}.txt" string.force_encoding('UTF-8') @@ -383,7 +385,7 @@ def zone_from_string(string) end end - + def create_collection(fv) FileUtils.mkdir(fv) Treat::Entities::Collection.new(fv)