Source code for pymyinstall.installcustom.install_custom

"""
Various functions to install some application such as `pandoc <http://johnmacfarlane.net/pandoc/>`_.


:githublink:`%|py|5`
"""
from __future__ import print_function
import os
import sys
from ..installhelper.install_memoize import install_memoize2
from ..installhelper.internet_settings import default_user_agent

if sys.version_info[0] == 2:
    FileNotFoundError = Exception
    import urllib2 as urllib_request
    import urllib2 as urllib_error
    import httplib as http_client
else:
    import urllib.request as urllib_request
    import urllib.error as urllib_error
    import http.client as http_client


[docs]class DownloadException(Exception): """ Cannot download. :githublink:`%|py|25` """ pass
@install_memoize2 def download_page(url, is406=False): """ Downloads a page from a url. :param url: url :param is406: if the function raised *HTTP Error 406*, try *True* :return: content .. versionchanged:: 1.1 Parameter *is406* was added. :githublink:`%|py|40` """ agent = "Mozilla" if is406 else default_user_agent try: req = urllib_request.Request( url, headers={ 'User-agent': agent}) u = urllib_request.urlopen(req) text = u.read() u.close() except urllib_error.HTTPError as e: raise DownloadException( "Unable to get archive from: '" + url + "'.") from e except urllib_error.URLError as e: raise DownloadException( "Unable to get archive from: '" + url + "'.") from e except ConnectionResetError as e: raise DownloadException( "Unable to get archive from: '" + url + "'.") from e typstr = str # unicode# return typstr(text, encoding="utf8")
[docs]def download_file(url, outfile, fLOG=None): """ Downloads a file from a url, the function does not download the file again if outfile already exists. :param url: url :param outfile: outfile :param fLOG: logging function :return: outfile :githublink:`%|py|72` """ if os.path.exists(outfile): return outfile try: if fLOG: fLOG("[pymy] download", url) req = urllib_request.Request( url, headers={ 'User-agent': default_user_agent}, ) u = urllib_request.urlopen(req) text = u.read() u.close() except urllib_error.HTTPError as e: raise DownloadException( "Unable to get archive from '{}'.".format(url)) from e except urllib_error.URLError as e: raise DownloadException( "Unable to get archive from '{}'.".format(url)) from e except http_client.IncompleteRead as ee: raise DownloadException( "unable to complete reading from: " + url) from ee with open(outfile, "wb") as f: f.write(text) return outfile
[docs]def download_from_sourceforge(url, outfile, fLOG=print, temp_folder="."): """ Downloads a file from a url using redirection, the function does not download the file again if outfile already exists. :param url: url :param outfile: outfile :param fLOG: logging function :param temp_folder: only used if installation of module requests is needed :return: outfile The function will install module `requests <http://docs.python-requests.org/en/latest/>`_ if not present. :githublink:`%|py|117` """ if os.path.exists(outfile): return outfile try: import requests except ImportError: fLOG("[pymy] installing module requests") from ..installhelper.module_install import ModuleInstall ModuleInstall("requests", fLOG=fLOG).install(temp_folder=temp_folder) import requests try: req = requests.get(url, allow_redirects=True, stream=True) text = req.raw.read() fLOG("[pymy] len ", len(text)) except urllib_error.HTTPError as e: raise DownloadException("unable to get archive from: " + url) from e except requests.exceptions.ConnectionError as ee: raise DownloadException("unable to get archive from: " + url) from ee if len(text) < 20 and text.decode( "ascii").lower().startswith("bad request"): raise Exception("Bad Request for url: " + url) with open(outfile, "wb") as f: f.write(text) return outfile
[docs]def where_in_path(name): """ Looks for a file in current directory and in every path in ``PATH``. :param name: name of the file to look for :return: None if not found, the absolute filename otherwise :githublink:`%|py|154` """ if os.path.exists(name): return os.path.abspath(name) else: path = os.environ["PATH"] if path: spl = path.split(";") for p in spl: new_name = os.path.join(p, name) if os.path.exists(new_name): return new_name return None