melissa_data 0.2.5 → 0.2.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7df9036e13bad6f7ad7be72f4e193d4291f56515
4
- data.tar.gz: bf141f17f01d0db9892c68cd4f348e7556e43a06
3
+ metadata.gz: ac91c5646b2bec4d4c6c267d8285e32131cf5109
4
+ data.tar.gz: 6d83ffef11d3f0bc8c94eecb4b78043787a10265
5
5
  SHA512:
6
- metadata.gz: fbc7ef193d5d1498bf69bd97fb02e9096dcd83c1ad1fc0ad487b018dc3bed3b5edd6fe53f892b8f60ed2e39207c86b7763bcc1048f0e6f34a72210ad441b3768
7
- data.tar.gz: f69ffcd5a483310bbb8a03027b71bf064fa5dfa4c3d4922b16c7a799f15d8efb77bef853b6c79e5c0bea86c3d3469567aa52bd98c06e5cf41871df9ff5e4e835
6
+ metadata.gz: df18e37db9072c6ddf9644e96222b31247615af5609ecd0a0198fddb0f9dcd19feb9bb110b35592efe7700fbc5799cbd26b0d797f0ee06daa29669aa99c4271f
7
+ data.tar.gz: 118eb045520fe3c3362384c6fdb6f9daf66f6e2964e6fbbde7643cdd84ed7b499ff25bdcc1a8e6e933d731f4e14b0c8aabd5999b346ee3284b12d9bb7e04c0e0
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ *.swp
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Melissa Data
2
2
 
3
3
  [![Build Status](https://travis-ci.org/cometaworks/melissa_data.svg)](https://travis-ci.org/cometaworks/melissa_data)
4
+ [![Code Climate](https://codeclimate.com/github/cometaworks/melissa_data/badges/gpa.svg)](https://codeclimate.com/github/cometaworks/melissa_data)
4
5
 
5
6
  ## Installation
6
7
 
@@ -0,0 +1,16 @@
1
+ "address_error_codes":
2
+ "AE01": "Zip/Postal code does not exist or is improperly formatted."
3
+ "AE02": "Unknown Street. Either no match or too many."
4
+ "AE03": "Component mismatch. Combination of directions + suffix incorrect."
5
+ "AE04": "Undeliverable address. Plot exists but is not deliverable."
6
+ "AE05": "Multiple match. This adderss matched too many records to return a result"
7
+ "AE06": "Early Warning System. This address vant be verified but may be on a new road"
8
+ "AE07": "Missing minimum address. Must have atleast a1, postal code, and locality"
9
+ "AE08": "Subpremise number invalid. Suite missing"
10
+ "AE09": "Subpremise number missing."
11
+ "AE10": "Premise number invalid"
12
+ "AE11": "Premise number missing"
13
+ "AE12": "PO Box number invalid"
14
+ "AE13": "PO Box number missing"
15
+ "AE14": "Private mailbox number missing"
16
+ "AE17": "Sub premise number entered but premise has none"
@@ -0,0 +1,13 @@
1
+ "address_success_codes":
2
+ "AS01": "Address is valid and deliverable per postal agency guidelines."
3
+ "AS02": "Street address verified but suite number not valid or missing."
4
+ "AS03": "Non-USPS match, exists but may not receive mail."
5
+ "AS09": "Address is in foreign country."
6
+ "AS10": "Address is commercial mail receiving agency (PO box, mailbox)."
7
+ "AS13": "Rural address converted to city-style address."
8
+ "AS14": "Suite appended. A suite was appended using the address."
9
+ "AS15": "Apartment appended. An apartment was appended."
10
+ "AS16": "Vacant. Address unoccupied > 90 days."
11
+ "AS17": "No mail delivery to address."
12
+ "AS20": "Deliverable to only via USPS."
13
+ "AS23": "Unnecessary extraneous information received and discarded."
@@ -0,0 +1,22 @@
1
+ "property_error_codes":
2
+ "YS04": "Detailed information returned"
3
+ "YE01": "No FIPS/APN or AddressKey provided"
4
+ "YE02": "No match found"
5
+ "YE03": "Invalid FIPS/APN or AddressKey provided"
6
+
7
+ "address_error_codes":
8
+ "AE01": "Zip/Postal code does not exist or is improperly formatted."
9
+ "AE02": "Unknown Street. Either no match or too many."
10
+ "AE03": "Component mismatch. Combination of directions + suffix incorrect."
11
+ "AE04": "Undeliverable address. Plot exists but is not deliverable."
12
+ "AE05": "Multiple match. This adderss matched too many records to return a result"
13
+ "AE06": "Early Warning System. This address vant be verified but may be on a new road"
14
+ "AE07": "Missing minimum address. Must have atleast a1, postal code, and locality"
15
+ "AE08": "Subpremise number invalid. Suite missing"
16
+ "AE09": "Subpremise number missing."
17
+ "AE10": "Premise number invalid"
18
+ "AE11": "Premise number missing"
19
+ "AE12": "PO Box number invalid"
20
+ "AE13": "PO Box number missing"
21
+ "AE14": "Private mailbox number missing"
22
+ "AE17": "Sub premise number entered but premise has none"
@@ -0,0 +1,5 @@
1
+ "property_error_codes":
2
+ "YS04": "Detailed information returned"
3
+ "YE01": "No FIPS/APN or AddressKey provided"
4
+ "YE02": "No match found"
5
+ "YE03": "Invalid FIPS/APN or AddressKey provided"
@@ -0,0 +1,4 @@
1
+ "property_success_codes":
2
+ "YS01": "FIPS/APN Match found"
3
+ "YS02": "AddressKey Match found"
4
+ "YS03": "Basic information returned"
@@ -1,3 +1,3 @@
1
1
  module MelissaData
2
- VERSION = "0.2.5"
2
+ VERSION = "0.2.6"
3
3
  end
@@ -2,22 +2,27 @@ module MelissaData
2
2
  module WebSmart
3
3
  class Client
4
4
  include MelissaData::WebSmart::ResponseProcessor
5
+ include MelissaData::WebSmart::Formatters
5
6
 
6
7
  def initialize
7
8
  @client = MelissaData::WebSmart::PropertyAPI.new
8
9
  end
9
10
 
10
11
  def property_by_apn(fips:, apn:)
11
- process_property(@client.property_by_apn(fips: fips, apn: apn))
12
+ process(@client.property_by_apn(fips: fips, apn: apn), 'property')
12
13
  end
13
14
 
14
15
  def property_by_address_key(address_key:)
15
- process_property(@client.property_by_address_key(address_key: address_key))
16
+ process(@client.property_by_address_key(address_key: address_key), 'property')
16
17
  end
17
18
 
18
19
  def address(address:, city:, state:, zip:, country: "USA")
19
- @client.address(address: address, city: city, state: state,
20
- zip: zip, country: country)
20
+ resp = viperize_hash(@client.address(address: address,
21
+ city: city,
22
+ state: state,
23
+ zip: zip,
24
+ country: country))
25
+ process(resp, 'address')
21
26
  end
22
27
  end
23
28
  end
@@ -1,5 +1,6 @@
1
1
  require 'rest-client'
2
2
  require 'nokogiri'
3
+ require 'json'
3
4
 
4
5
  module MelissaData
5
6
  module WebSmart
@@ -8,26 +9,32 @@ module MelissaData
8
9
  resp = RestClient.get('https://property.melissadata.net/v3/REST/Service.svc/doLookup',
9
10
  { params: { id: MelissaData.web_smart_id,
10
11
  fips: fips,
11
- apn: apn } })
12
+ apn: apn,
13
+ OptPropertyDetail: "1" } })
12
14
  PropertyXMLParser.new(Nokogiri::XML(resp)).parse
13
15
  end
14
16
 
15
17
  def property_by_address_key(address_key:)
16
18
  resp = RestClient.get('https://property.melissadata.net/v3/REST/Service.svc/doLookup',
17
19
  { params: { id: MelissaData.web_smart_id,
18
- AddressKey: address_key } })
20
+ AddressKey: address_key,
21
+ OptPropertyDetail: "1" } })
19
22
  PropertyXMLParser.new(Nokogiri::XML(resp)).parse
20
23
  end
21
24
 
22
25
  def address(address:, city:, state:, zip:, country:)
23
- resp = RestClient.get('https://address.melissadata.net/v3/WEB/GlobalAddress/doGlobalAddress',
24
- { params: { id: MelissaData.web_smart_id,
25
- a1: address,
26
- loc: city,
27
- admarea: state,
28
- postal: zip,
29
- ctry: country} })
30
- AddressXMLParser.new(Nokogiri::XML(resp)).parse
26
+ resp = JSON.parse(RestClient.get("https://personator.melissadata.net/v3/WEB/ContactVerify/doContactVerify",
27
+ { params: { id: MelissaData.web_smart_id,
28
+ Actions: "Check",
29
+ a1: address,
30
+ city: city,
31
+ state: state,
32
+ postal: zip,
33
+ ctry: country,
34
+ AdvancedAddressCorrection: "on",},
35
+ accept: :json,
36
+ content_type: :json }))
37
+ resp["Records"].first
31
38
  end
32
39
  end
33
40
  end
@@ -1,39 +1,40 @@
1
1
  module MelissaData
2
2
  module WebSmart
3
3
  module ResponseProcessor
4
- def process_property(response)
5
- codes = codes(response)
4
+ require 'yaml'
5
+ CODE_TYPES = [:property, :address]
6
6
 
7
+ def process(response, resp_type)
8
+ codes = codes(response, resp_type)
7
9
  if has_error_codes?(codes)
8
- { errors: codes_for(codes, 'error') }
10
+ { errors: codes_for(codes, resp_type, 'error') }
9
11
  else
10
- response.merge!(success: codes_for(codes, 'success'))
12
+ response.merge!(success: codes_for(codes, resp_type, 'success'))
11
13
  end
12
14
  end
13
15
 
14
- def codes_for(codes, type)
15
- codes.map { |c| method("property_#{type}_codes").call[c.to_sym] }.compact
16
+ def codes_for(codes, resp_type, code_type)
17
+ codes.map do |code|
18
+ YAML.load(File.read("config/#{resp_type}_#{code_type}_codes.yml")).values.first[code.to_s]
19
+ end.compact
16
20
  end
17
21
 
18
- def codes(response)
19
- response[:result][:code].split(",")
22
+ def codes(response, resp_type)
23
+ case resp_type
24
+ when 'property'
25
+ response[:result][:code].split(",")
26
+ when 'address'
27
+ response[:results].split(",")
28
+ end
20
29
  end
21
30
 
22
31
  def has_error_codes?(codes)
23
- !codes.select { |c| c if property_error_codes.keys.include? c.to_sym }.empty?
24
- end
25
-
26
- def property_success_codes
27
- { YS01: "FIPS/APN Match found",
28
- YS02: "AddressKey Match found",
29
- YS03: "Basic information returned",
30
- YS04: "Detailed information returned" }
32
+ !codes.select { |code| error_codes.include? code.to_sym }.empty?
31
33
  end
32
34
 
33
- def property_error_codes
34
- { YE01: "No FIPS/APN or AddressKey provided",
35
- YE02: "No match found",
36
- YE03: "Invalid FIPS/APN or AddressKey provided" }
35
+ def error_codes
36
+ error_code_strings = CODE_TYPES.map { |t| File.read("config/#{t}_error_codes.yml") }
37
+ error_code_strings.map { |c| YAML.load(c) }.flat_map { |code| code.values.first.keys.map(&:to_sym) }
37
38
  end
38
39
  end
39
40
  end
@@ -1,16 +1,6 @@
1
1
  module MelissaData
2
2
  module WebSmart
3
- class XMLParser
4
- attr_accessor :xml_document
5
-
6
- def initialize(xml)
7
- @xml_document = xml
8
- end
9
-
10
- def children?(xml_node)
11
- xml_node.children.empty?
12
- end
13
-
3
+ module Formatters
14
4
  def viperize_hash hash
15
5
  hash.map { |key, value| { viperize(key.to_s) => value } }.reduce(:merge)
16
6
  end
@@ -26,27 +16,22 @@ module MelissaData
26
16
  end
27
17
  end
28
18
 
29
- class AddressXMLParser < XMLParser
30
- def parse
31
- viperize_hash(Hash[retrieved_fields.zip(field_details)])
32
- end
19
+ class XMLParser
20
+ include MelissaData::WebSmart::Formatters
21
+ attr_accessor :xml_document
33
22
 
34
- def field_details
35
- xml_children.first.children.last.children.first.children
36
- .map(&:children)
37
- .map(&:text)
23
+ def initialize(xml)
24
+ @xml_document = xml
38
25
  end
39
26
 
40
- def retrieved_fields
41
- xml_children.first.children.last.children.first.children.map(&:name)
27
+ def children?(xml_node)
28
+ xml_node.children.empty?
42
29
  end
43
30
 
44
- def xml_children
45
- xml_document.children
46
- end
47
31
  end
48
32
 
49
33
  class PropertyXMLParser < XMLParser
34
+ include MelissaData::WebSmart::Formatters
50
35
  def parse
51
36
  parsed_hash = {}
52
37
  if expected_retrieved?
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: melissa_data
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Grayson
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2015-10-19 00:00:00.000000000 Z
12
+ date: 2015-10-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -128,6 +128,11 @@ files:
128
128
  - Rakefile
129
129
  - bin/console
130
130
  - bin/setup
131
+ - config/address_error_codes.yml
132
+ - config/address_success_codes.yml
133
+ - config/error_codes.yml
134
+ - config/property_error_codes.yml
135
+ - config/property_success_codes.yml
131
136
  - lib/melissa_data.rb
132
137
  - lib/melissa_data/config.rb
133
138
  - lib/melissa_data/version.rb