speedtest_net 0.6.1 → 0.8.1

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: b18c8629b83d4f4f56437bf92439f8d118b57ff32028e415367f7b66700022ed
4
- data.tar.gz: ba40b70b6a582bd80082b21885d0735f7faa68d998138f1524d1e6e1de53cfb2
3
+ metadata.gz: 39d774cd49d85c30b04b9bb3dfd9743b33858f177ddaaaf9e3e165aef24e31cd
4
+ data.tar.gz: d71d13cca347f15923c8aa1ffa14799554553f5201f41c613a6c4c451cf00bf5
5
5
  SHA512:
6
- metadata.gz: a49ebdb25f3bc7722ef555af0ce1d4cfd9272af03d8e0d2232a4d7814300d1dc00070e36c595474fc104768053becc6a064ed40da5aaab57194774c6f5f64240
7
- data.tar.gz: 96602a22ff88e4c798a8a1e156bf21ed6303e70192cbc226d36cd2ca74b71c73c892ab88d52200429fc9d4f05fd882b083eb01370e4dbc889a353d90e4d399d6
6
+ metadata.gz: 9a7fc6501f22d46c3ed6e8a999e78042dd71b6f8e1aab714efaea797276bb3fea0727a755b916c9af3fc6bb63c23db5ee7dd82dbc38d9014a68a6d845c6e8e9a
7
+ data.tar.gz: cfeea44e6c008e8fa52223c8add27a7807e9f41a2ded4a3dcdf08ef1651fc1947145f44b64fa7b8a495965136348e29bb78e042895a3e9066a2c194b19bf791c
@@ -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,20 +19,27 @@ jobs:
19
19
  runs-on: ubuntu-latest
20
20
  steps:
21
21
  - uses: actions/checkout@master
22
- - name: Setup Ruby 2.7
22
+ - name: Setup Ruby
23
23
  uses: ruby/setup-ruby@master
24
24
  with:
25
- ruby-version: 2.7
25
+ ruby-version: 3.0
26
+ - name: Run apt-get
27
+ run: |
28
+ sudo apt-get update
29
+ sudo apt-get install libcurl4-openssl-dev
30
+ - name: Bundle install
31
+ run: |
32
+ gem install bundler
33
+ bundle install --jobs 4 --retry 3
26
34
  - name: Run rubocop
27
35
  run: |
28
- gem install rubocop rubocop-rspec
29
36
  rubocop
30
37
 
31
38
  rspec:
32
39
  runs-on: ubuntu-latest
33
40
  strategy:
34
41
  matrix:
35
- ruby: [ 2.5, 2.6, 2.7, 'ruby-head' ]
42
+ ruby: [ 2.6, 2.7, 3.0, 'head' ]
36
43
  steps:
37
44
  - uses: actions/checkout@master
38
45
  - name: Setup Ruby
data/.rubocop.yml CHANGED
@@ -1,12 +1,8 @@
1
1
  require: rubocop-rspec
2
2
 
3
3
  AllCops:
4
- TargetRubyVersion: 2.5
5
- Exclude:
6
- - 'speedtest_net.gemspec'
7
-
8
- Layout/ClassStructure:
9
- Enabled: true
4
+ TargetRubyVersion: 2.6
5
+ NewCops: enable
10
6
 
11
7
  Style/Documentation:
12
8
  Enabled: false
data/Gemfile CHANGED
@@ -4,3 +4,13 @@ source 'https://rubygems.org'
4
4
 
5
5
  # Specify your gem's dependencies in speedtest_net.gemspec
6
6
  gemspec
7
+
8
+ gem 'codacy-coverage', '>= 2.1'
9
+ gem 'factory_bot', '>= 6.0'
10
+ gem 'rake', '>= 13.0'
11
+ gem 'rspec', '>= 3.0'
12
+ gem 'rubocop', '>= 1.0.0'
13
+ gem 'rubocop-rspec', '>= 1.44.1'
14
+ gem 'simplecov', '>= 0.17'
15
+ gem 'vcr', '>= 6.0'
16
+ gem 'webmock', '>= 3.7'
data/README.md CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/speedtest_net.svg)](https://badge.fury.io/rb/speedtest_net)
4
4
  [![Actions Status](https://github.com/ryonkn/speedtest_net/workflows/GitHub%20Actions/badge.svg)](https://github.com/ryonkn/speedtest_net/actions)
5
- [![Codacy Badge](https://api.codacy.com/project/badge/Grade/18f112dae19a48938bdf2b225d3a76bb)](https://www.codacy.com/manual/ryonkn/speedtest_net?utm_source=github.com&utm_medium=referral&utm_content=ryonkn/speedtest_net&utm_campaign=Badge_Grade)
6
- [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/18f112dae19a48938bdf2b225d3a76bb)](https://www.codacy.com/manual/ryonkn/speedtest_net?utm_source=github.com&utm_medium=referral&utm_content=ryonkn/speedtest_net&utm_campaign=Badge_Coverage)
5
+ [![Codacy Badge](https://app.codacy.com/project/badge/Grade/fa55809b2789403489d9d5063249c238)](https://www.codacy.com/manual/ryonkn/speedtest_net/dashboard?utm_source=github.com&utm_medium=referral&utm_content=ryonkn/speedtest_net&utm_campaign=Badge_Grade)
6
+ [![Codacy Badge](https://app.codacy.com/project/badge/Coverage/fa55809b2789403489d9d5063249c238)](https://www.codacy.com/manual/ryonkn/speedtest_net/dashboard?utm_source=github.com&utm_medium=referral&utm_content=ryonkn/speedtest_net&utm_campaign=Badge_Coverage)
7
7
 
8
8
  A Ruby library for testing internet bandwidth using speedtest.net
9
9
 
data/lib/speedtest_net.rb CHANGED
@@ -1,24 +1,25 @@
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'
9
+ require 'speedtest_net/http_timeout'
8
10
 
9
11
  module SpeedtestNet
10
- def self.run(id = nil)
11
- config = SpeedtestNet::Config.fetch
12
- server = SpeedtestNet::Server.select_server(id)
13
- download_results = SpeedtestNet::Download.measure(server)
14
- upload_results = SpeedtestNet::Upload.measure(server)
12
+ def self.run(id = nil, exclude_server_ids: [], timeout: HTTP_TIMEOUT)
13
+ config = Config.fetch
14
+ server = Server.select_server(id, exclude_server_ids)
15
+ download_results = Download.measure(server, timeout: timeout)
16
+ upload_results = Upload.measure(server, timeout: timeout)
15
17
 
16
- SpeedtestNet::Config.clear_cache
17
- SpeedtestNet::Result.new(config.client, server, download_results,
18
- upload_results)
18
+ Config.clear_cache
19
+ Result.new(config.client, server, download_results, upload_results)
19
20
  end
20
21
 
21
22
  def self.list_server
22
- SpeedtestNet::Server.list
23
+ Server.list
23
24
  end
24
25
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SpeedtestNet
4
+ class Client
5
+ attr_reader :ip, :isp, :geo
6
+
7
+ def initialize(ip, isp, geo)
8
+ @ip = ip
9
+ @isp = isp
10
+ @geo = geo
11
+ end
12
+ end
13
+ end
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rexml/document'
4
+ require 'speedtest_net/client'
4
5
  require 'speedtest_net/error'
5
- require 'geo'
6
+ require 'speedtest_net/geo'
6
7
 
7
8
  module SpeedtestNet
8
9
  class Config
@@ -48,20 +49,14 @@ module SpeedtestNet
48
49
  client.follow_location = true
49
50
  client.perform
50
51
 
51
- if client.response_code != 200
52
- raise HTTPDownloadError, 'Config download error'
53
- end
52
+ raise HTTPDownloadError, 'Config download error' if client.response_code != 200
54
53
 
55
54
  xml = REXML::Document.new(client.body, ignore_whitespace_nodes: :all)
56
55
  xml.elements
57
56
  end
58
57
 
59
58
  def client_config(elements)
60
- {
61
- ip: elements['ip'],
62
- isp: elements['isp'],
63
- geo: Geo.new(elements['lat'].to_f, elements['lon'].to_f)
64
- }
59
+ Client.new(elements['ip'], elements['isp'], Geo.new(elements['lat'].to_f, elements['lon'].to_f))
65
60
  end
66
61
 
67
62
  def server_config(elements)
@@ -3,6 +3,8 @@
3
3
  require 'curb'
4
4
  require 'securerandom'
5
5
  require 'pathname'
6
+ require 'speedtest_net/calculate_speed'
7
+ require 'speedtest_net/http_timeout'
6
8
 
7
9
  module SpeedtestNet
8
10
  class Download
@@ -10,16 +12,30 @@ module SpeedtestNet
10
12
  random1500x1500.jpg random2000x2000.jpg random3000x3000.jpg
11
13
  random3500x3500.jpg random4000x4000.jpg].freeze
12
14
 
15
+ def initialize(results)
16
+ @results = results
17
+ end
18
+
19
+ def calculate
20
+ CalculateSpeed.call(@results)
21
+ end
22
+
13
23
  class << self
14
- def measure(server)
15
- config = SpeedtestNet::Config.fetch
24
+ def measure(server, timeout: HTTP_TIMEOUT) # rubocop:disable Metrics/MethodLength
25
+ config = Config.fetch
16
26
  concurrent_number = config.download[:threadsperurl]
17
27
 
18
- results = FILES.map do |file|
19
- urls = create_urls(server, file, concurrent_number)
20
- multi_downloader(urls)
28
+ results = []
29
+ begin
30
+ Timeout.timeout(timeout) do
31
+ FILES.each do |file|
32
+ urls = create_urls(server, file, concurrent_number)
33
+ results << multi_downloader(urls)
34
+ end
35
+ end
36
+ rescue Timeout::Error # rubocop:disable Lint/SuppressedException
21
37
  end
22
- results
38
+ new(results)
23
39
  end
24
40
 
25
41
  private
@@ -37,6 +53,7 @@ module SpeedtestNet
37
53
  multi = Curl::Multi.new
38
54
  urls.each do |url|
39
55
  client = Curl::Easy.new(url)
56
+ client.headers['User-Agent'] = USER_AGENT
40
57
  client.on_complete { |data| responses << data }
41
58
  multi.add(client)
42
59
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module SpeedtestNet
4
4
  class Error < StandardError; end
5
+
5
6
  class HTTPDownloadError < Error; end
7
+
6
8
  class InvalidServerIdError < Error; end
7
9
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SpeedtestNet
4
+ module Formatter
5
+ class Distance
6
+ class << self
7
+ def call(distance)
8
+ format('%<distance>.3f kilometre', distance: (distance / 1_000).round(3))
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SpeedtestNet
4
+ module Formatter
5
+ class Latency
6
+ class << self
7
+ def call(latency)
8
+ format('%<latency>f millisecond', latency: latency * 1_000)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SpeedtestNet
4
+ module Formatter
5
+ class Speed
6
+ UNITS = %w[bps Kbps Mbps Gbps Tbps].freeze
7
+
8
+ class << self
9
+ def call(speed)
10
+ i = 0
11
+ while speed >= 1000
12
+ speed /= 1000
13
+ i += 1
14
+ end
15
+ format('%<speed>.2f %<unit>s', speed: speed, unit: UNITS[i])
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SpeedtestNet
4
+ class Geo
5
+ RADIAN_PER_DEGREE = Math::PI / 180
6
+ EARTH_RADIUS = 6_371_000
7
+
8
+ def initialize(lat, long)
9
+ @lat = lat
10
+ @long = long
11
+ end
12
+
13
+ def distance(other) # rubocop:disable Metrics/AbcSize
14
+ a = Math.sin(radian_lat) * Math.sin(other.radian_lat) +
15
+ Math.cos(radian_lat) * Math.cos(other.radian_lat) *
16
+ Math.cos(radian_long - other.radian_long)
17
+
18
+ Math.acos(a) * EARTH_RADIUS
19
+ end
20
+
21
+ def radian_lat
22
+ @lat * RADIAN_PER_DEGREE
23
+ end
24
+
25
+ def radian_long
26
+ @long * RADIAN_PER_DEGREE
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SpeedtestNet
4
+ HTTP_TIMEOUT = 180
5
+ end
@@ -11,7 +11,7 @@ module SpeedtestNet
11
11
 
12
12
  class << self
13
13
  def measure(server)
14
- config = SpeedtestNet::Config.fetch
14
+ config = Config.fetch
15
15
  test_length = test_length(config)
16
16
  timeout = config.latency[:timeout]
17
17
 
@@ -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
@@ -1,34 +1,34 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'speedtest_net/calculate_speed'
3
+ require 'speedtest_net/formatter/distance'
4
+ require 'speedtest_net/formatter/latency'
5
+ require 'speedtest_net/formatter/speed'
4
6
 
5
7
  module SpeedtestNet
6
8
  class Result
7
- UNITS = %w[bps Kbps Mbps Gbps Tbps].freeze
9
+ attr_reader :client, :server
8
10
 
9
- attr_reader :client, :server, :download_results, :upload_results
10
-
11
- def initialize(client, server, download_results, upload_results)
11
+ def initialize(client, server, download, upload)
12
12
  @client = client
13
13
  @server = server
14
- @download_results = download_results
15
- @upload_results = upload_results
14
+ @download = download
15
+ @upload = upload
16
16
  end
17
17
 
18
18
  def download
19
- SpeedtestNet::CalculateSpeed.call(@download_results)
19
+ @download.calculate
20
20
  end
21
21
 
22
22
  def pretty_download
23
- pretty_format(download)
23
+ Formatter::Speed.call(download)
24
24
  end
25
25
 
26
26
  def upload
27
- SpeedtestNet::CalculateSpeed.call(@upload_results)
27
+ @upload.calculate
28
28
  end
29
29
 
30
30
  def pretty_upload
31
- pretty_format(upload)
31
+ Formatter::Speed.call(upload)
32
32
  end
33
33
 
34
34
  def latency
@@ -36,7 +36,7 @@ module SpeedtestNet
36
36
  end
37
37
 
38
38
  def pretty_latency
39
- format('%<latency>f millisecond', latency: latency * 1_000)
39
+ Formatter::Latency.call(latency)
40
40
  end
41
41
 
42
42
  def distance
@@ -44,18 +44,7 @@ module SpeedtestNet
44
44
  end
45
45
 
46
46
  def pretty_distance
47
- format('%<distance>.3f kilometre', distance: (distance / 1_000).round(3))
48
- end
49
-
50
- private
51
-
52
- def pretty_format(speed)
53
- i = 0
54
- while speed > 1000
55
- speed /= 1000
56
- i += 1
57
- end
58
- format('%<speed>.2f %<unit>s', speed: speed, unit: UNITS[i])
47
+ Formatter::Distance.call(distance)
59
48
  end
60
49
  end
61
50
  end
@@ -4,7 +4,7 @@ require 'rexml/document'
4
4
  require 'speedtest_net/config'
5
5
  require 'speedtest_net/latency'
6
6
  require 'speedtest_net/error'
7
- require 'geo'
7
+ require 'speedtest_net/geo'
8
8
 
9
9
  module SpeedtestNet
10
10
  class Server
@@ -26,7 +26,7 @@ module SpeedtestNet
26
26
  end
27
27
 
28
28
  def measure_latency
29
- @latency = SpeedtestNet::Latency.measure(self)
29
+ @latency = Latency.measure(self)
30
30
  end
31
31
 
32
32
  class << self
@@ -38,15 +38,16 @@ 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)
41
+ def select_server(id = nil, exclude_server_ids = [])
42
+ id.nil? ? best_server(exclude_server_ids) : pick_server(id)
43
43
  end
44
44
 
45
45
  private
46
46
 
47
- def best_server
47
+ def best_server(exclude_server_ids)
48
48
  servers = list
49
- closest_servers = servers.first(10)
49
+ excluded_servers = servers.reject { |server| exclude_server_ids.include?(server.id) }
50
+ closest_servers = excluded_servers.first(10)
50
51
  closest_servers.each(&:measure_latency)
51
52
  sorted_servers = closest_servers.sort_by do |s|
52
53
  [s.latency, s.distance, s.id]
@@ -64,11 +65,11 @@ module SpeedtestNet
64
65
  end
65
66
 
66
67
  def create_instance(server)
67
- config = SpeedtestNet::Config.fetch
68
+ config = Config.fetch
68
69
  url = server['url2'] || server['url']
69
70
 
70
71
  geo = Geo.new(server['lat'].to_f, server['lon'].to_f)
71
- distance = geo.distance(config.client[:geo])
72
+ distance = geo.distance(config.client.geo)
72
73
 
73
74
  new(server['id'].to_i, url, geo, distance, server)
74
75
  end
@@ -78,9 +79,7 @@ module SpeedtestNet
78
79
  client.follow_location = true
79
80
  client.perform
80
81
 
81
- if client.response_code != 200
82
- raise HTTPDownloadError, 'Server lists download error'
83
- end
82
+ raise HTTPDownloadError, 'Server lists download error' if client.response_code != 200
84
83
 
85
84
  xml = REXML::Document.new(client.body, ignore_whitespace_nodes: :all)
86
85
  xml.elements['settings/servers']
@@ -2,22 +2,38 @@
2
2
 
3
3
  require 'curb'
4
4
  require 'securerandom'
5
+ require 'speedtest_net/calculate_speed'
6
+ require 'speedtest_net/http_timeout'
5
7
 
6
8
  module SpeedtestNet
7
9
  class Upload
8
10
  SIZE = [250_000, 500_000, 1_000_000, 2_000_000, 4_000_000, 8_000_000,
9
11
  12_000_000, 17_000_000, 24_000_000, 32_000_000].freeze
10
12
 
13
+ def initialize(results)
14
+ @results = results
15
+ end
16
+
17
+ def calculate
18
+ CalculateSpeed.call(@results)
19
+ end
20
+
11
21
  class << self
12
- def measure(server)
13
- config = SpeedtestNet::Config.fetch
22
+ def measure(server, timeout: HTTP_TIMEOUT) # rubocop:disable Metrics/MethodLength
23
+ config = Config.fetch
14
24
  concurrent_number = config.upload[:threadsperurl]
15
25
 
16
- results = SIZE.map do |size|
17
- urls = create_urls(server, concurrent_number)
18
- multi_uploader(urls, size)
26
+ results = []
27
+ begin
28
+ Timeout.timeout(timeout) do
29
+ SIZE.each do |size|
30
+ urls = create_urls(server, concurrent_number)
31
+ results << multi_uploader(urls, size)
32
+ end
33
+ end
34
+ rescue Timeout::Error # rubocop:disable Lint/SuppressedException
19
35
  end
20
- results
36
+ new(results)
21
37
  end
22
38
 
23
39
  private
@@ -29,15 +45,18 @@ module SpeedtestNet
29
45
  end
30
46
  end
31
47
 
32
- def multi_uploader(urls, size)
48
+ def multi_uploader(urls, size) # rubocop:disable Metrics/MethodLength
33
49
  responses = []
34
50
  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
51
+ multi = Curl::Multi.new
52
+ urls.each do |url|
53
+ client = Curl::Easy.new(url)
54
+ client.headers['User-Agent'] = USER_AGENT
55
+ client.http_post(Curl::PostField.content('content1', content))
56
+ client.on_complete { |data| responses << data }
57
+ multi.add(client)
40
58
  end
59
+ multi.perform
41
60
  responses.map(&:upload_speed).sum * 8
42
61
  end
43
62
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SpeedtestNet
4
+ USER_AGENT = "SpeedtestNet/#{VERSION}"
5
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SpeedtestNet
4
- VERSION = '0.6.1'
4
+ VERSION = '0.8.1'
5
5
  end
data/renovate.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": [
3
+ "config:base"
4
+ ]
5
+ }
@@ -28,18 +28,7 @@ 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
-
33
- spec.add_development_dependency 'bundler', '~> 2.0'
34
- spec.add_development_dependency 'codacy-coverage', '~> 2.1'
35
- spec.add_development_dependency 'factory_bot', '~> 5.1'
36
- spec.add_development_dependency 'rake', '~> 13.0'
37
- spec.add_development_dependency 'rspec', '~> 3.0'
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', '~> 5.0'
42
- spec.add_development_dependency 'webmock', '~> 3.7'
31
+ spec.required_ruby_version = '>= 2.6.0'
43
32
 
44
33
  spec.add_dependency 'curb', '~> 0.9'
45
34
  spec.add_dependency 'rexml', '~> 3.2'
metadata CHANGED
@@ -1,155 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: speedtest_net
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.8.1
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: 2020-02-11 00:00:00.000000000 Z
11
+ date: 2021-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '2.0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '2.0'
27
- - !ruby/object:Gem::Dependency
28
- name: codacy-coverage
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '2.1'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '2.1'
41
- - !ruby/object:Gem::Dependency
42
- name: factory_bot
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '5.1'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '5.1'
55
- - !ruby/object:Gem::Dependency
56
- name: rake
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '13.0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '13.0'
69
- - !ruby/object:Gem::Dependency
70
- name: rspec
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '3.0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '3.0'
83
- - !ruby/object:Gem::Dependency
84
- name: rubocop
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '0.76'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '0.76'
97
- - !ruby/object:Gem::Dependency
98
- name: rubocop-rspec
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '1.36'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '1.36'
111
- - !ruby/object:Gem::Dependency
112
- name: simplecov
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '0.17'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: '0.17'
125
- - !ruby/object:Gem::Dependency
126
- name: vcr
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '5.0'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '5.0'
139
- - !ruby/object:Gem::Dependency
140
- name: webmock
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: '3.7'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: '3.7'
153
13
  - !ruby/object:Gem::Dependency
154
14
  name: curb
155
15
  requirement: !ruby/object:Gem::Requirement
@@ -199,6 +59,7 @@ executables: []
199
59
  extensions: []
200
60
  extra_rdoc_files: []
201
61
  files:
62
+ - ".github/dependabot.yml"
202
63
  - ".github/workflows/ruby.yml"
203
64
  - ".gitignore"
204
65
  - ".rspec"
@@ -211,17 +72,24 @@ files:
211
72
  - Rakefile
212
73
  - bin/console
213
74
  - bin/setup
214
- - lib/geo.rb
215
75
  - lib/speedtest_net.rb
216
76
  - lib/speedtest_net/calculate_speed.rb
77
+ - lib/speedtest_net/client.rb
217
78
  - lib/speedtest_net/config.rb
218
79
  - lib/speedtest_net/download.rb
219
80
  - lib/speedtest_net/error.rb
81
+ - lib/speedtest_net/formatter/distance.rb
82
+ - lib/speedtest_net/formatter/latency.rb
83
+ - lib/speedtest_net/formatter/speed.rb
84
+ - lib/speedtest_net/geo.rb
85
+ - lib/speedtest_net/http_timeout.rb
220
86
  - lib/speedtest_net/latency.rb
221
87
  - lib/speedtest_net/result.rb
222
88
  - lib/speedtest_net/server.rb
223
89
  - lib/speedtest_net/upload.rb
90
+ - lib/speedtest_net/user_agent.rb
224
91
  - lib/speedtest_net/version.rb
92
+ - renovate.json
225
93
  - speedtest_net.gemspec
226
94
  homepage: https://github.com/ryonkn/speedtest_net
227
95
  licenses:
@@ -230,7 +98,7 @@ metadata:
230
98
  homepage_uri: https://github.com/ryonkn/speedtest_net
231
99
  source_code_uri: https://github.com/ryonkn/speedtest_net
232
100
  changelog_uri: https://github.com/ryonkn/speedtest_net
233
- post_install_message:
101
+ post_install_message:
234
102
  rdoc_options: []
235
103
  require_paths:
236
104
  - lib
@@ -238,15 +106,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
238
106
  requirements:
239
107
  - - ">="
240
108
  - !ruby/object:Gem::Version
241
- version: 2.5.0
109
+ version: 2.6.0
242
110
  required_rubygems_version: !ruby/object:Gem::Requirement
243
111
  requirements:
244
112
  - - ">="
245
113
  - !ruby/object:Gem::Version
246
114
  version: '0'
247
115
  requirements: []
248
- rubygems_version: 3.1.2
249
- signing_key:
116
+ rubygems_version: 3.2.15
117
+ signing_key:
250
118
  specification_version: 4
251
119
  summary: Library for testing internet bandwidth using speedtest.net
252
120
  test_files: []
data/lib/geo.rb DELETED
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Geo
4
- RADIAN_PER_DEGREE = Math::PI / 180
5
- EARTH_RADIUS = 6_371_000
6
-
7
- def initialize(lat, long)
8
- @lat = lat
9
- @long = long
10
- end
11
-
12
- def distance(other) # rubocop:disable Metrics/AbcSize
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)
16
-
17
- Math.acos(a) * EARTH_RADIUS
18
- end
19
-
20
- def radian_lat
21
- @lat * RADIAN_PER_DEGREE
22
- end
23
-
24
- def radian_long
25
- @long * RADIAN_PER_DEGREE
26
- end
27
- end