Skip to content

Commit fbc4c37

Browse files
authored
Merge pull request #124 from macbre/tables-skip-tables-cli-options
Process only selected tables when --tables / --skip-tables option is provided
2 parents fa19f9b + fbed374 commit fbc4c37

File tree

4 files changed

+107
-11
lines changed

4 files changed

+107
-11
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ lint:
2020
pylint $(project_name)/ --ignore=test
2121

2222
demo:
23-
index_digest mysql://index_digest:qwerty@127.0.0.1/index_digest --sql-log sql/0002-not-used-indices-log --analyze-data --skip-checks=non_utf_columns
23+
index_digest mysql://index_digest:qwerty@127.0.0.1/index_digest --sql-log sql/0002-not-used-indices-log --analyze-data --skip-checks=non_utf_columns --skip-tables=0028_no_time
2424

2525
sql-console:
2626
mysql --protocol=tcp -uindex_digest -pqwerty index_digest

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ index_digest
5050
Analyses your database queries and schema and suggests indices improvements.
5151
5252
Usage:
53-
index_digest DSN [--sql-log=<file>] [--format=<formatter>] [--analyze-data] [--checks=<checks> | --skip-checks=<skip-checks>]
53+
index_digest DSN [--sql-log=<file>] [--format=<formatter>] [--analyze-data] [--checks=<checks> | --skip-checks=<skip-checks>] [--tables=<tables> | --skip-tables=<skip-tables>]
5454
index_digest (-h | --help)
5555
index_digest --version
5656
@@ -61,6 +61,8 @@ Options:
6161
--analyze-data Run additional checks that will query table data (can be slow!)
6262
--checks=<list> Comma-separated lists of checks to report
6363
--skip-checks=<list> Comma-separated lists of checks to skip from report
64+
--tables=<list> Comma-separated lists of tables to report
65+
--skip-tables=<list> Comma-separated lists of tables to skip from report
6466
-h --help Show this screen.
6567
--version Show version.
6668
@@ -69,6 +71,7 @@ Examples:
6971
index_digest mysql://index_digest:qwerty@localhost/index_digest --sql-log=sql.log
7072
index_digest mysql://index_digest:qwerty@localhost/index_digest --skip-checks=non_utf_columns
7173
index_digest mysql://index_digest:qwerty@localhost/index_digest --analyze-data --checks=data_too_old,data_not_updated_recently
74+
index_digest mysql://index_digest:qwerty@localhost/index_digest --analyze-data --skip-tables=DATABASECHANGELOG,DATABASECHANGELOGLOCK
7275
7376
Visit <https://github.com/macbre/index-digest>
7477
```

indexdigest/cli/script.py

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
Analyses your database queries and schema and suggests indices improvements.
55
66
Usage:
7-
index_digest DSN [--sql-log=<file>] [--format=<formatter>] [--analyze-data] [--checks=<checks> | --skip-checks=<skip-checks>]
7+
index_digest DSN [--sql-log=<file>] [--format=<formatter>] [--analyze-data] [--checks=<checks> | --skip-checks=<skip-checks>] [--tables=<tables> | --skip-tables=<skip-tables>]
88
index_digest (-h | --help)
99
index_digest --version
1010
@@ -15,6 +15,8 @@
1515
--analyze-data Run additional checks that will query table data (can be slow!)
1616
--checks=<list> Comma-separated lists of checks to report
1717
--skip-checks=<list> Comma-separated lists of checks to skip from report
18+
--tables=<list> Comma-separated lists of tables to report
19+
--skip-tables=<list> Comma-separated lists of tables to skip from report
1820
-h --help Show this screen.
1921
--version Show version.
2022
@@ -23,6 +25,7 @@
2325
index_digest mysql://index_digest:qwerty@localhost/index_digest --sql-log=sql.log
2426
index_digest mysql://index_digest:qwerty@localhost/index_digest --skip-checks=non_utf_columns
2527
index_digest mysql://index_digest:qwerty@localhost/index_digest --analyze-data --checks=data_too_old,data_not_updated_recently
28+
index_digest mysql://index_digest:qwerty@localhost/index_digest --analyze-data --skip-tables=DATABASECHANGELOG,DATABASECHANGELOGLOCK
2629
2730
Visit <https://github.com/macbre/index-digest>
2831
"""
@@ -122,7 +125,7 @@ def get_reports(database, sql_log=None, analyze_data=False):
122125
return reports
123126

124127

125-
def filter_reports(reports, checks=None, skip_checks=None):
128+
def filter_reports_by_type(reports, checks=None, skip_checks=None):
126129
"""
127130
:type reports list[indexdigest.utils.LinterEntry]
128131
:type checks str
@@ -144,6 +147,28 @@ def filter_reports(reports, checks=None, skip_checks=None):
144147
return reports
145148

146149

150+
def filter_reports_by_table(reports, tables=None, skip_tables=None):
151+
"""
152+
:type reports list[indexdigest.utils.LinterEntry]
153+
:type tables str
154+
:type skip_tables str
155+
:rtype: list[indexdigest.utils.LinterEntry]
156+
"""
157+
if tables:
158+
return [
159+
report for report in reports
160+
if report.table_name in tables.split(',')
161+
]
162+
163+
if skip_tables:
164+
return [
165+
report for report in reports
166+
if report.table_name not in skip_tables.split(',')
167+
]
168+
169+
return reports
170+
171+
147172
def main():
148173
""" Main entry point for CLI"""
149174
logger = logging.getLogger(__name__)
@@ -165,12 +190,19 @@ def main():
165190
)
166191

167192
# handle --checks / --skip-checks
168-
reports = filter_reports(
193+
reports = filter_reports_by_type(
169194
reports,
170195
checks=arguments.get('--checks'),
171196
skip_checks=arguments.get('--skip-checks')
172197
)
173198

199+
# handle --tables / --skip-tables
200+
reports = filter_reports_by_table(
201+
reports,
202+
tables=arguments.get('--tables'),
203+
skip_tables=arguments.get('--skip-tables')
204+
)
205+
174206
# handle --format
175207
formatter = arguments.get('--format') or 'plain'
176208
logger.info("Using formatter: %s", formatter)

indexdigest/test/test_script.py

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from unittest import TestCase
22

3-
from indexdigest.cli.script import filter_reports
3+
from indexdigest.cli.script import filter_reports_by_type, filter_reports_by_table
44
from indexdigest.utils import LinterEntry
55

66

7-
class TestFormatterIntegrationTest(TestCase):
7+
class FilterReportsByTypeTest(TestCase):
88

99
REPORT_TYPES = [
1010
'foo',
@@ -28,15 +28,15 @@ def get_reports_mock(linter_types):
2828
def test_noop(self):
2929
reports = self.get_reports_mock(self.REPORT_TYPES)
3030

31-
filtered = filter_reports(reports)
31+
filtered = filter_reports_by_type(reports)
3232
print(filtered)
3333

3434
assert len(filtered) == len(self.REPORT_TYPES)
3535

3636
def test_checks_switch(self):
3737
reports = self.get_reports_mock(self.REPORT_TYPES)
3838

39-
filtered = filter_reports(reports, checks='foo,test')
39+
filtered = filter_reports_by_type(reports, checks='foo,test')
4040
print(filtered)
4141

4242
assert len(filtered) == 3
@@ -47,7 +47,7 @@ def test_checks_switch(self):
4747
def test_checks_switch_single(self):
4848
reports = self.get_reports_mock(self.REPORT_TYPES)
4949

50-
filtered = filter_reports(reports, checks='test')
50+
filtered = filter_reports_by_type(reports, checks='test')
5151
print(filtered)
5252

5353
assert len(filtered) == 2
@@ -57,9 +57,70 @@ def test_checks_switch_single(self):
5757
def test_skip_checks_switch(self):
5858
reports = self.get_reports_mock(self.REPORT_TYPES)
5959

60-
filtered = filter_reports(reports, skip_checks='foo,test')
60+
filtered = filter_reports_by_type(reports, skip_checks='foo,test')
6161
print(filtered)
6262

6363
assert len(filtered) == 2
6464
assert filtered[0].linter_type == 'bar'
6565
assert filtered[1].linter_type == 'foobar'
66+
67+
68+
class FilterReportsByTableTest(TestCase):
69+
70+
REPORT_TABLES = [
71+
'foo',
72+
'bar',
73+
'test',
74+
'test',
75+
'foobar',
76+
]
77+
78+
@staticmethod
79+
def get_reports_mock(tables):
80+
"""
81+
:type tables list[str]
82+
:rtype: list[LinterEntry]
83+
"""
84+
return [
85+
LinterEntry(linter_type='foo', table_name=table, message='message')
86+
for table in tables
87+
]
88+
89+
def test_noop(self):
90+
reports = self.get_reports_mock(self.REPORT_TABLES)
91+
92+
filtered = filter_reports_by_table(reports)
93+
print(filtered)
94+
95+
assert len(filtered) == len(self.REPORT_TABLES)
96+
97+
def test_tables_switch(self):
98+
reports = self.get_reports_mock(self.REPORT_TABLES)
99+
100+
filtered = filter_reports_by_table(reports, tables='foo,test')
101+
print(filtered)
102+
103+
assert len(filtered) == 3
104+
assert filtered[0].table_name == 'foo'
105+
assert filtered[1].table_name == 'test'
106+
assert filtered[2].table_name == 'test'
107+
108+
def test_tables_switch_single(self):
109+
reports = self.get_reports_mock(self.REPORT_TABLES)
110+
111+
filtered = filter_reports_by_table(reports, tables='test')
112+
print(filtered)
113+
114+
assert len(filtered) == 2
115+
assert filtered[0].table_name == 'test'
116+
assert filtered[1].table_name == 'test'
117+
118+
def test_skip_tables_switch(self):
119+
reports = self.get_reports_mock(self.REPORT_TABLES)
120+
121+
filtered = filter_reports_by_table(reports, skip_tables='foo,test')
122+
print(filtered)
123+
124+
assert len(filtered) == 2
125+
assert filtered[0].table_name == 'bar'
126+
assert filtered[1].table_name == 'foobar'

0 commit comments

Comments
 (0)