discogs-wrapper 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +4 -6
- data/discogs.gemspec +2 -2
- data/lib/wrapper/resource.rb +1 -0
- data/lib/wrapper/resource_mappings.rb +2 -6
- data/lib/wrapper/resources/artist.rb +3 -3
- data/lib/wrapper/resources/artist_release.rb +13 -2
- data/lib/wrapper/resources/release.rb +2 -0
- data/lib/wrapper/resources/release_artist.rb +3 -0
- data/lib/wrapper/resources/track.rb +4 -0
- data/lib/wrapper/wrapper.rb +13 -8
- data/spec/resources/artist_release_spec.rb +2 -2
- data/spec/spec_helper.rb +4 -0
- data/spec/wrapper_methods/get_artist_spec.rb +16 -0
- data/spec/wrapper_methods/get_release_spec.rb +19 -0
- data/spec/wrapper_spec.rb +6 -6
- metadata +4 -4
data/README.markdown
CHANGED
@@ -13,6 +13,7 @@ ABOUT
|
|
13
13
|
|
14
14
|
* Artists
|
15
15
|
* Releases
|
16
|
+
* MasterReleases
|
16
17
|
* Labels
|
17
18
|
* Searching (all of the above)
|
18
19
|
|
@@ -24,17 +25,14 @@ INSTALLATION
|
|
24
25
|
------------
|
25
26
|
You can install the library via Rubygems:
|
26
27
|
|
27
|
-
$ gem
|
28
|
-
$ sudo gem install buntine-discogs
|
28
|
+
$ sudo gem install discogs-wrapper
|
29
29
|
|
30
30
|
USAGE
|
31
31
|
-----
|
32
|
-
To use this library, you must supply
|
32
|
+
To use this library, you must supply the name of your application. For example:
|
33
33
|
|
34
34
|
require 'discogs'
|
35
|
-
wrapper = Discogs::Wrapper.new("
|
36
|
-
|
37
|
-
I suggest passing on your users User-agent.
|
35
|
+
wrapper = Discogs::Wrapper.new("My awesome web app")
|
38
36
|
|
39
37
|
Accessing information is easy:
|
40
38
|
|
data/discogs.gemspec
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = "discogs-wrapper"
|
4
|
-
s.version = "1.
|
5
|
-
s.date = "2011-
|
4
|
+
s.version = "1.1.0"
|
5
|
+
s.date = "2011-10-22"
|
6
6
|
s.summary = "Discogs::Wrapper is a full wrapper for the http://www.discogs.com API V2"
|
7
7
|
s.homepage = "http://www.github.com/buntine/discogs"
|
8
8
|
s.email = "info@andrewbuntine.com"
|
data/lib/wrapper/resource.rb
CHANGED
@@ -12,7 +12,7 @@ module Discogs::ResourceMappings
|
|
12
12
|
|
13
13
|
module ClassMethods
|
14
14
|
|
15
|
-
# Helper method to map resource to element in API response.
|
15
|
+
# Helper method to map resource to an element in the API response.
|
16
16
|
def map_to(*elements)
|
17
17
|
self.class_eval <<-EOF
|
18
18
|
def self.element_names
|
@@ -51,11 +51,7 @@ module Discogs::ResourceMappings
|
|
51
51
|
private
|
52
52
|
|
53
53
|
def find_resource_for_name(name, type=:singular)
|
54
|
-
method =
|
55
|
-
:element_names
|
56
|
-
else
|
57
|
-
:plural_element_names
|
58
|
-
end
|
54
|
+
method = (type == :singular) ? :element_names : :plural_element_names
|
59
55
|
|
60
56
|
find_resource do |klass|
|
61
57
|
klass.constants.find do |const|
|
@@ -27,10 +27,10 @@ class Discogs::Artist < Discogs::Resource
|
|
27
27
|
|
28
28
|
private
|
29
29
|
|
30
|
-
# Simple helper for filtering a particular
|
31
|
-
def filter_releases(
|
30
|
+
# Simple helper for filtering a particular role of release.
|
31
|
+
def filter_releases(role)
|
32
32
|
self.releases.find_all do |release|
|
33
|
-
release.
|
33
|
+
release.role == role
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -6,12 +6,23 @@ class Discogs::Artist::Release < Discogs::Resource
|
|
6
6
|
|
7
7
|
attr_accessor :id,
|
8
8
|
:status,
|
9
|
-
:
|
9
|
+
:role,
|
10
10
|
:title,
|
11
11
|
:artist,
|
12
12
|
:format,
|
13
13
|
:year,
|
14
14
|
:label,
|
15
|
-
:
|
15
|
+
:thumb,
|
16
|
+
:trackinfo,
|
17
|
+
:main_release
|
18
|
+
|
19
|
+
# Will return either "master" or "release".
|
20
|
+
def release_type
|
21
|
+
if original_content =~ /^\<(\w+)\s/
|
22
|
+
$1
|
23
|
+
else
|
24
|
+
"release"
|
25
|
+
end
|
26
|
+
end
|
16
27
|
|
17
28
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# Represents an release's artist in the Discogs API.
|
2
2
|
|
3
3
|
require File.dirname(__FILE__) + "/track"
|
4
|
+
require File.dirname(__FILE__) + "/master_release"
|
4
5
|
|
5
6
|
class Discogs::Release::Artist < Discogs::Resource
|
6
7
|
|
@@ -16,3 +17,5 @@ end
|
|
16
17
|
|
17
18
|
# Define other classes that also replicate this structure.
|
18
19
|
class Discogs::Release::Track::Artist < Discogs::Release::Artist; end
|
20
|
+
class Discogs::MasterRelease::Artist < Discogs::Release::Artist; end
|
21
|
+
class Discogs::MasterRelease::Track::Artist < Discogs::Release::Artist; end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# Represents a track in the Discogs API.
|
2
2
|
|
3
3
|
require File.dirname(__FILE__) + "/release"
|
4
|
+
require File.dirname(__FILE__) + "/master_release"
|
4
5
|
|
5
6
|
class Discogs::Release::Track < Discogs::Resource
|
6
7
|
|
@@ -13,3 +14,6 @@ class Discogs::Release::Track < Discogs::Resource
|
|
13
14
|
:extraartists
|
14
15
|
|
15
16
|
end
|
17
|
+
|
18
|
+
# Define other classes that also replicate this structure.
|
19
|
+
class Discogs::MasterRelease::Track < Discogs::Release::Track; end
|
data/lib/wrapper/wrapper.rb
CHANGED
@@ -12,22 +12,26 @@ class Discogs::Wrapper
|
|
12
12
|
|
13
13
|
@@root_host = "http://api.discogs.com"
|
14
14
|
|
15
|
-
attr_reader :
|
15
|
+
attr_reader :app_name
|
16
16
|
|
17
|
-
def initialize(
|
18
|
-
@
|
17
|
+
def initialize(app_name=nil)
|
18
|
+
@app_name = app_name
|
19
19
|
end
|
20
20
|
|
21
21
|
def get_release(id)
|
22
22
|
query_and_build "release/#{id}", Discogs::Release
|
23
23
|
end
|
24
24
|
|
25
|
+
def get_master_release(id)
|
26
|
+
query_and_build "master/#{id}", Discogs::MasterRelease
|
27
|
+
end
|
28
|
+
|
25
29
|
def get_artist(name)
|
26
|
-
query_and_build "artist/#{name}", Discogs::Artist
|
30
|
+
query_and_build "artist/#{name}", Discogs::Artist, {:releases => 1}
|
27
31
|
end
|
28
32
|
|
29
33
|
def get_label(name)
|
30
|
-
query_and_build "label/#{name}", Discogs::Label
|
34
|
+
query_and_build "label/#{name}", Discogs::Label, {:releases => 1}
|
31
35
|
end
|
32
36
|
|
33
37
|
def search(term, options={})
|
@@ -42,8 +46,8 @@ class Discogs::Wrapper
|
|
42
46
|
|
43
47
|
private
|
44
48
|
|
45
|
-
def query_and_build(path, klass)
|
46
|
-
data = query_api(path)
|
49
|
+
def query_and_build(path, klass, params={})
|
50
|
+
data = query_api(path, params)
|
47
51
|
resource = klass.send(:new, data)
|
48
52
|
resource.build!
|
49
53
|
end
|
@@ -73,8 +77,9 @@ class Discogs::Wrapper
|
|
73
77
|
uri = build_uri(path, params)
|
74
78
|
|
75
79
|
request = Net::HTTP::Get.new(uri.path + "?" + uri.query)
|
80
|
+
request.add_field("Accept", "application/xml")
|
76
81
|
request.add_field("Accept-Encoding", "gzip,deflate")
|
77
|
-
request.add_field("User-Agent", @
|
82
|
+
request.add_field("User-Agent", @app_name)
|
78
83
|
|
79
84
|
Net::HTTP.new(uri.host).start do |http|
|
80
85
|
http.request(request)
|
@@ -26,8 +26,8 @@ describe Discogs::Artist::Release do
|
|
26
26
|
@artist_release.status.should == "Accepted"
|
27
27
|
end
|
28
28
|
|
29
|
-
it "should have a
|
30
|
-
@artist_release.
|
29
|
+
it "should have a role attribute" do
|
30
|
+
@artist_release.role.should == "Main"
|
31
31
|
end
|
32
32
|
|
33
33
|
it "should have a title attribute" do
|
data/spec/spec_helper.rb
CHANGED
@@ -94,6 +94,22 @@ describe Discogs::Wrapper do
|
|
94
94
|
@artist.releases[0].id.should == "1805661"
|
95
95
|
end
|
96
96
|
|
97
|
+
it "should have a type for the first release" do
|
98
|
+
@artist.releases[0].release_type.should == "release"
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should have a type for the second release" do
|
102
|
+
@artist.releases[1].release_type.should == "master"
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should have a main release for the second release" do
|
106
|
+
@artist.releases[1].main_release.should == "12345"
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should have a thumb for the second release" do
|
110
|
+
@artist.releases[1].thumb.should == "http://images"
|
111
|
+
end
|
112
|
+
|
97
113
|
it "should have a year for the first release" do
|
98
114
|
@artist.releases[0].year.should == "1991"
|
99
115
|
end
|
@@ -30,6 +30,10 @@ describe Discogs::Wrapper do
|
|
30
30
|
@release.id.should == "666666"
|
31
31
|
end
|
32
32
|
|
33
|
+
it "should have a master_id attribute" do
|
34
|
+
@release.master_id.should == "6111"
|
35
|
+
end
|
36
|
+
|
33
37
|
it "should have one or more extra artists" do
|
34
38
|
@release.extraartists.should be_instance_of(Array)
|
35
39
|
@release.extraartists[0].should be_instance_of(Discogs::Release::Artist)
|
@@ -55,6 +59,12 @@ describe Discogs::Wrapper do
|
|
55
59
|
@release.images[0].should be_instance_of(Discogs::Image)
|
56
60
|
end
|
57
61
|
|
62
|
+
it "should have one or more videos" do
|
63
|
+
@release.videos.should be_instance_of(Array)
|
64
|
+
@release.videos[0].should be_instance_of(Discogs::Video)
|
65
|
+
end
|
66
|
+
|
67
|
+
|
58
68
|
end
|
59
69
|
|
60
70
|
describe "when calling complex release attributes" do
|
@@ -72,6 +82,15 @@ describe Discogs::Wrapper do
|
|
72
82
|
end
|
73
83
|
end
|
74
84
|
|
85
|
+
it "should have specifications for each video" do
|
86
|
+
specs = [ [ '334', 'true', 'http://www.youtube.com/watch?v=QVdDhOnoR8k' ], [ '350', 'true', 'http://www.youtube.com/watch?v=QVdDhOnoR7k' ] ]
|
87
|
+
@release.videos.each_with_index do |video, index|
|
88
|
+
video.duration.should == specs[index][0]
|
89
|
+
video.embed.should == specs[index][1]
|
90
|
+
video.uri.should == specs[index][2]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
75
94
|
it "should have a traversible list of styles" do
|
76
95
|
@release.styles.should be_instance_of(Array)
|
77
96
|
@release.styles[0].should == "Black Metal"
|
data/spec/wrapper_spec.rb
CHANGED
@@ -23,8 +23,8 @@ describe Discogs::Wrapper do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
before do
|
26
|
-
@
|
27
|
-
@wrapper = Discogs::Wrapper.new(@
|
26
|
+
@app_name = "some_app"
|
27
|
+
@wrapper = Discogs::Wrapper.new(@app_name)
|
28
28
|
@release_id = "666666"
|
29
29
|
@artist_name = "Dark"
|
30
30
|
@label_name = "Monitor"
|
@@ -32,7 +32,7 @@ describe Discogs::Wrapper do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should have an user agent" do
|
35
|
-
@wrapper.
|
35
|
+
@wrapper.app_name.should == @app_name
|
36
36
|
end
|
37
37
|
|
38
38
|
describe "requested URIs" do
|
@@ -49,14 +49,14 @@ describe Discogs::Wrapper do
|
|
49
49
|
|
50
50
|
it "should generate the correct artist URL to parse" do
|
51
51
|
mock_http_with_response "200", valid_artist_xml
|
52
|
-
URI.should_receive(:parse).with("http://api.discogs.com/artist/Dark?f=xml").and_return(@uri)
|
52
|
+
URI.should_receive(:parse).with("http://api.discogs.com/artist/Dark?f=xml&releases=1").and_return(@uri)
|
53
53
|
|
54
54
|
@wrapper.get_artist(@artist_name)
|
55
55
|
end
|
56
56
|
|
57
57
|
it "should generate the correct label URL to parse" do
|
58
58
|
mock_http_with_response "200", valid_label_xml
|
59
|
-
URI.should_receive(:parse).with("http://api.discogs.com/label/Monitor?f=xml").and_return(@uri)
|
59
|
+
URI.should_receive(:parse).with("http://api.discogs.com/label/Monitor?f=xml&releases=1").and_return(@uri)
|
60
60
|
|
61
61
|
@wrapper.get_label(@label_name)
|
62
62
|
end
|
@@ -84,7 +84,7 @@ describe Discogs::Wrapper do
|
|
84
84
|
|
85
85
|
it "should sanitize the path correctly" do
|
86
86
|
mock_http_with_response "200", valid_artist_xml
|
87
|
-
URI.should_receive(:parse).with("http://api.discogs.com/artist/A+very+long+band+name?f=xml").and_return(@uri)
|
87
|
+
URI.should_receive(:parse).with("http://api.discogs.com/artist/A+very+long+band+name?f=xml&releases=1").and_return(@uri)
|
88
88
|
|
89
89
|
@wrapper.get_artist("A very long band name")
|
90
90
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: discogs-wrapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 1.0.0
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andrew Buntine
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-
|
19
|
+
date: 2011-10-22 00:00:00 +11:00
|
20
20
|
default_executable:
|
21
21
|
dependencies: []
|
22
22
|
|