rbrainz 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,5 +1,17 @@
1
1
  = Changelog
2
2
 
3
+ == 0.2.1 (2007-07-24)
4
+ * Erroneous date strings in the XML are ignored. No error is raised and nil
5
+ is set for the date.
6
+ * MBXML#get_entity_list now returns an ScoredCollection even if no list-element
7
+ is present in the XML. This is due to the fact that musicbrainz.org always
8
+ returns an empty result <metadata/> if no matching entities were found.
9
+ * Removed custom eql? and include? methods from Range and added them to
10
+ IncompleteDate. Those methods changed the behaviour of Range which might lead
11
+ to unexcpected results in programs using RBrainz.
12
+ * Changed IncompleteDate to include its end value.
13
+ * Added additional examples
14
+
3
15
  == 0.2.0 (2007-07-19)
4
16
  * Querying of collections implemented
5
17
  * Collection class to store search results (with support for search score and offset)
@@ -28,4 +40,4 @@
28
40
  == 0.1.0 (2007-05-23)
29
41
  * Initial release
30
42
 
31
- $Id: CHANGES 145 2007-07-19 13:11:44Z phw $
43
+ $Id: CHANGES 156 2007-07-24 17:47:07Z phw $
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Example script which queries the database for an
4
+ # label and displays the label's data.
5
+ #
6
+ # $Id: getlabel.rb 150 2007-07-24 08:16:16Z phw $
7
+
8
+ # Just make sure we can run this example from the command
9
+ # line even if RBrainz is not yet installed properly.
10
+ $: << 'lib/' << '../lib/'
11
+
12
+ # Load RBrainz and include the MusicBrainz namespace.
13
+ require 'rbrainz'
14
+ include MusicBrainz
15
+
16
+ # The label's MusicBrainz ID.
17
+ # Either read it from the command line as the first
18
+ # parameter or use a default one for demonstration.
19
+ id = $*[0] ? $*[0] : '727ad90b-7ef4-48d2-8f16-c34016544822'
20
+
21
+ # Generate a new label MBID object from the ID:
22
+ mbid = Model::MBID.parse(id, :label)
23
+
24
+ # Define what information about the label
25
+ # should be included in the result.
26
+ # In this case the label's aliases will be
27
+ # fetched as well.
28
+ label_includes = Webservice::LabelIncludes.new(
29
+ :aliases => true
30
+ )
31
+
32
+ # Create a new Query object which will provide
33
+ # us an interface to the MusicBrainz web service.
34
+ query = Webservice::Query.new
35
+
36
+ # Now query the MusicBrainz database for the label
37
+ # with the MBID defined above.
38
+ # We could as well use the ID string directly instead
39
+ # of the MBID object.
40
+ label = query.get_label_by_id(mbid, label_includes)
41
+
42
+ # Display the fetched label data together with all
43
+ # unique release titles.
44
+ print <<EOF
45
+ ID : #{label.id.uuid}
46
+ Name : #{label.name}
47
+ Sort name : #{label.sort_name}
48
+ Disambiguation: #{label.disambiguation}
49
+ Type : #{label.type}
50
+ Begin date : #{label.begin_date}
51
+ End date : #{label.end_date}
52
+ Aliases : #{label.aliases.to_a.join('; ')}
53
+ EOF
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Example script which queries the database for an
4
+ # release and displays the release's data.
5
+ #
6
+ # $Id: getrelease.rb 150 2007-07-24 08:16:16Z phw $
7
+
8
+ # Just make sure we can run this example from the command
9
+ # line even if RBrainz is not yet installed properly.
10
+ $: << 'lib/' << '../lib/'
11
+
12
+ # Load RBrainz and include the MusicBrainz namespace.
13
+ require 'rbrainz'
14
+ include MusicBrainz
15
+
16
+ # The release's MusicBrainz ID.
17
+ # Either read it from the command line as the first
18
+ # parameter or use a default one for demonstration.
19
+ id = $*[0] ? $*[0] : '6785cad0-159c-40ec-9ee4-30d8745dd7f9'
20
+
21
+ # Generate a new release MBID object from the ID:
22
+ mbid = Model::MBID.parse(id, :release)
23
+
24
+ # Define what information about the release
25
+ # should be included in the result.
26
+ # In this case the release artist and the tracks
27
+ # on the release will be fetched as well.
28
+ release_includes = Webservice::ReleaseIncludes.new(
29
+ :artist => true,
30
+ :tracks => true
31
+ )
32
+
33
+ # Create a new Query object which will provide
34
+ # us an interface to the MusicBrainz web service.
35
+ query = Webservice::Query.new
36
+
37
+ # Now query the MusicBrainz database for the release
38
+ # with the MBID defined above.
39
+ # We could as well use the ID string directly instead
40
+ # of the MBID object.
41
+ release = query.get_release_by_id(mbid, release_includes)
42
+
43
+ # Display the fetched release data together with all
44
+ # unique release titles.
45
+ print <<EOF
46
+ ID : #{release.id.uuid}
47
+ Title : #{release.title}
48
+ Artist : #{release.artist.unique_name}
49
+ Tracks : #{release.tracks.to_a.join("\r\n ")}
50
+ EOF
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Example script which queries the database for an
4
+ # track and displays the track's data.
5
+ #
6
+ # $Id: gettrack.rb 150 2007-07-24 08:16:16Z phw $
7
+
8
+ # Just make sure we can run this example from the command
9
+ # line even if RBrainz is not yet installed properly.
10
+ $: << 'lib/' << '../lib/'
11
+
12
+ # Load RBrainz and include the MusicBrainz namespace.
13
+ require 'rbrainz'
14
+ include MusicBrainz
15
+
16
+ # The track's MusicBrainz ID.
17
+ # Either read it from the command line as the first
18
+ # parameter or use a default one for demonstration.
19
+ id = $*[0] ? $*[0] : 'c29715ad-9a28-4f2b-9b64-4b899b06ac2a'
20
+
21
+ # Generate a new track MBID object from the ID:
22
+ mbid = Model::MBID.parse(id, :track)
23
+
24
+ # Define what information about the track
25
+ # should be included in the result.
26
+ # In this case the track artist and the releases
27
+ # the track appears on will be fetched as well.
28
+ track_includes = Webservice::TrackIncludes.new(
29
+ :artist => true,
30
+ :releases => true
31
+ )
32
+
33
+ # Create a new Query object which will provide
34
+ # us an interface to the MusicBrainz web service.
35
+ query = Webservice::Query.new
36
+
37
+ # Now query the MusicBrainz database for the track
38
+ # with the MBID defined above.
39
+ # We could as well use the ID string directly instead
40
+ # of the MBID object.
41
+ track = query.get_track_by_id(mbid, track_includes)
42
+
43
+ # Display the fetched track data together with all
44
+ # unique track titles.
45
+ print <<EOF
46
+ ID : #{track.id.uuid}
47
+ Title : #{track.title}
48
+ Duration : #{track.duration/1000} seconds
49
+ Artist : #{track.artist.unique_name}
50
+ Release : #{track.releases.to_a.join("\r\n ")}
51
+ EOF
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Example script which searches the database for
4
+ # labels and displays the label's data.
5
+ #
6
+ # $Id: searchlabels.rb 150 2007-07-24 08:16:16Z phw $
7
+
8
+ # Just make sure we can run this example from the command
9
+ # line even if RBrainz is not yet installed properly.
10
+ $: << 'lib/' << '../lib/'
11
+
12
+ # Load RBrainz and include the MusicBrainz namespace.
13
+ require 'rbrainz'
14
+ include MusicBrainz
15
+
16
+ # Define the search parameters: Search for labels with the
17
+ # name "Paradise Lost" and return a maximum of 10 labels.
18
+ label_filter = Webservice::LabelFilter.new(
19
+ :name => 'Century',
20
+ :limit => 10
21
+ )
22
+
23
+ # Create a new Query object which will provide
24
+ # us an interface to the MusicBrainz web service.
25
+ query = Webservice::Query.new
26
+
27
+ # Now query the MusicBrainz database for labels
28
+ # with the search parameters defined above.
29
+ labels = query.get_labels(label_filter)
30
+
31
+ # Display the fetched label's names and the score, which
32
+ # indicates how good the label matches the search parameters.
33
+ labels.each do |entry|
34
+ print "%s (%i%%)\r\n" % [entry.entity.unique_name, entry.score]
35
+ end
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Example script which searches the database for
4
+ # releases and displays the release data.
5
+ #
6
+ # $Id: searchreleases.rb 150 2007-07-24 08:16:16Z phw $
7
+
8
+ # Just make sure we can run this example from the command
9
+ # line even if RBrainz is not yet installed properly.
10
+ $: << 'lib/' << '../lib/'
11
+
12
+ # Load RBrainz and include the MusicBrainz namespace.
13
+ require 'rbrainz'
14
+ include MusicBrainz
15
+
16
+ # Define the search parameters: Search for releases with the
17
+ # title "Paradise Lost" and return a maximum of 10 releases.
18
+ release_filter = Webservice::ReleaseFilter.new(
19
+ :title => 'Draconian Times',
20
+ :limit => 10
21
+ )
22
+
23
+ # Create a new Query object which will provide
24
+ # us an interface to the MusicBrainz web service.
25
+ query = Webservice::Query.new
26
+
27
+ # Now query the MusicBrainz database for releases
28
+ # with the search parameters defined above.
29
+ releases = query.get_releases(release_filter)
30
+
31
+ # Display the fetched release titles and the score, which
32
+ # indicates how good the release matches the search parameters.
33
+ releases.each do |entry|
34
+ print "%s (%i%%)\r\n" % [entry.entity.title, entry.score]
35
+ end
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Example script which searches the database for
4
+ # tracks and displays the track data.
5
+ #
6
+ # $Id: searchtracks.rb 150 2007-07-24 08:16:16Z phw $
7
+
8
+ # Just make sure we can run this example from the command
9
+ # line even if RBrainz is not yet installed properly.
10
+ $: << 'lib/' << '../lib/'
11
+
12
+ # Load RBrainz and include the MusicBrainz namespace.
13
+ require 'rbrainz'
14
+ include MusicBrainz
15
+
16
+ # Define the search parameters: Search for releases with the
17
+ # title "Paradise Lost" and return a maximum of 10 releases.
18
+ track_filter = Webservice::TrackFilter.new(
19
+ :title => 'Shadowkings',
20
+ :limit => 10
21
+ )
22
+
23
+ # Create a new Query object which will provide
24
+ # us an interface to the MusicBrainz web service.
25
+ query = Webservice::Query.new
26
+
27
+ # Now query the MusicBrainz database for tracks
28
+ # with the search parameters defined above.
29
+ tracks = query.get_tracks(track_filter)
30
+
31
+ # Display the fetched track titles and the score, which
32
+ # indicates how good the track matches the search parameters.
33
+ tracks.each do |entry|
34
+ print "%s: \"%s\" (%i%%)\r\n" % [entry.entity.artist, entry.entity.title, entry.score]
35
+ end
@@ -1,4 +1,4 @@
1
- # $Id: range.rb 136 2007-07-16 15:45:32Z phw $
1
+ # $Id: range.rb 154 2007-07-24 12:39:02Z phw $
2
2
  #
3
3
  # Author:: Nigel Graham (mailto:nigel_graham@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -8,21 +8,8 @@
8
8
  require File.dirname(__FILE__) + '/range/equality'
9
9
 
10
10
  class Range #:nodoc:
11
- include MusicBrainz::CoreExtensions::Range::Equality
12
-
13
- alias :old_eql? :eql?
14
- def eql?(b)
15
- if b.kind_of? ::Range
16
- self.begin == b.begin && self.open_end == b.open_end
17
- else
18
- self.begin == b && self.open_end == b.succ
19
- end
20
- end
21
- remove_method :==
22
- alias :== :eql?
23
11
 
24
- alias :old_include? :include?
25
- def include?(b)
26
- self.started_by?(b) || self.contains?(b) || self.eql?(b) || self.finished_by?(b)
27
- end
12
+ # Extend Range with additional comparison operations.
13
+ include MusicBrainz::CoreExtensions::Range::Equality
14
+
28
15
  end
@@ -1,4 +1,4 @@
1
- # $Id: equality.rb 137 2007-07-17 08:00:06Z phw $
1
+ # $Id: equality.rb 154 2007-07-24 12:39:02Z phw $
2
2
  #
3
3
  # Author:: Nigel Graham (mailto:nigel_graham@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -211,13 +211,6 @@ Allready exists in Range so we can't define it in the module
211
211
  self.starts?(b) || self.during?(b) || self.finishes?(b)
212
212
  end
213
213
 
214
- =begin comment
215
- Allready exists in Range so we can't define it in the module
216
- def include?(b)
217
- self.started_by?(b) || self.contains?(b) || self.eql?(b) || self.finished_by?(b)
218
- end
219
- =end
220
-
221
214
  protected
222
215
  def open_end # :nodoc:
223
216
  if self.exclude_end?
@@ -1,4 +1,4 @@
1
- # $Id: incomplete_date.rb 145 2007-07-19 13:11:44Z phw $
1
+ # $Id: incomplete_date.rb 154 2007-07-24 12:39:02Z phw $
2
2
  #
3
3
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -10,10 +10,16 @@ require 'date'
10
10
  module MusicBrainz
11
11
  module Model
12
12
 
13
- # Represents an incomplete date. An incomplete date is
14
- # a date which can be defined without day or without
15
- # month and day. It can be written as <em>YYYY</em>,
16
- # <em>YYYY-MM</em> or <em>YYYY-MM-DD</em>.
13
+ # Represents an incomplete date. An incomplete date is a date which can be
14
+ # defined without day or without month and day. It can be written as
15
+ # <em>YYYY</em>, <em>YYYY-MM</em> or <em>YYYY-MM-DD</em>.
16
+ #
17
+ # An IncompleteDate is a Range of Date objects. The incomplete date
18
+ # <em>1969-01</em> for example results in a range beginning on 1969-01-01
19
+ # and ending on 1969-01-31, including the end.
20
+ #
21
+ # RBrainz extends the Ruby Range class with additional comparison methods.
22
+ # See CoreExtensions::Range::Equality for a description of those methods.
17
23
  class IncompleteDate < ::Range
18
24
  attr_reader :year, :month, :day
19
25
 
@@ -28,16 +34,16 @@ module MusicBrainz
28
34
  if @month
29
35
  if @day
30
36
  start_d = Date.civil( @year, @month, @day)
31
- end_d = start_d.succ
37
+ end_d = start_d
32
38
  else
33
39
  start_d = Date.civil( @year, @month)
34
- end_d = Date.civil( @year, @month+1)
40
+ end_d = Date.civil( @year, @month, -1)
35
41
  end
36
42
  else
37
43
  start_d = Date.civil( @year)
38
- end_d = Date.civil( @year+1)
44
+ end_d = Date.civil( @year, -1, -1)
39
45
  end
40
- super( start_d, end_d, true)
46
+ super( start_d, end_d)
41
47
  else
42
48
  raise ArgumentError, "Invalid incomplete date #{date}"
43
49
  end
@@ -54,6 +60,36 @@ module MusicBrainz
54
60
  }
55
61
  return date
56
62
  end
63
+
64
+ # Compare two IncompleteDate objects for equality.
65
+ #
66
+ # You can compare an IncompleteDate with another IncompleteDate, with
67
+ # a Range of Date objects or directly with a Date. The following examples
68
+ # all return true:
69
+ #
70
+ # IncompleteDate.new('1969-01-05').eql?( IncompleteDate.new('1969-01-05') )
71
+ # IncompleteDate.new('1969-01-05').eql?( Date.civil(1969, 1, 5) )
72
+ # IncompleteDate.new('1969-01').eql?( Date.civil(1969, 1)..Date.civil(1969, 1, 31) )
73
+ # IncompleteDate.new('1969-01').eql?( Date.civil(1969, 1)...Date.civil(1969, 2, 1) )
74
+ #
75
+ # Please note that comparing an IncompleteDate with something else than a
76
+ # IncompleteDate is normally not symmetric.
77
+ def eql?(b)
78
+ if b.kind_of? ::Range
79
+ self.begin == b.begin && self.open_end == b.open_end
80
+ else
81
+ self.begin == b && self.open_end == b.succ
82
+ end
83
+ end
84
+ alias :== :eql?
85
+
86
+ # Returns true if b is completely included in this IncompleteDate. Unlike
87
+ # CoreExtensions::Range::Equality#contains? include? allows equality for
88
+ # begin and end.
89
+ def include?(b)
90
+ self.started_by?(b) || self.contains?(b) || self.eql?(b) || self.finished_by?(b)
91
+ end
92
+
57
93
  end
58
94
 
59
95
  end
@@ -1,4 +1,4 @@
1
- # $Id: individual.rb 145 2007-07-19 13:11:44Z phw $
1
+ # $Id: individual.rb 151 2007-07-24 08:36:27Z phw $
2
2
  #
3
3
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -65,7 +65,7 @@ module MusicBrainz
65
65
  # Should be an IncompleteDate object or a date string, which will
66
66
  # get converted into an IncompleteDate.
67
67
  def begin_date=(date)
68
- date = IncompleteDate.new date unless date.is_a? IncompleteDate
68
+ date = IncompleteDate.new date unless date.is_a? IncompleteDate or date.nil?
69
69
  @begin_date = date
70
70
  end
71
71
 
@@ -74,7 +74,7 @@ module MusicBrainz
74
74
  # Should be an IncompleteDate object or a date string, which will
75
75
  # get converted into an IncompleteDate.
76
76
  def end_date=(date)
77
- date = IncompleteDate.new date unless date.is_a? IncompleteDate
77
+ date = IncompleteDate.new date unless date.is_a? IncompleteDate or date.nil?
78
78
  @end_date = date
79
79
  end
80
80
 
@@ -1,4 +1,4 @@
1
- # $Id: relation.rb 145 2007-07-19 13:11:44Z phw $
1
+ # $Id: relation.rb 151 2007-07-24 08:36:27Z phw $
2
2
  #
3
3
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -128,7 +128,7 @@ module MusicBrainz
128
128
  # a date string, which will get converted
129
129
  # into an IncompleteDate.
130
130
  def begin_date=(date)
131
- date = IncompleteDate.new date unless date.is_a? IncompleteDate
131
+ date = IncompleteDate.new date unless date.is_a? IncompleteDate or date.nil?
132
132
  @begin_date = date
133
133
  end
134
134
 
@@ -138,7 +138,7 @@ module MusicBrainz
138
138
  # a date string, which will get converted
139
139
  # into an IncompleteDate.
140
140
  def end_date=(date)
141
- date = IncompleteDate.new date unless date.is_a? IncompleteDate
141
+ date = IncompleteDate.new date unless date.is_a? IncompleteDate or date.nil?
142
142
  @end_date = date
143
143
  end
144
144
 
@@ -1,4 +1,4 @@
1
- # $Id: release_event.rb 141 2007-07-17 14:21:12Z phw $
1
+ # $Id: release_event.rb 151 2007-07-24 08:36:27Z phw $
2
2
  #
3
3
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -44,7 +44,7 @@ module MusicBrainz
44
44
 
45
45
  def initialize(country=nil, date=nil)
46
46
  self.country = country
47
- self.date = date if date
47
+ self.date = date
48
48
  end
49
49
 
50
50
  # Set the date the release took place.
@@ -53,7 +53,7 @@ module MusicBrainz
53
53
  # a date string, which will get converted
54
54
  # into an IncompleteDate.
55
55
  def date=(date)
56
- date = IncompleteDate.new date unless date.is_a? IncompleteDate
56
+ date = IncompleteDate.new date unless date.is_a? IncompleteDate or date.nil?
57
57
  @date = date
58
58
  end
59
59
 
@@ -1,4 +1,4 @@
1
- # $Id: version.rb 143 2007-07-18 11:40:55Z phw $
1
+ # $Id: version.rb 153 2007-07-24 09:04:25Z phw $
2
2
  #
3
3
  # Version information.
4
4
  #
@@ -10,6 +10,6 @@
10
10
  module MusicBrainz
11
11
 
12
12
  # The version of the RBrainz library.
13
- RBRAINZ_VERSION = '0.2.0'
13
+ RBRAINZ_VERSION = '0.2.1'
14
14
 
15
15
  end
@@ -1,4 +1,4 @@
1
- # $Id: mbxml.rb 148 2007-07-19 17:26:33Z phw $
1
+ # $Id: mbxml.rb 152 2007-07-24 08:47:28Z phw $
2
2
  #
3
3
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -75,10 +75,8 @@ module MusicBrainz
75
75
  # entity type. There must be an entity-list element as a child of the
76
76
  # +metadata+ element in the document.
77
77
  #
78
- # Returns an empty Collection if the list is empty.
79
- # Raises a MBXML::ParseError if no entity-list element can be found.
80
- #
81
- # Raises:: MBXML::ParseError
78
+ # Returns an empty ScoredCollection if the list is empty or if no
79
+ # entity-list element can be found.
82
80
  def get_entity_list(entity_type, ns=Model::NS_MMD_1)
83
81
  # Search for the first occuring node of type entity which is a child node
84
82
  # of the metadata element.
@@ -97,9 +95,8 @@ module MusicBrainz
97
95
 
98
96
  return collection
99
97
  else
100
- raise ParseError.new("no element %s-list found" % entity_type)
98
+ return Model::ScoredCollection.new
101
99
  end
102
- return nil
103
100
  end
104
101
 
105
102
  private # ----------------------------------------------------------------
@@ -133,12 +130,8 @@ module MusicBrainz
133
130
  artist.disambiguation = node.elements['disambiguation'].text if node.elements['disambiguation']
134
131
 
135
132
  if life_span = node.elements['life-span']
136
- if life_span.attributes['begin']
137
- artist.begin_date = Model::IncompleteDate.new life_span.attributes['begin']
138
- end
139
- if life_span.attributes['end']
140
- artist.end_date = Model::IncompleteDate.new life_span.attributes['end']
141
- end
133
+ artist.begin_date = read_date_attribute(life_span, 'begin')
134
+ artist.end_date = read_date_attribute(life_span, 'end')
142
135
  end
143
136
 
144
137
  # Read the alias list
@@ -306,12 +299,8 @@ module MusicBrainz
306
299
  label.country = node.elements['country'].text if node.elements['country']
307
300
 
308
301
  if life_span = node.elements['life-span']
309
- if life_span.attributes['begin']
310
- label.begin_date = Model::IncompleteDate.new life_span.attributes['begin']
311
- end
312
- if life_span.attributes['end']
313
- label.end_date = Model::IncompleteDate.new life_span.attributes['end']
314
- end
302
+ label.begin_date = read_date_attribute(life_span, 'begin')
303
+ label.end_date = read_date_attribute(life_span, 'end')
315
304
  end
316
305
 
317
306
  # Read the alias list
@@ -386,9 +375,7 @@ module MusicBrainz
386
375
  event = @factory.new_release_event
387
376
 
388
377
  # Read all defined data fields
389
- if node.attributes['date']
390
- event.date = Model::IncompleteDate.new node.attributes['date']
391
- end
378
+ event.date = read_date_attribute(node, 'date')
392
379
  event.country = node.attributes['country']
393
380
  event.catalog_number = node.attributes['catalog-number']
394
381
  event.barcode = node.attributes['barcode']
@@ -451,9 +438,7 @@ module MusicBrainz
451
438
  relation.type = MBXML.add_namespace(node.attributes['type'], Model::NS_REL_1)
452
439
  end
453
440
 
454
- if node.attributes['begin']
455
- relation.begin_date = Model::IncompleteDate.new node.attributes['begin']
456
- end
441
+ relation.begin_date = read_date_attribute(node, 'begin')
457
442
 
458
443
  if node.attributes['end']
459
444
  relation.begin_end = Model::IncompleteDate.new node.attributes['end']
@@ -565,6 +550,19 @@ module MusicBrainz
565
550
  def self.each_element(node, local_name, ns, &block)
566
551
  node.elements.each("*[local-name() = '#{local_name}' and namespace-uri()='#{ns}']", &block)
567
552
  end
553
+
554
+ # Read a date attribute from node. Returns an IncompleteDate or nil
555
+ # if the attribute was not set or contained an invalid date.
556
+ def read_date_attribute(node, attr_name)
557
+ if node.attributes[attr_name]
558
+ begin
559
+ Model::IncompleteDate.new node.attributes[attr_name]
560
+ rescue ArgumentError
561
+ nil
562
+ end
563
+ end
564
+ end
565
+
568
566
  end
569
567
 
570
568
  end
@@ -1,4 +1,4 @@
1
- # $Id: test_incomplete_date.rb 97 2007-07-06 13:52:29Z nigel_graham $
1
+ # $Id: test_incomplete_date.rb 154 2007-07-24 12:39:02Z phw $
2
2
  #
3
3
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Philipp Wolfer
@@ -53,15 +53,36 @@ class TestIncompleteDate < Test::Unit::TestCase
53
53
 
54
54
  def test_range
55
55
  assert_equal Date.civil(1980,8,22), @date_year_month_day.begin
56
- assert_equal Date.civil(1980,8,23), @date_year_month_day.end
57
- assert @date_year_month_day.exclude_end?
56
+ assert_equal Date.civil(1980,8,22), @date_year_month_day.end
57
+ assert !@date_year_month_day.exclude_end?
58
58
 
59
59
  assert_equal Date.civil(1980, 8, 1), @date_year_month.begin
60
- assert_equal Date.civil(1980, 9, 1), @date_year_month.end
61
- assert @date_year_month.exclude_end?
60
+ assert_equal Date.civil(1980, 8, 31), @date_year_month.end
61
+ assert !@date_year_month.exclude_end?
62
62
 
63
63
  assert_equal Date.civil(1980, 1, 1), @date_year.begin
64
- assert_equal Date.civil(1981, 1, 1), @date_year.end
65
- assert @date_year.exclude_end?
64
+ assert_equal Date.civil(1980, 12, 31), @date_year.end, @date_year.end.to_s
65
+ assert !@date_year.exclude_end?
66
66
  end
67
+
68
+ def test_eql
69
+ assert @date_year.eql?(@date_year)
70
+ assert @date_year_month.eql?(Date.civil(1980, 8, 1)..Date.civil(1980, 8, 31))
71
+ assert @date_year_month_day.eql?(Date.civil(1980, 8, 22))
72
+ assert !@date_year.eql?(@date_year_month_day)
73
+ end
74
+
75
+ def test_include
76
+ assert @date_year.include?(@date_year)
77
+ assert @date_year.include?(@date_year_month)
78
+ assert @date_year.include?(@date_year_month_day)
79
+ assert @date_year_month.include?(Date.civil(1980, 8, 1))
80
+ assert @date_year_month.include?(Date.civil(1980, 8, 22))
81
+ assert @date_year_month.include?(Date.civil(1980, 8, 31))
82
+ assert @date_year_month.include?(Date.civil(1980, 8, 1)..Date.civil(1980, 8, 31))
83
+ assert !@date_year_month.include?(Date.civil(1980, 8, 1)..Date.civil(1980, 9, 1))
84
+ assert !@date_year_month.include?(Date.civil(1980, 7, 30))
85
+ assert !@date_year_month.include?(Date.civil(1980, 9, 1))
86
+ end
87
+
67
88
  end
@@ -1,4 +1,4 @@
1
- # $Id: test_mbxml.rb 146 2007-07-19 16:33:38Z phw $
1
+ # $Id: test_mbxml.rb 152 2007-07-24 08:47:28Z phw $
2
2
  #
3
3
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -31,10 +31,10 @@ class TestMBXML < Test::Unit::TestCase
31
31
  assert_equal nil, mbxml.get_entity(:release)
32
32
  assert_equal nil, mbxml.get_entity(:track)
33
33
  assert_equal nil, mbxml.get_entity(:label)
34
- assert_raise(Webservice::MBXML::ParseError) { mbxml.get_entity_list(:artist) }
35
- assert_raise(Webservice::MBXML::ParseError) { mbxml.get_entity_list(:release) }
36
- assert_raise(Webservice::MBXML::ParseError) { mbxml.get_entity_list(:track) }
37
- assert_raise(Webservice::MBXML::ParseError) { mbxml.get_entity_list(:label) }
34
+ assert mbxml.get_entity_list(:artist).empty?
35
+ assert mbxml.get_entity_list(:release).empty?
36
+ assert mbxml.get_entity_list(:track).empty?
37
+ assert mbxml.get_entity_list(:label).empty?
38
38
 
39
39
  # The second contains an empty artist list
40
40
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'artist/empty_2.xml')
@@ -43,9 +43,9 @@ class TestMBXML < Test::Unit::TestCase
43
43
  assert_equal nil, mbxml.get_entity(:track)
44
44
  assert_equal nil, mbxml.get_entity(:label)
45
45
  assert mbxml.get_entity_list(:artist).empty?
46
- assert_raise(Webservice::MBXML::ParseError) { mbxml.get_entity_list(:release) }
47
- assert_raise(Webservice::MBXML::ParseError) { mbxml.get_entity_list(:track) }
48
- assert_raise(Webservice::MBXML::ParseError) { mbxml.get_entity_list(:label) }
46
+ assert mbxml.get_entity_list(:release).empty?
47
+ assert mbxml.get_entity_list(:track).empty?
48
+ assert mbxml.get_entity_list(:label).empty?
49
49
  end
50
50
 
51
51
  def test_artist_search
@@ -1,4 +1,4 @@
1
- # $Id: test_range_equality.rb 111 2007-07-10 14:09:52Z nigel_graham $
1
+ # $Id: test_range_equality.rb 154 2007-07-24 12:39:02Z phw $
2
2
  #
3
3
  # Author:: Nigel Graham (mailto:nigel_graham@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -70,7 +70,6 @@ class TestRangeEquality < Test::Unit::TestCase
70
70
  OPERATIONS = [
71
71
  :before?,
72
72
  :after?,
73
- :eql?,
74
73
  :meets_beginning_of?,
75
74
  :meets_end_of?,
76
75
  :overlaps_beginning_of?,
@@ -132,13 +131,13 @@ class TestRangeEquality < Test::Unit::TestCase
132
131
  end
133
132
  end
134
133
 
135
- def test_include
136
- TESTSET.each do |a,b,op|
137
- if op == :started_by? || op == :contains? || op == :eql? || op == :finished_by?
138
- assert a.include?(b), a.inspect + ".include? " + b.inspect
139
- else
140
- assert !a.include?(b), '!' + a.inspect + ".include? " + b.inspect + ''
141
- end
142
- end
143
- end
134
+ #def test_include
135
+ # TESTSET.each do |a,b,op|
136
+ # if op == :started_by? || op == :contains? || op == :eql? || op == :finished_by?
137
+ # assert a.include?(b), a.inspect + ".include? " + b.inspect
138
+ # else
139
+ # assert !a.include?(b), '!' + a.inspect + ".include? " + b.inspect + ''
140
+ # end
141
+ # end
142
+ #end
144
143
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: rbrainz
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.2.0
7
- date: 2007-07-19 00:00:00 +02:00
6
+ version: 0.2.1
7
+ date: 2007-07-24 00:00:00 +02:00
8
8
  summary: Ruby library for the MusicBrainz XML web service.
9
9
  require_paths:
10
10
  - lib
@@ -39,6 +39,12 @@ files:
39
39
  - examples/getuser.rb
40
40
  - examples/searchartists.rb
41
41
  - examples/getartist.rb
42
+ - examples/searchtracks.rb
43
+ - examples/getlabel.rb
44
+ - examples/getrelease.rb
45
+ - examples/gettrack.rb
46
+ - examples/searchlabels.rb
47
+ - examples/searchreleases.rb
42
48
  - lib/rbrainz.rb
43
49
  - lib/rbrainz/webservice.rb
44
50
  - lib/rbrainz/model.rb