rbrainz 0.1.1 → 0.2.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.
Files changed (85) hide show
  1. data/CHANGES +31 -0
  2. data/LICENSE +1 -1
  3. data/README +3 -2
  4. data/Rakefile +40 -22
  5. data/TODO +6 -23
  6. data/doc/README.rdoc +50 -21
  7. data/examples/getartist.rb +6 -4
  8. data/examples/getuser.rb +30 -0
  9. data/examples/searchartists.rb +35 -0
  10. data/lib/rbrainz.rb +12 -7
  11. data/lib/rbrainz/core_ext.rb +8 -0
  12. data/lib/rbrainz/core_ext/mbid.rb +30 -0
  13. data/lib/rbrainz/core_ext/net_http_digest.rb +52 -0
  14. data/lib/rbrainz/core_ext/range.rb +28 -0
  15. data/lib/rbrainz/core_ext/range/equality.rb +232 -0
  16. data/lib/rbrainz/data/countrynames.rb +7 -5
  17. data/lib/rbrainz/data/languagenames.rb +8 -5
  18. data/lib/rbrainz/data/releasetypenames.rb +34 -0
  19. data/lib/rbrainz/data/scriptnames.rb +8 -5
  20. data/lib/rbrainz/model.rb +27 -35
  21. data/lib/rbrainz/model/alias.rb +31 -7
  22. data/lib/rbrainz/model/artist.rb +30 -41
  23. data/lib/rbrainz/model/collection.rb +102 -0
  24. data/lib/rbrainz/model/default_factory.rb +78 -0
  25. data/lib/rbrainz/model/disc.rb +45 -8
  26. data/lib/rbrainz/model/entity.rb +122 -53
  27. data/lib/rbrainz/model/incomplete_date.rb +31 -47
  28. data/lib/rbrainz/model/individual.rb +103 -0
  29. data/lib/rbrainz/model/label.rb +42 -33
  30. data/lib/rbrainz/model/mbid.rb +111 -40
  31. data/lib/rbrainz/model/relation.rb +78 -14
  32. data/lib/rbrainz/model/release.rb +119 -31
  33. data/lib/rbrainz/model/release_event.rb +38 -9
  34. data/lib/rbrainz/model/scored_collection.rb +99 -0
  35. data/lib/rbrainz/model/tag.rb +39 -0
  36. data/lib/rbrainz/model/track.rb +37 -13
  37. data/lib/rbrainz/model/user.rb +48 -0
  38. data/lib/rbrainz/utils.rb +9 -0
  39. data/lib/rbrainz/utils/data.rb +78 -0
  40. data/lib/rbrainz/utils/helper.rb +22 -0
  41. data/lib/rbrainz/version.rb +15 -0
  42. data/lib/rbrainz/webservice.rb +32 -6
  43. data/lib/rbrainz/webservice/filter.rb +124 -47
  44. data/lib/rbrainz/webservice/includes.rb +49 -10
  45. data/lib/rbrainz/webservice/mbxml.rb +228 -173
  46. data/lib/rbrainz/webservice/query.rb +312 -25
  47. data/lib/rbrainz/webservice/webservice.rb +164 -27
  48. data/test/lib/mock_webservice.rb +53 -0
  49. data/test/lib/test_entity.rb +27 -8
  50. data/test/lib/test_factory.rb +47 -0
  51. data/test/lib/testing_helper.rb +7 -5
  52. data/test/test-data/invalid/artist/tags_1.xml +6 -0
  53. data/test/test-data/valid/artist/Tchaikovsky-2.xml +12 -0
  54. data/test/test-data/valid/label/Atlantic_Records_2.xml +3 -0
  55. data/test/test-data/valid/label/Atlantic_Records_3.xml +11 -0
  56. data/test/test-data/valid/release/Highway_61_Revisited_2.xml +12 -0
  57. data/test/test-data/valid/track/Silent_All_These_Years_6.xml +8 -0
  58. data/test/test_alias.rb +13 -7
  59. data/test/test_artist.rb +26 -4
  60. data/test/test_artist_filter.rb +11 -6
  61. data/test/test_artist_includes.rb +11 -6
  62. data/test/test_collection.rb +66 -0
  63. data/test/test_default_factory.rb +75 -0
  64. data/test/test_disc.rb +9 -4
  65. data/test/test_incomplete_date.rb +21 -14
  66. data/test/test_label.rb +56 -18
  67. data/test/test_label_filter.rb +10 -5
  68. data/test/test_label_includes.rb +11 -6
  69. data/test/test_mbid.rb +34 -19
  70. data/test/test_mbxml.rb +242 -72
  71. data/test/test_query.rb +92 -7
  72. data/test/test_range_equality.rb +144 -0
  73. data/test/test_relation.rb +18 -7
  74. data/test/test_release.rb +15 -4
  75. data/test/test_release_event.rb +16 -4
  76. data/test/test_release_filter.rb +11 -5
  77. data/test/test_release_includes.rb +11 -6
  78. data/test/test_scored_collection.rb +86 -0
  79. data/test/test_tag.rb +39 -0
  80. data/test/test_track.rb +15 -4
  81. data/test/test_track_filter.rb +11 -5
  82. data/test/test_track_includes.rb +11 -6
  83. data/test/test_utils.rb +41 -0
  84. data/test/test_webservice.rb +16 -17
  85. metadata +93 -57
data/lib/rbrainz/model.rb CHANGED
@@ -1,9 +1,22 @@
1
- # $Id: model.rb 13 2007-05-22 22:59:57Z phw $
2
- # Copyright (c) 2007, Philipp Wolfer
3
- # All rights reserved.
4
- # See LICENSE for permissions.
1
+ # $Id: model.rb 143 2007-07-18 11:40:55Z phw $
2
+ #
3
+ # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
+ # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
5
+ # License:: RBrainz is free software distributed under a BSD style license.
6
+ # See LICENSE[file:../LICENSE.html] for permissions.
5
7
 
6
- module MusicBrainz
8
+ module MusicBrainz # :nodoc:
9
+
10
+ # The MusicBrainz domain model.
11
+ # These classes are part of the MusicBrainz domain model. They may be used
12
+ # by other modules and don't contain any network or other I/O code. If you
13
+ # want to request data from the web service, please have a look at
14
+ # Webservice::Query.
15
+ #
16
+ # The most important classes, usually acting as entry points, are
17
+ # Artist, Release, Track and Label.
18
+ #
19
+ # See:: Webservice
7
20
  module Model
8
21
 
9
22
  # Namespace for all MusicBrainz metadata.
@@ -14,35 +27,14 @@ module MusicBrainz
14
27
 
15
28
  # Namespace for MusicBrainz extensions.
16
29
  NS_EXT_1 = 'http://musicbrainz.org/ns/ext-1.0#'
17
-
18
- # Defines the format of an UUID (Universally Unique Identifier)
19
- UUID_REGEXP = /^[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}$/
20
-
21
- # The format of a MusicBrainz identifier was wrong.
22
- class InvalidMBIDError < Exception
23
- end
24
-
25
- # The format of a MusicBrainz UUID was wrong.
26
- class InvalidUUIDError < Exception
27
- end
28
-
29
- # An unknown entity was encountered.
30
- # Valid entities are only :artist, :release, :track and :label.
31
- class UnknownEntityError < Exception
32
- end
33
-
34
- # The entity type of a MBID didn't match the type of the entity.
35
- class EntityTypeNotMatchingError < Exception
36
- end
30
+
31
+ require 'rbrainz/model/default_factory'
32
+ require 'rbrainz/utils'
33
+ require 'rbrainz/core_ext'
37
34
 
35
+ # The ID of the special 'Various Artists' artist. This is an instance of MBID.
36
+ # See:: http://musicbrainz.org/doc/VariousArtists
37
+ VARIOUS_ARTISTS_ID = MBID.new('89ad4ac3-39f7-470e-963a-56509c546377', Artist.entity_type)
38
+
38
39
  end
39
- end
40
-
41
- require 'rbrainz/data/countrynames'
42
- require 'rbrainz/data/languagenames'
43
- require 'rbrainz/data/scriptnames'
44
-
45
- require 'rbrainz/model/artist'
46
- require 'rbrainz/model/label'
47
- require 'rbrainz/model/release'
48
- require 'rbrainz/model/track'
40
+ end
@@ -1,17 +1,41 @@
1
- # $Id: alias.rb 4 2007-05-21 02:04:26Z phw $
2
- # Copyright (c) 2007, Philipp Wolfer
3
- # All rights reserved.
4
- # See LICENSE for permissions.
1
+ # $Id: alias.rb 145 2007-07-19 13:11:44Z phw $
2
+ #
3
+ # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
+ # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
5
+ # License:: RBrainz is free software distributed under a BSD style license.
6
+ # See LICENSE[file:../LICENSE.html] for permissions.
5
7
 
6
8
  module MusicBrainz
7
9
  module Model
8
10
 
9
- # An artist alias.
11
+ #
12
+ # Represents an artist or label alias.
13
+ #
14
+ # An alias (the <i>alias name</i>) is a different representation of an
15
+ # artist's or label's name. This may be a common misspelling or
16
+ # a transliteration (the <i>alias type</i>).
10
17
  #
11
- # See http://musicbrainz.org/doc/ArtistAlias.
18
+ # The <i>alias script</i> is interesting mostly for transliterations and
19
+ # indicates which script is used for the alias value. To represent the
20
+ # script, ISO-15924 script codes like 'Latn', 'Cyrl', or 'Hebr' are used.
21
+ #
22
+ # See:: http://musicbrainz.org/doc/ArtistAlias.
12
23
  class Alias
13
24
 
14
- attr_accessor :name, :type, :script
25
+ # The alias name.
26
+ attr_accessor :name
27
+
28
+ # The alias type. An absolute URI or +nil+.
29
+ attr_accessor :type
30
+
31
+ # The alias script. See Utils#get_script_name.
32
+ attr_accessor :script
33
+
34
+ def initialize(name=nil, type=nil, script=nil)
35
+ self.name = name
36
+ self.type = type
37
+ self.script = script
38
+ end
15
39
 
16
40
  def to_s
17
41
  return name.to_s
@@ -1,52 +1,41 @@
1
- # $Id: artist.rb 30 2007-05-29 02:12:33Z phw $
2
- # Copyright (c) 2007, Philipp Wolfer
3
- # All rights reserved.
4
- # See LICENSE for permissions.
1
+ # $Id: artist.rb 140 2007-07-17 13:27:54Z phw $
2
+ #
3
+ # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
+ # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
5
+ # License:: RBrainz is free software distributed under a BSD style license.
6
+ # See LICENSE[file:../LICENSE.html] for permissions.
5
7
 
6
- require 'rbrainz/model/entity'
8
+ require 'rbrainz/model/individual'
7
9
  require 'rbrainz/model/alias'
8
- require 'rbrainz/model/incomplete_date'
9
10
 
10
11
  module MusicBrainz
11
12
  module Model
12
13
 
14
+ #
13
15
  # An artist in the MusicBrainz DB.
14
- #
15
- # See http://musicbrainz.org/doc/Artist.
16
- class Artist < Entity
16
+ #
17
+ # Artists in MusicBrainz can have a type. Currently, this type can
18
+ # be either Person or Group for which the following URIs are assigned:
19
+ #
20
+ # - http://musicbrainz.org/ns/mmd-1.0#Person
21
+ # - http://musicbrainz.org/ns/mmd-1.0#Group
22
+ #
23
+ # Use the TYPE_PERSON and TYPE_GROUP constants for comparison.
24
+ #
25
+ # See:: Individual
26
+ # See:: http://musicbrainz.org/doc/Artist.
27
+ class Artist < Individual
17
28
 
18
- TYPE_PERSON = NS_MMD_1 + 'Person'
19
- TYPE_GROUP = NS_MMD_1 + 'Group'
20
-
21
- attr_accessor :name, :sort_name, :disambiguation, :type
22
-
23
- attr_reader :begin_date, :end_date, :aliases, :releases
24
-
25
- def initialize
26
- super
27
- @aliases = Array.new
28
- @releases = Array.new
29
- end
30
-
31
- # Set the begin date of this artist.
32
- #
33
- # Should be an IncompleteDate object or
34
- # a date string, which will get converted
35
- # into an IncompleteDate.
36
- def begin_date=(date)
37
- date = IncompleteDate.new date unless date.is_a? IncompleteDate
38
- @begin_date = date
39
- end
40
-
41
- # Set the end date of this artist.
42
- #
43
- # Should be an IncompleteDate object or
44
- # a date string, which will get converted
45
- # into an IncompleteDate.
46
- def end_date=(date)
47
- date = IncompleteDate.new date unless date.is_a? IncompleteDate
48
- @end_date = date
49
- end
29
+ # Used if the type of the artist is unknown.
30
+ TYPE_UNKNOWN = NS_MMD_1 + 'Unknown'
31
+ # This indicates an individual person.
32
+ TYPE_PERSON = NS_MMD_1 + 'Person'
33
+ # This indicates a group of people that may or may
34
+ # not have a distinctive name.
35
+ TYPE_GROUP = NS_MMD_1 + 'Group'
36
+
37
+ # See Entity::ENTITY_TYPE.
38
+ ENTITY_TYPE = :artist # :nodoc:
50
39
 
51
40
  end
52
41
 
@@ -0,0 +1,102 @@
1
+ # $Id: collection.rb 130 2007-07-12 18:55:24Z nigel_graham $
2
+ #
3
+ # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
+ # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
5
+ # License:: RBrainz is free software distributed under a BSD style license.
6
+ # See LICENSE[file:../LICENSE.html] for permissions.
7
+
8
+ require 'rbrainz/model/entity'
9
+
10
+ module MusicBrainz
11
+ module Model
12
+
13
+ # A Collection is a list of models.
14
+ #
15
+ # A collection object may only store an extract of the complete data
16
+ # available on the server. This is especially the case if the limit or
17
+ # offset filter was used in the query. The collection object makes the
18
+ # total number of elements on the server and the current offset available
19
+ # with the +count+ respective the +offset+ parameter.
20
+ class Collection
21
+
22
+ include ::Enumerable
23
+
24
+ # Returns the total number of elements for that collection on the server.
25
+ attr_accessor :count
26
+
27
+ # Returns the position at which this collection starts. Used for paging
28
+ # through more than one page of results.
29
+ attr_accessor :offset
30
+
31
+ # Create a new collection object.
32
+ #
33
+ # The count and offset parameters should be set according to the values
34
+ # returned by the server.
35
+ def initialize(count=0, offset=0, array=nil)
36
+ @count = count.to_i
37
+ @offset = offset.to_i
38
+ if array
39
+ @entries = array.to_ary.dup
40
+ else
41
+ @entries = Array.new
42
+ end
43
+ end
44
+
45
+ # Add a new element to this collection.
46
+ def <<(entry)
47
+ @entries << entry
48
+ end
49
+
50
+ # Delete an element from the collection.
51
+ def delete(entry)
52
+ @entries.delete(entry)
53
+ end
54
+
55
+ # Iterate over the contents of the collection.
56
+ def each
57
+ @entries.each {|e| yield e}
58
+ end
59
+
60
+ # Access a random element in the collection by the element's index.
61
+ def [](index)
62
+ @entries[index]
63
+ end
64
+
65
+ # Set a random element in the collection by the element's index.
66
+ def []=(index, entry)
67
+ @entries[index] = entry
68
+ end
69
+
70
+ # Create a new collection containing the elements of both collections.
71
+ # Count and offset will be set to +nil+ in the new collection.
72
+ def +(other_collection)
73
+ new_collection = Collection.new
74
+ (self.to_a + other_collection.to_a).each do |entry|
75
+ new_collection << entry
76
+ end
77
+ return new_collection
78
+ end
79
+
80
+ # The number of elements in the collection.
81
+ def size
82
+ @entries.size
83
+ end
84
+
85
+ # Returns true, if the collection contains no elements.
86
+ def empty?
87
+ @entries.empty?
88
+ end
89
+
90
+ # Convert the collection into an Array.
91
+ def to_a
92
+ @entries.dup
93
+ end
94
+ alias to_ary to_a
95
+
96
+ def dup
97
+ Collection.new(self.count, self.offset, @entries)
98
+ end
99
+ end
100
+
101
+ end
102
+ end
@@ -0,0 +1,78 @@
1
+ # $Id: default_factory.rb 143 2007-07-18 11:40:55Z phw $
2
+ #
3
+ # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
+ # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
5
+ # License:: RBrainz is free software distributed under a BSD style license.
6
+ # See LICENSE[file:../LICENSE.html] for permissions.
7
+
8
+ require 'rbrainz/model/artist'
9
+ require 'rbrainz/model/label'
10
+ require 'rbrainz/model/release'
11
+ require 'rbrainz/model/track'
12
+ require 'rbrainz/model/user'
13
+
14
+ module MusicBrainz
15
+ module Model
16
+
17
+ # A factory to create model classes.
18
+ class DefaultFactory
19
+
20
+ # Creates a new entity for a given entity type (<tt>:artist</tt>,
21
+ # <tt>:label</tt>, <tt>:release</tt> or <tt>:track</tt>).
22
+ def new_entity(entity_type)
23
+ case entity_type
24
+ when :artist
25
+ new_artist
26
+ when :label
27
+ new_label
28
+ when :release
29
+ new_release
30
+ when :track
31
+ new_track
32
+ end
33
+ end
34
+
35
+ def new_artist
36
+ Artist.new
37
+ end
38
+
39
+ def new_label
40
+ Label.new
41
+ end
42
+
43
+ def new_release
44
+ Release.new
45
+ end
46
+
47
+ def new_track
48
+ Track.new
49
+ end
50
+
51
+ def new_alias
52
+ Alias.new
53
+ end
54
+
55
+ def new_disc
56
+ Disc.new
57
+ end
58
+
59
+ def new_relation
60
+ Relation.new
61
+ end
62
+
63
+ def new_release_event
64
+ ReleaseEvent.new
65
+ end
66
+
67
+ def new_tag
68
+ Tag.new
69
+ end
70
+
71
+ def new_user
72
+ User.new
73
+ end
74
+
75
+ end
76
+
77
+ end
78
+ end
@@ -1,14 +1,16 @@
1
- # $Id: disc.rb 15 2007-05-23 14:31:36Z phw $
2
- # Copyright (c) 2007, Philipp Wolfer
3
- # All rights reserved.
4
- # See LICENSE for permissions.
1
+ # $Id: disc.rb 141 2007-07-17 14:21:12Z phw $
2
+ #
3
+ # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
+ # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
5
+ # License:: RBrainz is free software distributed under a BSD style license.
6
+ # See LICENSE[file:../LICENSE.html] for permissions.
5
7
 
6
8
  module MusicBrainz
7
9
  module Model
8
10
 
9
11
  # Represents an audio CD.
10
12
  #
11
- # A disc has a disc id, which is calculated from the
13
+ # A disc has a disc ID, which is calculated from the
12
14
  # CD's table of contents (TOC). It also can include
13
15
  # the numbers of sectors on the CD.
14
16
  #
@@ -17,12 +19,47 @@ module MusicBrainz
17
19
  # id. See Webservice::ReleaseFilter for details on
18
20
  # this.
19
21
  #
20
- # See http://wiki.musicbrainz.org/DiscID.
22
+ # If you need to calculate disc IDs you should install the mb-discid
23
+ # package. It allows you to calculate the disc ID for an audio CD.
21
24
  #
22
- # TODO: Currently the calculation of a disc ID is not supported.
25
+ # Example:
26
+ # require 'rbrainz'
27
+ # require 'mb-discid'
28
+ #
29
+ # discid = MusicBrainz::DiscID.new
30
+ # discid.read
31
+ #
32
+ # disc = MusicBrainz::Model::Disc.new
33
+ # disc.id = discid
34
+ #
35
+ # See:: http://wiki.musicbrainz.org/DiscID for more information about
36
+ # MusicBrainz disc IDs.
37
+ # See:: http://rbrainz.rubyforge.org/mbdiscid/api/
23
38
  class Disc
24
39
 
25
- attr_accessor :id, :sectors
40
+ # Number of sectors on the disc
41
+ attr_accessor :sectors
42
+
43
+ # The MusicBrainz DiscID. A string containing a 28-character DiscID.
44
+ attr_reader :id
45
+
46
+ def initialize(id=nil)
47
+ self.id = id if id
48
+ end
49
+
50
+ # Set the MusicBrainz disc ID for this disc.
51
+ #
52
+ # The disc_id argument can be a string or a MusicBrainz::DiscID object.
53
+ def id=(disc_id)
54
+ @id = disc_id.to_s
55
+ end
56
+
57
+ # Convert the Disc into a string.
58
+ #
59
+ # Returns #id converted into a string.
60
+ def to_s
61
+ id.to_s
62
+ end
26
63
 
27
64
  end
28
65