spotify-ruby 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/COVERAGE.md +13 -13
- data/README.md +114 -16
- data/lib/spotify/accounts.rb +6 -3
- data/lib/spotify/sdk/connect/playback_state.rb +1 -1
- data/lib/spotify/sdk/item.rb +23 -0
- data/lib/spotify/sdk/me.rb +80 -11
- data/lib/spotify/version.rb +1 -1
- data/spotify-ruby.gemspec +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 118af1b2f6ab08785aa78c8028bf7927003154a1
|
4
|
+
data.tar.gz: 2d655193db96272b01a9f90aef9964c5a482e324
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6f4a4f4018790a020e3ebd1b926b6ceda2ce0fe8a5fc3d807cd2da87b81489ae19a68d1b3236eb59cb9bf1ecdbb74b51fe1a71900486b93719eaa490df63714
|
7
|
+
data.tar.gz: b2e0da362c7786da52a7eee27f1a1277f5f953fa499c82b7d615b97745f27e9aaf043229cbdfea02ba3d91c896e06caa4375e75b9049aff2cbb385084b27fe10
|
data/.travis.yml
CHANGED
data/COVERAGE.md
CHANGED
@@ -87,15 +87,15 @@ This covers all the Spotify API endpoints that are covered.
|
|
87
87
|
|
88
88
|
### Follow Endpoints
|
89
89
|
|
90
|
-
| Endpoint | Description | Coverage Status
|
91
|
-
| ------------------------------------------------------------------ | ---------------------------------------------- |
|
92
|
-
| GET /v1/me/following | Get Followed Artists | [me.rb]
|
93
|
-
| GET /v1/me/following/contains | Check if Current User Follows Artists or Users | [me.rb]
|
94
|
-
| PUT /v1/me/following | Follow Artists or Users | [🔘 Partial Support][artist.rb] (Following multiple
|
95
|
-
| DELETE /v1/me/following | Unfollow Artists or Users | [🔘 Partial Support][artist.rb] (Unfollowing multiple
|
96
|
-
| GET /v1/users/{user_id}/playlists/{playlist_id}/followers/contains | Check if Users Follow a Playlist | × Not Started
|
97
|
-
| PUT /v1/users/{user_id}/playlists/{playlist_id}/followers | Follow a Playlist | × Not Started
|
98
|
-
| DELETE /v1/users/{user_id}/playlists/{playlist_id}/followers | Unfollow a Playlist | × Not Started
|
90
|
+
| Endpoint | Description | Coverage Status |
|
91
|
+
| ------------------------------------------------------------------ | ---------------------------------------------- | -------------------------------------------------------------------- |
|
92
|
+
| GET /v1/me/following | Get Followed Artists | [me.rb] |
|
93
|
+
| GET /v1/me/following/contains | Check if Current User Follows Artists or Users | [me.rb] |
|
94
|
+
| PUT /v1/me/following | Follow Artists or Users | [🔘 Partial Support][artist.rb] (Following multiple not supported) |
|
95
|
+
| DELETE /v1/me/following | Unfollow Artists or Users | [🔘 Partial Support][artist.rb] (Unfollowing multiple not supported) |
|
96
|
+
| GET /v1/users/{user_id}/playlists/{playlist_id}/followers/contains | Check if Users Follow a Playlist | × Not Started |
|
97
|
+
| PUT /v1/users/{user_id}/playlists/{playlist_id}/followers | Follow a Playlist | × Not Started |
|
98
|
+
| DELETE /v1/users/{user_id}/playlists/{playlist_id}/followers | Unfollow a Playlist | × Not Started |
|
99
99
|
|
100
100
|
### Playlists Endpoints
|
101
101
|
|
@@ -113,10 +113,10 @@ This covers all the Spotify API endpoints that are covered.
|
|
113
113
|
|
114
114
|
### History Endpoints
|
115
115
|
|
116
|
-
| Endpoint | Description | Coverage Status
|
117
|
-
| --------------------------------- | --------------------------------------------- |
|
118
|
-
| GET /v1/me/top/{type} | Get User's Top Artists and Tracks | × Not Started
|
119
|
-
| GET /v1/me/player/recently-played | Get the Current User's Recently Played Tracks |
|
116
|
+
| Endpoint | Description | Coverage Status |
|
117
|
+
| --------------------------------- | --------------------------------------------- | ----------------------- |
|
118
|
+
| GET /v1/me/top/{type} | Get User's Top Artists and Tracks | × Not Started |
|
119
|
+
| GET /v1/me/player/recently-played | Get the Current User's Recently Played Tracks | [Full support ✔][me.rb] |
|
120
120
|
|
121
121
|
### Connect Endpoints
|
122
122
|
|
data/README.md
CHANGED
@@ -23,13 +23,15 @@ The developer-friendly, opinionated Ruby SDK for [Spotify]. Works on Ruby 2.4+
|
|
23
23
|
- [Creating a Session](#creating-a-session)
|
24
24
|
- [Recreating a Session](#recreating-a-session)
|
25
25
|
- [Using the SDK](#using-the-sdk)
|
26
|
-
- [Spotify Connect](#spotify-connect)
|
26
|
+
- [Spotify Connect API](#spotify-connect-api)
|
27
|
+
- [Me API](#me-api)
|
28
|
+
- [Listening History API](#listening-history-api)
|
29
|
+
- [Following API](#following-api)
|
27
30
|
- [Contributing](#contributing)
|
28
31
|
- [Community Guidelines](#community-guidelines)
|
29
32
|
- [Code of Conduct](#code-of-conduct)
|
30
33
|
- [Getting Started](#getting-started)
|
31
34
|
- [Releasing a Change](#releasing-a-change)
|
32
|
-
- [Changelog](#changelog)
|
33
35
|
- [License](#license)
|
34
36
|
|
35
37
|
## Introduction
|
@@ -95,11 +97,25 @@ To define your app credentials, you'll need to create an instance of `Spotify::A
|
|
95
97
|
|
96
98
|
```ruby
|
97
99
|
@accounts = Spotify::Accounts.new
|
98
|
-
@accounts.client_id =
|
99
|
-
@accounts.client_secret =
|
100
|
-
@accounts.redirect_uri =
|
100
|
+
@accounts.client_id = "spotify client ID"
|
101
|
+
@accounts.client_secret = "spotify client secret"
|
102
|
+
@accounts.redirect_uri = "redirect URI"
|
101
103
|
```
|
102
104
|
|
105
|
+
Alternatively, these credentials can be supplied as environment variables when running your application:
|
106
|
+
|
107
|
+
```ruby
|
108
|
+
@accounts = Spotify::Accounts.new # fetches configuration from ENV
|
109
|
+
```
|
110
|
+
|
111
|
+
The respective environment variables you'll need to set are:
|
112
|
+
|
113
|
+
| Environment Variable | Description | Required? |
|
114
|
+
| ------------------------ | ----------------------------------------- | ------------- |
|
115
|
+
| `SPOTIFY_CLIENT_ID` | Your Spotify Client ID | **Yes** |
|
116
|
+
| `SPOTIFY_CLIENT_SECRET` | Your Spotify Client Secret | **Yes** |
|
117
|
+
| `SPOTIFY_REDIRECT_URI` | Your Spotify Redirect URI (must be exact) | **Yes** |
|
118
|
+
|
103
119
|
### Authorization
|
104
120
|
|
105
121
|
In order to use Spotify's APIs on a user's behalf, you'll need to use the Spotify [Accounts API] to redirect them to `https://accounts.spotify.com`. They will then need to explicitly approve your application and what data you're asking for (technically referred to as authorization scopes).
|
@@ -168,7 +184,7 @@ To create an instance of the Spotify SDK, you'll need the `@session` from above
|
|
168
184
|
@sdk = Spotify::SDK.new(@session)
|
169
185
|
```
|
170
186
|
|
171
|
-
### Spotify Connect
|
187
|
+
### Spotify Connect API
|
172
188
|
|
173
189
|
With [Spotify Connect], you can take your music experience anywhere on over 300 devices. And you can read and control most devices programmatically through the SDK:
|
174
190
|
|
@@ -213,6 +229,98 @@ With [Spotify Connect], you can take your music experience anywhere on over 300
|
|
213
229
|
@sdk.connect.devices[0].repeat_mode = :context
|
214
230
|
```
|
215
231
|
|
232
|
+
#### Transfer playback\*
|
233
|
+
|
234
|
+
This will transfer state, and start playback.
|
235
|
+
|
236
|
+
```ruby
|
237
|
+
@sdk.connect.devices[0].transfer_playback!
|
238
|
+
```
|
239
|
+
|
240
|
+
#### Transfer state\*
|
241
|
+
|
242
|
+
This will transfer state, and pause playback.
|
243
|
+
|
244
|
+
```ruby
|
245
|
+
@sdk.connect.devices[0].transfer_state!
|
246
|
+
```
|
247
|
+
|
248
|
+
### Me API
|
249
|
+
|
250
|
+
This allows you to perform specific actions on behalf of a user.
|
251
|
+
|
252
|
+
#### My information\*
|
253
|
+
|
254
|
+
```ruby
|
255
|
+
@sdk.me.info
|
256
|
+
@sdk.me.info.free? # => false
|
257
|
+
@sdk.me.info.premium? # => true
|
258
|
+
@sdk.me.info.birthdate # => 1980-01-01
|
259
|
+
@sdk.me.info.display_name? # => true
|
260
|
+
@sdk.me.info.display_name # => "ABC Smith"
|
261
|
+
@sdk.me.info.images[0].url # => "https://profile-images.scdn.co/userprofile/default/..."
|
262
|
+
@sdk.me.info.followers # => 4913313
|
263
|
+
@sdk.me.info.spotify_uri # => "spotify:user:abcsmith"
|
264
|
+
@sdk.me.info.spotify_url # => "https://open.spotify.com/user/abcsmith"
|
265
|
+
```
|
266
|
+
|
267
|
+
### Listening History API
|
268
|
+
|
269
|
+
#### My recently played tracks (up to last 50)\*
|
270
|
+
|
271
|
+
```ruby
|
272
|
+
@sdk.me.history(10) # => [#<Spotify::SDK::Item...>, ...]
|
273
|
+
@sdk.me.history(10).size # => 10
|
274
|
+
@sdk.me.history(50) # => [#<Spotify::SDK::Item...>, ...]
|
275
|
+
@sdk.me.history(50).size # => 50
|
276
|
+
```
|
277
|
+
|
278
|
+
### Following API
|
279
|
+
|
280
|
+
#### Follow an artist\*
|
281
|
+
|
282
|
+
```ruby
|
283
|
+
@sdk.playback.item.artist.follow!
|
284
|
+
```
|
285
|
+
|
286
|
+
#### Unfollow an artist\*
|
287
|
+
|
288
|
+
```ruby
|
289
|
+
@sdk.playback.item.artist.unfollow!
|
290
|
+
```
|
291
|
+
|
292
|
+
#### Check if following Spotify artists?\*
|
293
|
+
|
294
|
+
```ruby
|
295
|
+
@sdk.me.following_artists?(%w(3TVXtAsR1Inumwj472S9r4 6LuN9FCkKOj5PcnpouEgny 69GGBxA162lTqCwzJG5jLp))
|
296
|
+
# => {
|
297
|
+
# "3TVXtAsR1Inumwj472S9r4" => false,
|
298
|
+
# "6LuN9FCkKOj5PcnpouEgny" => true,
|
299
|
+
# "69GGBxA162lTqCwzJG5jLp" => false
|
300
|
+
# }
|
301
|
+
```
|
302
|
+
|
303
|
+
#### Check if following Spotify users?\*
|
304
|
+
|
305
|
+
```ruby
|
306
|
+
@sdk.me.following_users?(%w(3TVXtAsR1Inumwj472S9r4 6LuN9FCkKOj5PcnpouEgny 69GGBxA162lTqCwzJG5jLp))
|
307
|
+
# => {
|
308
|
+
# "3TVXtAsR1Inumwj472S9r4" => false,
|
309
|
+
# "6LuN9FCkKOj5PcnpouEgny" => true,
|
310
|
+
# "69GGBxA162lTqCwzJG5jLp" => false
|
311
|
+
# }
|
312
|
+
```
|
313
|
+
|
314
|
+
#### See all followed artists\*
|
315
|
+
|
316
|
+
```ruby
|
317
|
+
@sdk.me.following(5) # => [#<Spotify::SDK::Artist...>, ...]
|
318
|
+
@sdk.me.following(5).size # => 5
|
319
|
+
@sdk.me.following(50) # => [#<Spotify::SDK::Artist...>, ...]
|
320
|
+
@sdk.me.following(50).size # => 50
|
321
|
+
```
|
322
|
+
|
323
|
+
|
216
324
|
<small><i>\* Requires specific user permissions/scopes. See [Authorization Scopes] for more information.</i></small>
|
217
325
|
|
218
326
|
## Contributing
|
@@ -252,16 +360,6 @@ For local development, you can run `bin/console` for an interactive prompt for e
|
|
252
360
|
- Push git commits and tags
|
253
361
|
- Push the `.gem` file to [rubygems.org].
|
254
362
|
|
255
|
-
### Changelog
|
256
|
-
|
257
|
-
```
|
258
|
-
[2018-07-21] (0.2.1) First major release.
|
259
|
-
- Support for Connect and User API endpoints.
|
260
|
-
- Transitioned to YARD for documentation.
|
261
|
-
- Website built using Jekyll with Contributing guide.
|
262
|
-
- Removed Coveralls in favour for CodeClimate
|
263
|
-
```
|
264
|
-
|
265
363
|
## License
|
266
364
|
|
267
365
|
The gem is available as open source under the terms of the [MIT License].
|
data/lib/spotify/accounts.rb
CHANGED
@@ -51,14 +51,17 @@ module Spotify
|
|
51
51
|
# @accounts.client_secret = "[client secret goes here]"
|
52
52
|
# @accounts.redirect_uri = "http://localhost"
|
53
53
|
#
|
54
|
+
# # with SPOTIFY_CLIENT_ID, SPOTIFY_CLIENT_SECRET, and SPOTIFY_REDIRECT_URI in ENV:
|
55
|
+
# @accounts = Spotify::Accounts.new
|
56
|
+
#
|
54
57
|
# @param [Hash] config The configuration containing your Client ID, Client Secret, and your Redirect URL.
|
55
58
|
#
|
56
59
|
# @see https://developer.spotify.com/dashboard/
|
57
60
|
#
|
58
61
|
def initialize(config={})
|
59
|
-
@client_id = config.delete(:client_id)
|
60
|
-
@client_secret = config.delete(:client_secret)
|
61
|
-
@redirect_uri = config.delete(:redirect_uri)
|
62
|
+
@client_id = config.delete(:client_id) { ENV["SPOTIFY_CLIENT_ID"] }
|
63
|
+
@client_secret = config.delete(:client_secret) { ENV["SPOTIFY_CLIENT_SECRET"] }
|
64
|
+
@redirect_uri = config.delete(:redirect_uri) { ENV["SPOTIFY_REDIRECT_URI"] }
|
62
65
|
end
|
63
66
|
|
64
67
|
attr_accessor :client_id, :client_secret, :redirect_uri
|
@@ -133,7 +133,7 @@ module Spotify
|
|
133
133
|
#
|
134
134
|
def item
|
135
135
|
raise "Playback information is not available if user has a private session enabled" if device.private_session?
|
136
|
-
Spotify::SDK::Item.new(
|
136
|
+
Spotify::SDK::Item.new(to_h, parent)
|
137
137
|
end
|
138
138
|
end
|
139
139
|
end
|
data/lib/spotify/sdk/item.rb
CHANGED
@@ -3,6 +3,18 @@
|
|
3
3
|
module Spotify
|
4
4
|
class SDK
|
5
5
|
class Item < Model
|
6
|
+
##
|
7
|
+
# Let's transform the item object into better for us.
|
8
|
+
# Before: { track: ..., played_at: ..., context: ... }
|
9
|
+
# After: { track_properties..., played_at: ..., context: ... }
|
10
|
+
#
|
11
|
+
# :nodoc:
|
12
|
+
def initialize(payload, parent)
|
13
|
+
track = payload.delete(:track) || payload.delete(:item)
|
14
|
+
properties = payload.except(:parent, :device, :repeat_state, :shuffle_state)
|
15
|
+
super(track.merge(properties: properties), parent)
|
16
|
+
end
|
17
|
+
|
6
18
|
##
|
7
19
|
# Get the album for this item.
|
8
20
|
#
|
@@ -41,6 +53,17 @@ module Spotify
|
|
41
53
|
artists.first
|
42
54
|
end
|
43
55
|
|
56
|
+
##
|
57
|
+
# Get the context.
|
58
|
+
#
|
59
|
+
# @example
|
60
|
+
# @sdk.connect.playback.item.context
|
61
|
+
# @sdk.me.history[0].context
|
62
|
+
#
|
63
|
+
# @return [Hash] context Information about the user's context.
|
64
|
+
#
|
65
|
+
alias_attribute :context, "properties.context"
|
66
|
+
|
44
67
|
##
|
45
68
|
# Get the duration.
|
46
69
|
# Alias to self.duration_ms
|
data/lib/spotify/sdk/me.rb
CHANGED
@@ -22,9 +22,47 @@ module Spotify
|
|
22
22
|
Spotify::SDK::Me::Info.new(me_info, self)
|
23
23
|
end
|
24
24
|
|
25
|
+
##
|
26
|
+
# Check what tracks a user has recently played.
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# @sdk.me.history
|
30
|
+
# @sdk.me.history(20)
|
31
|
+
#
|
32
|
+
# @param [Integer] limit How many results to request. Defaults to 10.
|
33
|
+
# @param [Hash] override_opts Custom options for HTTParty.
|
34
|
+
# @return [Array] response List of recently played tracked, in chronological order.
|
35
|
+
#
|
36
|
+
def history(n=10, override_opts={})
|
37
|
+
request = {
|
38
|
+
method: :get,
|
39
|
+
http_path: "/v1/me/player/recently-played",
|
40
|
+
keys: %i[items],
|
41
|
+
limit: n
|
42
|
+
}
|
43
|
+
|
44
|
+
send_multiple_http_requests(request, override_opts).map do |item|
|
45
|
+
Spotify::SDK::Item.new(item, self)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
25
49
|
##
|
26
50
|
# Check if the current user is following N users.
|
27
51
|
#
|
52
|
+
# @example
|
53
|
+
# artists = %w(3q7HBObVc0L8jNeTe5Gofh 0NbfKEOTQCcwd6o7wSDOHI 3TVXtAsR1Inumwj472S9r4)
|
54
|
+
# @sdk.me.following?(artists, :artist)
|
55
|
+
# # => {"3q7HBObVc0L8jNeTe5Gofh" => false, "0NbfKEOTQCcwd6o7wSDOHI" => false, ...}
|
56
|
+
#
|
57
|
+
# users = %w(3q7HBObVc0L8jNeTe5Gofh 0NbfKEOTQCcwd6o7wSDOHI 3TVXtAsR1Inumwj472S9r4)
|
58
|
+
# @sdk.me.following?(users, :user)
|
59
|
+
# # => {"3q7HBObVc0L8jNeTe5Gofh" => false, "0NbfKEOTQCcwd6o7wSDOHI" => false, ...}
|
60
|
+
#
|
61
|
+
# @param [Array] list List of Spotify user/artist IDs. Cannot mix user and artist IDs in single request.
|
62
|
+
# @param [Symbol] type Either :user or :artist. Checks if follows respective type of account.
|
63
|
+
# @param [Hash] override_opts Custom options for HTTParty.
|
64
|
+
# @return [Hash] hash A hash containing a key with the ID, and a value that equals is_following (boolean).
|
65
|
+
#
|
28
66
|
def following?(list, type=:artist, override_opts={})
|
29
67
|
raise "Must contain an array" unless list.is_a?(Array)
|
30
68
|
raise "Must contain an array of String or Spotify::SDK::Artist" if any_of?(list, [String, Spotify::SDK::Artist])
|
@@ -32,6 +70,14 @@ module Spotify
|
|
32
70
|
send_is_following_http_requests(list.map {|id| id.try(:id) || id }, type, override_opts)
|
33
71
|
end
|
34
72
|
|
73
|
+
def following_artists?(list, override_opts={})
|
74
|
+
following?(list, :artist, override_opts)
|
75
|
+
end
|
76
|
+
|
77
|
+
def following_users?(list, override_opts={})
|
78
|
+
following?(list, :user, override_opts)
|
79
|
+
end
|
80
|
+
|
35
81
|
##
|
36
82
|
# Get the current user's followed artists. Requires the `user-read-follow` scope.
|
37
83
|
# GET /v1/me/following
|
@@ -39,22 +85,52 @@ module Spotify
|
|
39
85
|
# @example
|
40
86
|
# @sdk.me.following
|
41
87
|
#
|
88
|
+
# @param [Integer] n Number of results to return.
|
42
89
|
# @param [Hash] override_opts Custom options for HTTParty.
|
43
90
|
# @return [Array] artists A list of followed artists, wrapped in Spotify::SDK::Artist
|
44
91
|
#
|
45
|
-
def following(override_opts={})
|
46
|
-
|
47
|
-
|
92
|
+
def following(n=50, override_opts={})
|
93
|
+
request = {
|
94
|
+
method: :get,
|
95
|
+
# TODO: Spotify API bug - `limit={n}` returns n-1 artists.
|
96
|
+
# ^ Example: `limit=5` returns 4 artists.
|
97
|
+
# TODO: Support `type=users` as well as `type=artists`.
|
98
|
+
http_path: "/v1/me/following?type=artist&limit=#{[n, 50].min}",
|
99
|
+
keys: %i[artists items],
|
100
|
+
limit: n
|
101
|
+
}
|
102
|
+
|
103
|
+
send_multiple_http_requests(request, override_opts).map do |artist|
|
48
104
|
Spotify::SDK::Artist.new(artist, self)
|
49
105
|
end
|
50
106
|
end
|
51
107
|
|
52
108
|
private
|
53
109
|
|
54
|
-
def any_of?(array, klasses)
|
110
|
+
def any_of?(array, klasses) # :nodoc:
|
55
111
|
(array.map(&:class) - klasses).any?
|
56
112
|
end
|
57
113
|
|
114
|
+
def send_multiple_http_requests(opts, override_opts) # :nodoc:
|
115
|
+
response = send_http_request(opts[:method], opts[:http_path], override_opts)
|
116
|
+
responses, next_request = hash_deep_lookup(response, opts[:keys].dup)
|
117
|
+
if next_request && responses.size < opts[:limit]
|
118
|
+
responses += send_multiple_http_requests(opts.merge(http_path: next_request), override_opts)
|
119
|
+
end
|
120
|
+
responses.first(opts[:limit])
|
121
|
+
end
|
122
|
+
|
123
|
+
def hash_deep_lookup(response, keys) # :nodoc:
|
124
|
+
error_message = "Cannot find '%s' key in Spotify::SDK::Me#hash_deep_lookup"
|
125
|
+
while keys.any?
|
126
|
+
next_request ||= response[:next]
|
127
|
+
next_key = keys.shift
|
128
|
+
response = next_key ? response[next_key] : raise(error_message % next_key)
|
129
|
+
end
|
130
|
+
[response, next_request ? next_request[23..-1] : nil]
|
131
|
+
end
|
132
|
+
|
133
|
+
# TODO: Migrate this into the abstracted send_multiple_http_requests
|
58
134
|
def send_is_following_http_requests(list, type, override_opts) # :nodoc:
|
59
135
|
max_ids = list.first(50)
|
60
136
|
remaining_ids = list - max_ids
|
@@ -71,13 +147,6 @@ module Spotify
|
|
71
147
|
ids.merge(send_is_following_http_requests(remaining_ids, type, override_opts))
|
72
148
|
end || ids
|
73
149
|
end
|
74
|
-
|
75
|
-
def send_following_http_requests(http_path, override_opts) # :nodoc:
|
76
|
-
request = send_http_request(:get, http_path, override_opts)[:artists]
|
77
|
-
artists = request[:items]
|
78
|
-
artists << send_following_http_requests(request[:next][23..-1], override_opts) if request[:next]
|
79
|
-
artists.flatten
|
80
|
-
end
|
81
150
|
end
|
82
151
|
end
|
83
152
|
end
|
data/lib/spotify/version.rb
CHANGED
data/spotify-ruby.gemspec
CHANGED
@@ -35,6 +35,7 @@ Gem::Specification.new do |spec|
|
|
35
35
|
spec.add_development_dependency "rake", "~> 12.1"
|
36
36
|
|
37
37
|
# Testing
|
38
|
+
spec.add_development_dependency "climate_control", "~> 0.2"
|
38
39
|
spec.add_development_dependency "factory_bot", "~> 1.0.0.alpha"
|
39
40
|
spec.add_development_dependency "rspec", "~> 3.7"
|
40
41
|
spec.add_development_dependency "rspec-collection_matchers", "~> 1.1", ">= 1.1.2"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spotify-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bilawal Hameed
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -44,6 +44,20 @@ dependencies:
|
|
44
44
|
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '12.1'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: climate_control
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0.2'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0.2'
|
47
61
|
- !ruby/object:Gem::Dependency
|
48
62
|
name: factory_bot
|
49
63
|
requirement: !ruby/object:Gem::Requirement
|