| #!/usr/bin/python |
| |
| """ |
| Copyright 2014 Google Inc. |
| |
| Use of this source code is governed by a BSD-style license that can be |
| found in the LICENSE file. |
| |
| Utilities for working with URLs. |
| """ |
| |
| # System-level imports |
| import contextlib |
| import os |
| import shutil |
| import urllib |
| import urlparse |
| |
| |
| def create_filepath_url(filepath): |
| """ Returns a file:/// URL pointing at the given filepath on local disk. |
| |
| Args: |
| filepath: string; path to a file on local disk (may be absolute or relative, |
| and the file does not need to exist) |
| |
| Returns: |
| A file:/// URL pointing at the file. Regardless of whether filepath was |
| specified as a relative or absolute path, the URL will contain an |
| absolute path to the file. |
| |
| Raises: |
| An Exception, if filepath is already a URL. |
| """ |
| if urlparse.urlparse(filepath).scheme: |
| raise Exception('"%s" is already a URL' % filepath) |
| return urlparse.urljoin( |
| 'file:', urllib.pathname2url(os.path.abspath(filepath))) |
| |
| |
| def copy_contents(source_url, dest_path, create_subdirs_if_needed=False): |
| """ Copies the full contents of the URL 'source_url' into |
| filepath 'dest_path'. |
| |
| Args: |
| source_url: string; complete URL to read from |
| dest_path: string; complete filepath to write to (may be absolute or |
| relative) |
| create_subdirs_if_needed: boolean; whether to create subdirectories as |
| needed to create dest_path |
| |
| Raises: |
| Some subclass of Exception if unable to read source_url or write dest_path. |
| """ |
| if create_subdirs_if_needed: |
| dest_dir = os.path.dirname(dest_path) |
| if not os.path.exists(dest_dir): |
| os.makedirs(dest_dir) |
| with contextlib.closing(urllib.urlopen(source_url)) as source_handle: |
| with open(dest_path, 'wb') as dest_handle: |
| shutil.copyfileobj(fsrc=source_handle, fdst=dest_handle) |