From 16726c39ae27a934c9ca0fb78576601009f04ac1 Mon Sep 17 00:00:00 2001 From: Jeff Barriault Date: Wed, 11 Aug 2021 21:11:05 -0500 Subject: [PATCH 1/8] Add lookup and result classes for NetToolKit --- lib/geocoder/lookup.rb | 1 + lib/geocoder/lookups/net_tool_kit.rb | 60 ++++++++++++++++++++++++ lib/geocoder/results/net_tool_kit.rb | 70 ++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 lib/geocoder/lookups/net_tool_kit.rb create mode 100644 lib/geocoder/results/net_tool_kit.rb diff --git a/lib/geocoder/lookup.rb b/lib/geocoder/lookup.rb index 063334bb2..c19c0dc2f 100644 --- a/lib/geocoder/lookup.rb +++ b/lib/geocoder/lookup.rb @@ -34,6 +34,7 @@ def street_services :geocoder_ca, :yandex, :nationaal_georegister_nl, + :net_tool_kit, :nominatim, :mapbox, :mapquest, diff --git a/lib/geocoder/lookups/net_tool_kit.rb b/lib/geocoder/lookups/net_tool_kit.rb new file mode 100644 index 000000000..f1b1fc351 --- /dev/null +++ b/lib/geocoder/lookups/net_tool_kit.rb @@ -0,0 +1,60 @@ +require 'geocoder/lookups/base' +require "geocoder/results/net_tool_kit" + +module Geocoder::Lookup + class NetToolKit < Base + + def name + "NetToolKit" + end + + def required_api_key_parts + ["http_headers"] + end + + def supported_protocols + [:https] + end + + private # --------------------------------------------------------------- + + def base_query_url(query) + "#{protocol}://api.nettoolkit.com/v1/geo/geocodes#{search_type(query)}?" + end + + def search_type(query) + query.reverse_geocode? ? "reverse-geocodes" : "geocodes" + end + + def query_url_params(query) + params = { :address => query.sanitized_text } + + [:provider].each do |option| + unless (option_value = query.options[option]).nil? + params[option] = option_value + end + end + + params.merge(super) + end + + def results(query) + return [] unless doc = fetch_data(query) + return doc["results"] if doc['code'] == 1000 + + messages = doc['message'] + case doc['code'] + when 4001 # Error with input + raise_error(Geocoder::InvalidRequest, messages) || + Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") + when 3002 # Key related error + raise_error(Geocoder::InvalidApiKey, messages) || + Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") + else + raise_error(Geocoder::Error, messages) || + Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") + end + end + + end +end diff --git a/lib/geocoder/results/net_tool_kit.rb b/lib/geocoder/results/net_tool_kit.rb new file mode 100644 index 000000000..b70265aae --- /dev/null +++ b/lib/geocoder/results/net_tool_kit.rb @@ -0,0 +1,70 @@ +require 'geocoder/results/base' + +module Geocoder::Result + class NetToolKit < Base + + def address + @data['address'] + end + + def coordinates + %w[latitude longitude].map{ |l| @data[l] } + end + + def house_number + @data['house_number'] + end + + def street + @data['street'] + end + + def street_name + @data['street_name'] + end + + def street_type + @data['street_type'] + end + + def city + @data['city'] + end + + def county + @data['county'] + end + + def state + @data['state'] + end + + def state_code + @data['state_code'] + end + + def postal_code + @data['postcode'] + end + + def precision + @data['precision'] + end + + def provider + @data['provider'] + end + + def ntk_geocode_time + @data['ntk_geocode_time'] + end + + response_attributes.each do |a| + unless method_defined?(a) + define_method a do + @data[a] + end + end + end + end +end From 1b965768651ceebce2c7d79ec5b59c6261589d66 Mon Sep 17 00:00:00 2001 From: Jeff Barriault Date: Wed, 11 Aug 2021 21:24:59 -0500 Subject: [PATCH 2/8] Quick fix --- lib/geocoder/results/net_tool_kit.rb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/geocoder/results/net_tool_kit.rb b/lib/geocoder/results/net_tool_kit.rb index b70265aae..026c35cfc 100644 --- a/lib/geocoder/results/net_tool_kit.rb +++ b/lib/geocoder/results/net_tool_kit.rb @@ -58,13 +58,5 @@ def provider def ntk_geocode_time @data['ntk_geocode_time'] end - - response_attributes.each do |a| - unless method_defined?(a) - define_method a do - @data[a] - end - end - end end end From 90db5b0bed7f5ff320c5ab900776bd382371a31f Mon Sep 17 00:00:00 2001 From: Jeff Barriault Date: Wed, 11 Aug 2021 21:28:33 -0500 Subject: [PATCH 3/8] Fix required_api_key_parts --- lib/geocoder/lookups/net_tool_kit.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/geocoder/lookups/net_tool_kit.rb b/lib/geocoder/lookups/net_tool_kit.rb index f1b1fc351..2843d913b 100644 --- a/lib/geocoder/lookups/net_tool_kit.rb +++ b/lib/geocoder/lookups/net_tool_kit.rb @@ -9,7 +9,7 @@ def name end def required_api_key_parts - ["http_headers"] + [:http_headers] end def supported_protocols From 3c7fe51583364c044a912f3faa9923461711b73d Mon Sep 17 00:00:00 2001 From: Jeff Barriault Date: Wed, 11 Aug 2021 21:31:03 -0500 Subject: [PATCH 4/8] =?UTF-8?q?Don=E2=80=99t=20require=20keys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/geocoder/lookups/net_tool_kit.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/geocoder/lookups/net_tool_kit.rb b/lib/geocoder/lookups/net_tool_kit.rb index 2843d913b..7e43eff8e 100644 --- a/lib/geocoder/lookups/net_tool_kit.rb +++ b/lib/geocoder/lookups/net_tool_kit.rb @@ -8,10 +8,6 @@ def name "NetToolKit" end - def required_api_key_parts - [:http_headers] - end - def supported_protocols [:https] end From c9a62127eb1e7c56172109f166610d01376b4e68 Mon Sep 17 00:00:00 2001 From: Jeff Barriault Date: Wed, 11 Aug 2021 21:47:44 -0500 Subject: [PATCH 5/8] Fix base query url --- lib/geocoder/lookups/net_tool_kit.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/geocoder/lookups/net_tool_kit.rb b/lib/geocoder/lookups/net_tool_kit.rb index 7e43eff8e..23bbe22b2 100644 --- a/lib/geocoder/lookups/net_tool_kit.rb +++ b/lib/geocoder/lookups/net_tool_kit.rb @@ -15,7 +15,7 @@ def supported_protocols private # --------------------------------------------------------------- def base_query_url(query) - "#{protocol}://api.nettoolkit.com/v1/geo/geocodes#{search_type(query)}?" + "#{protocol}://api.nettoolkit.com/v1/geo/#{search_type(query)}?" end def search_type(query) From 30249fd01e72219bf956a0f76fb6e4f7b66856b3 Mon Sep 17 00:00:00 2001 From: Jeff Barriault Date: Thu, 12 Aug 2021 08:09:33 -0500 Subject: [PATCH 6/8] Error handling --- lib/geocoder/lookups/net_tool_kit.rb | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/geocoder/lookups/net_tool_kit.rb b/lib/geocoder/lookups/net_tool_kit.rb index 23bbe22b2..1a14f1fc6 100644 --- a/lib/geocoder/lookups/net_tool_kit.rb +++ b/lib/geocoder/lookups/net_tool_kit.rb @@ -36,16 +36,25 @@ def query_url_params(query) def results(query) return [] unless doc = fetch_data(query) - return doc["results"] if doc['code'] == 1000 + return doc["results"] if doc['code'] == 1000 || doc['code'] == 1001 messages = doc['message'] case doc['code'] - when 4001 # Error with input - raise_error(Geocoder::InvalidRequest, messages) || + when 2002, 2003, 2004, 2005 + raise_error(Geocoder::ServiceUnavailable, messages) || + Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") + when 3000 + raise_error(Geocoder::RequestDenied, messages) || + Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") + when 3001, 3003 + raise_error(Geocoder::OverQueryLimitError, messages) || Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") - when 3002 # Key related error + when 3002 raise_error(Geocoder::InvalidApiKey, messages) || Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") + when 4000, 4001, 4002 + raise_error(Geocoder::InvalidRequest, messages) || + Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") else raise_error(Geocoder::Error, messages) || Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") From f9a526c52d515d569071f94ade6c63740e603ca5 Mon Sep 17 00:00:00 2001 From: Jeff Barriault Date: Thu, 12 Aug 2021 08:56:56 -0500 Subject: [PATCH 7/8] Update API Guide --- README_API_GUIDE.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README_API_GUIDE.md b/README_API_GUIDE.md index 8e151a374..a79b397ec 100644 --- a/README_API_GUIDE.md +++ b/README_API_GUIDE.md @@ -165,6 +165,27 @@ The [Google Places Search API](https://developers.google.com/maps/documentation/ * **Limitations**: ? * **Notes**: You can use the open (non-licensed) API by setting: `Geocoder.configure(mapquest: {open: true})` (defaults to licensed version) +### NetToolKit (`:net_tool_kit`) + +* **API key**: required, but added to HTTP Headers (See below) +* **Key signup**: https://www.nettoolkit.com/pricing +* **Quota**: ? +* **HTTP Headers**: you can specify the API key and a referer like so: + ``` + Geocoder.configure( + http_headers: { + "X-NTK-KEY" => ENV["NET_TOOL_KIT_API_KEY"], + "Referer" => "http://foo.com" + } + ) + ``` +* **Region**: world +* **SSL support**: yes +* **Languages**: English +* **Documentation**: https://www.nettoolkit.com/docs/overview +* **Terms of Service**: https://www.nettoolkit.com/terms +* **Limitations**: ? + ### Nominatim (`:nominatim`) * **API key**: none From b95624e74a5de71dcfcb7ae258c79ba75e3d4df0 Mon Sep 17 00:00:00 2001 From: Jeff Barriault Date: Tue, 18 Oct 2022 10:11:43 -0500 Subject: [PATCH 8/8] add version=2 to base query url --- .idea/.gitignore | 8 ++++++++ .idea/geocoder.iml | 22 ++++++++++++++++++++++ .idea/misc.xml | 4 ++++ .idea/modules.xml | 8 ++++++++ .idea/vcs.xml | 6 ++++++ lib/geocoder/lookups/net_tool_kit.rb | 20 ++++++++++---------- 6 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/geocoder.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..73f69e095 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/geocoder.iml b/.idea/geocoder.iml new file mode 100644 index 000000000..dccff1c66 --- /dev/null +++ b/.idea/geocoder.iml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..8a4f1abbb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..e589fae76 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..94a25f7f4 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lib/geocoder/lookups/net_tool_kit.rb b/lib/geocoder/lookups/net_tool_kit.rb index 1a14f1fc6..3af50012a 100644 --- a/lib/geocoder/lookups/net_tool_kit.rb +++ b/lib/geocoder/lookups/net_tool_kit.rb @@ -1,11 +1,11 @@ require 'geocoder/lookups/base' -require "geocoder/results/net_tool_kit" +require 'geocoder/results/net_tool_kit' module Geocoder::Lookup class NetToolKit < Base def name - "NetToolKit" + 'NetToolKit' end def supported_protocols @@ -15,34 +15,34 @@ def supported_protocols private # --------------------------------------------------------------- def base_query_url(query) - "#{protocol}://api.nettoolkit.com/v1/geo/#{search_type(query)}?" + "#{protocol}://api.nettoolkit.com/v1/geo/#{search_type(query)}?version=2&" end def search_type(query) - query.reverse_geocode? ? "reverse-geocodes" : "geocodes" + query.reverse_geocode? ? 'reverse-geocodes' : 'geocodes' end def query_url_params(query) - params = { :address => query.sanitized_text } - + params = { address: query.sanitized_text } + [:provider].each do |option| unless (option_value = query.options[option]).nil? params[option] = option_value end end - + params.merge(super) end def results(query) return [] unless doc = fetch_data(query) - return doc["results"] if doc['code'] == 1000 || doc['code'] == 1001 - + return doc['results'] if doc['code'] == 1000 || doc['code'] == 1001 + messages = doc['message'] case doc['code'] when 2002, 2003, 2004, 2005 raise_error(Geocoder::ServiceUnavailable, messages) || - Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") + Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") when 3000 raise_error(Geocoder::RequestDenied, messages) || Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}")