lib/eco/data/files/helpers.rb in eco-helpers-2.4.4 vs lib/eco/data/files/helpers.rb in eco-helpers-2.4.5

- old
+ new

@@ -7,13 +7,48 @@ def included(base) base.send(:include, InstanceMethods) base.extend(ClassMethods) end end - + module InstanceMethods + include Eco::Language::AuxiliarLogger + # It offers a resilient way to read content from a file + # @tolerance [Integer] the number of allowed encoding errors. + # @return [String] the content of the file + def get_file_content(file, encoding, tolerance: 5) + unless self.class.file_exists?(file) + logger.error("File does not exist: #{file}") + exit(1) + end + encoding ||= self.class.encoding(file) + encoding = (encoding == "bom") ? "#{encoding}|utf-8": encoding + unless !encoding || encoding == 'utf-8' + msg = "File encoding: '#{encoding}'" + logger.debug(msg) + puts msg + end + read_with_tolerance(file, encoding: encoding, tolerance: tolerance) + end + + def read_with_tolerance(file, encoding:, tolerance: 5) + if content = File.read(file, encoding: encoding) + content = content.encode("utf-8") unless encoding.include?('utf-8') + content.scrub do |bytes| + replacement = '<' + bytes.unpack('H*')[0] + '>' + if tolerance <= 0 + logger.error("There were more than 5 encoding errors in the file '#{file}'.") + return content + else + tolerance -= 1 + logger.error("Encoding problem in file '#{file}': '#{replacement}'.") + replacement + end + end + end + end end module ClassMethods def create_directory(path, includes_file: false) Directory.create(path, includes_file: includes_file) @@ -84,14 +119,30 @@ def script_subfolder basename = File.basename($0, File.extname($0)) path = File.dirname($0) File.join(path, basename) end + + def folder_files(folder = ".", pattern = "*", regexp: nil, older_than: nil) + target = File.join(File.expand_path(folder), pattern) + Dir[target].tap do |dir_files| + dir_files.select! {|f| File.file?(f)} + if older_than + dir_files.select! {|f| File.mtime(f) < (Time.now - (60*60*24*older_than))} + end + if regexp && regexp.is_a?(Regexp) + dir_files.select! {|f| File.basename(f).match(regexp)} + end + end.sort + end + + def csv_files(folder = ".", regexp: nil, older_than: nil) + folder_files(folder, "*.csv", regexp: regexp, older_than: older_than).sort + end end class << self include Files::ClassMethods end - end end end