thegamesdb 1.1.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gamesdb
4
+ # Genres related API Endpoints
5
+ module Genres
6
+ # Fetches genres list
7
+ def genres
8
+ url = 'Genres'
9
+ data = perform_request(url)
10
+ data['data']['genres'].map { |_id, genre| genre }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gamesdb
4
+ # Client for TheGamesDB API (thegamesdb.net)
5
+ module Images
6
+ end
7
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gamesdb
4
+ # Platforms related API Endpoints
5
+ module Platforms
6
+ # Method for listing platforms
7
+ #
8
+ # @see https://api.thegamesdb.net/#/Platforms/Platforms
9
+ #
10
+ # @return [Array] Array of Hashes with platforms info
11
+ #
12
+ def platforms
13
+ url = 'Platforms'
14
+ params = { fields:
15
+ 'icon,console,controller,developer,manufacturer,media,cpu,memory,graphics,sound,maxcontrollers,'\
16
+ 'display,overview,youtube' }
17
+ data = perform_request(url, params)
18
+
19
+ data['data']['platforms'].map do |p|
20
+ symbolize_keys(p.last)
21
+ end
22
+ end
23
+
24
+ # This API feature returns a set of metadata and artwork data for a specified Platform ID.
25
+ #
26
+ # @see https://api.thegamesdb.net/#/Platforms/PlatformsByPlatformID
27
+ #
28
+ # @param id [Integer|String] The numeric ID of the platform in the GamesDB
29
+ # database or a String with comma delimited list of Ids.
30
+ #
31
+ # @return [Hash|Array] Returns a Hash when there's one result or an Array of
32
+ # Hashes when there's more than one
33
+ #
34
+ def platforms_by_id(id)
35
+ url = 'Platforms/ByPlatformID'
36
+ params = {
37
+ id: id,
38
+ fields:
39
+ 'icon,console,controller,developer,manufacturer,media,cpu,memory,graphics,sound,maxcontrollers,' \
40
+ 'display,overview,youtube'
41
+ }
42
+ data = perform_request(url, params)
43
+
44
+ platform_api_response(data)
45
+ end
46
+
47
+ # Fetches platforms by name
48
+ #
49
+ # @see https://api.thegamesdb.net/#/Platforms/PlatformsByPlatformName
50
+ #
51
+ # @param name [String] Platform name (Required)
52
+ #
53
+ # @return [Hash|Array] Returns a Hash when there's one result or an Array of
54
+ # Hashes when there's more than one
55
+ def platforms_by_name(name)
56
+ url = 'Platforms/ByPlatformName'
57
+ params = {
58
+ name: name,
59
+ fields:
60
+ 'icon,console,controller,developer,manufacturer,media,cpu,memory,graphics,sound,maxcontrollers,display,' \
61
+ 'overview,youtube'
62
+ }
63
+ data = perform_request(url, params)
64
+
65
+ platform_api_response(data)
66
+ end
67
+
68
+ # Fetch platform(s) images by platform(s) id
69
+ #
70
+ # @see https://api.thegamesdb.net/#/Platforms/PlatformsImages
71
+ #
72
+ # @param platforms_id [Integer|String] The numeric ID of the platform in the GamesDB
73
+ # database or a String with comma delimited list of Ids. (Required)
74
+ # @param filter [String] options: 'fanart', 'banner', 'boxart' (supports
75
+ # comma delimited list)
76
+ # @param page [Integer]
77
+ #
78
+ # @return Array of Hashes
79
+ def platform_images(platforms_id, args = {})
80
+ url = 'Platforms/Images'
81
+ args['filter[type]'] = args.delete(:type) if args[:type]
82
+ args = args.merge({ platforms_id: platforms_id })
83
+ data = perform_request(url, args)
84
+ data['data']['images'].values.flatten
85
+ end
86
+
87
+ # Auxiliary method to return either one hash when there's only one result or
88
+ # an Array of Hashes for several results
89
+ def platform_api_response(data)
90
+ return [] if data['data']['count'].zero?
91
+
92
+ platforms = data['data']['platforms']
93
+
94
+ response = case platforms
95
+ when Hash
96
+ platforms.map { |_k, platform| symbolize_keys(platform) }
97
+ when Array
98
+ platforms.map { |platform| symbolize_keys(platform) }
99
+ end
100
+
101
+ return response.first if response.count == 1
102
+
103
+ response
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gamesdb
4
+ # Publishers related API Endpoints
5
+ module Publishers
6
+ def publishers
7
+ url = 'Publishers'
8
+
9
+ data = perform_request(url)
10
+ data['data']['publishers'].map do |_id, publisher|
11
+ publisher
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Gem version
2
4
  module Gamesdb
3
- VERSION = '1.1.2'.freeze
5
+ VERSION = '2.0.0'
4
6
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './test_helper'
4
+
5
+ describe 'Gamesdb - client', :vcr do
6
+ let(:client) { Gamesdb::Client.new(ENV['GAMESDB_API_KEY']) }
7
+
8
+ describe 'client' do
9
+ it 'should update allowances' do
10
+ client.games_by_id(1904)
11
+ monthly = client.remaining_monthly_allowance
12
+ client.games_by_id(1527)
13
+ expect(client.remaining_monthly_allowance).must_equal(monthly - 1)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './test_helper'
4
+
5
+ describe 'Gamesdb - developers', :vcr do
6
+ let(:client) { Gamesdb::Client.new(ENV['GAMESDB_API_KEY']) }
7
+
8
+ describe 'developers' do
9
+ it 'should return the developers' do
10
+ @developers = client.developers
11
+
12
+ expect(@developers.count).must_equal 8168
13
+ expect(@developers.first.keys).must_equal(['id', 'name'])
14
+ end
15
+ end
16
+ end
@@ -1,75 +1,89 @@
1
- require_relative './test_helper.rb'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './test_helper'
2
4
 
3
5
  describe 'Gamesdb - games', :vcr do
6
+ let(:client) { Gamesdb::Client.new(ENV['GAMESDB_API_KEY']) }
7
+
4
8
  describe 'game' do
5
9
  before do
6
- @game = Gamesdb.game_by_id(109)
10
+ @game = client.games_by_id(109)
7
11
  end
8
12
 
9
13
  it 'should have a valid id' do
10
- @game[:id].must_be_kind_of Integer
11
- @game[:id].must_equal 109
14
+ expect(@game[:id]).must_be_kind_of Integer
15
+ expect(@game[:id]).must_equal 109
12
16
  end
13
17
 
14
18
  it 'should have valid fields' do
15
- @game[:game_title].must_be_kind_of String
16
- @game[:game_title].length.wont_be :<, 0
19
+ expect(@game[:game_title]).must_be_kind_of String
20
+ expect(@game[:game_title].length).wont_be :<, 0
21
+ end
22
+ end
23
+
24
+ describe 'game by several ids' do
25
+ it 'should return games for a String of ids' do
26
+ @games = client.games_by_id('109,108').sort_by { |g| g[:id] }
27
+
28
+ expect(@games.count).must_equal 2
29
+ expect(@games.first[:id]).must_equal 108
30
+ expect(@games.last[:id]).must_equal 109
17
31
  end
18
32
  end
19
33
 
20
34
  describe 'empty game' do
21
35
  before do
22
- @game = Gamesdb.game_by_id(3)
36
+ @game = client.games_by_id(3)
23
37
  end
24
38
 
25
39
  it 'should return an empty array' do
26
- @game.must_equal []
40
+ expect(@game).must_equal []
27
41
  end
28
42
  end
29
43
 
30
44
  describe 'games by name' do
31
45
  before do
32
- @games_list = Gamesdb.games_by_name('turrican')
46
+ @games_list = client.games_by_name('turrican')
33
47
  end
34
48
 
35
49
  it 'should return a list' do
36
50
  game = @games_list.first
37
- game[:id].must_be_kind_of Integer
38
- game[:name].must_be_kind_of String
39
- game[:platform].must_be_kind_of Integer
40
- game[:release_date].must_be_kind_of String
51
+ expect(game[:id]).must_be_kind_of Integer
52
+ expect(game[:name]).must_be_kind_of String
53
+ expect(game[:platform]).must_be_kind_of Integer
54
+ expect(game[:release_date]).must_be_kind_of String
41
55
  end
42
56
  end
43
57
 
44
58
  describe 'games by name pages' do
45
59
  before do
46
- @first_page = Gamesdb.games_by_name('mario', page: 1)
47
- @second_page = Gamesdb.games_by_name('mario', page: 2)
60
+ @first_page = client.games_by_name('mario', page: 1)
61
+ @second_page = client.games_by_name('mario', page: 2)
48
62
  end
49
63
 
50
64
  it 'should return games in platform by id' do
51
- @first_page.count.wont_be :<, 0
52
- @first_page.count.must_equal 20
65
+ expect(@first_page.count).wont_be :<, 0
66
+ expect(@first_page.count).must_equal 20
53
67
  end
54
68
 
55
69
  it 'should return games in the platform for the second page' do
56
- @second_page.count.wont_be :<, 0
57
- @second_page.count.must_equal 20
58
- (@first_page & @second_page).must_equal []
70
+ expect(@second_page.count).wont_be :<, 0
71
+ expect(@second_page.count).must_equal 20
72
+ expect(@first_page & @second_page).must_equal []
59
73
  end
60
74
  end
61
75
 
62
76
  describe 'games by name and platform' do
63
77
  before do
64
- @games_list = Gamesdb.games_by_name('mario', platform: 7)
78
+ @games_list = client.games_by_name('mario', platform: 7)
65
79
  end
66
80
 
67
81
  it 'should return a list' do
68
82
  @games_list.each do |game|
69
- game[:id].must_be_kind_of Integer
70
- game[:id].must_be_kind_of Integer
71
- game[:name].must_be_kind_of String
72
- game[:platform].must_equal 7
83
+ expect(game[:id]).must_be_kind_of Integer
84
+ expect(game[:id]).must_be_kind_of Integer
85
+ expect(game[:name]).must_be_kind_of String
86
+ expect(game[:platform]).must_equal 7
73
87
  end
74
88
  end
75
89
  end
@@ -77,40 +91,76 @@ describe 'Gamesdb - games', :vcr do
77
91
  describe 'games art', :vcr do
78
92
  describe 'when most of the art is available' do
79
93
  before do
80
- @images = Gamesdb.game_images('216')
94
+ @images = client.games_images('218')
81
95
  end
82
96
 
83
97
  it 'should return logo and boxart' do
84
- @images[:boxart].count.wont_be :<, 0
85
- @images[:logo].must_be_kind_of String
86
- @images[:boxart][:front][:url].must_be_kind_of String
87
- @images[:boxart][:front][:width].must_be_kind_of String
88
- @images[:boxart][:front][:height].must_be_kind_of String
89
- @images[:boxart][:front][:resolution].must_be_kind_of String
98
+ expect(@images[:boxart].count).wont_be :<, 0
99
+ expect(@images[:logo]).must_be_kind_of String
100
+ expect(@images[:boxart][:front][:url]).must_be_kind_of String
101
+ expect(@images[:boxart][:front][:width]).must_be_kind_of String
102
+ expect(@images[:boxart][:front][:height]).must_be_kind_of String
103
+ expect(@images[:boxart][:front][:resolution]).must_be_kind_of String
90
104
  end
91
105
 
92
106
  it 'should return screenshots' do
93
- @images[:screenshot].count.wont_be :<, 0
94
- @images[:screenshot].first.must_be_kind_of Hash
95
- @images[:screenshot].first[:filename].must_be_kind_of String
107
+ expect(@images[:screenshot].count).wont_be :<, 0
108
+ expect(@images[:screenshot].first).must_be_kind_of Hash
109
+ expect(@images[:screenshot].first[:filename]).must_be_kind_of String
96
110
  end
97
111
 
98
112
  it 'should return fanart' do
99
- @images[:fanart].count.wont_be :<, 0
100
- @images[:fanart].first[:url].must_be_kind_of String
101
- @images[:fanart].first[:width].must_be_kind_of String
102
- @images[:fanart].first[:height].must_be_kind_of String
103
- @images[:fanart].first[:resolution].must_be_kind_of String
113
+ expect(@images[:fanart].count).wont_be :<, 0
114
+ expect(@images[:fanart].first[:url]).must_be_kind_of String
115
+ expect(@images[:fanart].first[:width]).must_be_kind_of String
116
+ expect(@images[:fanart].first[:height]).must_be_kind_of String
117
+ expect(@images[:fanart].first[:resolution]).must_be_kind_of String
104
118
  end
105
119
  end
106
120
 
107
121
  describe 'when some art is missing' do
108
122
  before do
109
- @images = Gamesdb.game_images(65238)
123
+ @images = client.games_images(65_238)
110
124
  end
111
125
 
112
126
  it 'should return an empty array' do
113
- @images.must_be_kind_of Hash
127
+ expect(@images).must_be_kind_of Hash
128
+ end
129
+ end
130
+
131
+ describe 'update games' do
132
+ it 'should return updates' do
133
+ updates = client.games_update(1)
134
+
135
+ expect(updates[:updates].count).must_equal 100
136
+ expect(updates[:updates].first).must_equal(
137
+ {
138
+ 'edit_id' => 2,
139
+ 'game_id' => 38_113,
140
+ 'timestamp' => '2018-06-28 16:20:54',
141
+ 'type' => 'boxart',
142
+ 'value' => 'boxart/front/38113-1.jpg'
143
+ }
144
+ )
145
+ expect(updates[:updates].last).must_equal(
146
+ {
147
+ 'edit_id' => 101,
148
+ 'game_id' => 22_208,
149
+ 'timestamp' => '2018-06-29 02:36:38',
150
+ 'type' => 'rating',
151
+ 'value' => 'E - Everyone'
152
+ }
153
+ )
154
+ expect(updates[:previous_page]).must_be_nil
155
+ expect(updates[:next_page]).must_equal 2
156
+ end
157
+
158
+ it 'should return updates when using a page parameter' do
159
+ updates = client.games_update(1, { page: 1_000 })
160
+
161
+ expect(updates[:updates].count).must_equal 100
162
+ expect(updates[:previous_page]).must_equal 999
163
+ expect(updates[:next_page]).must_equal 1001
114
164
  end
115
165
  end
116
166
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './test_helper'
4
+
5
+ describe 'Gamesdb - genres', :vcr do
6
+ let(:client) { Gamesdb::Client.new(ENV['GAMESDB_API_KEY']) }
7
+
8
+ describe 'genres' do
9
+ it 'should return the genres' do
10
+ @genres = client.genres
11
+
12
+ expect(@genres.count).must_equal 29
13
+ expect(@genres.min_by { |g| g['id'] }).must_equal({ 'id' => 1, 'name' => 'Action' })
14
+ end
15
+ end
16
+ end
@@ -1,113 +1,147 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative './test_helper'
2
4
 
3
5
  describe 'GamesDB - platforms', :vcr do
6
+ let(:client) { Gamesdb::Client.new(ENV['GAMESDB_API_KEY']) }
7
+
4
8
  describe 'platforms' do
5
9
  before do
6
- @platforms = Gamesdb.platforms
10
+ @platforms = client.platforms
7
11
  end
8
12
 
9
13
  it 'should get gaming platforms' do
10
- @platforms.count.wont_be :<, 0
11
- @platforms.count.must_equal 110
14
+ expect(@platforms.count).wont_be :<, 0
15
+ expect(@platforms.count).must_equal 114
12
16
  end
13
17
 
14
18
  it 'should have a valid name' do
15
- @platforms[0][:name].must_be_kind_of String
19
+ expect(@platforms[0][:name]).must_be_kind_of String
16
20
  end
17
21
 
18
22
  it 'should have a valid id' do
19
- @platforms[0][:id].must_be_kind_of Integer
23
+ expect(@platforms[0][:id]).must_be_kind_of Integer
20
24
  end
21
25
 
22
26
  it 'should have a valid alias' do
23
- @platforms[0][:alias].must_be_kind_of String
27
+ expect(@platforms[0][:alias]).must_be_kind_of String
24
28
  end
25
29
 
26
30
  it 'should have valid fields for other stuff' do
27
31
  nes = @platforms.select { |p| p[:id] == 7 }.first
28
- nes[:icon].must_be_kind_of String
29
- nes[:console].must_be_kind_of String
30
- nes[:controller].must_be_kind_of String
31
- nes[:developer].must_be_kind_of String
32
- nes[:manufacturer].must_be_kind_of String
33
- nes[:maxcontrollers].must_be_kind_of String
34
- nes[:cpu].must_be_kind_of String
35
- nes[:memory].must_be_kind_of String
36
- nes[:sound].must_be_kind_of String
37
- nes[:display].must_be_kind_of String
38
- nes[:overview].must_be_kind_of String
32
+ expect(nes[:icon]).must_be_kind_of String
33
+ expect(nes[:console]).must_be_kind_of String
34
+ expect(nes[:controller]).must_be_kind_of String
35
+ expect(nes[:developer]).must_be_kind_of String
36
+ expect(nes[:manufacturer]).must_be_kind_of String
37
+ expect(nes[:maxcontrollers]).must_be_kind_of String
38
+ expect(nes[:cpu]).must_be_kind_of String
39
+ expect(nes[:memory]).must_be_kind_of String
40
+ expect(nes[:sound]).must_be_kind_of String
41
+ expect(nes[:display]).must_be_kind_of String
42
+ expect(nes[:overview]).must_be_kind_of String
39
43
  end
40
44
  end
41
45
 
42
46
  describe 'games by platform' do
43
47
  before do
44
- platforms = Gamesdb.platforms
45
- @first_page = Gamesdb.games_by_platform_id(platforms[0][:id])
46
- @second_page = Gamesdb.games_by_platform_id(platforms[0][:id], 2)
48
+ platforms = client.platforms
49
+ @first_page = client.games_by_platform_id(platforms[0][:id])
50
+ @second_page = client.games_by_platform_id(platforms[0][:id], 2)
47
51
  end
48
52
 
49
53
  it 'should return games in platform by id' do
50
- @first_page.count.wont_be :<, 0
51
- @first_page.count.must_equal 20
54
+ expect(@first_page.count).wont_be :<, 0
55
+ expect(@first_page.count).must_equal 20
52
56
  end
53
57
 
54
58
  it 'should return games in the platform for the second page' do
55
- @second_page.count.wont_be :<, 0
56
- @second_page.count.must_equal 20
57
- (@first_page & @second_page).must_equal []
59
+ expect(@second_page.count).wont_be :<, 0
60
+ expect(@second_page.count).must_equal 20
61
+ expect(@first_page & @second_page).must_equal []
58
62
  end
59
63
  end
60
64
 
61
65
  describe 'games by platform parameters' do
62
66
  before do
63
- @games1 = Gamesdb.games_by_platform_id(4950)
64
- @games2 = Gamesdb.games_by_platform_id(4948)
65
- @games3 = Gamesdb.games_by_platform_id("4950,4948")
67
+ @games1 = client.games_by_platform_id(4950)
68
+ @games2 = client.games_by_platform_id(4948)
69
+ @games3 = client.games_by_platform_id('4950,4948')
66
70
  end
67
71
 
68
72
  it 'supports comma separated list' do
69
- @games1.count.must_equal 20
70
- @games2.count.must_equal 1
71
- @games3.count.must_equal 20
73
+ expect(@games1.count).must_equal 20
74
+ expect(@games2.count).must_equal 1
75
+ expect(@games3.count).must_equal 20
72
76
 
73
- (@games3 - @games1).must_equal @games2
77
+ expect(@games3 - @games1).must_equal @games2
74
78
  end
75
-
76
79
  end
77
80
 
78
81
  describe 'platform' do
79
82
  describe 'assigning basic info' do
80
83
  before do
81
- @platform = Gamesdb.platform_by_id(6)
84
+ @platform = client.platforms_by_id(6)
82
85
  end
83
86
 
84
87
  it 'should return valid platform info' do
85
- @platform[:name].must_equal 'Super Nintendo (SNES)'
86
- @platform[:overview].must_be_kind_of String
87
- @platform[:developer].must_be_kind_of String
88
- @platform[:manufacturer].must_equal 'Nintendo'
89
- @platform[:cpu].must_be_kind_of String
90
- @platform[:memory].must_be_kind_of String
91
- @platform[:sound].must_be_kind_of String
92
- @platform[:display].must_be_kind_of String
88
+ expect(@platform[:name]).must_equal 'Super Nintendo (SNES)'
89
+ expect(@platform[:overview]).must_be_kind_of String
90
+ expect(@platform[:developer]).must_be_kind_of String
91
+ expect(@platform[:manufacturer]).must_equal 'Nintendo'
92
+ expect(@platform[:cpu]).must_be_kind_of String
93
+ expect(@platform[:memory]).must_be_kind_of String
94
+ expect(@platform[:sound]).must_be_kind_of String
95
+ expect(@platform[:display]).must_be_kind_of String
93
96
  end
94
97
  end
95
98
 
96
99
  describe 'without hardware or images' do
97
100
  before do
98
- @platform = Gamesdb.platform_by_id 4916
101
+ @platform = client.platforms_by_id(4916)
99
102
  end
100
103
 
101
104
  it 'should return valid platform info' do
102
- @platform[:name].must_equal 'Android'
103
- @platform[:overview].must_be_kind_of String
104
- @platform[:developer].must_be_kind_of String
105
- @platform[:manufacturer].must_be_nil
106
- @platform[:cpu].must_be_nil
107
- @platform[:memory].must_be_nil
108
- @platform[:sound].must_be_nil
109
- @platform[:display].must_be_nil
105
+ expect(@platform[:name]).must_equal 'Android'
106
+ expect(@platform[:overview]).must_be_kind_of String
107
+ expect(@platform[:developer]).must_be_kind_of String
108
+ expect(@platform[:manufacturer]).must_be_nil
109
+ expect(@platform[:cpu]).must_be_nil
110
+ expect(@platform[:memory]).must_be_nil
111
+ expect(@platform[:sound]).must_be_nil
112
+ expect(@platform[:display]).must_be_nil
110
113
  end
111
114
  end
112
115
  end
116
+
117
+ describe 'platforms by name' do
118
+ it 'should return platforms' do
119
+ @platforms = client.platforms_by_name('Nintendo')
120
+
121
+ expect(@platforms.count).must_equal 14
122
+ names = @platforms.sort_by { |p| p[:name] }.map { |p| p[:name] }
123
+ expect(names).must_equal [
124
+ 'Nintendo 3DS', 'Nintendo 64', 'Nintendo DS', 'Nintendo Entertainment System (NES)',
125
+ 'Nintendo Game Boy', 'Nintendo Game Boy Advance', 'Nintendo Game Boy Color', 'Nintendo GameCube',
126
+ 'Nintendo Pokémon Mini', 'Nintendo Switch', 'Nintendo Virtual Boy', 'Nintendo Wii', 'Nintendo Wii U',
127
+ 'Super Nintendo (SNES)'
128
+ ]
129
+ end
130
+ end
131
+
132
+ describe 'platform images' do
133
+ it 'should return all images for a platform' do
134
+ @images = client.platform_images(7)
135
+
136
+ expect(@images.count).must_equal(10)
137
+ expect(@images.first.keys).must_equal(['id', 'type', 'filename'])
138
+ end
139
+
140
+ it 'should filter image type for a platform' do
141
+ @images = client.platform_images(7, type: 'boxart')
142
+
143
+ expect(@images.count).must_equal(1)
144
+ expect(@images.first).must_equal({ 'id' => 222, 'type' => 'boxart', 'filename' => 'platform/boxart/7-2.jpg' })
145
+ end
146
+ end
113
147
  end