rbrainz 0.4.2 → 0.5.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 (118) hide show
  1. data/CHANGES +13 -1
  2. data/LICENSE +1 -1
  3. data/README +2 -2
  4. data/Rakefile +2 -2
  5. data/TODO +9 -2
  6. data/doc/README.rdoc +5 -5
  7. data/examples/getartist.rb +3 -2
  8. data/examples/getlabel.rb +3 -2
  9. data/examples/getrelease.rb +5 -2
  10. data/examples/getreleasegroup.rb +53 -0
  11. data/examples/gettrack.rb +3 -2
  12. data/examples/getuser.rb +2 -1
  13. data/examples/rate.rb +44 -0
  14. data/examples/searchartists.rb +3 -2
  15. data/examples/searchcdstubs.rb +41 -0
  16. data/examples/searchlabels.rb +3 -2
  17. data/examples/searchreleasegroups.rb +36 -0
  18. data/examples/searchreleases.rb +6 -4
  19. data/examples/searchtracks.rb +3 -2
  20. data/examples/submit_isrcs.rb +52 -0
  21. data/examples/tag.rb +3 -2
  22. data/lib/rbrainz.rb +2 -1
  23. data/lib/rbrainz/core_ext.rb +2 -1
  24. data/lib/rbrainz/core_ext/mbid.rb +2 -1
  25. data/lib/rbrainz/core_ext/net_http_digest.rb +3 -2
  26. data/lib/rbrainz/core_ext/range.rb +3 -2
  27. data/lib/rbrainz/core_ext/range/equality.rb +2 -1
  28. data/lib/rbrainz/data/countrynames.rb +6 -3
  29. data/lib/rbrainz/data/languagenames.rb +3 -2
  30. data/lib/rbrainz/data/releasetypenames.rb +3 -2
  31. data/lib/rbrainz/data/scriptnames.rb +3 -2
  32. data/lib/rbrainz/model.rb +3 -2
  33. data/lib/rbrainz/model/alias.rb +3 -2
  34. data/lib/rbrainz/model/artist.rb +11 -3
  35. data/lib/rbrainz/model/collection.rb +3 -2
  36. data/lib/rbrainz/model/default_factory.rb +18 -6
  37. data/lib/rbrainz/model/disc.rb +3 -2
  38. data/lib/rbrainz/model/entity.rb +2 -102
  39. data/lib/rbrainz/model/incomplete_date.rb +3 -2
  40. data/lib/rbrainz/model/individual.rb +11 -2
  41. data/lib/rbrainz/model/isrc.rb +100 -0
  42. data/lib/rbrainz/model/label.rb +5 -2
  43. data/lib/rbrainz/model/mbid.rb +28 -9
  44. data/lib/rbrainz/model/rateable.rb +34 -0
  45. data/lib/rbrainz/model/rating.rb +56 -0
  46. data/lib/rbrainz/model/relateable.rb +118 -0
  47. data/lib/rbrainz/model/relation.rb +2 -1
  48. data/lib/rbrainz/model/release.rb +17 -3
  49. data/lib/rbrainz/model/release_event.rb +3 -2
  50. data/lib/rbrainz/model/release_group.rb +97 -0
  51. data/lib/rbrainz/model/scored_collection.rb +3 -2
  52. data/lib/rbrainz/model/tag.rb +5 -4
  53. data/lib/rbrainz/model/taggable.rb +27 -0
  54. data/lib/rbrainz/model/track.rb +15 -2
  55. data/lib/rbrainz/model/user.rb +3 -2
  56. data/lib/rbrainz/utils.rb +2 -1
  57. data/lib/rbrainz/utils/data.rb +3 -2
  58. data/lib/rbrainz/utils/helper.rb +8 -2
  59. data/lib/rbrainz/version.rb +3 -2
  60. data/lib/rbrainz/webservice.rb +12 -7
  61. data/lib/rbrainz/webservice/filter.rb +53 -4
  62. data/lib/rbrainz/webservice/includes.rb +72 -11
  63. data/lib/rbrainz/webservice/mbxml.rb +129 -67
  64. data/lib/rbrainz/webservice/query.rb +156 -16
  65. data/lib/rbrainz/webservice/webservice.rb +104 -116
  66. data/test/lib/mock_webservice.rb +9 -2
  67. data/test/lib/test_entity.rb +2 -97
  68. data/test/lib/test_factory.rb +9 -1
  69. data/test/lib/test_rateable.rb +31 -0
  70. data/test/lib/test_relateable.rb +103 -0
  71. data/test/lib/test_taggable.rb +36 -0
  72. data/test/lib/testing_helper.rb +17 -2
  73. data/test/test-data/invalid/artist/ratings_1.xml +6 -0
  74. data/test/test-data/invalid/artist/ratings_2.xml +6 -0
  75. data/test/test-data/valid/artist/Tchaikovsky-2.xml +6 -0
  76. data/test/test-data/valid/label/Atlantic_Records_3.xml +6 -0
  77. data/test/test-data/valid/release-group/The_Cure_1.xml +36 -0
  78. data/test/test-data/valid/release/Highway_61_Revisited_2.xml +6 -0
  79. data/test/test-data/valid/track/Silent_All_These_Years_4.xml +3 -0
  80. data/test/test-data/valid/track/Silent_All_These_Years_6.xml +8 -0
  81. data/test/test_alias.rb +2 -1
  82. data/test/test_artist.rb +24 -2
  83. data/test/test_artist_filter.rb +2 -1
  84. data/test/test_artist_includes.rb +13 -3
  85. data/test/test_collection.rb +3 -2
  86. data/test/test_default_factory.rb +8 -1
  87. data/test/test_disc.rb +2 -1
  88. data/test/test_incomplete_date.rb +2 -1
  89. data/test/test_isrc.rb +87 -0
  90. data/test/test_label.rb +8 -1
  91. data/test/test_label_filter.rb +2 -1
  92. data/test/test_label_includes.rb +10 -3
  93. data/test/test_mbid.rb +2 -1
  94. data/test/test_mbxml.rb +93 -2
  95. data/test/test_query.rb +68 -5
  96. data/test/test_range_equality.rb +2 -1
  97. data/test/test_rating.rb +46 -0
  98. data/test/test_relation.rb +2 -1
  99. data/test/test_release.rb +37 -2
  100. data/test/test_release_event.rb +2 -1
  101. data/test/test_release_filter.rb +15 -2
  102. data/test/test_release_group.rb +104 -0
  103. data/test/test_release_group_filter.rb +61 -0
  104. data/test/test_release_group_includes.rb +46 -0
  105. data/test/test_release_includes.rb +16 -3
  106. data/test/test_scored_collection.rb +3 -2
  107. data/test/test_tag.rb +2 -1
  108. data/test/test_track.rb +28 -1
  109. data/test/test_track_filter.rb +2 -1
  110. data/test/test_track_includes.rb +13 -3
  111. data/test/test_utils.rb +2 -1
  112. data/test/test_webservice.rb +11 -1
  113. metadata +38 -20
  114. data/debian/changelog +0 -11
  115. data/debian/compat +0 -1
  116. data/debian/control +0 -13
  117. data/debian/copyright +0 -25
  118. data/debian/rules +0 -48
@@ -1,4 +1,5 @@
1
- # $Id: incomplete_date.rb 154 2007-07-24 12:39:02Z phw $
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: incomplete_date.rb 254 2009-05-13 20:04:36Z phw $
2
3
  #
3
4
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
5
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -93,4 +94,4 @@ module MusicBrainz
93
94
  end
94
95
 
95
96
  end
96
- end
97
+ end
@@ -1,4 +1,5 @@
1
- # $Id: individual.rb 151 2007-07-24 08:36:27Z phw $
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: individual.rb 254 2009-05-13 20:04:36Z phw $
2
3
  #
3
4
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
5
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -6,7 +7,11 @@
6
7
  # See LICENSE[file:../LICENSE.html] for permissions.
7
8
 
8
9
  require 'rbrainz/model/entity'
10
+ require 'rbrainz/model/alias'
9
11
  require 'rbrainz/model/incomplete_date'
12
+ require 'rbrainz/model/rateable'
13
+ require 'rbrainz/model/relateable'
14
+ require 'rbrainz/model/taggable'
10
15
 
11
16
  module MusicBrainz
12
17
  module Model
@@ -16,6 +21,10 @@ module MusicBrainz
16
21
  # Aggregates the common attributes of artists and labels.
17
22
  class Individual < Entity
18
23
 
24
+ include Rateable
25
+ include Relateable
26
+ include Taggable
27
+
19
28
  # The name of the artist or label.
20
29
  attr_accessor :name
21
30
 
@@ -100,4 +109,4 @@ module MusicBrainz
100
109
  end
101
110
 
102
111
  end
103
- end
112
+ end
@@ -0,0 +1,100 @@
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: isrc.rb 263 2009-05-24 22:15:12Z phw $
3
+ #
4
+ # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
5
+ # Copyright:: Copyright (c) 2009, Philipp Wolfer
6
+ # License:: RBrainz is free software distributed under a BSD style license.
7
+ # See LICENSE[file:../LICENSE.html] for permissions.
8
+
9
+ module MusicBrainz
10
+ module Model
11
+
12
+ # The format of a ISRC was wrong.
13
+ #
14
+ # See:: ISRC
15
+ class InvalidISRCError < Exception
16
+ end
17
+
18
+ #
19
+ # Represents an International Standard Recording Code (ISRC).
20
+ #
21
+ # The International Standard Recording Code or short ISRC is an identification
22
+ # system for audio and music video recordings. It is standarized by the IFPI
23
+ # in ISO 3901:2001 and used by IFPI members to assign unique identifiers to
24
+ # every distinct recording they release.
25
+ #
26
+ # See:: http://wiki.musicbrainz.org/ISRC
27
+ class ISRC
28
+
29
+ ISRC_PATTERN = /^([0-9A-Z]{2})-?([0-9A-Z]{3})-?([0-9A-Z]{2})-?([0-9A-Z]{5})$/i
30
+
31
+ # 2-letter country code according to the ISO 3166-1-Alpha-2 standard.
32
+ attr_reader :country
33
+
34
+ # The Registrant Code identifies the entity assigning the Designation Code in an ISRC.
35
+ attr_reader :registrant
36
+
37
+ # Year of reference (2 digits).
38
+ attr_reader :year
39
+
40
+ # Designation code (5 digits)
41
+ attr_reader :designation
42
+
43
+ # Tries to convert _obj_ into an ISRC object.
44
+ #
45
+ # If _obj_ is an ISRC it is returned. Otherwise a new ISRC object
46
+ # is created by converting _obj_ into a string and parsing it.
47
+ #
48
+ # Raises:: InvalidISRCError
49
+ def self.parse(obj)
50
+ if obj.is_a? ISRC
51
+ return obj
52
+ else
53
+ return ISRC.new(obj)
54
+ end
55
+ end
56
+
57
+ # Create a new ISRC object from the given string.
58
+ #
59
+ # Raises:: InvalidISRCError
60
+ def initialize(isrc)
61
+ unless isrc.to_s =~ ISRC_PATTERN
62
+ raise InvalidISRCError
63
+ end
64
+ @country = $1.upcase
65
+ @registrant = $2.upcase
66
+ @year = $3.upcase
67
+ @designation = $4.upcase
68
+ end
69
+
70
+ # Convert this ISRC into a String.
71
+ # Will return the readable version of the ISRC with dashes added,
72
+ # e.g. FR-Z03-91-01231
73
+ def to_s
74
+ return [@country, @registrant, @year, @designation].join('-')
75
+ end
76
+
77
+ # Convert this ISRC into a String.
78
+ # Will return the 12 character representation of the ISRC without dashes,
79
+ # e.g. FRZ039101231
80
+ def to_str
81
+ return [@country, @registrant, @year, @designation].join
82
+ end
83
+
84
+ # Compares this ISRC with another one.
85
+ #
86
+ # If _other_ is not of the type ISRC an attempt is made to convert it into one.
87
+ # This may cause an InvalidISRCError to be raised. Please note that
88
+ # comparing an ISRC with a different type of object is usually
89
+ # not commutative.
90
+ #
91
+ # Raises:: InvalidISRCError
92
+ def eql?(other)
93
+ self.to_s == ISRC.parse(other).to_s
94
+ end
95
+ alias :== eql?
96
+
97
+ end
98
+
99
+ end
100
+ end
@@ -1,4 +1,5 @@
1
- # $Id: label.rb 141 2007-07-17 14:21:12Z phw $
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: label.rb 254 2009-05-13 20:04:36Z phw $
2
3
  #
3
4
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
5
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -26,6 +27,8 @@ module MusicBrainz
26
27
  # See:: http://musicbrainz.org/doc/Label.
27
28
  class Label < Individual
28
29
 
30
+ include Taggable
31
+
29
32
  # Used if the type of the label is unknown.
30
33
  TYPE_UNKNOWN = NS_MMD_1 + 'Unknown'
31
34
  # Companies mainly distributing other labels production,
@@ -62,4 +65,4 @@ module MusicBrainz
62
65
  end
63
66
 
64
67
  end
65
- end
68
+ end
@@ -1,4 +1,5 @@
1
- # $Id: mbid.rb 146 2007-07-19 16:33:38Z phw $
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: mbid.rb 254 2009-05-13 20:04:36Z phw $
2
3
  #
3
4
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
5
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -44,8 +45,8 @@ module MusicBrainz
44
45
  # See:: http://musicbrainz.org/doc/MusicBrainzIdentifier
45
46
  class MBID
46
47
 
47
- # The entity type (<tt>:artist</tt>, <tt>:label</tt>, <tt>:release</tt>,
48
- # <tt>:track</tt>) this MBID references.
48
+ # The entity type (<tt>:artist</tt>, <tt>:label</tt>, <tt>:release_group</tt>,
49
+ # <tt>:release</tt>, <tt>:track</tt>) this MBID references.
49
50
  attr_reader :entity
50
51
 
51
52
  # The UUID of the referenced entity.
@@ -53,7 +54,7 @@ module MusicBrainz
53
54
 
54
55
  module PATTERN #:nodoc:
55
56
  UUID = '([a-fA-F0-9]{8}(:?-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12})'
56
- ENTITY_TYPE = '(artist|release|track|label)'
57
+ ENTITY_TYPE = '(artist|release-group|release|track|label)'
57
58
  ENTITY_URI = "http://musicbrainz\\.org/#{ENTITY_TYPE}/#{UUID}"
58
59
  end
59
60
 
@@ -74,6 +75,9 @@ module MusicBrainz
74
75
  #
75
76
  # See:: new
76
77
  # See:: String#to_mbid, URI::HTTP#to_mbid
78
+ #
79
+ # Raises:: UnknownEntityError, EntityTypeNotMatchingError,
80
+ # InvalidMBIDError
77
81
  def self.parse(str, entity_type=nil)
78
82
  if str.respond_to? :to_mbid
79
83
  str.to_mbid(entity_type)
@@ -86,7 +90,8 @@ module MusicBrainz
86
90
  #
87
91
  # _str_ can be either a complete identifier or just the UUID part of it.
88
92
  # In the latter case the entity type (<tt>:artist</tt>, <tt>:label</tt>,
89
- # <tt>:release</tt> or <tt>:track</tt>) has to be specified as well.
93
+ # <tt>:release_group</tt>, <tt>:release</tt> or <tt>:track</tt>) has to be
94
+ # specified as well.
90
95
  #
91
96
  # Examples:
92
97
  # require 'rbrainz'
@@ -98,13 +103,13 @@ module MusicBrainz
98
103
  # InvalidMBIDError
99
104
  def initialize(str, entity_type=nil)
100
105
  str = str.to_s if str.respond_to? :to_s
101
- if entity_type && !(entity_type.to_s =~ ENTITY_TYPE_REGEXP )
106
+ unless is_valid_entity_type_or_nil(entity_type)
102
107
  raise UnknownEntityError, entity_type
103
108
  end
104
- entity_type = entity_type.to_sym if entity_type.respond_to? :to_sym
109
+ entity_type = entity_type_to_symbol(entity_type)
105
110
 
106
111
  if str =~ ENTITY_URI_REGEXP
107
- @entity = $1.to_sym
112
+ @entity = entity_type_to_symbol($1)
108
113
  @uuid = $2.downcase
109
114
  unless entity_type.nil? || @entity == entity_type
110
115
  raise EntityTypeNotMatchingError, "#{@entity}, #{entity_type}"
@@ -135,7 +140,7 @@ module MusicBrainz
135
140
 
136
141
  # Returns the string representation of the MBID (that is the complete URI).
137
142
  def to_s
138
- ENTITY_URI % [entity.to_s, uuid]
143
+ ENTITY_URI % [Utils.entity_type_to_string(entity), uuid]
139
144
  end
140
145
 
141
146
  # Compares this MBID with another one.
@@ -147,6 +152,20 @@ module MusicBrainz
147
152
  self.entity == other.entity and self.uuid == other.uuid
148
153
  end
149
154
 
155
+ private
156
+
157
+ def is_valid_entity_type_or_nil(entity_type)
158
+ return entity_type.nil? || Utils.entity_type_to_string(entity_type) =~ ENTITY_TYPE_REGEXP
159
+ end
160
+
161
+ def entity_type_to_symbol(entity_type)
162
+ unless entity_type.respond_to? :to_sym
163
+ return entity_type
164
+ end
165
+ entity_type = entity_type.to_sym
166
+ return entity_type.to_s.sub('-', '_').to_sym
167
+ end
168
+
150
169
  end
151
170
 
152
171
  end
@@ -0,0 +1,34 @@
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: rateable.rb 266 2009-05-24 22:15:22Z phw $
3
+ #
4
+ # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
5
+ # Copyright:: Copyright (c) 2009, Philipp Wolfer
6
+ # License:: RBrainz is free software distributed under a BSD style license.
7
+ # See LICENSE[file:../LICENSE.html] for permissions.
8
+
9
+ require 'rbrainz/model/rating'
10
+
11
+ module MusicBrainz
12
+ module Model
13
+
14
+ # Mixin module to add rating capabilities to Entity classes.
15
+ #
16
+ # see:: Rating
17
+ module Rateable
18
+
19
+ # The community Rating from MusicBrainz.
20
+ def rating
21
+ @rating ||= Rating.new
22
+ end
23
+ attr_writer :rating
24
+
25
+ # The user Rating from MusicBrainz.
26
+ def user_rating
27
+ @user_rating ||= Rating.new
28
+ end
29
+ attr_writer :user_rating
30
+
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,56 @@
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: rating.rb 273 2009-05-24 22:29:04Z phw $
3
+ #
4
+ # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
5
+ # Copyright:: Copyright (c) 2008 Philipp Wolfer
6
+ # License:: RBrainz is free software distributed under a BSD style license.
7
+ # See LICENSE[file:../LICENSE.html] for permissions.
8
+
9
+ module MusicBrainz
10
+ module Model
11
+
12
+ #
13
+ # Represents a rating of an entity.
14
+ #
15
+ # MusicBrainz allows it's users to rate artists, labels, releases and tracks.
16
+ # Each user rating will be a Float between 1 and 5 or nil, where nil means no rating.
17
+ # The system will aggregate user ratings to compute the average community rating.
18
+ #
19
+ # See:: http://wiki.musicbrainz.org/RatingSystem
20
+ class Rating
21
+ # The rating (an Float between 1 and 5).
22
+ # If :count is greater than 1 this will be the average rating.
23
+ attr_accessor :value
24
+
25
+ # The rating count indicating how often entity was rated.
26
+ attr_accessor :count
27
+
28
+ def initialize(value=nil, count=nil)
29
+ @value = value.nil? ? nil : value.to_f
30
+ @count = count.nil? ? nil : count.to_i
31
+ end
32
+
33
+ # Convert this rating into a String. Will return rating.
34
+ def to_s
35
+ return value.to_s
36
+ end
37
+
38
+ # Convert this rating into an Integer. Will return rating.
39
+ def to_i
40
+ return value.to_i
41
+ end
42
+
43
+ # Convert this rating into a Float. Will return rating.
44
+ def to_f
45
+ return value.to_f
46
+ end
47
+
48
+ # Tests if this rating is empty
49
+ def empty?
50
+ return value.nil?
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,118 @@
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: relateable.rb 266 2009-05-24 22:15:22Z phw $
3
+ #
4
+ # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
5
+ # Copyright:: Copyright (c) 2009, Philipp Wolfer
6
+ # License:: RBrainz is free software distributed under a BSD style license.
7
+ # See LICENSE[file:../LICENSE.html] for permissions.
8
+
9
+ require 'rbrainz/model/relation'
10
+ require 'rbrainz/model/collection'
11
+
12
+ module MusicBrainz
13
+ module Model
14
+
15
+ # Mixin module to add add advanced relationship capabilities to Entity classes.
16
+ #
17
+ # see:: Relation
18
+ module Relateable
19
+
20
+ #
21
+ # Adds a Relation.
22
+ #
23
+ # This method adds _relation_ to the list of relations. The
24
+ # given relation has to be initialized, at least the target
25
+ # type has to be set.
26
+ #
27
+ def add_relation(relation)
28
+ relations[relation.target_type] << relation
29
+ end
30
+
31
+ #
32
+ # Returns a list of Relation objects.
33
+ #
34
+ # If _target_type_ is given, only relations of that target
35
+ # type are returned. For MusicBrainz, the following target
36
+ # types are defined:
37
+ # - Relation::TO_ARTIST
38
+ # - Relation::TO_RELEASE
39
+ # - Relation::TO_TRACK
40
+ # - Relation::TO_URL
41
+ #
42
+ # If _target_type_ is Relation::TO_ARTIST, for example,
43
+ # this method returns all relations between this Entity and
44
+ # artists.
45
+ #
46
+ # You may use the _relation_type_ parameter to further restrict
47
+ # the selection. If it is set, only relations with the given
48
+ # relation type are returned. The _required_attributes_ sequence
49
+ # lists attributes that have to be part of all returned relations.
50
+ #
51
+ # If _direction_ is set, only relations with the given reading
52
+ # direction are returned. You can use the Relation::DIR_FORWARD,
53
+ # Relation::DIR_BACKWARD, and Relation::DIR_BOTH constants
54
+ # for this.
55
+ #
56
+ def get_relations(options = {:target_type => nil, :relation_type => nil,
57
+ :required_attributes => [], :direction => nil})
58
+ Utils.check_options options,
59
+ :target_type, :relation_type, :required_attributes, :direction
60
+
61
+ target_type = Utils.add_namespace(options[:target_type], NS_REL_1)
62
+ relation_type = Utils.add_namespace(options[:relation_type], NS_REL_1)
63
+ required_attributes =
64
+ options[:required_attributes] ? options[:required_attributes] : []
65
+ direction = options[:direction]
66
+
67
+ # Select all relevant relations depending on the requested target type
68
+ if target_type
69
+ result = relations[target_type].to_a
70
+ else
71
+ result = relations.values.flatten
72
+ end
73
+
74
+ # Filter for direction
75
+ result = result.find_all { |r| r.direction == direction } if direction
76
+
77
+ # Filter for relation type
78
+ result = result.find_all{ |r| r.type == relation_type } if relation_type
79
+
80
+ # Filter for attributes
81
+ required = required_attributes.map{|a| Utils.add_namespace(a, NS_REL_1)}.to_set
82
+ result.find_all do |r|
83
+ required.subset?( r.attributes.to_set )
84
+ end
85
+ end
86
+
87
+ #
88
+ # Returns a list of target types available for this entity.
89
+ #
90
+ # Use this to find out to which types of targets this entity
91
+ # has relations. If the entity only has relations to tracks and
92
+ # artists, for example, then a list containg the strings
93
+ # Relation::TO_TRACK and Relation::TO_ARTIST is returned.
94
+ #
95
+ def relation_target_types
96
+ result = []
97
+ relations.each_pair {|type, relations|
98
+ result << type unless relations.empty?
99
+ }
100
+ return result
101
+ end
102
+
103
+ private #-----------------------------------------------------------------
104
+
105
+ def relations
106
+ @relations ||= {
107
+ Relation::TO_ARTIST => Collection.new,
108
+ Relation::TO_RELEASE => Collection.new,
109
+ Relation::TO_TRACK => Collection.new,
110
+ Relation::TO_LABEL => Collection.new,
111
+ Relation::TO_URL => Collection.new,
112
+ }
113
+ end
114
+
115
+ end
116
+
117
+ end
118
+ end