rbrainz 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- # $Id: tag.rb 145 2007-07-19 13:11:44Z phw $
1
+ # $Id: tag.rb 181 2007-10-04 09:20:49Z phw $
2
2
  #
3
3
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -13,8 +13,7 @@ module MusicBrainz
13
13
  #
14
14
  # Tags are arbitrary labels assigned to entities by the users of MusicBrainz.
15
15
  #
16
- # Note:: Tagging is not supported by the current MusicBrainz server but will
17
- # be added in the near future.
16
+ # See:: http://wiki.musicbrainz.org/FolksonomyTagging
18
17
  class Tag
19
18
  # The tag text.
20
19
  attr_accessor :text
@@ -1,4 +1,4 @@
1
- # $Id: helper.rb 158 2007-07-25 16:19:19Z phw $
1
+ # $Id: helper.rb 173 2007-08-24 15:11:11Z phw $
2
2
  #
3
3
  # Author:: Nigel Graham, Philipp Wolfer
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -25,7 +25,7 @@ module MusicBrainz
25
25
  # includes the namespace or if _str_ is empty it will be returned unchanged.
26
26
  def add_namespace(str, namespace=Model::NS_MMD_1)
27
27
  unless str =~ /^#{namespace}/ or str.to_s.empty?
28
- return namespace + str
28
+ return namespace + str.to_s
29
29
  else
30
30
  return str
31
31
  end
@@ -1,4 +1,4 @@
1
- # $Id: version.rb 164 2007-08-07 07:40:32Z phw $
1
+ # $Id: version.rb 172 2007-08-24 11:19:19Z 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.3.0'
13
+ RBRAINZ_VERSION = '0.4.0'
14
14
 
15
15
  end
@@ -1,4 +1,4 @@
1
- # $Id: filter.rb 159 2007-07-25 16:53:32Z phw $
1
+ # $Id: filter.rb 166 2007-08-10 08:56:09Z phw $
2
2
  #
3
3
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -50,7 +50,7 @@ module MusicBrainz
50
50
  class ArtistFilter < AbstractFilter
51
51
 
52
52
  # The parameter _filter_ is a hash with filter options. At least the
53
- # <tt>:name</tt> filter must be specified.
53
+ # <tt>:name</tt> or <tt>:query</tt> filter must be specified.
54
54
  #
55
55
  # Available filter options:
56
56
  # [:name] Fetch a list of artists with a matching name.
@@ -131,7 +131,7 @@ module MusicBrainz
131
131
  class TrackFilter < AbstractFilter
132
132
 
133
133
  # The parameter _filter_ is a hash with filter options. At least the
134
- # <tt>:title</tt> filter must be specified.
134
+ # <tt>:title</tt>, <tt>:puid</tt> or <tt>:query</tt> filter must be specified.
135
135
  #
136
136
  # Available filter options:
137
137
  # [:title] Fetch a list of tracks with a matching title.
@@ -182,7 +182,7 @@ module MusicBrainz
182
182
  class LabelFilter < AbstractFilter
183
183
 
184
184
  # The parameter _filter_ is a hash with filter options. At least the
185
- # <tt>:name</tt> filter must be specified.
185
+ # <tt>:name</tt> or <tt>:query</tt> filter must be specified.
186
186
  #
187
187
  # Available filter options:
188
188
  # [:name] Fetch a list of labels with a matching name.
@@ -1,4 +1,4 @@
1
- # $Id: mbxml.rb 158 2007-07-25 16:19:19Z phw $
1
+ # $Id: mbxml.rb 189 2007-11-26 00:10:49Z phw $
2
2
  #
3
3
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -72,10 +72,11 @@ module MusicBrainz
72
72
  end
73
73
 
74
74
  # Read the XML string and create a list of entity models for the given
75
- # entity type. There must be an entity-list element as a child of the
76
- # +metadata+ element in the document.
75
+ # entity type. The list is returned as a Model::ScoredCollection. There
76
+ # must be an entity-list element as a child of the +metadata+ element in
77
+ # the document.
77
78
  #
78
- # Returns an empty ScoredCollection if the list is empty or if no
79
+ # Returns an empty Model::ScoredCollection if the list is empty or if no
79
80
  # entity-list element can be found.
80
81
  def get_entity_list(entity_type, ns=Model::NS_MMD_1)
81
82
  # Search for the first occuring node of type entity which is a child node
@@ -347,8 +348,8 @@ module MusicBrainz
347
348
  # Iterate over a list of tags and add them to the target collection.
348
349
  #
349
350
  # The node must be of the type <em>tag-list</em>.
350
- def read_tag_list(list_node, target_collection)
351
- read_list(list_node, target_collection, 'tag') do |a|
351
+ def read_tag_list(list_node, target_collection, read_scores=false)
352
+ read_list(list_node, target_collection, 'tag', read_scores) do |a|
352
353
  yield a if block_given?
353
354
  end
354
355
  end
@@ -380,6 +381,7 @@ module MusicBrainz
380
381
  event.catalog_number = node.attributes['catalog-number']
381
382
  event.barcode = node.attributes['barcode']
382
383
  event.label = create_label(node.elements['label']) if node.elements['label']
384
+ event.format = Utils.add_namespace(node.attributes['format'])
383
385
 
384
386
  return event
385
387
  end
@@ -432,6 +434,8 @@ module MusicBrainz
432
434
  # Read all defined data fields
433
435
  if node.attributes['direction']
434
436
  relation.direction = node.attributes['direction'].to_sym
437
+ else
438
+ relation.direction = :both
435
439
  end
436
440
 
437
441
  if node.attributes['type']
@@ -1,4 +1,4 @@
1
- # $Id: query.rb 147 2007-07-19 17:10:26Z phw $
1
+ # $Id: query.rb 174 2007-08-24 15:23:56Z phw $
2
2
  #
3
3
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -294,24 +294,101 @@ module MusicBrainz
294
294
 
295
295
  # Submit track to PUID mappings.
296
296
  #
297
- # The <em>tracks2puids</em> parameter has to be a dictionary, with the
298
- # keys being MusicBrainz track IDs (either as absolute URIs or
299
- # in their 36 character ASCII representation) and the values
300
- # being PUIDs (ASCII, 36 characters).
297
+ # The <em>tracks2puids</em> parameter has to be a Hash or Array
298
+ # with track ID/PUID pairs. The track IDs are either instances of MBID,
299
+ # absolute URIs or the 36 character ASCII representation. PUIDs are
300
+ # 36 characters ASCII strings.
301
+ #
302
+ # Example:
303
+ # ws = Webservice::Webservice.new(
304
+ # :host => 'test.musicbrainz.org',
305
+ # :username => 'outsidecontext',
306
+ # :password => 'secret'
307
+ # )
308
+ #
309
+ # query = Webservice::Query.new(ws, :client_id=>'My Tagging App 1.0')
310
+ #
311
+ # query.submit_puids([
312
+ # ['90a56b15-4259-4a33-be13-20d5513504d5', '09ff336b-79e7-1303-f613-7f1cd0d5a346'],
313
+ # ['90a56b15-4259-4a33-be13-20d5513504d5', '18fd245f-bc0c-3361-9d61-61a225ed8c79'],
314
+ # ['6d9276af-b990-41b6-ad14-de2f128437ea', '3b633298-e671-957a-1f74-83fe71969ad0']
315
+ # ])
301
316
  #
302
317
  # Note that this method only works if a valid user name and
303
318
  # password have been set. If username and/or password are incorrect,
304
319
  # an AuthenticationError is raised. See the example in Query on
305
320
  # how to supply authentication data.
306
321
  #
322
+ # See:: http://test.musicbrainz.org/doc/PUID
307
323
  # Raises:: ConnectionError, RequestError, AuthenticationError
308
324
  def submit_puids(tracks2puids)
309
325
  raise RequestError, 'Please supply a client ID' unless @client_id
310
326
  params = [['client', @client_id.to_s]] # Encoded as utf-8
311
327
 
312
- tracks2puids.each {|track_id, puid| params << ['puid', track_id + ' ' + puid ]}
328
+ tracks2puids.each do |track_id, puid|
329
+ track_id = Model::MBID.parse(track_id, :track).uuid
330
+ params << ['puid', track_id + ' ' + puid ]
331
+ end
313
332
 
314
- @webservice.post('track', :querystring=>params)
333
+ @webservice.post(:track, :params=>params)
334
+ end
335
+
336
+ # Submit tags for an entity. _mbid_ must be an instance of MBID identifying
337
+ # the entity the tag should applied to and _tags_ is either and array or
338
+ # Collection of Tag objects or a string with comma separated tags.
339
+ #
340
+ # Note that this method only works if a valid user name and password have
341
+ # been set. The tags will be applied for the authenticated user. If
342
+ # username and/or password are incorrect, an AuthenticationError is raised.
343
+ # See the example in Query on how to supply authentication data.
344
+ #
345
+ # Example:
346
+ # ws = Webservice::Webservice.new(
347
+ # :host => 'test.musicbrainz.org',
348
+ # :username => 'outsidecontext',
349
+ # :password => 'secret'
350
+ # )
351
+ #
352
+ # query = Webservice::Query.new(ws)
353
+ #
354
+ # mbid = Model::MBID.new('http://musicbrainz.org/artist/10bf95b6-30e3-44f1-817f-45762cdc0de0')
355
+ # query.set_tags(mbid, 'doom metal, british')
356
+ #
357
+ # See:: Model::Tag
358
+ # Raises:: ConnectionError, RequestError, AuthenticationError
359
+ def submit_user_tags(mbid, tags)
360
+ mbid = Model::MBID.parse(mbid)
361
+ tag_string = tags.respond_to?(:to_ary) ? tags.to_ary.join(',') : tags.to_s
362
+ params = {:entity=>mbid.entity, :id=>mbid.uuid, :tags=>tag_string}
363
+ @webservice.post(:tag, :params=>params)
364
+ end
365
+
366
+ # Returns a Model::Collection of tags a user has applied to the entity
367
+ # identified by _mbid_.
368
+ #
369
+ # Note that this method only works if a valid user name and password have
370
+ # been set. Only the tags the authenticated user apllied to the entity will
371
+ # be returned. If username and/or password are incorrect, an
372
+ # AuthenticationError is raised. See the example in Query on how to supply
373
+ # authentication data.
374
+ #
375
+ # Example:
376
+ # ws = Webservice::Webservice.new(
377
+ # :host => 'test.musicbrainz.org',
378
+ # :username => 'outsidecontext',
379
+ # :password => 'secret'
380
+ # )
381
+ #
382
+ # query = Webservice::Query.new(ws)
383
+ #
384
+ # mbid = Model::MBID.new('http://musicbrainz.org/artist/10bf95b6-30e3-44f1-817f-45762cdc0de0')
385
+ # query.get_tags(mbid)
386
+ #
387
+ # See:: Model::Tag
388
+ # Raises:: ConnectionError, RequestError, ResponseError, AuthenticationError
389
+ def get_user_tags(mbid)
390
+ mbid = Model::MBID.parse(mbid)
391
+ return get_entities(:tag, "entity=#{mbid.entity}&id=#{mbid.uuid}").to_collection
315
392
  end
316
393
 
317
394
  private # ----------------------------------------------------------------
@@ -1,4 +1,4 @@
1
- # $Id: webservice.rb 148 2007-07-19 17:26:33Z phw $
1
+ # $Id: webservice.rb 182 2007-10-16 14:46:17Z nigel_graham $
2
2
  #
3
3
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -40,9 +40,9 @@ module MusicBrainz
40
40
  #
41
41
  # Options:
42
42
  # [:id] A MBID if querying for a single ressource.
43
- # [:querystring] A string containing the data to post.
43
+ # [:params] A Hash or Array containing the data to post as key/value pairs.
44
44
  # [:version] The version of the webservice to use. Defaults to 1.
45
- def post(entity_type, options={ :id=>nil, :querystring=>[], :version=>1 })
45
+ def post(entity_type, options={ :id=>nil, :params=>[], :version=>1 })
46
46
  raise NotImplementedError.new('Called abstract method.')
47
47
  end
48
48
 
@@ -71,17 +71,26 @@ module MusicBrainz
71
71
  # the server. Defaults to '/ws'.
72
72
  # [:username] The username to authenticate with.
73
73
  # [:password] The password to authenticate with.
74
- # [:user_agent] Value sent in the User-Agent HTTP header. Defaults to 'rbrainz/0.2'
75
- def initialize(options={ :host=>nil, :port=>nil, :path_prefix=>'/ws', :username=>nil, :password=>nil, :user_agent=>'rbrainz/0.2' })
76
- Utils.check_options options, :host, :port, :path_prefix, :username, :password, :user_agent
74
+ # [:user_agent] Value sent in the User-Agent HTTP header. Defaults to "rbrainz/#{RBRAINZ_VERSION}"
75
+ # [:proxy] URL for the proxy server to connect through
76
+ def initialize(options={ :host=>nil, :port=>nil, :path_prefix=>'/ws', :username=>nil, :password=>nil, :user_agent=>"rbrainz/#{RBRAINZ_VERSION}", :proxy=>nil })
77
+ Utils.check_options options, :host, :port, :path_prefix, :username, :password, :user_agent, :proxy
77
78
  @host = options[:host] ? options[:host] : 'musicbrainz.org'
78
79
  @port = options[:port] ? options[:port] : 80
79
80
  @path_prefix = options[:path_prefix] ? options[:path_prefix] : '/ws'
80
81
  @username = options[:username]
81
82
  @password = options[:password]
82
- @user_agent = options[:user_agent] ? options[:user_agent] : 'rbrainz/0.2'
83
+ @user_agent = options[:user_agent] ? options[:user_agent] : "rbrainz/#{RBRAINZ_VERSION}"
83
84
  @open_timeout = nil
84
85
  @read_timeout = nil
86
+ @proxy = {}
87
+ unless options[:proxy].nil?
88
+ uri = URI.parse( options[:proxy] )
89
+ @proxy[:host], @proxy[:port] = uri.host, uri.port
90
+ if uri.userinfo
91
+ @proxy[:username], @proxy[:password] = uri.userinfo.split(/:/)
92
+ end
93
+ end
85
94
  end
86
95
 
87
96
  # Query the Webservice with HTTP GET.
@@ -102,7 +111,7 @@ module MusicBrainz
102
111
  url = URI.parse(create_uri(entity_type, options))
103
112
  request = Net::HTTP::Get.new(url.request_uri)
104
113
  request['User-Agent'] = @user_agent
105
- connection = Net::HTTP.new(url.host, url.port)
114
+ connection = Net::HTTP.new(url.host, url.port, @proxy[:host], @proxy[:port])
106
115
 
107
116
  # Set timeouts
108
117
  connection.open_timeout = @open_timeout if @open_timeout
@@ -112,10 +121,18 @@ module MusicBrainz
112
121
  begin
113
122
  response = connection.start do |http|
114
123
  response = http.request(request)
124
+ if response.is_a?(Net::HTTPProxyAuthenticationRequired) && @proxy[:user] && @proxy[:password]
125
+ request = Net::HTTP::Post.new(url.request_uri)
126
+ request['User-Agent'] = @user_agent
127
+ request.proxy_select_auth( @username, @password, response)
128
+ request.set_form_data(options[:params])
129
+ response = http.request(request)
130
+ end
131
+
115
132
  if response.is_a?(Net::HTTPUnauthorized) && @username && @password
116
133
  request = Net::HTTP::Get.new(url.request_uri)
117
134
  request['User-Agent'] = @user_agent
118
- request.digest_auth @username, @password, response
135
+ request.select_auth @username, @password, response
119
136
  response = http.request(request)
120
137
  end
121
138
  response
@@ -149,20 +166,20 @@ module MusicBrainz
149
166
  #
150
167
  # Options:
151
168
  # [:id] A MBID if querying for a single ressource.
152
- # [:querystring] A string containing the data to post.
169
+ # [:params] A Hash or Array containing the data to post as key/value pairs.
153
170
  # [:version] The version of the webservice to use. Defaults to 1.
154
171
  #
155
172
  # Raises:: ConnectionError, RequestError, AuthenticationError,
156
173
  # ResourceNotFoundError
157
174
  #
158
175
  # See:: IWebservice#post
159
- def post(entity_type, options={:id=>nil, :querystring=>[], :version=>1})
160
- Utils.check_options options, :id, :querystring, :version
176
+ def post(entity_type, options={ :id=>nil, :params=>[], :version=>1 })
177
+ Utils.check_options options, :id, :params, :version
161
178
  url = URI.parse(create_uri(entity_type, options))
162
179
  request = Net::HTTP::Post.new(url.request_uri)
163
180
  request['User-Agent'] = @user_agent
164
- request.set_form_data(options[:querystring])
165
- connection = Net::HTTP.new(url.host, url.port)
181
+ request.set_form_data(options[:params])
182
+ connection = Net::HTTP.new(url.host, url.port, @proxy[:host], @proxy[:port])
166
183
 
167
184
  # Set timeouts
168
185
  connection.open_timeout = @open_timeout if @open_timeout
@@ -173,11 +190,18 @@ module MusicBrainz
173
190
  response = connection.start do |http|
174
191
  response = http.request(request)
175
192
 
193
+ if response.is_a?(Net::HTTPProxyAuthenticationRequired) && @proxy[:user] && @proxy[:password]
194
+ request = Net::HTTP::Post.new(url.request_uri)
195
+ request['User-Agent'] = @user_agent
196
+ request.proxy_select_auth( @username, @password, response)
197
+ request.set_form_data(options[:params])
198
+ response = http.request(request)
199
+ end
176
200
  if response.is_a?(Net::HTTPUnauthorized) && @username && @password
177
201
  request = Net::HTTP::Post.new(url.request_uri)
178
202
  request['User-Agent'] = @user_agent
179
- request.digest_auth @username, @password, response
180
- request.set_form_data(options[:querystring])
203
+ request.select_auth( @username, @password, response)
204
+ request.set_form_data(options[:params])
181
205
  response = http.request(request)
182
206
  end
183
207
  response
@@ -205,9 +229,10 @@ module MusicBrainz
205
229
  private # ----------------------------------------------------------------
206
230
 
207
231
  # Builds a request URI for querying the webservice.
208
- def create_uri(entity_type, options = {:id => nil, :include => nil, :filter => nil, :version => 1})
232
+ def create_uri(entity_type, options = {:id=>nil, :include=>nil, :filter=>nil, :version=>1, :type=>nil})
209
233
  # Make sure the version is set
210
234
  options[:version] = 1 if options[:version].nil?
235
+ options[:type] = 'xml' if options[:type].nil?
211
236
 
212
237
  # Build the URI
213
238
  if options[:id]
@@ -217,16 +242,19 @@ module MusicBrainz
217
242
  id = Model::MBID.parse(id, entity_type)
218
243
  end
219
244
 
220
- uri = 'http://%s:%d%s/%d/%s/%s?type=%s' %
221
- [@host, @port, @path_prefix, options[:version],
222
- entity_type, id.uuid, 'xml']
245
+ uri = 'http://%s:%d%s/%d/%s/%s' %
246
+ [@host, @port, @path_prefix, options[:version], entity_type, id.uuid]
223
247
  else
224
- uri = 'http://%s:%d%s/%d/%s/?type=%s' %
225
- [@host, @port, @path_prefix, options[:version],
226
- entity_type, 'xml']
248
+ uri = 'http://%s:%d%s/%d/%s/' %
249
+ [@host, @port, @path_prefix, options[:version], entity_type]
227
250
  end
228
- uri += '&' + options[:include].to_s unless options[:include].nil?
229
- uri += '&' + options[:filter].to_s unless options[:filter].nil?
251
+
252
+ # Append the querystring
253
+ querystring = []
254
+ querystring << 'type=' + URI.escape(options[:type]) unless options[:type].nil?
255
+ querystring << options[:include].to_s unless options[:include].nil?
256
+ querystring << options[:filter].to_s unless options[:filter].nil?
257
+ uri += '?' + querystring.join('&') unless querystring.empty?
230
258
  return uri
231
259
  end
232
260
 
@@ -6,7 +6,7 @@
6
6
  <name>Tori Amos</name>
7
7
  </artist>
8
8
  <release-event-list>
9
- <event date="1994-01-31" catalog-number="82567-2" barcode="07567825672">
9
+ <event date="1994-01-31" catalog-number="82567-2" barcode="07567825672" format="CD">
10
10
  <label id="50c384a2-0b44-401b-b893-8181173339c7">
11
11
  <name>Atlantic Records</name>
12
12
  </label>
@@ -1,4 +1,4 @@
1
- # $Id: test_collection.rb 117 2007-07-11 21:40:05Z phw $
1
+ # $Id: test_collection.rb 172 2007-08-24 11:19:19Z phw $
2
2
  #
3
3
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Philipp Wolfer
@@ -36,8 +36,7 @@ class TestCollection < Test::Unit::TestCase
36
36
  # Fill the collection
37
37
  assert_nothing_raised {
38
38
  collection << @artist_one
39
- collection << @artist_two
40
- collection << @artist_three
39
+ collection << @artist_two << @artist_three
41
40
  }
42
41
  assert_equal 3, collection.size
43
42
  assert !collection.empty?
data/test/test_mbxml.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: test_mbxml.rb 152 2007-07-24 08:47:28Z phw $
1
+ # $Id: test_mbxml.rb 189 2007-11-26 00:10:49Z phw $
2
2
  #
3
3
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
4
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -15,12 +15,12 @@ include MusicBrainz
15
15
  # We test against the official test files supplied by
16
16
  # MusicBrainz. See http://bugs.musicbrainz.org/browser/mmd-schema/trunk/test-data
17
17
  class TestMBXML < Test::Unit::TestCase
18
-
18
+
19
19
  DATA_PATH = 'test/test-data/valid/'
20
-
20
+
21
21
  def setup
22
22
  end
23
-
23
+
24
24
  def teardown
25
25
  end
26
26
 
@@ -54,7 +54,7 @@ class TestMBXML < Test::Unit::TestCase
54
54
  assert_equal nil, mbxml.get_entity(:release)
55
55
  assert_equal nil, mbxml.get_entity(:track)
56
56
  assert_equal nil, mbxml.get_entity(:label)
57
-
57
+
58
58
  artist_list = mbxml.get_entity_list(:artist)
59
59
  assert_equal 0, artist_list.offset
60
60
  assert_equal 47, artist_list.count
@@ -100,7 +100,7 @@ class TestMBXML < Test::Unit::TestCase
100
100
  assert_equal 'composer', artist.tags[3].text
101
101
  assert_equal 120, artist.tags[3].count
102
102
  end
103
-
103
+
104
104
  def test_artist_tori_amos_1
105
105
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'artist/Tori_Amos_1.xml')
106
106
  artist = mbxml.get_entity(:artist)
@@ -111,7 +111,7 @@ class TestMBXML < Test::Unit::TestCase
111
111
  assert_equal 'Amos, Tori', artist.sort_name
112
112
  assert_equal '1963-08-22', artist.begin_date.to_s
113
113
  end
114
-
114
+
115
115
  def test_artist_tori_amos_2
116
116
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'artist/Tori_Amos_2.xml')
117
117
  artist = mbxml.get_entity(:artist)
@@ -132,7 +132,7 @@ class TestMBXML < Test::Unit::TestCase
132
132
  assert_equal artist, artist.releases[2].artist
133
133
  assert_equal 4, artist.releases[2].discs.count
134
134
  end
135
-
135
+
136
136
  def test_artist_tori_amos_3
137
137
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'artist/Tori_Amos_3.xml')
138
138
  artist = mbxml.get_entity(:artist)
@@ -157,7 +157,7 @@ class TestMBXML < Test::Unit::TestCase
157
157
  assert_equal Model::NS_REL_1 + 'Wikipedia', url_rels[1].type
158
158
  assert_equal 'http://en.wikipedia.org/wiki/Tori_Amos', url_rels[1].target
159
159
  end
160
-
160
+
161
161
  def test_artist_tori_amos_4
162
162
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'artist/Tori_Amos_4.xml')
163
163
  artist = mbxml.get_entity(:artist)
@@ -175,7 +175,7 @@ class TestMBXML < Test::Unit::TestCase
175
175
  assert_equal 'Latn', artist.aliases[2].script
176
176
  assert_equal Model::NS_MMD_1 + 'Misspelling', artist.aliases[2].type
177
177
  end
178
-
178
+
179
179
  def test_artist_tori_amos_5
180
180
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'artist/Tori_Amos_5.xml')
181
181
  artist = mbxml.get_entity(:artist)
@@ -193,14 +193,14 @@ class TestMBXML < Test::Unit::TestCase
193
193
  assert artist.releases[0].types.include?(Model::Release::TYPE_ALBUM)
194
194
  assert artist.releases[0].types.include?(Model::Release::TYPE_OFFICIAL)
195
195
  end
196
-
196
+
197
197
  def test_release_search
198
198
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'release/search_result_1.xml')
199
199
  assert_equal nil, mbxml.get_entity(:artist)
200
200
  assert_equal nil, mbxml.get_entity(:release)
201
201
  assert_equal nil, mbxml.get_entity(:track)
202
202
  assert_equal nil, mbxml.get_entity(:label)
203
-
203
+
204
204
  release_list = mbxml.get_entity_list(:release)
205
205
  assert_equal 0, release_list.offset
206
206
  assert_equal 234, release_list.count
@@ -238,14 +238,14 @@ class TestMBXML < Test::Unit::TestCase
238
238
  assert_equal 9, release.tracks.size
239
239
  assert_equal '430aa3d3-3dac-4bd5-857d-eb10212ffefb', release.tracks[0].id.uuid
240
240
  assert_equal 'd315625a-3976-41b4-b2e0-43336b0f67bc', release.tracks[8].id.uuid
241
-
241
+
242
242
  url_rels = release.get_relations(:target_type => Model::Relation::TO_URL)
243
243
  assert_equal 2, url_rels.size, release.get_relations.inspect
244
244
  assert_equal Model::NS_REL_1 + 'Wikipedia', url_rels[0].type
245
- assert_equal nil, url_rels[0].direction
245
+ assert_equal Model::Relation::DIR_BOTH, url_rels[0].direction
246
246
  assert_equal 'http://en.wikipedia.org/wiki/Highway_61_Revisited', url_rels[0].target
247
247
  assert_equal Model::NS_REL_1 + 'AmazonAsin', url_rels[1].type
248
- assert_equal nil, url_rels[1].direction
248
+ assert_equal Model::Relation::DIR_BOTH, url_rels[1].direction
249
249
  assert_equal 'http://www.amazon.com/gp/product/B0000024SI', url_rels[1].target
250
250
  end
251
251
 
@@ -286,7 +286,7 @@ class TestMBXML < Test::Unit::TestCase
286
286
  assert_equal 3, release.discs.size
287
287
  assert_equal 'ILKp3.bZmvoMO7wSrq1cw7WatfA-', release.discs[0].id
288
288
  end
289
-
289
+
290
290
  def test_release_little_earthquakes_2
291
291
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'release/Little_Earthquakes_2.xml')
292
292
  release = mbxml.get_entity(:release)
@@ -309,7 +309,7 @@ class TestMBXML < Test::Unit::TestCase
309
309
  assert_equal 'Crucify', release.tracks[0].title
310
310
  assert_equal 301186, release.tracks[0].duration
311
311
  end
312
-
312
+
313
313
  # This is a various artist release.
314
314
  def test_release_mission_impossible_2
315
315
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'release/Mission_Impossible_2.xml')
@@ -330,7 +330,7 @@ class TestMBXML < Test::Unit::TestCase
330
330
  assert_not_equal release.artist, track.artist
331
331
  }
332
332
  end
333
-
333
+
334
334
  def test_release_under_the_pink_1
335
335
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'release/Under_the_Pink_1.xml')
336
336
  release = mbxml.get_entity(:release)
@@ -349,7 +349,7 @@ class TestMBXML < Test::Unit::TestCase
349
349
  assert_equal 4, release.discs.count
350
350
  assert_equal 12, release.tracks.count
351
351
  end
352
-
352
+
353
353
  def test_release_under_the_pink_2
354
354
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'release/Under_the_Pink_2.xml')
355
355
  release = mbxml.get_entity(:release)
@@ -364,7 +364,7 @@ class TestMBXML < Test::Unit::TestCase
364
364
  assert_equal '0a984e3b-e38a-4b86-80be-f3a3eb1114ca', release.tracks[0].id.uuid
365
365
  assert_equal 'God', release.tracks[0].title
366
366
  end
367
-
367
+
368
368
  def test_release_under_the_pink_3
369
369
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'release/Under_the_Pink_3.xml')
370
370
  release = mbxml.get_entity(:release)
@@ -381,15 +381,16 @@ class TestMBXML < Test::Unit::TestCase
381
381
  assert_equal '07567825672', release.release_events[0].barcode
382
382
  assert_equal '50c384a2-0b44-401b-b893-8181173339c7', release.release_events[0].label.id.uuid
383
383
  assert_equal 'Atlantic Records', release.release_events[0].label.name
384
+ assert_equal Model::ReleaseEvent::FORMAT_CD, release.release_events[0].format
384
385
  end
385
-
386
+
386
387
  def test_track_search
387
388
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'track/search_result_1.xml')
388
389
  assert_equal nil, mbxml.get_entity(:artist)
389
390
  assert_equal nil, mbxml.get_entity(:release)
390
391
  assert_equal nil, mbxml.get_entity(:track)
391
392
  assert_equal nil, mbxml.get_entity(:label)
392
-
393
+
393
394
  track_list = mbxml.get_entity_list(:track)
394
395
  assert_equal 7, track_list.offset
395
396
  assert_equal 100, track_list.count
@@ -414,7 +415,7 @@ class TestMBXML < Test::Unit::TestCase
414
415
  assert_equal 'Silent All These Years', track.title
415
416
  assert_equal 253466, track.duration
416
417
  end
417
-
418
+
418
419
  def test_track_silent_all_these_years_2
419
420
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'track/Silent_All_These_Years_2.xml')
420
421
  track = mbxml.get_entity(:track)
@@ -431,7 +432,7 @@ class TestMBXML < Test::Unit::TestCase
431
432
  assert track_rels[0].target.is_a?(Model::Track)
432
433
  assert_equal '5bcd4eaa-fae7-465f-9f03-d005b959ed02', track_rels[0].target.artist.id.uuid
433
434
  end
434
-
435
+
435
436
  def test_track_silent_all_these_years_3
436
437
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'track/Silent_All_These_Years_3.xml')
437
438
  track = mbxml.get_entity(:track)
@@ -443,7 +444,7 @@ class TestMBXML < Test::Unit::TestCase
443
444
  assert_equal 'c2a2cee5-a8ca-4f89-a092-c3e1e65ab7e6', track.puids[0]
444
445
  assert_equal '42ab76ea-5d42-4259-85d7-e7f2c69e4485', track.puids[6]
445
446
  end
446
-
447
+
447
448
  def test_track_silent_all_these_years_4
448
449
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'track/Silent_All_These_Years_4.xml')
449
450
  track = mbxml.get_entity(:track)
@@ -458,7 +459,7 @@ class TestMBXML < Test::Unit::TestCase
458
459
  assert_equal 'c2a2cee5-a8ca-4f89-a092-c3e1e65ab7e6', track.puids[0]
459
460
  assert_equal '42ab76ea-5d42-4259-85d7-e7f2c69e4485', track.puids[6]
460
461
  end
461
-
462
+
462
463
  # This test is similiar to silent_all_these_years_3, but it includes an
463
464
  # schema exctension which mustn't disturb the parsing.
464
465
  def test_track_silent_all_these_years_5
@@ -482,14 +483,14 @@ class TestMBXML < Test::Unit::TestCase
482
483
  assert_equal 253466, track.duration
483
484
  assert_equal 0, track.tags.size
484
485
  end
485
-
486
+
486
487
  def test_label_search
487
488
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'label/search_result_1.xml')
488
489
  assert_equal nil, mbxml.get_entity(:artist)
489
490
  assert_equal nil, mbxml.get_entity(:release)
490
491
  assert_equal nil, mbxml.get_entity(:track)
491
492
  assert_equal nil, mbxml.get_entity(:label)
492
-
493
+
493
494
  label_list = mbxml.get_entity_list(:label)
494
495
  assert_equal 0, label_list.offset
495
496
  assert_equal 2, label_list.count
@@ -518,7 +519,7 @@ class TestMBXML < Test::Unit::TestCase
518
519
  assert_equal 'US', label.country
519
520
  assert_equal '1947', label.begin_date.to_s
520
521
  end
521
-
522
+
522
523
  def test_label_atlantic_records_2
523
524
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'label/Atlantic_Records_2.xml')
524
525
  label = mbxml.get_entity(:label)
@@ -534,7 +535,7 @@ class TestMBXML < Test::Unit::TestCase
534
535
  assert_equal 1, label.aliases.size
535
536
  assert_equal 'Atlantic Rec.', label.aliases[0].name
536
537
  end
537
-
538
+
538
539
  def test_label_atlantic_records_3
539
540
  mbxml = Webservice::MBXML.new File.new(DATA_PATH + 'label/Atlantic_Records_3.xml')
540
541
  label = mbxml.get_entity(:label)