ncua 0.9.0 → 0.10.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 +4 -4
- data/README.md +20 -0
- data/Rakefile +4 -0
- data/lib/ncua.rb +21 -0
- data/lib/ncua/client.rb +1 -2
- data/lib/ncua/client_validator.rb +30 -0
- data/lib/ncua/credit_union/scraper_validator.rb +56 -0
- data/lib/ncua/railtie.rb +9 -0
- data/lib/ncua/version.rb +1 -1
- data/lib/tasks/ncua_tasks.rb +13 -0
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7e2e496175b1a98a96270345f3685e360cab0cb
|
4
|
+
data.tar.gz: 8b84ad589f325b8077cb74233db773eac5bdce08
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec03e928a657aaa4bcc8bf765b1ac1f10d135489e308e1a0e015ea74d5a376359021d063a3dd17e0e695adf974490d0afc9ff5fb5b6dda6075f2785c163af18c
|
7
|
+
data.tar.gz: 2b47405597a38b5599d451be70bcc4e5fa470ae19b5fe26d74203329675c3d71e7a402d24d7b24c8ba9c1d256de3bbb50bed77eea55319d99220480d180c9333
|
data/README.md
CHANGED
@@ -116,6 +116,26 @@ If for some reason the NCUA returns a 500 error when directly scraping for credi
|
|
116
116
|
|
117
117
|
In fact, we only really expect response codes in the 200 range. If the NCUA returns another response, the gem will raise `NCUA::CreditUnion::ServerError` with the response code in the description.
|
118
118
|
|
119
|
+
## Validating this Gem's Schema Assumptions
|
120
|
+
|
121
|
+
This gem relies upon both the schema of an unpublished public JSON API and the particular markup of a page on the NCUA's website remaining constant.
|
122
|
+
|
123
|
+
Obviously, this is a bad practice. Until the NCUA publishes a versioned, public API of their data, we will continue to rely upon these unorthodox methods of data retrieval.
|
124
|
+
|
125
|
+
To help current users of this gem, we have provided an API for validating the assumed schema of the NCUA's data.
|
126
|
+
|
127
|
+
Calling `NCUA.schema_valid?` will return `true` if the gem is safe to use. Note that this makes an actual call to the NCUA's endpoints, so be mindful of its use.
|
128
|
+
|
129
|
+
Calling `NCUA.validate_schema!` will similarly return `true` if the gem is safe to use, but will raise a more detailed exception if the schema is invalid.
|
130
|
+
|
131
|
+
The gem provides an internal rake task, `rake ncua:validate_schema!`, which calls `NCUA.validate_schema!`. For the convenience of Rails users, we have used a Railtie to automatically provide this rake task in your application.
|
132
|
+
|
133
|
+
If you do not use Rails, you can add the following to your `Rakefile` to expose this task.
|
134
|
+
```ruby
|
135
|
+
require 'ncua'
|
136
|
+
NCUA::NCUATasks.new.install_tasks
|
137
|
+
```
|
138
|
+
|
119
139
|
## Contributing
|
120
140
|
|
121
141
|
Bug reports and pull requests are welcome on GitHub at https://github.com/ContinuityControl/ncua.
|
data/Rakefile
CHANGED
data/lib/ncua.rb
CHANGED
@@ -2,13 +2,18 @@ require 'httparty'
|
|
2
2
|
require 'nokogiri'
|
3
3
|
require 'ncua/version'
|
4
4
|
require 'ncua/client'
|
5
|
+
require 'ncua/client_validator'
|
5
6
|
require 'ncua/credit_union/record'
|
6
7
|
require 'ncua/credit_union/office'
|
7
8
|
require 'ncua/credit_union/details'
|
8
9
|
require 'ncua/credit_union/scraper'
|
10
|
+
require 'ncua/credit_union/scraper_validator'
|
9
11
|
require 'ncua/credit_union/details_client'
|
12
|
+
require 'tasks/ncua_tasks'
|
10
13
|
|
11
14
|
module NCUA
|
15
|
+
require "ncua/railtie" if defined?(Rails)
|
16
|
+
|
12
17
|
def self.find_office_by_address(address, opts={radius: 100})
|
13
18
|
resp = Client.new.find_credit_union_by_address(address, opts[:radius])
|
14
19
|
resp["list"].map { |result| CreditUnion::Office.new(result) }
|
@@ -27,4 +32,20 @@ module NCUA
|
|
27
32
|
def self.find_credit_union(charter_number)
|
28
33
|
CreditUnion::Details.new(CreditUnion::Scraper.new(charter_number).scrape!)
|
29
34
|
end
|
35
|
+
|
36
|
+
def self.validate_schema!
|
37
|
+
unless NCUA::CreditUnion::ScraperValidator.new.schema_valid?
|
38
|
+
raise "NCUA CreditUnion Scraper Schema is invalid. Please contact Gem Maintainer"
|
39
|
+
end
|
40
|
+
|
41
|
+
unless NCUA::ClientValidator.schema_valid?
|
42
|
+
raise "NCUA Client Schema is invalid. Please contact Gem Maintainer"
|
43
|
+
end
|
44
|
+
|
45
|
+
true
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.schema_valid?
|
49
|
+
NCUA::CreditUnion::Scraper.new(42).schema_valid? && NCUA::ClientValidator.schema_valid?
|
50
|
+
end
|
30
51
|
end
|
data/lib/ncua/client.rb
CHANGED
@@ -6,7 +6,7 @@ module NCUA
|
|
6
6
|
format :json
|
7
7
|
#debug_output $stderr
|
8
8
|
|
9
|
-
def find_credit_union_by_address(address, radius)
|
9
|
+
def find_credit_union_by_address(address, radius = 100)
|
10
10
|
self.class.get(query_endpoint, query: {
|
11
11
|
address: address,
|
12
12
|
type: 'address',
|
@@ -30,6 +30,5 @@ module NCUA
|
|
30
30
|
def query_endpoint
|
31
31
|
'/findCUByRadius.aspx'
|
32
32
|
end
|
33
|
-
|
34
33
|
end
|
35
34
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module NCUA
|
2
|
+
class ClientValidator
|
3
|
+
def self.schema_valid?
|
4
|
+
base_fields_valid? && list_fields_valid?
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def self.base_fields_valid?
|
10
|
+
methods = [:find_credit_union_by_name, :find_credit_union_by_charter_number, :find_credit_union_by_address]
|
11
|
+
expected_keys = ['list', 'latitude', 'longitude'].sort
|
12
|
+
|
13
|
+
methods.all? { |method_name|
|
14
|
+
Client.new.send(method_name, "Something Fake").keys.sort == expected_keys
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.list_fields_valid?
|
19
|
+
expected_keys = ['CU_NAME', 'AddressLongitude', 'AddressLatitude',
|
20
|
+
'CU_SITENAME', 'CU_NUMBER', 'City', 'CityPhysical',
|
21
|
+
'Country', 'index', 'IsMainOffice', 'Phone',
|
22
|
+
'SiteFunctions', 'SiteId', 'SiteName', 'State', 'URL',
|
23
|
+
'Zipcode', 'distance', 'Street'].sort
|
24
|
+
found_keys = Client.new.find_credit_union_by_charter_number(42)["list"].first.keys.sort
|
25
|
+
# return expected_fields is a subset of found_keys
|
26
|
+
found_keys == expected_keys
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module NCUA
|
2
|
+
module CreditUnion
|
3
|
+
class ScraperValidator
|
4
|
+
def schema_valid?
|
5
|
+
has_a_table? &&
|
6
|
+
has_correctly_formatted_key_value_rows? &&
|
7
|
+
has_correct_keys?
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def has_a_table?
|
13
|
+
!html_doc.at_css('table#MainContent_newDetails').nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
def has_correctly_formatted_key_value_rows?
|
17
|
+
key_value_rows.all? { |tr|
|
18
|
+
key_value_row?(tr.css("td")) || sub_header_row?(tr.css("td"))
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def has_correct_keys?
|
23
|
+
found_keys = key_value_rows.map { |tr| tr.at_css('td.dvHeader') }.compact.map(&:text)
|
24
|
+
expected_keys = ["Credit Union Name:", "Charter Number:", "Credit Union Type:",
|
25
|
+
"Credit Union Status:", "Corporate Credit Union:",
|
26
|
+
"Credit Union Charter Year:", "Current Charter Issue Date:",
|
27
|
+
"Date Insured:", "Charter State:", "Region:",
|
28
|
+
"Field of Membership Type:", "Low Income Designation:",
|
29
|
+
"Member of FHLB:", "Assets:", "Peer Group:", "Number of Members:",
|
30
|
+
"Address:", "City, State Zip code:", "Country:", "County:", "Phone:",
|
31
|
+
"Website:", "CEO/Manager:"]
|
32
|
+
found_keys == expected_keys
|
33
|
+
end
|
34
|
+
|
35
|
+
def key_value_row?(tr_cells)
|
36
|
+
tr_cells.count == 2 && tr_cells.first[:class] == 'dvHeader'
|
37
|
+
end
|
38
|
+
|
39
|
+
def sub_header_row?(tr_cells)
|
40
|
+
tr_cells.count == 1 && tr_cells.first[:class] == 'subheader'
|
41
|
+
end
|
42
|
+
|
43
|
+
def request
|
44
|
+
@request ||= DetailsClient.new.get_details(42)
|
45
|
+
end
|
46
|
+
|
47
|
+
def html_doc
|
48
|
+
@html_doc ||= Nokogiri::HTML(request.body)
|
49
|
+
end
|
50
|
+
|
51
|
+
def key_value_rows
|
52
|
+
@key_value_rows ||= html_doc.at_css("table#MainContent_newDetails").css("tr")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/ncua/railtie.rb
ADDED
data/lib/ncua/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ncua
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Reznick
|
@@ -118,12 +118,16 @@ files:
|
|
118
118
|
- bin/setup
|
119
119
|
- lib/ncua.rb
|
120
120
|
- lib/ncua/client.rb
|
121
|
+
- lib/ncua/client_validator.rb
|
121
122
|
- lib/ncua/credit_union/details.rb
|
122
123
|
- lib/ncua/credit_union/details_client.rb
|
123
124
|
- lib/ncua/credit_union/office.rb
|
124
125
|
- lib/ncua/credit_union/record.rb
|
125
126
|
- lib/ncua/credit_union/scraper.rb
|
127
|
+
- lib/ncua/credit_union/scraper_validator.rb
|
128
|
+
- lib/ncua/railtie.rb
|
126
129
|
- lib/ncua/version.rb
|
130
|
+
- lib/tasks/ncua_tasks.rb
|
127
131
|
- ncua.gemspec
|
128
132
|
homepage: https://github.com/ContinuityControl/ncua
|
129
133
|
licenses:
|