mirror of
https://github.com/pre-commit/pre-commit-hooks.git
synced 2026-04-07 12:26:52 +00:00
Adding detect-raw-datetime-manipulation option
This commit is contained in:
parent
2dbaced650
commit
6932b83509
8 changed files with 161 additions and 1 deletions
|
|
@ -105,6 +105,12 @@
|
||||||
entry: detect-private-key
|
entry: detect-private-key
|
||||||
language: python
|
language: python
|
||||||
types: [text]
|
types: [text]
|
||||||
|
- id: detect-datetime-raw-manipulation
|
||||||
|
name: Detect Raw datetime manipulation
|
||||||
|
description: Detects the raw manipulation of datetime.
|
||||||
|
entry: detect-datetime-raw-manipulation
|
||||||
|
language: python
|
||||||
|
types: [text]
|
||||||
- id: double-quote-string-fixer
|
- id: double-quote-string-fixer
|
||||||
name: Fix double quoted strings
|
name: Fix double quoted strings
|
||||||
description: This hook replaces double quoted strings with single quoted strings
|
description: This hook replaces double quoted strings with single quoted strings
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,7 @@ Add this to your `.pre-commit-config.yaml`
|
||||||
- `--allow-missing-credentials` - Allow hook to pass when no credentials are
|
- `--allow-missing-credentials` - Allow hook to pass when no credentials are
|
||||||
detected.
|
detected.
|
||||||
- `detect-private-key` - Checks for the existence of private keys.
|
- `detect-private-key` - Checks for the existence of private keys.
|
||||||
|
- `detect-datetime-raw-manipulation` - Check for raw manipulation of datetime.
|
||||||
- `double-quote-string-fixer` - This hook replaces double quoted strings
|
- `double-quote-string-fixer` - This hook replaces double quoted strings
|
||||||
with single quoted strings.
|
with single quoted strings.
|
||||||
- `end-of-file-fixer` - Makes sure files end in a newline and only a newline.
|
- `end-of-file-fixer` - Makes sure files end in a newline and only a newline.
|
||||||
|
|
|
||||||
43
pre_commit_hooks/detect_datetime_raw_manipulation.py
Normal file
43
pre_commit_hooks/detect_datetime_raw_manipulation.py
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
from __future__ import print_function
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
DT_MANIPULATION_RE = re.compile(
|
||||||
|
r'[+-]=?\s?datetime.timedelta\(|[+-]=?\s?timedelta\(|.replace\(.*tzinfo=|datetime\(.*tzinfo=',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _check_file(filename):
|
||||||
|
return_value = 0
|
||||||
|
with open(filename, 'r') as f:
|
||||||
|
for i, line in enumerate(f, 1):
|
||||||
|
if DT_MANIPULATION_RE.search(line):
|
||||||
|
if line.strip().endswith(' # safe_dt_op') or line.strip().startswith('#'):
|
||||||
|
continue
|
||||||
|
|
||||||
|
sys.stdout.write('{}:{}: {}'.format(filename, i, line))
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
return_value += 1
|
||||||
|
|
||||||
|
return return_value
|
||||||
|
|
||||||
|
|
||||||
|
def main(argv=None):
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('filenames', nargs='*')
|
||||||
|
args = parser.parse_args(argv)
|
||||||
|
|
||||||
|
return_value = 0
|
||||||
|
for filename in args.filenames:
|
||||||
|
result = _check_file(filename)
|
||||||
|
return_value |= 1 if result > 0 else 0
|
||||||
|
|
||||||
|
return return_value
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
exit(main())
|
||||||
4
setup.py
4
setup.py
|
|
@ -6,7 +6,7 @@ setup(
|
||||||
name='pre_commit_hooks',
|
name='pre_commit_hooks',
|
||||||
description='Some out-of-the-box hooks for pre-commit.',
|
description='Some out-of-the-box hooks for pre-commit.',
|
||||||
url='https://github.com/pre-commit/pre-commit-hooks',
|
url='https://github.com/pre-commit/pre-commit-hooks',
|
||||||
version='2.0.0',
|
version='2.1.0',
|
||||||
|
|
||||||
author='Anthony Sottile',
|
author='Anthony Sottile',
|
||||||
author_email='asottile@umich.edu',
|
author_email='asottile@umich.edu',
|
||||||
|
|
@ -47,6 +47,8 @@ setup(
|
||||||
'debug-statement-hook = pre_commit_hooks.debug_statement_hook:main',
|
'debug-statement-hook = pre_commit_hooks.debug_statement_hook:main',
|
||||||
'detect-aws-credentials = pre_commit_hooks.detect_aws_credentials:main',
|
'detect-aws-credentials = pre_commit_hooks.detect_aws_credentials:main',
|
||||||
'detect-private-key = pre_commit_hooks.detect_private_key:detect_private_key',
|
'detect-private-key = pre_commit_hooks.detect_private_key:detect_private_key',
|
||||||
|
'detect-datetime-raw-manipulation = '
|
||||||
|
'pre_commit_hooks.detect_datetime_raw_manipulation:detect_datetime_raw_manipulation',
|
||||||
'double-quote-string-fixer = pre_commit_hooks.string_fixer:main',
|
'double-quote-string-fixer = pre_commit_hooks.string_fixer:main',
|
||||||
'end-of-file-fixer = pre_commit_hooks.end_of_file_fixer:end_of_file_fixer',
|
'end-of-file-fixer = pre_commit_hooks.end_of_file_fixer:end_of_file_fixer',
|
||||||
'file-contents-sorter = pre_commit_hooks.file_contents_sorter:main',
|
'file-contents-sorter = pre_commit_hooks.file_contents_sorter:main',
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
import datetime
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
|
|
||||||
|
def dummy_func(inp):
|
||||||
|
print(inp)
|
||||||
|
|
||||||
|
|
||||||
|
def move_time_forward():
|
||||||
|
now = datetime.datetime.now()
|
||||||
|
|
||||||
|
# Check commented out lines
|
||||||
|
# now += timedelta(days=1)
|
||||||
|
# now += datetime.timedelta(weeks=1)
|
||||||
|
#
|
||||||
|
# now -= timedelta(weeks=1)
|
||||||
|
# now -= timedelta(weeks=2)
|
||||||
|
#
|
||||||
|
# now = now.replace(hour=2)
|
||||||
|
# now = now.replace(tzinfo=None)
|
||||||
|
# now = now.replace(hour=1, tzinfo=pytz.utc)
|
||||||
|
|
||||||
|
# Test regular usage of timedelta & datetime
|
||||||
|
dummy_func(timedelta(days=1))
|
||||||
|
dummy_func(datetime.datetime(2018, 10, 11, 2, 3, 4, 450000))
|
||||||
|
|
||||||
|
print(now)
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
import datetime
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
|
import pytz
|
||||||
|
|
||||||
|
|
||||||
|
def move_time_forward():
|
||||||
|
now = datetime.datetime.now()
|
||||||
|
timezone = pytz.utc
|
||||||
|
|
||||||
|
# 1
|
||||||
|
now = datetime.datetime(now.year, now.month, now.day, hour=8, minute=0, tzinfo=timezone)
|
||||||
|
|
||||||
|
# 2
|
||||||
|
now += timedelta(days=1)
|
||||||
|
# 3
|
||||||
|
now += datetime.timedelta(weeks=1)
|
||||||
|
# 4
|
||||||
|
now = now + timedelta(seconds=1)
|
||||||
|
|
||||||
|
# 5
|
||||||
|
now -= datetime.timedelta(weeks=1)
|
||||||
|
# 6
|
||||||
|
now -= timedelta(weeks=2)
|
||||||
|
# 7
|
||||||
|
now = now - timedelta(seconds=1)
|
||||||
|
|
||||||
|
now = now.replace(hour=2)
|
||||||
|
# 8
|
||||||
|
now = now.replace(tzinfo=None)
|
||||||
|
# 9
|
||||||
|
now = now.replace(hour=1, tzinfo=pytz.utc)
|
||||||
|
|
||||||
|
# 10
|
||||||
|
now = datetime.datetime(2018, 10, 11, 2, 3, 4, 450000, tzinfo=pytz.utc)
|
||||||
|
|
||||||
|
print(now)
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
import datetime
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
|
import pytz
|
||||||
|
|
||||||
|
|
||||||
|
def move_time_forward():
|
||||||
|
now = datetime.datetime.now()
|
||||||
|
|
||||||
|
now += timedelta(days=1) # safe_dt_op
|
||||||
|
now += datetime.timedelta(weeks=1) # safe_dt_op
|
||||||
|
|
||||||
|
now -= timedelta(weeks=1) # safe_dt_op
|
||||||
|
now -= timedelta(weeks=2) # safe_dt_op
|
||||||
|
|
||||||
|
now = now.replace(hour=2)
|
||||||
|
now = now.replace(tzinfo=None) # safe_dt_op
|
||||||
|
now = now.replace(hour=1, tzinfo=pytz.utc) # safe_dt_op
|
||||||
|
|
||||||
|
print(now)
|
||||||
24
tests/detect_raw_datetime_manipulation_test.py
Normal file
24
tests/detect_raw_datetime_manipulation_test.py
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from pre_commit_hooks.detect_datetime_raw_manipulation import _check_file
|
||||||
|
from pre_commit_hooks.detect_datetime_raw_manipulation import main
|
||||||
|
from testing.util import get_resource_path
|
||||||
|
|
||||||
|
|
||||||
|
def test_flagged_file():
|
||||||
|
rc = main([get_resource_path('detect_datetime_raw_manipulation/raw_timedelta_usage__flag.py')])
|
||||||
|
assert rc == 1
|
||||||
|
|
||||||
|
result = _check_file(get_resource_path('detect_datetime_raw_manipulation/raw_timedelta_usage__flag.py'))
|
||||||
|
assert result == 10
|
||||||
|
|
||||||
|
|
||||||
|
def test_flagged_ignore():
|
||||||
|
rc = main([get_resource_path('detect_datetime_raw_manipulation/raw_timedelta_usage__ignore.py')])
|
||||||
|
assert rc == 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_flagged_clean():
|
||||||
|
rc = main([get_resource_path('detect_datetime_raw_manipulation/raw_timedelta_usage__clean.py')])
|
||||||
|
assert rc == 0
|
||||||
Loading…
Add table
Add a link
Reference in a new issue