packages.py

Go to the documentation of this file.
00001 import os, sys
00002 
00003 from vyperlogix import misc
00004 from vyperlogix.lists.ListWrapper import ListWrapper
00005 from vyperlogix.misc import _utils
00006 
00007 from vyperlogix.hash import lists
00008 
00009 __copyright__ = """\
00010 (c). Copyright 1990-2008, Vyper Logix Corp., All Rights Reserved.
00011 
00012 Published under Creative Commons License 
00013 (http://creativecommons.org/licenses/by-nc/3.0/) 
00014 restricted to non-commercial educational use only., 
00015 
00016 See also: http://www.VyperLogix.com and http://www.pypi.info for details.
00017 
00018 THE AUTHOR VYPER LOGIX CORP DISCLAIMS ALL WARRANTIES WITH REGARD TO
00019 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
00020 FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
00021 INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
00022 FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
00023 NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
00024 WITH THE USE OR PERFORMANCE OF THIS SOFTWARE !
00025 
00026 USE AT YOUR OWN RISK.
00027 """
00028 def open_browser():
00029     import mechanize
00030     
00031     b = mechanize.Browser(
00032         factory=mechanize.DefaultFactory(i_want_broken_xhtml_support=True)
00033         )
00034     b.set_handle_robots(False)
00035     return b
00036 
00037 ##
00038 # Returns a list of items as follows:
00039 #     (u'/pypi?%3Aaction=logout', {u'/pypi': {u'%3Aaction': u'logout'}}, u'Logout')
00040 #     
00041 def get_packages(browser,url,username,password,logging=None):
00042     import urllib2
00043     from vyperlogix.url import _urllib2
00044     
00045     browser.add_password(url, username, password)
00046 
00047     packages = []
00048     
00049     try:
00050         req = urllib2.Request(url)
00051         req.add_header("Referer", url.split('?')[0])
00052         browser.open(req)
00053         for aLink in browser.links():
00054             d_attrs = lists.HashedFuzzyLists2(dict(aLink.attrs))
00055             _href = d_attrs['href']
00056             toks = _urllib2.parse_href_into_parms(_href)[-1]
00057             if (all([isinstance(t,list) for t in toks])):
00058                 try:
00059                     d_parms = lists.HashedFuzzyLists2(dict([tuple(t) for t in toks]))
00060                 except:
00061                     d_parms = lists.HashedFuzzyLists2()
00062                 if ( (d_parms[':action']) or (d_parms['%3Aaction']) ) and (d_parms['name']):
00063                     href = aLink.url
00064                     text = aLink.text
00065                     toks = [[x.split('=') for x in tt] for tt in [t.split('&') for t in href.split('?')]]
00066                     d = lists.HashedLists2()
00067                     d[toks[0][0][0]] = lists.HashedLists2(dict([tuple(t) for t in toks[-1]]))
00068                     _datum = tuple([href,d,text])
00069                     dd = d[d.keys()[0]]
00070                     if (dd is not None) and (misc.isString(str(dd['name']) if (dd['name'] is not None) else dd['name'])):
00071                         packages.append(_datum)
00072     except Exception, e:
00073         info_string = _utils.formattedException(details=e)
00074         if (logging is not None):
00075             logging.warning(info_string)
00076         print >>sys.stderr, info_string
00077     return packages
00078 
00079 def get_package_details2(browser,_url,url,logging=None):
00080     import urllib2
00081     from vyperlogix.misc import ObjectTypeName
00082     from vyperlogix import misc
00083     
00084     req = urllib2.Request(url)
00085     req.add_header("Referer", url.split('?')[0])
00086     browser.open(req)
00087     
00088     d = lists.HashedLists2()
00089     
00090     _forms = []
00091     for form in browser.forms():
00092         elements = form.controls
00093         _forms.append(tuple([len(elements),elements]))
00094     d_forms = dict(_forms)
00095     keys = misc.sort(d_forms.keys())
00096     elements = d_forms[keys[-1]]
00097     if (len(elements) > 0):
00098         inputs = [c for c in [(ele,ObjectTypeName.typeClassName(ele)) for ele in elements] if (c[-1].find('ClientForm.') > -1) and (c[-1] not in ['ClientForm.SubmitControl'])]
00099         for item in inputs:
00100             ele,cname = item
00101             d_attrs = ele.attrs
00102             if (cname == 'ClientForm.SelectControl'):
00103                 choice = [choice for choice in ele.get_items() if (choice._selected)]
00104                 d[d_attrs['name']] = ','.join([a['label'] for a in [choice.attrs for choice in ele.get_items() if (choice._selected)]])
00105             elif (cname == 'ClientForm.TextareaControl'):
00106                 for p in ele.pairs():
00107                     d[p[0]] = p[-1]
00108             else:
00109                 try:
00110                     d[d_attrs['name']] = d_attrs['value']
00111                 except Exception, e:
00112                     info_string = _utils.formattedException(details=e)
00113                     pass
00114         return d,form.attrs
00115     return d,[]
00116 
00117 def get_package_details(browser,_url,url,logging=None):
00118     import urllib2
00119     
00120     req = urllib2.Request(url)
00121     req.add_header("Referer", url.split('?')[0])
00122     browser.open(req)
00123 
00124     _d = lists.HashedLists2()
00125     form_attrs = []
00126 
00127     for anchor in browser.links():
00128         try:
00129             href = anchor.url
00130             toks = [[x.split('=') for x in tt] for tt in [t.split('&') for t in href.split('?')]]
00131             d = {}
00132             d[toks[0][0][0]] = dict([tuple(t) for t in toks[-1]])
00133             if (d.has_key('/pypi')):
00134                 dd = lists.HashedLists2(d['/pypi'])
00135                 if (len(dd) > 1) and ( ( (dd.has_key(':action')) and (dd[':action'] == 'submit_form') ) or ( (dd.has_key('%3Aaction')) and (dd['%3Aaction'] == 'submit_form') ) ):
00136                     _datum = tuple([href,d,anchor.text])
00137                     url, d, details = _datum
00138                     url = '%s%s' % (_url,url)
00139                     return get_package_details2(browser,_url,url,logging=logging)
00140         except Exception, e:
00141             info_string = _utils.formattedException(details=e)
00142             pass
00143     return _d,form_attrs
00144 
00145 def edit_a_package(browser,_url,pkg,callback=None,logging=None):
00146     from vyperlogix.url._urllib2 import http_post_authenticated
00147 
00148     if (logging is not None):
00149         logging.info(pkg)
00150     else:
00151         print >>sys.stderr, pkg
00152 
00153     url, d, details = pkg
00154     dd = d[d.keys()[0]]
00155     if (dd.has_key('%3Aaction')) and (dd['%3Aaction'] == 'pkg_edit'):
00156         url = '%s%s' % (_url,url)
00157         d,form_attrs = get_package_details(_url,url,username,password,logging=logging)
00158         if (callable(callback)):
00159             try:
00160                 callback(d)
00161             except:
00162                 pass
00163             d_attrs = lists.HashedLists2(dict(form_attrs))
00164             url = '%s%s' % (_url,d_attrs['action'])
00165             http_post_authenticated(url,d,username,password,logging=logging)
00166             info_string = 'Updated! (%s)' % (d['version'])
00167             if (logging is not None):
00168                 logging.info(info_string)
00169             else:
00170                 print >>sys.stderr, info_string
00171                 print '='*80
00172 
00173 
00174 

© Copyright 2008-2009 Vyper Logix Corp., All Right Reserved; If you reference this document or any part of this document you must use the citation verbatim (including the link) "© Copyright 2008-2009 Vyper Logix Corp., All Right Reserved."

Notice: This source code contained in this document is NOT open source and is NOT being distributed as open source.

122,241 lines of code and growing...