home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / pyshared / launchpadbugs / html_projectlist.py < prev    next >
Encoding:
Python Source  |  2008-08-05  |  7.1 KB  |  169 lines

  1. """TODO:
  2.  * adjustments to url handling"""
  3.  
  4. import re
  5. import libxml2
  6. import urlparse
  7. from exceptions import parse_error, PythonLaunchpadBugsParsingError
  8. from buglistbase import LPBugList, LPBugPage
  9. from projectbase import LPProject, ProjectInfo, ProjectPackageInfo, LPProjectPackage
  10. from lphelper import user, unicode_for_libxml2
  11. from utils import valid_lp_url
  12. from lpconstants import BASEURL
  13.  
  14. #deactivate error messages from the validation [libxml2.htmlParseDoc]
  15. def noerr( ctx, str ):
  16.     pass
  17.  
  18. libxml2.registerErrorHandler( noerr, None )
  19.  
  20. class PInfo( ProjectInfo ):
  21.     def __init__( self, project_name, project_summary, project_url, project_reviewed, project_registrar, project_registered ):
  22.         project_url = valid_lp_url(project_url, BASEURL.PROJECTLIST)
  23.         ProjectInfo.__init__( self, project_name, project_summary, project_url, project_reviewed, project_registrar, project_registered )
  24.  
  25. class PKGInfo ( ProjectPackageInfo ):
  26.     def __init__( self, package_name, package_url ):
  27.         package_url = valid_lp_url(package_url, BASEURL.PROJECTLIST)
  28.         ProjectPackageInfo.__init__( self, package_name, package_url )
  29.         
  30. class ProjectPackagePage( LPBugPage ):
  31.     
  32.     @staticmethod
  33.     def find_parse_function( connection, url, all_tasks ):
  34.         url = valid_lp_url(url, BASEURL.BUGPAGE)
  35.         lp_content = connection.get( url )
  36.         xmldoc = libxml2.htmlParseDoc( unicode_for_libxml2( lp_content.text ), "UTF-8" )
  37.         u=urlparse.urlsplit( url )
  38.         if "+allpackages" in u[2]:
  39.             result = ProjectPackagePage.parse_html_project_package_list( xmldoc, all_tasks, url )
  40.         else:
  41.             raise PythonLaunchpadBugsParsingError("package_table", url)
  42.         return result
  43.     
  44.     @staticmethod
  45.     def parse_html_project_package_list( xmldoc, all_tasks, url ):
  46.         def _parse():
  47.             if not xmldoc.xpathEval( "//h1" ):
  48.                 xmldoc.freeDoc()
  49.                 return
  50.             packagelisting=xmldoc.xpathEval( "//p/a" )
  51.             for package in packagelisting:
  52.                 package_name=package.content
  53.                 package_url="http://launchpad.net" + package.prop( "href" )
  54.                 yield PKGInfo( package_name, package_url )
  55.                 
  56.         next = xmldoc.xpathEval( '//td[@class="batch-navigation-links"]//a[@rel="next"]//@href' )
  57.         m = xmldoc.xpathEval( '//td[@class="batch-navigation-index"]' )
  58.         if m:
  59.             m = m.pop()
  60.             n = re.search( r'(\d+)\s+results?', m.content )
  61.             parse_error( n, "ProjectPage.parse_html_project_package_list.length", url=url )
  62.             length = n.group( 1 )
  63.             n = m.xpathEval( "strong" )
  64.             batchsize = int( n[1].content ) - int( n[0].content ) + 1
  65.         else:
  66.             length = batchsize = 0
  67.         if next:
  68.             return _parse(), next[0].content, batchsize, int( length )
  69.         return _parse(), False, batchsize, int( length )
  70.         
  71. class ProjectPage( LPBugPage ):
  72.     
  73.     @staticmethod
  74.     def find_parse_function( connection, url, all_tasks ):
  75.         url = valid_lp_url(url, BASEURL.BUGPAGE)
  76.         lp_content = connection.get( url )
  77.         xmldoc = libxml2.htmlParseDoc( unicode_for_libxml2( lp_content.text ), "UTF-8" )
  78.         u = urlparse.urlsplit( url )
  79.         if "projects/+all" in u[2]:
  80.             result = ProjectPage.parse_html_project_list( xmldoc, all_tasks, url )
  81.         return result
  82.  
  83.     @staticmethod
  84.     def parse_html_project_list( xmldoc, all_tasks, url ):
  85.         getuser_regexp=re.compile( r"~(.*)" )
  86.         def _parse():
  87.             if not xmldoc.xpathEval( '//div[@id="product-listing"]' ):
  88.                 xmldoc.freeDoc()
  89.                 return
  90.             projectlisting=xmldoc.xpathEval( '//div[@id="product-listing"]/div' )
  91.             for projects in projectlisting:
  92.                 # Catch Project URL:
  93.                 m=projects.xpathEval( 'a[1]' )
  94.                 if m:
  95.                     url="http://launchpad.net%s" % m[0].prop( "href" )
  96.                     reviewed=True
  97.                 else:
  98.                     # fetch projects which are not reviewed yet
  99.                     m = projects.xpathEval( 'span[@title]/a[1]' )
  100.                     url = "http://launchpad.net%s" % m[0].prop( "href" )
  101.                     reviewed = False
  102.                 # Project name:
  103.                 project_name = m[0].prop( "href" )[1:]
  104.                 # Catch summary
  105.                 m=projects.xpathEval( 'div[@style]/div[1]' )
  106.                 summary = m[0].content
  107.                 # catch username
  108.                 m = projects.xpathEval( 'div[@style]/div[2]/a[1]' )
  109.                 username = user.parse_html_user( m[0] )
  110.                 # catch registered date
  111.                 m = projects.xpathEval( 'div[@style]/div[2]/span[1]' )
  112.                 registered = m[0].prop( "title" )
  113.                 yield PInfo( project_name, summary, url, reviewed, username, registered )
  114.                 
  115.         # batch_size=xmldoc.xpathEval('//td[@class="batch-navigation-index"]/strong[2]')
  116.         #length=batchsize=batch_size[0].content
  117.         next = xmldoc.xpathEval( '//td[@class="batch-navigation-links"]//a[@rel="next"]//@href' )
  118.         m = xmldoc.xpathEval( '//td[@class="batch-navigation-index"]' )
  119.         if m:
  120.             m = m.pop()
  121.             n = re.search( r'(\d+)\s+results?', m.content )
  122.             parse_error( n, "ProjectPage.parse_html_project_list.length", url=url )
  123.             length = n.group( 1 )
  124.             n = m.xpathEval( "strong" )
  125.             batchsize = int( n[1].content ) - int( n[0].content ) + 1
  126.         else:
  127.             length = batchsize = 0
  128.         if next:
  129.             return _parse(), next[0].content, batchsize, int( length )
  130.         return _parse(), False, batchsize, int( length )
  131.  
  132.                 
  133. class ProjectList( LPBugList ):
  134.     """
  135.     returns a SET of LPBugInfo objects
  136.     searches baseurl and its following pages
  137.     """
  138.     def __init__( self, baseurl, connection=None, all_tasks=False, progress_hook=None ):
  139.         if hasattr(baseurl, "baseurl"):
  140.             baseurl.baseurl = valid_lp_url(baseurl.baseurl, BASEURL.PROJECTLIST)
  141.         else:
  142.             baseurl = valid_lp_url(baseurl, BASEURL.PROJECTLIST)
  143.         LPBugList.__init__( self, baseurl, connection, all_tasks,
  144.                     ProjectPage, progress_hook )
  145.         
  146.     def __repr__( self ):
  147.         return "<Projectlist %s>" %self.baseurl.split( "?" )[0]
  148.         
  149.     def __str__( self ):
  150.         return "Projectlist([%s])" %",".join( repr( i ) for i in self )
  151.         
  152.     def add( self, item ):
  153.         assert isinstance( item, ( ProjectInfo, LPProject ) )
  154.         LPBugList.add( self, item )
  155.         
  156. class ProjectPackageList(LPBugList):
  157.     def __init__(self,baseurl,connection=None,all_tasks=False,progress_hook=None):
  158.         LPBugList.__init__(self,baseurl,connection,all_tasks, ProjectPackagePage, progress_hook)
  159.         
  160.     def __repr__(self):
  161.         return "<ProjectPackageList %s>" % self.baseurl.split("?")[0]
  162.     
  163.     def add(self,item):
  164.         assert isinstance(item,(ProjectPackageInfo, LPProjectPackage))
  165.         LPBugList.add(self,item)
  166.     
  167.     def __str__( self ):
  168.         return "ProjectPackageList([%s])" % ",".join( repr( i ) for i in self )
  169.