napster 0.0.0 → 0.1.0

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.
@@ -0,0 +1,74 @@
1
+ using StringHelper
2
+
3
+ module Napster
4
+ module Models
5
+ # Tag model
6
+ class Tag
7
+ SUPPORTED_CONTENT_TYPES = [:album,
8
+ :artist,
9
+ :genre,
10
+ :playlist,
11
+ :radio,
12
+ :track].freeze
13
+ ATTRIBUTES = [:type,
14
+ :id,
15
+ :name,
16
+ :content_id,
17
+ :protected,
18
+ :shortcut,
19
+ :parent].freeze
20
+
21
+ ATTRIBUTES.each do |attribute|
22
+ attr_accessor attribute
23
+ end
24
+
25
+ attr_accessor :client
26
+
27
+ def initialize(arg)
28
+ @client = arg[:client] if arg[:client]
29
+ return unless arg[:data]
30
+
31
+ ATTRIBUTES.each do |attribute|
32
+ send("#{attribute}=", arg[:data][attribute.to_s.camel_case_lower])
33
+ end
34
+ end
35
+
36
+ def self.collection(arg)
37
+ arg[:data].map do |tag|
38
+ Tag.new(data: tag, client: @client)
39
+ end
40
+ end
41
+
42
+ # Top level methods
43
+
44
+ def all
45
+ response = @client.get('/tags')
46
+ Tag.collection(data: response['tags'])
47
+ end
48
+
49
+ def find(id)
50
+ e = 'Invalid tag id'
51
+ raise ArgumentError, e unless Napster::Moniker.check(id, :tag)
52
+ response = @client.get("/tags/#{id}")
53
+ Tag.new(data: response['tags'].first, client: @client)
54
+ end
55
+
56
+ # /me
57
+
58
+ def contents(named_tag, type, params)
59
+ params[:tag] = named_tag if named_tag
60
+ params[:type] = type.to_s if type
61
+ get_options = {
62
+ params: params,
63
+ headers: {
64
+ Authorization: 'Bearer ' + @client.access_token,
65
+ 'Content-Type' => 'application/json',
66
+ 'Accept-Version' => '2.0.0'
67
+ }
68
+ }
69
+ response = @client.get('/me/tags/search', get_options)
70
+ Content.collection(data: response['data'], client: @client)
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,72 @@
1
+ using StringHelper
2
+
3
+ module Napster
4
+ module Models
5
+ # Track model
6
+ class Track
7
+ ATTRIBUTES = [:type,
8
+ :id,
9
+ :index,
10
+ :disc,
11
+ :href,
12
+ :playback_seconds,
13
+ :explicit,
14
+ :name,
15
+ :isrc,
16
+ :shortcut,
17
+ :amg,
18
+ :blurbs,
19
+ :artist_name,
20
+ :album_name,
21
+ :formats,
22
+ :album_id,
23
+ :contributors].freeze
24
+
25
+ ATTRIBUTES.each do |attribute|
26
+ attr_accessor attribute
27
+ end
28
+
29
+ attr_accessor :client
30
+
31
+ def initialize(arg)
32
+ @client = arg[:client] if arg[:client]
33
+ return unless arg[:data]
34
+
35
+ ATTRIBUTES.each do |attribute|
36
+ send("#{attribute}=", arg[:data][attribute.to_s.camel_case_lower])
37
+ end
38
+ end
39
+
40
+ def self.collection(arg)
41
+ arg[:data].map do |track|
42
+ Track.new(data: track, client: @client)
43
+ end
44
+ end
45
+
46
+ def find(arg)
47
+ return find_by_id(arg) if Napster::Moniker.check(arg, :track)
48
+ find_by_name(arg)
49
+ end
50
+
51
+ def find_by_id(id)
52
+ response = @client.get("/tracks/#{id}")
53
+ Napster::Models::Track.new(data: response['tracks'].first)
54
+ end
55
+
56
+ def find_all_by_name(name)
57
+ options = {
58
+ params: {
59
+ q: name,
60
+ type: 'track'
61
+ }
62
+ }
63
+ response = @client.get('/search', options)
64
+ Napster::Models::Track.collection(data: response['data'])
65
+ end
66
+
67
+ def find_by_name(name)
68
+ find_all_by_name(name).first
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,36 @@
1
+ using StringHelper
2
+
3
+ module Napster
4
+ module Models
5
+ # UploadedImage model
6
+ class UploadedImage
7
+ ATTRIBUTES = [:content_id,
8
+ :image_type,
9
+ :url,
10
+ :default_image,
11
+ :image_id,
12
+ :version].freeze
13
+
14
+ ATTRIBUTES.each do |attribute|
15
+ attr_accessor attribute
16
+ end
17
+
18
+ attr_accessor :client
19
+
20
+ def initialize(arg)
21
+ @client = arg[:client] if arg[:client]
22
+ return unless arg[:data]
23
+
24
+ ATTRIBUTES.each do |attribute|
25
+ send("#{attribute}=", arg[:data][attribute.to_s.camel_case_lower])
26
+ end
27
+ end
28
+
29
+ def self.collection(arg)
30
+ arg[:data].map do |uploaded_image|
31
+ UploadedImage.new(data: uploaded_image, client: @client)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,29 @@
1
+ module Napster
2
+ # Module for checking Napster API id monikers
3
+ module Moniker
4
+ MONIKER_REGEXES = {
5
+ artist: /^\s*(Art\.\d+)\s*$/i,
6
+ track: /^\s*(Tra\.\d+)\s*$/i,
7
+ album: /^\s*(Alb\.\d+)\s*$/i,
8
+ review: /^\s*(RevAl\.\d+)\s*$/i,
9
+ genre: /^\s*(g\.\d+)\s*$/i,
10
+ post: /^\s*(po\.\d+)\s*$/i,
11
+ single_artist_station: /^\s*(sas\.\d+)\s*$/i,
12
+ station: /^\s*((p|sa|ma|sma|st|mt|smt)s\.\d+)\s*$/i,
13
+ playlist: /^\s*((m|p)p\.\d+)\s*$/i,
14
+ tag: /^\s*(tag\.\d+)\s*$/i,
15
+ radio: /^\s*(ts\.\d+)\s*$/i,
16
+ member_guid: /^[0-9A-F]{32}$/,
17
+ member_playlist: /^\s*(mp\.\d+)\s*$/i,
18
+ published_playlist: /^\s*(pp\.\d+)\s*$/i
19
+ }.freeze
20
+
21
+ # Given id and type, check if the id is of the type
22
+ # @param id [String]
23
+ # @param type [Symbol]
24
+ # @return [MatchData]
25
+ def self.check(id, type)
26
+ MONIKER_REGEXES[type].match(id)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ module Napster
2
+ # The Request class implements a request object used to
3
+ # call Napster API
4
+ class Request
5
+ HOST_URL = 'https://api.napster.com'.freeze
6
+
7
+ attr_accessor :faraday
8
+
9
+ def initialize(options)
10
+ @faraday = Faraday.new(url: HOST_URL) do |faraday|
11
+ faraday.request :url_encoded
12
+ faraday.adapter Faraday.default_adapter
13
+
14
+ if options[:access_token]
15
+ faraday.authorization :Bearer, options[:access_token]
16
+ end
17
+
18
+ if options[:api_key] && options[:api_secret]
19
+ faraday.basic_auth(options[:api_key], options[:api_secret])
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ module Napster
2
+ # Raised when the response status is anything over 400
3
+ class ResponseError < Faraday::Error
4
+ attr_accessor :http_status,
5
+ :response_body,
6
+ :faraday_response
7
+
8
+ def initialize(response)
9
+ @http_status = response.status
10
+ @response_body = response.body
11
+ @faraday_response = response
12
+ end
13
+ end
14
+ end
@@ -1,3 +1,3 @@
1
1
  module Napster
2
- VERSION = "0.0.0"
2
+ VERSION = '0.1.0'.freeze
3
3
  end
@@ -0,0 +1,10 @@
1
+ # Monkey patching String to add camel_case_lower conversion
2
+ module StringHelper
3
+ refine String do
4
+ def camel_case_lower
5
+ split('_').inject([]) do |buffer, e|
6
+ buffer.push(buffer.empty? ? e : e.capitalize)
7
+ end.join
8
+ end
9
+ end
10
+ end
data/napster.gemspec CHANGED
@@ -4,30 +4,43 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'napster/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "napster"
8
- spec.version = Napster::VERSION
9
- spec.authors = ["Jason Kim"]
10
- spec.email = ["jasonkim@rhapsody.com"]
7
+ spec.name = 'napster'
8
+ spec.version = Napster::VERSION
9
+ spec.authors = ['Jason Kim']
10
+ spec.email = ['jasonkim@rhapsody.com']
11
11
 
12
- spec.summary = %q{A Ruby interface to the Napster API.}
13
- spec.description = %q{A Ruby interface to the Napster API.}
14
- spec.homepage = "https://developer.rhapsody.com/"
15
- spec.license = "MIT"
12
+ spec.summary = 'A Ruby interface to the Napster API.'
13
+ spec.description = 'A Ruby interface to the Napster API.'
14
+ spec.homepage = 'https://developer.napster.com/'
15
+ spec.license = 'MIT'
16
16
 
17
17
  # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
18
18
  # delete this section to allow pushing this gem to any host.
19
19
  if spec.respond_to?(:metadata)
20
- spec.metadata['allowed_push_host'] = "https://rubygems.org"
20
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
21
21
  else
22
- raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
22
+ raise 'RubyGems 2.0 or newer is required to ' \
23
+ 'protect against public gem pushes.'
23
24
  end
24
25
 
25
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
- spec.bindir = "exe"
27
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
- spec.require_paths = ["lib"]
26
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
+ f.match(%r{^(test|spec|features)/})
28
+ end
29
+ spec.bindir = 'exe'
30
+ spec.executables = spec.files.grep(%r{^exe/}) do |f|
31
+ File.basename(f)
32
+ end
33
+ spec.require_paths = ['lib']
34
+
35
+ spec.add_dependency('faraday', '~> 0.9.2')
36
+ spec.add_dependency('oj', '~> 2.14')
29
37
 
30
- spec.add_development_dependency "bundler", "~> 1.10"
31
- spec.add_development_dependency "rake", "~> 10.0"
32
- spec.add_development_dependency "rspec"
38
+ spec.add_development_dependency 'bundler', '~> 1.11'
39
+ spec.add_development_dependency 'rake', '~> 11.1'
40
+ spec.add_development_dependency 'rspec', '~> 3.4'
41
+ spec.add_development_dependency 'capybara', '~> 2.6'
42
+ spec.add_development_dependency 'poltergeist', '~> 1.9'
43
+ spec.add_development_dependency 'rubocop', '~> 0.38.0'
44
+ spec.add_development_dependency 'faker', '~> 1.6'
45
+ spec.add_development_dependency 'yard', '~> 0.8.7.6'
33
46
  end
metadata CHANGED
@@ -1,57 +1,155 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: napster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Kim
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-02-17 00:00:00.000000000 Z
11
+ date: 2016-06-15 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.9.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: oj
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.14'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.14'
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: bundler
15
43
  requirement: !ruby/object:Gem::Requirement
16
44
  requirements:
17
45
  - - "~>"
18
46
  - !ruby/object:Gem::Version
19
- version: '1.10'
47
+ version: '1.11'
20
48
  type: :development
21
49
  prerelease: false
22
50
  version_requirements: !ruby/object:Gem::Requirement
23
51
  requirements:
24
52
  - - "~>"
25
53
  - !ruby/object:Gem::Version
26
- version: '1.10'
54
+ version: '1.11'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: rake
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
59
  - - "~>"
32
60
  - !ruby/object:Gem::Version
33
- version: '10.0'
61
+ version: '11.1'
34
62
  type: :development
35
63
  prerelease: false
36
64
  version_requirements: !ruby/object:Gem::Requirement
37
65
  requirements:
38
66
  - - "~>"
39
67
  - !ruby/object:Gem::Version
40
- version: '10.0'
68
+ version: '11.1'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: rspec
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
- - - ">="
73
+ - - "~>"
46
74
  - !ruby/object:Gem::Version
47
- version: '0'
75
+ version: '3.4'
48
76
  type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
- - - ">="
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.4'
83
+ - !ruby/object:Gem::Dependency
84
+ name: capybara
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: poltergeist
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.9'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.9'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.38.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.38.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: faker
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.6'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.6'
139
+ - !ruby/object:Gem::Dependency
140
+ name: yard
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.8.7.6
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
53
151
  - !ruby/object:Gem::Version
54
- version: '0'
152
+ version: 0.8.7.6
55
153
  description: A Ruby interface to the Napster API.
56
154
  email:
57
155
  - jasonkim@rhapsody.com
@@ -61,6 +159,7 @@ extra_rdoc_files: []
61
159
  files:
62
160
  - ".gitignore"
63
161
  - ".rspec"
162
+ - ".rubocop.yml"
64
163
  - ".travis.yml"
65
164
  - Gemfile
66
165
  - LICENSE.txt
@@ -69,9 +168,31 @@ files:
69
168
  - bin/console
70
169
  - bin/setup
71
170
  - lib/napster.rb
171
+ - lib/napster/client.rb
172
+ - lib/napster/me.rb
173
+ - lib/napster/models/album.rb
174
+ - lib/napster/models/artist.rb
175
+ - lib/napster/models/chart.rb
176
+ - lib/napster/models/content.rb
177
+ - lib/napster/models/favorite.rb
178
+ - lib/napster/models/favorite_status.rb
179
+ - lib/napster/models/follower.rb
180
+ - lib/napster/models/following.rb
181
+ - lib/napster/models/library.rb
182
+ - lib/napster/models/library_date_time.rb
183
+ - lib/napster/models/member.rb
184
+ - lib/napster/models/playlist.rb
185
+ - lib/napster/models/profile.rb
186
+ - lib/napster/models/tag.rb
187
+ - lib/napster/models/track.rb
188
+ - lib/napster/models/uploaded_image.rb
189
+ - lib/napster/moniker.rb
190
+ - lib/napster/request.rb
191
+ - lib/napster/response_error.rb
72
192
  - lib/napster/version.rb
193
+ - lib/string_helper.rb
73
194
  - napster.gemspec
74
- homepage: https://developer.rhapsody.com/
195
+ homepage: https://developer.napster.com/
75
196
  licenses:
76
197
  - MIT
77
198
  metadata: