local_postal 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []