omegaup 0.2.0 → 0.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a20539af83cd7b5c51fa0bfddcb7f67e8ef459208c1816f11c41e9dd3521b84f
4
- data.tar.gz: 9b1328302a70ab1f7458b75682179b3a30893aa8fdffe39a979653cb9f88240a
3
+ metadata.gz: 444fc13885fc5e35380254f0b820c54d3fe2134f5f271e3b420e9245acf84d03
4
+ data.tar.gz: cd81162a29dc5d7ceeedffefca870c37c4260d425bd5ba61431d0352425a3f3a
5
5
  SHA512:
6
- metadata.gz: c7ebb8af607d41acca6d2b880c45ee30eeba9f8fbe388eed8dc3b850b1fbf785fc6ad43ccb16acb69e8bf0048f5b70c9dd57d9f22ea41241c4e16317f8d0e2e8
7
- data.tar.gz: a861ae1430e372049588bb1d0e7a81fbaa1043840f0947066767dd4957a2146d051009d2e44839a956169658f6c3dba985874e40224bdbc2cebf55543e5957b2
6
+ metadata.gz: c98905259ad2bfb854142e4be40226417586edaada2da806916dfa1446f16a8bfae18bd619a47c6707fcba4e32f80888a99d12903f10a9011cefe74443a78bee
7
+ data.tar.gz: cd133c92f5fb7332fc90c371227459c6d3a488a2456700036cca833c3eb9bb1a100dd7cf7686b893471d1db568fb66860ead28f8e3b769714167cd43fdd43b7d
data/lib/omega/cli.rb CHANGED
@@ -15,6 +15,7 @@ module Omega
15
15
  scoreboard
16
16
  create-contest
17
17
  add-problem
18
+ sources
18
19
  help
19
20
  ].freeze
20
21
 
@@ -27,16 +28,18 @@ Commands:
27
28
  - user Generates a dump of the user data in yml format.
28
29
  - scoreboard Gets contest scoreboard with users and score.
29
30
  - clarifications Gets contest clarifications.
31
+ - sources Downloads all code sources into path
30
32
  Parametes:
31
33
  --contest Contest name
32
34
  --user Username or email
33
35
  --user-file A file path containing a list of user one per line without
34
36
  header
35
37
  --open Filter to only open clarifications
38
+ --path Path to store results
36
39
  Setup:
37
40
  You need to add two env variables with your omegaup credentials.
38
41
  OMEGAUP_URL *Optional* This is intended for development purpose, it will target
39
- to https://omegau.com by default.
42
+ to https://omegaup.com by default.
40
43
  OMEGAUP_USER *Required* Your OmegaUp Username or Email
41
44
  OMEGAUP_PASS *Required* Your OmegaUp Password
42
45
  )
@@ -65,6 +68,11 @@ OMEGAUP_PASS *Required* Your OmegaUp Password
65
68
  opt :contest, 'Contest ShortName or identifier', type: :string
66
69
  opt :open, 'Filter to only open clars'
67
70
  end
71
+ when 'sources'
72
+ Optimist.options do
73
+ opt :contest, 'Contest ShortName or identifier', type: :string
74
+ opt :path, 'Path to store results', type: :string
75
+ end
68
76
  # when 'create-contest'
69
77
  # Optimist.options do
70
78
  # opt :contest, 'Contest ShortName or identifier', type: :string
@@ -105,6 +113,8 @@ OMEGAUP_PASS *Required* Your OmegaUp Password
105
113
  scoreboard(@cmd_opts[:contest])
106
114
  when 'clarifications'
107
115
  clarifications(@cmd_opts[:contest], @cmd_opts[:open])
116
+ when 'sources'
117
+ download_sources(@cmd_opts[:contest], @cmd_opts[:path])
108
118
  end
109
119
  end
110
120
  end
@@ -40,6 +40,14 @@ module Omega
40
40
  rescue StandardError => e
41
41
  puts "#{contest_name}: #{e.message}"
42
42
  end
43
+
44
+ def download_sources(contest_name, path)
45
+ Dir.mkdir(path) unless File.directory?(path)
46
+ contest = omega.contest(contest_name)
47
+ contest.all_sources.each do |source|
48
+ source.save_at(path)
49
+ end
50
+ end
43
51
  end
44
52
  end
45
53
  end
data/lib/omega/client.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require_relative 'contest'
4
4
  require_relative 'scoreboard'
5
5
  require_relative 'user'
6
+ require_relative 'contest_run'
6
7
 
7
8
  require 'httparty'
8
9
 
@@ -26,10 +27,15 @@ module Omega
26
27
  @config = conf
27
28
  end
28
29
 
29
- def perform_request(method, endpoint, data)
30
+ def perform_request(method, endpoint, data, retried = false)
30
31
  url = "#{@config['endpoint']}#{endpoint}"
31
32
  response = self.class.send(method, url, body: data)
32
33
  body = JSON.parse(response.body, symbolize_names: true)
34
+
35
+ if body[:errorcode] == 401 && !retried
36
+ login
37
+ return perform_request(method, endpoint, data, true)
38
+ end
33
39
  raise OmegaError, body if body[:error]
34
40
 
35
41
  body
@@ -71,6 +77,10 @@ module Omega
71
77
  data[:clarifications]
72
78
  end
73
79
 
80
+ def respond_clarif(id, response)
81
+ post('/api/clarification/update/', { clarification_id: id, answer: response })
82
+ end
83
+
74
84
  def user(user)
75
85
  data = post('/api/user/profile/', { username: user })
76
86
  User.new(self, data)
@@ -83,5 +93,14 @@ module Omega
83
93
  def problems_solved(user)
84
94
  post('/api/user/problemsSolved/', { username: user })
85
95
  end
96
+
97
+ def run_details(run)
98
+ post('/api/run/details/', { run_alias: run })
99
+ end
100
+
101
+ def contest_runs(contest, offset, page_size)
102
+ data = post('/api/contest/runs/', { contest_alias: contest, offset: offset, rowcount: page_size })
103
+ data[:runs].map { |run| ContestRun.new(self, run) }
104
+ end
86
105
  end
87
106
  end
data/lib/omega/contest.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'base'
4
+ require_relative 'contest_run'
4
5
 
5
6
  module Omega
6
7
  class Contest < Base
@@ -8,6 +9,24 @@ module Omega
8
9
  @client.scoreboard(data[:alias])
9
10
  end
10
11
 
12
+ def runs(offset = 0, page_size = 100)
13
+ @client.contest_runs(data[:alias], offset, page_size)
14
+ end
15
+
16
+ def all_sources
17
+ sources = []
18
+ offset = 0
19
+ bach = runs
20
+
21
+ until bach.empty?
22
+ sources += bach
23
+ offset += bach.size
24
+ bach = runs(offset)
25
+ end
26
+
27
+ sources
28
+ end
29
+
11
30
  def add_user(user)
12
31
  if user.is_a?(String)
13
32
  @client.add_user_to_contest(user, data[:alias])
@@ -20,26 +39,38 @@ module Omega
20
39
  @client.clarifications(data[:alias])
21
40
  end
22
41
 
23
- def observe
42
+ def observe(score_notifier, clar_noritifer)
24
43
  last = current = scoreboard
25
44
  sleep(5)
45
+ Thread.new do
46
+ loop do
47
+ clarifications.select { |clar| clar[:answer].nil? || clar[:answer].empty? }
48
+ .each { |clar| clar_noritifer.call(clar) }
49
+ sleep(300)
50
+ rescue StandardError => ex
51
+ puts ex.message
52
+ sleep(3000)
53
+ end
54
+ end
26
55
  loop do
27
56
  current = scoreboard
28
57
  last.users.each do |score|
29
- puts score.username
58
+ # puts score.username
30
59
  current_score = current.score_for(score.username)
31
60
  score.problems.each do |problem|
32
61
  name = problem[:alias]
33
62
  current_problem = current_score.score_for(name)
34
63
  last_points = problem[:points]
35
64
  current_points = current_problem[:points]
36
- puts " #{name}::#{last_points} >> #{current_points}"
37
- yield(contest_name, score.username, name, current_points, last_points) if current_points != last_points
65
+ score_notifier.call(data[:alias], score.username, name, current_points, last_points, data[:alias]) if current_points != last_points
38
66
  end
39
- puts '-' * 60
40
67
  end
68
+ # puts '-' * 60
41
69
  last = current
42
70
  sleep(15)
71
+ rescue StandardError => ex
72
+ puts ex.message
73
+ sleep(3000)
43
74
  end
44
75
  end
45
76
  end
@@ -0,0 +1,17 @@
1
+ require_relative 'base'
2
+
3
+ module Omega
4
+ class ContestRun < Base
5
+ def details
6
+ @details ||= @client.run_details(@data[:guid])
7
+ end
8
+
9
+ def source_code
10
+ details[:source]
11
+ end
12
+
13
+ def save_at(path)
14
+ File.write("#{path}/#{@data[:guid]}.yaml", { details: details, data: @data }.to_yaml)
15
+ end
16
+ end
17
+ end
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.2.0'
4
+ VERSION = '0.3.0'
5
5
  end
data/omega.gemspec CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.require_paths = ['lib']
24
24
 
25
25
  spec.add_development_dependency 'amazing_print'
26
+ spec.add_development_dependency 'httparty'
26
27
  spec.add_development_dependency 'minitest', '~> 5'
27
28
  spec.add_development_dependency 'optimist'
28
29
  spec.add_development_dependency 'rake', '~> 10.0'
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.2.0
4
+ version: 0.3.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-03-20 00:00:00.000000000 Z
11
+ date: 2021-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: amazing_print
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: httparty
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: minitest
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -83,6 +97,7 @@ files:
83
97
  - lib/omega/cli/contest.rb
84
98
  - lib/omega/client.rb
85
99
  - lib/omega/contest.rb
100
+ - lib/omega/contest_run.rb
86
101
  - lib/omega/scoreboard.rb
87
102
  - lib/omega/user.rb
88
103
  - lib/omega/version.rb