public_ip 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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