triviacrack 0.3.0 → 0.5.1

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: 92b5c77a56e170172762ed6a3c145743b913128803db0980fe500d23f355dfc8
4
- data.tar.gz: 64e7b4d9ca31159378e038bcd5892a8caed86f053ad0550ac026d1d74ca6bad8
3
+ metadata.gz: '0498c4a4b88170d5974faab06d1f49c7c3b5235ab6d4224b7b82a95c019d0026'
4
+ data.tar.gz: a4dd24a8012cf642a970d95170f89f30523f0ab684d1d02278e78124dbbf5d1d
5
5
  SHA512:
6
- metadata.gz: 5ab48a4eb4d28486d4a898bea402ece598b3643e0dad5ca2f19eddc35bbadf3a7aac55ac181d21949a88ea0bb18ccfeb9064ee63eb5231247c46f06e8cd94f15
7
- data.tar.gz: ca05c593330b0b7ddad16214c3bedc8c3e211d0eba02004f17447832f09ae083fe5117e151fab833818b872e358bc350e3634c61ccb4e67fa63881542469df97
6
+ metadata.gz: a9afae76cf81e4b70b60e41ec26e8c472ec243b5b8e306c1940c5bd14d2ce7749e13ed5b70ba016804021f7ce6b1c72c0248a72460cb1d363db14621adfd27e5
7
+ data.tar.gz: cb80258751e28d76cc0fa3aac24512afbaa290be20eff2850687d95ec46f8b576cb7247570d7c01380771cc717af946708591ee49a155185d9f7f70a699a1f92
@@ -17,7 +17,7 @@ jobs:
17
17
 
18
18
  - uses: actions/setup-ruby@v1
19
19
  with:
20
- ruby-version: 2.6.5
20
+ ruby-version: 3.0.2
21
21
 
22
22
  - name: Bundle Install
23
23
  run: |
@@ -0,0 +1,40 @@
1
+ name: Publish
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - uses: actions/checkout@v1
14
+
15
+ - uses: actions/setup-ruby@v1
16
+ with:
17
+ ruby-version: 3.0.2
18
+
19
+ - name: Bundle Install
20
+ run: |
21
+ gem install bundler
22
+ bundle install --jobs 4 --retry 3
23
+
24
+ - name: Run RSpec and Code Coverage
25
+ uses: paambaati/codeclimate-action@v2.4.0
26
+ env:
27
+ CC_TEST_REPORTER_ID: 79d8e81f3c0ccfce30d983b4454d2f042d2883fa64b23527c3a94587930b37be
28
+ with:
29
+ coverageCommand: bundle exec rspec
30
+
31
+ - name: Publish to RubyGems
32
+ run: |
33
+ mkdir -p $HOME/.gem
34
+ touch $HOME/.gem/credentials
35
+ chmod 0600 $HOME/.gem/credentials
36
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
37
+ gem build *.gemspec
38
+ gem push *.gem
39
+ env:
40
+ GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}
data/.gitignore CHANGED
@@ -1,6 +1,5 @@
1
1
  /.bundle/
2
2
  /.yardoc
3
- /Gemfile.lock
4
3
  /_yardoc/
5
4
  /coverage/
6
5
  /doc/
@@ -12,3 +11,4 @@
12
11
  *.o
13
12
  *.a
14
13
  mkmf.log
14
+ *.gem
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.0.2
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- #ruby=ruby-2.6.5
1
+ #ruby=ruby-3.0.2
2
2
  #ruby-gemset=triviacrack
3
3
 
4
4
  source 'https://rubygems.org'
data/Gemfile.lock ADDED
@@ -0,0 +1,76 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ triviacrack (0.5.1)
5
+ faraday (~> 1.7.2)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ diff-lcs (1.4.4)
11
+ docile (1.4.0)
12
+ faraday (1.7.2)
13
+ faraday-em_http (~> 1.0)
14
+ faraday-em_synchrony (~> 1.0)
15
+ faraday-excon (~> 1.1)
16
+ faraday-httpclient (~> 1.0.1)
17
+ faraday-net_http (~> 1.0)
18
+ faraday-net_http_persistent (~> 1.1)
19
+ faraday-patron (~> 1.0)
20
+ faraday-rack (~> 1.0)
21
+ multipart-post (>= 1.2, < 3)
22
+ ruby2_keywords (>= 0.0.4)
23
+ faraday-em_http (1.0.0)
24
+ faraday-em_synchrony (1.0.0)
25
+ faraday-excon (1.1.0)
26
+ faraday-httpclient (1.0.1)
27
+ faraday-net_http (1.0.1)
28
+ faraday-net_http_persistent (1.2.0)
29
+ faraday-patron (1.0.0)
30
+ faraday-rack (1.0.0)
31
+ fuubar (2.5.1)
32
+ rspec-core (~> 3.0)
33
+ ruby-progressbar (~> 1.4)
34
+ json (2.5.1)
35
+ multipart-post (2.1.1)
36
+ rake (13.0.6)
37
+ rspec (3.10.0)
38
+ rspec-core (~> 3.10.0)
39
+ rspec-expectations (~> 3.10.0)
40
+ rspec-mocks (~> 3.10.0)
41
+ rspec-core (3.10.1)
42
+ rspec-support (~> 3.10.0)
43
+ rspec-expectations (3.10.1)
44
+ diff-lcs (>= 1.2.0, < 2.0)
45
+ rspec-support (~> 3.10.0)
46
+ rspec-its (1.3.0)
47
+ rspec-core (>= 3.0.0)
48
+ rspec-expectations (>= 3.0.0)
49
+ rspec-mocks (3.10.2)
50
+ diff-lcs (>= 1.2.0, < 2.0)
51
+ rspec-support (~> 3.10.0)
52
+ rspec-support (3.10.2)
53
+ ruby-progressbar (1.11.0)
54
+ ruby2_keywords (0.0.5)
55
+ simplecov (0.21.2)
56
+ docile (~> 1.1)
57
+ simplecov-html (~> 0.11)
58
+ simplecov_json_formatter (~> 0.1)
59
+ simplecov-html (0.12.3)
60
+ simplecov_json_formatter (0.1.3)
61
+
62
+ PLATFORMS
63
+ ruby
64
+
65
+ DEPENDENCIES
66
+ bundler (~> 2.2.27)
67
+ fuubar (~> 2.5.1)
68
+ json (~> 2.5.1)
69
+ rake (~> 13.0.6)
70
+ rspec (~> 3.10.0)
71
+ rspec-its (~> 1.3.0)
72
+ simplecov (~> 0.21.2)
73
+ triviacrack!
74
+
75
+ BUNDLED WITH
76
+ 2.2.27
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Triviacrack ![CI](https://github.com/davidkus/triviacrack/workflows/CI/badge.svg) [![Code Climate](https://codeclimate.com/github/davidkus/triviacrack/badges/gpa.svg)](https://codeclimate.com/github/davidkus/triviacrack) [![Test Coverage](https://codeclimate.com/github/davidkus/triviacrack/badges/coverage.svg)](https://codeclimate.com/github/davidkus/triviacrack)
1
+ # Triviacrack [![Gem Version](https://badge.fury.io/rb/triviacrack.svg)](https://badge.fury.io/rb/triviacrack) ![CI](https://github.com/davidkus/triviacrack/workflows/CI/badge.svg) [![Code Climate](https://codeclimate.com/github/davidkus/triviacrack/badges/gpa.svg)](https://codeclimate.com/github/davidkus/triviacrack) [![Test Coverage](https://codeclimate.com/github/davidkus/triviacrack/badges/coverage.svg)](https://codeclimate.com/github/davidkus/triviacrack)
2
2
 
3
3
  A Ruby interface for the Trivia Crack API.
4
4
 
@@ -1,4 +1,4 @@
1
- require "unirest"
1
+ require "faraday"
2
2
 
3
3
  require "triviacrack/errors/request_error"
4
4
 
@@ -13,10 +13,10 @@ module TriviaCrack
13
13
  # url - The URL of the TriviaCrack API resource.
14
14
  # parameters - The parameters to send with the request.
15
15
  #
16
- # Returns a Unirest Response object with the server's response.
16
+ # Returns a Faraday Response object with the server's response.
17
17
  # Raises TriviaCrack:Errors::RequestError if the request fails.
18
18
  def get(url, parameters: nil)
19
- response = Unirest.get "#{API_HOST}#{url}", parameters: parameters,
19
+ response = Faraday.get "#{API_HOST}#{url}", params: parameters,
20
20
  headers: default_headers
21
21
 
22
22
  check_response url, response
@@ -28,10 +28,10 @@ module TriviaCrack
28
28
  # url - The URL of the TriviaCrack API resource.
29
29
  # parameters - The parameters to send with the request.
30
30
  #
31
- # Returns a Unirest Response object with the server's response.
31
+ # Returns a Faraday Response object with the server's response.
32
32
  # Raises TriviaCrack:Errors::RequestError if the request fails.
33
33
  def post(url, parameters: nil)
34
- response = Unirest.post "#{API_HOST}#{url}", parameters: parameters,
34
+ response = Faraday.post "#{API_HOST}#{url}", body: parameters,
35
35
  headers: default_headers
36
36
 
37
37
  check_response url, response
@@ -59,14 +59,14 @@ module TriviaCrack
59
59
  # Internal: Checks the response's code to see if the request was
60
60
  # successful
61
61
  #
62
- # response - Unirest response returned by the API.
62
+ # response - Faraday response returned by the API.
63
63
  #
64
64
  # Returns the response object.
65
65
  # Raises TriviaCrack:Errors::RequestError if the request failed.
66
66
  def check_response(url, response)
67
- if not response.code.between? 200, 299
68
- raise TriviaCrack::Errors::RequestError.new(response.code, url, response.body),
69
- "Request to #{API_HOST}#{url} failed with code #{response.code}."
67
+ if not response.status.between? 200, 299
68
+ raise TriviaCrack::Errors::RequestError.new(response.status, url, response.body),
69
+ "Request to #{API_HOST}#{url} failed with code #{response.status}."
70
70
  end
71
71
 
72
72
  response
@@ -62,7 +62,7 @@ module TriviaCrack
62
62
  # Raises TriviaCrack::Errors::RequestError if the request fails
63
63
  def start_new_game
64
64
  response = post "/api/users/#{@session.user_id}/games",
65
- parameters: { language: "EN" }.to_json
65
+ parameters: { language: "EN" }.to_s
66
66
 
67
67
  TriviaCrack::Parsers::GameParser.parse response.body
68
68
  end
@@ -25,7 +25,7 @@ module TriviaCrack
25
25
  response = post "/api/login", parameters: { email: email,
26
26
  password: password,
27
27
  language: "en"
28
- }.to_json
28
+ }.to_s
29
29
 
30
30
  @session = TriviaCrack::Parsers::SessionParser.parse response.body
31
31
  end
@@ -11,7 +11,7 @@ module TriviaCrack
11
11
 
12
12
  # Public: Uses the Trivia Crack API to answer the given question.
13
13
  #
14
- # game - The ID of the TriviaCrack::Game.
14
+ # game_id - The ID of the TriviaCrack::Game.
15
15
  # question - The TriviaCrack::Question.
16
16
  # answer - The index of the answer to be submitted.
17
17
  #
@@ -31,13 +31,54 @@ module TriviaCrack
31
31
  answer: answer,
32
32
  category: question.category.upcase
33
33
  }]
34
- }.to_json
34
+ }.to_s
35
35
 
36
36
  game = TriviaCrack::Parsers::GameParser.parse response.body
37
37
 
38
38
  [game, answer == question.correct_answer]
39
39
  end
40
40
 
41
+ # Public: Uses the Trivia Crack API to answer duel questions for the game.
42
+ #
43
+ # game_id - The ID of the TriviaCrack::Game.
44
+ # questions - The array of TriviaCrack::Question to answer
45
+ # answer_map - Hash of question ID / answer indices.
46
+ #
47
+ # Examples
48
+ #
49
+ # answers = {}
50
+ # for question in game.questions do
51
+ # answers[question.id] = <some answer index> // 0, 1, 2 or 3
52
+ # end
53
+ # answer_questions game.id, game.questions, answers
54
+ #
55
+ # Returns the update TriviaCrack::Game object, as well as a map
56
+ # with an entry for each question ID and a boolean indicating if
57
+ # the question was answered successfully.
58
+ # Raises TriviaCrack::Errors::RequestError if the request fails
59
+ def answer_questions(game_id, questions, answer_map)
60
+ answers = []
61
+ correct_answers = {}
62
+
63
+ for question in questions do
64
+ answer = {
65
+ id: question.id,
66
+ answer: answer_map[question.id],
67
+ category: question.category.upcase
68
+ }
69
+ answers << answer
70
+ correct_answers[question.id] = answer_map[question.id] == question.correct_answer
71
+ end
72
+
73
+ response =
74
+ post "/api/users/#{@session.user_id}/games/#{game_id}/answers",
75
+ parameters: { type: questions.first.type.upcase, answers: answers }.to_s
76
+
77
+ game = TriviaCrack::Parsers::GameParser.parse response.body
78
+
79
+ [game, correct_answers]
80
+ end
81
+
41
82
  end
42
83
  end
43
84
  end
@@ -21,6 +21,7 @@ module TriviaCrack
21
21
  def initialize(code, url, body)
22
22
  @code = code
23
23
  @url = url
24
+ @body = body
24
25
  end
25
26
  end
26
27
  end
@@ -31,6 +31,12 @@ module TriviaCrack
31
31
  question = TriviaCrack::Parsers::QuestionParser.parse q_data
32
32
  questions << question
33
33
  end
34
+ if raw_data["spins_data"]["spins"][0]["type"] == "DUEL"
35
+ q_data = raw_data["spins_data"]["spins"][0]["tie_break_question"]
36
+ q_data["type"] = raw_data["spins_data"]["spins"][0]["type"]
37
+ question = TriviaCrack::Parsers::QuestionParser.parse q_data
38
+ questions << question
39
+ end
34
40
  end
35
41
 
36
42
  if raw_data["available_crowns"]
@@ -1,4 +1,4 @@
1
1
  # Public: The version of this gem.
2
2
  module TriviaCrack
3
- VERSION = "0.3.0"
3
+ VERSION = "0.5.1"
4
4
  end
@@ -5,10 +5,10 @@ describe TriviaCrack::API::Game do
5
5
  let(:session) { TriviaCrack::Session.new session_id: "session", user_id: 1 }
6
6
  let(:client) { (Class.new(APIStub) { include TriviaCrack::API::Game }).new session }
7
7
 
8
- let(:response) { double(code: code, body: raw_data) }
8
+ let(:response) { double(status: code, body: raw_data) }
9
9
 
10
- before { allow(Unirest).to receive(:get) { response } }
11
- before { allow(Unirest).to receive(:post) { response } }
10
+ before { allow(Faraday).to receive(:get) { response } }
11
+ before { allow(Faraday).to receive(:post) { response } }
12
12
 
13
13
  describe "#get_games" do
14
14
 
@@ -4,9 +4,9 @@ describe TriviaCrack::API::Login do
4
4
 
5
5
  let(:client) { (Class.new(APIStub) { include TriviaCrack::API::Login }).new }
6
6
 
7
- let(:response) { double(code: code, body: raw_data) }
7
+ let(:response) { double(status: code, body: raw_data) }
8
8
 
9
- before { allow(Unirest).to receive(:post) { response } }
9
+ before { allow(Faraday).to receive(:post) { response } }
10
10
 
11
11
  describe "#login" do
12
12
 
@@ -5,9 +5,9 @@ describe TriviaCrack::API::Profile do
5
5
  let(:session) { TriviaCrack::Session.new session_id: "session", user_id: 1 }
6
6
  let(:client) { (Class.new(APIStub) { include TriviaCrack::API::Profile }).new session }
7
7
 
8
- let(:response) { double(code: code, body: raw_data) }
8
+ let(:response) { double(status: code, body: raw_data) }
9
9
 
10
- before { allow(Unirest).to receive(:get) { response } }
10
+ before { allow(Faraday).to receive(:get) { response } }
11
11
 
12
12
  describe "#get_profile" do
13
13
  let(:user_id) { 111 }
@@ -5,9 +5,9 @@ describe TriviaCrack::API::Question do
5
5
  let(:session) { TriviaCrack::Session.new session_id: "session", user_id: 1 }
6
6
  let(:client) { (Class.new(APIStub) { include TriviaCrack::API::Question }).new session }
7
7
 
8
- let(:response) { double(code: code, body: raw_data) }
8
+ let(:response) { double(status: code, body: raw_data) }
9
9
 
10
- before { allow(Unirest).to receive(:post) { response } }
10
+ before { allow(Faraday).to receive(:post) { response } }
11
11
 
12
12
  describe "#answer_question" do
13
13
 
@@ -17,7 +17,7 @@ describe TriviaCrack::API::Question do
17
17
  let(:question) { double(id: 1, correct_answer: 1, type: "NORMAL", category: "SPORTS") }
18
18
  let(:game_id) { 22 }
19
19
 
20
- context 'given that the question was answer correctly' do
20
+ context 'given that the question was answered correctly' do
21
21
  let(:code) { 200 }
22
22
  let(:answer) { 1 }
23
23
 
@@ -26,7 +26,7 @@ describe TriviaCrack::API::Question do
26
26
  it { expect(subject[1]).to be true }
27
27
  end
28
28
 
29
- context 'given that the question was answer incorrectly' do
29
+ context 'given that the question was answered incorrectly' do
30
30
  let(:code) { 200 }
31
31
  let(:answer) { 0 }
32
32
 
@@ -46,4 +46,46 @@ describe TriviaCrack::API::Question do
46
46
  .and having_attributes(url: "/api/users/#{session.user_id}/games/#{game_id}/answers")) }
47
47
  end
48
48
  end
49
+
50
+ describe "#answer_questions" do
51
+
52
+ subject { client.answer_questions game_id, questions, answers }
53
+
54
+ let(:raw_data) { SpecData.get "answer.json" }
55
+ let(:question_one) { double(id: 1, correct_answer: 1, type: "DUEL", category: "SPORTS") }
56
+ let(:question_two) { double(id: 2, correct_answer: 2, type: "DUEL", category: "ART") }
57
+ let(:questions) { [question_one, question_two] }
58
+ let(:game_id) { 22 }
59
+
60
+ context 'given that the questions were answered correctly' do
61
+ let(:code) { 200 }
62
+ let(:answers) { {1 => 1, 2 => 2} }
63
+
64
+ it { expect(TriviaCrack::Parsers::GameParser).to receive(:parse).once; subject }
65
+ it { expect(subject[0]).to be_a TriviaCrack::Game }
66
+ it { expect(subject[1][1]).to be true }
67
+ it { expect(subject[1][2]).to be true }
68
+ end
69
+
70
+ context 'given that a question was answered incorrectly' do
71
+ let(:code) { 200 }
72
+ let(:answers) { {1 => 1, 2 => 3} }
73
+
74
+ it { expect(TriviaCrack::Parsers::GameParser).to receive(:parse).once; subject }
75
+ it { expect(subject[0]).to be_a TriviaCrack::Game }
76
+ it { expect(subject[1][1]).to be true }
77
+ it { expect(subject[1][2]).to be false }
78
+ end
79
+
80
+ context 'given that the request fails' do
81
+ let(:code) { 400 }
82
+ let(:answers) { {1 => 1, 2 => 2} }
83
+
84
+ it { expect{ subject }.to raise_error TriviaCrack::Errors::RequestError }
85
+ it { expect{ subject }.to raise_error(an_instance_of(TriviaCrack::Errors::RequestError)
86
+ .and having_attributes(code: code)) }
87
+ it { expect{ subject }.to raise_error(an_instance_of(TriviaCrack::Errors::RequestError)
88
+ .and having_attributes(url: "/api/users/#{session.user_id}/games/#{game_id}/answers")) }
89
+ end
90
+ end
49
91
  end
@@ -5,9 +5,9 @@ describe TriviaCrack::API::User do
5
5
  let(:session) { TriviaCrack::Session.new session_id: "session", user_id: 1 }
6
6
  let(:client) { (Class.new(APIStub) { include TriviaCrack::API::User }).new session }
7
7
 
8
- let(:response) { double(code: code, body: raw_data) }
8
+ let(:response) { double(status: code, body: raw_data) }
9
9
 
10
- before { allow(Unirest).to receive(:get) { response } }
10
+ before { allow(Faraday).to receive(:get) { response } }
11
11
 
12
12
  describe "#get_user_id" do
13
13
  let(:username) { "example.2" }
@@ -0,0 +1,336 @@
1
+ {
2
+ "id": 1119,
3
+ "safeOpponentSelectionType": "RANDOM",
4
+ "spins_data": {
5
+ "spins": [
6
+ {
7
+ "type": "DUEL",
8
+ "second_chance_available": false,
9
+ "questions": [
10
+ {
11
+ "question": {
12
+ "id": 17881223,
13
+ "category": "HISTORY",
14
+ "text": "The Suffrage movement pertained to what?",
15
+ "answers": [
16
+ "Prohibition",
17
+ "Racial Equality",
18
+ "Women's Rights",
19
+ "Right To Unionize"
20
+ ],
21
+ "correct_answer": 2,
22
+ "media_type": "NORMAL",
23
+ "author": {
24
+ "id": 82565321,
25
+ "name": "anniesparkles",
26
+ "username": "anniesparkles",
27
+ "fb_show_picture": false,
28
+ "fb_show_name": false,
29
+ "gender": "UNSPECIFIED"
30
+ }
31
+ }
32
+ },
33
+ {
34
+ "question": {
35
+ "id": 53333638,
36
+ "category": "GEOGRAPHY",
37
+ "text": "Where is Slovakia?",
38
+ "answers": [
39
+ "Oceania",
40
+ "Africa",
41
+ "Europe",
42
+ "Asia"
43
+ ],
44
+ "correct_answer": 2,
45
+ "media_type": "NORMAL",
46
+ "author": {
47
+ "id": 204000197,
48
+ "name": "martingres",
49
+ "username": "martingres",
50
+ "fb_show_picture": false,
51
+ "fb_show_name": false,
52
+ "gender": "UNSPECIFIED"
53
+ }
54
+ }
55
+ },
56
+ {
57
+ "question": {
58
+ "id": 62181053,
59
+ "category": "ARTS",
60
+ "text": "Who has painted the Sistine Chapel?",
61
+ "answers": [
62
+ "Michelangelo",
63
+ "Van Gogh",
64
+ "Picasso",
65
+ "Mezzosin"
66
+ ],
67
+ "correct_answer": 0,
68
+ "media_type": "NORMAL",
69
+ "author": {
70
+ "id": 223909199,
71
+ "facebook_id": "843171349124950",
72
+ "name": "Kristina Marie Poulsen",
73
+ "username": "kp89facebook",
74
+ "facebook_name": "Kristina Marie Poulsen",
75
+ "fb_show_picture": true,
76
+ "fb_show_name": true,
77
+ "gender": "female"
78
+ },
79
+ "translator": {
80
+ "id": 252287897,
81
+ "name": "ragingraids",
82
+ "username": "ragingraids",
83
+ "fb_show_picture": false,
84
+ "fb_show_name": false,
85
+ "gender": "UNSPECIFIED"
86
+ }
87
+ }
88
+ },
89
+ {
90
+ "question": {
91
+ "id": 51360542,
92
+ "category": "SPORTS",
93
+ "text": "What two Allstars have the number of 23?",
94
+ "answers": [
95
+ "Steph Curry And Blake Griffen",
96
+ "Lebron James And Michael Jordan",
97
+ "Chris Paul And Jr Smith",
98
+ "Clay Thompson And Kevin Love"
99
+ ],
100
+ "correct_answer": 1,
101
+ "media_type": "NORMAL",
102
+ "author": {
103
+ "id": 200488852,
104
+ "name": "mitchelldonegan06",
105
+ "username": "mitchelldonegan06",
106
+ "fb_show_picture": false,
107
+ "fb_show_name": false,
108
+ "gender": "UNSPECIFIED"
109
+ }
110
+ }
111
+ },
112
+ {
113
+ "question": {
114
+ "id": 11817577,
115
+ "category": "ENTERTAINMENT",
116
+ "text": "Which pop star calls her fans \"Monsters\"?",
117
+ "answers": [
118
+ "Madonna",
119
+ "Lady Gaga",
120
+ "Britney Spears",
121
+ "Christina Aguilera"
122
+ ],
123
+ "correct_answer": 1,
124
+ "media_type": "NORMAL",
125
+ "author": {
126
+ "id": 51771646,
127
+ "facebook_id": "",
128
+ "name": "linda.tsacalides",
129
+ "username": "linda.tsacalides",
130
+ "facebook_name": "UNSPECIFIED",
131
+ "fb_show_picture": false,
132
+ "fb_show_name": false,
133
+ "gender": "female"
134
+ }
135
+ }
136
+ },
137
+ {
138
+ "question": {
139
+ "id": 54733278,
140
+ "category": "SCIENCE",
141
+ "text": "Which is NOT a blood type?",
142
+ "answers": [
143
+ "Ab",
144
+ "Oa",
145
+ "O",
146
+ "B"
147
+ ],
148
+ "correct_answer": 1,
149
+ "media_type": "NORMAL",
150
+ "author": {
151
+ "id": 114837290,
152
+ "name": "rocat26",
153
+ "username": "rocat26",
154
+ "fb_show_picture": false,
155
+ "fb_show_name": false,
156
+ "gender": "female"
157
+ }
158
+ }
159
+ }
160
+ ],
161
+ "tie_break_question": {
162
+ "id": 51774,
163
+ "category": "HISTORY",
164
+ "text": "Which historical figure is famous for being short?",
165
+ "answers": [
166
+ "Napoleon",
167
+ "Stalin",
168
+ "Bismark",
169
+ "Julius Caesar"
170
+ ],
171
+ "correct_answer": 0,
172
+ "media_type": "NORMAL",
173
+ "author": {
174
+ "id": 23831917,
175
+ "facebook_id": "100006890463075",
176
+ "name": "Igor Gardella Trifunovic",
177
+ "username": "kider.jo",
178
+ "facebook_name": "Igor Gardella Trifunovic",
179
+ "fb_show_picture": true,
180
+ "fb_show_name": true,
181
+ "gender": "UNSPECIFIED"
182
+ },
183
+ "translator": {
184
+ "id": 100940141,
185
+ "facebook_id": "100002352524111",
186
+ "name": "Abigail Morgan",
187
+ "username": "almangel21",
188
+ "facebook_name": "Abigail Morgan",
189
+ "fb_show_picture": true,
190
+ "fb_show_name": true,
191
+ "gender": "female"
192
+ }
193
+ }
194
+ }
195
+ ]
196
+ },
197
+ "available_crowns": [
198
+ "SCIENCE",
199
+ "HISTORY",
200
+ "ENTERTAINMENT",
201
+ "SPORTS"
202
+ ],
203
+ "my_player_number": 1,
204
+ "player_one": {
205
+ "charges": 3,
206
+ "crowns": [
207
+ "GEOGRAPHY",
208
+ "ARTS"
209
+ ]
210
+ },
211
+ "player_two": {
212
+ "charges": 0,
213
+ "crowns": [
214
+ "SCIENCE"
215
+ ]
216
+ },
217
+ "round_number": 2,
218
+ "crown_events": [
219
+ {
220
+ "timestamp": 1583628928756,
221
+ "userId": 123,
222
+ "category": "SCIENCE",
223
+ "won": true
224
+ }
225
+ ],
226
+ "sub_status": "P1_PLAYING_TURN",
227
+ "previous_sub_status": "P1_PLAYING_TURN",
228
+ "statistics": {
229
+ "player_one_statistics": {
230
+ "category_questions": [
231
+ {
232
+ "category": "HISTORY",
233
+ "correct": 1,
234
+ "incorrect": 0,
235
+ "worst": false
236
+ },
237
+ {
238
+ "category": "SCIENCE",
239
+ "correct": 2,
240
+ "incorrect": 0,
241
+ "worst": false
242
+ },
243
+ {
244
+ "category": "ARTS",
245
+ "correct": 3,
246
+ "incorrect": 0,
247
+ "worst": false
248
+ },
249
+ {
250
+ "category": "ENTERTAINMENT",
251
+ "correct": 0,
252
+ "incorrect": 1,
253
+ "worst": true,
254
+ "performance": 0
255
+ },
256
+ {
257
+ "category": "SPORTS",
258
+ "correct": 2,
259
+ "incorrect": 0,
260
+ "worst": false
261
+ },
262
+ {
263
+ "category": "GEOGRAPHY",
264
+ "correct": 1,
265
+ "incorrect": 0,
266
+ "worst": false
267
+ }
268
+ ],
269
+ "correct_answers": 9,
270
+ "incorrect_answers": 1,
271
+ "challenges_won": 0,
272
+ "questions_answered": 10,
273
+ "crowns_won": 2
274
+ },
275
+ "player_two_statistics": {
276
+ "category_questions": [
277
+ {
278
+ "category": "HISTORY",
279
+ "correct": 0,
280
+ "incorrect": 1,
281
+ "worst": false
282
+ },
283
+ {
284
+ "category": "SCIENCE",
285
+ "correct": 1,
286
+ "incorrect": 0,
287
+ "worst": false
288
+ }
289
+ ],
290
+ "correct_answers": 1,
291
+ "incorrect_answers": 1,
292
+ "challenges_won": 0,
293
+ "questions_answered": 2,
294
+ "crowns_won": 1
295
+ }
296
+ },
297
+ "is_random": true,
298
+ "unread_messages": 0,
299
+ "last_turn": "03/07/2020 19:56:48 EST",
300
+ "status_version": 13,
301
+ "my_level_data": {
302
+ "level": 16,
303
+ "points": 152,
304
+ "goal_points": 168,
305
+ "progress": 11,
306
+ "level_up": true
307
+ },
308
+ "opponent_selection_type": "RANDOM",
309
+ "nudge_available": false,
310
+ "opponent": {
311
+ "id": 321,
312
+ "alerts_count": 0,
313
+ "username": "aaa",
314
+ "facebook_id": "123",
315
+ "facebookId": {
316
+ "value": "",
317
+ "defined": false
318
+ },
319
+ "facebook_name": "a b",
320
+ "fb_show_picture": true,
321
+ "fb_show_name": true,
322
+ "allow_og_posts": true,
323
+ "photo_url": "",
324
+ "level_data": {
325
+ "level": 6
326
+ },
327
+ "is_friend": false,
328
+ "league_name": "APPRENTICE_1"
329
+ },
330
+ "game_status": "ACTIVE",
331
+ "language": "EN",
332
+ "created": "03/07/2020 19:30:03 EST",
333
+ "type": "NORMAL",
334
+ "my_turn": true,
335
+ "expiration_date": "03/09/2020 07:56:48 EST"
336
+ }
@@ -110,5 +110,31 @@ describe TriviaCrack::Parsers::GameParser do
110
110
  its(:my_statistics) { is_expected.to be_a TriviaCrack::GameStatistics }
111
111
  its(:opponent_statistics) { is_expected.to be_a TriviaCrack::GameStatistics }
112
112
  end
113
+
114
+ context 'when given data from the games API and the game is a duel' do
115
+ let(:raw_data) { SpecData.get "game_duel.json" }
116
+
117
+ it { is_expected.to be_a TriviaCrack::Game }
118
+ its(:id) { is_expected.to be 1119 }
119
+ its(:opponent) { is_expected.to be_a TriviaCrack::User }
120
+ its('opponent.id') { is_expected.to be 321 }
121
+ its(:game_status) { is_expected.to be :active }
122
+ its(:language) { is_expected.to be :en }
123
+ its(:created) { is_expected.to be_a Time }
124
+ its(:last_turn) { is_expected.to be_a Time }
125
+ its(:type) { is_expected.to be :normal }
126
+ its(:expiration_date) { is_expected.to be_a Time }
127
+ its(:my_turn) { is_expected.to be true }
128
+ its(:round_number) { is_expected.to be 2 }
129
+ its(:is_random) { is_expected.to be true }
130
+ its(:unread_messages) { is_expected.to be 0 }
131
+ its(:status_version) { is_expected.to be 13 }
132
+ its(:available_crowns) { is_expected.to contain_exactly(:entertainment, :science, :history, :sports) }
133
+ its('questions.size') { is_expected.to eq(7) }
134
+ its('questions.first') { is_expected.to be_a TriviaCrack::Question }
135
+ its('questions.first.id') { is_expected.to be 17881223 }
136
+ its(:my_statistics) { is_expected.to be_a TriviaCrack::GameStatistics }
137
+ its(:opponent_statistics) { is_expected.to be_a TriviaCrack::GameStatistics }
138
+ end
113
139
  end
114
140
  end
data/triviacrack.gemspec CHANGED
@@ -18,13 +18,15 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 2.1.4"
22
- spec.add_development_dependency "simplecov", "~> 0.17.1"
23
- spec.add_development_dependency "rake", "~> 13.0.1"
24
- spec.add_development_dependency "rspec", "~> 3.9.0"
21
+ spec.required_ruby_version = ">= 2.0"
22
+
23
+ spec.add_development_dependency "bundler", "~> 2.2.27"
24
+ spec.add_development_dependency "simplecov", "~> 0.21.2"
25
+ spec.add_development_dependency "rake", "~> 13.0.6"
26
+ spec.add_development_dependency "rspec", "~> 3.10.0"
25
27
  spec.add_development_dependency "rspec-its", "~> 1.3.0"
26
- spec.add_development_dependency "json", "~> 2.3.0"
27
- spec.add_development_dependency "fuubar", "~> 2.5.0"
28
+ spec.add_development_dependency "json", "~> 2.5.1"
29
+ spec.add_development_dependency "fuubar", "~> 2.5.1"
28
30
 
29
- spec.add_dependency "unirest-2x", "~> 1.1.3"
31
+ spec.add_dependency "faraday", "~> 1.7.2"
30
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: triviacrack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Kus
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-06 00:00:00.000000000 Z
11
+ date: 2021-09-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,56 +16,56 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.1.4
19
+ version: 2.2.27
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.1.4
26
+ version: 2.2.27
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: simplecov
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.17.1
33
+ version: 0.21.2
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.17.1
40
+ version: 0.21.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 13.0.1
47
+ version: 13.0.6
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 13.0.1
54
+ version: 13.0.6
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 3.9.0
61
+ version: 3.10.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 3.9.0
68
+ version: 3.10.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec-its
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -86,42 +86,42 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 2.3.0
89
+ version: 2.5.1
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 2.3.0
96
+ version: 2.5.1
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: fuubar
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 2.5.0
103
+ version: 2.5.1
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 2.5.0
110
+ version: 2.5.1
111
111
  - !ruby/object:Gem::Dependency
112
- name: unirest-2x
112
+ name: faraday
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 1.1.3
117
+ version: 1.7.2
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 1.1.3
124
+ version: 1.7.2
125
125
  description: A Ruby interface to the Trivia Crack API.
126
126
  email:
127
127
  - david@kus.dk
@@ -130,9 +130,12 @@ extensions: []
130
130
  extra_rdoc_files: []
131
131
  files:
132
132
  - ".github/workflows/ci.yml"
133
+ - ".github/workflows/publish.yml"
133
134
  - ".gitignore"
134
135
  - ".rspec"
136
+ - ".ruby-version"
135
137
  - Gemfile
138
+ - Gemfile.lock
136
139
  - LICENSE.txt
137
140
  - README.md
138
141
  - Rakefile
@@ -170,6 +173,7 @@ files:
170
173
  - spec/data/answer.json
171
174
  - spec/data/dashboard.json
172
175
  - spec/data/game.json
176
+ - spec/data/game_duel.json
173
177
  - spec/data/login.json
174
178
  - spec/data/my_profile.json
175
179
  - spec/data/new_game.json
@@ -202,14 +206,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
202
206
  requirements:
203
207
  - - ">="
204
208
  - !ruby/object:Gem::Version
205
- version: '0'
209
+ version: '2.0'
206
210
  required_rubygems_version: !ruby/object:Gem::Requirement
207
211
  requirements:
208
212
  - - ">="
209
213
  - !ruby/object:Gem::Version
210
214
  version: '0'
211
215
  requirements: []
212
- rubygems_version: 3.0.6
216
+ rubygems_version: 3.2.22
213
217
  signing_key:
214
218
  specification_version: 4
215
219
  summary: A Ruby interface to the Trivia Crack API.
@@ -222,6 +226,7 @@ test_files:
222
226
  - spec/data/answer.json
223
227
  - spec/data/dashboard.json
224
228
  - spec/data/game.json
229
+ - spec/data/game_duel.json
225
230
  - spec/data/login.json
226
231
  - spec/data/my_profile.json
227
232
  - spec/data/new_game.json