rbrainz 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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