Rename to linter
This commit is contained in:
1 parent
69cf2fe7b5
commit
3b7d567d72
3 files changed
+17
-19
No files matched your search
@@ -1,10 +1,10 @@
|
|||||||
# Django migration checker
|
# Django migration linter
|
||||||
|
|
||||||
Detect backward incompatible migrations for your django projects. All in one file.
|
Detect backward incompatible migrations for your django project. All in one file.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
`python migration_checker.py DJANGO_PROJECT_FOLDER [GIT_COMMIT_ID] [--ignore-name-contains=IGNORE_NAME_CONTAINS] [--include-apps INCLUDE_APPS [INCLUDE_APPS ...] | --exclude-apps EXCLUDE_APPS [EXCLUDE_APPS ...]]`
|
`python migration_linter.py DJANGO_PROJECT_FOLDER [GIT_COMMIT_ID] [--ignore-name-contains=IGNORE_NAME_CONTAINS] [--include-apps INCLUDE_APPS [INCLUDE_APPS ...] | --exclude-apps EXCLUDE_APPS [EXCLUDE_APPS ...]]`
|
||||||
|
|
||||||
* `DJANGO_PROJECT_FOLDER` - an absolute or relative path to the django project.
|
* `DJANGO_PROJECT_FOLDER` - an absolute or relative path to the django project.
|
||||||
* `GIT_COMMIT_ID` - if specified, only migrations since this commit will be taken into account. If not specified, the initial repo commit will be used.
|
* `GIT_COMMIT_ID` - if specified, only migrations since this commit will be taken into account. If not specified, the initial repo commit will be used.
|
||||||
@@ -20,20 +20,17 @@ Needed software (in PATH):
|
|||||||
* `git`
|
* `git`
|
||||||
* UNIX command line tools like `tail`
|
* UNIX command line tools like `tail`
|
||||||
|
|
||||||
The checker will try to detect whether if the project is a django project and is versioned with git.
|
The linter will try to detect whether if the project is a django project and is versioned with git.
|
||||||
|
|
||||||
## Tests
|
## Tests
|
||||||
|
|
||||||
Launch the tests with: `python -m unittest test_migration_checker`
|
Launch the tests with: `python -m unittest test_migration_linter`
|
||||||
|
|
||||||
More test are to be written.
|
More test are to be written.
|
||||||
|
|
||||||
## Improvements
|
## Improvements
|
||||||
|
|
||||||
|
* Add an appropriate license
|
||||||
* More tests (always!)
|
* More tests (always!)
|
||||||
* Detect data migration (not only scheme migrations)
|
* Detect data migration (not only scheme migrations)
|
||||||
* Detection dependent on specified database (mysql, postgresql, ...)
|
* Detection dependent on specified database (mysql, postgresql, ...)
|
||||||
|
|
||||||
## Credits
|
|
||||||
|
|
||||||
[3YOURMIND GmbH](https://www.3yourmind.com)
|
|
||||||
@@ -5,7 +5,7 @@ import re
|
|||||||
from subprocess import Popen, PIPE
|
from subprocess import Popen, PIPE
|
||||||
|
|
||||||
|
|
||||||
class MigrationChecker:
|
class MigrationLinter:
|
||||||
MIGRATION_FOLDER_NAME = 'migrations'
|
MIGRATION_FOLDER_NAME = 'migrations'
|
||||||
|
|
||||||
migration_tests = (
|
migration_tests = (
|
||||||
@@ -52,7 +52,7 @@ class MigrationChecker:
|
|||||||
if diff_process.returncode != 0:
|
if diff_process.returncode != 0:
|
||||||
raise Exception('Error while executing git diff command')
|
raise Exception('Error while executing git diff command')
|
||||||
|
|
||||||
def check_migrations(self):
|
def lint_migrations(self):
|
||||||
nb_valid = 0
|
nb_valid = 0
|
||||||
nb_erroneous = 0
|
nb_erroneous = 0
|
||||||
nb_ignore = 0
|
nb_ignore = 0
|
||||||
@@ -80,10 +80,11 @@ class MigrationChecker:
|
|||||||
print('*** Summary:')
|
print('*** Summary:')
|
||||||
print('Valid migrations: {0}/{1} - erroneous migrations: {2}/{1} - ignored migrations: {3}/{1}'.format(nb_valid, len(self.changed_migration_files), nb_erroneous, nb_ignore))
|
print('Valid migrations: {0}/{1} - erroneous migrations: {2}/{1} - ignored migrations: {3}/{1}'.format(nb_valid, len(self.changed_migration_files), nb_erroneous, nb_ignore))
|
||||||
|
|
||||||
def _split_migration_path(self, migration_path):
|
@classmethod
|
||||||
|
def _split_migration_path(cls, migration_path):
|
||||||
decomposed_path = split_path(migration_path)
|
decomposed_path = split_path(migration_path)
|
||||||
for i, p in enumerate(decomposed_path):
|
for i, p in enumerate(decomposed_path):
|
||||||
if p == self.MIGRATION_FOLDER_NAME:
|
if p == cls.MIGRATION_FOLDER_NAME:
|
||||||
return decomposed_path[i-1], os.path.splitext(decomposed_path[i+1])[0]
|
return decomposed_path[i-1], os.path.splitext(decomposed_path[i+1])[0]
|
||||||
|
|
||||||
def should_ignore_migration(self, app_name, migration_name):
|
def should_ignore_migration(self, app_name, migration_name):
|
||||||
@@ -145,5 +146,5 @@ if __name__ == '__main__':
|
|||||||
|
|
||||||
folder_name = args.django_folder[0]
|
folder_name = args.django_folder[0]
|
||||||
if valid_folder(folder_name):
|
if valid_folder(folder_name):
|
||||||
checker = MigrationChecker(folder_name, args.commit_id, ignore_name_contains=args.ignore_name_contains, include_apps=args.include_apps, exclude_apps=args.exclude_apps)
|
linter = MigrationLinter(folder_name, args.commit_id, ignore_name_contains=args.ignore_name_contains, include_apps=args.include_apps, exclude_apps=args.exclude_apps)
|
||||||
checker.check_migrations()
|
linter.lint_migrations()
|
||||||
@@ -1,17 +1,17 @@
|
|||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
import checker
|
from migration_linter import MigrationLinter
|
||||||
|
|
||||||
|
|
||||||
class CheckerTest(unittest.TestCase):
|
class LinterTest(unittest.TestCase):
|
||||||
def test_split_migration_path(self):
|
def test_split_migration_path(self):
|
||||||
input_path = 'apps/the_app/migrations/0001_stuff.py'
|
input_path = 'apps/the_app/migrations/0001_stuff.py'
|
||||||
app, mig = checker.split_migration_path(input_path)
|
app, mig = MigrationLinter._split_migration_path(input_path)
|
||||||
self.assertEqual(app, 'the_app')
|
self.assertEqual(app, 'the_app')
|
||||||
self.assertEqual(mig, '0001_stuff')
|
self.assertEqual(mig, '0001_stuff')
|
||||||
|
|
||||||
def test_split_migration_path_2(self):
|
def test_split_migration_path_2(self):
|
||||||
input_path = 'the_app/migrations/0001_stuff.py'
|
input_path = 'the_app/migrations/0001_stuff.py'
|
||||||
app, mig = checker.split_migration_path(input_path)
|
app, mig = MigrationLinter._split_migration_path(input_path)
|
||||||
self.assertEqual(app, 'the_app')
|
self.assertEqual(app, 'the_app')
|
||||||
self.assertEqual(mig, '0001_stuff')
|
self.assertEqual(mig, '0001_stuff')
|
||||||
Reference in new issue
Block a user