Top

smashlib.bin.pyack module

pyack

a dumb interface for getting ack data into python

USAGE:

call it with a given search string or directory >>> z = pyack('search_string') >>> z = pyack('search_string directory') >>> z = pyack('search_string directory --whatever-ack-args') >>> z()

number of matching files: >>> len(z) # 291

list of matching files >>> z.files

matching line-no's for a given file. (lineno's are strings): >>> z[filename] [..,]

""" pyack

    a dumb interface for getting ack data into python

    USAGE:

      call it with a given search string or directory
         >>> z = pyack('search_string')
         >>> z = pyack('search_string directory')
         >>> z = pyack('search_string directory --whatever-ack-args')
         >>> z()

      number of matching files:
         >>> len(z) #
         291

      list of matching files
         >>> z.files

      matching line-no's for a given file. (lineno's are strings):
         >>> z[filename]
         [..,]
"""

import os
from collections import defaultdict
from goulash._os import which

ACK_BIN_NAME = 'ack-grep'
ACK_BIN_PATH = which(ACK_BIN_NAME)


class pyack(object):

    """ thin wrapper on ack to get some of the data into python
    """

    def __init__(self, call_string):
        self.call_string = call_string
        self.record = defaultdict(lambda: defaultdict(lambda: []))

    def __len__(self):
        """ """
        return len(self.files)

    def __getitem__(self, key):
        """ given a file, returns matching lines """
        return self.record[key].keys()

    def __call__(self, quiet=False):
        """
            construct self.records such that it looks like
            {file: {lineno:match} }
        """
        cmd = ACK_BIN_PATH + ' ' + self.call_string
        p = os.popen(cmd)
        for x in iter(p.readline, ''):
            if not x:
                continue
            i1 = x.find(':')
            i2 = x.find(':', i1 + 1) + 1
            match = x[i2:]
            _file = x[:i1]
            lineno = x[i1 + 1:i2 - 1]
            self.record[_file][lineno] = match
            if not quiet:
                print x.strip()

    @property
    def files(self):
        """ returns matching files """
        return self.record.keys()


def main():
    import sys
    x = pyack(' '.join(sys.argv[1:]))()
    return x
if __name__ == '__main__':
    main()

Module variables

var ACK_BIN_NAME

var ACK_BIN_PATH

Functions

def main(

)

def main():
    import sys
    x = pyack(' '.join(sys.argv[1:]))()
    return x

Classes

class pyack

thin wrapper on ack to get some of the data into python

class pyack(object):

    """ thin wrapper on ack to get some of the data into python
    """

    def __init__(self, call_string):
        self.call_string = call_string
        self.record = defaultdict(lambda: defaultdict(lambda: []))

    def __len__(self):
        """ """
        return len(self.files)

    def __getitem__(self, key):
        """ given a file, returns matching lines """
        return self.record[key].keys()

    def __call__(self, quiet=False):
        """
            construct self.records such that it looks like
            {file: {lineno:match} }
        """
        cmd = ACK_BIN_PATH + ' ' + self.call_string
        p = os.popen(cmd)
        for x in iter(p.readline, ''):
            if not x:
                continue
            i1 = x.find(':')
            i2 = x.find(':', i1 + 1) + 1
            match = x[i2:]
            _file = x[:i1]
            lineno = x[i1 + 1:i2 - 1]
            self.record[_file][lineno] = match
            if not quiet:
                print x.strip()

    @property
    def files(self):
        """ returns matching files """
        return self.record.keys()

Ancestors (in MRO)

  • pyack
  • __builtin__.object

Instance variables

var call_string

var files

returns matching files

var record

Methods

def __init__(

self, call_string)

def __init__(self, call_string):
    self.call_string = call_string
    self.record = defaultdict(lambda: defaultdict(lambda: []))