ip_to_earth 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 881975620b315dd19ec558c791daf4bf28b1ef844b0bef6dc6fcf55d9b41db87
4
+ data.tar.gz: 37494f862b4768f38790f67398ace65cbbdde69f2bcead5e8ec84b38ec4b1719
5
+ SHA512:
6
+ metadata.gz: d6026b34e21431fedee9c75bee945387c07121c686ed22aa0e31fef212f4f94d1685f173ae7313cc3cc4a8425290eeafcc6ea8ca031da7c8c0b2bec5be3c8ace
7
+ data.tar.gz: 02ca79cd2d32860e75560454583a1f3fa7d99ad35c567d7f252cd4ae264baf9408cc4c3a0ebac1eda551d5b1af93f86a09e054d20be806771c83aa63df84338d
data/README.md ADDED
@@ -0,0 +1,140 @@
1
+
2
+ <p align="center">
3
+ <img src="https://app.expeditedaddons.com/iptoearth.png"/>
4
+
5
+ </p>
6
+
7
+ <h1 align='center'>IP to Earth</h1>
8
+
9
+ ## Find the Country and City of origin for an IP Address
10
+
11
+ ## Requirements
12
+
13
+ - An API Key from Heroku
14
+ - Add from: https://elements.heroku.com/addons/iptoearth
15
+
16
+ - Ruby v2.x or greater
17
+
18
+ ## Usage
19
+
20
+ ### Input Parameter Descriptions
21
+
22
+ | Index | Name | Example | Description |
23
+ | --------------- | ------- | -------- |--------|
24
+ |0|`ip`|string|IPv4 or IPv6 address|
25
+
26
+
27
+
28
+ ### Making a Request
29
+
30
+ ```ruby
31
+ require "ip_to_earth"
32
+
33
+ IpToEarth.lookup('68.10.149.45') # Pass in any valid IPv4 or IPv6 value
34
+ ```
35
+
36
+ ### Using Results
37
+
38
+ ```ruby
39
+ result = IpToEarth.lookup("8.8.8.8")
40
+ # => #<struct IpToEarth::APIResult
41
+ # valid=true,
42
+ # country="United States",
43
+ # country_code="US",
44
+ # hostname="",
45
+ # city="Mountain View",
46
+ # ip="8.8.8.8",
47
+ # latitude=37.40599060058594,
48
+ # longitude=-122.0785140991211,
49
+ # region="California",
50
+ # continent_code="NA",
51
+ # country_code3="USA",
52
+ # currency_code="USD">
53
+
54
+ result.valid # => true
55
+ result.country # => "United States"
56
+ result.country_code # => "US"
57
+ result.city # => "Virginia Beach"
58
+ result.latitude # => 37.40599060058594
59
+ # ...
60
+ ```
61
+
62
+
63
+ ## Installation
64
+
65
+ ```ruby
66
+ # In your Gemfile
67
+ gem 'ip_to_earth', git: 'https://github.com/LynxEyes/ip_to_earth.git'
68
+ ```
69
+
70
+
71
+ ## Result Attribute Descriptions
72
+
73
+ | Attribute | Type | Description |
74
+ | --------------- | ------- | -------- |
75
+ |`valid`|boolean|If the IP Address passed in is syntactically valid|
76
+ |`country`|string|Full country name where the IP address is located|
77
+ |`country_code`|string|ISO Country Code for the IP Address|
78
+ |`hostname`|string|Hostname - if any - for the IP address|
79
+ |`city`|string|City where the IP Address is located|
80
+ |`ip`|string|IP address that was evaluated|
81
+ |`latitude`|float|Geographic latitude of the identified IP address|
82
+ |`longitude`|float|Geographic longitude of the identified IP address|
83
+ |`region`|string|State or Region where the IP address is located|
84
+
85
+
86
+ ## Live Interactive Testing
87
+
88
+ Doublecheck results, use a Live Proxy and check your API Key with the interactive documentation at:
89
+
90
+ http://docs.iptoearthexp.apiary.io/
91
+
92
+ You will need your `IPTOEARTH_API_KEY` from the setup screen where you've provisioned the IP to Earth add-on.
93
+
94
+ ## Troubleshooting
95
+
96
+ As a sanity check it is sometimes useful to bypass your app stack and check the endpoint, your API Key and parameters directly.
97
+
98
+ *Test with your browser*
99
+
100
+ ```
101
+ # Modify the following to use your actual API Key
102
+ 'https://iptoearth.expeditedaddons.com/?api_key=REPLACE_WITH_YOUR_IPTOEARTH_API_KEY&ip=68.10.149.45'
103
+ ```
104
+
105
+ A successful call will return your requested data with a HTTP result code of `200` and be in `JSON` format. We recommend the [JSON Formatter](https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa?hl=en) extension as a useful tool.
106
+
107
+ ## In Development
108
+
109
+ The IP to Earth gem relies upon the environment variable `ENV['IPTOEARTH_API_KEY']` being present and correctly configured to authenticate to the service. You will need to have this variable present in your local environment for the gem to work correctly.
110
+
111
+ If you're using Heroku, please read their [Guide to Heroku Local](https://devcenter.heroku.com/articles/heroku-local) which has instructions on easily copying your config values to your development environment.
112
+
113
+ **DOTENV**
114
+
115
+ [https://github.com/bkeepers/dotenv](https://github.com/bkeepers/dotenv)
116
+
117
+ If you're trying to use IP to Earth in your local development or test environment with the [dotenv](https://github.com/bkeepers/dotenv) gem be sure that you are loading the `dotenv-rails` gem with the `rails-now` requirement.
118
+
119
+ ```ruby
120
+ # Example Gemfile excerpt
121
+
122
+ gem 'dotenv-rails', :require => 'dotenv/rails-now'
123
+ gem 'iptoearth'
124
+ ```
125
+
126
+ **FOREMAN**
127
+
128
+ [https://github.com/ddollar/foreman](https://github.com/ddollar/foreman)
129
+
130
+ If you're having issues with configuring `dotenv`, you might want to try [foreman](https://github.com/ddollar/foreman) which will also autoload `.env` files in your local environment.
131
+
132
+
133
+ **Test in the Rails console**
134
+
135
+ Launch `rails c` in your development project directory and at the prompt enter `ENV[IPTOEARTH_API_KEY]` which, if you've configured your development environment correctly should display your API Key.
136
+
137
+ ## License
138
+
139
+ The IP to Earth gem is licensed under the MIT license.
140
+
@@ -0,0 +1,45 @@
1
+ module IpToEarth
2
+ class APIController
3
+ HEADERS = {
4
+ accept: 'application/json'
5
+ }.freeze
6
+
7
+ def initialize(api_key: Configuration.api_key)
8
+ @lookup_url_template =
9
+ Addressable::Template.new("#{Configuration.base_uri}/{?ip,api_key}")
10
+ .partial_expand(api_key: api_key)
11
+ end
12
+
13
+ def lookup(ip)
14
+ query_url = lookup_url_template.expand(ip: ip)
15
+
16
+ response = Http.headers(HEADERS).get(query_url)
17
+
18
+ fail_on_bad_response(response)
19
+ parse_response(response)
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :lookup_url_template
25
+
26
+ def fail_on_bad_response(response)
27
+ return unless [403, 404, 429, 500].include?(response.code)
28
+
29
+ error_message = case response.code
30
+ when 429 then "Rate limit exceeded"
31
+ when 404 then "Endpoint not found"
32
+ when 500 then "Endpoint application error"
33
+ when 403 then "API Key not found or invalid"
34
+ end
35
+
36
+ raise APIException.new(error_message, response.code, response.body)
37
+ end
38
+
39
+ def parse_response(response)
40
+ APIResult.new(response.parse(:json))
41
+ rescue JSON::ParserError
42
+ raise APIException.new("Invalid JSON returned.", response.code, response.to_s)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,11 @@
1
+ module IpToEarth
2
+ class APIException < StandardError
3
+ attr_reader :response_code, :response_body
4
+
5
+ def initialize(reason, response_code, response_body)
6
+ super(reason)
7
+ @response_code = response_code
8
+ @response_body = response_body
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module IpToEarth
2
+ APIResult = Struct.new(:valid, :country, :country_code, :hostname,
3
+ :city, :ip, :latitude, :longitude, :region,
4
+ :continent_code, :country_code3, :currency_code) do
5
+
6
+ # NOTE: yes, keyword_init: true exists but raises an error on unknown keywords!
7
+ def initialize(args)
8
+ members.each { |field| send("#{field}=", args[field.to_s]) }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ module IpToEarth
2
+ class Client
3
+ def self.default
4
+ @default_instance ||= new
5
+ end
6
+
7
+ def initialize(api_key: Configuration.api_key)
8
+ @api_controller = APIController.new(api_key: api_key)
9
+ end
10
+
11
+ def lookup(ip)
12
+ @api_controller.lookup(ip)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ module IpToEarth
2
+ class Configuration
3
+ @base_uri = "https://iptoearth.expeditedaddons.com" || ENV['IPTOEARTH_URI']
4
+
5
+ @api_key = ENV['IPTOEARTH_API_KEY']
6
+
7
+ class << self
8
+ attr_reader :base_uri, :api_key
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ require 'openssl'
2
+ require 'json'
3
+ require 'http'
4
+ require 'addressable'
5
+
6
+ require_relative 'ip_to_earth/api_exception.rb'
7
+ require_relative 'ip_to_earth/configuration.rb'
8
+ require_relative 'ip_to_earth/client.rb'
9
+ require_relative 'ip_to_earth/api_controller.rb'
10
+ require_relative 'ip_to_earth/api_result.rb'
11
+
12
+ module IpToEarth
13
+ def self.lookup(ip)
14
+ Client.default.lookup(ip)
15
+ end
16
+
17
+ def self.with_api_key(key)
18
+ Client.new(api_key: key)
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ip_to_earth
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ivo Jesus
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-04-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: http
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: addressable
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.6'
41
+ description: Find the Country and City of origin for an IP Address
42
+ email: ivo.jesus@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - README.md
48
+ - lib/ip_to_earth.rb
49
+ - lib/ip_to_earth/api_controller.rb
50
+ - lib/ip_to_earth/api_exception.rb
51
+ - lib/ip_to_earth/api_result.rb
52
+ - lib/ip_to_earth/client.rb
53
+ - lib/ip_to_earth/configuration.rb
54
+ homepage: https://github.com/LynxEyes/ip_to_earth
55
+ licenses:
56
+ - MIT
57
+ metadata: {}
58
+ post_install_message:
59
+ rdoc_options: []
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '2.3'
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ requirements: []
73
+ rubyforge_project:
74
+ rubygems_version: 2.7.6
75
+ signing_key:
76
+ specification_version: 4
77
+ summary: ip_to_earth
78
+ test_files: []