crm_formatter 1.0.7.pre.rc.1 → 2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,8 +1,78 @@
1
- require 'rake/testtask'
1
+ # frozen_string_literal: false
2
2
 
3
- Rake::TestTask.new do |t|
4
- t.libs << 'test'
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+ require 'crm_formatter'
6
+
7
+ RSpec::Core::RakeTask.new(:spec)
8
+ task default: :spec
9
+ task test: :spec
10
+
11
+ task :console do
12
+ require 'irb'
13
+ require 'irb/completion'
14
+ require 'crm_formatter'
15
+ require 'active_support/all'
16
+ ARGV.clear
17
+
18
+ formatted_data = format_with_report
19
+ # formatted_phones = format_phones
20
+ # formatted_urls = format_urls
21
+ # formatted_addresses = format_addresses
22
+ binding.pry
23
+ IRB.start
24
+ end
25
+
26
+ def format_with_report
27
+ data = [{ row_id: '1', url: 'abcacura.com/twitter', act_name: "Stanley Chevrolet Kaufman\x99_\xCC", street: '825 East Fair Street', city: 'Kaufman', state: 'Texas', zip: '75142', phone: "555-457-4391\r\n" }]
28
+
29
+ file_path = './lib/crm_formatter/csv/seed.csv'
30
+
31
+ # args = {data: data}
32
+ args = { file_path: file_path }
33
+ formatted_data = CrmFormatter.format_with_report(args)
5
34
  end
6
35
 
7
- desc "Run tests"
8
- task :default => :test
36
+ def format_addresses
37
+ array_of_addresses = [
38
+ { street: '1234 EAST FAIR BOULEVARD', city: 'AUSTIN', state: 'TEXAS', zip: '78734' },
39
+ { street: '5678 North Lake Shore Drive', city: '555-123-4567', state: 'Illinois', zip: '610' },
40
+ { street: '9123 West Flagler Street', city: '1233144', state: 'NotAState', zip: 'Miami' }
41
+ ]
42
+ formatted_addresses = CrmFormatter.format_addresses(array_of_addresses)
43
+ end
44
+
45
+ def format_phones
46
+ array_of_phones = %w[555-457-4391 555-888-4391 555-457-4334 555-555 555.555.1234 not_a_number]
47
+ formatted_phones = CrmFormatter.format_phones(array_of_phones)
48
+ end
49
+
50
+ def format_urls
51
+ array_of_urls = %w[sample01.com/staff www.sample02.net.com http://www.sample3.net www.sample04.net/contact_us http://sample05.net www.sample06.sofake www.sample07.com.sofake example08.not.real www.sample09.net/staff/management www.www.sample10.com]
52
+ formatted_urls = CrmFormatter.format_urls(array_of_urls)
53
+ end
54
+
55
+ # gem install activesupport -v 5.0.0
56
+ # gem install activesupport
57
+
58
+ ##################################################################
59
+ ####### !ORIGINAL! SAVE #######
60
+ # Perfect!
61
+ # 1. 'cd-crm' ||crm_formatter/lib
62
+ # 2. Load runner at bottom before start.
63
+ # 3. Allows for Active Record & Binding.pry.
64
+ # task :console do
65
+ # require 'irb'
66
+ # require 'irb/completion'
67
+ # require 'crm_formatter' # You know what to do.
68
+ # ARGV.clear
69
+ # CrmFormatter.run
70
+ # IRB.start
71
+ # end
72
+ #############################
73
+ # alias xx='exit exit'
74
+ # alias ss='rake console'
75
+ # alias cd-crm="cd ~/Desktop/gemdev/crm_formatter"
76
+ # alias cd-gem.app="cd ~/Desktop/gemdev/gem_tester"
77
+ # alias cd-lib="cd ~/Desktop/gemdev/crm_formatter/lib"
78
+ #############################
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: false
3
+
4
+ require "bundler/setup"
5
+ require "crm_formatter"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require "irb"
15
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -1,25 +1,71 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+
2
+ # frozen_string_literal: false
3
+
4
+ lib = File.expand_path('lib', __dir__)
3
5
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
+ require 'crm_formatter'
4
7
  require 'crm_formatter/version'
5
8
 
6
9
  Gem::Specification.new do |spec|
7
- spec.name = "crm_formatter"
8
- spec.version = CRMFormatter::VERSION
9
- spec.authors = ["Adam Booth"]
10
- spec.email = ["4rlm@protonmail.ch"]
10
+ spec.name = 'crm_formatter'
11
+ spec.version = CrmFormatter::VERSION
12
+ spec.authors = ['Adam Booth']
13
+ spec.email = ['4rlm@protonmail.ch']
14
+ spec.homepage = 'https://github.com/4rlm/crm_formatter'
15
+ spec.license = 'MIT'
16
+
17
+ spec.summary = 'Reformat, Normalize, and Scrub CRM Contact Data, Addresses, Phones and URLs'
18
+ spec.description = "Reformat, Normalize, and Scrub CRM Contact Data, Addresses, Phones and URLs. Originally developed for proprietary use in an enterprise software suite. Recently decided to make them open source in a gem. It's a work in progress as there are additional features being added in near future. Also creating additonal gems with similar CRM office efficiency objectives. Please contact me if you have any questions or comments."
11
19
 
12
- spec.summary = %q{Reformat and Normalize CRM Contact Data, Addresses, Phones, Emails and URLs}
13
- spec.description = %q{Reformat and Normalize CRM Contact Data, Addresses, Phones, Emails and URLs. Originally developed for proprietary use in an enterprise software suite. Recently decided to make them open source in a gem. It's a work in progress as there are additional features being added in near future. Also creating additonal gems with similar CRM office efficiency objectives. Please contact me if you have any questions or comments.}
14
- spec.homepage = "https://github.com/4rlm/crm_formatter"
15
- spec.license = "MIT"
20
+ if spec.respond_to?(:metadata)
21
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
22
+ else
23
+ raise 'RubyGems 2.0 or newer is required to protect against ' \
24
+ 'public gem pushes.'
25
+ end
16
26
 
17
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
28
  f.match(%r{^(test|spec|features)/})
19
29
  end
20
30
 
21
- spec.bindir = "exe"
31
+ spec.bindir = 'exe'
22
32
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
- spec.require_paths = ["lib"]
33
+ spec.require_paths = ['lib']
34
+ spec.post_install_message = "Thanks for installing utf8_sanitizer!"
35
+
36
+ spec.required_ruby_version = '~> 2.5.1'
37
+ spec.add_dependency 'activesupport', '~> 5.2', '>= 5.2.0'
38
+ spec.add_dependency "utf8_sanitizer", "~> 2.0"
39
+ # spec.add_dependency "activesupport-inflector", ['~> 0.1.0']
40
+ spec.add_development_dependency 'bundler', '~> 1.16', '>= 1.16.2'
41
+ spec.add_development_dependency 'byebug', '~> 10.0', '>= 10.0.2'
42
+ spec.add_development_dependency 'class_indexer', '~> 0.3.0'
43
+ spec.add_development_dependency 'irbtools', '~> 2.2', '>= 2.2.1'
44
+ spec.add_development_dependency 'rake', '~> 12.3', '>= 12.3.1'
45
+ spec.add_development_dependency 'rspec', '~> 3.7'
46
+ spec.add_development_dependency 'rubocop', '~> 0.56.0'
47
+ spec.add_development_dependency 'ruby-beautify', '~> 0.97.4'
48
+ spec.add_development_dependency "pry", "~> 0.11.3"
49
+
50
+ # spec.add_runtime_dependency 'library', '~> 2.2'
51
+ # spec.add_dependency 'activerecord', '>= 3.0'
52
+ # spec.add_dependency 'actionpack', '>= 3.0'
53
+ # spec.add_dependency 'i18n'
54
+ # spec.add_dependency 'polyamorous', '~> 1.3.2'
55
+ # spec.add_development_dependency 'machinist', '~> 1.0.6'
56
+ # spec.add_development_dependency 'faker', '~> 0.9.5'
57
+ # spec.add_development_dependency 'sqlite3', '~> 1.3.3'
58
+ # spec.add_development_dependency 'pg', '~> 0.21'
59
+ # spec.add_development_dependency 'mysql2', '0.3.20'
24
60
 
61
+ # spec.requirements << 'libmagick, v6.0'
62
+ # spec.requirements << 'A good graphics card'
63
+ # # This gem will work with 1.8.6 or greater...
64
+ # spec.required_ruby_version = '>= 1.8.6'
65
+ #
66
+ # # Only with ruby 2.0.x
67
+ # spec.required_ruby_version = '~> 2.0'
68
+ #
69
+ # # Only with ruby between 2.2.0 and 2.2.2
70
+ # spec.required_ruby_version = ['>= 2.2.0', '< 2.2.3']
25
71
  end
data/lib/crm_formatter.rb CHANGED
@@ -1,9 +1,52 @@
1
+ # frozen_string_literal: false
2
+
3
+ require 'crm_formatter/version'
1
4
  require 'crm_formatter/address'
2
5
  require 'crm_formatter/web'
6
+ require 'crm_formatter/wrap'
3
7
  require 'crm_formatter/phone'
4
- require 'crm_formatter/helpers'
5
- require 'crm_formatter/version'
8
+ # require 'crm_formatter/tools'
9
+ # require 'crm_formatter/seed_criteria'
10
+ require 'pry'
11
+ require 'utf8_sanitizer'
12
+
13
+ module CrmFormatter
14
+ def self.format_with_report(args={})
15
+ formatted_data = self::Wrap.new.run(args)
16
+ formatted_data
17
+ end
18
+
19
+ ## Takes array of address hashes, returns array of address hashes.
20
+ def self.format_addresses(array_of_addresses)
21
+ address_obj = CrmFormatter::Address.new
22
+
23
+ formatted_address_hashes = array_of_addresses.map do |address_hsh|
24
+ crmf_adr_hsh = { address_status: nil, full_addr: nil, full_addr_f: nil }
25
+ crmf_adr_hsh.merge!(address_obj.format_full_address(address_hsh))
26
+ crmf_adr_hsh
27
+ end
28
+ formatted_address_hashes
29
+ end
30
+
31
+ ## Takes array of phone strings, returns array of phone hashes.
32
+ def self.format_phones(array_of_phones)
33
+ phone_obj = CrmFormatter::Phone.new
34
+
35
+ formatted_phone_hashes = array_of_phones.map do |phone|
36
+ crmf_phone_hsh = phone_obj.validate_phone(phone)
37
+ end
38
+ formatted_phone_hashes
39
+ end
6
40
 
7
- module CRMFormatter
41
+ ## Takes array of url strings, returns array of url hashes.
42
+ def self.format_urls(array_of_urls)
43
+ web_obj = CrmFormatter::Web.new
8
44
 
45
+ formatted_url_hashes = array_of_urls.map do |url|
46
+ crmf_url_hsh = { web_status: nil, url: url }
47
+ crmf_url_hsh.merge!(web_obj.format_url(url))
48
+ crmf_url_hsh
49
+ end
50
+ formatted_url_hashes
51
+ end
9
52
  end
@@ -1,81 +1,96 @@
1
- module CRMFormatter
2
- class Address
1
+ # frozen_string_literal: false
3
2
 
4
- def format_full_address(adr = {})
5
- formatted = {
6
- street: format_street(adr[:street]),
7
- city: format_city(adr[:city]),
8
- state: format_state(adr[:state]),
9
- zip: format_zip(adr[:zip])
3
+ module CrmFormatter
4
+ class Address
5
+ def format_full_address(adr={})
6
+ crmf_hash = {
7
+ street_f: format_street(adr[:street]),
8
+ city_f: format_city(adr[:city]),
9
+ state_f: format_state(adr[:state]),
10
+ zip_f: format_zip(adr[:zip])
10
11
  }
11
12
 
12
- formatted[:full_address] = get_full_address(formatted)
13
- formatted[:changed] = compare_versions(adr, formatted)
14
- formatted
13
+ crmf_hash[:full_addr] = make_full_address_original(adr)
14
+ crmf_hash[:full_addr_f] = make_full_addr_f(crmf_hash)
15
+ crmf_hash = check_addr_status(crmf_hash)
16
+ crmf_hash
15
17
  end
16
18
 
17
-
18
19
  ####### COMPARE ORIGINAL AND FORMATTED ADR ######
19
- def compare_versions(original, formatted)
20
- original = get_full_address(original)
21
- formatted = formatted[:full_address]
22
- original != formatted
23
- end
20
+ def check_addr_status(hsh)
21
+ full_addr = hsh[:full_addr]
22
+ full_addr_f = hsh[:full_addr_f]
23
+ status = nil
24
24
 
25
+ if full_addr && full_addr_f
26
+ status = full_addr != full_addr_f ? 'formatted' : 'unchanged'
27
+ end
28
+
29
+ hsh[:address_status] = status
30
+ hsh
31
+ end
25
32
 
26
33
  ######### FORMAT FULL ADDRESS ##########
34
+ def make_full_address_original(hsh)
35
+ full_adr = [hsh[:street],
36
+ hsh[:city],
37
+ hsh[:state],
38
+ hsh[:zip]].compact.join(', ')
39
+ full_adr
40
+ end
27
41
 
28
- def get_full_address(hsh)
29
- full_address = [hsh[:street], hsh[:city], hsh[:state], hsh[:zip]].compact.join(', ')
42
+ def make_full_addr_f(hsh)
43
+ full_adr = [hsh[:street_f],
44
+ hsh[:city_f],
45
+ hsh[:state_f],
46
+ hsh[:zip_f]].compact.join(', ')
47
+ full_adr
30
48
  end
31
49
 
32
50
  ######### FORMAT STREET ##########
33
-
34
- # CALL: Formatter.new.format_street(street)
35
51
  def format_street(street)
36
52
  street = street&.gsub(/\s/, ' ')&.strip
37
- if street.present?
38
-
39
- if street.present?
40
- # street = Formatter.new.letter_case_check(street)
41
- street = CRMFormatter::Helpers.letter_case_check(street)
42
- street = " #{street} " # Adds white space, to match below, then strip.
43
- street&.gsub!(".", " ")
44
- street&.gsub!(",", " ")
45
-
46
- street&.gsub!(" North ", " N ")
47
- street&.gsub!(" South ", " S ")
48
- street&.gsub!(" East ", " E ")
49
- street&.gsub!(" West ", " W ")
50
- street&.gsub!(" Ne ", " NE ")
51
- street&.gsub!(" Nw ", " NW ")
52
- street&.gsub!(" Se ", " SE ")
53
- street&.gsub!(" Sw ", " SW ")
54
-
55
- street&.gsub!("Avenue", "Ave")
56
- street&.gsub!("Boulevard", "Blvd")
57
- street&.gsub!("Drive", "Dr")
58
- street&.gsub!("Expressway", "Expy")
59
- street&.gsub!("Freeway", "Fwy")
60
- street&.gsub!("Highway", "Hwy")
61
- street&.gsub!("Lane", "Ln")
62
- street&.gsub!("Parkway", "Pkwy")
63
- street&.gsub!("Road", "Rd")
64
- street&.gsub!("Route", "Rte")
65
- street&.gsub!("Street", "St")
66
- street&.gsub!("Terrace", "Ter")
67
- street&.gsub!("Trail", "Trl")
68
- street&.gsub!("Turnpike", "Tpke")
69
- street&.gsub!("|", " ")
70
- street&.gsub!("•", " ")
71
- street&.gsub!("Welcome to", " ")
72
- street&.gsub!("var address = \"", " ")
73
-
74
- street&.strip!
75
- street&.squeeze!(" ")
76
- end
77
- end
78
- return street
53
+ return unless street.present?
54
+ # street = Wrap.new.letter_case_check(street)
55
+ return unless street.present?
56
+ # street = CrmFormatter::Tools.new.letter_case_check(street)
57
+ street = letter_case_check(street)
58
+
59
+ street = " #{street} " # Adds white space, to match below, then strip.
60
+ street&.gsub!('.', ' ')
61
+ street&.gsub!(',', ' ')
62
+
63
+ street&.gsub!(' North ', ' N ')
64
+ street&.gsub!(' South ', ' S ')
65
+ street&.gsub!(' East ', ' E ')
66
+ street&.gsub!(' West ', ' W ')
67
+ street&.gsub!(' Ne ', ' NE ')
68
+ street&.gsub!(' Nw ', ' NW ')
69
+ street&.gsub!(' Se ', ' SE ')
70
+ street&.gsub!(' Sw ', ' SW ')
71
+
72
+ street&.gsub!('Avenue', 'Ave')
73
+ street&.gsub!('Boulevard', 'Blvd')
74
+ street&.gsub!('Drive', 'Dr')
75
+ street&.gsub!('Expressway', 'Expy')
76
+ street&.gsub!('Freeway', 'Fwy')
77
+ street&.gsub!('Highway', 'Hwy')
78
+ street&.gsub!('Lane', 'Ln')
79
+ street&.gsub!('Parkway', 'Pkwy')
80
+ street&.gsub!('Road', 'Rd')
81
+ street&.gsub!('Route', 'Rte')
82
+ street&.gsub!('Street', 'St')
83
+ street&.gsub!('Terrace', 'Ter')
84
+ street&.gsub!('Trail', 'Trl')
85
+ street&.gsub!('Turnpike', 'Tpke')
86
+ street&.gsub!('|', ' ')
87
+ street&.gsub!('•', ' ')
88
+ street&.gsub!('Welcome to', ' ')
89
+ street&.gsub!('var address = "', ' ')
90
+
91
+ street&.strip!
92
+ street&.squeeze!(' ')
93
+ street
79
94
  end
80
95
 
81
96
  ########## FORMAT CITY ###########
@@ -89,86 +104,92 @@ module CRMFormatter
89
104
  city = nil if city&.downcase&.include?('inventory')
90
105
  city = nil if city&.downcase&.include?('tracker')
91
106
  city = nil if city&.downcase&.include?('push')
92
- city = nil if city&.downcase&.include?("(")
93
- city = nil if city&.downcase&.include?(")")
94
- city = nil if city&.downcase&.include?("[")
95
- city = nil if city&.downcase&.include?("]")
96
- city&.gsub!("|", " ")
97
- city&.gsub!("", " ")
98
-
99
- if city.present?
100
- street_types = %w(avenue boulevard drive expressway freeway highway lane parkway road route street terrace trail turnpike)
101
- invalid_city = street_types.find { |street_type| city.downcase.include?(street_type) }
102
- city = nil if invalid_city.present?
103
-
104
- if city.present?
105
- st_types = %w(ave blvd dr expy fwy hwy ln pkwy rd rte st ter trl tpke)
106
- city_parts = city.split(' ')
107
-
108
- invalid_city = city_parts.select do |city_part|
109
- st_types.find { |st_type| city_part.downcase == st_type }
110
- end
111
-
112
- city = nil if invalid_city.present?
113
- city = nil if city&.downcase&.include?("/")
114
- city = nil if city&.downcase&.include?("www")
115
- city = nil if city&.downcase&.include?("*")
116
- city = nil if city&.downcase&.include?("number")
117
- city = nil if city&.downcase&.include?("stock")
118
- city = nil if city&.downcase&.include?(":")
119
- city = nil if city&.downcase&.include?("ID")
120
-
121
- city&.strip!
122
- city&.squeeze!(" ")
123
- city = nil if city.present? && city.length > 50
124
- city = nil if city.present? && city.length < 4
125
- end
107
+ city = nil if city&.downcase&.include?('(')
108
+ city = nil if city&.downcase&.include?(')')
109
+ city = nil if city&.downcase&.include?('[')
110
+ city = nil if city&.downcase&.include?(']')
111
+ city&.gsub!('|', ' ')
112
+ city&.gsub!('', ' ')
113
+
114
+ return unless city.present?
115
+ street_types = %w[avenue boulevard drive expressway freeway highway lane parkway road route street terrace trail turnpike]
116
+ invalid_city = street_types.find { |street_type| city.downcase.include?(street_type) }
117
+ city = nil if invalid_city.present?
118
+
119
+ return unless city.present?
120
+ st_types = %w[ave blvd dr expy fwy hwy ln pkwy rd rte st ter trl tpke]
121
+ city_parts = city.split(' ')
122
+
123
+ invalid_city = city_parts.select do |city_part|
124
+ st_types.find { |st_type| city_part.downcase == st_type }
126
125
  end
127
- city = city&.split(' ')&.map(&:capitalize).join(' ')
128
- return city
126
+
127
+ city = nil if invalid_city.present?
128
+ city = nil if city&.downcase&.include?('/')
129
+ city = nil if city&.downcase&.include?('www')
130
+ city = nil if city&.downcase&.include?('*')
131
+ city = nil if city&.downcase&.include?('number')
132
+ city = nil if city&.downcase&.include?('stock')
133
+ city = nil if city&.downcase&.include?(':')
134
+ city = nil if city&.downcase&.include?('ID')
135
+
136
+ city&.strip!
137
+ city&.squeeze!(' ')
138
+ city = nil if city.present? && city.length > 50
139
+ city = nil if city.present? && city.length < 4
140
+ city = city&.split(' ')&.map(&:capitalize)&.join(' ')
141
+ city
129
142
  end
130
143
 
131
144
  ########## FORMAT STATE ##########
132
145
 
133
146
  def format_state(state)
134
147
  state = state&.gsub(/\s/, ' ')&.strip
135
-
136
- if state.present?
137
- states_hsh = { 'Alabama'=>'AL', 'Alaska'=>'AK', 'Arizona'=>'AZ', 'Arkansas'=>'AR', 'California'=>'CA', 'Colorado'=>'CO', 'Connecticut'=>'CT', 'Delaware'=>'DE', 'Florida'=>'FL', 'Georgia'=>'GA', 'Hawaii'=>'HI', 'Idaho'=>'ID', 'Illinois'=>'IL', 'Indiana'=>'IN', 'Iowa'=>'IA', 'Kansas'=>'KS', 'Kentucky'=>'KY', 'Louisiana'=>'LA', 'Maine'=>'ME', 'Maryland'=>'MD', 'Massachusetts'=>'MA', 'Michigan'=>'MI', 'Minnesota'=>'MN', 'Mississippi'=>'MS', 'Missouri'=>'MO', 'Montana'=>'MT', 'Nebraska'=>'NE', 'Nevada'=>'NV', 'New Hampshire'=>'NH', 'New Jersey'=>'NJ', 'New Mexico'=>'NM', 'New York'=>'NY', 'North Carolina'=>'NC', 'North Dakota'=>'ND', 'Ohio'=>'OH', 'Oklahoma'=>'OK', 'Oregon'=>'OR', 'Pennsylvania'=>'PA', 'Rhode Island'=>'RI', 'South Carolina'=>'SC', 'South Dakota'=>'SD', 'Tennessee'=>'TN', 'Texas'=>'TX', 'Utah'=>'UT', 'Vermont'=>'VT', 'Virginia'=>'VA', 'Washington'=>'WA', 'West Virginia'=>'WV', 'Wisconsin'=>'WI', 'Wyoming'=>'WY' }
138
-
139
- state = state.tr('^A-Za-z', '')
140
- if state.present? && state.length < 2
141
- state = nil
142
- elsif state.present? && state.length > 2
143
- state = state.capitalize
144
- states_hsh.map { |k,v| state = v if state == k }
145
- end
146
-
147
- if state.present?
148
- state.upcase!
149
- valid_state = states_hsh.find { |k,v| state == v }
150
- state_code = valid_state&.last
151
- return state_code
152
- end
148
+ return unless state.present?
149
+ states_hsh = { 'Alabama' => 'AL', 'Alaska' => 'AK', 'Arizona' => 'AZ', 'Arkansas' => 'AR', 'California' => 'CA', 'Colorado' => 'CO', 'Connecticut' => 'CT', 'Delaware' => 'DE', 'Florida' => 'FL', 'Georgia' => 'GA', 'Hawaii' => 'HI', 'Idaho' => 'ID', 'Illinois' => 'IL', 'Indiana' => 'IN', 'Iowa' => 'IA', 'Kansas' => 'KS', 'Kentucky' => 'KY', 'Louisiana' => 'LA', 'Maine' => 'ME', 'Maryland' => 'MD', 'Massachusetts' => 'MA', 'Michigan' => 'MI', 'Minnesota' => 'MN', 'Mississippi' => 'MS', 'Missouri' => 'MO', 'Montana' => 'MT', 'Nebraska' => 'NE', 'Nevada' => 'NV', 'New Hampshire' => 'NH', 'New Jersey' => 'NJ', 'New Mexico' => 'NM', 'New York' => 'NY', 'North Carolina' => 'NC', 'North Dakota' => 'ND', 'Ohio' => 'OH', 'Oklahoma' => 'OK', 'Oregon' => 'OR', 'Pennsylvania' => 'PA', 'Rhode Island' => 'RI', 'South Carolina' => 'SC', 'South Dakota' => 'SD', 'Tennessee' => 'TN', 'Texas' => 'TX', 'Utah' => 'UT', 'Vermont' => 'VT', 'Virginia' => 'VA', 'Washington' => 'WA', 'West Virginia' => 'WV', 'Wisconsin' => 'WI', 'Wyoming' => 'WY' }
150
+
151
+ state = state.tr('^A-Za-z', '')
152
+ if state.present? && state.length < 2
153
+ state = nil
154
+ elsif state.present? && state.length > 2
155
+ state = state.capitalize
156
+ states_hsh.map { |k, v| state = v if state == k }
153
157
  end
154
- end
155
158
 
159
+ return unless state.present?
160
+ state.upcase!
161
+ valid_state = states_hsh.find { |_k, v| state == v }
162
+ state_code = valid_state&.last
163
+ state_code
164
+ end
156
165
 
157
166
  ########### FORMAT ZIP ###########
158
167
 
159
- #CALL: Formatter.new.format_zip(zip)
168
+ # CALL: Wrap.new.format_zip(zip)
160
169
  def format_zip(zip)
161
- zip = nil if !zip.scan(/[0-9]/).length.in?([4,5,8,9])
170
+ zip = nil unless zip.scan(/[0-9]/).length.in?([4, 5, 8, 9])
162
171
  zip = zip&.gsub(/\s/, ' ')&.strip
163
172
  zip = zip&.split('-')&.first
164
173
  zip = nil if zip&.scan(/[A-Za-z]/)&.any?
165
174
  (zip = "0#{zip}" if zip.length == 4) if zip.present?
166
175
  (zip = nil if zip.length != 5) if zip.present?
167
176
  zip&.strip!
168
- zip&.squeeze!(" ")
169
- return zip
177
+ zip&.squeeze!(' ')
178
+ zip
170
179
  end
171
180
 
181
+ def letter_case_check(str)
182
+ return unless str.present?
183
+ flashes = str&.gsub(/[^ A-Za-z]/, '')&.strip&.split(' ')
184
+ flash = flashes&.reject { |e| e.length < 3 }&.join(' ')
172
185
 
186
+ return str unless flash.present?
187
+ has_caps = flash.scan(/[A-Z]/).any?
188
+ has_lows = flash.scan(/[a-z]/).any?
189
+
190
+ return str unless !has_caps || !has_lows
191
+ str = str.split(' ')&.each { |el| el.capitalize! if el.gsub(/[^ A-Za-z]/, '')&.strip&.length > 2 }&.join(' ')
192
+ str
193
+ end
173
194
  end
174
195
  end