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