class Holidays::Finder::Context::ParseOptions

Public Class Methods

new(regions_repo, region_validator, definition_loader) click to toggle source
# File lib/holidays/finder/context/parse_options.rb, line 5
def initialize(regions_repo, region_validator, definition_loader)
  @regions_repo = regions_repo
  @region_validator = region_validator
  @definition_loader = definition_loader
end

Public Instance Methods

call(*options) click to toggle source

Returns [(arr)regions, (bool)observed, (bool)informal]

# File lib/holidays/finder/context/parse_options.rb, line 12
def call(*options)
  options.flatten!

  #TODO This is garbage. These two deletes MUST come before the
  # parse_regions call, otherwise it thinks that :observed and :informal
  # are regions to parse. We should be splitting these things out.
  observed = options.delete(:observed) ? true : false
  informal = options.delete(:informal) ? true : false
  regions = parse_regions!(options)

  return regions, observed, informal
end

Private Instance Methods

is_wildcard?(r) click to toggle source
# File lib/holidays/finder/context/parse_options.rb, line 87
def is_wildcard?(r)
  r.to_s =~ /_$/
end
load_region!(r) click to toggle source
# File lib/holidays/finder/context/parse_options.rb, line 96
def load_region!(r)
  @definition_loader.call(r)
rescue NameError, LoadError => e
  raise UnknownRegionError.new(e), "Could not load region: #{r}"
end
load_wildcard_parent!(wildcard_region) click to toggle source
# File lib/holidays/finder/context/parse_options.rb, line 91
def load_wildcard_parent!(wildcard_region)
  prefix = wildcard_region.to_s.split('_').first.to_sym
  load_region!(prefix)
end
parse_regions!(regions) click to toggle source

Check regions against list of supported regions and return an array of symbols.

If a wildcard region is found (e.g. :ca_) it is expanded into all of its available sub regions.

# File lib/holidays/finder/context/parse_options.rb, line 32
def parse_regions!(regions)
  regions = [regions] unless regions.kind_of?(Array)

  if regions.empty?
    regions = [:any]
  else
    regions = regions.collect { |r| r.to_sym }
  end

  validate!(regions)

  loaded_regions = []

  if regions.include?(:any)
    @regions_repo.all_generated.each do |r|
      if @regions_repo.loaded?(r)
        loaded_regions << r
        next
      end

      target = @regions_repo.parent_region_lookup(r)
      load_region!(target)

      loaded_regions << r
    end
  else
    regions.each do |r|
      if is_wildcard?(r)
        loaded_regions << load_wildcard_parent!(r)
      else
        parent = @regions_repo.parent_region_lookup(r)

        target = parent || r

        if @regions_repo.loaded?(target)
          loaded_regions << r
          next
        end

        load_region!(target)

        loaded_regions << r
      end
    end
  end

  loaded_regions.flatten.compact.uniq
end
validate!(regions) click to toggle source
# File lib/holidays/finder/context/parse_options.rb, line 81
def validate!(regions)
  regions.each do |r|
    raise InvalidRegion unless @region_validator.valid?(r)
  end
end