lib/data_maker/cn/address.rb in data_maker-2.2.3 vs lib/data_maker/cn/address.rb in data_maker-2.3.3
- old
+ new
@@ -1,33 +1,221 @@
module DataMaker
module CN
module Address
+ extend ModuleUtilities
+
def self.street_address
- "lastname and street suffix"
+ GenerateAddress.new.street_address
end
- def self.street_name
+ def self.city(province = nil)
+ address = GenerateAddress.new(province: province)
+ address.generate
+ address.city
end
- def self.city
+ def self.province(city = nil)
+ address = GenerateAddress.new(city: city)
+ address.generate
+ address.province
end
- def self.city_prefix
+ def self.postal_code(province = nil)
+ address = GenerateAddress.new(province: province)
+ address.generate
+ address.postal_code
end
- def self.city_suffix
+ def self.address(province: nil, city: nil, district: nil, struct: false)
+ address = GenerateAddress.new(province: province, city: city, district: district)
+ struct ? address.address_struct : address.address_string
end
- def self.unit_no
- end
+ class GenerateAddress
+ attr_accessor :province, :city, :district, :street_address, :locale, :options
- def self.postcode
- end
+ 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
- def self.province
- end
+ 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
- def self.full_address
+ 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
+
+ def street_address
+ [unit_no, street_name, street_suffix].join
+ end
+
+ def address_string
+ generate
+ translate
+ build_address
+ end
+
+ def address_struct
+ generate
+ translate
+ OpenStruct.new(street_address: street_address,
+ city: city,
+ district: district,
+ province: province,
+ postal_code: postal_code
+ )
+ end
+
+ 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
+
+ def translate
+ DataMaker::Config.locale = locale
+ values = { province: province, city: city, district: district }
+ values.each do |key, value|
+ self.send("#{key}=", DataMaker.translate(['data_maker', 'address', key, value].join(".")))
+ end
+ end
+
+ 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
+
+ def provinces
+ DataMaker::CN::Address::PROVINCES
+ end
+
+ def cities
+ DataMaker::CN::Address::CITIES
+ end
+
+ def districts
+ DataMaker::CN::Address::DISTRICTS
+ end
+
+ def build_address
+ address = []
+ address << street_address
+ address << city
+ address << district
+ address << province
+ address << postal_code
+ address.compact.join(", ")
+ end
+
+ def street_name
+ DataMaker::CN::Name::LAST_NAMES.sample
+ end
+
+ def street_suffix
+ DataMaker::CN::Address::STREET_SUFFIXES.sample
+ end
+
+ def unit_no
+ masks = "#" * rand(1..2)
+ DataMaker.numerify(masks)
+ end
+
+ 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
+
+ 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
+
+ def province_cities
+ raise ArgumentError, "Please pass a province!" if province.nil?
+ DataMaker::CN::Address.const_get("#{province}_cities".upcase)
+ end
+
+ def province_exists?
+ provinces.to_set.include?(province)
+ end
+
+ def city_exists?
+ cities.to_set.include?(city)
+ end
+
+ def district_exists?
+ districts.to_set.include?(district)
+ end
+
+ def province_has_city?
+ province_cities.to_set.include?(city)
+ end
+
+ def city_has_district?
+ city_districts.to_set.include?(district)
+ end
end
end
end
end