spotify-ruby 0.1.1 → 0.2.1

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.
@@ -9,45 +9,62 @@ module Spotify
9
9
  ##
10
10
  # Initialize a new Model instance.
11
11
  #
12
- # @param [Hash] hash The response payload.
12
+ # @example
13
+ # module Spotify
14
+ # class SDK
15
+ # class User < Model
16
+ # end
17
+ # end
18
+ # end
19
+ #
20
+ # @base = Spotify::SDK::Base.new(@sdk)
21
+ # @user = Spotify::SDK::User.new({ username: "hi" }, @base)
22
+ # @user.username # => "hi"
23
+ #
24
+ # @param [Hash] payload The response payload.
13
25
  # @param [Spotify::SDK] parent The SDK object for context.
14
26
  #
15
27
  def initialize(payload, parent)
16
28
  @payload = payload
17
- validate_payload
29
+ raise "Expected payload to be of Hash type" unless @payload.instance_of?(Hash)
18
30
 
19
31
  @parent = parent
20
- validate_parent
32
+ raise "Expected parent to be of Spotify::SDK::Base type" unless @parent.is_a?(Spotify::SDK::Base)
21
33
 
22
34
  super(payload)
23
35
  end
24
36
 
37
+ def to_h # :nodoc:
38
+ super.to_h.except(:parent)
39
+ end
40
+
41
+ def to_json # :nodoc:
42
+ to_h.to_json
43
+ end
44
+
25
45
  ##
26
- # A reference to Spotify::SDK::Connect, so we can also do stuff.
46
+ # A reference to Spotify::SDK::Connect.
27
47
  #
28
48
  attr_reader :parent
29
49
 
30
- private
31
-
32
- def validate_payload
33
- raise Spotify::Errors::ModelPayloadExpectedToBeHashError.new unless @payload.instance_of? Hash
34
- end
50
+ class << self
51
+ def alias_attribute(new_method, attribute) # :nodoc:
52
+ if attribute.is_a?(Symbol)
53
+ define_method(new_method) { send(attribute) }
54
+ else
55
+ define_method(new_method) do
56
+ self.class.hash_selector(to_h, attribute)
57
+ end
58
+ end
59
+ end
35
60
 
36
- def validate_parent
37
- raise Spotify::Errors::ModelParentInvalidSDKBaseObjectError.new unless @parent.is_a? Spotify::SDK::Base
61
+ def hash_selector(hash, selector)
62
+ hash.deep_symbolize_keys!
63
+ segments = selector.split(".")
64
+ hash = hash[segments.shift.try(:to_sym)] while segments.any?
65
+ hash
66
+ end
38
67
  end
39
68
  end
40
69
  end
41
-
42
- class Errors
43
- ##
44
- # A Error class for when the payload is not a Hash instance.
45
- #
46
- class ModelPayloadExpectedToBeHashError < StandardError; end
47
-
48
- ##
49
- # A Error class for when the parent is not a Spotify::SDK::Base instance.
50
- #
51
- class ModelParentInvalidSDKBaseObjectError < StandardError; end
52
- end
53
70
  end
@@ -4,10 +4,13 @@ module Spotify
4
4
  ##
5
5
  # The definitive version of spotify-ruby.
6
6
  #
7
- # You'll need to bump this for every change. The
8
- # rule of thumb is to update it by one minor version (0.1.0 -> 0.1.1)
9
- # if there is no breaking changes or new features. Anything
10
- # else should constitute a major version bump (0.1.0 -> 1.0.0)
7
+ # We follow the Semantic Versioning convention.
8
+ # See https://semver.org/ for more information
11
9
  #
12
- VERSION = "0.1.1"
10
+ # Summary:
11
+ # MAJOR version when you make incompatible API changes,
12
+ # MINOR version when you add functionality in a backwards-compatible manner, and
13
+ # PATCH version when you make backwards-compatible bug fixes.
14
+ #
15
+ VERSION = "0.2.1"
13
16
  end
@@ -10,31 +10,46 @@ Gem::Specification.new do |spec|
10
10
  spec.authors = ["Bilawal Hameed"]
11
11
  spec.email = ["bil@spotify.com"]
12
12
 
13
- spec.summary = "A modern, opinionated and unofficial Ruby SDK for the Spotify API."
13
+ spec.summary = "The developer-friendly, opinionated Ruby SDK for Spotify."
14
14
  spec.description = [
15
15
  "Build integrations with the different Spotify APIs",
16
16
  "inside of your application.",
17
17
  "For more information, visit https://developer.spotify.com"
18
18
  ].join(" ")
19
- spec.homepage = "https://github.com/bih/spotify-ruby"
19
+ spec.homepage = "https://bih.github.io/spotify-ruby"
20
20
  spec.license = "MIT"
21
21
 
22
22
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
23
- f.match(%r{^(test|spec|features|coverage|html|examples)/})
23
+ f.match(%r{^(assets|bin|coverage|doc|docs|html|examples|test|spec|features)/})
24
24
  end
25
25
 
26
- spec.bindir = "exe"
27
- spec.executables = spec.files.grep(%r{^exe/}) {|f| File.basename(f) }
28
- spec.require_paths = ["lib"]
26
+ spec.metadata["yard.run"] = "yri"
29
27
 
28
+ # We don't support executables just yet. Comment this out if you're building one.
29
+ # spec.bindir = "exe"
30
+ # spec.executables = spec.files.grep(%r{^exe/}) {|f| File.basename(f) }
31
+ # spec.require_paths = ["lib"]
32
+
33
+ # Tooling
30
34
  spec.add_development_dependency "bundler", "~> 1.15", ">= 1.15.4"
31
- spec.add_development_dependency "coveralls", "~> 0.8.21"
32
35
  spec.add_development_dependency "rake", "~> 12.1"
33
- spec.add_development_dependency "rdoc", "~> 5.1"
36
+
37
+ # Testing
38
+ spec.add_development_dependency "factory_bot", "~> 1.0.0.alpha"
34
39
  spec.add_development_dependency "rspec", "~> 3.7"
40
+ spec.add_development_dependency "rspec-collection_matchers", "~> 1.1", ">= 1.1.2"
35
41
  spec.add_development_dependency "rubocop", "~> 0.51.0"
42
+ spec.add_development_dependency "simplecov"
36
43
  spec.add_development_dependency "webmock", "~> 3.1"
44
+
45
+ # Developer Productivity
46
+ spec.add_development_dependency "pry", "~> 0.10"
47
+
48
+ # Documentation
49
+ spec.add_development_dependency "yard"
50
+ spec.add_development_dependency "yard-api"
51
+
52
+ # Runtime Dependencies
37
53
  spec.add_runtime_dependency "activesupport", "~> 5.0"
38
54
  spec.add_runtime_dependency "httparty", "~> 0.15.6"
39
- spec.add_runtime_dependency "oauth2", "~> 1.4"
40
55
  end
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.1.1
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bilawal Hameed
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-16 00:00:00.000000000 Z
11
+ date: 2018-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -31,61 +31,67 @@ dependencies:
31
31
  - !ruby/object:Gem::Version
32
32
  version: 1.15.4
33
33
  - !ruby/object:Gem::Dependency
34
- name: coveralls
34
+ name: rake
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 0.8.21
39
+ version: '12.1'
40
40
  type: :development
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 0.8.21
46
+ version: '12.1'
47
47
  - !ruby/object:Gem::Dependency
48
- name: rake
48
+ name: factory_bot
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '12.1'
53
+ version: 1.0.0.alpha
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '12.1'
60
+ version: 1.0.0.alpha
61
61
  - !ruby/object:Gem::Dependency
62
- name: rdoc
62
+ name: rspec
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '5.1'
67
+ version: '3.7'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '5.1'
74
+ version: '3.7'
75
75
  - !ruby/object:Gem::Dependency
76
- name: rspec
76
+ name: rspec-collection_matchers
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '3.7'
81
+ version: '1.1'
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 1.1.2
82
85
  type: :development
83
86
  prerelease: false
84
87
  version_requirements: !ruby/object:Gem::Requirement
85
88
  requirements:
86
89
  - - "~>"
87
90
  - !ruby/object:Gem::Version
88
- version: '3.7'
91
+ version: '1.1'
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 1.1.2
89
95
  - !ruby/object:Gem::Dependency
90
96
  name: rubocop
91
97
  requirement: !ruby/object:Gem::Requirement
@@ -100,6 +106,20 @@ dependencies:
100
106
  - - "~>"
101
107
  - !ruby/object:Gem::Version
102
108
  version: 0.51.0
109
+ - !ruby/object:Gem::Dependency
110
+ name: simplecov
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
103
123
  - !ruby/object:Gem::Dependency
104
124
  name: webmock
105
125
  requirement: !ruby/object:Gem::Requirement
@@ -115,47 +135,75 @@ dependencies:
115
135
  - !ruby/object:Gem::Version
116
136
  version: '3.1'
117
137
  - !ruby/object:Gem::Dependency
118
- name: activesupport
138
+ name: pry
119
139
  requirement: !ruby/object:Gem::Requirement
120
140
  requirements:
121
141
  - - "~>"
122
142
  - !ruby/object:Gem::Version
123
- version: '5.0'
124
- type: :runtime
143
+ version: '0.10'
144
+ type: :development
125
145
  prerelease: false
126
146
  version_requirements: !ruby/object:Gem::Requirement
127
147
  requirements:
128
148
  - - "~>"
129
149
  - !ruby/object:Gem::Version
130
- version: '5.0'
150
+ version: '0.10'
131
151
  - !ruby/object:Gem::Dependency
132
- name: httparty
152
+ name: yard
153
+ requirement: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ type: :development
159
+ prerelease: false
160
+ version_requirements: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ - !ruby/object:Gem::Dependency
166
+ name: yard-api
167
+ requirement: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ type: :development
173
+ prerelease: false
174
+ version_requirements: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
179
+ - !ruby/object:Gem::Dependency
180
+ name: activesupport
133
181
  requirement: !ruby/object:Gem::Requirement
134
182
  requirements:
135
183
  - - "~>"
136
184
  - !ruby/object:Gem::Version
137
- version: 0.15.6
185
+ version: '5.0'
138
186
  type: :runtime
139
187
  prerelease: false
140
188
  version_requirements: !ruby/object:Gem::Requirement
141
189
  requirements:
142
190
  - - "~>"
143
191
  - !ruby/object:Gem::Version
144
- version: 0.15.6
192
+ version: '5.0'
145
193
  - !ruby/object:Gem::Dependency
146
- name: oauth2
194
+ name: httparty
147
195
  requirement: !ruby/object:Gem::Requirement
148
196
  requirements:
149
197
  - - "~>"
150
198
  - !ruby/object:Gem::Version
151
- version: '1.4'
199
+ version: 0.15.6
152
200
  type: :runtime
153
201
  prerelease: false
154
202
  version_requirements: !ruby/object:Gem::Requirement
155
203
  requirements:
156
204
  - - "~>"
157
205
  - !ruby/object:Gem::Version
158
- version: '1.4'
206
+ version: 0.15.6
159
207
  description: Build integrations with the different Spotify APIs inside of your application.
160
208
  For more information, visit https://developer.spotify.com
161
209
  email:
@@ -176,29 +224,29 @@ files:
176
224
  - LICENSE
177
225
  - README.md
178
226
  - Rakefile
179
- - bin/console
180
- - bin/setup
181
227
  - lib/spotify.rb
182
- - lib/spotify/auth.rb
228
+ - lib/spotify/accounts.rb
229
+ - lib/spotify/accounts/session.rb
183
230
  - lib/spotify/sdk.rb
184
231
  - lib/spotify/sdk/.keep
232
+ - lib/spotify/sdk/album.rb
233
+ - lib/spotify/sdk/artist.rb
185
234
  - lib/spotify/sdk/base.rb
186
235
  - lib/spotify/sdk/connect.rb
187
236
  - lib/spotify/sdk/connect/device.rb
188
- - lib/spotify/sdk/initialization.rb
189
- - lib/spotify/sdk/initialization/base.rb
190
- - lib/spotify/sdk/initialization/oauth_access_token.rb
191
- - lib/spotify/sdk/initialization/plain_string.rb
192
- - lib/spotify/sdk/initialization/query_hash.rb
193
- - lib/spotify/sdk/initialization/query_string.rb
194
- - lib/spotify/sdk/initialization/url_string.rb
237
+ - lib/spotify/sdk/connect/playback_state.rb
238
+ - lib/spotify/sdk/image.rb
239
+ - lib/spotify/sdk/item.rb
240
+ - lib/spotify/sdk/me.rb
241
+ - lib/spotify/sdk/me/info.rb
195
242
  - lib/spotify/sdk/model.rb
196
243
  - lib/spotify/version.rb
197
244
  - spotify-ruby.gemspec
198
- homepage: https://github.com/bih/spotify-ruby
245
+ homepage: https://bih.github.io/spotify-ruby
199
246
  licenses:
200
247
  - MIT
201
- metadata: {}
248
+ metadata:
249
+ yard.run: yri
202
250
  post_install_message:
203
251
  rdoc_options: []
204
252
  require_paths:
@@ -218,5 +266,6 @@ rubyforge_project:
218
266
  rubygems_version: 2.6.8
219
267
  signing_key:
220
268
  specification_version: 4
221
- summary: A modern, opinionated and unofficial Ruby SDK for the Spotify API.
269
+ summary: The developer-friendly, opinionated Ruby SDK for Spotify.
222
270
  test_files: []
271
+ has_rdoc:
@@ -1,15 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- require "bundler/setup"
5
- require "spotify"
6
-
7
- # You can add fixtures and/or initialization code here to make experimenting
8
- # with your gem easier. You can also use a different console, if you like.
9
-
10
- # (If you use this, don't forget to add pry to your Gemfile!)
11
- # require "pry"
12
- # Pry.start
13
-
14
- require "irb"
15
- IRB.start(__FILE__)
data/bin/setup DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here
@@ -1,111 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spotify
4
- ##
5
- # Spotify::Auth inherits from OAuth2::Client based on the "oauth-2" gem.
6
- #
7
- class Auth < OAuth2::Client
8
- ##
9
- # An entire list of Spotify's OAuth scopes. Stored
10
- # in the form of a symbolized array.
11
- # Example: `[:scope1, :scope2]`
12
- #
13
- # @see https://developer.spotify.com/web-api/using-scopes/
14
- #
15
- # Last updated: 21 October 2017
16
- #
17
- SCOPES = %i[
18
- playlist-read-private playlist-read-collaborative
19
- playlist-modify-public playlist-modify-private
20
- ugc-image-upload user-follow-modify user-follow-read
21
- user-library-read user-library-modify user-read-private
22
- user-read-birthdate user-read-email user-top-read
23
- user-read-playback-state user-modify-playback-state
24
- user-read-currently-playing user-read-recently-played
25
- streaming
26
- ].freeze
27
-
28
- ##
29
- # Error-related translations we're using.
30
- #
31
- OAUTH_I18N = {
32
- must_be_hash: "Must be a Hash. Example: Spotify::Auth.new({ client_id: '', ... })",
33
- require_attr: "Expecting a '%s' key. You can obtain from https://developer.spotify.com"
34
- }.freeze
35
-
36
- ##
37
- # Initialize the Spotify Auth object.
38
- #
39
- # @example
40
- # @auth = Spotify::Auth.new({
41
- # client_id: "[client id goes here]",
42
- # client_secret: "[client secret goes here]",
43
- # redirect_uri: "http://localhost"
44
- # })
45
- #
46
- # @param [Hash] config OAuth configuration containing the Client ID, secret and redirect URL.
47
- #
48
- # @see https://developer.spotify.com/my-applications/
49
- #
50
- def initialize(config)
51
- validate_initialized_input(config)
52
- client_id = config.delete(:client_id)
53
- client_secret = config.delete(:client_secret)
54
- opts = {
55
- site: "https://api.spotify.com",
56
- authorize_url: "https://accounts.spotify.com/oauth/authorize",
57
- token_url: "https://accounts.spotify.com/api/token"
58
- }.merge(config)
59
- super(client_id, client_secret, opts)
60
- end
61
-
62
- ##
63
- # Get a HTTP URL to send user for authorizing with Spotify.
64
- #
65
- # @example
66
- # @auth = Spotify::Auth.new({
67
- # client_id: "[client id goes here]",
68
- # client_secret: "[client secret goes here]",
69
- # redirect_uri: "http://localhost"
70
- # })
71
- #
72
- # @auth.authorize_url
73
- #
74
- # @param [Hash] override_params Optional hash containing any overriding values for parameters.
75
- # Parameters used are client_id, redirect_uri, response_type and scope.
76
- # @return [String] A fully qualified Spotify authorization URL to send the user to.
77
- #
78
- # @see https://developer.spotify.com/web-api/authorization-guide/
79
- #
80
- def authorize_url(override_params={})
81
- super({
82
- client_id: id,
83
- response_type: "code",
84
- scope: SCOPES.join(" ")
85
- }.merge(override_params))
86
- end
87
-
88
- private
89
-
90
- ##
91
- # Validate initialization configuration and raise errors.
92
- #
93
- # @param [Hash] config OAuth configuration containing the Client ID, secret and redirect URL.
94
- # @return [nil]
95
- #
96
- def validate_initialized_input(config)
97
- raise Errors::AuthClientCredentialsError.new(OAUTH_I18N[:must_be_hash]) unless config.is_a?(Hash)
98
-
99
- %i[client_id client_secret].each do |key|
100
- raise Errors::AuthClientCredentialsError.new(OAUTH_I18N[:require_attr] % key) unless config.has_key?(key)
101
- end
102
- end
103
- end
104
-
105
- class Errors
106
- ##
107
- # A Error class for when authentication client credentials are empty or incorrectly formatted.
108
- #
109
- class AuthClientCredentialsError < StandardError; end
110
- end
111
- end