discogs 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.
@@ -1,3 +1,12 @@
1
+ === 1.1.0 / 2008-09-03
2
+
3
+ * Fixes by Andreas Roedl <andreas.roedl@googlemail.com>
4
+
5
+ * Images works as expected. Returns the main URI.
6
+ * Fixed Artist.releases.
7
+ * Fixed Artist.urls. Now we get an array of URLs. We're also chomping line feeds.
8
+ * Minor documentation fixes.
9
+
1
10
  === 1.0.0 / 2008-07-08
2
11
 
3
12
  * 1 major enhancement
data/README.txt CHANGED
@@ -1,4 +1,4 @@
1
- = discog
1
+ = discogs
2
2
 
3
3
  * http://discogs.rubyforge.org
4
4
 
@@ -26,46 +26,49 @@ And a bin util
26
26
 
27
27
  == SYNOPSIS:
28
28
 
29
- d = Discog::Artist.new(ARGV[0])
30
- puts "
31
- Artist: #{d.name}
32
- Members: #{d.members}
33
- Images: #{d.images}
34
- URLs: #{d.urls}
35
- Releases: #{d.releases.map{|r| r.title }}
36
- "
37
-
38
- release = Discog::Release.new('188365')
39
- puts "
40
- Title: #{release.title}
41
- Labels: #{release.labels}
42
- Format: #{release.formats}
43
- Status: #{release.discog_status}
44
- Genres: #{release.genres}
45
- Styles: #{release.styles}
46
- Country: #{release.country}
47
- ReleaseDate: #{release.released}
48
- Tracks #{release.tracks}
49
- Images: #{release.images}
50
- Extras: #{release.contributors.join(', ')}
51
- "
52
-
53
- label = Discog::Label.new(ARGV[0])
54
- puts "
55
- Name: #{label.name}
56
- Images: #{label.images}
57
- Contact: #{label.contact_info}
58
- Profile: #{label.profile}
59
- URLs: #{label.urls}
60
- Parent: #{label.parent}
61
- SubLabels: #{label.sublabels}
62
- Releases: #{label.releases}
63
- "
29
+ The first time discogs tries to make an api call, it will look for a YAML file '~/.discogs' or 'RAILS_ROOT/config/discogs.yml'.
30
+ If it doesn't exist, it will be created, and will need editing. Paste your discogs api key in place of 'CHANGE ME'.
31
+
32
+ artist = Discog::Artist.new('Broken Social Scene')
33
+ puts "
34
+ Artist: #{artist.name}
35
+ Members: #{artist.members}
36
+ Images: #{artist.images}
37
+ URLs: #{artist.urls}
38
+ Releases: #{artist.releases.map{|r| r.title }}
39
+ "
40
+
41
+ release = Discog::Release.new('188365')
42
+ puts "
43
+ Title: #{release.title}
44
+ Labels: #{release.labels}
45
+ Format: #{release.formats}
46
+ Status: #{release.discog_status}
47
+ Genres: #{release.genres}
48
+ Styles: #{release.styles}
49
+ Country: #{release.country}
50
+ ReleaseDate: #{release.released}
51
+ Tracks #{release.tracks}
52
+ Images: #{release.images}
53
+ Extras: #{release.contributors.join(', ')}
54
+ "
55
+
56
+ label = Discog::Label.new(ARGV[0])
57
+ puts "
58
+ Name: #{label.name}
59
+ Images: #{label.images}
60
+ Contact: #{label.contact_info}
61
+ Profile: #{label.profile}
62
+ URLs: #{label.urls}
63
+ Parent: #{label.parent}
64
+ SubLabels: #{label.sublabels}
65
+ Releases: #{label.releases}
66
+ "
64
67
 
65
68
  == REQUIREMENTS:
66
69
 
67
- rubygems
68
- hpricot
70
+ - rubygems
71
+ - hpricot
69
72
 
70
73
  == INSTALL:
71
74
 
data/Rakefile CHANGED
@@ -14,8 +14,8 @@ end
14
14
 
15
15
  desc "Run all specs in spec directory"
16
16
  Spec::Rake::SpecTask.new(:spec) do |t|
17
- # t.rcov = true
18
- # t.rcov_opts = ["--output=coverage"]
17
+ t.rcov = true
18
+ t.rcov_opts = ["--output=coverage"]
19
19
  t.spec_opts = ["--color"]
20
20
  t.spec_files = FileList['spec/*_spec.rb']
21
21
  end
@@ -8,21 +8,28 @@ module Discogs
8
8
  :images,
9
9
  :realname
10
10
 
11
+ # Discogs Data
11
12
  def name
12
13
  @name ||= (parsed/'artist'/'name').first.inner_html
13
14
  end
14
15
 
16
+ # Discogs Data
15
17
  def realname
16
- @realname ||= (parsed/'artist'/'realname').first.inner_html
18
+ @realname ||= begin
19
+ realname = (parsed/'artist'/'realname').first
20
+ realname.nil? ? '' : realname.inner_html
21
+ end
17
22
  end
18
23
 
24
+ # Discogs Data
19
25
  def members
20
26
  @members ||= (parsed/'artist'/'members'/'name').collect { |artist| artist.inner_html }
21
27
  end
22
28
 
29
+ # an array images
23
30
  def images
24
31
  @images ||= (parsed/'artist'/'images'/'image').collect do |image|
25
- Image.new(image.attributes['url'],
32
+ Image.new(image.attributes['uri'],
26
33
  image.attributes['type'],
27
34
  image.attributes['uri150'],
28
35
  image.attributes['width'],
@@ -30,17 +37,21 @@ module Discogs
30
37
  end
31
38
  end
32
39
 
40
+ # an array of urls
33
41
  def urls
34
- @urls ||= (parsed/'artist'/'urls').collect { |url| (url/'url').inner_html }
42
+ @urls ||= (parsed/'artist'/'urls'/'url').collect { |url| url.inner_html.chomp }
35
43
  end
36
44
 
45
+ # for each release on the artist
46
+ # this will make a new API request
47
+ # for each release. Be careful!!!
37
48
  def releases
38
49
  @release ||= (parsed/'artist'/'releases'/'release').collect do |release|
39
- Release.new(api_key, release.attributes['id'])
50
+ Release.new(release.attributes['id'])
40
51
  end
41
52
  end
42
53
 
43
- def to_s
54
+ def to_s #:nodoc:
44
55
  name
45
56
  end
46
57
  end
@@ -17,49 +17,60 @@ module Discogs
17
17
  @request_type = request_type.to_s
18
18
  end
19
19
 
20
+ # Hpricot parsed XML
20
21
  def parsed
21
22
  @parsed ||= Hpricot.XML(fetched)
22
23
  end
23
24
 
24
- def fetched
25
+ def fetched #:nodoc:
25
26
  @fetched ||= begin
27
+ begin
26
28
  gz = Zlib::GzipReader.new(open(request_url, 'Accept-encoding' => 'gzip, deflate'))
27
29
  fetched = gz.read
28
30
  gz.close
31
+ rescue
32
+ fetched = open(request_url).read
33
+ end
29
34
  fetched
30
35
  end
31
36
  end
32
37
 
33
38
  protected
34
- def request_url
39
+ def request_url #:nodoc:
35
40
  "#{DISCOGS_BASE_URL}/#{request_type}/#{CGI::escape(request_string)}?f=xml&api_key=#{api_key}"
36
41
  end
37
42
 
38
- def load_api_key
43
+ # try to load api key from yaml file
44
+ # If it doesn't exist, then create it
45
+ def load_api_key #:nodoc:
39
46
  begin
40
47
  YAML::load(open(config_file))[:api_key]
41
48
  rescue Errno::ENOENT
42
49
  File.open(config_file, 'w') do |file|
43
50
  file.write({:api_key => "CHANGE ME"}.to_yaml)
44
- puts "Please edit #{config_file}"
45
51
  end
52
+ logger.warn "DISCOGS:: Please edit #{config_file}"
46
53
  end
47
54
  end
48
55
 
49
- def home_dir
56
+ def home_dir #:nodoc:
50
57
  ENV['HOME'] || ENV['USERPROFILE'] || ENV['HOMEPATH']
51
58
  end
52
59
 
53
- def config_filename(rails = false)
60
+ def config_filename(rails = false) #:nodoc:
54
61
  rails ? 'discogs.yml' : '.discogs'
55
62
  end
56
63
 
57
- def config_file
64
+ def config_file #:nodoc:
58
65
  if defined?(RAILS_ROOT)
59
- File.join(RAILS_ROOT, 'config', config_filename)
66
+ File.join(RAILS_ROOT, 'config', config_filename(true))
60
67
  else
61
68
  File.join(home_dir, config_filename)
62
69
  end
63
70
  end
71
+
72
+ def logger #:nodoc:
73
+ @logger ||= (ActiveRecord::Base.logger || Logger.new)
74
+ end
64
75
  end
65
76
  end
@@ -6,8 +6,8 @@ module Discogs
6
6
  @role = role
7
7
  end
8
8
 
9
- def to_s
10
- name
9
+ def to_s #:nodoc:
10
+ "#{name} as #{role}"
11
11
  end
12
12
  end
13
13
  end
@@ -5,6 +5,7 @@ require 'hpricot'
5
5
  require 'zlib'
6
6
  require 'cgi'
7
7
 
8
+ # discgs gem libraries
8
9
  require 'base'
9
10
  require 'artist'
10
11
  require 'label'
@@ -17,6 +18,6 @@ require 'search'
17
18
 
18
19
 
19
20
  module Discogs
20
- VERSION = '1.0.0'
21
+ VERSION = '1.1.0'
21
22
  API_VERSION = '1.0'
22
23
  end
@@ -6,7 +6,7 @@ module Discogs
6
6
  @qty = qty
7
7
  end
8
8
 
9
- def to_s
9
+ def to_s #:nodoc:
10
10
  name
11
11
  end
12
12
  end
@@ -15,7 +15,7 @@ module Discogs
15
15
  @height = height
16
16
  end
17
17
 
18
- def to_s
18
+ def to_s #:nodoc:
19
19
  uri
20
20
  end
21
21
  end
@@ -4,17 +4,20 @@ module Discogs
4
4
 
5
5
  def initialize(request_string)
6
6
  @request_string = request_string
7
- super(@request_string, 'label')
7
+ super(@request_string, :label)
8
8
  end
9
9
 
10
+ # Discogs Data
10
11
  def label
11
12
  @label ||= (parsed/'label')
12
13
  end
13
14
 
15
+ # Discogs Data
14
16
  def name
15
17
  @name ||= (label/'name').inner_html
16
18
  end
17
19
 
20
+ # An array of image objects
18
21
  def images
19
22
  @images ||= (label/'images'/'image').collect do |image|
20
23
  Image.new(image.attributes['url'],
@@ -25,18 +28,23 @@ module Discogs
25
28
  end
26
29
  end
27
30
 
31
+ # Discogs Data
28
32
  def contact_info
29
33
  @contact_info ||= (label/'contactinfo').inner_html
30
34
  end
31
35
 
36
+ # Discogs Data
32
37
  def profile
33
38
  @profile ||= (label/'profile').inner_html
34
39
  end
35
40
 
41
+ # Discogs Data
42
+ # An array of strings
36
43
  def urls
37
44
  @url ||= (label/'urls'/'url').collect { |url | url.inner_html }
38
45
  end
39
46
 
47
+ # parent label if applicable
40
48
  def parent
41
49
  @parent_label ||= begin
42
50
  Label.new((label/'parentLabel').inner_html) unless (label/'parentLabel').empty?
@@ -44,6 +52,7 @@ module Discogs
44
52
  end
45
53
  end
46
54
 
55
+ # sublabels if applicable
47
56
  def sublabels
48
57
  @sub_labels ||= begin
49
58
  (label/'sublabels'/'label').collect do |label|
@@ -54,6 +63,9 @@ module Discogs
54
63
  end
55
64
  end
56
65
 
66
+ # Be careful, this creates a Release object for each release.
67
+ # Data is lazy loaded, so an API call will be created as soon
68
+ # as you access the attributes
57
69
  def releases
58
70
  @releases ||= begin
59
71
  (label/'releases'/'release').collect do |release|
@@ -63,7 +75,7 @@ module Discogs
63
75
  end
64
76
  end
65
77
 
66
- def to_s
78
+ def to_s #:nodoc:
67
79
  name
68
80
  end
69
81
  end
@@ -21,40 +21,50 @@ module Discogs
21
21
  super
22
22
  end
23
23
 
24
+ # status as determined by discogs
25
+ # 'Approved', etc..
24
26
  def discog_status
25
27
  @discog_status ||= (parsed/'release').first.attributes['status']
26
28
  end
27
29
 
30
+ # Discogs Data
28
31
  def title
29
32
  @title ||= (parsed/'title').first.inner_html
30
33
  end
31
34
 
35
+ # Discogs Data
32
36
  def labels
33
37
  @labels ||= (parsed/'labels'/'label').collect { |label| label.attributes['name'] }
34
38
  end
35
39
 
40
+ # Discogs Data
36
41
  def genres
37
42
  @genres ||= (parsed/'genres'/'genre').collect { |genre| genre.inner_html }
38
43
  end
39
44
 
45
+ # Discogs Data
40
46
  def styles
41
47
  @styles ||= (parsed/'styles'/'style').collect{ |label| label.inner_html }
42
48
  end
43
49
 
50
+ # Discogs Data
44
51
  def country
45
52
  @country ||= (parsed/'country').inner_html
46
53
  end
47
54
 
55
+ # Discogs Data
48
56
  def released
49
57
  @released ||= (parsed/'released').inner_html
50
58
  end
51
59
 
60
+ # An array of Format objects
52
61
  def formats
53
62
  @formats ||= (parsed/'formats'/'format').collect do |format|
54
63
  Format.new(format.attributes['name'], format.attributes['qty'])
55
64
  end
56
65
  end
57
66
 
67
+ # An array of Track objects
58
68
  def tracks
59
69
  @tracks ||= (parsed/'tracklist'/'track').collect do |track|
60
70
  Track.new((track/'position').inner_html,
@@ -64,6 +74,7 @@ module Discogs
64
74
  end
65
75
  end
66
76
 
77
+ # An array of Image objects
67
78
  def images
68
79
  @images ||= (parsed/'images'/'image').collect do |image|
69
80
  Image.new(image.attributes['url'],
@@ -74,18 +85,19 @@ module Discogs
74
85
  end
75
86
  end
76
87
 
88
+ # An array of Contributor objects
77
89
  def contributors
78
90
  @contributors ||= (parsed/'extraartists'/'artist').collect do |artist|
79
91
  Contributor.new((artist/'name').inner_html, (artist/'role').inner_html)
80
92
  end
81
93
  end
82
94
 
83
- def to_s
95
+ def to_s #:nodoc:
84
96
  "#{title} - #{label} - #{released} - #{format}"
85
97
  end
86
98
 
87
99
  protected
88
- def request_url
100
+ def request_url #:nodoc:
89
101
  "#{DISCOGS_BASE_URL}/release/#{discog_id}?f=xml&api_key=#{api_key}"
90
102
  end
91
103
  end
@@ -13,14 +13,17 @@ module Discogs
13
13
  super
14
14
  end
15
15
 
16
+ # size of exact search phrase matches
16
17
  def exactresult_size
17
18
  @exactresult_size ||= exactresults.size
18
19
  end
19
20
 
21
+ # size of fuzzy matches
20
22
  def result_size
21
- (parsed/'searchresults').first.attributes['end'].to_i
23
+ @result_size ||= (parsed/'searchresults').first.attributes['end'].to_i
22
24
  end
23
25
 
26
+ # results that match the search phrase exactly
24
27
  def exactresults
25
28
  (parsed/'exactresults'/'result').collect do |result|
26
29
  SearchResult.new(
@@ -30,9 +33,9 @@ module Discogs
30
33
  (result/'summary').inner_html
31
34
  )
32
35
  end
33
-
34
36
  end
35
37
 
38
+ # fuzzy results
36
39
  def results
37
40
  (parsed/'searchresults'/'result').collect do |result|
38
41
  SearchResult.new(
@@ -44,6 +47,8 @@ module Discogs
44
47
  end
45
48
  end
46
49
 
50
+ # use the exact results to get more data using another
51
+ # api call based on the result type
47
52
  def best_match
48
53
  first_result = exactresults.first
49
54
  if first_result.artist?
@@ -53,8 +58,8 @@ module Discogs
53
58
  end
54
59
 
55
60
  protected
56
- def request_url
57
- "#{base_url}/search?type=#{search_type}&q=#{request_string}&f=xml&api_key=#{api_key}"
61
+ def request_url #:nodoc:
62
+ "#{DISCOGS_BASE_URL}/search?type=#{search_type}&q=#{CGI::escape(request_string)}&f=xml&api_key=#{api_key}"
58
63
  end
59
64
  end
60
65
 
@@ -71,14 +76,14 @@ module Discogs
71
76
  @summary = summary
72
77
  end
73
78
 
74
- def method_missing(method, *args, &block)
79
+ def method_missing(method, *args, &block) #:nodoc:
75
80
  type = method.to_s.match(/([a-zA-Z0-9_-]+)\?/)
76
81
  # if type.size < 2 the method did not have a question mark at the end
77
82
  super if type.size < 2
78
83
  @type == type[1].to_s
79
84
  end
80
85
 
81
- def to_s
86
+ def to_s #:nodoc:
82
87
  "#{title}"
83
88
  end
84
89
 
@@ -10,7 +10,7 @@ module Discogs
10
10
  @duration = duration
11
11
  end
12
12
 
13
- def to_s
13
+ def to_s #:nodoc:
14
14
  title
15
15
  end
16
16
  end
@@ -32,3 +32,13 @@ describe Discogs::Artist do
32
32
  @artist.releases.should eql([mock_release]*59)
33
33
  end
34
34
  end
35
+ describe Discogs::Artist do
36
+ describe "network connections" do
37
+ it "does not make more connections than it needs" do
38
+ @artist = Discogs::Artist.new('Broken Social Scene')
39
+ @artist.name
40
+ sleep 2
41
+ @artist.realname
42
+ end
43
+ end
44
+ end
@@ -27,4 +27,12 @@ describe Discogs::Search do
27
27
  it "returns fuzzy result size" do
28
28
  @search.result_size.should eql(20)
29
29
  end
30
+
31
+ # this is not mocked. use for real-deal testing
32
+ # describe "advanced searching" do
33
+ # it "returns some junk" do
34
+ # search = discogs::search.new('broken social scene')
35
+ # puts search.exactresults
36
+ # end
37
+ # end
30
38
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: discogs
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Stephenson
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-07-13 00:00:00 -06:00
12
+ date: 2008-09-04 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency