lib/masking/config/target_columns.rb
# frozen_string_literal: true
require 'yaml'
require 'masking/config/target_columns/table'
require 'masking/config/target_columns/column'
require 'masking/errors'
module Masking
class Config
# TODO: find better naming of TargetColumns
class TargetColumns
attr_reader :file_path
def initialize(file_path)
@file_path = file_path
raise Masking::Error::ConfigFileDoesNotExist unless file_path.exist?
raise Masking::Error::ConfigFileIsNotFile unless file_path.file?
end
def contains?(table_name:)
data.key?(table_name)
end
# TODO: refactoring
def columns(table_name:)
tables[table_name.to_sym]&.columns
end
def ==(other)
file_path == other.file_path
end
private
def data
@data ||= YAML.safe_load(file_path.read, permitted_classes: [Date, Time])
rescue Psych::SyntaxError
raise Masking::Error::ConfigFileIsNotValidYaml
end
# TODO: extract to other class
def tables
@tables ||= data.each_with_object({}) do |kv, r|
r[kv[0].to_sym] = Table.new(kv[0], columns: kv[1])
end
rescue Masking::Config::TargetColumns::Column::ColumnNameIsNil
raise Masking::Error::ConfigFileContainsNullAsColumnName
end
end
end
end