local_postal 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (221) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +4 -0
  4. data/CODE_OF_CONDUCT.md +26 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +124 -0
  8. data/Rakefile +13 -0
  9. data/bin/console +7 -0
  10. data/bin/setup +7 -0
  11. data/config/formats/AC.json +13 -0
  12. data/config/formats/AD.json +15 -0
  13. data/config/formats/AE.json +13 -0
  14. data/config/formats/AF.json +13 -0
  15. data/config/formats/AG.json +12 -0
  16. data/config/formats/AI.json +13 -0
  17. data/config/formats/AL.json +15 -0
  18. data/config/formats/AM.json +16 -0
  19. data/config/formats/AR.json +19 -0
  20. data/config/formats/AS.json +23 -0
  21. data/config/formats/AT.json +16 -0
  22. data/config/formats/AU.json +19 -0
  23. data/config/formats/AX.json +17 -0
  24. data/config/formats/AZ.json +16 -0
  25. data/config/formats/BA.json +15 -0
  26. data/config/formats/BB.json +15 -0
  27. data/config/formats/BD.json +15 -0
  28. data/config/formats/BE.json +16 -0
  29. data/config/formats/BF.json +13 -0
  30. data/config/formats/BG.json +15 -0
  31. data/config/formats/BH.json +15 -0
  32. data/config/formats/BJ.json +15 -0
  33. data/config/formats/BL.json +19 -0
  34. data/config/formats/BM.json +15 -0
  35. data/config/formats/BN.json +15 -0
  36. data/config/formats/BO.json +15 -0
  37. data/config/formats/BR.json +20 -0
  38. data/config/formats/BS.json +14 -0
  39. data/config/formats/BT.json +15 -0
  40. data/config/formats/BY.json +16 -0
  41. data/config/formats/CA.json +24 -0
  42. data/config/formats/CC.json +17 -0
  43. data/config/formats/CD.json +13 -0
  44. data/config/formats/CH.json +15 -0
  45. data/config/formats/CI.json +13 -0
  46. data/config/formats/CL.json +17 -0
  47. data/config/formats/CN.json +24 -0
  48. data/config/formats/CO.json +16 -0
  49. data/config/formats/CR.json +15 -0
  50. data/config/formats/CV.json +16 -0
  51. data/config/formats/CX.json +17 -0
  52. data/config/formats/CY.json +15 -0
  53. data/config/formats/CZ.json +15 -0
  54. data/config/formats/DE.json +16 -0
  55. data/config/formats/DK.json +16 -0
  56. data/config/formats/DO.json +15 -0
  57. data/config/formats/DZ.json +15 -0
  58. data/config/formats/EC.json +16 -0
  59. data/config/formats/EE.json +17 -0
  60. data/config/formats/EG.json +16 -0
  61. data/config/formats/EH.json +15 -0
  62. data/config/formats/ES.json +19 -0
  63. data/config/formats/ET.json +15 -0
  64. data/config/formats/FI.json +17 -0
  65. data/config/formats/FK.json +17 -0
  66. data/config/formats/FM.json +23 -0
  67. data/config/formats/FO.json +16 -0
  68. data/config/formats/FR.json +17 -0
  69. data/config/formats/GB.json +18 -0
  70. data/config/formats/GE.json +15 -0
  71. data/config/formats/GF.json +19 -0
  72. data/config/formats/GG.json +17 -0
  73. data/config/formats/GI.json +13 -0
  74. data/config/formats/GL.json +16 -0
  75. data/config/formats/GN.json +15 -0
  76. data/config/formats/GP.json +19 -0
  77. data/config/formats/GR.json +16 -0
  78. data/config/formats/GS.json +17 -0
  79. data/config/formats/GT.json +15 -0
  80. data/config/formats/GU.json +23 -0
  81. data/config/formats/GW.json +15 -0
  82. data/config/formats/HK.json +19 -0
  83. data/config/formats/HN.json +17 -0
  84. data/config/formats/HR.json +16 -0
  85. data/config/formats/HT.json +16 -0
  86. data/config/formats/HU.json +20 -0
  87. data/config/formats/ID.json +16 -0
  88. data/config/formats/IE.json +14 -0
  89. data/config/formats/IL.json +15 -0
  90. data/config/formats/IM.json +17 -0
  91. data/config/formats/IN.json +18 -0
  92. data/config/formats/IO.json +17 -0
  93. data/config/formats/IQ.json +18 -0
  94. data/config/formats/IR.json +17 -0
  95. data/config/formats/IS.json +15 -0
  96. data/config/formats/IT.json +19 -0
  97. data/config/formats/JE.json +17 -0
  98. data/config/formats/JM.json +15 -0
  99. data/config/formats/JO.json +15 -0
  100. data/config/formats/JP.json +23 -0
  101. data/config/formats/KE.json +15 -0
  102. data/config/formats/KG.json +15 -0
  103. data/config/formats/KH.json +15 -0
  104. data/config/formats/KI.json +19 -0
  105. data/config/formats/KM.json +15 -0
  106. data/config/formats/KN.json +15 -0
  107. data/config/formats/KR.json +24 -0
  108. data/config/formats/KW.json +15 -0
  109. data/config/formats/KY.json +15 -0
  110. data/config/formats/KZ.json +16 -0
  111. data/config/formats/LA.json +15 -0
  112. data/config/formats/LB.json +15 -0
  113. data/config/formats/LI.json +17 -0
  114. data/config/formats/LK.json +15 -0
  115. data/config/formats/LR.json +15 -0
  116. data/config/formats/LS.json +15 -0
  117. data/config/formats/LT.json +18 -0
  118. data/config/formats/LU.json +17 -0
  119. data/config/formats/LV.json +16 -0
  120. data/config/formats/MA.json +15 -0
  121. data/config/formats/MC.json +16 -0
  122. data/config/formats/MD.json +16 -0
  123. data/config/formats/ME.json +15 -0
  124. data/config/formats/MF.json +19 -0
  125. data/config/formats/MG.json +15 -0
  126. data/config/formats/MH.json +23 -0
  127. data/config/formats/MK.json +15 -0
  128. data/config/formats/MM.json +15 -0
  129. data/config/formats/MN.json +16 -0
  130. data/config/formats/MO.json +16 -0
  131. data/config/formats/MP.json +23 -0
  132. data/config/formats/MQ.json +19 -0
  133. data/config/formats/MR.json +15 -0
  134. data/config/formats/MT.json +16 -0
  135. data/config/formats/MU.json +16 -0
  136. data/config/formats/MV.json +15 -0
  137. data/config/formats/MW.json +13 -0
  138. data/config/formats/MX.json +20 -0
  139. data/config/formats/MY.json +19 -0
  140. data/config/formats/MZ.json +13 -0
  141. data/config/formats/NC.json +19 -0
  142. data/config/formats/NE.json +15 -0
  143. data/config/formats/NF.json +17 -0
  144. data/config/formats/NG.json +17 -0
  145. data/config/formats/NI.json +17 -0
  146. data/config/formats/NL.json +16 -0
  147. data/config/formats/NO.json +16 -0
  148. data/config/formats/NP.json +15 -0
  149. data/config/formats/NR.json +13 -0
  150. data/config/formats/NZ.json +17 -0
  151. data/config/formats/OM.json +15 -0
  152. data/config/formats/PA.json +15 -0
  153. data/config/formats/PE.json +15 -0
  154. data/config/formats/PF.json +19 -0
  155. data/config/formats/PG.json +17 -0
  156. data/config/formats/PH.json +17 -0
  157. data/config/formats/PK.json +15 -0
  158. data/config/formats/PL.json +16 -0
  159. data/config/formats/PM.json +19 -0
  160. data/config/formats/PN.json +17 -0
  161. data/config/formats/PR.json +21 -0
  162. data/config/formats/PT.json +16 -0
  163. data/config/formats/PW.json +23 -0
  164. data/config/formats/PY.json +15 -0
  165. data/config/formats/QA.json +15 -0
  166. data/config/formats/RE.json +19 -0
  167. data/config/formats/RO.json +17 -0
  168. data/config/formats/RS.json +15 -0
  169. data/config/formats/RU.json +19 -0
  170. data/config/formats/RW.json +15 -0
  171. data/config/formats/SA.json +15 -0
  172. data/config/formats/SC.json +14 -0
  173. data/config/formats/SE.json +17 -0
  174. data/config/formats/SG.json +14 -0
  175. data/config/formats/SH.json +17 -0
  176. data/config/formats/SI.json +16 -0
  177. data/config/formats/SJ.json +16 -0
  178. data/config/formats/SK.json +15 -0
  179. data/config/formats/SM.json +15 -0
  180. data/config/formats/SN.json +15 -0
  181. data/config/formats/SO.json +20 -0
  182. data/config/formats/SR.json +16 -0
  183. data/config/formats/ST.json +13 -0
  184. data/config/formats/SV.json +19 -0
  185. data/config/formats/SZ.json +18 -0
  186. data/config/formats/TA.json +13 -0
  187. data/config/formats/TC.json +17 -0
  188. data/config/formats/TH.json +22 -0
  189. data/config/formats/TJ.json +15 -0
  190. data/config/formats/TM.json +15 -0
  191. data/config/formats/TN.json +15 -0
  192. data/config/formats/TR.json +17 -0
  193. data/config/formats/TV.json +17 -0
  194. data/config/formats/TW.json +23 -0
  195. data/config/formats/TZ.json +15 -0
  196. data/config/formats/UA.json +17 -0
  197. data/config/formats/UM.json +22 -0
  198. data/config/formats/US.json +19 -0
  199. data/config/formats/UY.json +17 -0
  200. data/config/formats/UZ.json +17 -0
  201. data/config/formats/VA.json +15 -0
  202. data/config/formats/VC.json +15 -0
  203. data/config/formats/VE.json +18 -0
  204. data/config/formats/VG.json +14 -0
  205. data/config/formats/VI.json +23 -0
  206. data/config/formats/VN.json +16 -0
  207. data/config/formats/WF.json +19 -0
  208. data/config/formats/XK.json +15 -0
  209. data/config/formats/YT.json +19 -0
  210. data/config/formats/ZA.json +17 -0
  211. data/config/formats/ZM.json +15 -0
  212. data/config/formats/ZZ.json +13 -0
  213. data/lib/local_postal/address.rb +118 -0
  214. data/lib/local_postal/format.rb +79 -0
  215. data/lib/local_postal/version.rb +3 -0
  216. data/lib/local_postal.rb +18 -0
  217. data/lib/tasks/list_supported_countries.rake +21 -0
  218. data/lib/tasks/list_unique_format_variables.rake +12 -0
  219. data/lib/tasks/list_unique_formatting_rules.rake +32 -0
  220. data/local_postal.gemspec +36 -0
  221. metadata +361 -0
@@ -0,0 +1,118 @@
1
+ class LocalPostal::Address
2
+ include ActiveModel::Model
3
+
4
+ attr_accessor :name, :company
5
+ attr_accessor :street_address, :secondary_address, :city, :region
6
+ attr_accessor :postal_code
7
+
8
+ attr_reader :format, :country
9
+
10
+ validates :country, presence: true
11
+
12
+ validate :has_required_fields
13
+ validate :has_valid_postal_code_pattern, unless: -> { postal_code.nil? }
14
+ validate :has_valid_postal_code_prefix, unless: -> { postal_code.nil? }
15
+
16
+ # The 2-character ISO 3166 country code for this address.
17
+ #
18
+ # @return [String] The country's ISO code or nil when unavailable.
19
+ def country_code
20
+ cc = carmen_country
21
+
22
+ return if cc.nil?
23
+
24
+ cc.code.upcase if cc.code.is_a?(String)
25
+ end
26
+
27
+ # The address' lines as they should appear on the parcel.
28
+ #
29
+ # @return [Array] The address lines.
30
+ def lines
31
+ address = format.apply(formatting_values)
32
+ address.split("\n").reject {|line| line.strip.empty? } + [country.upcase]
33
+ end
34
+
35
+ # Sets the country and automatically assigns the correct format for that it
36
+ # belongs to.
37
+ #
38
+ # @param [String] value The name of the country.
39
+ # @return [String] The supplied value.
40
+ def country=(value)
41
+ @country = value
42
+
43
+ @format = case country_code
44
+ when nil, '' then nil
45
+ else LocalPostal::Format.from_country_code(country_code)
46
+ end
47
+ end
48
+
49
+ # Maps the universal fields used in the formatting rules to the more commonly
50
+ # used field names that Address uses.
51
+ #
52
+ # @return [Hash] Keys are formatting rule fields; values are Address fields.
53
+ def self.formatting_variables_lookup_table
54
+ {
55
+ :recipient => :name,
56
+ :organization => :company,
57
+ :addressLine1 => :street_address,
58
+ :addressLine2 => :secondary_address,
59
+ :postalCode => :postal_code,
60
+ :locality => :city,
61
+ :administrativeArea => :region,
62
+ :sortingCode => nil,
63
+ :dependentLocality => nil
64
+ }
65
+ end
66
+
67
+ private
68
+
69
+ # Validates that all the required fields are present.
70
+ def has_required_fields
71
+ return unless format.is_a?(LocalPostal::Format)
72
+
73
+ format.required_fields.each do |field|
74
+ field_name = self.class.formatting_variables_lookup_table[field.to_sym]
75
+ value = public_send(field_name)
76
+ errors.add field_name, 'is required' if "#{value}".empty?
77
+ end
78
+ end
79
+
80
+ # Validates that the postal code is in the correct format.
81
+ def has_valid_postal_code_pattern
82
+ return unless format.is_a?(LocalPostal::Format)
83
+
84
+ matches = Regexp.new(format.postal_code_pattern).match(postal_code)
85
+
86
+ errors.add(:postal_code, 'is invalid') unless matches.to_a.length > 0
87
+ end
88
+
89
+ # Validates that the postal code has the correct prefix, when required.
90
+ def has_valid_postal_code_prefix
91
+ return unless format.is_a?(LocalPostal::Format)
92
+ return if "#{format.postal_code_prefix}".empty?
93
+ return if postal_code.start_with?("#{format.postal_code_prefix}")
94
+
95
+ errors.add(:postal_code, 'has an invalid prefix')
96
+ end
97
+
98
+ # Maps the address fields to formatting variables.
99
+ #
100
+ # @return [Hash] Values that can be used to format the address.
101
+ def formatting_values
102
+ self.class.formatting_variables_lookup_table.map do |key, value|
103
+ value = public_send(value) unless value.nil?
104
+
105
+ [key, value]
106
+ end.to_h
107
+ end
108
+
109
+ # Looks the country up using Carmen and returns its 2-character code when
110
+ # available.
111
+ #
112
+ # @return [String] The country code or nil when unavailable.
113
+ def carmen_country
114
+ return unless country.is_a?(String)
115
+
116
+ Carmen::Country.named(country) || Carmen::Country.coded(country)
117
+ end
118
+ end
@@ -0,0 +1,79 @@
1
+ class LocalPostal::Format
2
+ include ActiveModel::Model
3
+
4
+ attr_accessor *%i[
5
+ administrative_area_type
6
+ dependent_locality_type
7
+ format
8
+ locale
9
+ locality_type
10
+ postal_code_pattern
11
+ postal_code_prefix
12
+ postal_code_type
13
+ required_fields
14
+ translations
15
+ uppercase_fields
16
+ ]
17
+
18
+ # Constructs an instance of LocalPostal::Format from the supplied JSON file.
19
+ #
20
+ # @param [String] path The full pathname of the JSON file.
21
+ # @return [LocalPostal::Format] The new LocalPostal::Format instance.
22
+ def self.from_json(path)
23
+ raw_json = File.read(path)
24
+ parsed_json = JSON.parse(raw_json)
25
+
26
+ new(parsed_json)
27
+ end
28
+
29
+ # Constructs an instance of LocalPostal::Format by looking up the supplied
30
+ # country code in config/formats/*.json.
31
+ #
32
+ # @param [String] code The 2-character country code.
33
+ # @raise [ArgumentError] If the code is not exactly 2 characters.
34
+ # @raise [ArgumentError] If the supplied country code is not supported.
35
+ # @return [LocalPostal::Format] The new LocalPostal::Format instance.
36
+ def self.from_country_code(code)
37
+ code = "#{code}".upcase
38
+
39
+ fail ArgumentError, "#{code} is an invalid code", caller if code.length != 2
40
+
41
+ path = File.join(LocalPostal.root, 'config', 'formats', "#{code}.json")
42
+
43
+ fail ArgumentError, "#{code} unsupported", caller unless File.file?(path)
44
+
45
+ from_json(path)
46
+ end
47
+
48
+ # Applies the formatting to the supplied values.
49
+ #
50
+ # @param [Hash] values The address' field values.
51
+ # @return [String] The address properly formatted for its country.
52
+ def apply(values)
53
+ values = values.map do |key, value|
54
+ key = key.upcase if uppercase_fields.include?(key)
55
+ value = "#{value}".upcase if uppercase_fields.include?("#{key}")
56
+
57
+ [key, value]
58
+ end
59
+
60
+ formatted_string % values.to_h
61
+ end
62
+
63
+ # Converts the format provided in the JSON files into a valid Ruby formatted
64
+ # String that can be parsed using the modulus operator and a Hash.
65
+ #
66
+ # @return [String] A formatted string.
67
+ def formatted_string
68
+ format.dup.tap do |str|
69
+ variables.each {|v| str.gsub!("%#{v}", "%{#{v}}") }
70
+ end
71
+ end
72
+
73
+ # All of the variables found in the format.
74
+ #
75
+ # @return [Array] Variable names as Strings.
76
+ def variables
77
+ format.scan(/(%\w+)/).flatten.map {|v| v[1..v.length] }
78
+ end
79
+ end
@@ -0,0 +1,3 @@
1
+ module LocalPostal
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,18 @@
1
+ require 'yaml'
2
+ require 'json'
3
+ require 'carmen'
4
+ require 'active_model'
5
+
6
+ module LocalPostal
7
+ autoload :Address, 'local_postal/address'
8
+ autoload :Format, 'local_postal/format'
9
+ autoload :VERSION, 'local_postal/version'
10
+
11
+ # Gets the path that the gem was installed in. This is used mainly to read
12
+ # configuration files.
13
+ #
14
+ # @return [String] The path the gem is installed in.
15
+ def self.root
16
+ @root ||= File.expand_path(File.join('..', '..'), __FILE__)
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ desc 'Lists all the countries that are supported'
2
+ task :list_supported_countries do
3
+ require 'local_postal'
4
+
5
+ files = Dir[File.join(LocalPostal.root, 'config', 'formats', '*.json')]
6
+
7
+ countries = files.sort.map do |file|
8
+ country_code = File.basename(file, File.extname(file))
9
+ country = Carmen::Country.coded(country_code)
10
+ name = country ? country.name : nil
11
+
12
+ { country_code => name }
13
+ end
14
+
15
+ total = Carmen::Country.all.count
16
+
17
+ print "# #{countries.count} of #{total} countries are supported as of "
18
+ puts Time.now.strftime('%B %d, %Y')
19
+ puts
20
+ puts countries.to_yaml
21
+ end
@@ -0,0 +1,12 @@
1
+ desc 'Lists all of the unique formatting variables'
2
+ task :list_unique_format_variables do
3
+ require 'local_postal'
4
+
5
+ files = Dir[File.join(LocalPostal.root, 'config', 'formats', '*.json')]
6
+ formats = files.map {|file| LocalPostal::Format.from_json(file) }
7
+
8
+ variables = formats.map {|f| f.variables }.flatten
9
+ variables = variables.compact.uniq
10
+
11
+ puts variables.to_yaml
12
+ end
@@ -0,0 +1,32 @@
1
+ desc 'Lists all of the address formatting rules that are unique'
2
+ task :list_unique_formatting_rules do
3
+ require 'local_postal'
4
+
5
+ files = Dir[File.join(LocalPostal.root, 'config', 'formats', '*.json')]
6
+ formats = files.map {|file| LocalPostal::Format.from_json(file) }
7
+
8
+ rules = {
9
+ administrative_area_type: [],
10
+ dependent_locality_type: [],
11
+ format: [],
12
+ locale: [],
13
+ locality_type: [],
14
+ postal_code_pattern: [],
15
+ postal_code_prefix: [],
16
+ postal_code_type: [],
17
+ required_fields: [],
18
+ translations: [],
19
+ uppercase_fields: []
20
+ }
21
+
22
+ formats.each do |format|
23
+ rules.keys.each do |key|
24
+ value = format.public_send(key)
25
+ rules[key] << value unless value.nil?
26
+ end
27
+ end
28
+
29
+ rules.keys.each {|key| rules[key] = rules[key].flatten.uniq }
30
+
31
+ puts rules.to_yaml
32
+ end
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'local_postal/version'
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = 'local_postal'
10
+ spec.version = LocalPostal::VERSION
11
+ spec.authors = ['Travis Haynes']
12
+ spec.email = ['travis@hi5dev.com']
13
+ spec.summary = 'Provides localized formating for postal addresses.'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+
20
+ spec.bindir = 'exe'
21
+
22
+ spec.executables = spec.files.grep(%r{^#{spec.bindir}/}) do |f|
23
+ File.basename(f)
24
+ end
25
+
26
+ spec.require_paths = ['lib']
27
+
28
+ spec.add_dependency 'carmen', '~> 1.0.2'
29
+ spec.add_dependency 'activemodel', '~> 4.2.0'
30
+
31
+ spec.add_development_dependency 'bundler', '~> 1.10'
32
+ spec.add_development_dependency 'rake', '~> 10.0'
33
+ spec.add_development_dependency 'minitest'
34
+ spec.add_development_dependency 'faker'
35
+ spec.add_development_dependency 'byebug'
36
+ end
metadata ADDED
@@ -0,0 +1,361 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: local_postal
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Travis Haynes
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-09-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: carmen
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: activemodel
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 4.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 4.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.10'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.10'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: faker
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: byebug
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description:
112
+ email:
113
+ - travis@hi5dev.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".travis.yml"
120
+ - CODE_OF_CONDUCT.md
121
+ - Gemfile
122
+ - LICENSE.txt
123
+ - README.md
124
+ - Rakefile
125
+ - bin/console
126
+ - bin/setup
127
+ - config/formats/AC.json
128
+ - config/formats/AD.json
129
+ - config/formats/AE.json
130
+ - config/formats/AF.json
131
+ - config/formats/AG.json
132
+ - config/formats/AI.json
133
+ - config/formats/AL.json
134
+ - config/formats/AM.json
135
+ - config/formats/AR.json
136
+ - config/formats/AS.json
137
+ - config/formats/AT.json
138
+ - config/formats/AU.json
139
+ - config/formats/AX.json
140
+ - config/formats/AZ.json
141
+ - config/formats/BA.json
142
+ - config/formats/BB.json
143
+ - config/formats/BD.json
144
+ - config/formats/BE.json
145
+ - config/formats/BF.json
146
+ - config/formats/BG.json
147
+ - config/formats/BH.json
148
+ - config/formats/BJ.json
149
+ - config/formats/BL.json
150
+ - config/formats/BM.json
151
+ - config/formats/BN.json
152
+ - config/formats/BO.json
153
+ - config/formats/BR.json
154
+ - config/formats/BS.json
155
+ - config/formats/BT.json
156
+ - config/formats/BY.json
157
+ - config/formats/CA.json
158
+ - config/formats/CC.json
159
+ - config/formats/CD.json
160
+ - config/formats/CH.json
161
+ - config/formats/CI.json
162
+ - config/formats/CL.json
163
+ - config/formats/CN.json
164
+ - config/formats/CO.json
165
+ - config/formats/CR.json
166
+ - config/formats/CV.json
167
+ - config/formats/CX.json
168
+ - config/formats/CY.json
169
+ - config/formats/CZ.json
170
+ - config/formats/DE.json
171
+ - config/formats/DK.json
172
+ - config/formats/DO.json
173
+ - config/formats/DZ.json
174
+ - config/formats/EC.json
175
+ - config/formats/EE.json
176
+ - config/formats/EG.json
177
+ - config/formats/EH.json
178
+ - config/formats/ES.json
179
+ - config/formats/ET.json
180
+ - config/formats/FI.json
181
+ - config/formats/FK.json
182
+ - config/formats/FM.json
183
+ - config/formats/FO.json
184
+ - config/formats/FR.json
185
+ - config/formats/GB.json
186
+ - config/formats/GE.json
187
+ - config/formats/GF.json
188
+ - config/formats/GG.json
189
+ - config/formats/GI.json
190
+ - config/formats/GL.json
191
+ - config/formats/GN.json
192
+ - config/formats/GP.json
193
+ - config/formats/GR.json
194
+ - config/formats/GS.json
195
+ - config/formats/GT.json
196
+ - config/formats/GU.json
197
+ - config/formats/GW.json
198
+ - config/formats/HK.json
199
+ - config/formats/HN.json
200
+ - config/formats/HR.json
201
+ - config/formats/HT.json
202
+ - config/formats/HU.json
203
+ - config/formats/ID.json
204
+ - config/formats/IE.json
205
+ - config/formats/IL.json
206
+ - config/formats/IM.json
207
+ - config/formats/IN.json
208
+ - config/formats/IO.json
209
+ - config/formats/IQ.json
210
+ - config/formats/IR.json
211
+ - config/formats/IS.json
212
+ - config/formats/IT.json
213
+ - config/formats/JE.json
214
+ - config/formats/JM.json
215
+ - config/formats/JO.json
216
+ - config/formats/JP.json
217
+ - config/formats/KE.json
218
+ - config/formats/KG.json
219
+ - config/formats/KH.json
220
+ - config/formats/KI.json
221
+ - config/formats/KM.json
222
+ - config/formats/KN.json
223
+ - config/formats/KR.json
224
+ - config/formats/KW.json
225
+ - config/formats/KY.json
226
+ - config/formats/KZ.json
227
+ - config/formats/LA.json
228
+ - config/formats/LB.json
229
+ - config/formats/LI.json
230
+ - config/formats/LK.json
231
+ - config/formats/LR.json
232
+ - config/formats/LS.json
233
+ - config/formats/LT.json
234
+ - config/formats/LU.json
235
+ - config/formats/LV.json
236
+ - config/formats/MA.json
237
+ - config/formats/MC.json
238
+ - config/formats/MD.json
239
+ - config/formats/ME.json
240
+ - config/formats/MF.json
241
+ - config/formats/MG.json
242
+ - config/formats/MH.json
243
+ - config/formats/MK.json
244
+ - config/formats/MM.json
245
+ - config/formats/MN.json
246
+ - config/formats/MO.json
247
+ - config/formats/MP.json
248
+ - config/formats/MQ.json
249
+ - config/formats/MR.json
250
+ - config/formats/MT.json
251
+ - config/formats/MU.json
252
+ - config/formats/MV.json
253
+ - config/formats/MW.json
254
+ - config/formats/MX.json
255
+ - config/formats/MY.json
256
+ - config/formats/MZ.json
257
+ - config/formats/NC.json
258
+ - config/formats/NE.json
259
+ - config/formats/NF.json
260
+ - config/formats/NG.json
261
+ - config/formats/NI.json
262
+ - config/formats/NL.json
263
+ - config/formats/NO.json
264
+ - config/formats/NP.json
265
+ - config/formats/NR.json
266
+ - config/formats/NZ.json
267
+ - config/formats/OM.json
268
+ - config/formats/PA.json
269
+ - config/formats/PE.json
270
+ - config/formats/PF.json
271
+ - config/formats/PG.json
272
+ - config/formats/PH.json
273
+ - config/formats/PK.json
274
+ - config/formats/PL.json
275
+ - config/formats/PM.json
276
+ - config/formats/PN.json
277
+ - config/formats/PR.json
278
+ - config/formats/PT.json
279
+ - config/formats/PW.json
280
+ - config/formats/PY.json
281
+ - config/formats/QA.json
282
+ - config/formats/RE.json
283
+ - config/formats/RO.json
284
+ - config/formats/RS.json
285
+ - config/formats/RU.json
286
+ - config/formats/RW.json
287
+ - config/formats/SA.json
288
+ - config/formats/SC.json
289
+ - config/formats/SE.json
290
+ - config/formats/SG.json
291
+ - config/formats/SH.json
292
+ - config/formats/SI.json
293
+ - config/formats/SJ.json
294
+ - config/formats/SK.json
295
+ - config/formats/SM.json
296
+ - config/formats/SN.json
297
+ - config/formats/SO.json
298
+ - config/formats/SR.json
299
+ - config/formats/ST.json
300
+ - config/formats/SV.json
301
+ - config/formats/SZ.json
302
+ - config/formats/TA.json
303
+ - config/formats/TC.json
304
+ - config/formats/TH.json
305
+ - config/formats/TJ.json
306
+ - config/formats/TM.json
307
+ - config/formats/TN.json
308
+ - config/formats/TR.json
309
+ - config/formats/TV.json
310
+ - config/formats/TW.json
311
+ - config/formats/TZ.json
312
+ - config/formats/UA.json
313
+ - config/formats/UM.json
314
+ - config/formats/US.json
315
+ - config/formats/UY.json
316
+ - config/formats/UZ.json
317
+ - config/formats/VA.json
318
+ - config/formats/VC.json
319
+ - config/formats/VE.json
320
+ - config/formats/VG.json
321
+ - config/formats/VI.json
322
+ - config/formats/VN.json
323
+ - config/formats/WF.json
324
+ - config/formats/XK.json
325
+ - config/formats/YT.json
326
+ - config/formats/ZA.json
327
+ - config/formats/ZM.json
328
+ - config/formats/ZZ.json
329
+ - lib/local_postal.rb
330
+ - lib/local_postal/address.rb
331
+ - lib/local_postal/format.rb
332
+ - lib/local_postal/version.rb
333
+ - lib/tasks/list_supported_countries.rake
334
+ - lib/tasks/list_unique_format_variables.rake
335
+ - lib/tasks/list_unique_formatting_rules.rake
336
+ - local_postal.gemspec
337
+ homepage:
338
+ licenses:
339
+ - MIT
340
+ metadata: {}
341
+ post_install_message:
342
+ rdoc_options: []
343
+ require_paths:
344
+ - lib
345
+ required_ruby_version: !ruby/object:Gem::Requirement
346
+ requirements:
347
+ - - ">="
348
+ - !ruby/object:Gem::Version
349
+ version: '0'
350
+ required_rubygems_version: !ruby/object:Gem::Requirement
351
+ requirements:
352
+ - - ">="
353
+ - !ruby/object:Gem::Version
354
+ version: '0'
355
+ requirements: []
356
+ rubyforge_project:
357
+ rubygems_version: 2.4.8
358
+ signing_key:
359
+ specification_version: 4
360
+ summary: Provides localized formating for postal addresses.
361
+ test_files: []