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.
- checksums.yaml +4 -4
- data/.gitignore +1 -2
- data/.rspec_status +7 -0
- data/.rubocop.yml +10 -0
- data/.rubocop_todo.yml +188 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +21 -0
- data/README.md +202 -145
- data/Rakefile +75 -5
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/crm_formatter.gemspec +59 -13
- data/lib/crm_formatter.rb +46 -3
- data/lib/crm_formatter/address.rb +143 -122
- data/lib/crm_formatter/{extensions.csv → csv/extensions.csv} +0 -0
- data/lib/crm_formatter/csv/seed.csv +2 -0
- data/lib/crm_formatter/phone.rb +28 -20
- data/lib/crm_formatter/version.rb +4 -2
- data/lib/crm_formatter/web.rb +115 -248
- data/lib/crm_formatter/wrap.rb +54 -0
- data/menu.rb +3 -1
- data/non_utf8_examples.txt +40 -0
- data/result.txt +964 -0
- data/rubocop.json +1 -0
- metadata +211 -16
- data/bin/crm_formatter +0 -4
- data/gem_notes_crm_formatter.txt +0 -138
- data/lib/crm_formatter/helpers.rb +0 -23
data/Rakefile
CHANGED
@@ -1,8 +1,78 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: false
|
2
2
|
|
3
|
-
|
4
|
-
|
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
|
-
|
8
|
-
|
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
data/crm_formatter.gemspec
CHANGED
@@ -1,25 +1,71 @@
|
|
1
|
-
|
2
|
-
|
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 =
|
8
|
-
spec.version =
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
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.
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
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 =
|
31
|
+
spec.bindir = 'exe'
|
22
32
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
|
-
spec.require_paths = [
|
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/
|
5
|
-
require 'crm_formatter/
|
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
|
-
|
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
|
-
|
2
|
-
class Address
|
1
|
+
# frozen_string_literal: false
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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
|
-
|
13
|
-
|
14
|
-
|
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
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
29
|
-
|
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
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
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
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
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
|
-
|
128
|
-
|
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
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
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:
|
168
|
+
# CALL: Wrap.new.format_zip(zip)
|
160
169
|
def format_zip(zip)
|
161
|
-
zip = nil
|
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
|
-
|
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
|