OLD | NEW |
1 # Copyright (c) 2009, Google Inc. All rights reserved. | 1 # Copyright (c) 2009, Google Inc. All rights reserved. |
2 # | 2 # |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 return list_items | 89 return list_items |
90 | 90 |
91 try: | 91 try: |
92 indices = [] | 92 indices = [] |
93 for value in re.split("\s*,\s*", response): | 93 for value in re.split("\s*,\s*", response): |
94 parts = value.split('-') | 94 parts = value.split('-') |
95 if len(parts) == 2: | 95 if len(parts) == 2: |
96 indices += range(int(parts[0]) - 1, int(parts[1])) | 96 indices += range(int(parts[0]) - 1, int(parts[1])) |
97 else: | 97 else: |
98 indices.append(int(value) - 1) | 98 indices.append(int(value) - 1) |
99 except ValueError as err: | 99 except ValueError: |
100 continue | 100 continue |
101 | 101 |
102 return [list_items[i] for i in indices] | 102 return [list_items[i] for i in indices] |
103 else: | 103 else: |
104 try: | 104 try: |
105 result = int(cls.prompt("Enter a number: ", raw_input=raw_in
put)) - 1 | 105 result = int(cls.prompt("Enter a number: ", raw_input=raw_in
put)) - 1 |
106 except ValueError as err: | 106 except ValueError: |
107 continue | 107 continue |
108 return list_items[result] | 108 return list_items[result] |
109 | 109 |
110 @classmethod | 110 @classmethod |
111 def prompt_with_list(cls, list_title, list_items, can_choose_multiple=False,
raw_input=raw_input): | 111 def prompt_with_list(cls, list_title, list_items, can_choose_multiple=False,
raw_input=raw_input): |
112 print list_title | 112 print list_title |
113 i = 0 | 113 i = 0 |
114 for item in list_items: | 114 for item in list_items: |
115 i += 1 | 115 i += 1 |
116 print "%2d. %s" % (i, item) | 116 print "%2d. %s" % (i, item) |
117 return cls._wait_on_list_response(list_items, can_choose_multiple, raw_i
nput) | 117 return cls._wait_on_list_response(list_items, can_choose_multiple, raw_i
nput) |
118 | 118 |
119 def edit(self, files): | 119 def edit(self, files): |
120 editor = os.environ.get("EDITOR") or "vi" | 120 editor = os.environ.get("EDITOR") or "vi" |
121 args = shlex.split(editor) | 121 args = shlex.split(editor) |
122 # Note: Not thread safe: http://bugs.python.org/issue2320 | 122 # Note: Not thread safe: http://bugs.python.org/issue2320 |
123 subprocess.call(args + files) | 123 subprocess.call(args + files) |
124 | 124 |
125 def page(self, message): | 125 def page(self, message): |
126 pager = os.environ.get("PAGER") or "less" | 126 pager = os.environ.get("PAGER") or "less" |
127 try: | 127 try: |
128 # Note: Not thread safe: http://bugs.python.org/issue2320 | 128 # Note: Not thread safe: http://bugs.python.org/issue2320 |
129 child_process = subprocess.Popen([pager], stdin=subprocess.PIPE) | 129 child_process = subprocess.Popen([pager], stdin=subprocess.PIPE) |
130 child_process.communicate(input=message) | 130 child_process.communicate(input=message) |
131 except IOError as e: | 131 except IOError: |
132 pass | 132 pass |
133 | 133 |
134 def confirm(self, message=None, default=DEFAULT_YES, raw_input=raw_input): | 134 def confirm(self, message=None, default=DEFAULT_YES, raw_input=raw_input): |
135 if not message: | 135 if not message: |
136 message = "Continue?" | 136 message = "Continue?" |
137 choice = {'y': 'Y/n', 'n': 'y/N'}[default] | 137 choice = {'y': 'Y/n', 'n': 'y/N'}[default] |
138 response = raw_input("%s [%s]: " % (message, choice)) | 138 response = raw_input("%s [%s]: " % (message, choice)) |
139 if not response: | 139 if not response: |
140 response = default | 140 response = default |
141 return response.lower() == 'y' | 141 return response.lower() == 'y' |
142 | 142 |
143 def can_open_url(self): | 143 def can_open_url(self): |
144 try: | 144 try: |
145 webbrowser.get() | 145 webbrowser.get() |
146 return True | 146 return True |
147 except webbrowser.Error as e: | 147 except webbrowser.Error: |
148 return False | 148 return False |
149 | 149 |
150 def open_url(self, url): | 150 def open_url(self, url): |
151 if not self.can_open_url(): | 151 if not self.can_open_url(): |
152 _log.warn("Failed to open %s" % url) | 152 _log.warn("Failed to open %s" % url) |
153 webbrowser.open(url) | 153 webbrowser.open(url) |
OLD | NEW |