Class: SciolyFF::Validator::Events

Inherits:
Checker
  • Object
show all
Includes:
Canonical, Sections
Defined in:
lib/sciolyff/validator/events.rb

Overview

Checks for one event in the Events section of a SciolyFF file

Constant Summary collapse

REQUIRED =
{
  name: String
}.freeze
OPTIONAL =
{
  trial: [true, false],
  trialed: [true, false],
  scoring: %w[high low]
}.freeze

Constants included from Canonical

Canonical::BASE

Instance Method Summary collapse

Methods included from Sections

#all_required_sections?, #no_extra_sections?, #rep_is_hash?, #sections_are_correct_type?

Methods inherited from Checker

inherited, #send

Constructor Details

#initialize(rep) ⇒ Events

Returns a new instance of Events.



22
23
24
25
26
27
# File 'lib/sciolyff/validator/events.rb', line 22

def initialize(rep)
  @events = rep[:Events]
  @names = @events.map { |e| e[:name] }
  @placings = rep[:Placings].group_by { |p| p[:event] }
  @teams = rep[:Teams].count
end

Instance Method Details

#in_canonical_list?(event, logger) ⇒ Boolean

Returns:

  • (Boolean)


84
85
86
87
88
89
# File 'lib/sciolyff/validator/events.rb', line 84

def in_canonical_list?(event, logger)
  rep = [event[:name]]
  return true if canonical?(rep, 'events.csv', logger)

  logger.warn "non-canonical event: #{event[:name]}"
end

#no_gaps_in_places?(event, logger) ⇒ Boolean

Returns:

  • (Boolean)


63
64
65
66
67
68
69
70
71
72
# File 'lib/sciolyff/validator/events.rb', line 63

def no_gaps_in_places?(event, logger)
  places = places_with_expanded_ties(event)
  return true if places.empty?

  gaps = (places.min..places.max).to_a - places
  return true if gaps.empty?

  logger.error "'event: #{event[:name]}' has gaps in "\
    "place #{gaps.join ', '}"
end

#places_start_at_one?(event, logger) ⇒ Boolean

Returns:

  • (Boolean)


74
75
76
77
78
79
80
# File 'lib/sciolyff/validator/events.rb', line 74

def places_start_at_one?(event, logger)
  lowest_place = @placings[event[:name]].map { |p| p[:place] }.compact.min
  return true if lowest_place == 1 || lowest_place.nil?

  logger.error "places for 'event: #{event[:name]}' start at "\
    "#{lowest_place} instead of 1"
end

#placings_for_all_teams?(event, logger) ⇒ Boolean

Returns:

  • (Boolean)


35
36
37
38
39
40
41
# File 'lib/sciolyff/validator/events.rb', line 35

def placings_for_all_teams?(event, logger)
  count = @placings[event[:name]]&.count || 0
  return true if count == @teams

  logger.error "'event: #{event[:name]}' has incorrect number of "\
    "placings (#{count} instead of #{@teams})"
end

#ties_marked?(event, logger) ⇒ Boolean

Returns:

  • (Boolean)


43
44
45
46
47
48
49
50
51
# File 'lib/sciolyff/validator/events.rb', line 43

def ties_marked?(event, logger)
  unmarked_ties = placings_by_place(event).select do |_place, placings|
    placings.count { |p| !p[:tie] } > 1
  end
  return true if unmarked_ties.empty?

  logger.error "'event: #{event[:name]}' has unmarked ties at "\
    "place #{unmarked_ties.keys.join ', '}"
end

#ties_paired?(event, logger) ⇒ Boolean

Returns:

  • (Boolean)


53
54
55
56
57
58
59
60
61
# File 'lib/sciolyff/validator/events.rb', line 53

def ties_paired?(event, logger)
  unpaired_ties = placings_by_place(event).select do |_place, placings|
    placings.count { |p| p[:tie] } == 1
  end
  return true if unpaired_ties.empty?

  logger.error "'event: #{event[:name]}' has unpaired ties at "\
    "place #{unpaired_ties.keys.join ', '}"
end

#unique_name?(event, logger) ⇒ Boolean

Returns:

  • (Boolean)


29
30
31
32
33
# File 'lib/sciolyff/validator/events.rb', line 29

def unique_name?(event, logger)
  return true if @names.count(event[:name]) == 1

  logger.error "duplicate event name: #{event[:name]}"
end