apt-spy2 0.7.3 → 0.8.2

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