us_states_data_gem 1.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4b9779cef5b340d07f90b3478ce9f05e193f4d91a480c1a5d2717efa0538398c
4
+ data.tar.gz: c9042ae04f0d23348ecba2091934bf022d2f74e0542783acebc048051152234c
5
+ SHA512:
6
+ metadata.gz: 35fa9086883c3960dfd5a7cf66ae0533e9ee618a72ba484cc1d93670f36f91aae4f69418ea989c7ea29643c7b996279ace2b63016a7203bad8808c48a4730352
7
+ data.tar.gz: ad0318436830618cc4cc5836186f022cdce97417706c695e802d9661b25627049d6cfcdbea924a7d2b25e367d53f0a10c81479f6d4ae10c7c3c1d753664976f9
@@ -0,0 +1,85 @@
1
+ require 'yaml'
2
+
3
+ module UsStatesData
4
+ STATES = YAML.load_file(File.join(__dir__, 'us_states_data.yml'))
5
+
6
+ def self.states
7
+ STATES.keys
8
+ end
9
+
10
+ def self.counties_for_state(state_name)
11
+ STATES[state_name.capitalize]["counties"]
12
+ end
13
+
14
+ def self.zip_codes_for_state(state_name)
15
+ STATES[state_name.capitalize]["zip_codes"]
16
+ end
17
+
18
+ def self.state_information(state_name)
19
+ STATES[state_name.capitalize]
20
+ end
21
+
22
+ def self.state_abbreviation(state_name)
23
+ STATES[state_name.capitalize]["abbreviation"]
24
+ end
25
+
26
+ def self.is_county_in_state?(county_name, state_name)
27
+ state = STATES[state_name.capitalize]
28
+ if state.nil?
29
+ raise ArgumentError, "State '#{state_name}' not found."
30
+ elsif state["counties"].map(&:downcase).include?(county_name.downcase)
31
+ return [true, 200]
32
+ else
33
+ return [false, 404, "County '#{county_name}' not found in state '#{state_name}'."]
34
+ end
35
+ end
36
+
37
+
38
+ def self.is_zip_code_in_state?(zip_code, state_name)
39
+ unless STATES[state_name.capitalize]
40
+ raise ArgumentError, "State '#{state_name}' not found."
41
+ end
42
+
43
+ if !valid_zip_code?(zip_code)
44
+ raise ArgumentError, "Invalid zip code format."
45
+ elsif STATES[state_name.capitalize]["zip_codes"].include?(zip_code.to_s)
46
+ return [true, 200]
47
+ else
48
+ return [false, 404, "Zip code '#{zip_code}' not found in state '#{state_name}'."]
49
+ end
50
+ end
51
+
52
+ def self.valid_zip_code?(zip_code)
53
+ zip_code.to_s.match?(/\A\d{5}\z/)
54
+ end
55
+
56
+ def self.states_from_region(region_name)
57
+ region_name_downcase = region_name.downcase
58
+ matching_states = STATES.select { |_, data| data["region"].casecmp(region_name_downcase).zero? }.keys
59
+ if matching_states.empty?
60
+ available_regions = STATES.values.map { |data| data["region"] }.uniq.join(", ")
61
+ raise "Region '#{region_name}' doesn't exist. Available regions are: #{available_regions}"
62
+ else
63
+ matching_states
64
+ end
65
+ end
66
+
67
+ def self.states_from_division(division_name)
68
+ division_name_downcase = division_name.downcase
69
+ matching_states = STATES.select { |_, data| data["division"].casecmp(division_name_downcase).zero? }.keys
70
+ if matching_states.empty?
71
+ available_divisions = STATES.values.map { |data| data["division"] }.uniq.join(", ")
72
+ raise "Division '#{division_name}' doesn't exist. Available divisions are: #{available_divisions}"
73
+ else
74
+ matching_states
75
+ end
76
+ end
77
+
78
+ def self.sort_by_region
79
+ STATES.keys.sort_by { |state| STATES[state]["region"].downcase }
80
+ end
81
+
82
+ def self.sort_by_division
83
+ STATES.keys.sort_by { |state| STATES[state]["division"].downcase }
84
+ end
85
+ end