public_ip 0.1.1 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c6014ac220e8ffedcb14958f6a2d32463d756a42
4
- data.tar.gz: 1e0ddf384845fc0e4993986e015413ad4e2a644c
2
+ SHA256:
3
+ metadata.gz: 39935714ca59a830458e02a82ebbee41923c6467d2c0de7de85b0919a0ba14d2
4
+ data.tar.gz: 2401864e2aed2471eeb0f84fd0dedd8de4512235f0afdda9bdd78051c649f6bb
5
5
  SHA512:
6
- metadata.gz: 494aacfe714bdbe90586a2d995c387748d1bb949df19009d9f3ed8b2c13ad215aa26caf5e0d9eae21beac1e1840fbcc76bc4b33433657dded8ba69071cac121c
7
- data.tar.gz: 6e827fcee2fe45fe5e808815bc59ba8bf1e124ec883c7a9de8a49ebd74e3581a41643d5b75c1a0a03b403c3c4d6beba04d0452f0c63710793ea91507ee3ad21c
6
+ metadata.gz: ecdc0f1f5846704361c49ba8a48d55d37fe06bb4a92d4b5a725f30b54915af914f50fd77798b9a017b4c7fb7078495de212a4ce78b6b7f5293c33293ce582f8c
7
+ data.tar.gz: 8a4b325cb53a39513c3c3d1e50657e9d7da8ac5fc44c422e15b55d0480fde9529f43631f4f2ec1f2df9618132e8a04f6cf992c174bc6b92f42e95eae0f4fbb84
data/.rubocop.yml CHANGED
@@ -10,5 +10,9 @@ LineLength:
10
10
  MethodLength:
11
11
  Max: 15
12
12
 
13
- SpaceAfterControlKeyword:
13
+ SpaceAroundKeyword:
14
14
  Enabled: true
15
+
16
+ AllCops:
17
+ DisplayCopNames: true
18
+ TargetRubyVersion: 2.1
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.2.3
1
+ 2.5.0
data/.travis.yml CHANGED
@@ -1,7 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.3
4
- - rbx-2
3
+ - 2.5.0
5
4
  - ruby-head
6
5
  before_install:
7
6
  - gem update --system
data/Rakefile CHANGED
@@ -5,11 +5,11 @@ require 'cucumber/rake/task'
5
5
  require 'rubocop/rake_task'
6
6
 
7
7
  Cucumber::Rake::Task.new(:features) do |t|
8
- t.cucumber_opts = 'features --format pretty'
8
+ t.cucumber_opts = 'features --format pretty --retry 5'
9
9
  end
10
10
 
11
11
  RuboCop::RakeTask.new(:rubocop)
12
12
 
13
13
  RSpec::Core::RakeTask.new(:spec)
14
14
 
15
- task default: [:spec, :features, :rubocop]
15
+ task default: %i[spec features rubocop]
data/bin/public_ip CHANGED
@@ -31,7 +31,6 @@ class App
31
31
 
32
32
  description 'Find out what is your public internet IP address'
33
33
 
34
- on('-l', '--list-services', 'List available services')
35
34
  on('-l', '--list-services', 'List available services')
36
35
 
37
36
  arg :service, :optional
@@ -0,0 +1,9 @@
1
+ module PublicIp
2
+ module Service
3
+ class CurlMyIp < Plain
4
+ def self.uri
5
+ URI('http://curlmyip.net/')
6
+ end
7
+ end
8
+ end
9
+ end
@@ -4,6 +4,10 @@ module PublicIp
4
4
  def self.uri
5
5
  URI('http://ifconfig.me/ip')
6
6
  end
7
+
8
+ def self.headers
9
+ { 'User-Agent' => 'curl/7.9.8 (i686-pc-linux-gnu) libcurl 7.9.8 (OpenSSL 0.9.6b) (ipv6 enabled)' }
10
+ end
7
11
  end
8
12
  end
9
13
  end
@@ -4,6 +4,10 @@ module PublicIp
4
4
  def self.uri
5
5
  URI('http://ipecho.net/plain')
6
6
  end
7
+
8
+ def self.headers
9
+ { 'User-Agent' => 'curl/7.9.8 (i686-pc-linux-gnu) libcurl 7.9.8 (OpenSSL 0.9.6b) (ipv6 enabled)' }
10
+ end
7
11
  end
8
12
  end
9
13
  end
@@ -6,12 +6,10 @@ module PublicIp
6
6
  extend PublicIp::Service::Registrable
7
7
 
8
8
  def self.parse_json(_json_data)
9
- fail 'Not implemented'
9
+ raise 'Not implemented'
10
10
  end
11
11
 
12
- def self.ip
13
- response = perform_request
14
-
12
+ def self.extract_ip(response)
15
13
  parse_json(JSON.parse(response.body.strip))
16
14
  end
17
15
  end
@@ -5,9 +5,7 @@ module PublicIp
5
5
 
6
6
  attr_reader :match_regex
7
7
 
8
- def self.ip
9
- response = perform_request
10
-
8
+ def self.extract_ip(response)
11
9
  response.body.match(match_regex)[1].strip
12
10
  end
13
11
  end
@@ -2,13 +2,9 @@ require 'nokogiri'
2
2
 
3
3
  module PublicIp
4
4
  module Service
5
- class MxToolbox < ParsedHTML
5
+ class MxToolbox < Plain
6
6
  def self.uri
7
- URI('http://mxtoolbox.com/WhatIsMyIP/')
8
- end
9
-
10
- def self.parse_ip_address(response_body)
11
- Nokogiri::HTML(response_body).css('#ctl00_ContentPlaceHolder1_hlIP').text
7
+ URI('https://api.mxtoolbox.com/api/v1/utils/whatsmyip')
12
8
  end
13
9
  end
14
10
  end
@@ -3,9 +3,11 @@ module PublicIp
3
3
  class ParsedHTML < Simple
4
4
  extend PublicIp::Service::Registrable
5
5
 
6
- def self.ip
7
- response = perform_request
6
+ def self.parse_ip_address(_html)
7
+ raise 'Not implemented'
8
+ end
8
9
 
10
+ def self.extract_ip(response)
9
11
  parse_ip_address(response.body)
10
12
  end
11
13
  end
@@ -3,10 +3,8 @@ module PublicIp
3
3
  class Plain < Simple
4
4
  extend PublicIp::Service::Registrable
5
5
 
6
- def self.ip
7
- response = perform_request
8
-
9
- response.body.strip
6
+ def self.extract_ip(response)
7
+ response.body.strip.delete('"')
10
8
  end
11
9
  end
12
10
  end
@@ -8,9 +8,8 @@ module PublicIp
8
8
  attr_reader :service_database
9
9
 
10
10
  def self.register_service(service_class)
11
- unless instance.service_database.key?(service_class.symbol)
12
- instance.service_database[service_class.symbol] = service_class
13
- end
11
+ return if instance.service_database.key?(service_class.symbol)
12
+ instance.service_database[service_class.symbol] = service_class
14
13
  end
15
14
 
16
15
  def self.[](service)
@@ -1,14 +1,30 @@
1
1
  require 'net/http'
2
2
  require 'timeout'
3
+ require 'ipaddress'
3
4
 
4
5
  module PublicIp
5
6
  module Service
7
+ class InvalidIpAddress < StandardError; end
8
+ class TimedOut < StandardError; end
9
+
6
10
  class Simple
7
11
  attr_reader :uri
8
12
  attr_reader :headers
9
13
 
14
+ def self.ip
15
+ response = perform_request
16
+
17
+ ip_address = extract_ip(response)
18
+
19
+ unless IPAddress.valid?(ip_address)
20
+ raise PublicIp::Service::InvalidIpAddress, "#{ip_address} is not a valid ip address"
21
+ end
22
+
23
+ ip_address
24
+ end
25
+
10
26
  def self.uri
11
- fail 'Not implemented'
27
+ raise 'Not implemented'
12
28
  end
13
29
 
14
30
  def self.headers
@@ -27,7 +43,7 @@ module PublicIp
27
43
  end
28
44
 
29
45
  def self.perform_request
30
- Timeout.timeout(PublicIp::TIMEOUT_IN_SECS) do
46
+ Timeout.timeout(PublicIp::TIMEOUT_IN_SECS, PublicIp::Service::TimedOut) do
31
47
  request = Net::HTTP::Get.new(uri, headers)
32
48
  http = Net::HTTP.new(uri.host, uri.port)
33
49
  http.use_ssl = (uri.scheme == 'https')
@@ -12,7 +12,9 @@ module PublicIp
12
12
  end
13
13
 
14
14
  def self.parse_ip_address(response_body)
15
- Nokogiri::HTML(response_body).css('.ip div').text
15
+ doc = Nokogiri::HTML(response_body).at('h3:contains("Your Public IPv4 is: ")')
16
+
17
+ return doc.text.strip.sub('Your Public IPv4 is: ', '') unless doc.nil?
16
18
  end
17
19
  end
18
20
  end
@@ -1,3 +1,3 @@
1
1
  module PublicIp
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'.freeze
3
3
  end
data/lib/public_ip.rb CHANGED
@@ -13,7 +13,6 @@ module PublicIp
13
13
  TIMEOUT_IN_SECS = 3
14
14
 
15
15
  class UnknownService < StandardError; end
16
- class TimedOut < StandardError; end
17
16
 
18
17
  module_function
19
18
 
@@ -24,13 +23,11 @@ module PublicIp
24
23
  else
25
24
  PublicIp::Service::Registry[service].ip
26
25
  end
27
- rescue Timeout::Error
26
+ rescue PublicIp::Service::TimedOut, PublicIp::Service::InvalidIpAddress
28
27
  tries -= 1
29
- if tries > 0 && service == :random
30
- retry
31
- else
32
- raise PublicIp::TimedOut, 'Took too long to get your public ip address, try with another service'
33
- end
28
+ retry if tries.positive? && service == :random
29
+
30
+ raise
34
31
  end
35
32
 
36
33
  def list_services
data/public_ip.gemspec CHANGED
@@ -1,3 +1,5 @@
1
+ # rubocop:disable Metrics/BlockLength
2
+
1
3
  lib = File.expand_path('../lib', __FILE__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
  require 'public_ip/version'
@@ -10,10 +12,10 @@ Gem::Specification.new do |spec|
10
12
 
11
13
  spec.summary = 'Get your public internet IP the easy way.'
12
14
  spec.description = <<-DESCRIPTION
13
- Ever questioned what is your public internet IP and you've forgotten how to do it.
14
- Instead of remembering every service that you can query to get your public internet IP you can use PublicIP.
15
- You can use it directly in your code or in your CLI.
16
- DESCRIPTION
15
+ Ever questioned what is your public internet IP and you've forgotten how to do it.
16
+ Instead of remembering every service that you can query to get your public internet IP you can use PublicIP.
17
+ You can use it directly in your code or in your CLI.
18
+ DESCRIPTION
17
19
 
18
20
  spec.homepage = 'https://github.com/pedrocarrico/public_ip'
19
21
  spec.license = 'MIT'
@@ -23,14 +25,18 @@ DESCRIPTION
23
25
  spec.executables = ['public_ip']
24
26
  spec.require_paths = ['lib']
25
27
 
28
+ spec.required_ruby_version = '>= 2.1'
29
+
30
+ spec.add_dependency 'ipaddress', '~> 0.8.3'
26
31
  spec.add_dependency 'methadone', '~> 1.9.2'
27
- spec.add_dependency 'nokogiri', '~> 1.6.7'
32
+ spec.add_dependency 'nokogiri', '~> 1.8.1'
28
33
 
34
+ spec.add_development_dependency 'aruba', '~> 0.14.3'
29
35
  spec.add_development_dependency 'bundler', '~> 1.10'
36
+ spec.add_development_dependency 'pry', '~> 0.10.3'
30
37
  spec.add_development_dependency 'rake', '~> 10.0'
31
38
  spec.add_development_dependency 'rspec', '~> 3.4'
32
- spec.add_development_dependency 'rubocop', '~> 0.35.1'
33
- spec.add_development_dependency 'pry', '~> 0.10.3'
39
+ spec.add_development_dependency 'rubocop', '~> 0.52.1'
34
40
  spec.add_development_dependency 'webmock', '~> 1.22.3'
35
- spec.add_development_dependency 'aruba', '~> 0.11.2'
36
41
  end
42
+ # rubocop:enable Metrics/BlockLength
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: public_ip
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pedro Carriço
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-09 00:00:00.000000000 Z
11
+ date: 2018-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ipaddress
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.8.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.8.3
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: methadone
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -30,116 +44,116 @@ dependencies:
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: 1.6.7
47
+ version: 1.8.1
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: 1.6.7
54
+ version: 1.8.1
41
55
  - !ruby/object:Gem::Dependency
42
- name: bundler
56
+ name: aruba
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '1.10'
61
+ version: 0.14.3
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '1.10'
68
+ version: 0.14.3
55
69
  - !ruby/object:Gem::Dependency
56
- name: rake
70
+ name: bundler
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '10.0'
75
+ version: '1.10'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '10.0'
82
+ version: '1.10'
69
83
  - !ruby/object:Gem::Dependency
70
- name: rspec
84
+ name: pry
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '3.4'
89
+ version: 0.10.3
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '3.4'
96
+ version: 0.10.3
83
97
  - !ruby/object:Gem::Dependency
84
- name: rubocop
98
+ name: rake
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: 0.35.1
103
+ version: '10.0'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: 0.35.1
110
+ version: '10.0'
97
111
  - !ruby/object:Gem::Dependency
98
- name: pry
112
+ name: rspec
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: 0.10.3
117
+ version: '3.4'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: 0.10.3
124
+ version: '3.4'
111
125
  - !ruby/object:Gem::Dependency
112
- name: webmock
126
+ name: rubocop
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
129
  - - "~>"
116
130
  - !ruby/object:Gem::Version
117
- version: 1.22.3
131
+ version: 0.52.1
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
136
  - - "~>"
123
137
  - !ruby/object:Gem::Version
124
- version: 1.22.3
138
+ version: 0.52.1
125
139
  - !ruby/object:Gem::Dependency
126
- name: aruba
140
+ name: webmock
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
143
  - - "~>"
130
144
  - !ruby/object:Gem::Version
131
- version: 0.11.2
145
+ version: 1.22.3
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - "~>"
137
151
  - !ruby/object:Gem::Version
138
- version: 0.11.2
139
- description: |
140
- Ever questioned what is your public internet IP and you've forgotten how to do it.
141
- Instead of remembering every service that you can query to get your public internet IP you can use PublicIP.
142
- You can use it directly in your code or in your CLI.
152
+ version: 1.22.3
153
+ description: |2
154
+ Ever questioned what is your public internet IP and you've forgotten how to do it.
155
+ Instead of remembering every service that you can query to get your public internet IP you can use PublicIP.
156
+ You can use it directly in your code or in your CLI.
143
157
  email:
144
158
  - pedro.carrico@gmail.com
145
159
  executables:
@@ -164,6 +178,7 @@ files:
164
178
  - lib/public_ip.rb
165
179
  - lib/public_ip/service/akamai.rb
166
180
  - lib/public_ip/service/amazon_aws.rb
181
+ - lib/public_ip/service/curl_my_ip.rb
167
182
  - lib/public_ip/service/dyndns.rb
168
183
  - lib/public_ip/service/i_can_haz_ip.rb
169
184
  - lib/public_ip/service/ident_me.rb
@@ -172,7 +187,6 @@ files:
172
187
  - lib/public_ip/service/ip_chicken.rb
173
188
  - lib/public_ip/service/ip_echo.rb
174
189
  - lib/public_ip/service/ip_info.rb
175
- - lib/public_ip/service/ip_ogre.rb
176
190
  - lib/public_ip/service/ipify.rb
177
191
  - lib/public_ip/service/json_type.rb
178
192
  - lib/public_ip/service/matched_expression.rb
@@ -201,7 +215,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
201
215
  requirements:
202
216
  - - ">="
203
217
  - !ruby/object:Gem::Version
204
- version: '0'
218
+ version: '2.1'
205
219
  required_rubygems_version: !ruby/object:Gem::Requirement
206
220
  requirements:
207
221
  - - ">="
@@ -209,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
209
223
  version: '0'
210
224
  requirements: []
211
225
  rubyforge_project:
212
- rubygems_version: 2.4.5.1
226
+ rubygems_version: 2.7.3
213
227
  signing_key:
214
228
  specification_version: 4
215
229
  summary: Get your public internet IP the easy way.
@@ -1,13 +0,0 @@
1
- module PublicIp
2
- module Service
3
- class IpOgre < Plain
4
- def self.uri
5
- URI('http://ipogre.com')
6
- end
7
-
8
- def self.headers
9
- { 'User-Agent' => 'curl/7.9.8 (i686-pc-linux-gnu) libcurl 7.9.8 (OpenSSL 0.9.6b) (ipv6 enabled)' }
10
- end
11
- end
12
- end
13
- end