discogs-wrapper 1.0.0 → 1.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.
- 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
|
|