beatport 0.1.10 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -1
- data/README.md +16 -7
- data/VERSION +1 -1
- data/beatport.gemspec +10 -21
- data/lib/beatport.rb +5 -1
- data/lib/beatport/client.rb +28 -8
- data/lib/beatport/config.rb +8 -0
- data/lib/beatport/error.rb +5 -0
- data/lib/beatport/support/query_builder.rb +13 -2
- data/spec/catalog/account_type_spec.rb +1 -1
- data/spec/catalog/artist_spec.rb +1 -1
- data/spec/catalog/mixed_spec.rb +2 -2
- data/spec/spec_helper.rb +2 -0
- metadata +22 -20
- data/Gemfile.lock +0 -52
- data/spec/fixtures/account_type.yml +0 -83
- data/spec/fixtures/artist.yml +0 -554
- data/spec/fixtures/audio_format.yml +0 -126
- data/spec/fixtures/autocomplete.yml +0 -84
- data/spec/fixtures/chart.yml +0 -586
- data/spec/fixtures/country.yml +0 -47
- data/spec/fixtures/currency.yml +0 -131
- data/spec/fixtures/genre.yml +0 -377
- data/spec/fixtures/item_type.yml +0 -48
- data/spec/fixtures/label.yml +0 -407
- data/spec/fixtures/mixed.yml +0 -94
- data/spec/fixtures/release.yml +0 -1284
- data/spec/fixtures/search.yml +0 -327
- data/spec/fixtures/source_type.yml +0 -42
- data/spec/fixtures/track.yml +0 -1114
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -8,6 +8,16 @@ Currently incomplete, but under development.
|
|
8
8
|
|
9
9
|
[![Dependency Status](https://gemnasium.com/mateomurphy/beatport.png)](https://gemnasium.com/mateomurphy/beatport)
|
10
10
|
|
11
|
+
## Oauth
|
12
|
+
|
13
|
+
Beatport's api now requires authentication via Oauth. This means you now need to provide the gem
|
14
|
+
you oauth credentials to make requests, for example in a rails initializer:
|
15
|
+
|
16
|
+
Beatport.consumer_key = 'consumer_key'
|
17
|
+
Beatport.consumer_secret = 'consumer_secret'
|
18
|
+
Beatport.access_token_key = 'access_token_key'
|
19
|
+
Beatport.access_token_secret = 'access_token_secret'
|
20
|
+
|
11
21
|
## Facets
|
12
22
|
|
13
23
|
Many queries to beatport support facets, but they aren't properly documentated on their site. These are the ones I've found so far:
|
@@ -19,8 +29,9 @@ Many queries to beatport support facets, but they aren't properly documentated o
|
|
19
29
|
## Examples
|
20
30
|
|
21
31
|
```ruby
|
22
|
-
require 'beatport'
|
23
|
-
|
32
|
+
require 'beatport'
|
33
|
+
|
34
|
+
# Search using the query "Mord Fustang" on Beatport
|
24
35
|
query = Beatport::Catalog::Search.query("Mord Fustang")
|
25
36
|
|
26
37
|
query.class # => returns a Beatport::Collection object
|
@@ -34,7 +45,7 @@ require 'beatport'
|
|
34
45
|
# Note that search results change frequently, so first result may not
|
35
46
|
necessarily be a Beatport::Catalog::Artist object
|
36
47
|
|
37
|
-
# Find top downloads for a given genre
|
48
|
+
# Find top downloads for a given genre
|
38
49
|
genres = Beatport::Catalog::Genre.all # => list all genres
|
39
50
|
# display each genre and its corresponding Beatport genre slug
|
40
51
|
|
@@ -54,9 +65,7 @@ require 'beatport'
|
|
54
65
|
|
55
66
|
# An alternative for searching for genre by slug is searching by genre ID
|
56
67
|
trance_genre = Beatport::Catalog::Genre.find(7) # => returns a Trance Genre object
|
57
|
-
|
58
|
-
|
59
|
-
```
|
68
|
+
```
|
60
69
|
|
61
70
|
## Contributing to beatport
|
62
71
|
|
@@ -70,6 +79,6 @@ require 'beatport'
|
|
70
79
|
|
71
80
|
## Copyright
|
72
81
|
|
73
|
-
Copyright (c) 2011-
|
82
|
+
Copyright (c) 2011-2013 Mateo Murphy. See LICENSE.txt for
|
74
83
|
further details.
|
75
84
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/beatport.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "beatport"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Mateo Murphy"]
|
12
|
-
s.date = "2013-08-
|
12
|
+
s.date = "2013-08-31"
|
13
13
|
s.description = "A ruby gem for accessing the beatport api"
|
14
14
|
s.email = "mateo.murphy@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -20,7 +20,6 @@ Gem::Specification.new do |s|
|
|
20
20
|
".document",
|
21
21
|
".rspec",
|
22
22
|
"Gemfile",
|
23
|
-
"Gemfile.lock",
|
24
23
|
"LICENSE.txt",
|
25
24
|
"README.md",
|
26
25
|
"Rakefile",
|
@@ -61,6 +60,8 @@ Gem::Specification.new do |s|
|
|
61
60
|
"lib/beatport/catalog/track.rb",
|
62
61
|
"lib/beatport/client.rb",
|
63
62
|
"lib/beatport/collection.rb",
|
63
|
+
"lib/beatport/config.rb",
|
64
|
+
"lib/beatport/error.rb",
|
64
65
|
"lib/beatport/item.rb",
|
65
66
|
"lib/beatport/price.rb",
|
66
67
|
"lib/beatport/support.rb",
|
@@ -87,21 +88,6 @@ Gem::Specification.new do |s|
|
|
87
88
|
"spec/catalog/source_type_spec.rb",
|
88
89
|
"spec/catalog/track_spec.rb",
|
89
90
|
"spec/collection_spec.rb",
|
90
|
-
"spec/fixtures/account_type.yml",
|
91
|
-
"spec/fixtures/artist.yml",
|
92
|
-
"spec/fixtures/audio_format.yml",
|
93
|
-
"spec/fixtures/autocomplete.yml",
|
94
|
-
"spec/fixtures/chart.yml",
|
95
|
-
"spec/fixtures/country.yml",
|
96
|
-
"spec/fixtures/currency.yml",
|
97
|
-
"spec/fixtures/genre.yml",
|
98
|
-
"spec/fixtures/item_type.yml",
|
99
|
-
"spec/fixtures/label.yml",
|
100
|
-
"spec/fixtures/mixed.yml",
|
101
|
-
"spec/fixtures/release.yml",
|
102
|
-
"spec/fixtures/search.yml",
|
103
|
-
"spec/fixtures/source_type.yml",
|
104
|
-
"spec/fixtures/track.yml",
|
105
91
|
"spec/item_spec.rb",
|
106
92
|
"spec/price_spec.rb",
|
107
93
|
"spec/spec_helper.rb",
|
@@ -118,7 +104,8 @@ Gem::Specification.new do |s|
|
|
118
104
|
s.specification_version = 3
|
119
105
|
|
120
106
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
121
|
-
s.add_runtime_dependency(%q<
|
107
|
+
s.add_runtime_dependency(%q<addressable>, [">= 0"])
|
108
|
+
s.add_runtime_dependency(%q<signet>, [">= 0"])
|
122
109
|
s.add_runtime_dependency(%q<money>, ["~> 5.1.1"])
|
123
110
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
124
111
|
s.add_development_dependency(%q<webmock>, [">= 0"])
|
@@ -128,7 +115,8 @@ Gem::Specification.new do |s|
|
|
128
115
|
s.add_development_dependency(%q<yard>, [">= 0"])
|
129
116
|
s.add_development_dependency(%q<vcr>, [">= 0"])
|
130
117
|
else
|
131
|
-
s.add_dependency(%q<
|
118
|
+
s.add_dependency(%q<addressable>, [">= 0"])
|
119
|
+
s.add_dependency(%q<signet>, [">= 0"])
|
132
120
|
s.add_dependency(%q<money>, ["~> 5.1.1"])
|
133
121
|
s.add_dependency(%q<bundler>, [">= 0"])
|
134
122
|
s.add_dependency(%q<webmock>, [">= 0"])
|
@@ -139,7 +127,8 @@ Gem::Specification.new do |s|
|
|
139
127
|
s.add_dependency(%q<vcr>, [">= 0"])
|
140
128
|
end
|
141
129
|
else
|
142
|
-
s.add_dependency(%q<
|
130
|
+
s.add_dependency(%q<addressable>, [">= 0"])
|
131
|
+
s.add_dependency(%q<signet>, [">= 0"])
|
143
132
|
s.add_dependency(%q<money>, ["~> 5.1.1"])
|
144
133
|
s.add_dependency(%q<bundler>, [">= 0"])
|
145
134
|
s.add_dependency(%q<webmock>, [">= 0"])
|
data/lib/beatport.rb
CHANGED
@@ -1,15 +1,19 @@
|
|
1
1
|
# http://api.beatport.com/index.html
|
2
2
|
require 'ostruct'
|
3
|
-
require '
|
3
|
+
require 'signet/oauth_1/client'
|
4
4
|
require 'money'
|
5
5
|
|
6
6
|
module Beatport
|
7
7
|
autoload :Catalog, 'beatport/catalog'
|
8
|
+
autoload :Config, 'beatport/config'
|
8
9
|
autoload :Client, 'beatport/client'
|
9
10
|
autoload :Collection, 'beatport/collection'
|
10
11
|
autoload :Item, 'beatport/item'
|
11
12
|
autoload :Price, 'beatport/price'
|
12
13
|
autoload :Support, 'beatport/support'
|
14
|
+
autoload :Error, 'beatport/error'
|
15
|
+
|
16
|
+
extend Config
|
13
17
|
|
14
18
|
def self.const_missing(name)
|
15
19
|
if Beatport::Catalog.const_defined?(name)
|
data/lib/beatport/client.rb
CHANGED
@@ -1,15 +1,35 @@
|
|
1
1
|
module Beatport
|
2
2
|
module Client
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
def self.client
|
4
|
+
@client ||= Signet::OAuth1::Client.new(
|
5
|
+
:client_credential_key => Beatport.consumer_key,
|
6
|
+
:client_credential_secret => Beatport.consumer_secret,
|
7
|
+
:token_credential_key => Beatport.access_token_key,
|
8
|
+
:token_credential_secret => Beatport.access_token_secret
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.builder
|
13
|
+
@builder ||= Support::QueryBuilder.new
|
14
|
+
end
|
8
15
|
|
9
16
|
def self.retrieve(path, klass, *args)
|
10
|
-
|
17
|
+
uri = Addressable::URI.new(
|
18
|
+
:scheme => 'https',
|
19
|
+
:host => 'api.beatport.com',
|
20
|
+
:path => "/catalog/3/#{path}",
|
21
|
+
:query_values => builder.process(*args)
|
22
|
+
)
|
11
23
|
|
12
|
-
result =
|
24
|
+
result = client.fetch_protected_resource(:uri => uri.to_s)
|
25
|
+
result = JSON.parse(result.body)
|
26
|
+
|
27
|
+
# underscore result keys
|
28
|
+
result = Support::Inflector.process_keys(result) { |k| Support::Inflector.underscore(k) }
|
29
|
+
|
30
|
+
if result['metadata']['error']
|
31
|
+
raise Error.new("#{result['metadata']['error']}: #{result['metadata']['message']}")
|
32
|
+
end
|
13
33
|
|
14
34
|
case result['results']
|
15
35
|
when Array
|
@@ -21,7 +41,7 @@ module Beatport
|
|
21
41
|
when Hash
|
22
42
|
klass.new(result['results'])
|
23
43
|
else
|
24
|
-
raise "results is an unexpected class #{result['results'].class}"
|
44
|
+
raise Error.new("results is an unexpected class #{result['results'].class}")
|
25
45
|
end
|
26
46
|
end
|
27
47
|
end
|
@@ -2,7 +2,7 @@ module Beatport
|
|
2
2
|
module Support
|
3
3
|
# Converts a set of arguments into a format that beatport will understand
|
4
4
|
class QueryBuilder
|
5
|
-
SPECIAL_OPTIONS = ['sortBy', 'facets', 'returnFacets']
|
5
|
+
SPECIAL_OPTIONS = ['sortBy', 'facets', 'returnFacets', 'subgenres']
|
6
6
|
|
7
7
|
def single_result?
|
8
8
|
@single_result
|
@@ -37,8 +37,13 @@ module Beatport
|
|
37
37
|
|
38
38
|
options = camelize_keys(options)
|
39
39
|
|
40
|
+
# Handle special options that need to be generated in a specific manner
|
40
41
|
options.map do |key, value|
|
41
|
-
|
42
|
+
if special_option?(key)
|
43
|
+
options[key] = send(Inflector.underscore("process_#{key}"), value)
|
44
|
+
elsif value.is_a?(Array)
|
45
|
+
options[key] = value.join(',')
|
46
|
+
end
|
42
47
|
end
|
43
48
|
|
44
49
|
options
|
@@ -71,6 +76,12 @@ module Beatport
|
|
71
76
|
end
|
72
77
|
end
|
73
78
|
|
79
|
+
# Special processing for subgenres
|
80
|
+
def process_subgenres(value)
|
81
|
+
value ? 'true' : 'false'
|
82
|
+
end
|
83
|
+
|
84
|
+
# Map values delimited by ,
|
74
85
|
def map_values(values)
|
75
86
|
values = values.split(/,\s*/) if values.is_a?(String)
|
76
87
|
values.map do |value|
|
data/spec/catalog/artist_spec.rb
CHANGED
data/spec/catalog/mixed_spec.rb
CHANGED
@@ -13,11 +13,11 @@ module Beatport::Catalog
|
|
13
13
|
describe '.all' do
|
14
14
|
subject do
|
15
15
|
Mixed.all(
|
16
|
-
:label_ids => [804,1390],
|
16
|
+
:label_ids => [804, 1390],
|
17
17
|
:artist_ids => [7181, 10395],
|
18
18
|
:chart_ids => [15722, 29514],
|
19
19
|
:release_ids => [164808, 385763],
|
20
|
-
:track_ids => [1873426,1746687]
|
20
|
+
:track_ids => [1873426, 1746687]
|
21
21
|
)
|
22
22
|
end
|
23
23
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beatport
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,10 +9,26 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: addressable
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: signet
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|
17
33
|
none: false
|
18
34
|
requirements:
|
@@ -166,7 +182,6 @@ files:
|
|
166
182
|
- .document
|
167
183
|
- .rspec
|
168
184
|
- Gemfile
|
169
|
-
- Gemfile.lock
|
170
185
|
- LICENSE.txt
|
171
186
|
- README.md
|
172
187
|
- Rakefile
|
@@ -207,6 +222,8 @@ files:
|
|
207
222
|
- lib/beatport/catalog/track.rb
|
208
223
|
- lib/beatport/client.rb
|
209
224
|
- lib/beatport/collection.rb
|
225
|
+
- lib/beatport/config.rb
|
226
|
+
- lib/beatport/error.rb
|
210
227
|
- lib/beatport/item.rb
|
211
228
|
- lib/beatport/price.rb
|
212
229
|
- lib/beatport/support.rb
|
@@ -233,21 +250,6 @@ files:
|
|
233
250
|
- spec/catalog/source_type_spec.rb
|
234
251
|
- spec/catalog/track_spec.rb
|
235
252
|
- spec/collection_spec.rb
|
236
|
-
- spec/fixtures/account_type.yml
|
237
|
-
- spec/fixtures/artist.yml
|
238
|
-
- spec/fixtures/audio_format.yml
|
239
|
-
- spec/fixtures/autocomplete.yml
|
240
|
-
- spec/fixtures/chart.yml
|
241
|
-
- spec/fixtures/country.yml
|
242
|
-
- spec/fixtures/currency.yml
|
243
|
-
- spec/fixtures/genre.yml
|
244
|
-
- spec/fixtures/item_type.yml
|
245
|
-
- spec/fixtures/label.yml
|
246
|
-
- spec/fixtures/mixed.yml
|
247
|
-
- spec/fixtures/release.yml
|
248
|
-
- spec/fixtures/search.yml
|
249
|
-
- spec/fixtures/source_type.yml
|
250
|
-
- spec/fixtures/track.yml
|
251
253
|
- spec/item_spec.rb
|
252
254
|
- spec/price_spec.rb
|
253
255
|
- spec/spec_helper.rb
|
@@ -268,7 +270,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
268
270
|
version: '0'
|
269
271
|
segments:
|
270
272
|
- 0
|
271
|
-
hash:
|
273
|
+
hash: -3985965663943551168
|
272
274
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
273
275
|
none: false
|
274
276
|
requirements:
|
data/Gemfile.lock
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: http://rubygems.org/
|
3
|
-
specs:
|
4
|
-
addressable (2.3.2)
|
5
|
-
crack (0.3.2)
|
6
|
-
diff-lcs (1.1.3)
|
7
|
-
git (1.2.5)
|
8
|
-
httparty (0.10.2)
|
9
|
-
multi_json (~> 1.0)
|
10
|
-
multi_xml (>= 0.5.2)
|
11
|
-
i18n (0.6.5)
|
12
|
-
jeweler (1.8.4)
|
13
|
-
bundler (~> 1.0)
|
14
|
-
git (>= 1.2.5)
|
15
|
-
rake
|
16
|
-
rdoc
|
17
|
-
json (1.7.6)
|
18
|
-
log_buddy (0.7.0)
|
19
|
-
money (5.1.1)
|
20
|
-
i18n (~> 0.6.0)
|
21
|
-
multi_json (1.5.0)
|
22
|
-
multi_xml (0.5.3)
|
23
|
-
rake (10.0.3)
|
24
|
-
rdoc (3.12.1)
|
25
|
-
json (~> 1.4)
|
26
|
-
rspec (2.12.0)
|
27
|
-
rspec-core (~> 2.12.0)
|
28
|
-
rspec-expectations (~> 2.12.0)
|
29
|
-
rspec-mocks (~> 2.12.0)
|
30
|
-
rspec-core (2.12.2)
|
31
|
-
rspec-expectations (2.12.1)
|
32
|
-
diff-lcs (~> 1.1.3)
|
33
|
-
rspec-mocks (2.12.2)
|
34
|
-
vcr (2.4.0)
|
35
|
-
webmock (1.9.0)
|
36
|
-
addressable (>= 2.2.7)
|
37
|
-
crack (>= 0.1.7)
|
38
|
-
yard (0.8.4.1)
|
39
|
-
|
40
|
-
PLATFORMS
|
41
|
-
ruby
|
42
|
-
|
43
|
-
DEPENDENCIES
|
44
|
-
bundler
|
45
|
-
httparty
|
46
|
-
jeweler
|
47
|
-
log_buddy
|
48
|
-
money (~> 5.1.1)
|
49
|
-
rspec
|
50
|
-
vcr
|
51
|
-
webmock
|
52
|
-
yard
|