speedtest_net 0.4.1 → 0.6.2

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
2
  SHA256:
3
- metadata.gz: 8557381dfe5f9b85498b317c29d985ce7bf3d7ed6e79546775e8e5128c14a3da
4
- data.tar.gz: 6961f5827bdd67097558d9d72ce07efd6534451b59b725ffbcbfe4f565c734c8
3
+ metadata.gz: 0aec09a328146d86a192b080290157be98842cf7c8c7b765faa4646e284ebfb0
4
+ data.tar.gz: 9302feaeee0e0833ea3197d2edcf71eee47e8d0227c80bd6215c21342fff6f71
5
5
  SHA512:
6
- metadata.gz: 8dc78c384eff85bc4dde708e6dbb988d44e4bd7e4ba99c5c6e62c1a43360230086099d8d629bc8b5590daf6133a59d36e9eeebf96a998a9697dc71da135e4dae
7
- data.tar.gz: 6f90f4ac77852c2018a3f31691e916addd6dd5765ea62f1de855c20d99899e73b80f0c98a6c9f8165bfd127609366b077a755c8c3726e915554c3b4c299da460
6
+ metadata.gz: e7d1212ef3209071e2feb1fab097dbe62c679654717b99537a4ad34c86c54a1ce67613200fa4536dd85e6b125418fdd50c3b6af24318c9de73b0b3e4bcc8e73e
7
+ data.tar.gz: 6396e99b7a4400ae634b78398f8e40bb07213a1bb34561690082deb486da1cf19c0883fdd1431674287d76a2fb50d92fa81134abae0a04b7ad8cc2d522457f75
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ time: '20:00'
8
+ open-pull-requests-limit: 10
9
+ assignees:
10
+ - ryonkn
@@ -19,10 +19,10 @@ jobs:
19
19
  runs-on: ubuntu-latest
20
20
  steps:
21
21
  - uses: actions/checkout@master
22
- - name: Setup Ruby 2.6
23
- uses: actions/setup-ruby@v1
22
+ - name: Setup Ruby 2.7
23
+ uses: ruby/setup-ruby@master
24
24
  with:
25
- ruby-version: 2.6.x
25
+ ruby-version: 2.7
26
26
  - name: Run rubocop
27
27
  run: |
28
28
  gem install rubocop rubocop-rspec
@@ -32,14 +32,13 @@ jobs:
32
32
  runs-on: ubuntu-latest
33
33
  strategy:
34
34
  matrix:
35
- ruby: [ '2.5.x', '2.6.x' ]
35
+ ruby: [ 2.5, 2.6, 2.7, 'ruby-head' ]
36
36
  steps:
37
37
  - uses: actions/checkout@master
38
38
  - name: Setup Ruby
39
- uses: actions/setup-ruby@v1
39
+ uses: ruby/setup-ruby@master
40
40
  with:
41
41
  ruby-version: ${{ matrix.ruby }}
42
- architecture: 'x64'
43
42
  - name: Run apt-get
44
43
  run: |
45
44
  sudo apt-get update
@@ -1,8 +1,12 @@
1
1
  require: rubocop-rspec
2
2
 
3
3
  AllCops:
4
+ TargetRubyVersion: 2.5
4
5
  Exclude:
5
6
  - 'speedtest_net.gemspec'
6
7
 
8
+ Layout/ClassStructure:
9
+ Enabled: true
10
+
7
11
  Style/Documentation:
8
12
  Enabled: false
@@ -8,8 +8,8 @@ require 'speedtest_net'
8
8
  # with your gem easier. You can also use a different console, if you like.
9
9
 
10
10
  # (If you use this, don't forget to add pry to your Gemfile!)
11
- require 'pry'
12
- Pry.start
11
+ # require 'pry'
12
+ # Pry.start
13
13
 
14
- # require "irb"
15
- # IRB.start(__FILE__)
14
+ require 'irb'
15
+ IRB.start(__FILE__)
data/lib/geo.rb CHANGED
@@ -1,10 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Geo
4
- RADIUS_PER_DEGREE = Math::PI / 180
5
- RADIUS_METER = 6_371_000
6
-
7
- attr_reader :lat, :long
4
+ RADIAN_PER_DEGREE = Math::PI / 180
5
+ EARTH_RADIUS = 6_371_000
8
6
 
9
7
  def initialize(lat, long)
10
8
  @lat = lat
@@ -12,17 +10,18 @@ class Geo
12
10
  end
13
11
 
14
12
  def distance(other) # rubocop:disable Metrics/AbcSize
15
- delta_lat = (@lat - other.lat) * RADIUS_PER_DEGREE
16
- delta_long = (@long - other.long) * RADIUS_PER_DEGREE
13
+ a = Math.sin(radian_lat) * Math.sin(other.radian_lat) +
14
+ Math.cos(radian_lat) * Math.cos(other.radian_lat) *
15
+ Math.cos(radian_long - other.radian_long)
17
16
 
18
- lat_radius = @lat * RADIUS_PER_DEGREE
19
- other_lat_radius = other.lat * RADIUS_PER_DEGREE
17
+ Math.acos(a) * EARTH_RADIUS
18
+ end
20
19
 
21
- a = Math.sin(delta_lat / 2)**2 +
22
- Math.cos(lat_radius) *
23
- Math.cos(other_lat_radius) *
24
- Math.sin(delta_long / 2)**2
20
+ def radian_lat
21
+ @lat * RADIAN_PER_DEGREE
22
+ end
25
23
 
26
- Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)) * 2 * RADIUS_METER
24
+ def radian_long
25
+ @long * RADIAN_PER_DEGREE
27
26
  end
28
27
  end
@@ -1,15 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'speedtest_net/version'
4
+ require 'speedtest_net/user_agent'
4
5
  require 'speedtest_net/server'
5
6
  require 'speedtest_net/download'
6
7
  require 'speedtest_net/upload'
7
8
  require 'speedtest_net/result'
8
9
 
9
10
  module SpeedtestNet
10
- def self.run
11
+ def self.run(id = nil)
11
12
  config = SpeedtestNet::Config.fetch
12
- server = SpeedtestNet::Server.best_server
13
+ server = SpeedtestNet::Server.select_server(id)
13
14
  download_results = SpeedtestNet::Download.measure(server)
14
15
  upload_results = SpeedtestNet::Upload.measure(server)
15
16
 
@@ -48,9 +48,7 @@ module SpeedtestNet
48
48
  client.follow_location = true
49
49
  client.perform
50
50
 
51
- if client.response_code != 200
52
- raise HTTPDownloadError, 'Config download error'
53
- end
51
+ raise HTTPDownloadError, 'Config download error' if client.response_code != 200
54
52
 
55
53
  xml = REXML::Document.new(client.body, ignore_whitespace_nodes: :all)
56
54
  xml.elements
@@ -37,6 +37,7 @@ module SpeedtestNet
37
37
  multi = Curl::Multi.new
38
38
  urls.each do |url|
39
39
  client = Curl::Easy.new(url)
40
+ client.headers['User-Agent'] = SpeedtestNet::USER_AGENT
40
41
  client.on_complete { |data| responses << data }
41
42
  multi.add(client)
42
43
  end
@@ -3,4 +3,5 @@
3
3
  module SpeedtestNet
4
4
  class Error < StandardError; end
5
5
  class HTTPDownloadError < Error; end
6
+ class InvalidServerIdError < Error; end
6
7
  end
@@ -35,6 +35,7 @@ module SpeedtestNet
35
35
  end
36
36
 
37
37
  def measure_latency(url, timeout)
38
+ Typhoeus::Config.user_agent = SpeedtestNet::USER_AGENT
38
39
  client = Typhoeus::Request.new(url, followlocation: true,
39
40
  timeout: timeout)
40
41
  client.run
@@ -38,6 +38,12 @@ module SpeedtestNet
38
38
  servers.sort_by { |s| [s.distance, s.id] }
39
39
  end
40
40
 
41
+ def select_server(id = nil)
42
+ id.nil? ? best_server : pick_server(id)
43
+ end
44
+
45
+ private
46
+
41
47
  def best_server
42
48
  servers = list
43
49
  closest_servers = servers.first(10)
@@ -48,7 +54,14 @@ module SpeedtestNet
48
54
  sorted_servers.first
49
55
  end
50
56
 
51
- private
57
+ def pick_server(id)
58
+ servers = list
59
+ server = servers.find { |s| s.id == id }
60
+ raise InvalidServerIdError if server.nil?
61
+
62
+ server.measure_latency
63
+ server
64
+ end
52
65
 
53
66
  def create_instance(server)
54
67
  config = SpeedtestNet::Config.fetch
@@ -65,9 +78,7 @@ module SpeedtestNet
65
78
  client.follow_location = true
66
79
  client.perform
67
80
 
68
- if client.response_code != 200
69
- raise HTTPDownloadError, 'Server lists download error'
70
- end
81
+ raise HTTPDownloadError, 'Server lists download error' if client.response_code != 200
71
82
 
72
83
  xml = REXML::Document.new(client.body, ignore_whitespace_nodes: :all)
73
84
  xml.elements['settings/servers']
@@ -29,15 +29,18 @@ module SpeedtestNet
29
29
  end
30
30
  end
31
31
 
32
- def multi_uploader(urls, size)
32
+ def multi_uploader(urls, size) # rubocop:disable Metrics/MethodLength
33
33
  responses = []
34
34
  content = 'A' * size
35
- url_fields = urls.map do |url|
36
- { url: url, post_fields: { 'content1' => content } }
37
- end
38
- Curl::Multi.post(url_fields) do |curl|
39
- responses << curl
35
+ multi = Curl::Multi.new
36
+ urls.each do |url|
37
+ client = Curl::Easy.new(url)
38
+ client.headers['User-Agent'] = SpeedtestNet::USER_AGENT
39
+ client.http_post(Curl::PostField.content('content1', content))
40
+ client.on_complete { |data| responses << data }
41
+ multi.add(client)
40
42
  end
43
+ multi.perform
41
44
  responses.map(&:upload_speed).sum * 8
42
45
  end
43
46
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SpeedtestNet
4
+ USER_AGENT = "SpeedtestNet/#{SpeedtestNet::VERSION}"
5
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SpeedtestNet
4
- VERSION = '0.4.1'
4
+ VERSION = '0.6.2'
5
5
  end
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": [
3
+ "config:base"
4
+ ]
5
+ }
@@ -28,18 +28,20 @@ Gem::Specification.new do |spec|
28
28
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
29
  spec.require_paths = ['lib']
30
30
 
31
+ spec.required_ruby_version = '>= 2.5.0'
32
+
31
33
  spec.add_development_dependency 'bundler', '~> 2.0'
32
- spec.add_development_dependency 'codacy-coverage'
33
- spec.add_development_dependency 'factory_bot'
34
- spec.add_development_dependency 'pry'
35
- spec.add_development_dependency 'rake', '~> 10.0'
34
+ spec.add_development_dependency 'codacy-coverage', '~> 2.1'
35
+ spec.add_development_dependency 'factory_bot', '~> 6.0'
36
+ spec.add_development_dependency 'rake', '~> 13.0'
36
37
  spec.add_development_dependency 'rspec', '~> 3.0'
37
- spec.add_development_dependency 'rubocop'
38
- spec.add_development_dependency 'rubocop-rspec'
39
- spec.add_development_dependency 'simplecov'
40
- spec.add_development_dependency 'vcr'
41
- spec.add_development_dependency 'webmock'
38
+ spec.add_development_dependency 'rubocop', '~> 0.76'
39
+ spec.add_development_dependency 'rubocop-rspec', '~> 1.36'
40
+ spec.add_development_dependency 'simplecov', '~> 0.17'
41
+ spec.add_development_dependency 'vcr', '~> 6.0'
42
+ spec.add_development_dependency 'webmock', '~> 3.7'
42
43
 
43
44
  spec.add_dependency 'curb', '~> 0.9'
44
- spec.add_dependency 'typhoeus'
45
+ spec.add_dependency 'rexml', '~> 3.2'
46
+ spec.add_dependency 'typhoeus', '~> 1.3'
45
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: speedtest_net
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakano
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-11-20 00:00:00.000000000 Z
11
+ date: 2020-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -28,58 +28,44 @@ dependencies:
28
28
  name: codacy-coverage
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '2.1'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '2.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: factory_bot
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: pry
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
45
+ - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: '0'
47
+ version: '6.0'
62
48
  type: :development
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
- - - ">="
52
+ - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: '0'
54
+ version: '6.0'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: rake
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - "~>"
74
60
  - !ruby/object:Gem::Version
75
- version: '10.0'
61
+ version: '13.0'
76
62
  type: :development
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
66
  - - "~>"
81
67
  - !ruby/object:Gem::Version
82
- version: '10.0'
68
+ version: '13.0'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: rspec
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -98,72 +84,72 @@ dependencies:
98
84
  name: rubocop
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
- - - ">="
87
+ - - "~>"
102
88
  - !ruby/object:Gem::Version
103
- version: '0'
89
+ version: '0.76'
104
90
  type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
- - - ">="
94
+ - - "~>"
109
95
  - !ruby/object:Gem::Version
110
- version: '0'
96
+ version: '0.76'
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: rubocop-rspec
113
99
  requirement: !ruby/object:Gem::Requirement
114
100
  requirements:
115
- - - ">="
101
+ - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: '0'
103
+ version: '1.36'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
- - - ">="
108
+ - - "~>"
123
109
  - !ruby/object:Gem::Version
124
- version: '0'
110
+ version: '1.36'
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: simplecov
127
113
  requirement: !ruby/object:Gem::Requirement
128
114
  requirements:
129
- - - ">="
115
+ - - "~>"
130
116
  - !ruby/object:Gem::Version
131
- version: '0'
117
+ version: '0.17'
132
118
  type: :development
133
119
  prerelease: false
134
120
  version_requirements: !ruby/object:Gem::Requirement
135
121
  requirements:
136
- - - ">="
122
+ - - "~>"
137
123
  - !ruby/object:Gem::Version
138
- version: '0'
124
+ version: '0.17'
139
125
  - !ruby/object:Gem::Dependency
140
126
  name: vcr
141
127
  requirement: !ruby/object:Gem::Requirement
142
128
  requirements:
143
- - - ">="
129
+ - - "~>"
144
130
  - !ruby/object:Gem::Version
145
- version: '0'
131
+ version: '6.0'
146
132
  type: :development
147
133
  prerelease: false
148
134
  version_requirements: !ruby/object:Gem::Requirement
149
135
  requirements:
150
- - - ">="
136
+ - - "~>"
151
137
  - !ruby/object:Gem::Version
152
- version: '0'
138
+ version: '6.0'
153
139
  - !ruby/object:Gem::Dependency
154
140
  name: webmock
155
141
  requirement: !ruby/object:Gem::Requirement
156
142
  requirements:
157
- - - ">="
143
+ - - "~>"
158
144
  - !ruby/object:Gem::Version
159
- version: '0'
145
+ version: '3.7'
160
146
  type: :development
161
147
  prerelease: false
162
148
  version_requirements: !ruby/object:Gem::Requirement
163
149
  requirements:
164
- - - ">="
150
+ - - "~>"
165
151
  - !ruby/object:Gem::Version
166
- version: '0'
152
+ version: '3.7'
167
153
  - !ruby/object:Gem::Dependency
168
154
  name: curb
169
155
  requirement: !ruby/object:Gem::Requirement
@@ -178,20 +164,34 @@ dependencies:
178
164
  - - "~>"
179
165
  - !ruby/object:Gem::Version
180
166
  version: '0.9'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rexml
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '3.2'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '3.2'
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: typhoeus
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
- - - ">="
185
+ - - "~>"
186
186
  - !ruby/object:Gem::Version
187
- version: '0'
187
+ version: '1.3'
188
188
  type: :runtime
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
- - - ">="
192
+ - - "~>"
193
193
  - !ruby/object:Gem::Version
194
- version: '0'
194
+ version: '1.3'
195
195
  description: Library for testing internet bandwidth using speedtest.net
196
196
  email:
197
197
  - ryo@ryonkn.com
@@ -199,6 +199,7 @@ executables: []
199
199
  extensions: []
200
200
  extra_rdoc_files: []
201
201
  files:
202
+ - ".github/dependabot.yml"
202
203
  - ".github/workflows/ruby.yml"
203
204
  - ".gitignore"
204
205
  - ".rspec"
@@ -221,7 +222,9 @@ files:
221
222
  - lib/speedtest_net/result.rb
222
223
  - lib/speedtest_net/server.rb
223
224
  - lib/speedtest_net/upload.rb
225
+ - lib/speedtest_net/user_agent.rb
224
226
  - lib/speedtest_net/version.rb
227
+ - renovate.json
225
228
  - speedtest_net.gemspec
226
229
  homepage: https://github.com/ryonkn/speedtest_net
227
230
  licenses:
@@ -230,7 +233,7 @@ metadata:
230
233
  homepage_uri: https://github.com/ryonkn/speedtest_net
231
234
  source_code_uri: https://github.com/ryonkn/speedtest_net
232
235
  changelog_uri: https://github.com/ryonkn/speedtest_net
233
- post_install_message:
236
+ post_install_message:
234
237
  rdoc_options: []
235
238
  require_paths:
236
239
  - lib
@@ -238,15 +241,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
238
241
  requirements:
239
242
  - - ">="
240
243
  - !ruby/object:Gem::Version
241
- version: '0'
244
+ version: 2.5.0
242
245
  required_rubygems_version: !ruby/object:Gem::Requirement
243
246
  requirements:
244
247
  - - ">="
245
248
  - !ruby/object:Gem::Version
246
249
  version: '0'
247
250
  requirements: []
248
- rubygems_version: 3.0.3
249
- signing_key:
251
+ rubygems_version: 3.1.2
252
+ signing_key:
250
253
  specification_version: 4
251
254
  summary: Library for testing internet bandwidth using speedtest.net
252
255
  test_files: []