omegaup 0.3.0 → 0.5.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
2
  SHA256:
3
- metadata.gz: 444fc13885fc5e35380254f0b820c54d3fe2134f5f271e3b420e9245acf84d03
4
- data.tar.gz: cd81162a29dc5d7ceeedffefca870c37c4260d425bd5ba61431d0352425a3f3a
3
+ metadata.gz: 767e4b440acdf0d4b4f07d2fa568b0c05e78a8e066e1280765d49c6d62b23c46
4
+ data.tar.gz: 4151f5ade0af99d594d81e7cb1dae1259532d0627cc1c02f0499e1db03c4cec3
5
5
  SHA512:
6
- metadata.gz: c98905259ad2bfb854142e4be40226417586edaada2da806916dfa1446f16a8bfae18bd619a47c6707fcba4e32f80888a99d12903f10a9011cefe74443a78bee
7
- data.tar.gz: cd133c92f5fb7332fc90c371227459c6d3a488a2456700036cca833c3eb9bb1a100dd7cf7686b893471d1db568fb66860ead28f8e3b769714167cd43fdd43b7d
6
+ metadata.gz: 2511e42ce423bb7530f9e696e2a8f436fe547a9526731e3fc119952d63a014c0ef151b2ed78087b033009ee3420fe5bfee6495fe0b35f33a92aff90d62ee1488
7
+ data.tar.gz: b0816baf5e9fb16c43a9dbdb2e00b8c1462fd0f77ae33ce843c9fc03d42f6491e75d492a4d3847591cd9cf225589a6b2b23601ce333ee90c23873814cce80e90
data/.rubocop.yml CHANGED
@@ -1,3 +1,7 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.7
2
+ TargetRubyVersion: 3.1
3
3
  NewCops: enable
4
+ Gemspec/RequiredRubyVersion:
5
+ Enabled: false
6
+ Style/Documentation:
7
+ Enabled: false
data/Gemfile CHANGED
File without changes
data/lib/omega/base.rb CHANGED
File without changes
@@ -24,6 +24,16 @@ module Omega
24
24
  puts "Failed users: \n- #{failed.join("\n- ")}"
25
25
  end
26
26
 
27
+ def copy_users(contest, from)
28
+ target = omega.contest(contest)
29
+ source = omega.contest(from)
30
+ source.users.each do |user|
31
+ target.add_user(user)
32
+ rescue StandardError => e
33
+ puts "Error adding #{user}: #{e.message}"
34
+ end
35
+ end
36
+
27
37
  def user_data(user)
28
38
  puts omega.user(user).full_data.to_yaml
29
39
  end
@@ -41,6 +51,23 @@ module Omega
41
51
  puts "#{contest_name}: #{e.message}"
42
52
  end
43
53
 
54
+ def add_problem(contest_name, problem_name)
55
+ contest = omega.contest(contest_name)
56
+ contest.add_problem(problem_name)
57
+ rescue StandardError => e
58
+ puts "Error adding #{problem_name}: #{e.message}"
59
+ end
60
+
61
+ def copy_problems(contest_name, from)
62
+ contest = omega.contest(contest_name)
63
+ source = omega.contest(from)
64
+ source.problems.each do |problem|
65
+ contest.add_problem(problem[:alias])
66
+ rescue StandardError => e
67
+ puts "Error adding #{problem[:alias]}: #{e.message}"
68
+ end
69
+ end
70
+
44
71
  def download_sources(contest_name, path)
45
72
  Dir.mkdir(path) unless File.directory?(path)
46
73
  contest = omega.contest(contest_name)
data/lib/omega/cli.rb CHANGED
@@ -19,40 +19,54 @@ module Omega
19
19
  help
20
20
  ].freeze
21
21
 
22
- def print_help
23
- puts %(
22
+ GENERAL_DOC = %(
24
23
  OmegaUp CLI. Developed by OMIJal https://github.com/omijal/omegaup-cli.
25
24
  Tool for interacting with omegaup from CLI and available throug ruby gems.
26
25
  Commands:
27
- - register-users Add a user or a bunch of users to the a contest.
28
- - user Generates a dump of the user data in yml format.
29
- - scoreboard Gets contest scoreboard with users and score.
30
- - clarifications Gets contest clarifications.
31
- - sources Downloads all code sources into path
26
+ - register-users Add a user or a bunch of users to the a contest.
27
+ - copy-problems Adds prob from another contest
28
+ - user Generates a dump of the user data in yml format.
29
+ - scoreboard Gets contest scoreboard with users and score.
30
+ - clarifications Gets contest clarifications.
31
+ - sources Downloads all code sources into path
32
32
  Parametes:
33
- --contest Contest name
34
- --user Username or email
35
- --user-file A file path containing a list of user one per line without
36
- header
37
- --open Filter to only open clarifications
38
- --path Path to store results
33
+ --contest Contest name
34
+ --user Username or email
35
+ --user-file A file path containing a list of user one per line without
36
+ header
37
+ --open Filter to only open clarifications
38
+ --path Path to store results
39
39
  Setup:
40
40
  You need to add two env variables with your omegaup credentials.
41
41
  OMEGAUP_URL *Optional* This is intended for development purpose, it will target
42
- to https://omegaup.com by default.
42
+ to https://omegaup.com by default.
43
43
  OMEGAUP_USER *Required* Your OmegaUp Username or Email
44
44
  OMEGAUP_PASS *Required* Your OmegaUp Password
45
- )
45
+ )
46
+
47
+ def print_help
48
+ puts GENERAL_DOC
46
49
  end
47
50
 
48
51
  def initialize(_)
49
52
  @cmd = ARGV.shift
50
53
 
51
54
  @cmd_opts = case @cmd
55
+ when 'copy-problems'
56
+ Optimist.options do
57
+ opt :contest, 'Contest ShortName or identifier', type: :string
58
+ opt :from, 'Another constest that allows to clone users from another contest', type: :string
59
+ end
60
+ when 'add-problem'
61
+ Optimist.options do
62
+ opt :contest, 'Contest ShortName or identifier', type: :string
63
+ opt :problem, 'Problem name', type: :string
64
+ end
52
65
  when 'register-users'
53
66
  Optimist.options do
54
67
  opt :contest, 'Contest ShortName or identifier', type: :string
55
68
  opt :user, 'Username or email', type: :string
69
+ opt :from, 'Another constest that allows to clone users from another contest', type: :string
56
70
  opt :user_file, 'A file containing the users list one per line and without header', type: :string
57
71
  end
58
72
  when 'user'
@@ -92,8 +106,8 @@ OMEGAUP_PASS *Required* Your OmegaUp Password
92
106
  config = {
93
107
  'omega' => {
94
108
  'endpoint' => ENV['OMEGAUP_URL'] || 'https://omegaup.com',
95
- 'user' => ENV['OMEGAUP_USER'],
96
- 'pass' => ENV['OMEGAUP_PASS']
109
+ 'user' => ENV.fetch('OMEGAUP_USER', nil),
110
+ 'pass' => ENV.fetch('OMEGAUP_PASS', nil)
97
111
  }
98
112
  }
99
113
 
@@ -107,6 +121,7 @@ OMEGAUP_PASS *Required* Your OmegaUp Password
107
121
  when 'register-users'
108
122
  register_user(@cmd_opts[:contest], @cmd_opts[:user]) if @cmd_opts[:user]
109
123
  register_users(@cmd_opts[:contest], @cmd_opts[:user_file]) if @cmd_opts[:user_file]
124
+ copy_users(@cmd_opts[:contest], @cmd_opts[:from]) if @cmd_opts[:from]
110
125
  when 'user'
111
126
  user_data(@cmd_opts[:user])
112
127
  when 'scoreboard'
@@ -115,6 +130,10 @@ OMEGAUP_PASS *Required* Your OmegaUp Password
115
130
  clarifications(@cmd_opts[:contest], @cmd_opts[:open])
116
131
  when 'sources'
117
132
  download_sources(@cmd_opts[:contest], @cmd_opts[:path])
133
+ when 'copy-problems'
134
+ copy_problems(@cmd_opts[:contest], @cmd_opts[:from])
135
+ when 'add-problem'
136
+ add_problem(@cmd_opts[:contest], @cmd_opts[:problem])
118
137
  end
119
138
  end
120
139
  end
data/lib/omega/client.rb CHANGED
@@ -4,10 +4,16 @@ require_relative 'contest'
4
4
  require_relative 'scoreboard'
5
5
  require_relative 'user'
6
6
  require_relative 'contest_run'
7
+ require 'json'
8
+ require 'nokogiri'
7
9
 
8
10
  require 'httparty'
9
11
 
10
12
  module Omega
13
+ KAREL_LANGS = 'kp,kj'
14
+ OMI_LANGS = 'c11-gcc,c11-clang,cpp11-gcc,cpp11-clang,cpp17-gcc,cpp17-clang,cpp20-gcc,cpp20-clang'
15
+ ALL_LANGS = 'kp,kj,c11-gcc,c11-clang,cpp11-gcc,cpp11-clang,cpp17-gcc,cpp17-clang,cpp20-gcc,cpp20-clang,java,kt,py2,py3,rb,cs,pas,cat,hs,lua,go,rs,js'
16
+
11
17
  class OmegaError < StandardError
12
18
  attr_reader :data
13
19
 
@@ -18,6 +24,14 @@ module Omega
18
24
  def message
19
25
  "#{@data[:errorname]}::#{@data[:errorcode]} >> #{@data[:error]}"
20
26
  end
27
+
28
+ def errorname
29
+ @data[:errorname]
30
+ end
31
+
32
+ def errorcode
33
+ @data[:errorcode]
34
+ end
21
35
  end
22
36
 
23
37
  class Client
@@ -30,7 +44,7 @@ module Omega
30
44
  def perform_request(method, endpoint, data, retried = false)
31
45
  url = "#{@config['endpoint']}#{endpoint}"
32
46
  response = self.class.send(method, url, body: data)
33
- body = JSON.parse(response.body, symbolize_names: true)
47
+ body = ::JSON.parse(response.body, symbolize_names: true)
34
48
 
35
49
  if body[:errorcode] == 401 && !retried
36
50
  login
@@ -67,6 +81,58 @@ module Omega
67
81
  retry
68
82
  end
69
83
 
84
+ def problem_details(problem_alias)
85
+ post('/api/problem/details', { problem_alias: })
86
+ end
87
+
88
+ def create_group(name, description: nil, alias: nil)
89
+ post('/api/group/create', name:, alias:, description:)
90
+ end
91
+
92
+ def create_contest(name:, short_name:, description:, start_time:, finish_time:,
93
+ public: false, penalty_calc_policy: 'sum', show_penalty: true,
94
+ points_decay_factor: '0', submissions_gap: '60', languages: ALL_LANGS, feedback: 'none',
95
+ penalty: '0', scoreboard: '100', penalty_type: 'none',
96
+ default_show_all_contestants_in_scoreboard: false,
97
+ show_scoreboard_after: true,
98
+ score_mode: 'partial',
99
+ needs_basic_information: false,
100
+ requests_user_information: 'no',
101
+ contest_for_teams: false)
102
+ post('/api/contest/create/', {
103
+ admin: true,
104
+ admission_mode: (public ? 'public' : 'private'),
105
+ alias: short_name,
106
+ archived: false,
107
+ opened: false,
108
+ penalty_calc_policy:,
109
+ show_penalty:,
110
+ title: name,
111
+ description:,
112
+ has_submissions: false,
113
+ start_time: start_time.to_time.to_i,
114
+ finish_time: finish_time.to_time.to_i,
115
+ points_decay_factor:,
116
+ submissions_gap:,
117
+ languages:,
118
+ feedback:,
119
+ penalty:,
120
+ scoreboard:,
121
+ penalty_type:,
122
+ default_show_all_contestants_in_scoreboard:,
123
+ show_scoreboard_after:,
124
+ score_mode:,
125
+ needs_basic_information:,
126
+ requests_user_information:,
127
+ contest_for_teams:
128
+ })
129
+ contest(short_name)
130
+ rescue OmegaError => e
131
+ raise e unless e.errorname == 'aliasInUse'
132
+
133
+ contest(short_name)
134
+ end
135
+
70
136
  def scoreboard(name)
71
137
  data = post('/api/contest/scoreboard/', { contest_alias: name })
72
138
  Scoreboard.new(self, data)
@@ -86,6 +152,12 @@ module Omega
86
152
  User.new(self, data)
87
153
  end
88
154
 
155
+ def add_admin_group(contest, group)
156
+ post('/api/contest/addGroupAdmin', { contest_alias: contest, group: })
157
+ rescue OmegaError
158
+ # Omega seems to have a bug
159
+ end
160
+
89
161
  def add_user_to_contest(user, contest)
90
162
  post('/api/contest/addUser', { contest_alias: contest, usernameOrEmail: user })
91
163
  end
@@ -99,8 +171,50 @@ module Omega
99
171
  end
100
172
 
101
173
  def contest_runs(contest, offset, page_size)
102
- data = post('/api/contest/runs/', { contest_alias: contest, offset: offset, rowcount: page_size })
174
+ data = post('/api/contest/runs/', { contest_alias: contest, offset:, rowcount: page_size })
103
175
  data[:runs].map { |run| ContestRun.new(self, run) }
104
176
  end
177
+
178
+ def add_problem_to_contest(contest, problem, points = 100)
179
+ post('/api/contest/addProblem', contest_alias: contest, problem_alias: problem, points:)
180
+ end
181
+
182
+ def add_user_to_group(group_name, username)
183
+ post('/api/group/addUser', group_alias: group_name, usernameOrEmail: username)
184
+ rescue OmegaError => e
185
+ raise if e.errorname != 'identityInGroup'
186
+ end
187
+
188
+ def get_payload_from_response_by_id(response_body, id)
189
+ page = Nokogiri::HTML(response_body)
190
+ script = page.at_css("script##{id}")
191
+ unless script
192
+ raise OmegaError.new(errorname: 'ScrapingError', errorcode: 404,
193
+ error: "Script with id #{id} not found")
194
+ end
195
+
196
+ script_content = script.content
197
+ # Extrayendo el contenido JSON del script
198
+ begin
199
+ ::JSON.parse(script_content, symbolize_names: true)
200
+ rescue JSON::ParserError
201
+ raise OmegaError.new(errorname: 'ScrapingError', errorcode: 500, error: 'Unable to parse JSON data')
202
+ end
203
+ end
204
+
205
+ def scrap_get(endpoint, id = 'payload')
206
+ url = "#{@config['endpoint']}#{endpoint}"
207
+ response = self.class.get(url)
208
+ unless response.success?
209
+ raise OmegaError.new(errorname: 'HttpError', errorcode: response.code,
210
+ error: response.message)
211
+ end
212
+
213
+ body = get_payload_from_response_by_id(response.body, id)
214
+
215
+ raise OmegaError, body if body[:error]
216
+
217
+ body
218
+ end
105
219
  end
106
220
  end
data/lib/omega/contest.rb CHANGED
@@ -9,6 +9,10 @@ module Omega
9
9
  @client.scoreboard(data[:alias])
10
10
  end
11
11
 
12
+ def problems
13
+ @data[:problems]
14
+ end
15
+
12
16
  def runs(offset = 0, page_size = 100)
13
17
  @client.contest_runs(data[:alias], offset, page_size)
14
18
  end
@@ -27,6 +31,14 @@ module Omega
27
31
  sources
28
32
  end
29
33
 
34
+ def full_details
35
+ @full_details ||= @client.scrap_get("/contest/#{data[:alias]}/edit/")
36
+ end
37
+
38
+ def group_admin?(group_name)
39
+ full_details[:group_admins].any? { |group| group[:alias].casecmp(group_name).zero? }
40
+ end
41
+
30
42
  def add_user(user)
31
43
  if user.is_a?(String)
32
44
  @client.add_user_to_contest(user, data[:alias])
@@ -39,6 +51,22 @@ module Omega
39
51
  @client.clarifications(data[:alias])
40
52
  end
41
53
 
54
+ def users
55
+ scoreboard.users
56
+ end
57
+
58
+ def alias
59
+ @data[:alias].downcase
60
+ end
61
+
62
+ def add_problem(name)
63
+ @client.add_problem_to_contest(data[:alias], name)
64
+ end
65
+
66
+ def add_admin_group(group)
67
+ @client.add_admin_group(data[:alias], group)
68
+ end
69
+
42
70
  def observe(score_notifier, clar_noritifer)
43
71
  last = current = scoreboard
44
72
  sleep(5)
@@ -47,8 +75,8 @@ module Omega
47
75
  clarifications.select { |clar| clar[:answer].nil? || clar[:answer].empty? }
48
76
  .each { |clar| clar_noritifer.call(clar) }
49
77
  sleep(300)
50
- rescue StandardError => ex
51
- puts ex.message
78
+ rescue StandardError => e
79
+ puts e.message
52
80
  sleep(3000)
53
81
  end
54
82
  end
@@ -62,14 +90,17 @@ module Omega
62
90
  current_problem = current_score.score_for(name)
63
91
  last_points = problem[:points]
64
92
  current_points = current_problem[:points]
65
- score_notifier.call(data[:alias], score.username, name, current_points, last_points, data[:alias]) if current_points != last_points
93
+ if current_points != last_points
94
+ score_notifier.call(data[:alias], score.username, name, current_points, last_points,
95
+ data[:alias])
96
+ end
66
97
  end
67
98
  end
68
99
  # puts '-' * 60
69
100
  last = current
70
101
  sleep(15)
71
- rescue StandardError => ex
72
- puts ex.message
102
+ rescue StandardError => e
103
+ puts e.message
73
104
  sleep(3000)
74
105
  end
75
106
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'base'
2
4
 
3
5
  module Omega
@@ -11,7 +13,7 @@ module Omega
11
13
  end
12
14
 
13
15
  def save_at(path)
14
- File.write("#{path}/#{@data[:guid]}.yaml", { details: details, data: @data }.to_yaml)
16
+ File.write("#{path}/#{@data[:guid]}.yaml", { details:, data: @data }.to_yaml)
15
17
  end
16
18
  end
17
19
  end
@@ -9,9 +9,8 @@ module Omega
9
9
 
10
10
  def initialize(client, entry)
11
11
  @username = entry[:username]
12
- @client = client
13
12
  @problems = entry[:problems] || []
14
- @data = entry
13
+ super
15
14
  end
16
15
 
17
16
  def merge(score)
@@ -38,6 +37,10 @@ module Omega
38
37
  end
39
38
  nil
40
39
  end
40
+
41
+ def to_h
42
+ @data[:problems]
43
+ end
41
44
  end
42
45
 
43
46
  class Scoreboard < Base
@@ -50,6 +53,10 @@ module Omega
50
53
  end
51
54
  end
52
55
 
56
+ def to_h
57
+ @data[:ranking].map { |username, entry| { username:, score: entry.to_h } }
58
+ end
59
+
53
60
  def merge(board)
54
61
  result = clone
55
62
  board.data[:ranking].each do |user, score|
data/lib/omega/user.rb CHANGED
@@ -7,7 +7,7 @@ module Omega
7
7
  def full_data
8
8
  {
9
9
  data: @data,
10
- problems_solved: problems_solved,
10
+ problems_solved:,
11
11
  resume: report
12
12
  }
13
13
  end
@@ -16,6 +16,10 @@ module Omega
16
16
  @client.problems_solved(data[:username])[:problems]
17
17
  end
18
18
 
19
+ def username
20
+ @data[:username]
21
+ end
22
+
19
23
  def report
20
24
  data = { score: 0, count: 0 }
21
25
  problems_solved.each do |p|
data/lib/omega/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Omega
4
- VERSION = '0.3.0'
4
+ VERSION = '0.5.0'
5
5
  end
data/lib/omega.rb CHANGED
File without changes
data/omega.gemspec CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.name = 'omegaup'
9
9
  spec.version = Omega::VERSION
10
10
  spec.authors = ['Gilberto Vargas']
11
- spec.email = ['tachoguitar@gmail.com']
11
+ spec.email = ['tachomexgems@gmail.com']
12
12
 
13
13
  spec.summary = 'File created for encrypting files using ssh keys'
14
14
  spec.description = 'Allows to encrypt files using ssh keys'
@@ -25,6 +25,11 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency 'amazing_print'
26
26
  spec.add_development_dependency 'httparty'
27
27
  spec.add_development_dependency 'minitest', '~> 5'
28
+ spec.add_development_dependency 'mocha'
28
29
  spec.add_development_dependency 'optimist'
30
+ spec.add_development_dependency 'rack-minitest'
29
31
  spec.add_development_dependency 'rake', '~> 10.0'
32
+ spec.add_development_dependency 'simplecov'
33
+ spec.add_development_dependency 'webmock'
34
+ spec.metadata['rubygems_mfa_required'] = 'true'
30
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omegaup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gilberto Vargas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-07 00:00:00.000000000 Z
11
+ date: 2024-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: amazing_print
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mocha
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: optimist
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +80,20 @@ dependencies:
66
80
  - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack-minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: rake
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -80,9 +108,37 @@ dependencies:
80
108
  - - "~>"
81
109
  - !ruby/object:Gem::Version
82
110
  version: '10.0'
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'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: webmock
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
83
139
  description: Allows to encrypt files using ssh keys
84
140
  email:
85
- - tachoguitar@gmail.com
141
+ - tachomexgems@gmail.com
86
142
  executables:
87
143
  - omega
88
144
  extensions: []
@@ -105,7 +161,8 @@ files:
105
161
  homepage: https://github.com/omijal/omegaup-cli
106
162
  licenses:
107
163
  - MIT
108
- metadata: {}
164
+ metadata:
165
+ rubygems_mfa_required: 'true'
109
166
  post_install_message:
110
167
  rdoc_options: []
111
168
  require_paths:
@@ -121,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
178
  - !ruby/object:Gem::Version
122
179
  version: '0'
123
180
  requirements: []
124
- rubygems_version: 3.1.4
181
+ rubygems_version: 3.5.14
125
182
  signing_key:
126
183
  specification_version: 4
127
184
  summary: File created for encrypting files using ssh keys