lib/zakuro/era/japan/gengou/resource/validator.rb in zakuro-0.9.4 vs lib/zakuro/era/japan/gengou/resource/validator.rb in zakuro-1.0.0
- old
+ new
@@ -1,10 +1,9 @@
# frozen_string_literal: true
-require_relative '../../../japan/calendar'
-require_relative '../../../western/calendar'
-require_relative './type'
+require_relative '../../type/validation/gengou_set'
+
require 'yaml'
# :nodoc:
module Zakuro
# :nodoc:
@@ -17,409 +16,19 @@
module Resource
#
# Validator yaml解析
#
module Validator
- #
- # Set 元号セット情報の検証/展開
- #
- class Set
- # @return [String] 元号セットID
- attr_reader :id
- # @return [String] 元号セット名
- attr_reader :name
- # @return [Hash<String, String>] 終了年
- attr_reader :last_year
- # @return [Hash<String, String>] 終了日
- attr_reader :last_date
- # @return [Array<Hash<String, String>>] 元号情報
- attr_reader :list
-
- #
- # 初期化
- #
- # @param [Hash<String, Object>] hash 元号セット情報
- #
- def initialize(hash:)
- @id = hash['id']
- @name = hash['name']
- @last_year = hash['last_year']
- @last_date = hash['last_date']
- @list = hash['list']
- end
-
- #
- # 検証する
- #
- # @return [Array<String>] 不正メッセージ
- #
- def validate
- failed = []
- failed.push("invalid id. #{id}") unless id?
-
- failed.push("invalid name. #{name}") unless name?
-
- failed |= validate_last_year
-
- failed |= validate_last_date
-
- failed |= validate_list
- failed
- end
-
- #
- # IDを検証する
- #
- # @return [True] 正しい
- # @return [False] 正しくない
- #
- def id?
- return false unless id
-
- id.is_a?(Integer)
- end
-
- #
- # 元号セット名を検証する
- #
- # @return [True] 正しい
- # @return [False] 正しくない
- #
- def name?
- return false unless @name
-
- name.is_a?(String)
- end
-
- #
- # 終了年を検証する
- #
- # @return [Array<String>] 不正メッセージ
- #
- def validate_last_year
- Both::Year.new(hash: last_year).validate
- end
-
- #
- # 終了日を検証する
- #
- # @return [Array<String>] 不正メッセージ
- #
- def validate_last_date
- SwitchDate.new(hash: last_date).validate
- end
-
- #
- # 元号情報を検証する
- #
- # @return [True] 正しい
- # @return [False] 正しくない
- #
- def list?
- return false unless list
-
- list.is_a?(Array)
- end
-
- #
- # 元号情報を検証する
- #
- # @return [Array<String>] 不正メッセージ
- #
- def validate_list
- return ["invalid list. #{list.class}"] unless list?
-
- failed = []
- list.each_with_index do |li, index|
- failed |= Gengou.new(hash: li, index: index).validate
- end
- failed
- end
- end
-
- #
- # Gengou 元号情報
- #
- class Gengou
- # @return [Integer] 要素位置
- attr_reader :index
- # @return [String] 元号名
- attr_reader :name
- # @return [Hash<String, String>] 開始年
- attr_reader :start_year
- # @return [Hash<String, String>] 開始日
- attr_reader :start_date
-
- #
- # 初期化
- #
- # @param [Hash<String, Strin>] hash 元号情報
- # @param [Integer] index (元号セット内での)元号の要素位置
- #
- def initialize(hash:, index:)
- @index = index
- @name = hash['name']
- @start_year = hash['start_year']
- @start_date = hash['start_date']
- end
-
- #
- # 検証する
- #
- # @return [Array<String>] 不正メッセージ
- #
- def validate
- prefix = "list[#{index}]. "
- failed = []
-
- failed.push(prefix + "invalid name. #{name}") unless name?
-
- failed |= validate_start_year
-
- failed |= validate_start_date
-
- failed
- end
-
- #
- # 元号名を検証する
- #
- # @return [True] 正しい
- # @return [False] 正しくない
- #
- def name?
- return false unless name
-
- name.is_a?(String)
- end
-
- #
- # 開始年を検証する
- #
- # @return [Array<String>] 不正メッセージ
- #
- def validate_start_year
- Both::Year.new(hash: start_year).validate
- end
-
- #
- # 開始日を検証する
- #
- # @return [Array<String>] 不正メッセージ
- #
- def validate_start_date
- SwitchDate.new(hash: start_date).validate
- end
- end
-
- #
- # SwitchDate 切替日(運用/計算)
- #
- class SwitchDate
- # @return [Hash<String, Strin>] 計算値
- attr_reader :calculation
- # @return [Hash<String, Strin>] 運用値
- attr_reader :operation
-
- #
- # 初期化
- #
- # @param [Hash<String, Strin>] hash 切替日(運用/計算)
- #
- def initialize(hash:)
- @calculation = hash['calculation']
- @operation = hash['operation']
- end
-
- #
- # 検証する
- #
- # @return [Array<String>] 不正メッセージ
- #
- def validate
- failed = []
-
- failed |= validate_calculation_date
-
- failed |= validate_operation_date
-
- failed
- end
-
- private
-
- #
- # 日(計算値)を検証する
- #
- # @return [Array<String>] 不正メッセージ
- #
- def validate_calculation_date
- Both::Date.new(hash: calculation, optional: true).validate
- end
-
- #
- # 日(運用値)を検証する
- #
- # @return [Array<String>] 不正メッセージ
- #
- def validate_operation_date
- Both::Date.new(hash: operation).validate
- end
- end
-
- #
- # 和暦/西暦
- #
- module Both
- #
- # Year 年
- #
- class Year
- # @return [String] 和暦元号年
- attr_reader :japan
- # @return [String] 西暦年
- attr_reader :western
-
- #
- # 初期化
- #
- # @param [Hash<String, Strin>] hash 年情報
- #
- def initialize(hash:)
- @japan = hash['japan']
- @western = hash['western']
- end
-
- #
- # 検証する
- #
- # @return [Array<String>] 不正メッセージ
- #
- def validate
- failed = []
-
- failed.push("invalid japan year. #{japan}") unless japan?
-
- failed.push("invalid western year. #{western}") unless western?
-
- failed
- end
-
- #
- # 和暦元号年を検証する
- #
- # @return [True] 正しい
- # @return [False] 正しくない
- #
- def japan?
- return false unless @japan
-
- japan.is_a?(Integer)
- end
-
- #
- # 和暦元号年を検証する
- #
- # @return [True] 正しい
- # @return [False] 正しくない
- #
- def western?
- return false unless @western
-
- western.is_a?(Integer)
- end
- end
-
- #
- # Date 日
- #
- class Date
- # @return [String] 和暦日
- attr_reader :japan
- # @return [String] 西暦日
- attr_reader :western
- # @return [True] 省略可
- # @return [False] 省略不可
- attr_reader :optional
-
- #
- # 初期化
- #
- # @param [Hash<String, Strin>] hash 日情報
- #
- def initialize(hash:, optional: false)
- @japan = hash['japan']
- @western = hash['western']
- @optional = optional
- end
-
- #
- # 検証する
- #
- # @return [Array<String>] 不正メッセージ
- #
- def validate
- failed = []
-
- failed.push("invalid japan date. #{japan}") unless japan?
-
- failed.push("invalid western date. #{western}") unless western?
-
- failed
- end
-
- #
- # 和暦日を検証する
- #
- # @return [True] 正しい
- # @return [False] 正しくない
- #
- def japan?
- return true if optional?(text: japan)
-
- Japan::Calendar.valid_date_text(text: japan)
- end
-
- #
- # 西暦日を検証する
- #
- # @return [True] 正しい
- # @return [False] 正しくない
- #
- def western?
- return true if optional?(text: western)
-
- Western::Calendar.valid_date_text(text: western)
- end
-
- #
- # 省略可で省略されているか
- #
- # @param [String] text 文字列
- #
- # @return [True] 省略あり
- # @return [False] 省略なし
- #
- def optional?(text: '')
- return false unless optional
-
- return true if text == ''
-
- false
- end
- end
- end
-
class << self
#
# 検証する
#
# @param [Hash<String, Object>] yaml_hash yaml取得結果
#
# @return [Array<String>] 不正メッセージ
#
def run(yaml_hash:)
- Set.new(hash: yaml_hash).validate
+ Type::Validation::GengouSet.new(hash: yaml_hash).validate
end
end
end
end
end