apt-spy2 0.7.3 → 0.8.2

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.
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Apt
2
4
  module Spy2
3
- VERSION = "0.7.3"
5
+ VERSION = '0.8.2'
4
6
  end
5
7
  end
@@ -1,20 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'colored'
2
4
  require 'json'
3
5
 
4
6
  module Apt
5
7
  module Spy2
8
+ # abstracted puts or json
6
9
  class Writer
7
10
  def initialize(format)
8
-
9
- if !["json", "shell"].include?(format)
10
- raise "Unknown format: #{format}"
11
- end
11
+ raise "Unknown format: #{format}" unless %w[json shell].include?(format)
12
12
 
13
13
  @format = format
14
14
  @complete = []
15
15
  end
16
16
 
17
- def set_complete(complete)
17
+ def complete(complete)
18
18
  @complete = complete
19
19
  end
20
20
 
@@ -24,32 +24,29 @@ module Apt
24
24
  return
25
25
  end
26
26
 
27
- print "Mirror: #{data["mirror"]} - "
27
+ print "Mirror: #{data['mirror']} - "
28
28
 
29
- case data["status"]
30
- when "up"
31
- puts data["status"].upcase.green
32
- when "down"
33
- puts data["status"].upcase.red
34
- when "broken"
35
- puts data["status"].upcase.yellow
29
+ case data['status']
30
+ when 'up'
31
+ puts data['status'].upcase.green
32
+ when 'down'
33
+ puts data['status'].upcase.red
34
+ when 'broken'
35
+ puts data['status'].upcase.yellow
36
36
  else
37
- puts "Unknown status: #{data["status"]}".white_on_red
37
+ puts "Unknown status: #{data['status']}".white_on_red
38
38
  end
39
39
  end
40
40
 
41
41
  def json?
42
- if @format == 'json'
43
- return true
44
- end
42
+ return true if @format == 'json'
45
43
 
46
- return false
44
+ false
47
45
  end
48
46
 
49
- def to_json
47
+ def to_json(*_args)
50
48
  JSON.generate(@complete)
51
49
  end
52
-
53
50
  end
54
51
  end
55
52
  end
data/lib/apt/spy2.rb CHANGED
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'thor'
2
- require 'open-uri'
3
4
  require 'colored'
4
5
  require 'fileutils'
5
6
  require 'apt/spy2/writer'
@@ -7,120 +8,130 @@ require 'apt/spy2/country'
7
8
  require 'apt/spy2/downloader'
8
9
  require 'apt/spy2/ubuntu_mirrors'
9
10
  require 'apt/spy2/launchpad'
11
+ require 'apt/spy2/request'
12
+ require 'apt/spy2/url'
10
13
 
14
+ # apt-spy2 command interface
11
15
  class AptSpy2 < Thor
12
- package_name "apt-spy2"
16
+ package_name 'apt-spy2'
17
+ class_option :country, default: 'mirrors'
18
+ class_option :launchpad, type: :boolean, banner: "Use launchpad's mirror list"
13
19
 
14
- desc "fix", "Set the closest/fastest mirror"
15
- option :country, :default => "mirrors"
16
- option :commit, :type => :boolean
17
- option :launchpad, :type => :boolean, :banner => "Use launchpad's mirror list"
20
+ desc 'fix', 'Set the closest/fastest mirror'
21
+ option :commit, type: :boolean
22
+ option :strict, type: :boolean
18
23
  def fix
19
- working = filter(retrieve(options[:country], use_launchpad?(options)), false)
20
- print "The closest mirror is: "
21
- puts "#{working[0]}".bold.magenta
22
- if !options[:commit]
23
- puts "Run with --commit to adjust /etc/apt/sources.list".yellow
24
- else
25
- puts "Updating /etc/apt/sources.list".yellow
26
- update(working[0])
24
+ mirrors = retrieve(options[:country], use_launchpad?(options))
25
+ working = filter(mirrors, options[:strict], false)
26
+ print 'The closest mirror is: '
27
+ puts (working[0]).to_s.bold.magenta
28
+ unless options[:commit]
29
+ puts 'Run with --commit to adjust /etc/apt/sources.list'.yellow
30
+ return
27
31
  end
32
+
33
+ puts 'Updating /etc/apt/sources.list'.yellow
34
+ update(working[0])
28
35
  end
29
36
 
30
- desc "check", "Evaluate mirrors"
31
- option :country, :default => "mirrors"
32
- option :output, :type => :boolean, :default => true
33
- option :format, :default => "shell"
34
- option :launchpad, :type => :boolean, :banner => "Use launchpad's mirror list"
37
+ desc 'check', 'Evaluate mirrors'
38
+ option :output, type: :boolean, default: true
39
+ option :format, default: 'shell'
40
+ option :strict, type: :boolean
35
41
  def check
36
-
37
42
  @writer = Apt::Spy2::Writer.new(options[:format])
38
43
 
39
44
  mirrors = retrieve(options[:country], use_launchpad?(options))
40
- filter(mirrors, options[:output])
45
+ filter(mirrors, options[:strict], options[:output])
41
46
 
42
47
  puts @writer.to_json if @writer.json?
43
48
  end
44
49
 
45
- desc "list", "List the currently available mirrors"
46
- option :country, :default => "mirrors"
47
- option :format, :default => "shell"
48
- option :launchpad, :type => :boolean, :banner => "Use launchpad's mirror list"
50
+ desc 'list', 'List the currently available mirrors'
51
+ option :format, default: 'shell'
49
52
  def list
50
53
  mirrors = retrieve(options[:country], use_launchpad?(options))
51
54
 
52
55
  @writer = Apt::Spy2::Writer.new(options[:format])
53
56
 
54
- @writer.set_complete(mirrors)
57
+ @writer.complete(mirrors)
55
58
 
56
59
  puts @writer.to_json if @writer.json?
57
- puts mirrors if !@writer.json?
60
+ puts mirrors unless @writer.json?
58
61
  end
59
62
 
60
- desc "version", "Show which version of apt-spy2 is installed"
63
+ desc 'version', 'Show which version of apt-spy2 is installed'
61
64
  def version
62
65
  puts Apt::Spy2::VERSION
63
66
  exit
64
67
  end
65
68
 
66
69
  private
67
- def retrieve(country = "mirrors", launchpad = false)
68
70
 
71
+ def retrieve(country = 'mirrors', launchpad = false)
69
72
  downloader = Apt::Spy2::Downloader.new
70
73
 
71
- if launchpad === true
72
- csv_path = File.expand_path(File.dirname(__FILE__) + "/../../var/country-names.txt")
74
+ if launchpad
75
+ csv_path = File.expand_path("#{File.dirname(__FILE__)}/../../var/country-names.txt")
73
76
  country = Apt::Spy2::Country.new(csv_path)
74
77
  name = country.to_country_name(options[:country])
75
78
 
76
79
  launchpad = Apt::Spy2::Launchpad.new(downloader.do_download('https://launchpad.net/ubuntu/+archivemirrors'))
77
- return launchpad.get_mirrors(name)
80
+ return launchpad.mirrors(name)
78
81
  end
79
82
 
80
83
  country.upcase! if country.length == 2
81
84
 
82
85
  ubuntu_mirrors = Apt::Spy2::UbuntuMirrors.new(downloader.do_download("http://mirrors.ubuntu.com/#{country}.txt"))
83
- mirrors = ubuntu_mirrors.get_mirrors(country)
84
- return mirrors
85
-
86
+ ubuntu_mirrors.mirrors(country)
86
87
  end
87
88
 
88
- private
89
- def filter(mirrors, output = true)
89
+ def filter(mirrors, strict = false, output = true)
90
90
  # f me :)
91
91
 
92
92
  working_mirrors = []
93
93
 
94
+ url = Apt::Spy2::Url.new(strict)
95
+
94
96
  mirrors.each do |mirror|
95
- data = {"mirror" => mirror }
96
- begin
97
- URI.open(mirror)
98
- data["status"] = "up"
99
- working_mirrors << mirror
100
- rescue OpenURI::HTTPError
101
- data["status"] = "broken"
102
- rescue
103
- # this is a catch-all for everything else
104
- data["status"] = "down"
105
- end
97
+ data = { 'mirror' => mirror }
98
+
99
+ check = url.adjust!(mirror)
100
+
101
+ status = broken?(check)
102
+
103
+ data['status'] = status
104
+
105
+ working_mirrors << mirror if status == 'up'
106
106
 
107
107
  @writer.echo(data) if output
108
108
  end
109
109
 
110
- return working_mirrors
110
+ working_mirrors
111
+ end
112
+
113
+ def broken?(url)
114
+ begin
115
+ req = Apt::Spy2::Request.new(url)
116
+ response = req.head
117
+ return 'up' if response.code == '200'
118
+
119
+ return 'broken' if response.code == '404'
120
+ rescue StandardError
121
+ # connection errors, ssl errors, etc.
122
+ end
111
123
 
124
+ 'down'
112
125
  end
113
126
 
114
- private
115
127
  def update(mirror)
116
-
117
128
  t = Time.now
118
- r = `lsb_release -c`.split(" ")[1]
119
- sources = "## Updated on #{t.to_s} by apt-spy2\n"
120
- sources << "deb #{mirror} #{r} main restricted universe multiverse\n"
121
- sources << "deb #{mirror} #{r}-updates main restricted universe multiverse\n"
122
- sources << "deb #{mirror} #{r}-backports main restricted universe multiverse\n"
123
- sources << "deb #{mirror} #{r}-security main restricted universe multiverse\n"
129
+ r = `lsb_release -c`.split(' ')[1]
130
+ sources = "## Updated on #{t} by apt-spy2\n"
131
+ sources += "deb #{mirror} #{r} main restricted universe multiverse\n"
132
+ sources += "deb #{mirror} #{r}-updates main restricted universe multiverse\n"
133
+ sources += "deb #{mirror} #{r}-backports main restricted universe multiverse\n"
134
+ sources += "deb #{mirror} #{r}-security main restricted universe multiverse\n"
124
135
 
125
136
  apt_sources = '/etc/apt/sources.list'
126
137
 
@@ -129,26 +140,23 @@ class AptSpy2 < Thor
129
140
  File.open(apt_sources, 'w') do |f|
130
141
  f.write(sources)
131
142
  end
132
- rescue
143
+ rescue StandardError
133
144
  msg = "Failed updating #{apt_sources}!"
134
- msg << "You probably need sudo!"
145
+ msg += 'You probably need sudo!'
135
146
  raise msg
136
147
  end
137
148
 
138
149
  puts "Updated '#{apt_sources}' with #{mirror}".green
139
- puts "Run `apt-get update` to update".black_on_yellow
150
+ puts 'Run `apt-get update` to update'.black_on_yellow
140
151
  end
141
152
 
142
- private
143
153
  def use_launchpad?(options)
144
- if !options[:launchpad]
145
- return false
146
- end
154
+ return false unless options[:launchpad]
147
155
 
148
156
  if options[:country] && options[:country] == 'mirrors'
149
- raise "Please supply a `--country=foo`. Launchpad cannot guess!"
157
+ raise 'Please supply a `--country=foo`. Launchpad cannot guess!'
150
158
  end
151
159
 
152
- return true
160
+ true
153
161
  end
154
162
  end
data/test_helper.rb ADDED
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'simplecov'
4
+ require 'simplecov-lcov'
5
+
6
+ if ENV['CI']
7
+ SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter
8
+ SimpleCov::Formatter::LcovFormatter.config do |c|
9
+ c.output_directory = './coverage'
10
+ c.report_with_single_file = true
11
+ c.single_report_path = './coverage/lcov.info'
12
+ end
13
+ else
14
+ SimpleCov.formatter SimpleCov::Formatter::MultiFormatter.new([
15
+ SimpleCov::Formatter::SimpleFormatter,
16
+ SimpleCov::Formatter::HTMLFormatter
17
+ ])
18
+ end
19
+
20
+ SimpleCov.profiles.define 'apt-spy2' do
21
+ add_filter '/tests/'
22
+ add_filter '/pkg/'
23
+ add_filter '/vendor/'
24
+ add_filter '/var'
25
+
26
+ add_group 'lib', 'lib/apt'
27
+ add_group 'bin', 'bin'
28
+ end
29
+ SimpleCov.start 'apt-spy2'
30
+ require 'minitest/autorun'
@@ -1,12 +1,15 @@
1
- require 'apt/spy2/country'
1
+ # frozen_string_literal: true
2
2
 
3
+ require_relative '../test_helper'
4
+ require_relative '../lib/apt/spy2/country'
5
+
6
+ # test the name resolution
3
7
  class CountryTest < Minitest::Test
4
8
  def setup
5
- @country_list = File.expand_path(File.dirname(__FILE__) + "/../var/country-names.txt")
9
+ @country_list = File.expand_path("#{File.dirname(__FILE__)}/../var/country-names.txt")
6
10
  end
7
11
 
8
- def test_tld_to_name()
9
-
12
+ def test_tld_to_name
10
13
  # fixtures for people who don't want to read about rails
11
14
  data = {
12
15
  'de' => 'Germany',
@@ -22,6 +25,5 @@ class CountryTest < Minitest::Test
22
25
  data.each_pair do |code, expected|
23
26
  assert_equal(expected, c.to_country_name(code))
24
27
  end
25
-
26
28
  end
27
29
  end
@@ -1,15 +1,18 @@
1
- require 'apt/spy2/downloader'
1
+ # frozen_string_literal: true
2
2
 
3
+ require_relative '../test_helper'
4
+ require_relative '../lib/apt/spy2/downloader'
5
+
6
+ # this is an integration test (needs interwebs)
3
7
  class DownloaderTest < Minitest::Test
4
- # this is an integration test (needs interwebs)
5
- def test_do()
8
+ def test_do
6
9
  downloader = Apt::Spy2::Downloader.new
7
- data = downloader.do_download("http://mirrors.ubuntu.com/DE.txt")
8
- assert(!data.empty?, "There should have been a response, unless the mirrors are down.")
10
+ data = downloader.do_download('http://mirrors.ubuntu.com/DE.txt')
11
+ assert(!data.empty?, 'There should have been a response, unless the mirrors are down.')
9
12
  end
10
13
 
11
- def test_do_wrong_countrys()
14
+ def test_do_wrong_countrys
12
15
  downloader = Apt::Spy2::Downloader.new
13
- assert_raises(RuntimeError) { downloader.do_download("http://mirrors.ubuntu.com/de.txt") }
16
+ assert_raises(RuntimeError) { downloader.do_download('http://mirrors.ubuntu.com/de.txt') }
14
17
  end
15
18
  end
@@ -1,13 +1,17 @@
1
- require 'apt/spy2/launchpad'
1
+ # frozen_string_literal: true
2
2
 
3
+ require_relative '../test_helper'
4
+ require_relative '../lib/apt/spy2/launchpad'
5
+
6
+ # test to confirm launchpad format (HTML) is parsed
3
7
  class LaunchpadTest < Minitest::Test
4
8
  def setup
5
- @download_fixture = File.read(File.expand_path(File.dirname(__FILE__) + "/fixtures/launchpad.html"))
9
+ @download_fixture = File.read(File.expand_path("#{File.dirname(__FILE__)}/fixtures/launchpad.html"))
6
10
  end
7
11
 
8
12
  def test_german_mirrors
9
13
  lp = Apt::Spy2::Launchpad.new(@download_fixture)
10
- mirrors = lp.get_mirrors('Germany')
14
+ mirrors = lp.mirrors('Germany')
11
15
  assert_equal(false, mirrors.empty?)
12
16
  end
13
17
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../test_helper'
4
+ require_relative '../lib/apt/spy2/ubuntu_mirrors'
5
+
6
+ # test to confirm launchpad format (HTML) is parsed
7
+ class UbuntuMirrorsTest < Minitest::Test
8
+ def test_mirrors
9
+ expected = ['http://example.org', 'http://example.de']
10
+ fixture = expected.join("\n")
11
+
12
+ m = Apt::Spy2::UbuntuMirrors.new(fixture)
13
+ assert_equal(expected, m.mirrors('country'))
14
+ end
15
+ end
data/tests/url_test.rb ADDED
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../test_helper'
4
+ require_relative '../lib/apt/spy2/url'
5
+
6
+ # test to check request lib
7
+ class UrlTest < Minitest::Test
8
+ def test_non_strict
9
+ expected = 'http://example.org'
10
+
11
+ url = Apt::Spy2::Url.new(false)
12
+ assert_equal(expected, url.adjust!(expected))
13
+ end
14
+
15
+ # def strict
16
+ # skip "Test only runs on ubuntu" if OS.unix? and not OS.mac?
17
+
18
+ # expected = 'http://example.org'
19
+
20
+ # url = Apt::Spy2::Url.new(true)
21
+ # assert_not_equal(expected, url.mirror)
22
+ # end
23
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../test_helper'
4
+ require_relative '../lib/apt/spy2/writer'
5
+ require 'json'
6
+
7
+ # test to check request lib
8
+ class WriterTest < Minitest::Test
9
+ def test_json
10
+ fixture = { 'mirror': 'http://example.org', 'status': 'up' }
11
+
12
+ w = Apt::Spy2::Writer.new('json')
13
+ w.echo(fixture)
14
+
15
+ # json string
16
+ j = w.to_json
17
+
18
+ assert_equal(true, w.json?)
19
+ assert_equal(true, j.is_a?(String))
20
+ assert_equal(true, JSON.parse(j).is_a?(Array))
21
+ end
22
+
23
+ def test_no_json
24
+ w = Apt::Spy2::Writer.new('shell')
25
+ assert_equal(false, w.json?)
26
+ end
27
+ end
metadata CHANGED
@@ -1,77 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: apt-spy2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - till
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-24 00:00:00.000000000 Z
11
+ date: 2023-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: thor
14
+ name: colored
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.18.1
19
+ version: '1.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.18.1
26
+ version: '1.2'
27
27
  - !ruby/object:Gem::Dependency
28
- name: colored
28
+ name: json
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.2'
33
+ version: '0'
34
34
  type: :runtime
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: '1.2'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: json
42
+ name: nokogiri
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 1.14.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 1.14.1
55
55
  - !ruby/object:Gem::Dependency
56
- name: nokogiri
56
+ name: thor
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '1.6'
62
- - - "<"
63
- - !ruby/object:Gem::Version
64
- version: '1.13'
61
+ version: 0.18.1
65
62
  type: :runtime
66
63
  prerelease: false
67
64
  version_requirements: !ruby/object:Gem::Requirement
68
65
  requirements:
69
66
  - - ">="
70
67
  - !ruby/object:Gem::Version
71
- version: '1.6'
72
- - - "<"
73
- - !ruby/object:Gem::Version
74
- version: '1.13'
68
+ version: 0.18.1
75
69
  - !ruby/object:Gem::Dependency
76
70
  name: bundler
77
71
  requirement: !ruby/object:Gem::Requirement
@@ -86,6 +80,20 @@ dependencies:
86
80
  - - "~>"
87
81
  - !ruby/object:Gem::Version
88
82
  version: '2.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 5.15.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 5.15.0
89
97
  - !ruby/object:Gem::Dependency
90
98
  name: rake
91
99
  requirement: !ruby/object:Gem::Requirement
@@ -101,19 +109,19 @@ dependencies:
101
109
  - !ruby/object:Gem::Version
102
110
  version: '0'
103
111
  - !ruby/object:Gem::Dependency
104
- name: minitest
112
+ name: rubocop
105
113
  requirement: !ruby/object:Gem::Requirement
106
114
  requirements:
107
- - - "~>"
115
+ - - ">="
108
116
  - !ruby/object:Gem::Version
109
- version: 5.15.0
117
+ version: '0'
110
118
  type: :development
111
119
  prerelease: false
112
120
  version_requirements: !ruby/object:Gem::Requirement
113
121
  requirements:
114
- - - "~>"
122
+ - - ">="
115
123
  - !ruby/object:Gem::Version
116
- version: 5.15.0
124
+ version: '0'
117
125
  - !ruby/object:Gem::Dependency
118
126
  name: simplecov
119
127
  requirement: !ruby/object:Gem::Requirement
@@ -152,6 +160,7 @@ extra_rdoc_files: []
152
160
  files:
153
161
  - ".dockerignore"
154
162
  - ".github/dependabot.yml"
163
+ - ".github/workflows/codeql-analysis.yml"
155
164
  - ".github/workflows/pr.yml"
156
165
  - ".github/workflows/release.yml"
157
166
  - ".gitignore"
@@ -170,19 +179,25 @@ files:
170
179
  - lib/apt/spy2/country.rb
171
180
  - lib/apt/spy2/downloader.rb
172
181
  - lib/apt/spy2/launchpad.rb
182
+ - lib/apt/spy2/request.rb
173
183
  - lib/apt/spy2/ubuntu_mirrors.rb
184
+ - lib/apt/spy2/url.rb
174
185
  - lib/apt/spy2/version.rb
175
186
  - lib/apt/spy2/writer.rb
187
+ - test_helper.rb
176
188
  - tests/country_test.rb
177
189
  - tests/downloader_test.rb
178
190
  - tests/fixtures/launchpad.html
179
191
  - tests/launchpad_test.rb
192
+ - tests/ubuntu_mirrors_test.rb
193
+ - tests/url_test.rb
194
+ - tests/writer_test.rb
180
195
  - var/country-names.txt
181
196
  homepage: https://github.com/lagged/apt-spy2
182
197
  licenses:
183
198
  - BSD-2-Clause
184
199
  metadata: {}
185
- post_install_message:
200
+ post_install_message:
186
201
  rdoc_options: []
187
202
  require_paths:
188
203
  - lib
@@ -190,18 +205,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
190
205
  requirements:
191
206
  - - ">="
192
207
  - !ruby/object:Gem::Version
193
- version: '2.6'
208
+ version: '2.7'
194
209
  - - "<"
195
210
  - !ruby/object:Gem::Version
196
- version: '3.2'
211
+ version: '3.3'
197
212
  required_rubygems_version: !ruby/object:Gem::Requirement
198
213
  requirements:
199
214
  - - ">="
200
215
  - !ruby/object:Gem::Version
201
216
  version: '0'
202
217
  requirements: []
203
- rubygems_version: 3.2.32
204
- signing_key:
218
+ rubygems_version: 3.4.2
219
+ signing_key:
205
220
  specification_version: 4
206
221
  summary: apt-spy2, or apt-spy for ubuntu
207
222
  test_files: []