ipstack 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +0 -2
- data/README.md +34 -7
- data/lib/ipstack/api.rb +14 -6
- data/lib/ipstack/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 412b55aa9741be14e2f8f8df76e93dae4856354c917118cb45084903fff0f833
|
4
|
+
data.tar.gz: ba32b6b878a746814cc64d8230316d0634984735c03b50320ce21559ef3d39c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f7975f01d53b72a4e2e6ff9901eed1b52aa93902535cca7a435e41ae13df5a00fc905bfdd11a0ec95fc368eba1a6d50b1f99caf176432125dc362fdeeb5f134
|
7
|
+
data.tar.gz: 1a5e2c1244283b62a7c67ededce73e7f7b75636f4b912ad689597d21ada181ad3125eb9efbfd87c3c1bde53db71c052b5c3a083557b5426d843fe131852c04eb
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# (Unofficial) Ipstack
|
1
|
+
# (Unofficial) Ipstack Gem for API requests
|
2
2
|
|
3
3
|
## Installation
|
4
4
|
|
@@ -18,17 +18,44 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
|
21
|
+
* All endpoints listed in https://ipstack.com/documentation can be found under Ipstack::API (.check, .standard, .bulk)
|
22
|
+
* Returned data is automatically converted into ruby usable forms
|
23
|
+
* **JSON** will be passed through JSON.parse to return a Ruby data structure (a Hash)
|
24
|
+
* **XML** through Nokogiri::XML
|
25
|
+
* To disable this, you can set the _return_raw_ to true under optionals.
|
26
|
+
* Only basic checks are performed to be sure your parameters for the method are there or != nil/empty. You'll want to still rely on errors returned from the api itself. See documentation.
|
22
27
|
|
23
|
-
|
28
|
+
Here are examples:
|
24
29
|
|
25
|
-
|
30
|
+
```ruby
|
31
|
+
|
32
|
+
irb(main):008:0> Ipstack::API.check
|
33
|
+
=> {"ip"=>"73.152.49.135", "type"=>"ipv4", "continent_code"=>"NA", "continent_name"=>"North America", "country_code"=>"US", "country_name"=>"United States", "region_code"=>"VA", "region_name"=>"Virginia", "city"=>"Ashburn", "zip"=>"20147", "latitude"=>39.018, "longitude"=>-77.539, "location"=>{"geoname_id"=>4744870, "capital"=>"Washington D.C.", "languages"=>[{"code"=>"en", "name"=>"English", "native"=>"English"}], "country_flag"=>"http://assets.ipstack.com/flags/us.svg", "country_flag_emoji"=>"🇺🇸", "country_flagmoji_unicode"=>"U+1F1FA U+1F1F8", "calling_code"=>"1", "is_eu"=>false}}
|
34
|
+
|
35
|
+
irb(main):007:0> Ipstack::API.standard('134.201.250.155',{fields: 'city,region_name,zip'})
|
36
|
+
=> {"city"=>"Huntington Beach", "region_name"=>"California", "zip"=>"92648"}
|
37
|
+
|
38
|
+
irb(main):010:0> Ipstack::API.bulk('134.201.250.155,73.152.49.135',{fields: 'city,region_name,zip'})
|
39
|
+
=> {"success"=>false, "error"=>{"code"=>303, "type"=>"batch_not_supported_on_plan", "info"=>"Bulk requests are not supported on your plan. Please upgrade your subscription."}}
|
26
40
|
|
27
|
-
|
41
|
+
# Returning XML
|
42
|
+
|
43
|
+
irb(main):001:0> Ipstack::API.check({output: 'xml'})
|
44
|
+
=> #<Nokogiri::XML::Document:0x3fe9c31604f8 name="document" children=[#<Nokogiri::XML::Element:0x3fe9c31601b0 name="result" children=[#<Nokogiri::XML::Element:0x3fe9c315de9c name="ip" children=[#<Nokogiri::XML::Text:0x3fe9c315db68 "73.152.49.135">]>, #<Nokogiri::XML::Element:0x3fe9c315d30c . . .
|
45
|
+
|
46
|
+
# Returning raw json or xml
|
47
|
+
|
48
|
+
irb(main):002:0> Ipstack::API.check({return_raw: true})
|
49
|
+
=> "{\"ip\":\"73.152.49.135\",\"type\":\"ipv4\",\"continent_code\":\"NA\",\"continent_name\":\"North America\",\"country_code\":\"US\",\"country_name\":\"United States\",\"region_code\":\"VA\",\"region_name\":\"Virginia\",\"city\":\"Ashburn\",\"zip\":\"20147\",\"latitude\":39.018,\"longitude\":-77.539,\"location\":{\"geoname_id\":4744870,\"capital\":\"Washington D.C.\",\"languages\":[{\"code\":\"en\",\"name\":\"English\",\"native\":\"English\"}],\"country_flag\":\"http:\\/\\/assets.ipstack.com\\/flags\\/us.svg\",\"country_flag_emoji\":\"\\ud83c\\uddfa\\ud83c\\uddf8\",\"country_flag_emoji_unicode\":\"U+1F1FA U+1F1F8\",\"calling_code\":\"1\",\"is_eu\":false}}"
|
50
|
+
|
51
|
+
irb(main):003:0> Ipstack::API.standard('73.152.49.135',{output: 'xml', return_raw: true})
|
52
|
+
=> "<?xml version=\"1.0\"?>\n<result><ip>73.152.49.135</ip><type>ipv4</type><continent_code>NA</continent_code><continent_name>North America</continent_name><country_code>US</country_code><country_name>United States</country_name><region_code>VA</region_code><region_name>Virginia</region_name><city>Ashburn</city><zip>20147</zip><latitude>39.018</latitude><longitude>-77.539</longitude><location><geoname_id>4744870</geoname_id><capital>Washington D.C.</capital><languages><code>en</code><name>English</name><native>English</native></languages><country_flag>http://assets.ipstack.com/flags/us.svg</country_flag><country_flag_emoji>🇺🇸</country_flag_emoji><country_flag_emoji_unicode>U+1F1FA U+1F1F8</country_flag_emoji_unicode><calling_code>1</calling_code><is_eu></is_eu></location></result>\n"
|
53
|
+
|
54
|
+
```
|
28
55
|
|
29
56
|
## Contributing
|
30
57
|
|
31
|
-
|
58
|
+
This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
32
59
|
|
33
60
|
## License
|
34
61
|
|
@@ -36,4 +63,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
36
63
|
|
37
64
|
## Code of Conduct
|
38
65
|
|
39
|
-
Everyone interacting in the Ipstack project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/
|
66
|
+
Everyone interacting in the Ipstack project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/NorseGaud/ipstack/blob/master/CODE_OF_CONDUCT.md).
|
data/lib/ipstack/api.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
require 'openssl'
|
3
3
|
require 'json'
|
4
|
+
require 'nokogiri'
|
4
5
|
|
5
6
|
module Ipstack
|
6
7
|
class API
|
7
8
|
# Make sure we can access parameters of the object
|
8
|
-
attr_accessor :api_url, :content_type, :access_key, :optionals, :params_uri
|
9
|
+
attr_accessor :api_url, :content_type, :access_key, :optionals, :params_uri, :return_raw
|
9
10
|
def initialize(optionals = {}, access_key = ENV['IPSTACK_ACCESS_KEY'])
|
10
11
|
|
11
12
|
raise ArgumentError, 'Requires a hash of optional values found on https://ipstack.com/documentation' unless optionals.is_a?(Hash)
|
12
13
|
raise ArgumentError, '\'access_key\' (api key) cannot be nil. Obtain your key from https://ipstack.com/quickstart and set it as ENV[\'IPSTACK_ACCESS_KEY\']' if access_key.nil? || access_key == ''
|
13
14
|
|
15
|
+
@return_raw = optionals[:return_raw]
|
16
|
+
optionals.delete(:return_raw) # remove it from optionals since we each optionals for our url params
|
17
|
+
|
14
18
|
@api_url = 'http://api.ipstack.com/'
|
15
19
|
@access_key = access_key
|
16
20
|
@params_uri = "?access_key=#{access_key}"
|
@@ -24,31 +28,35 @@ module Ipstack
|
|
24
28
|
# TODO: HTTP/HTTPS support
|
25
29
|
#http.use_ssl = false
|
26
30
|
# https.verify_mode = OpenSSL::SSL::VERIFY_NONE # SSL not signed? Don't care!
|
27
|
-
request = Net::HTTP::Get.new(query_ips.nil? || query_ips
|
31
|
+
request = Net::HTTP::Get.new(query_ips.nil? || query_ips.empty? ? "/check#{object.params_uri}" : "/#{query_ips}#{object.params_uri}")
|
28
32
|
response = http.request(request)
|
29
33
|
case response
|
30
34
|
when Net::HTTPSuccess
|
31
|
-
object.
|
35
|
+
if object.return_raw
|
36
|
+
response.body
|
37
|
+
else
|
38
|
+
object.optionals[:output] == 'xml' ? Nokogiri::XML(response.body) : JSON.parse(response.body)
|
39
|
+
end
|
32
40
|
else
|
33
41
|
return response
|
34
42
|
#"HTTP Error: #{response.code} #{response.message} : #{response.body}"
|
35
43
|
end
|
36
44
|
end
|
37
45
|
|
38
|
-
# https://ipstack.com/documentation
|
39
46
|
def self.standard(ip, optionals = {})
|
40
47
|
api_request_object = Ipstack::API.new(optionals)
|
41
|
-
raise
|
48
|
+
raise ArgumentError, 'Requires a single IP as first parameter' if ip.nil? || ip.empty? || ip.is_a?(Hash)
|
42
49
|
Ipstack::API.make_request(api_request_object,ip)
|
43
50
|
end
|
44
51
|
|
45
52
|
def self.bulk(ips, optionals = {})
|
46
53
|
api_request_object = Ipstack::API.new(optionals)
|
47
|
-
raise
|
54
|
+
raise ArgumentError, 'Requires a list of IPs comma separated as first parameter' if ips.nil? || ips.empty? || ip.is_a?(Hash) || !( ips.include?(',') && ips.match(/((25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)(,\n|,?$))/) )
|
48
55
|
Ipstack::API.make_request(api_request_object,ips)
|
49
56
|
end
|
50
57
|
|
51
58
|
def self.check(optionals = {})
|
59
|
+
raise ArgumentError,'Only optionals hash allowed as first parameter' unless optionals.is_a?(Hash) || optionals.empty?
|
52
60
|
api_request_object = Ipstack::API.new(optionals)
|
53
61
|
Ipstack::API.make_request(api_request_object)
|
54
62
|
end
|
data/lib/ipstack/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ipstack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Pierce
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|