1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot# Copyright 2014 Google Inc.
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot# Use of this source code is governed by a BSD-style license that can be
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot# found in the LICENSE file.
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot"""Miscellaneous utilities."""
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotimport re
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ReSearch(object):
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot  """A collection of static methods for regexing things."""
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot  @staticmethod
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot  def search_within_stream(input_stream, pattern, default=None):
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    """Search for regular expression in a file-like object.
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Opens a file for reading and searches line by line for a match to
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    the regex and returns the parenthesized group named return for the
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    first match.  Does not search across newlines.
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    For example:
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        pattern = '^root(:[^:]*){4}:(?P<return>[^:]*)'
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        with open('/etc/passwd', 'r') as stream:
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return search_within_file(stream, pattern)
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    should return root's home directory (/root on my system).
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Args:
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        input_stream: file-like object to be read
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        pattern: (string) to be passed to re.compile
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        default: what to return if no match
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Returns:
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        A string or whatever default is
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    """
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    pattern_object = re.compile(pattern)
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for line in input_stream:
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot      match = pattern_object.search(line)
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot      if match:
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return match.group('return')
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return default
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot  @staticmethod
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot  def search_within_string(input_string, pattern, default=None):
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    """Search for regular expression in a string.
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Args:
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        input_string: (string) to be searched
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        pattern: (string) to be passed to re.compile
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        default: what to return if no match
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Returns:
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        A string or whatever default is
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    """
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    match = re.search(pattern, input_string)
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return match.group('return') if match else default
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
60