Package eggbasket :: Module util
[hide private]

Source Code for Module eggbasket.util

  1  # -*- coding: UTF-8 -*- 
  2   
  3  __all__ = [ 
  4      'has_extension', 
  5      'is_package_dir', 
  6      'is_package_file', 
  7      'munge_pkg_info', 
  8      'txt2html', 
  9  ] 
 10   
 11  import os 
 12  import re 
 13  import string 
 14   
 15  import cherrypy as cp 
 16  import turbogears as tg 
 17   
 18  from eggbasket.odict import OrderedDict 
 19   
 20  try: 
 21      from eggbasket.rest import HTML 
 22      tg.config.update({'has_docutils': True}) 
 23  except ImportError: 
 24      tg.config.update({'has_docutils': False, 
 25          'eggbasket.pkg_desc_format': 'plain'}) 
 26   
 27   
 28  _email_rx = re.compile(r'([-\w.+]+@[\w.]+?\.\w+)') 
 37   
38 -def _rewrite_url(urlfield, info):
39 """Set value for info[urlfield] to URL of package info['Name'].""" 40 try: 41 package = info['Name'] 42 except KeyError: 43 raise ValueError('Package name must be present in package info.') 44 else: 45 info[urlfield] = _make_link(get_base_url() + 46 tg.url('/package/%s' % package))
47
48 -def _xform_fieldname(s):
49 """Return s with dashes repleced with spaces and ever word capitalized.""" 50 s = s.replace('-', ' ') 51 return string.capwords(s)
52
53 -def get_base_url():
54 """Return base URL of application. 55 56 Tries to account for 'Host' header and reverse proxing. 57 58 """ 59 base_url = tg.config.get('base_url_filter.base_url') 60 if not base_url: 61 host = cp.request.headers.get('X-Forwarded-For', 62 cp.request.headers['Host']) 63 if host: 64 base_url = '%s://%s' % (cp.request.scheme, host) 65 else: 66 base_url = cp.request.base 67 return base_url
68
69 -def has_extension(filename, extensions=[], case_sensitive=False):
70 """Return True if filename has one of the given extensions, False otherwise. 71 """ 72 if not case_sensitive: 73 filename = filename.lower() 74 for extension in extensions: 75 if not case_sensitive: 76 extension = extension.lower() 77 if filename.endswith(extension): 78 return True 79 return False
80
81 -def is_package_dir(path):
82 """Returns True if path is a directory containing at least one package file. 83 """ 84 if os.path.isdir(path): 85 for filename in os.listdir(path): 86 if is_package_file(filename): 87 return True 88 return False
89
90 -def is_package_file(filename):
91 """Return True if filename ends in one of the known package file extension. 92 """ 93 known_extensions = tg.config.get('eggbasket.package_extensions', []) 94 return has_extension(filename, known_extensions)
95
96 -def munge_pkg_info(pkg_info):
97 """Rewrite package info data for display on meta data view page. 98 99 Turns URLs into links and optionall rewrites hoemapge/download URLs. 100 101 """ 102 new_info = OrderedDict() 103 ordered_fields = tg.config.get('eggbasket.pkg_info.sort_order', []) 104 extra_fields = sorted(list(set(pkg_info.keys()).difference(ordered_fields))) 105 for fieldnames in (ordered_fields, extra_fields): 106 for key in fieldnames: 107 if key in pkg_info: 108 value = pkg_info[key] 109 if not isinstance(value, list): 110 value = _make_link(value) 111 new_info[_xform_fieldname(key)] = value 112 if tg.config.get('eggbasket.rewrite_download_url', False): 113 _rewrite_url('Download Url', new_info) 114 if tg.config.get('eggbasket.rewrite_homepage_url', False): 115 _rewrite_url('Home Page', new_info) 116 return new_info
117
118 -def txt2html(text, use_docutils=True):
119 """Try to convert text into HTML with docutils. 120 121 If conversion fails using docutils is is turned off by the configuration, 122 return text unaltered. 123 124 """ 125 if tg.config.get('has_docutils', False) and use_docutils: 126 try: 127 text = HTML(text, report_level=0, initial_header_level=2) 128 except: pass 129 return text
130