From f8b9b8cda0e5e395d5a8d52ba015e050c3a90dbf Mon Sep 17 00:00:00 2001 From: Doug Hellmann Date: Mon, 22 Dec 2014 20:04:22 +0000 Subject: [PATCH] abstract the project filter logic a bit --- aeromancer/cli/grep.py | 12 ++++-------- aeromancer/project.py | 8 +++----- aeromancer/project_filter.py | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 13 deletions(-) create mode 100644 aeromancer/project_filter.py diff --git a/aeromancer/cli/grep.py b/aeromancer/cli/grep.py index c0acfd2..d7cb92d 100644 --- a/aeromancer/cli/grep.py +++ b/aeromancer/cli/grep.py @@ -4,6 +4,7 @@ import logging import os from aeromancer import project +from aeromancer import project_filter from cliff.command import Command @@ -15,13 +16,7 @@ class Grep(Command): def get_parser(self, prog_name): parser = super(Grep, self).get_parser(prog_name) - parser.add_argument( - '--project', - action='append', - default=[], - dest='projects', - help='projects to limit search', - ) + project_filter.ProjectFilter.add_arguments(parser) parser.add_argument('pattern', action='store', help='regular expression', @@ -31,7 +26,8 @@ class Grep(Command): def take_action(self, parsed_args): session = self.app.get_db_session() pm = project.ProjectManager(session) - for r in pm.grep(parsed_args.pattern, parsed_args.projects): + prj_filt = project_filter.ProjectFilter.from_parsed_args(parsed_args) + for r in pm.grep(parsed_args.pattern, prj_filt): line_num, content, filename, project_name = r print('%s/%s:%s:%s' % (project_name, filename, line_num, content.rstrip()) diff --git a/aeromancer/project.py b/aeromancer/project.py index 5ee91a0..f9d8d4f 100644 --- a/aeromancer/project.py +++ b/aeromancer/project.py @@ -194,7 +194,7 @@ class ProjectManager(object): self._remove_file_data(obj, reason='file no longer exists') self.session.flush() - def grep(self, pattern, projects=[]): + def grep(self, pattern, prj_filter): """Given a pattern, search for lines in files in all projects that match it. Returns results of the query, including the four columns line @@ -210,9 +210,7 @@ class ProjectManager(object): ).join(File, Project).filter( Line.content.op('regexp')(pattern) ) - if projects: - query = query.filter( - Project.name.in_(projects) - ) + if prj_filter: + query = prj_filter.update_query(query) query = query.order_by(Project.name, File.name, Line.number) return query.yield_per(20).all() diff --git a/aeromancer/project_filter.py b/aeromancer/project_filter.py new file mode 100644 index 0000000..f05122c --- /dev/null +++ b/aeromancer/project_filter.py @@ -0,0 +1,36 @@ +import argparse + + +from aeromancer.db.models import Project + + +class ProjectFilter(object): + """Manage the arguments for filtering queries by project. + """ + + @staticmethod + def add_arguments(parser): + """Given an argparse.ArgumentParser add arguments. + """ + grp = parser.add_argument_group('Project Filter') + grp.add_argument( + '--project', + action='append', + default=[], + dest='projects', + help='projects to limit search, by exact name', + ) + + @classmethod + def from_parsed_args(cls, parsed_args): + return cls(projects=parsed_args.projects) + + def __init__(self, projects): + self.projects = projects + + def update_query(self, query): + if self.projects: + query = query.filter( + Project.name.in_(self.projects) + ) + return query