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...