[mb-commits] r9714 - in python-musicbrainz2/trunk: examples src/musicbrainz2 test

root at musicbrainz.org root at musicbrainz.org
Sat Mar 1 09:05:49 UTC 2008


Author: matt
Date: 2008-03-01 09:05:48 +0000 (Sat, 01 Mar 2008)
New Revision: 9714

Modified:
   python-musicbrainz2/trunk/examples/README.txt
   python-musicbrainz2/trunk/examples/folksonomytags.py
   python-musicbrainz2/trunk/src/musicbrainz2/utils.py
   python-musicbrainz2/trunk/src/musicbrainz2/webservice.py
   python-musicbrainz2/trunk/test/test_utils.py
   python-musicbrainz2/trunk/test/test_ws_query.py
Log:
Changed getUserTags()/submitUserTags() to accept only absolute URIs.
Added a utility function for extracting the entity type from an absolute URI.
Minor cosmetic changes to the example script.


Modified: python-musicbrainz2/trunk/examples/README.txt
===================================================================
--- python-musicbrainz2/trunk/examples/README.txt	2008-02-28 22:37:23 UTC (rev 9713)
+++ python-musicbrainz2/trunk/examples/README.txt	2008-03-01 09:05:48 UTC (rev 9714)
@@ -18,6 +18,9 @@
  findlabel.py
     Search MusicBrainz for a label matching the given label name.
 
+ folksonomytags.py
+    Get and submit MusicBrainz folksonomy tags for a given entity.
+
  getartist.py
     Retrieve an artist using a MusicBrainz ID and display all officially
     released albums.

Modified: python-musicbrainz2/trunk/examples/folksonomytags.py
===================================================================
--- python-musicbrainz2/trunk/examples/folksonomytags.py	2008-02-28 22:37:23 UTC (rev 9713)
+++ python-musicbrainz2/trunk/examples/folksonomytags.py	2008-03-01 09:05:48 UTC (rev 9714)
@@ -26,14 +26,10 @@
 username = raw_input('Username: ')
 password = getpass.getpass('Password: ')
 
-# Ask for an entity type to tag.
-entity = raw_input('Entity type to tag (artist, release, track or label): ')
-
 # Ask for a MBID to tag.
-id_ = raw_input('Enter a MBID: ')
-mbid = extractUuid(id_)
+mbid = raw_input('Enter an absolute MB ID: ')
 
-# Set the authentication for the webservice.
+# Set the authentication for the webservice (only needed for tag submission).
 service = mbws.WebService(host=MB_HOST, username=username, password=password)
 
 # Create a new Query object which will provide
@@ -41,14 +37,18 @@
 query = mbws.Query(service)
 
 # Read and print the current tags for the given MBID
-tags = query.getUserTags(entity, mbid)
+tags = query.getUserTags(mbid)
 print
 print 'Current tags: '
 print ', '.join([tag.value for tag in tags])
 
+
 # Ask the user for new tags and submit them
 tag_str = raw_input('Enter new tags: ')
-new_tags = [Tag(tag) for tag in tag_str.split(',')]
-query.submitUserTags(entity, mbid, new_tags)
+new_tags = [Tag(tag.strip()) for tag in tag_str.split(',')]
 
-print 'Tags applied'
+query.submitUserTags(mbid, new_tags)
+
+print 'Tags submitted.'
+
+# EOF

Modified: python-musicbrainz2/trunk/src/musicbrainz2/utils.py
===================================================================
--- python-musicbrainz2/trunk/src/musicbrainz2/utils.py	2008-02-28 22:37:23 UTC (rev 9713)
+++ python-musicbrainz2/trunk/src/musicbrainz2/utils.py	2008-03-01 09:05:48 UTC (rev 9714)
@@ -11,10 +11,16 @@
 import os.path
 
 __all__ = [
-	'extractUuid', 'extractFragment', 'getReleaseTypeName',
-	'getCountryName', 'getLanguageName', 'getScriptName',
+	'extractUuid', 'extractFragment', 'extractEntityType',
+	'getReleaseTypeName', 'getCountryName', 'getLanguageName',
+	'getScriptName',
 ]
 
+
+# A pattern to split the path part of an absolute MB URI.
+PATH_PATTERN = '^/(artist|release|track|label)/([^/]*)$'
+
+
 def extractUuid(uriStr, resType=None):
 	"""Extract the UUID part from a MusicBrainz identifier.
 
@@ -55,7 +61,7 @@
 	if scheme != 'http' or netloc != 'musicbrainz.org':
 		raise ValueError('%s is no MB ID.' % uriStr)
 
-	m = re.match('^/(artist|release|track|label)/([^/]*)$', path)
+	m = re.match(PATH_PATTERN, path)
 
 	if m:
 		if resType is None:
@@ -98,7 +104,34 @@
 		raise ValueError("prefix doesn't match URI %s" % uriStr)
 
 
+def extractEntityType(uriStr):
+	"""Returns the entity type an entity URI is referring to.
 
+	@param uriStr: a string containing an absolute entity URI
+
+	@return: a string containing 'artist', 'release', 'track', or 'label'
+
+	@raise ValueError: if the given URI is no valid MusicBrainz ID
+	"""
+	if uriStr is None:
+		raise ValueError('None is no valid entity URI')
+
+	(scheme, netloc, path) = urlparse.urlparse(uriStr)[:3]
+
+	if scheme == '':
+		raise ValueError('%s is no absolute MB ID.' % uriStr)
+
+	if scheme != 'http' or netloc != 'musicbrainz.org':
+		raise ValueError('%s is no MB ID.' % uriStr)
+
+	m = re.match(PATH_PATTERN, path)
+
+	if m:
+		return m.group(1)
+	else:
+		raise ValueError('%s is no valid MB ID.' % uriStr)
+
+
 def getReleaseTypeName(releaseType):
 	"""Returns the name of a release type URI.
 

Modified: python-musicbrainz2/trunk/src/musicbrainz2/webservice.py
===================================================================
--- python-musicbrainz2/trunk/src/musicbrainz2/webservice.py	2008-02-28 22:37:23 UTC (rev 9713)
+++ python-musicbrainz2/trunk/src/musicbrainz2/webservice.py	2008-03-01 09:05:48 UTC (rev 9714)
@@ -1070,53 +1070,58 @@
 		self._ws.post('track', '', encodedStr)
 
 
-	def submitUserTags(self, entity, id_, tags):
+	def submitUserTags(self, entityUri, tags):
 		"""Submit folksonomy tags for an entity.
 		
-		@param entity: the entity type as a string ('artist', 'label',
-		               'release' or 'track')
-		@param id_: a string containing the entity's ID
+		@param entityUri: a string containing an absolute MB ID
 		@param tags: A list of either L{Tag <musicbrainz2.model.Tag>} objects
 		             or strings
 
+		@raise ValueError: invalid entityUri
 		@raise ConnectionError: couldn't connect to server
 		@raise RequestError: invalid ID, entity or tags
 		@raise AuthenticationError: invalid user name and/or password
 		"""
-		params = [ 
+		entity = mbutils.extractEntityType(entityUri)
+		uuid = mbutils.extractUuid(entityUri, entity)
+		params = (
 			('type', 'xml'),
 			('entity', entity),
-			('id', mbutils.extractUuid(id_, entity)),
+			('id', uuid),
 			('tags', ','.join([unicode(tag).encode('utf-8') for tag in tags]))
-		]
+		)
 
 		encodedStr = urllib.urlencode(params)
 
 		self._ws.post('tag', '', encodedStr)
 
 
-	def getUserTags(self, entity, id_):
+	def getUserTags(self, entityUri):
 		"""Returns a list of folksonomy tags a user has applied to an entity.
+
+		The given parameter has to be a fully qualified MusicBrainz ID, as
+		returned by other library functions.
 		
 		Note that this method only works if a valid user name and
 		password have been set. Only the tags the authenticated user
 		applied to the entity will be returned. If username and/or
 		password are incorrect, an AuthenticationError is raised.
 		
-		This method will return a list of L{Tag <musicbrainz2.model.Tag>} objects.
+		This method will return a list of L{Tag <musicbrainz2.model.Tag>}
+		objects.
 		
-		@param entity: the entity type as a string ('artist', 'label',
-		               'release' or 'track')
-		@param id_: a string containing the entity's ID
+		@param entityUri: a string containing an absolute MB ID
 		
+		@raise ValueError: invalid entityUri
   		@raise ConnectionError: couldn't connect to server
 		@raise RequestError: invalid ID or entity
 		@raise AuthenticationError: invalid user name and/or password
 		"""
-		uuid = mbutils.extractUuid(id_, entity)
-		params = { 'entity': entity, 'id': id_ }
+		entity = mbutils.extractEntityType(entityUri)
+		uuid = mbutils.extractUuid(entityUri, entity)
+		params = { 'entity': entity, 'id': uuid }
 		
-		stream = self._ws.get('tag', uuid, filter=params)
+		stream = self._ws.get('tag', '', filter=params)
 		try:
 			parser = MbXmlParser()
 			result = parser.parse(stream)

Modified: python-musicbrainz2/trunk/test/test_utils.py
===================================================================
--- python-musicbrainz2/trunk/test/test_utils.py	2008-02-28 22:37:23 UTC (rev 9713)
+++ python-musicbrainz2/trunk/test/test_utils.py	2008-03-01 09:05:48 UTC (rev 9714)
@@ -43,6 +43,32 @@
 		self.assertRaises(ValueError, u.extractFragment, uri, prefix)
 
 
+	def testExtractEntityType(self):
+		prefix = 'http://musicbrainz.org'
+		uuid = 'c0b2500e-0cef-4130-869d-732b23ed9df5'
+
+		mbid1 = prefix + '/artist/' + uuid
+		self.assertEquals(u.extractEntityType(mbid1), 'artist')
+
+		mbid2 = prefix + '/release/' + uuid
+		self.assertEquals(u.extractEntityType(mbid2), 'release')
+
+		mbid3 = prefix + '/track/' + uuid
+		self.assertEquals(u.extractEntityType(mbid3), 'track')
+
+		mbid4 = prefix + '/label/' + uuid
+		self.assertEquals(u.extractEntityType(mbid4), 'label')
+
+		mbid5 = prefix + '/invalid/' + uuid
+		self.assertRaises(ValueError, u.extractEntityType, mbid5)
+
+		self.assertRaises(ValueError, u.extractEntityType, None)
+		self.assertRaises(ValueError, u.extractEntityType, uuid)
+
+		invalidUri = 'http://example.invalid/foo'
+		self.assertRaises(ValueError, u.extractEntityType, invalidUri)
+		
+
 	def testGetCountryName(self):
 		self.assertEquals(u.getCountryName('DE'), 'Germany')
 		self.assertEquals(u.getCountryName('FR'), 'France')

Modified: python-musicbrainz2/trunk/test/test_ws_query.py
===================================================================
--- python-musicbrainz2/trunk/test/test_ws_query.py	2008-02-28 22:37:23 UTC (rev 9713)
+++ python-musicbrainz2/trunk/test/test_ws_query.py	2008-03-01 09:05:48 UTC (rev 9714)
@@ -20,8 +20,13 @@
 		q = Query(ws)
 		t1 = [u"foo", u"bar", u"f\u014do"]
 		t2 = [Tag(u"foo"), Tag(u"bar"), Tag(u"f\u014do")]
-		q.submitUserTags("artist", "c0b2500e-0cef-4130-869d-732b23ed9df5", t1)
-		q.submitUserTags("artist", "c0b2500e-0cef-4130-869d-732b23ed9df5", t2)
+
+		prefix = 'http://musicbrainz.org/artist/'
+		uri = prefix + 'c0b2500e-0cef-4130-869d-732b23ed9df5'
+
+		q.submitUserTags(uri, t1)
+		q.submitUserTags(uri, t2)
+
 		self.assertEquals(len(ws.data), 2)
 		self.assertEquals(ws.data[0], ws.data[1])
 




More information about the MusicBrainz-commits mailing list