OLD | NEW |
| (Empty) |
1 #!/usr/bin/python | |
2 | |
3 """ | |
4 Copyright 2014 Google Inc. | |
5 | |
6 Use of this source code is governed by a BSD-style license that can be | |
7 found in the LICENSE file. | |
8 | |
9 Utilities for working with URLs. | |
10 | |
11 TODO(epoger): move this into tools/utils for broader use? | |
12 """ | |
13 | |
14 # System-level imports | |
15 import contextlib | |
16 import os | |
17 import shutil | |
18 import urllib | |
19 import urlparse | |
20 | |
21 | |
22 def create_filepath_url(filepath): | |
23 """ Returns a file:/// URL pointing at the given filepath on local disk. | |
24 | |
25 Args: | |
26 filepath: string; path to a file on local disk (may be absolute or relative, | |
27 and the file does not need to exist) | |
28 | |
29 Returns: | |
30 A file:/// URL pointing at the file. Regardless of whether filepath was | |
31 specified as a relative or absolute path, the URL will contain an | |
32 absolute path to the file. | |
33 | |
34 Raises: | |
35 An Exception, if filepath is already a URL. | |
36 """ | |
37 if urlparse.urlparse(filepath).scheme: | |
38 raise Exception('"%s" is already a URL' % filepath) | |
39 return urlparse.urljoin( | |
40 'file:', urllib.pathname2url(os.path.abspath(filepath))) | |
41 | |
42 | |
43 def copy_contents(source_url, dest_path, create_subdirs_if_needed=False): | |
44 """ Copies the full contents of the URL 'source_url' into | |
45 filepath 'dest_path'. | |
46 | |
47 Args: | |
48 source_url: string; complete URL to read from | |
49 dest_path: string; complete filepath to write to (may be absolute or | |
50 relative) | |
51 create_subdirs_if_needed: boolean; whether to create subdirectories as | |
52 needed to create dest_path | |
53 | |
54 Raises: | |
55 Some subclass of Exception if unable to read source_url or write dest_path. | |
56 """ | |
57 if create_subdirs_if_needed: | |
58 dest_dir = os.path.dirname(dest_path) | |
59 if not os.path.exists(dest_dir): | |
60 os.makedirs(dest_dir) | |
61 with contextlib.closing(urllib.urlopen(source_url)) as source_handle: | |
62 with open(dest_path, 'wb') as dest_handle: | |
63 shutil.copyfileobj(fsrc=source_handle, fdst=dest_handle) | |
OLD | NEW |