class DataMaker::CN::Address::GenerateAddress

Attributes

city[RW]
district[RW]
locale[RW]
options[RW]
province[RW]
street_address[RW]

Public Class Methods

new(*args) click to toggle source
# File lib/data_maker/cn/address.rb, line 36
def initialize(*args)
  self.options  = (args.last.is_a?(::Hash) ? args.last : {}).delete_if { |k, v| v.nil? }
  self.district = options[:district]
  self.city     = options[:city]
  self.province = options[:province]
  self.locale   = options[:locale] || :zh
  unless options.empty?
    validate
  end
end

Public Instance Methods

address_string() click to toggle source
# File lib/data_maker/cn/address.rb, line 70
def address_string
  generate
  build_address
end
address_struct() click to toggle source
# File lib/data_maker/cn/address.rb, line 75
def address_struct
  generate
  OpenStruct.new(street_address: street_address,
                 city:           translate('city', city),
                 district:       (translate('district', district) unless district.nil?),
                 province:       translate('province', province),
                 postal_code:    postal_code
                )
end
generate() click to toggle source
# File lib/data_maker/cn/address.rb, line 47
def generate
  if options.empty?
    # Generate a random address from a province
    self.province = provinces.sample
    self.city     = province_cities.sample
    self.district = city_districts.nil? ? nil : city_districts.sample
  end

  if options[:province] && options[:city].nil? && options[:district].nil?
    self.city     = province_cities.sample
    self.district = city_districts.nil? ? nil : city_districts.sample
  end

  if options[:province].nil? && options[:city] && options[:district].nil?
    self.province = city_province
    self.district = city_districts.nil? ? nil : city_districts.sample
  end
end
postal_code() click to toggle source
# File lib/data_maker/cn/address.rb, line 85
def postal_code
  postal_code = nil
  province_postal_codes = DataMaker::CN::Address::PROVINCE_POSTAL_CODES
  province_postal_codes.to_set.select do |province_postal_code|
    p, pc = province_postal_code.split(",")
    p == province ? postal_code = pc : nil
  end
  postal_code
end

Private Instance Methods

build_address() click to toggle source
# File lib/data_maker/cn/address.rb, line 150
def build_address
  address = []
  address << street_address
  address << translate('city', city)
  address << translate('district', district) unless district.nil?
  address << translate('province', province)
  address << postal_code
  address.compact.join(", ")
end
cities() click to toggle source
# File lib/data_maker/cn/address.rb, line 142
def cities
  DataMaker::CN::Address::CITIES
end
city_districts() click to toggle source
# File lib/data_maker/cn/address.rb, line 173
def city_districts
  raise ArgumentError, "Please pass a city!" if city.nil?
  d = DataMaker::CN::Address.const_get("#{city}_districts".upcase)
  d.empty? ? nil : d
end
city_exists?() click to toggle source
# File lib/data_maker/cn/address.rb, line 198
def city_exists?
  cities.to_set.include?(city)
end
city_has_district?() click to toggle source
# File lib/data_maker/cn/address.rb, line 210
def city_has_district?
  city_districts.to_set.include?(district)
end
city_province() click to toggle source
# File lib/data_maker/cn/address.rb, line 179
def city_province
  province = nil
  city_provinces = DataMaker::CN::Address::CITY_PROVINCES
  city_provinces.to_set.select do |city_province|
    c, p = city_province.split(",")
    c == city ? province = p : nil
  end
  province
end
district_exists?() click to toggle source
# File lib/data_maker/cn/address.rb, line 202
def district_exists?
  districts.to_set.include?(district)
end
districts() click to toggle source
# File lib/data_maker/cn/address.rb, line 146
def districts
  DataMaker::CN::Address::DISTRICTS
end
province_cities() click to toggle source
# File lib/data_maker/cn/address.rb, line 189
def province_cities
  raise ArgumentError, "Please pass a province!" if province.nil?
  DataMaker::CN::Address.const_get("#{province}_cities".upcase)
end
province_exists?() click to toggle source
# File lib/data_maker/cn/address.rb, line 194
def province_exists?
  provinces.to_set.include?(province)
end
province_has_city?() click to toggle source
# File lib/data_maker/cn/address.rb, line 206
def province_has_city?
  province_cities.to_set.include?(city)
end
provinces() click to toggle source
# File lib/data_maker/cn/address.rb, line 138
def provinces
  DataMaker::CN::Address::PROVINCES
end
street_name() click to toggle source
# File lib/data_maker/cn/address.rb, line 160
def street_name
  DataMaker::CN::Name::LAST_NAMES.sample
end
street_suffix() click to toggle source
# File lib/data_maker/cn/address.rb, line 164
def street_suffix
  DataMaker::CN::Address::STREET_SUFFIXES.sample
end
translate(prefix, value) click to toggle source
# File lib/data_maker/cn/address.rb, line 97
def translate(prefix, value)
  DataMaker::Config.locale = locale
  DataMaker.translate(['data_maker', 'address', prefix, value].join("."))
end
unit_no() click to toggle source
# File lib/data_maker/cn/address.rb, line 168
def unit_no
  masks = "#" * rand(1..2)
  DataMaker.numerify(masks)
end
validate() click to toggle source
# File lib/data_maker/cn/address.rb, line 102
def validate
  if province
    unless province_exists?
      raise ArgumentError, "The province #{province} does not exist!"
    end
  end

  if city
    unless city_exists?
      raise ArgumentError, "The city #{city} does not exist!"
    end
  end

  if district
    unless district_exists?
      raise ArgumentError, "The district #{district} does not exist!"
    end
  end

  if city.nil? && district
    raise ArgumentError, "You must always pass a city with a district!"
  end

  if province && city
    unless province_has_city?
      raise ArgumentError, "The province #{province} does not have the city #{city}"
    end
  end

  if city && district
    unless city_has_district?
      raise ArgumentError, "The city #{city} does not have the district #{district}"
    end
  end
end