Skip to content

Commit db2ef9b

Browse files
committed
Add hook to define maximum number of entries per file
1 parent f7d2ea7 commit db2ef9b

5 files changed

Lines changed: 104 additions & 3 deletions

File tree

.bumpversion.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 1.3.4
2+
current_version = 1.4.0
33

44
[bumpversion:file:setup.cfg]
55

.pre-commit-hooks.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,9 @@
4040
description: Checks that your PO don't contain metadata headers
4141
files: \.po$
4242
language: python
43+
- id: max-messages
44+
name: max-messages
45+
entry: check-entries-hook --max-messages
46+
description: Checks that each one of your PO files don't contain more than X messages
47+
files: \.po$
48+
language: python

README.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Hooks for pre-commit useful working with PO files.
1111

1212
```yaml
1313
- repo: https://github.com/mondeja/pre-commit-po-hooks
14-
rev: v1.3.4
14+
rev: v1.4.0
1515
hooks:
1616
- id: obsolete-messages
1717
- id: untranslated-messages
@@ -96,6 +96,21 @@ returning exit code 1.
9696

9797
- `-r/--remove/--remove-metadata`: When this option is passed the metadata will
9898
be removed from the files instead of being treated as a lint error.
99+
100+
### **`max-messages`**
101+
102+
Define a maximum number of entries for each PO file. Pass an interger in the
103+
first argument:
104+
105+
```yaml
106+
- id: max-messages
107+
args:
108+
- 5000
109+
```
110+
111+
#### Parameters
112+
113+
- Maximum number of messages allowed for each PO file.
99114

100115

101116
[pypi-link]: https://pypi.org/project/pre-commit-po-hooks

hooks/check_entries.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
"""Script that checks entries of PO files."""
2+
3+
import argparse
4+
import os
5+
import sys
6+
7+
8+
def maximum_number_of_messages(filenames, max_messages=10000, quiet=False):
9+
"""Check that the maximum number of messages in each PO file is not
10+
greater than the number passed in the parameter ``max_messages``.
11+
12+
Parameters
13+
----------
14+
15+
filenames : list
16+
Set of file names to check.
17+
18+
max_messages : int, optional
19+
Maximum number of messages in each PO file.
20+
21+
quiet : bool, optional
22+
Enabled, don't print output to stderr when more messages than allowed
23+
are found.
24+
25+
Returns
26+
-------
27+
28+
int: 0 if no more than ``max_messages`` messages found for each file,
29+
1 otherwise.
30+
"""
31+
exitcode = 0
32+
33+
for filename in filenames:
34+
with open(filename) as f:
35+
content_lines = f.readlines()
36+
37+
number_of_messages = 0
38+
for i, line in enumerate(content_lines):
39+
if line.startswith('msgid "'):
40+
number_of_messages += 1
41+
42+
if (number_of_messages - 1) > max_messages:
43+
exitcode = 1
44+
if not quiet:
45+
sys.stderr.write(
46+
f"More messages ({number_of_messages}) than allowed"
47+
f" ({max_messages}) at file {os.path.abspath(filename)}\n"
48+
)
49+
50+
return exitcode
51+
52+
53+
def main():
54+
parser = argparse.ArgumentParser()
55+
parser.add_argument(
56+
"filenames", nargs="*", help="Filenames to check for obsolete messages"
57+
)
58+
parser.add_argument("-q", "--quiet", action="store_true", help="Supress output")
59+
parser.add_argument(
60+
"-m",
61+
"--max-messages",
62+
type=int,
63+
metavar="NUMBER",
64+
required=False,
65+
default=None,
66+
help=(
67+
"Check the maximum number of messages in each PO file "
68+
"is not greater than the number passed in this parameter."
69+
),
70+
)
71+
args = parser.parse_args()
72+
if args.max_messages is not None:
73+
return maximum_number_of_messages(
74+
args.filenames, args.max_messages, quiet=args.quiet
75+
)
76+
77+
78+
if __name__ == "__main__":
79+
exit(main())

setup.cfg

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[metadata]
22
name = pre_commit_po_hooks
3-
version = 1.3.4
3+
version = 1.4.0
44
description = pre-commit hooks for PO files
55
long_description = file: README.md
66
long_description_content_type = text/markdown
@@ -33,6 +33,7 @@ console_scripts =
3333
untranslated-messages-hook = hooks.untranslated_messages:main
3434
lreplace-extracted-comments-hook = hooks.lreplace_extracted_comments:main
3535
check-metadata-hook = hooks.check_metadata:main
36+
check-entries-hook = hooks.check_entries:main
3637

3738
[options.extras_require]
3839
test =

0 commit comments

Comments
 (0)