beatport 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -5,6 +5,7 @@ source "http://rubygems.org"
5
5
 
6
6
  gem 'addressable'
7
7
  gem 'signet'
8
+ gem 'faraday', '~> 0.8.8'
8
9
  gem 'money', '~> 5.1.1' # https://github.com/RubyMoney/money
9
10
 
10
11
  # Add dependencies to develop your gem here.
data/README.md CHANGED
@@ -1,23 +1,23 @@
1
1
  # Beatport
2
2
 
3
- A ruby gem for accessing the Beatport API
4
-
5
- http://api.beatport.com
3
+ [![Dependency Status](https://gemnasium.com/mateomurphy/beatport.png)](https://gemnasium.com/mateomurphy/beatport)
6
4
 
7
- Currently incomplete, but under development.
5
+ A ruby gem for accessing the Beatport API; currently incomplete and only supports the Catalog API, but under development.
8
6
 
9
- [![Dependency Status](https://gemnasium.com/mateomurphy/beatport.png)](https://gemnasium.com/mateomurphy/beatport)
7
+ https://oauth-api.beatport.com/docs/
10
8
 
11
9
  ## Oauth
12
10
 
13
11
  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:
12
+ your oauth credentials to make requests, for example in a rails initializer:
15
13
 
16
14
  Beatport.consumer_key = 'consumer_key'
17
15
  Beatport.consumer_secret = 'consumer_secret'
18
16
  Beatport.access_token_key = 'access_token_key'
19
17
  Beatport.access_token_secret = 'access_token_secret'
20
18
 
19
+ Your consumer key and secret are found in the API Keys section of your beatbort account, whereas the access token key and secret can be generated at the docs page.
20
+
21
21
  ## Facets
22
22
 
23
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:
@@ -42,8 +42,7 @@ Many queries to beatport support facets, but they aren't properly documentated o
42
42
  query[1].class # => second result is a Beatport.Catalog::Chart object
43
43
  query[1].publish_date # => returns the published date of the Chart
44
44
 
45
- # Note that search results change frequently, so first result may not
46
- necessarily be a Beatport::Catalog::Artist object
45
+ # Note that search results change frequently, so first result may not necessarily be a Beatport::Catalog::Artist object
47
46
 
48
47
  # Find top downloads for a given genre
49
48
  genres = Beatport::Catalog::Genre.all # => list all genres
@@ -67,6 +66,11 @@ Many queries to beatport support facets, but they aren't properly documentated o
67
66
  trance_genre = Beatport::Catalog::Genre.find(7) # => returns a Trance Genre object
68
67
  ```
69
68
 
69
+ ## Running specs
70
+
71
+ To run specs, you'll need to create a file with your oauth credentials in `spec/config.rb`, which
72
+ will be loaded by `spec/spec_helper.rb`
73
+
70
74
  ## Contributing to beatport
71
75
 
72
76
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "beatport"
8
- s.version = "0.2.0"
8
+ s.version = "0.2.1"
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-31"
12
+ s.date = "2013-11-20"
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 = [
@@ -37,6 +37,8 @@ Gem::Specification.new do |s|
37
37
  "lib/beatport/catalog/country.rb",
38
38
  "lib/beatport/catalog/currency.rb",
39
39
  "lib/beatport/catalog/djprofile.rb",
40
+ "lib/beatport/catalog/dynamic_image.rb",
41
+ "lib/beatport/catalog/dynamic_images.rb",
40
42
  "lib/beatport/catalog/feature.rb",
41
43
  "lib/beatport/catalog/genre.rb",
42
44
  "lib/beatport/catalog/home.rb",
@@ -66,8 +68,10 @@ Gem::Specification.new do |s|
66
68
  "lib/beatport/price.rb",
67
69
  "lib/beatport/support.rb",
68
70
  "lib/beatport/support/inflector.rb",
71
+ "lib/beatport/support/middleware.rb",
69
72
  "lib/beatport/support/parser.rb",
70
73
  "lib/beatport/support/query_builder.rb",
74
+ "lib/beatport/support/url.rb",
71
75
  "spec/beatport_spec.rb",
72
76
  "spec/catalog/account_type_spec.rb",
73
77
  "spec/catalog/artist_spec.rb",
@@ -106,6 +110,7 @@ Gem::Specification.new do |s|
106
110
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
107
111
  s.add_runtime_dependency(%q<addressable>, [">= 0"])
108
112
  s.add_runtime_dependency(%q<signet>, [">= 0"])
113
+ s.add_runtime_dependency(%q<faraday>, ["~> 0.8.8"])
109
114
  s.add_runtime_dependency(%q<money>, ["~> 5.1.1"])
110
115
  s.add_development_dependency(%q<bundler>, [">= 0"])
111
116
  s.add_development_dependency(%q<webmock>, [">= 0"])
@@ -117,6 +122,7 @@ Gem::Specification.new do |s|
117
122
  else
118
123
  s.add_dependency(%q<addressable>, [">= 0"])
119
124
  s.add_dependency(%q<signet>, [">= 0"])
125
+ s.add_dependency(%q<faraday>, ["~> 0.8.8"])
120
126
  s.add_dependency(%q<money>, ["~> 5.1.1"])
121
127
  s.add_dependency(%q<bundler>, [">= 0"])
122
128
  s.add_dependency(%q<webmock>, [">= 0"])
@@ -129,6 +135,7 @@ Gem::Specification.new do |s|
129
135
  else
130
136
  s.add_dependency(%q<addressable>, [">= 0"])
131
137
  s.add_dependency(%q<signet>, [">= 0"])
138
+ s.add_dependency(%q<faraday>, ["~> 0.8.8"])
132
139
  s.add_dependency(%q<money>, ["~> 5.1.1"])
133
140
  s.add_dependency(%q<bundler>, [">= 0"])
134
141
  s.add_dependency(%q<webmock>, [">= 0"])
@@ -10,12 +10,14 @@ module Beatport
10
10
  autoload :Country, 'beatport/catalog/country'
11
11
  autoload :Currency, 'beatport/catalog/currency'
12
12
  autoload :Djprofile, 'beatport/catalog/djprofile'
13
- autoload :Feature, 'beatport/catalog/feature'
13
+ autoload :DynamicImage, 'beatport/catalog/dynamic_image'
14
+ autoload :DynamicImages, 'beatport/catalog/dynamic_images'
15
+ autoload :Feature, 'beatport/catalog/feature'
14
16
  autoload :Genre, 'beatport/catalog/genre'
15
17
  autoload :Home, 'beatport/catalog/home'
16
18
  autoload :ItemType, 'beatport/catalog/item_type'
17
19
  autoload :Image, 'beatport/catalog/image'
18
- autoload :Images, 'beatport/catalog/images'
20
+ autoload :Images, 'beatport/catalog/images'
19
21
  autoload :Key, 'beatport/catalog/key'
20
22
  autoload :Keys, 'beatport/catalog/keys'
21
23
  autoload :Label, 'beatport/catalog/label'
@@ -30,36 +32,36 @@ module Beatport
30
32
  autoload :Slide, 'beatport/catalog/slide'
31
33
  autoload :Slideshow, 'beatport/catalog/slideshow'
32
34
  autoload :SourceType, 'beatport/catalog/source_type'
33
- autoload :Track, 'beatport/catalog/track'
34
-
35
+ autoload :Track, 'beatport/catalog/track'
36
+
35
37
  def self.artist(id)
36
38
  Artist.find(id)
37
39
  end
38
-
40
+
39
41
  def self.artists(*args)
40
42
  Artist.all(*args)
41
43
  end
42
-
44
+
43
45
  def self.chart(id)
44
46
  Chart.find(id)
45
47
  end
46
-
48
+
47
49
  def self.chart_overview(*args)
48
50
  ChartOverview.get
49
51
  end
50
-
52
+
51
53
  def self.charts(*args)
52
54
  Chart.all
53
55
  end
54
-
56
+
55
57
  def self.genre(key)
56
58
  Genre.find(key)
57
59
  end
58
-
60
+
59
61
  def self.genre_overview
60
62
  Genre.overview
61
63
  end
62
-
64
+
63
65
  def self.genres(*args)
64
66
  Genre.all(*args)
65
67
  end
@@ -83,14 +85,14 @@ module Beatport
83
85
  def self.releases(*args)
84
86
  Release.all(*args)
85
87
  end
86
-
88
+
87
89
  def self.track(id)
88
90
  Track.find(id)
89
91
  end
90
-
92
+
91
93
  def self.tracks(*args)
92
94
  Track.all(*args)
93
- end
94
-
95
+ end
96
+
95
97
  end
96
- end
98
+ end
@@ -1,6 +1,8 @@
1
1
  module Beatport
2
2
  module Catalog
3
3
  class Artist < Item
4
+ include Support::Url
5
+
4
6
  has_many :genres, Genre
5
7
  has_many :subgenres, Genre
6
8
  has_one :images, Images
@@ -20,10 +22,10 @@ module Beatport
20
22
  :artist_name
21
23
  end
22
24
  end
23
-
25
+
24
26
  def top_downloads(options = {})
25
27
  Track.most_popular_for_artist(id, options)
26
28
  end
27
29
  end
28
30
  end
29
- end
31
+ end
@@ -0,0 +1,11 @@
1
+ module Beatport
2
+ module Catalog
3
+ class DynamicImage < Item
4
+ def dynamic_url(options = {})
5
+ url.gsub(/{(\w*)}/) do |m|
6
+ options[m[1...-1].to_sym]
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module Beatport
2
+ module Catalog
3
+ class DynamicImages
4
+ attr_reader :main, :banner, :waveform
5
+
6
+ def initialize(images)
7
+ images.each do |format, data|
8
+ instance_variable_set(:"@#{format}", DynamicImage.new(data))
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -2,7 +2,7 @@ module Beatport
2
2
  module Catalog
3
3
  class Images
4
4
  attr_reader :small, :medium, :large, :waveform, :banner
5
-
5
+
6
6
  def initialize(images)
7
7
  images.each do |format, data|
8
8
  instance_variable_set(:"@#{format}", Image.new(data))
@@ -10,4 +10,4 @@ module Beatport
10
10
  end
11
11
  end
12
12
  end
13
- end
13
+ end
@@ -1,13 +1,15 @@
1
1
  module Beatport
2
2
  module Catalog
3
3
  class Label < Item
4
+ include Support::Url
5
+
4
6
  has_many :genres, Genre
5
7
  has_many :subgenres, Genre
6
8
  has_many :top_downloads, Track
7
9
  has_many :featured_releases, Release
8
10
  has_many :most_popular_releases, Release
9
11
  has_one :images, Images
10
-
12
+
11
13
  class << self
12
14
  def all(options = {})
13
15
  Client.retrieve 'labels', Label, options
@@ -32,4 +34,4 @@ module Beatport
32
34
  end
33
35
  end
34
36
  end
35
- end
37
+ end
@@ -1,6 +1,8 @@
1
1
  module Beatport
2
2
  module Catalog
3
3
  class Release < Item
4
+ include Support::Url
5
+
4
6
  has_many :artists, Artist
5
7
  has_one :audio_format_fee, AudioFormatFee
6
8
  has_many :genres, Genre
@@ -14,15 +16,15 @@ module Beatport
14
16
  def discount
15
17
  tracks_price - price
16
18
  end
17
-
19
+
18
20
  def self.find(*args)
19
21
  Client.retrieve 'releases', Release, *args
20
22
  end
21
23
 
22
24
  def self.all(options={})
23
25
  Client.retrieve 'releases', Release, options
24
- end
25
-
26
+ end
27
+
26
28
  def self.featured(*args)
27
29
  Client.retrieve 'featured/releases', Release, *args
28
30
  end
@@ -34,4 +36,3 @@ module Beatport
34
36
  end
35
37
  end
36
38
  end
37
-
@@ -1,6 +1,8 @@
1
1
  module Beatport
2
- module Catalog
2
+ module Catalog
3
3
  class Track < Item
4
+ include Support::Url
5
+
4
6
  has_many :genres, Genre
5
7
  has_many :sub_genres, Genre
6
8
  has_many :artists, Artist
@@ -9,29 +11,30 @@ module Beatport
9
11
  has_one :label, Label
10
12
  has_one :price, Price
11
13
  has_one :images, Images
14
+ has_one :dynamic_images, DynamicImages
12
15
  has_one :audio_format_fee, AudioFormatFee
13
16
  has_one :key, Keys
14
-
17
+
15
18
  # Returns the track with the given id
16
19
  def self.find(key)
17
20
  Client.retrieve 'tracks', Track, :key => key
18
21
  end
19
-
22
+
20
23
  # Returns all the tracks matching the criterea
21
24
  def self.all(options = {})
22
25
  Client.retrieve 'tracks', Track, options
23
- end
24
-
26
+ end
27
+
25
28
  def self.most_popular(options = {})
26
29
  Client.retrieve 'most-popular', Track, options
27
30
  end
28
-
31
+
29
32
  def self.most_popular_for_genre(id, options = {})
30
33
  options[:id] = id
31
34
  options[:collection] = true
32
35
  Client.retrieve "most-popular/genre", Track, options
33
36
  end
34
-
37
+
35
38
  def self.most_popular_for_artist(id, options = {})
36
39
  options[:id] = id
37
40
  options[:collection] = true
@@ -43,7 +46,7 @@ module Beatport
43
46
  options[:collection] = true
44
47
  Client.retrieve "most-popular/label", Track, options
45
48
  end
46
-
49
+
47
50
  end
48
51
  end
49
- end
52
+ end
@@ -1,5 +1,12 @@
1
1
  module Beatport
2
2
  module Client
3
+ def self.connection
4
+ @connection ||= Faraday.new do |conn|
5
+ conn.use Support::Middleware
6
+ conn.adapter Faraday.default_adapter # make requests with Net::HTTP
7
+ end
8
+ end
9
+
3
10
  def self.client
4
11
  @client ||= Signet::OAuth1::Client.new(
5
12
  :client_credential_key => Beatport.consumer_key,
@@ -13,19 +20,20 @@ module Beatport
13
20
  @builder ||= Support::QueryBuilder.new
14
21
  end
15
22
 
16
- def self.retrieve(path, klass, *args)
17
- uri = Addressable::URI.new(
23
+ def self.uri(path, args)
24
+ Addressable::URI.new(
18
25
  :scheme => 'https',
19
26
  :host => 'api.beatport.com',
20
27
  :path => "/catalog/3/#{path}",
21
28
  :query_values => builder.process(*args)
22
- )
23
-
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
+ end
31
+
32
+ def self.retrieve(path, klass, *args)
33
+ result = client.fetch_protected_resource(
34
+ :connection => connection,
35
+ :uri => uri(path, args).to_s
36
+ ).body
29
37
 
30
38
  if result['metadata']['error']
31
39
  raise Error.new("#{result['metadata']['error']}: #{result['metadata']['message']}")
@@ -1,21 +1,21 @@
1
1
  module Beatport
2
-
2
+
3
3
  class Item < OpenStruct
4
4
  class << self
5
5
  def associations
6
6
  @associations ||= {}
7
7
  end
8
-
8
+
9
9
  def has_one(var, klass)
10
10
  lazy_accessor(var)
11
11
  self.associations[var] = {:list => false, :klass => klass}
12
12
  end
13
-
13
+
14
14
  def has_many(var, klass)
15
15
  lazy_accessor(var)
16
16
  self.associations[var] = {:list => true, :klass => klass}
17
17
  end
18
-
18
+
19
19
  def lazy_accessor(var)
20
20
  return if respond_to?(var)
21
21
  class_eval "def #{var}; @#{var}; end"
@@ -39,25 +39,25 @@ module Beatport
39
39
  end
40
40
  end
41
41
  end
42
-
42
+
43
43
  def initialize(data = {})
44
44
  raise ArgumentError, "Invalid data passed to Item.new: #{data.inspect}" unless data.is_a?(Hash)
45
-
45
+
46
46
  # OpenStruct doesn't like id or type, so we store them after the call to super
47
47
  id = data.delete('id')
48
48
  type = data.delete('type')
49
-
49
+
50
50
  self.class.associations.each do |k, v|
51
51
  associate(data, k, v[:list], v[:klass])
52
52
  end
53
-
53
+
54
54
  super(data)
55
55
 
56
56
  data.each do |k, v|
57
57
  @table[k.to_sym] = Date.parse(v) if k =~ /_date$/
58
58
  @table[k.to_sym] = Regexp.new(v.to_s) if k =~ /_regex$/
59
59
  end
60
-
60
+
61
61
  @table['id'] = id if id
62
62
  @table['type'] = type if type
63
63
  end
@@ -65,21 +65,21 @@ module Beatport
65
65
  def id
66
66
  @table['id']
67
67
  end
68
-
68
+
69
69
  def type
70
70
  @table['type']
71
71
  end
72
-
72
+
73
73
  # Allow treating the item as a hash
74
74
  def [](key)
75
75
  send(key) if respond_to?(key)
76
76
  end
77
-
77
+
78
78
  def associate(data, var, collection = false, klass = Item)
79
79
  a = data.delete(var.to_s)
80
-
80
+
81
81
  return unless a
82
-
82
+
83
83
  if collection && a.is_a?(Array)
84
84
  a = a.compact.map { |g| klass.new(g) }
85
85
  elsif !collection && a.is_a?(Hash)
@@ -90,10 +90,10 @@ module Beatport
90
90
  else
91
91
  raise ArgumentError, "Invalid data for association: '#{var}' = #{a.inspect}"
92
92
  end
93
-
93
+
94
94
  instance_variable_set(:"@#{var}", a)
95
95
  end
96
-
97
-
96
+
97
+
98
98
  end
99
- end
99
+ end
@@ -3,5 +3,7 @@ module Beatport
3
3
  autoload :Inflector, 'beatport/support/inflector'
4
4
  autoload :Parser, 'beatport/support/parser'
5
5
  autoload :QueryBuilder, 'beatport/support/query_builder'
6
+ autoload :Middleware, 'beatport/support/middleware'
7
+ autoload :Url, 'beatport/support/url'
6
8
  end
7
9
  end
@@ -0,0 +1,14 @@
1
+ module Beatport
2
+ module Support
3
+ class Middleware < Faraday::Response::Middleware
4
+ def parse(body)
5
+ body = jsonify(body)
6
+ end
7
+
8
+ def jsonify(body)
9
+ body = ::JSON.parse(body)
10
+ body = Support::Inflector.process_keys(body) { |k| Support::Inflector.underscore(k) }
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ module Beatport
2
+ module Support
3
+ module Url
4
+ def url
5
+ "http://www.beatport.com/#{type}/#{slug}/#{id}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -12,12 +12,13 @@ module Beatport::Catalog
12
12
 
13
13
  describe 'structure' do
14
14
  subject { Artist.find(7181) }
15
-
15
+
16
16
  it { should be_an(Artist) }
17
17
  its (:id) { should == 7181 }
18
18
  its (:type) { should == "artist" }
19
19
  its (:name) { should == "Above & Beyond" }
20
20
  its (:slug) { should == "above-and-beyond" }
21
+ its (:url) { should == "http://www.beatport.com/artist/above-and-beyond/7181" }
21
22
  its (:last_publish_date) { should >= Date.new(2011, 12, 15)}
22
23
  its (:biography) { should == "" }
23
24
  its (:'genres.length') { should be > 1 }
@@ -28,18 +29,18 @@ module Beatport::Catalog
28
29
  its (:'images.large.url') { should == "http://geo-media.beatport.com/image/4686424.jpg" }
29
30
  # its (:'featured_releases.length') { should be > 1 }
30
31
  end
31
-
32
+
32
33
  describe '.find' do
33
34
  context 'with a single id' do
34
35
  subject { Artist.find(7181) }
35
-
36
+
36
37
  it { should be_an(Artist) }
37
38
  its (:id) { should == 7181 }
38
39
  end
39
40
 
40
41
  context 'with multiple ids' do
41
42
  subject { Artist.find(7181, 7182) }
42
-
43
+
43
44
  # it { should be_a(Collection) }
44
45
  its (:length) { should == 2 }
45
46
  it "returns the requested artists" do
@@ -49,18 +50,18 @@ module Beatport::Catalog
49
50
 
50
51
  context 'with an array of ids' do
51
52
  subject { Artist.find([7181, 7182]) }
52
-
53
+
53
54
  # it { should be_a(Collection) }
54
55
  its (:length) { should == 2 }
55
56
  it "returns the requested artists" do
56
57
  subject.map(&:id).should == [7181, 7182]
57
58
  end
58
59
  end
59
- end
60
-
60
+ end
61
+
61
62
  describe '.find_by_name' do
62
63
  subject { Artist.find_by_name('Above & Beyond') }
63
-
64
+
64
65
  it { should be_an(Artist) }
65
66
  its (:id) { should == 7181 }
66
67
  end
@@ -70,39 +71,39 @@ module Beatport::Catalog
70
71
  artists = Artist.all
71
72
  artists.length.should == 10
72
73
  end
73
-
74
+
74
75
  it "should get the first page with 5 artists per page" do
75
76
  artists = Artist.all :per_page => 5, :page => 1
76
77
  artists.length.should == 5
77
78
  artists.page.should == 1
78
79
  artists.per_page.should == 5
79
80
  end
80
-
81
+
81
82
  it "should get the first page with 5 artists per page, sorted by publish date and artist id, for the House genre" do
82
83
  artists = Artist.all(:sort_by=> { :publish_date => 'asc', :artist_id => 'asc' }, :genre_id=> 5, :per_page=>5, :page=>1)
83
84
  artists.length.should == 5
84
-
85
+
85
86
  old_id = nil
86
87
  old_date = artists.first.last_publish_date
87
-
88
+
88
89
  artists.each do |artist|
89
90
  old_id = nil if old_date.to_s != artist.last_publish_date.to_s
90
-
91
+
91
92
  # beatport has some bad genre data?
92
93
  # artist.genres.map(&:id).should include(5)
93
94
  artist.id.should be >= old_id if old_id
94
95
  artist.last_publish_date.should be >= old_date if old_date
95
-
96
+
96
97
  old_id = artist.id
97
98
  old_date = artist.publish_date
98
99
  end
99
100
  end
100
-
101
+
101
102
  it "should get arbitrary artists with filter metadata for all genre names and artist names" do
102
103
  artists = Artist.all :return_facets => ['genre_name', 'performer_name']
103
-
104
+
104
105
  artists.facets['fields']['performer_name'].count.should be > 1
105
- artists.facets['fields']['genre_name'].count.should be > 1
106
+ artists.facets['fields']['genre_name'].count.should be > 1
106
107
 
107
108
  end
108
109
 
@@ -110,11 +111,11 @@ module Beatport::Catalog
110
111
  pending "Request doesn't return any results"
111
112
 
112
113
  artists = Artist.all :facets => {:genre_name => ['Trance', 'Progessive House']}
113
-
114
+
114
115
  artists.each do |artist|
115
116
  artists = artist['artists'].map { |a| a['name'] }
116
117
  artists.should include("Above & Beyond")
117
-
118
+
118
119
  genres = artist['genres'].map { |a| a['name'] }
119
120
  genres.should include('Trance')
120
121
  end
@@ -122,4 +123,4 @@ module Beatport::Catalog
122
123
 
123
124
  end
124
125
  end
125
- end
126
+ end
@@ -12,7 +12,7 @@ module Beatport::Catalog
12
12
 
13
13
  describe 'structure' do
14
14
  subject { Country.find('au') }
15
-
15
+
16
16
  it { should be_a(Country) }
17
17
  its (:id) { should == 5 }
18
18
  its (:code) { should == "AUS" }
@@ -22,11 +22,11 @@ module Beatport::Catalog
22
22
  its (:vat_rate) { should == 0 }
23
23
  its (:iso3166_3) { should == "AUS" }
24
24
  its (:iso3166_2) { should == "AU" }
25
- its (:'currency.code') { should == "USD" }
26
- its (:'currency.name') { should == "Dollar" }
25
+ its (:'currency.code') { should == "AUD" }
26
+ its (:'currency.name') { should == "Australian Dollar" }
27
27
  its (:'states.first.code') { should == 'ACT' }
28
- its (:'states.first.type') { should == 'territory' }
28
+ its (:'states.first.type') { should == 'territory' }
29
29
  its (:'states.first.name') { should == "Australian Capital Territory" }
30
30
  end
31
31
  end
32
- end
32
+ end
@@ -12,36 +12,37 @@ module Beatport::Catalog
12
12
 
13
13
  describe 'structure' do
14
14
  subject { Label.find(1390) }
15
-
15
+
16
16
  it { should be_a(Label) }
17
17
  its (:id) { should == 1390 }
18
18
  its (:type) { should == "label" }
19
19
  its (:name) { should == "Anjunadeep" }
20
- its (:slug) { should == "anjunadeep" }
20
+ its (:slug) { should == "anjunadeep" }
21
+ its (:url) { should == "http://www.beatport.com/label/anjunadeep/1390" }
21
22
  pending "source type is no longer returned?"
22
23
  #its (:source_type) { should == ["store", "mobile", "sushi"] }
23
24
 
24
25
  its (:last_publish_date) { should > Date.new(2012, 9, 10) }
25
26
  its (:biography) { should == "" }
26
27
  its (:'genres.length') { should be > 1 }
27
- its (:'sub_genres.length') { should be > 0 }
28
+ its (:'sub_genres.length') { should be > 0 }
28
29
  # its (:display_level) { should == 1 }
29
30
  its (:'images.small.url') { should == "http://geo-media.beatport.com/image/3406.jpg"}
30
31
  its (:'images.medium.url') { should == "http://geo-media.beatport.com/image/1191.jpg"}
31
- its (:'images.banner.url') { should == "http://geo-media.beatport.com/image/345152.jpg"}
32
+ its (:'images.banner.url') { should == "http://geo-media.beatport.com/image/345152.jpg"}
32
33
  # its (:'top_downloads.length') { should be > 1 }
33
34
  # its (:'featured_releases.length') { should be > 1 }
34
35
  # its (:'most_popular_releases.length') { should be > 1 }
35
36
 
36
37
  end
37
-
38
+
38
39
  describe '.find' do
39
40
  it "should get Anjunadeep give id 1390" do
40
41
  label = Label.find(1390)
41
42
  label.id.should == 1390
42
43
  end
43
44
  end
44
-
45
+
45
46
  describe '.find_by_name' do
46
47
  it 'returns Anjunadeep' do
47
48
  label = Label.find_by_name('Anjunadeep')
@@ -54,55 +55,55 @@ module Beatport::Catalog
54
55
  labels = Label.all
55
56
  labels.length.should == 10
56
57
  end
57
-
58
+
58
59
  it "should get the first page with 5 labels per page" do
59
60
  labels = Label.all :per_page => 5, :page => 1
60
61
  labels.length.should == 5
61
62
  labels.page.should == 1
62
63
  labels.per_page.should == 5
63
64
  end
64
-
65
+
65
66
  it "should get the first page with 5 labels per page, sorted by publish date and label id, for the House genre" do
66
67
  labels = Label.all(:sort_by=> ['publishDate asc', 'labelId asc'], :genre_id=> 5, :per_page=>5, :page=>1)
67
68
  labels.length.should == 5
68
-
69
+
69
70
  old_id = nil
70
71
  old_date = labels.first.last_publish_date
71
-
72
+
72
73
  labels.each do |label|
73
74
  old_id = nil if old_date.to_s != label.last_publish_date.to_s
74
-
75
+
75
76
  # beatport has some bad genre data?
76
77
  # label.genres.map(&:id)) { should include(5)
77
78
  label.id.should be >= old_id if old_id
78
79
  label.last_publish_date.should be >= old_date if old_date
79
-
80
+
80
81
  old_id = label.id
81
82
  old_date = label.last_publish_date
82
83
  end
83
84
  end
84
-
85
+
85
86
  it "should get arbitrary labels with filter metadata for all genre names and label names" do
86
87
  labels = Label.all :return_facets => ['genre_name', 'performer_name']
87
-
88
+
88
89
  # no worky
89
90
  # labels.facets['fields']['performer_name'].count) { should be > 1
90
- labels.facets['fields']['genre_name'].count.should be > 1
91
+ labels.facets['fields']['genre_name'].count.should be > 1
91
92
  end
92
93
 
93
94
  it "should get all trance labels for above & beyond" do
94
95
  labels = Label.all :facets => {:genre_name => ['Trance', 'Progessive House']}
95
-
96
+
96
97
  labels.each do |label|
97
98
  labels = label['labels'].map { |a| a['name'] }
98
99
  labels.should include("Above & Beyond")
99
-
100
+
100
101
  genres = label['genres'].map { |a| a['name'] }
101
102
  genres.should include('Trance')
102
103
  end
103
104
  end
104
105
  end
105
-
106
+
106
107
  describe '.featured' do
107
108
  it "should get the featured labels for the Home page" do
108
109
  pending "deprecated?"
@@ -110,10 +111,10 @@ module Beatport::Catalog
110
111
  labels = Label.featured
111
112
  labels.length.should be > 1
112
113
  end
113
-
114
+
114
115
  it "should get the featured labels for the Trance page" do
115
116
  pending "deprecated?"
116
-
117
+
117
118
  labels = Label.featured :genre_id => 7
118
119
  labels.length.should be > 1
119
120
  labels.each do |label|
@@ -122,4 +123,4 @@ module Beatport::Catalog
122
123
  end
123
124
  end
124
125
  end
125
- end
126
+ end
@@ -12,7 +12,7 @@ module Beatport::Catalog
12
12
 
13
13
  describe 'structure' do
14
14
  subject { Release.find(164808) }
15
-
15
+
16
16
  it { should be_a(Release) }
17
17
  its (:id) { should == 164808 }
18
18
  its (:type) { should == 'release' }
@@ -25,6 +25,7 @@ module Beatport::Catalog
25
25
  its (:current_status) { should == "General Content"}
26
26
  its (:catalog_number) { should == "ANJCDCO011D"}
27
27
  its (:purchasable) { should == true }
28
+ its (:url) { should == "http://www.beatport.com/release/anjunabeats-volume-6-unmixed-dj-ready/164808" }
28
29
  its (:'price.to_s') { should == "9.99" }
29
30
  its (:'tracks_price.to_s') { should == "43.21" }
30
31
  its (:'audio_format_fee.wav.to_s') { should == '21.75'}
@@ -34,64 +35,64 @@ module Beatport::Catalog
34
35
  specify { subject.genres.map(&:name).sort.should == ["Progressive House", "Trance"] }
35
36
  its (:'images.small.url') { should == "http://geo-media.beatport.com/image/392699.jpg" }
36
37
  its (:'images.medium.url') { should == "http://geo-media.beatport.com/image/392700.jpg" }
37
- its (:'images.large.url') { should == "http://geo-media.beatport.com/image/392701.jpg" }
38
+ its (:'images.large.url') { should == "http://geo-media.beatport.com/image/392701.jpg" }
38
39
  its (:'discount.to_s') { should == "33.22" }
39
40
  # its (:'recommendations.releases.length') { should > 1 }
40
41
  end
41
-
42
+
42
43
  describe '.find' do
43
44
  it "should get Anjunabeats Volume 6 when given id 164808" do
44
45
  release = Release.find(164808)
45
46
  release.id.should == 164808
46
47
  end
47
48
  end
48
-
49
+
49
50
  describe '.all' do
50
51
  it "should get arbitrary releases" do
51
52
  releases = Release.all
52
53
  releases.length.should == 10
53
54
  end
54
-
55
+
55
56
  it "should get the first page with 5 releases per page" do
56
57
  releases = Release.all :per_page => 5, :page => 1
57
58
  releases.length.should == 5
58
59
  releases.page.should == 1
59
60
  releases.per_page.should == 5
60
61
  end
61
-
62
+
62
63
  it "should get the first page with 5 releases per page, sorted by publish date and release id, for the House genre" do
63
64
  releases = Release.all(:sort_by=> ['publishDate asc', 'releaseId asc'], :genre_id=> 5, :per_page=>5, :page=>1)
64
65
  releases.length.should == 5
65
-
66
+
66
67
  old_id = nil
67
68
  old_date = releases.first.publish_date
68
-
69
+
69
70
  releases.each do |release|
70
71
  old_id = nil if old_date.to_s != release.publish_date.to_s
71
-
72
+
72
73
  release.genres.first.id.should == 5
73
74
  release.id.should be >= old_id if old_id
74
75
  release.publish_date.should be >= old_date if old_date
75
-
76
+
76
77
  old_id = release.id
77
78
  old_date = release.publish_date
78
79
  end
79
80
  end
80
-
81
+
81
82
  it "should get arbitrary releases with filter metadata for all genre names and artist names" do
82
83
  releases = Release.all :return_facets => ['genre_name', 'performer_name']
83
-
84
+
84
85
  releases.facets['fields']['performer_name'].count.should be > 1
85
- releases.facets['fields']['genre_name'].count.should be > 1
86
+ releases.facets['fields']['genre_name'].count.should be > 1
86
87
  end
87
88
 
88
89
  it "should get all trance releases for above & beyond" do
89
90
  releases = Release.all :facets => {:genre_name => 'Trance', :performer_name => 'Above & Beyond'}
90
-
91
+
91
92
  releases.each do |release|
92
93
  artists = release['artists'].map { |a| a['name'] }
93
94
  artists.should include("Above & Beyond")
94
-
95
+
95
96
  genres = release['genres'].map { |a| a['name'] }
96
97
  genres.should include('Trance')
97
98
  end
@@ -103,29 +104,29 @@ module Beatport::Catalog
103
104
  releases = Release.featured
104
105
  releases.length.should be > 1
105
106
  end
106
-
107
+
107
108
  it "should get the featured releases for the Trance page" do
108
109
  releases = Release.featured :genre_id => 7
109
110
  releases.length.should be > 1
110
111
  releases.each do |release|
111
112
  release.genres.map(&:id).should include(7)
112
- end
113
+ end
113
114
  end
114
-
115
+
115
116
  it "should get 'Just Added' featured releases for the Trance page" do
116
117
  releases = Release.featured :genre_id => 7, :just_added => true
117
118
  releases.length.should be > 1
118
119
  releases.each do |release|
119
120
  release.genres.map(&:id).should include(7)
120
- end
121
+ end
121
122
  end
122
-
123
+
123
124
  it "should not give the same releases with justAdded true and false" do
124
125
  pending "test will not give consistent results, revisit"
125
-
126
+
126
127
  featured = Release.featured :genre_id => 7
127
128
  just_added = Release.featured :genre_id => 7, :just_added => true
128
-
129
+
129
130
  featured.map(&:id).should_not == just_added.map(&:id)
130
131
  end
131
132
  end
@@ -135,15 +136,15 @@ module Beatport::Catalog
135
136
  release = Release.find(164808)
136
137
  release.tracks
137
138
  end
138
-
139
+
139
140
  it "should return all 29 tracks for Anjunabeats Volume 6" do
140
141
  subject.count.should == 29
141
142
  end
142
-
143
+
143
144
  it "should return paper jet as the first track" do
144
145
  subject.first.name.should == "Paper Jet"
145
146
  end
146
-
147
+
147
148
  end
148
149
  end
149
- end
150
+ end
@@ -19,7 +19,7 @@ module Beatport::Catalog
19
19
 
20
20
  describe 'structure' do
21
21
  subject { Track.find(1217790) }
22
-
22
+
23
23
  it { should be_a(Track) }
24
24
  its (:id) { should == 1217790 }
25
25
  its (:type) { should == 'track' }
@@ -29,9 +29,10 @@ module Beatport::Catalog
29
29
  its (:title) { should == "Tonight (IMS Anthem 2009) (Above & Beyond Remix)"}
30
30
  its (:release_date) { should == Date.new(2010,05,17) }
31
31
  its (:publish_date) { should == Date.new(2010,05,17) }
32
- its (:sample_url) { should == 'http://geo-samples.beatport.com/lofi/1217790.LOFI.mp3' }
33
- its (:rtmp_stream_url) { should == 'rtmp://geo-rtmp-samples.beatport.com/beatport/_definst_/mp3:lofi_samples/items/volumes/volume7/items/1000000/200000/10000/7000/700/90/1217790.LOFI'}
32
+ #its (:sample_url) { should == 'http://geo-samples.beatport.com/lofi/1217790.LOFI.mp3' }
33
+ #its (:rtmp_stream_url) { should == 'rtmp://geo-rtmp-samples.beatport.com/beatport/_definst_/mp3:lofi_samples/items/volumes/volume7/items/1000000/200000/10000/7000/700/90/1217790.LOFI'}
34
34
  its (:exclusive) { should be_false }
35
+ its (:url) { should == "http://www.beatport.com/track/tonight-ims-anthem-2009-above-and-beyond-remix/1217790" }
35
36
  its (:'price.to_s') { should == "1.49" }
36
37
  its (:'audio_format_fee.wav.to_s') { should == "0.75" }
37
38
  its (:'audio_format_fee.aiff.to_s') { should == "0.75" }
@@ -50,59 +51,65 @@ module Beatport::Catalog
50
51
  its (:'images.small.url') { should == 'http://geo-media.beatport.com/image/674759.jpg' }
51
52
  its (:'images.medium.url') { should == 'http://geo-media.beatport.com/image/674760.jpg' }
52
53
  its (:'images.large.url') { should == 'http://geo-media.beatport.com/image/674761.jpg' }
53
- its (:'images.waveform.url') { should == 'http://geo-media.beatport.com/image/1268229.png' }
54
+ its (:'images.waveform.url') { should == 'http://geo-media.beatport.com/image/1268229.png' }
55
+ its (:'dynamic_images.main.url') { should == '//geo-media.beatport.com/image_size{hq}/{w}x{h}/674761.jpg' }
56
+
57
+ it "should render a dynamic url of the right size" do
58
+ subject.dynamic_images.main.dynamic_url(w: 120, h: 120).should == '//geo-media.beatport.com/image_size/120x120/674761.jpg'
59
+ end
60
+
54
61
  end
55
-
62
+
56
63
  describe '.find' do
57
64
  it "should find the track with the id 1217790" do
58
65
  track = Track.find(1217790)
59
66
  track.id.should == 1217790
60
67
  end
61
68
  end
62
-
69
+
63
70
  describe '.all' do
64
71
  it "should get arbitrary" do
65
72
  Track.all.length.should be > 1
66
73
  end
67
-
74
+
68
75
  it "should get the first page with 5 tracks per page" do
69
76
  tracks = Track.all(:per_page => 5, :page => 1)
70
77
  tracks.length.should == 5
71
78
  tracks.page.should == 1
72
79
  tracks.per_page.should == 5
73
80
  end
74
-
81
+
75
82
  it "should get the first page with 5 tracks per page, sorted by publish date and release if, for the House genre" do
76
83
  tracks = Track.all(:sort_by=> ['publishDate asc', 'releaseId asc'], :genre_id=> 5, :per_page=>5, :page=>1)
77
84
  tracks.length.should == 5
78
-
85
+
79
86
  old_id = tracks.first.id
80
87
  old_date = tracks.first.publish_date
81
-
88
+
82
89
  tracks.each do |track|
83
90
  track.genres.first.id.should == 5
84
91
  track.id.should be >= old_id
85
92
  track.publish_date.should be >= old_date
86
-
93
+
87
94
  old_id = track.id
88
95
  old_date = track.publish_date
89
96
  end
90
97
  end
91
-
98
+
92
99
  it "should get arbitrary tracks with filter metadata for all genre names and artist names" do
93
100
  tracks = Track.all :return_facets => ['genre_name', 'performer_name']
94
-
101
+
95
102
  tracks.facets['fields']['performer_name'].count.should be > 1
96
- tracks.facets['fields']['genre_name'].count.should be > 1
103
+ tracks.facets['fields']['genre_name'].count.should be > 1
97
104
  end
98
105
 
99
106
  it "should get all trance tracks for above & beyond" do
100
107
  tracks = Track.all :facets => {:genre_name => 'Trance', :performer_name => 'Above & Beyond'}
101
-
108
+
102
109
  tracks.each do |track|
103
110
  artists = track['artists'].map { |a| a['name'] }
104
111
  artists.should include("Above & Beyond")
105
-
112
+
106
113
  genres = track['genres'].map { |a| a['name'] }
107
114
  genres.should include('Trance')
108
115
  end
@@ -115,7 +122,7 @@ module Beatport::Catalog
115
122
  tracks.count.should == 100
116
123
  tracks.length.should == 10
117
124
  end
118
-
125
+
119
126
  it "should get the top classics for the home page" do
120
127
  tracks = Track.most_popular :status => 5
121
128
  tracks.count.should == 100
@@ -125,15 +132,15 @@ module Beatport::Catalog
125
132
  it "should not return the same results for most_popular and classics" do
126
133
  popular = Track.most_popular
127
134
  classics = Track.most_popular :status => 5
128
-
135
+
129
136
  popular.map(&:id).should_not == classics.map(&:id)
130
137
  end
131
138
  end
132
-
139
+
133
140
  describe '.most_popular_for_genre' do
134
141
  it "should get the top download for the trance page" do
135
142
  tracks = Track.most_popular_for_genre 7
136
-
143
+
137
144
  tracks.count.should == 100
138
145
  tracks.length.should == 10
139
146
  tracks.each do |track|
@@ -143,19 +150,19 @@ module Beatport::Catalog
143
150
 
144
151
  it "should get the top classics for the trance page" do
145
152
  tracks = Track.most_popular_for_genre 7, :status => 5
146
-
153
+
147
154
  tracks.each do |track|
148
155
  track.genres.map(&:id).should include(7)
149
156
  end
150
157
  end
151
-
158
+
152
159
  it "should not return the same results for most_popular and classics" do
153
160
  popular = Track.most_popular_for_genre 7
154
161
  classics = Track.most_popular_for_genre 7, :status => 5
155
-
162
+
156
163
  popular.map(&:id).should_not == classics.map(&:id)
157
- end
158
-
164
+ end
165
+
159
166
  end
160
167
 
161
168
  describe '.most_popular_for_artist' do
@@ -175,7 +182,7 @@ module Beatport::Catalog
175
182
  tracks.each do |track|
176
183
  track.label.id.should == 804
177
184
  end
178
- end
185
+ end
179
186
  end
180
187
  end
181
188
  end
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.2.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-31 00:00:00.000000000 Z
12
+ date: 2013-11-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
@@ -43,6 +43,22 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: faraday
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 0.8.8
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.8.8
46
62
  - !ruby/object:Gem::Dependency
47
63
  name: money
48
64
  requirement: !ruby/object:Gem::Requirement
@@ -199,6 +215,8 @@ files:
199
215
  - lib/beatport/catalog/country.rb
200
216
  - lib/beatport/catalog/currency.rb
201
217
  - lib/beatport/catalog/djprofile.rb
218
+ - lib/beatport/catalog/dynamic_image.rb
219
+ - lib/beatport/catalog/dynamic_images.rb
202
220
  - lib/beatport/catalog/feature.rb
203
221
  - lib/beatport/catalog/genre.rb
204
222
  - lib/beatport/catalog/home.rb
@@ -228,8 +246,10 @@ files:
228
246
  - lib/beatport/price.rb
229
247
  - lib/beatport/support.rb
230
248
  - lib/beatport/support/inflector.rb
249
+ - lib/beatport/support/middleware.rb
231
250
  - lib/beatport/support/parser.rb
232
251
  - lib/beatport/support/query_builder.rb
252
+ - lib/beatport/support/url.rb
233
253
  - spec/beatport_spec.rb
234
254
  - spec/catalog/account_type_spec.rb
235
255
  - spec/catalog/artist_spec.rb
@@ -270,7 +290,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
270
290
  version: '0'
271
291
  segments:
272
292
  - 0
273
- hash: -3985965663943551168
293
+ hash: 746907513197344592
274
294
  required_rubygems_version: !ruby/object:Gem::Requirement
275
295
  none: false
276
296
  requirements: