Skip to content

Commit ac61fb2

Browse files
committed
Add 'max-lines' hook
1 parent f4a3980 commit ac61fb2

5 files changed

Lines changed: 111 additions & 9 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.5.0
2+
current_version = 1.6.0
33

44
[bumpversion:file:setup.cfg]
55

.pre-commit-hooks.yaml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,19 @@
3737
- id: no-metadata
3838
name: no-metadata
3939
entry: check-metadata-hook --no-metadata
40-
description: Checks that your PO don't contain metadata headers
40+
description: Checks that your PO files don't contain metadata headers
41+
files: \.po$
42+
language: python
43+
- id: remove-metadata
44+
name: remove-metadata
45+
entry: check-metadata-hook --no-metadata --remove-metadata
46+
description: Removes metadata headers from your PO files
47+
files: \.po$
48+
language: python
49+
- id: check-entries
50+
name: check-entries
51+
entry: check-entries-hook
52+
description: Check that PO files entries match a set of requirements passed by parameters
4153
files: \.po$
4254
language: python
4355
- id: max-messages
@@ -46,6 +58,12 @@
4658
description: Checks that each one of your PO files don't contain more than X messages
4759
files: \.po$
4860
language: python
61+
- id: max-lines
62+
name: max-lines
63+
entry: check-entries-hook --max-lines
64+
description: Checks that each one of your PO files don't contain more than X lines
65+
files: \.po$
66+
language: python
4967
- id: min-translated
5068
name: min-translated
5169
entry: untranslated-messages-hook --min

README.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ 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.5.0
14+
rev: v1.6.0
1515
hooks:
1616
- id: obsolete-messages
1717
- id: untranslated-messages
1818
- id: remove-django-translators
1919
- id: standard-metadata
20+
- id: max-lines
21+
args: ["10000"]
2022
```
2123
2224
## Hooks
@@ -103,6 +105,11 @@ returning exit code 1.
103105
- `-r/--remove/--remove-metadata`: When this option is passed the metadata will
104106
be removed from the files instead of being treated as a lint error.
105107

108+
### **`remove-metadata`**
109+
110+
Remove metadata headers from your PO files. This is an alias for
111+
[`no-metadata` hook][no-metadata-link] passing `--remove-metadata` argument.
112+
106113
### **`max-messages`**
107114

108115
Define a maximum number of entries for each PO file. Pass an interger in the
@@ -118,6 +125,21 @@ first argument:
118125

119126
- Maximum number of messages allowed for each PO file.
120127

128+
### **`max-lines`**
129+
130+
Define a maximum number of lines for each PO file. Pass an interger in the
131+
first argument:
132+
133+
```yaml
134+
- id: max-lines
135+
args:
136+
- "10000"
137+
```
138+
139+
#### Parameters
140+
141+
- Maximum number of lines allowed for each PO file.
142+
121143
### **`min-translated`**
122144

123145
Define a minimum number of files that must be translated in order to pass.
@@ -146,4 +168,5 @@ against the percentage of translated files:
146168

147169
[lreplace-extracted-comments-link]: https://github.com/mondeja/pre-commit-po-hooks#lreplace-extracted-comments
148170
[check-metadata-link]: https://github.com/mondeja/pre-commit-po-hooks#check-metadata
171+
[no-metadata-link]: https://github.com/mondeja/pre-commit-po-hooks#no-metadata
149172
[django-rosetta-lstrip]: https://github.com/mbi/django-rosetta/pull/245

hooks/check_entries.py

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,46 @@ def maximum_number_of_messages(filenames, max_messages=10000, quiet=False):
5050
return exitcode
5151

5252

53+
def maximum_number_of_lines(filenames, max_lines=10000, quiet=False):
54+
"""Check if a set of PO files has more lines than allowed.
55+
56+
Parameters
57+
----------
58+
59+
filenames : list
60+
Set of file names to check.
61+
62+
max_lines : int, optional
63+
Maximum number of lines in each PO file.
64+
65+
quiet : bool, optional
66+
Enabled, don't print output to stderr when more lines than allowed
67+
are found.
68+
69+
Returns
70+
-------
71+
72+
int: 0 if no more than ``max_lines`` lines found for each file,
73+
1 otherwise.
74+
"""
75+
exitcode = 0
76+
77+
for filename in filenames:
78+
with open(filename) as f:
79+
content_lines = f.readlines()
80+
81+
number_of_lines = len(content_lines)
82+
if number_of_lines > max_lines:
83+
exitcode = 1
84+
if not quiet:
85+
sys.stderr.write(
86+
f"More lines ({number_of_lines}) than allowed ({max_lines})"
87+
f" at file {os.path.abspath(filename)}\n"
88+
)
89+
90+
return exitcode
91+
92+
5393
def main():
5494
parser = argparse.ArgumentParser()
5595
parser.add_argument(
@@ -63,20 +103,41 @@ def main():
63103
metavar="NUMBER",
64104
required=False,
65105
default=None,
106+
dest="max_messages",
66107
help=(
67108
"Check the maximum number of messages in each PO file "
68109
"is not greater than the number passed in this parameter."
69110
),
70111
)
112+
parser.add_argument(
113+
"--max-lines",
114+
type=int,
115+
metavar="NUMBER",
116+
required=False,
117+
default=None,
118+
dest="max_lines",
119+
help=(
120+
"Check the maximum number of lines in each PO file is not"
121+
"greater than the number passed in this parameter."
122+
),
123+
)
71124
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-
else:
125+
126+
if not any([args.max_messages, args.max_lines]):
77127
parser.print_help()
78128
return 1
79129

130+
returncodes = [
131+
maximum_number_of_messages(args.filenames, args.max_messages, quiet=args.quiet)
132+
if args.max_messages is not None
133+
else 0,
134+
maximum_number_of_lines(args.filenames, args.max_lines, quiet=args.quiet)
135+
if args.max_lines is not None
136+
else 0,
137+
]
138+
139+
return 1 if any(returncodes) else 0
140+
80141

81142
if __name__ == "__main__":
82143
exit(main())

setup.cfg

Lines changed: 1 addition & 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.5.0
3+
version = 1.6.0
44
description = pre-commit hooks for PO files
55
long_description = file: README.md
66
long_description_content_type = text/markdown

0 commit comments

Comments
 (0)