lib/apstrings/strings_validator.rb in apstrings-0.3.6 vs lib/apstrings/strings_validator.rb in apstrings-0.3.7
- old
+ new
@@ -1,115 +1,179 @@
module Apstrings
require 'apstrings/reader'
require 'apstrings/strings_parser'
require 'apstrings/logger'
+ class ValidateResult
+
+ attr_accessor :master_special_character_error
+ attr_accessor :file_special_character_errors
+ attr_accessor :missing_keys
+ attr_accessor :dup_keys
+ attr_accessor :file_format_errors
+ attr_accessor :valid_file_format
+
+
+ def initialize(file,masterFile,
+ file_special_character_errors=[],
+ master_special_character_error=[],
+ missing_keys=[],
+ dup_keys=[],file_format_errors=[],
+ valid_file_format=true)
+
+ @file = file
+ @masterFile = masterFile
+ @file_special_character_errors = file_special_character_errors
+ @master_special_character_error = master_special_character_error
+ @missing_keys = missing_keys
+ @dup_keys = dup_keys
+ @file_format_errors = file_format_errors
+ @valid_file_format = valid_file_format
+ end
+
+ def to_hash
+ { :file=> File.basename(@file),
+ :masterFile => File.basename(@masterFile),
+ :master_special_character_error => @master_special_character_error,
+ :file_special_character_errors => @file_special_character_errors ,
+ :missing_keys => @missing_keys ,
+ :dup_keys => @dup_keys,
+ :file_format_errors => @file_format_errors,
+ :valid_file_format => @valid_file_format
+ }
+ end
+ end
+
+
class Validator
+ class << self; attr_accessor :result end
+
+
def self.validate(file,masterFile)
+ @result = ValidateResult.new(file,masterFile);
+ @file = file
@master = nil
- puts "\n-----------------------------------------"
- puts "apstrings: start validate strings file : #{file} ..."
- puts "-----------------------------------------"
+ puts "-----------------------------------------\n\n"
+ puts "-----------------------------------------"
+ puts "apstrings: start validate strings file : #{@file} ..."
if nil == masterFile
Log::warn("No master file provided, validating file format only ...")
else
@master = Validator::paredFile(masterFile)
end
valid_master, valid_file , no_missing_key = true,true,true
- valid_file = Validator::validate_format(file)
+ begin
+ @string_file = Validator::paredFile(file);
+ rescue Exception => e
+ Log::error(e)
+ @result.valid_file_format = false
+ @result.file_format_errors << e
+ return false,@result.to_hash
+ end
+
+ valid_file = Validator::validate_format(@string_file)
if masterFile != nil
- valid_master = Validator::validate_format(masterFile)
- no_missing_key = Validator::validate_missing(file,masterFile)
+ valid_master = Validator::validate_format(@master)
+ no_missing_key = Validator::validate_missing(@string_file,@master)
end
if valid_master && valid_file && no_missing_key
# Log::info("Yeah! 🍻 🍻 ")
- return true
+ return true,@result.to_hash
else if valid_master && valid_file && !no_missing_key
# Log::warn("Missing keys found.")
- return true
+ return true,@result.to_hash
else
# Log::error("Invalid file.")
- return false
+ return false,@result.to_hash
end
end
end
- def self.validate_format(file)
+ def self.validate_format(sf)
is_valid = true
# puts "apstrings: start validate format for #{file} ..."
- dup_keys_in_file = Validator::validate_duplicates(file)
- mismatchs_in_file = Validator::validate_special_characters(file)
+ dup_keys_in_file = Validator::validate_duplicates(sf)
+ mismatchs_in_file = Validator::validate_special_characters(sf)
+ @result.dup_keys = dup_keys_in_file
+ if sf == @master
+ @result.master_special_character_error = @result.master_special_character_error + mismatchs_in_file
+ else
+ @result.file_special_character_errors = @result.file_special_character_errors + mismatchs_in_file
+ end
if nil != dup_keys_in_file && !dup_keys_in_file.empty?
- Log::warn("Dup-keys found in #{file}: \n `#{dup_keys_in_file}`.")
+ Log::warn("Dup-keys found in #{sf.raw_file}: \n `#{dup_keys_in_file}`.")
else
# Log::info("OK . .")
end
if !mismatchs_in_file.empty?
is_valid = false
+ @result.valid_file_format = false
mismatchs_in_file.each { |e| e.each_pair {
|key,value|
- Log::error("Mismatch format found in `#{file}`: \n `#{key}` ====> `#{value}`")
+ Log::error("Mismatch format found in `#{sf.raw_file}`: \n `#{key}` ====> `#{value}`")
}
}
else
# Log::info("OK ... \n ")
end
is_valid
end
- def self.validate_missing(file,masterFile)
+ def self.validate_missing(sf,sf_masterFile)
# puts "apstrings: checking missing keys for #{file}..."
- sf = Validator::paredFile(file)
- sf_masterFile = Validator::paredFile(masterFile)
no_missing = true
missing_keys = sf_masterFile.keys - sf.keys
+ @result.missing_keys = missing_keys;
if !missing_keys.empty?
no_missing =false
- Log::warn("#{missing_keys.count.to_s} missing keys found in #{file} comparing to master file: #{masterFile} : \n #{missing_keys.to_s}")
+ Log::warn("#{missing_keys.count.to_s} missing keys found in #{sf.raw_file} comparing to master file: #{sf_masterFile.raw_file} : \n #{missing_keys.to_s}")
else
# Log::info("OK...")
end
no_missing
end
- def self.validate_duplicates(file)
+ def self.validate_duplicates(sf)
# puts "apstrings: checking dup-keys for #{file}..."
- sf = Validator::paredFile(file)
sf.keys.detect {
|e| sf.keys.count(e) > 1
}
end
- def self.validate_special_characters(file)
+ def self.validate_special_characters(sf)
# puts "apstrings: checking syntax for #{file}..."
- sf = Validator::paredFile(file)
variables_regex = /%[hlqLztj]?[@%dDuUxXoOfeEgGcCsSpaAF]/
mismatchs = []
sf.key_values.each {
|e| e.each_pair {
|key,value|
fixed_key = Validator::value_in_master(key)
- striped_key = fixed_key.gsub(/%\d\$/,'%') # Strip numbered format placeholders , e.g. %1$@ --> %@
- striped_value = value.gsub(/%\d\$/,'%')
- key_variables = striped_key.scan(variables_regex)
- value_variables = striped_value.scan(variables_regex)
- if !(key_variables.sort == value_variables.sort)
- mismatchs << {key => value}
+ if fixed_key != nil
+ striped_key = fixed_key.gsub(/%\d\$/,'%') # Strip numbered format placeholders , e.g. %1$@ --> %@
+ striped_value = value.gsub(/%\d\$/,'%')
+ key_variables = striped_key.scan(variables_regex)
+ value_variables = striped_value.scan(variables_regex)
+ if !(key_variables.sort == value_variables.sort)
+ mismatchs << {key => value}
+ end
+ else
+ # key in slavor file but does not exist in master file .
+ Log.warn("There is missing key in master file comparing to slavor. As we only check missing keys in slavor file, just ignore. \n ");
end
}
}
mismatchs
end
def self.paredFile(file)
- file = Reader.read(file)
- StringsParser.new(file).parse_file
+ read_file = Reader.read(file)
+ StringsParser.new(read_file,DotStringFile.new(file)).parse_file
end
def self.value_in_master(key)
if @master
value_comment = @master.to_hash[key] #