1
0
Fork 0

Handle different cases of release's format attribute.

This commit is contained in:
Mathias Gawlista 2013-01-18 18:31:30 +01:00
parent 0d2c12ffc2
commit 75a536d373
2 changed files with 54 additions and 2 deletions

View File

@ -3,14 +3,23 @@ module MusicBrainz
module Release
def parse(xml)
xml = xml.xpath('./release') unless xml.xpath('./release').empty?
{
hash = {
id: (xml.attribute('id').value rescue nil),
title: (xml.xpath('./title').text rescue nil),
status: (xml.xpath('./status').text rescue nil),
country: (xml.xpath('./country').text rescue nil),
format: (xml.xpath('./medium-list/medium/format').text rescue nil),
date: (xml.xpath('./date').text rescue nil)
}
formats = (xml.xpath('./medium-list/medium/format') rescue []).map(&:text)
hash[:format] = formats.uniq.map do |format|
format_count = formats.select{|f| f == format}.length
format_count == 1 ? format : "#{format_count}x#{format}"
end.join(' + ')
hash
end
extend self

View File

@ -0,0 +1,43 @@
# -*- encoding: utf-8 -*-
require "spec_helper"
describe MusicBrainz::Bindings::Release do
describe '.parse' do
describe 'attributes' do
describe 'format' do
context 'single cd' do
it 'returns CD' do
response = '<release><medium-list count="1"><medium><format>CD</format></medium></medium-list></release>'
xml = Nokogiri::XML.parse(response)
described_class.parse(xml)[:format].should == 'CD'
end
end
context 'multiple cds' do
it 'returns 2xCD' do
response = '<release><medium-list count="2"><medium><format>CD</format><track-list count="11" /></medium><medium><title>bonus disc</title><format>CD</format></medium></medium-list></release>'
xml = Nokogiri::XML.parse(response)
described_class.parse(xml)[:format].should == '2xCD'
end
end
context 'different formats' do
it 'returns DVD + CD' do
response = '<release><medium-list count="2"><medium><format>DVD</format></medium><medium><format>CD</format></medium></medium-list></release>'
xml = Nokogiri::XML.parse(response)
described_class.parse(xml)[:format].should == 'DVD + CD'
end
end
context 'different formats plus multiple mediums with same format' do
it 'returns 2xCD + DVD' do
response = '<release><medium-list count="2"><medium><format>CD</format></medium><medium><format>CD</format></medium><medium><format>DVD</format></medium></medium-list></release>'
xml = Nokogiri::XML.parse(response)
described_class.parse(xml)[:format].should == '2xCD + DVD'
end
end
end
end
end
end