barker 0.2.2
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 +7 -0
- data/.gitignore +3 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.simplecov +7 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +50 -0
- data/LICENSE +22 -0
- data/README.md +204 -0
- data/Rakefile +12 -0
- data/barker.gemspec +29 -0
- data/ci/run +20 -0
- data/lib/barker/answer.rb +11 -0
- data/lib/barker/api/base.rb +145 -0
- data/lib/barker/api/response/base.rb +25 -0
- data/lib/barker/api/response/candidate.rb +38 -0
- data/lib/barker/api/response/candidate_answer.rb +23 -0
- data/lib/barker/api/response/candidate_joker.rb +21 -0
- data/lib/barker/api/response/candidate_question.rb +51 -0
- data/lib/barker/api/response/error.rb +17 -0
- data/lib/barker/api/response/game_show.rb +43 -0
- data/lib/barker/api/response/round.rb +21 -0
- data/lib/barker/api/response.rb +15 -0
- data/lib/barker/api.rb +7 -0
- data/lib/barker/candidate.rb +52 -0
- data/lib/barker/candidate_answer.rb +42 -0
- data/lib/barker/candidate_joker.rb +30 -0
- data/lib/barker/candidate_question.rb +116 -0
- data/lib/barker/candidate_round.rb +32 -0
- data/lib/barker/entity.rb +15 -0
- data/lib/barker/game_show.rb +176 -0
- data/lib/barker/guideline/base.rb +33 -0
- data/lib/barker/guideline/llmcquiz/questions.yaml +300 -0
- data/lib/barker/guideline/llmcquiz.rb +28 -0
- data/lib/barker/guideline/mock.rb +17 -0
- data/lib/barker/guideline.rb +8 -0
- data/lib/barker/import/yaml.rb +22 -0
- data/lib/barker/import.rb +6 -0
- data/lib/barker/joker.rb +28 -0
- data/lib/barker/question.rb +12 -0
- data/lib/barker/quiz.rb +19 -0
- data/lib/barker/repo/memory/game_show.rb +38 -0
- data/lib/barker/repo/memory.rb +8 -0
- data/lib/barker/repo.rb +6 -0
- data/lib/barker/round.rb +68 -0
- data/lib/barker/stage.rb +38 -0
- data/lib/barker/store/memory.rb +158 -0
- data/lib/barker/store.rb +6 -0
- data/lib/barker/validations.rb +14 -0
- data/lib/barker/version.rb +3 -0
- data/lib/barker.rb +45 -0
- data/test/factories/answer.rb +21 -0
- data/test/factories/candidate.rb +23 -0
- data/test/factories/candidate_answer.rb +12 -0
- data/test/factories/candidate_joker.rb +8 -0
- data/test/factories/candidate_question.rb +16 -0
- data/test/factories/candidate_round.rb +8 -0
- data/test/factories/game_show.rb +12 -0
- data/test/factories/joker.rb +5 -0
- data/test/factories/question.rb +13 -0
- data/test/factories/quiz.rb +11 -0
- data/test/factories/round.rb +12 -0
- data/test/factories/stage.rb +12 -0
- data/test/fixtures/questions.yaml +20 -0
- data/test/test_helper.rb +72 -0
- data/test/test_mocks.rb +21 -0
- data/test/unit/answer_test.rb +49 -0
- data/test/unit/api/base_test.rb +207 -0
- data/test/unit/api/response/base_test.rb +35 -0
- data/test/unit/api/response/candidate_answer_test.rb +64 -0
- data/test/unit/api/response/candidate_joker_test.rb +60 -0
- data/test/unit/api/response/candidate_question_test.rb +99 -0
- data/test/unit/api/response/candidate_test.rb +82 -0
- data/test/unit/api/response/game_show_test.rb +105 -0
- data/test/unit/api/response/round_test.rb +49 -0
- data/test/unit/candidate_answer_test.rb +66 -0
- data/test/unit/candidate_question_test.rb +277 -0
- data/test/unit/candidate_round_test.rb +64 -0
- data/test/unit/candidate_test.rb +76 -0
- data/test/unit/game_show_test.rb +372 -0
- data/test/unit/guideline/base_test.rb +34 -0
- data/test/unit/guideline/llmcquiz_test.rb +35 -0
- data/test/unit/guideline/mock_test.rb +33 -0
- data/test/unit/import/yaml_test.rb +41 -0
- data/test/unit/joker_test.rb +32 -0
- data/test/unit/question_test.rb +55 -0
- data/test/unit/quiz_test.rb +37 -0
- data/test/unit/repo/memory/game_show_test.rb +54 -0
- data/test/unit/round_test.rb +167 -0
- data/test/unit/stage_test.rb +53 -0
- metadata +283 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
module Barker
|
2
|
+
module Api
|
3
|
+
module Response
|
4
|
+
class CandidateQuestion < Base
|
5
|
+
|
6
|
+
extend Forwardable
|
7
|
+
def_delegators :candidate_question, :id, :question_id, :candidate_id, :label, :state, :asked_at, :answered_at, :asked?, :answered?, :open?, :time_left, :timeout?, :correct?, :wrong?
|
8
|
+
|
9
|
+
def answers
|
10
|
+
candidate_question.answers.map { |candidate_answer| build_candidate_answer(candidate_answer) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def given_answer
|
14
|
+
build_candidate_answer(candidate_question.given_answer)
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_hash
|
18
|
+
{
|
19
|
+
'id' => id,
|
20
|
+
'question_id' => question_id,
|
21
|
+
'candidate_id' => candidate_id,
|
22
|
+
'label' => label,
|
23
|
+
'state' => state,
|
24
|
+
'asked_at' => to_i(asked_at),
|
25
|
+
'answered_at' => to_i(answered_at),
|
26
|
+
'asked?' => asked?,
|
27
|
+
'answered?' => answered?,
|
28
|
+
'open?' => open?,
|
29
|
+
'time_left' => time_left,
|
30
|
+
'timeout?' => timeout?,
|
31
|
+
'correct?' => correct?,
|
32
|
+
'wrong?' => wrong?,
|
33
|
+
'answers' => answers.map(&:to_hash),
|
34
|
+
'given_answer' => given_answer? && given_answer.to_hash
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def build_candidate_answer(candidate_answer)
|
41
|
+
Response::CandidateAnswer.new(:candidate_answer => candidate_answer)
|
42
|
+
end
|
43
|
+
|
44
|
+
def given_answer?
|
45
|
+
given_answer.candidate_answer
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Barker
|
2
|
+
module Api
|
3
|
+
module Response
|
4
|
+
class GameShow < Base
|
5
|
+
|
6
|
+
extend Forwardable
|
7
|
+
def_delegators :game_show, :id, :game_show_id, :joker_ids, :jokers, :started_at, :finished_at, :aborted_at, :started?, :finished?, :aborted?, :running?, :stage, :round, :next_stage?, :next_round?
|
8
|
+
|
9
|
+
def candidates
|
10
|
+
game_show.candidates.map {|candidate| Response::Candidate.new(:candidate => candidate)}
|
11
|
+
end
|
12
|
+
|
13
|
+
def rounds
|
14
|
+
game_show.rounds.map {|round| Response::Round.new(:round => round)}
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_hash
|
18
|
+
{
|
19
|
+
'id' => id,
|
20
|
+
'game_show_id' => game_show_id,
|
21
|
+
'joker_ids' => joker_ids,
|
22
|
+
'jokers' => jokers.map(&:to_hash),
|
23
|
+
'started_at' => to_i(started_at),
|
24
|
+
'finished_at' => to_i(finished_at),
|
25
|
+
'aborted_at' => to_i(aborted_at),
|
26
|
+
'started?' => started?,
|
27
|
+
'finished?' => finished?,
|
28
|
+
'aborted?' => aborted?,
|
29
|
+
'running?' => running?,
|
30
|
+
'stage' => stage,
|
31
|
+
'round' => round,
|
32
|
+
'next_stage?' => next_stage?,
|
33
|
+
'next_round?' => next_round?,
|
34
|
+
'candidates' => candidates.map(&:to_hash),
|
35
|
+
'rounds' => rounds.map(&:to_hash),
|
36
|
+
'round_time' => round_time
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Barker
|
2
|
+
module Api
|
3
|
+
module Response
|
4
|
+
class Round < Base
|
5
|
+
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
def questions
|
9
|
+
round.candidate_questions.map{|candidate_question| Response::CandidateQuestion.new(:candidate_question => candidate_question) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_hash
|
13
|
+
{
|
14
|
+
'questions' => questions.map(&:to_hash)
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'barker/api/response/base'
|
2
|
+
require 'barker/api/response/error'
|
3
|
+
require 'barker/api/response/game_show'
|
4
|
+
require 'barker/api/response/round'
|
5
|
+
require 'barker/api/response/candidate'
|
6
|
+
require 'barker/api/response/candidate_question'
|
7
|
+
require 'barker/api/response/candidate_answer'
|
8
|
+
require 'barker/api/response/candidate_joker'
|
9
|
+
|
10
|
+
module Barker
|
11
|
+
module Api
|
12
|
+
module Response
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/barker/api.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
module Barker
|
2
|
+
class Candidate
|
3
|
+
|
4
|
+
include Errors
|
5
|
+
|
6
|
+
attr_accessor :id, :locale, :joined_at, :leaved_at, :aborted_at
|
7
|
+
|
8
|
+
def initialize(object)
|
9
|
+
raise HasToRespondToIdError unless object.respond_to?(:id)
|
10
|
+
raise HasToRespondToLocaleError unless object.respond_to?(:locale)
|
11
|
+
|
12
|
+
@id = object.id
|
13
|
+
@locale = object.locale.to_s
|
14
|
+
@joined_at = nil
|
15
|
+
@leaved_at = nil
|
16
|
+
@aborted_at = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def join
|
20
|
+
@joined_at = Time.now
|
21
|
+
end
|
22
|
+
|
23
|
+
def leave
|
24
|
+
@leaved_at = Time.now
|
25
|
+
end
|
26
|
+
|
27
|
+
def abort
|
28
|
+
@aborted_at = Time.now
|
29
|
+
end
|
30
|
+
|
31
|
+
def joined?
|
32
|
+
!!joined_at
|
33
|
+
end
|
34
|
+
|
35
|
+
def leaved?
|
36
|
+
!!leaved_at
|
37
|
+
end
|
38
|
+
|
39
|
+
def aborted?
|
40
|
+
!!aborted_at
|
41
|
+
end
|
42
|
+
|
43
|
+
def jokers
|
44
|
+
@jokers ||= []
|
45
|
+
end
|
46
|
+
|
47
|
+
def candidate_id
|
48
|
+
id
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Barker
|
2
|
+
class CandidateAnswer
|
3
|
+
|
4
|
+
attr_accessor :candidate, :answer, :reveal_answer
|
5
|
+
|
6
|
+
def initialize(candidate, answer)
|
7
|
+
@candidate = candidate
|
8
|
+
@answer = answer
|
9
|
+
@revealed = false
|
10
|
+
end
|
11
|
+
|
12
|
+
def valid?
|
13
|
+
answer.valid?
|
14
|
+
end
|
15
|
+
|
16
|
+
def label
|
17
|
+
answer.label[candidate.locale] || answer.label["en"]
|
18
|
+
end
|
19
|
+
|
20
|
+
def revealed?
|
21
|
+
@revealed
|
22
|
+
end
|
23
|
+
|
24
|
+
def reveal
|
25
|
+
@revealed = true
|
26
|
+
end
|
27
|
+
|
28
|
+
def correct?
|
29
|
+
answer.correct?
|
30
|
+
end
|
31
|
+
|
32
|
+
def answer_id
|
33
|
+
answer.id
|
34
|
+
end
|
35
|
+
alias :id :answer_id
|
36
|
+
|
37
|
+
def candidate_id
|
38
|
+
candidate.id
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Barker
|
2
|
+
class CandidateJoker
|
3
|
+
|
4
|
+
include Errors
|
5
|
+
|
6
|
+
attr_reader :used_at, :used_in
|
7
|
+
|
8
|
+
def initialize(candidate_question, joker)
|
9
|
+
@candidate_question = candidate_question
|
10
|
+
@joker = joker
|
11
|
+
end
|
12
|
+
|
13
|
+
def joker_id
|
14
|
+
@joker.id
|
15
|
+
end
|
16
|
+
alias :id :joker_id
|
17
|
+
|
18
|
+
def candidate_id
|
19
|
+
@candidate_question.candidate_id
|
20
|
+
end
|
21
|
+
|
22
|
+
def call
|
23
|
+
raise UnknownJokerError unless @joker
|
24
|
+
@used_at = Time.now
|
25
|
+
@used_in = @candidate_question
|
26
|
+
@joker.call(@used_in)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,116 @@
|
|
1
|
+
module Barker
|
2
|
+
class CandidateQuestion
|
3
|
+
|
4
|
+
include Errors
|
5
|
+
|
6
|
+
attr_reader :candidate, :question, :answers, :given_answer
|
7
|
+
attr_accessor :answered_at, :asked_at, :timer
|
8
|
+
|
9
|
+
def initialize(candidate, question, options = {})
|
10
|
+
@candidate = candidate
|
11
|
+
@question = question
|
12
|
+
@answers = question.answers.map { |answer| CandidateAnswer.new(candidate, answer) }
|
13
|
+
|
14
|
+
@given_answer = nil
|
15
|
+
@asked_at = nil
|
16
|
+
@answered_at = nil
|
17
|
+
@timer = options[:timer] || nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def ask(options = {})
|
21
|
+
if !asked? || options[:reset_timer]
|
22
|
+
@asked_at = Time.now
|
23
|
+
end
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def answer(answer_id)
|
28
|
+
raise AlreadyAnsweredError if answered?
|
29
|
+
raise AnswerNotFoundError unless @given_answer = answers.find {|answer| answer.id == answer_id }
|
30
|
+
@answered_at = Time.now
|
31
|
+
given_answer
|
32
|
+
end
|
33
|
+
|
34
|
+
def joker(joker)
|
35
|
+
raise JokerAlreadyUsedError if joker_played?(joker)
|
36
|
+
CandidateJoker.new(self, joker).tap do |candidate_joker|
|
37
|
+
candidate_joker.call
|
38
|
+
candidate.jokers << candidate_joker
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def valid?
|
43
|
+
question.valid? && timestamps? && asked_before_answered?
|
44
|
+
end
|
45
|
+
|
46
|
+
def open?
|
47
|
+
!asked? && !answered?
|
48
|
+
end
|
49
|
+
|
50
|
+
def asked?
|
51
|
+
!!asked_at
|
52
|
+
end
|
53
|
+
|
54
|
+
def answered?
|
55
|
+
!!answered_at
|
56
|
+
end
|
57
|
+
|
58
|
+
def correct?
|
59
|
+
!!given_answer.try(:correct?)
|
60
|
+
end
|
61
|
+
|
62
|
+
def wrong?
|
63
|
+
!correct?
|
64
|
+
end
|
65
|
+
|
66
|
+
def state
|
67
|
+
if open?
|
68
|
+
:open
|
69
|
+
elsif answered?
|
70
|
+
correct?? :correct : :wrong
|
71
|
+
elsif asked?
|
72
|
+
:asked
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def question_id
|
77
|
+
question.id
|
78
|
+
end
|
79
|
+
alias :id :question_id
|
80
|
+
|
81
|
+
def candidate_id
|
82
|
+
candidate.id
|
83
|
+
end
|
84
|
+
|
85
|
+
def label
|
86
|
+
question.label[candidate.locale] || question.label["en"]
|
87
|
+
end
|
88
|
+
|
89
|
+
def timeout?
|
90
|
+
timer.nil?? false : !(time_left.try(:>, 0))
|
91
|
+
end
|
92
|
+
|
93
|
+
def time_left
|
94
|
+
left = timer.try(:-, delay)
|
95
|
+
(left.try(:>=, 0))? left : 0
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def delay
|
101
|
+
(asked_at.try(:-, answered_at || Time.now) || 0).abs
|
102
|
+
end
|
103
|
+
|
104
|
+
def timestamps?
|
105
|
+
asked_at && answered_at
|
106
|
+
end
|
107
|
+
|
108
|
+
def asked_before_answered?
|
109
|
+
answered_at >= asked_at
|
110
|
+
end
|
111
|
+
|
112
|
+
def joker_played?(joker)
|
113
|
+
candidate.jokers.any? {|candidate_joker| candidate_joker.id == joker.id}
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Barker
|
2
|
+
class CandidateRound
|
3
|
+
attr_reader :candidate, :round, :guideline, :timer
|
4
|
+
|
5
|
+
def initialize(candidate, round, options = {})
|
6
|
+
@candidate = candidate
|
7
|
+
@round = round
|
8
|
+
@guideline = options[:guideline]
|
9
|
+
@timer = guideline.try(:round_time)
|
10
|
+
end
|
11
|
+
|
12
|
+
def question
|
13
|
+
@question ||= CandidateQuestion.new(candidate, round.question, :timer => timer)
|
14
|
+
end
|
15
|
+
|
16
|
+
def ask(options = {})
|
17
|
+
question.ask(options)
|
18
|
+
end
|
19
|
+
|
20
|
+
def answer(answer_id)
|
21
|
+
question.answer(answer_id)
|
22
|
+
end
|
23
|
+
|
24
|
+
def given_answer
|
25
|
+
question.given_answer
|
26
|
+
end
|
27
|
+
|
28
|
+
def joker(joker)
|
29
|
+
question.joker(joker)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,176 @@
|
|
1
|
+
module Barker
|
2
|
+
class GameShow
|
3
|
+
|
4
|
+
include Errors
|
5
|
+
|
6
|
+
attr_accessor :id
|
7
|
+
attr_reader :quizzes, :candidates, :guideline, :jokers, :guideline, :created_at, :started_at, :finished_at, :aborted_at
|
8
|
+
|
9
|
+
def initialize(quizzes, candidates, options = {})
|
10
|
+
@started_at = nil
|
11
|
+
@finished_at = nil
|
12
|
+
@aborted_at = nil
|
13
|
+
@created_at = Time.now
|
14
|
+
@stage = -1
|
15
|
+
@guideline = build_guideline(options[:guideline] || :base)
|
16
|
+
@quizzes = build_quizzes(quizzes)
|
17
|
+
@candidates = build_candidates(candidates)
|
18
|
+
@jokers = build_jokers
|
19
|
+
@stages = []
|
20
|
+
end
|
21
|
+
|
22
|
+
def ==(other)
|
23
|
+
created_at == other.created_at
|
24
|
+
end
|
25
|
+
|
26
|
+
def valid?
|
27
|
+
started? && stages.any? && candidates.any?
|
28
|
+
end
|
29
|
+
|
30
|
+
def game_show_id
|
31
|
+
id
|
32
|
+
end
|
33
|
+
|
34
|
+
# state
|
35
|
+
def start
|
36
|
+
@stages += quizzes.map { |quiz| Stage.new(quiz, candidates, :guideline => guideline) }
|
37
|
+
@started_at = Time.now unless started_at
|
38
|
+
end
|
39
|
+
|
40
|
+
def finish
|
41
|
+
@finished_at = Time.now unless finished_at
|
42
|
+
end
|
43
|
+
|
44
|
+
def abort
|
45
|
+
@aborted_at = Time.now unless aborted_at
|
46
|
+
end
|
47
|
+
|
48
|
+
def started?
|
49
|
+
!!started_at
|
50
|
+
end
|
51
|
+
|
52
|
+
def finished?
|
53
|
+
!!finished_at
|
54
|
+
end
|
55
|
+
|
56
|
+
def aborted?
|
57
|
+
!!aborted_at
|
58
|
+
end
|
59
|
+
|
60
|
+
def running?
|
61
|
+
started? && !finished? && !aborted?
|
62
|
+
end
|
63
|
+
|
64
|
+
# stage
|
65
|
+
def stages
|
66
|
+
raise NotStartedError unless started?
|
67
|
+
@stages
|
68
|
+
end
|
69
|
+
|
70
|
+
def current_stage
|
71
|
+
stage != -1 && @stages[stage]
|
72
|
+
end
|
73
|
+
|
74
|
+
def next_stage
|
75
|
+
@stage += 1
|
76
|
+
end
|
77
|
+
|
78
|
+
def next_stage?
|
79
|
+
!!@stages[stage + 1]
|
80
|
+
end
|
81
|
+
|
82
|
+
# round
|
83
|
+
def current_round
|
84
|
+
current_stage && current_stage.current_round || nil
|
85
|
+
end
|
86
|
+
|
87
|
+
def next_round
|
88
|
+
current_stage && current_stage.next_round || nil
|
89
|
+
end
|
90
|
+
|
91
|
+
def next_round?
|
92
|
+
current_stage && current_stage.next_round?
|
93
|
+
end
|
94
|
+
|
95
|
+
def join(candidate)
|
96
|
+
raise AlreadyStartedError if started?
|
97
|
+
candidate.join
|
98
|
+
@candidates ||= []
|
99
|
+
@candidates << candidate
|
100
|
+
candidate
|
101
|
+
end
|
102
|
+
|
103
|
+
def leave(candidate_id)
|
104
|
+
candidate = candidates.find {|candidate| candidate.id == candidate_id }
|
105
|
+
candidate.leave
|
106
|
+
candidate
|
107
|
+
end
|
108
|
+
|
109
|
+
def ask(candidate_id, options = {})
|
110
|
+
current_round.ask(candidate_id, options)
|
111
|
+
end
|
112
|
+
|
113
|
+
def answer(candidate_id, answer_id)
|
114
|
+
guideline.answer(current_round.candidate_round(candidate_id), candidate_id, answer_id)
|
115
|
+
current_round.answer(candidate_id, answer_id)
|
116
|
+
end
|
117
|
+
|
118
|
+
def given_answer(candidate_id)
|
119
|
+
current_round.given_answer(candidate_id)
|
120
|
+
end
|
121
|
+
|
122
|
+
def joker(candidate_id, joker_id)
|
123
|
+
joker = jokers.find{|joker| joker.id == joker_id }
|
124
|
+
candidate = candidates.find{|candidate| candidate.id == candidate.id }
|
125
|
+
current_round.joker(candidate, joker)
|
126
|
+
end
|
127
|
+
|
128
|
+
def joker_ids
|
129
|
+
jokers.map(&:id)
|
130
|
+
end
|
131
|
+
|
132
|
+
# NOTE: ignore stages for the moment - merge rounds from all stages together
|
133
|
+
def rounds
|
134
|
+
@stages.map{|stage| stage.rounds }.flatten
|
135
|
+
end
|
136
|
+
|
137
|
+
def self.load(serialized)
|
138
|
+
Marshal::load(Base64.decode64(serialized))
|
139
|
+
end
|
140
|
+
|
141
|
+
def serialize
|
142
|
+
Base64.encode64(Marshal::dump(self))
|
143
|
+
end
|
144
|
+
|
145
|
+
def stage
|
146
|
+
@stage
|
147
|
+
end
|
148
|
+
|
149
|
+
def round
|
150
|
+
current_stage && current_stage.try(:round_counter) || -1
|
151
|
+
end
|
152
|
+
|
153
|
+
def round_time
|
154
|
+
@guideline.round_time
|
155
|
+
end
|
156
|
+
|
157
|
+
private
|
158
|
+
|
159
|
+
def build_guideline(key)
|
160
|
+
"Barker::Guideline::#{key.to_s.classify}".constantize.new
|
161
|
+
end
|
162
|
+
|
163
|
+
def build_quizzes(quizzes)
|
164
|
+
(quizzes && quizzes.any?)? quizzes : guideline.quizzes
|
165
|
+
end
|
166
|
+
|
167
|
+
def build_candidates(candidates)
|
168
|
+
((candidates && candidates.any?)? candidates : guideline.candidates).map {|candidate| self.join(candidate) }
|
169
|
+
end
|
170
|
+
|
171
|
+
def build_jokers
|
172
|
+
guideline.jokers.map {|joker_key| Joker.new(joker_key) }
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Barker
|
2
|
+
module Guideline
|
3
|
+
class Base
|
4
|
+
|
5
|
+
include Errors
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
end
|
9
|
+
|
10
|
+
def quizzes
|
11
|
+
[]
|
12
|
+
end
|
13
|
+
|
14
|
+
def candidates
|
15
|
+
[]
|
16
|
+
end
|
17
|
+
|
18
|
+
def jokers
|
19
|
+
[]
|
20
|
+
end
|
21
|
+
|
22
|
+
def round_time
|
23
|
+
nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def answer(current_round, candidate_id, answer_id)
|
27
|
+
nil
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|