sciolyff-duosmium 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +92 -0
  4. data/bin/sciolyff +38 -0
  5. data/lib/sciolyff.rb +9 -0
  6. data/lib/sciolyff/interpreter.rb +89 -0
  7. data/lib/sciolyff/interpreter/bids.rb +24 -0
  8. data/lib/sciolyff/interpreter/event.rb +69 -0
  9. data/lib/sciolyff/interpreter/html.rb +65 -0
  10. data/lib/sciolyff/interpreter/html/helpers.rb +230 -0
  11. data/lib/sciolyff/interpreter/html/main.css +1 -0
  12. data/lib/sciolyff/interpreter/html/main.js +74 -0
  13. data/lib/sciolyff/interpreter/html/template.html.erb +480 -0
  14. data/lib/sciolyff/interpreter/model.rb +29 -0
  15. data/lib/sciolyff/interpreter/penalty.rb +19 -0
  16. data/lib/sciolyff/interpreter/placing.rb +127 -0
  17. data/lib/sciolyff/interpreter/raw.rb +50 -0
  18. data/lib/sciolyff/interpreter/subdivisions.rb +72 -0
  19. data/lib/sciolyff/interpreter/team.rb +111 -0
  20. data/lib/sciolyff/interpreter/tiebreaks.rb +34 -0
  21. data/lib/sciolyff/interpreter/tournament.rb +194 -0
  22. data/lib/sciolyff/validator.rb +89 -0
  23. data/lib/sciolyff/validator/canonical.rb +23 -0
  24. data/lib/sciolyff/validator/checker.rb +33 -0
  25. data/lib/sciolyff/validator/events.rb +106 -0
  26. data/lib/sciolyff/validator/logger.rb +48 -0
  27. data/lib/sciolyff/validator/penalties.rb +19 -0
  28. data/lib/sciolyff/validator/placings.rb +136 -0
  29. data/lib/sciolyff/validator/range.rb +15 -0
  30. data/lib/sciolyff/validator/raws.rb +40 -0
  31. data/lib/sciolyff/validator/sections.rb +56 -0
  32. data/lib/sciolyff/validator/subdivisions.rb +64 -0
  33. data/lib/sciolyff/validator/teams.rb +108 -0
  34. data/lib/sciolyff/validator/top_level.rb +23 -0
  35. data/lib/sciolyff/validator/tournament.rb +138 -0
  36. data/sciolyff.gemspec +22 -0
  37. metadata +121 -0
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'sciolyff/validator/checker'
4
+ require 'sciolyff/validator/sections'
5
+
6
+ module SciolyFF
7
+ # Top-level sections of a SciolyFF file
8
+ class Validator::TopLevel < Validator::Checker
9
+ include Validator::Sections
10
+
11
+ REQUIRED = {
12
+ Tournament: Hash,
13
+ Events: Array,
14
+ Teams: Array,
15
+ Placings: Array
16
+ }.freeze
17
+
18
+ OPTIONAL = {
19
+ Subdivisions: Array,
20
+ Penalties: Array
21
+ }.freeze
22
+ end
23
+ end
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'sciolyff/validator/checker'
4
+ require 'sciolyff/validator/sections'
5
+ require 'sciolyff/validator/range'
6
+
7
+ module SciolyFF
8
+ # Checks for Tournament section of a SciolyFF file
9
+ class Validator::Tournament < Validator::Checker
10
+ include Validator::Sections
11
+
12
+ REQUIRED = {
13
+ location: String,
14
+ level: %w[Invitational Regionals States Nationals],
15
+ division: %w[A B C],
16
+ year: Integer
17
+ }.freeze
18
+
19
+ OPTIONAL = {
20
+ name: String,
21
+ state: String,
22
+ medals: Integer,
23
+ trophies: Integer,
24
+ bids: Integer,
25
+ 'bids per school': Integer,
26
+ 'short name': String,
27
+ 'worst placings dropped': Integer,
28
+ 'exempt placings': Integer,
29
+ 'maximum place': Integer,
30
+ 'per-event n': %w[place participation],
31
+ 'n offset': Integer,
32
+ date: Date,
33
+ 'start date': Date,
34
+ 'end date': Date,
35
+ 'awards date': Date
36
+ }.freeze
37
+
38
+ def initialize(rep)
39
+ @maximum_place = rep[:Teams].count { |t| !t[:exhibition] }
40
+ @schools_count = rep[:Teams].uniq do |t|
41
+ [t[:school], t[:city], t[:state]]
42
+ end.count
43
+ end
44
+
45
+ def name_for_not_states_or_nationals?(tournament, logger)
46
+ level = tournament[:level]
47
+ return true if %w[States Nationals].include?(level) || tournament[:name]
48
+
49
+ logger.error 'name for Tournament required '\
50
+ "('level: #{level}' is not States or Nationals)"
51
+ end
52
+
53
+ def state_for_not_nationals?(tournament, logger)
54
+ return true if tournament[:level] == 'Nationals' || tournament[:state]
55
+
56
+ logger.error 'state for Tournament required '\
57
+ "('level: #{tournament[:level]}' is not Nationals)"
58
+ end
59
+
60
+ def bids_for_regionals_or_states?(tournament, logger)
61
+ level = tournament[:level]
62
+
63
+ if %w[Regionals States].include?(level)
64
+ return true if tournament.key? :bids
65
+
66
+ logger.warn "field 'bids:' recommended for level: #{level}"
67
+ else
68
+ return true unless tournament.key? :bids
69
+
70
+ logger.error "bids: does not make sense for level: #{level}"
71
+ end
72
+ end
73
+
74
+ def bids_per_school_positive?(tournament, logger)
75
+ bids = tournament[:'bids per school']
76
+ return true if bids.nil? || tournament[:'bids per school'].positive?
77
+
78
+ logger.error "'bids per school: #{bids}' is not positive"
79
+ end
80
+
81
+ def bids_per_school_relevant?(tournament, logger)
82
+ return true unless tournament[:'bids per school'] &&
83
+ !tournament.key?(:bids)
84
+
85
+ logger.error "field 'bids per school:' not relevant without field 'bids:'"
86
+ end
87
+
88
+ def short_name_is_relevant?(tournament, logger)
89
+ return true unless tournament[:'short name'] && !tournament[:name]
90
+
91
+ logger.error "'short name: #{tournament[:'short name']}' for Tournament "\
92
+ "requires a normal 'name:' as well"
93
+ end
94
+
95
+ def short_name_is_short?(tournament, logger)
96
+ return true if tournament[:'short name'].nil? ||
97
+ tournament[:'short name'].length < tournament[:name].length
98
+
99
+ logger.error "'short name: #{tournament[:'short name']}' for Tournament "\
100
+ "is longer than normal 'name: #{tournament[:name]}'"
101
+ end
102
+
103
+ include Validator::Range
104
+
105
+ def n_offset_within_range?(tournament, logger)
106
+ # not a perfect check, can still have event maximum place be lower
107
+ # probably should add warning for use of n offset anyways?
108
+ min = -[@maximum_place, tournament[:'maximum place']].compact.min
109
+ within_range?(tournament, :'n offset', logger, min, Float::INFINITY)
110
+ end
111
+
112
+ def maximum_place_within_range?(tournament, logger)
113
+ within_range?(tournament, :'maximum place', logger, 1, @maximum_place)
114
+ end
115
+
116
+ def medals_within_range?(tournament, logger)
117
+ max = [@maximum_place, tournament[:'maximum place']].compact.min
118
+ within_range?(tournament, :medals, logger, 1, max)
119
+ end
120
+
121
+ def trophies_within_range?(tournament, logger)
122
+ within_range?(tournament, :trophies, logger, 1, @maximum_place)
123
+ end
124
+
125
+ def bids_within_range?(tournament, logger)
126
+ within_range?(tournament, :bids, logger, 1, @schools_count)
127
+ end
128
+
129
+ def date_included?(tournament, logger)
130
+ if !tournament[:date].is_a?(Date) || (!tournament[:'start date'].is_a?(Date) && !tournament[:'end date'].is_a?(Date))
131
+ return true
132
+ end
133
+
134
+ logger.error 'You need either a date for the tournament (if it took place in one day) '\
135
+ 'or beginning and end dates (if it took place over the course of multiple days).'
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ Gem::Specification.new do |s|
4
+ s.authors = ['Em Zhan', 'Shreyas Mayya']
5
+ s.homepage = 'https://github.com/duosmium/sciolyff'
6
+ s.files = `git ls-files -z`.split("\x0").reject do |f|
7
+ f.start_with? 'examples/', '.'
8
+ end
9
+ s.license = 'MIT'
10
+ s.name = 'sciolyff-duosmium'
11
+ s.summary = 'A file format for Science Olympiad tournament results.'
12
+ s.version = '0.13.0'
13
+ s.executables << 'sciolyff'
14
+ s.add_runtime_dependency 'erubi', '~> 1.9'
15
+ s.add_runtime_dependency 'optimist', '~> 3.0'
16
+ if Gem.win_platform?
17
+ s.required_ruby_version = '>= 2.6'
18
+ else
19
+ s.add_runtime_dependency 'psych', '~> 3.1'
20
+ s.required_ruby_version = '>= 2.5'
21
+ end
22
+ end
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sciolyff-duosmium
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.13.0
5
+ platform: ruby
6
+ authors:
7
+ - Em Zhan
8
+ - Shreyas Mayya
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2020-12-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: erubi
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.9'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '1.9'
28
+ - !ruby/object:Gem::Dependency
29
+ name: optimist
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '3.0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '3.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: psych
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.1'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '3.1'
56
+ description:
57
+ email:
58
+ executables:
59
+ - sciolyff
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - LICENSE
64
+ - README.md
65
+ - bin/sciolyff
66
+ - lib/sciolyff.rb
67
+ - lib/sciolyff/interpreter.rb
68
+ - lib/sciolyff/interpreter/bids.rb
69
+ - lib/sciolyff/interpreter/event.rb
70
+ - lib/sciolyff/interpreter/html.rb
71
+ - lib/sciolyff/interpreter/html/helpers.rb
72
+ - lib/sciolyff/interpreter/html/main.css
73
+ - lib/sciolyff/interpreter/html/main.js
74
+ - lib/sciolyff/interpreter/html/template.html.erb
75
+ - lib/sciolyff/interpreter/model.rb
76
+ - lib/sciolyff/interpreter/penalty.rb
77
+ - lib/sciolyff/interpreter/placing.rb
78
+ - lib/sciolyff/interpreter/raw.rb
79
+ - lib/sciolyff/interpreter/subdivisions.rb
80
+ - lib/sciolyff/interpreter/team.rb
81
+ - lib/sciolyff/interpreter/tiebreaks.rb
82
+ - lib/sciolyff/interpreter/tournament.rb
83
+ - lib/sciolyff/validator.rb
84
+ - lib/sciolyff/validator/canonical.rb
85
+ - lib/sciolyff/validator/checker.rb
86
+ - lib/sciolyff/validator/events.rb
87
+ - lib/sciolyff/validator/logger.rb
88
+ - lib/sciolyff/validator/penalties.rb
89
+ - lib/sciolyff/validator/placings.rb
90
+ - lib/sciolyff/validator/range.rb
91
+ - lib/sciolyff/validator/raws.rb
92
+ - lib/sciolyff/validator/sections.rb
93
+ - lib/sciolyff/validator/subdivisions.rb
94
+ - lib/sciolyff/validator/teams.rb
95
+ - lib/sciolyff/validator/top_level.rb
96
+ - lib/sciolyff/validator/tournament.rb
97
+ - sciolyff.gemspec
98
+ homepage: https://github.com/duosmium/sciolyff
99
+ licenses:
100
+ - MIT
101
+ metadata: {}
102
+ post_install_message:
103
+ rdoc_options: []
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '2.5'
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubygems_version: 3.1.4
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: A file format for Science Olympiad tournament results.
121
+ test_files: []