From 10220221612099ba8a460ce6f197dfb7423a6519 Mon Sep 17 00:00:00 2001 From: Saleem Latif Date: Tue, 1 Mar 2022 12:06:43 +0500 Subject: [PATCH] feat: Created a new management command for adding dummy data for learner progress report v2. --- CHANGELOG.rst | 4 ++ enterprise_data/__init__.py | 2 +- .../create_enterprise_learner_lpr_v1.py | 53 +++++++++++++++++++ .../test_create_enterprise_learner_lpr_v1.py | 49 +++++++++++++++++ enterprise_data/tests/test_utils.py | 14 +++-- requirements/base.in | 1 + requirements/base.txt | 15 ++++-- requirements/ci.txt | 8 +-- requirements/dev.txt | 37 +++++++------ requirements/pip.txt | 2 +- requirements/pip_tools.txt | 2 +- requirements/quality.txt | 40 +++++++------- requirements/test-master.txt | 20 +++---- requirements/test-reporting.txt | 16 +++--- requirements/test.txt | 20 +++---- setup.py | 1 + 16 files changed, 207 insertions(+), 77 deletions(-) create mode 100644 enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py create mode 100644 enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py diff --git a/CHANGELOG.rst b/CHANGELOG.rst index a38b83f3..24268210 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -15,6 +15,10 @@ Unreleased ---------- ========================= +[4.1.0] - 2022-03-01 +--------------------- + * Created a new management command for adding dummy data for learner progress report v1. + [4.0.0] - 2022-02-14 --------------------- * Dropped support for Django 2.2, 3.0 and 3.1 diff --git a/enterprise_data/__init__.py b/enterprise_data/__init__.py index 856ad4e2..705a241c 100644 --- a/enterprise_data/__init__.py +++ b/enterprise_data/__init__.py @@ -2,6 +2,6 @@ Enterprise data api application. This Django app exposes API endpoints used by enterprises. """ -__version__ = "4.0.0" +__version__ = "4.1.0" default_app_config = "enterprise_data.apps.EnterpriseDataAppConfig" # pylint: disable=invalid-name diff --git a/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py b/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py new file mode 100644 index 00000000..7435fd68 --- /dev/null +++ b/enterprise_data/management/commands/create_enterprise_learner_lpr_v1.py @@ -0,0 +1,53 @@ +""" +Management command for creating enterprise learner. +""" + + +import sys + +from django.core.management.base import BaseCommand, CommandError + +import enterprise_data.tests.test_utils + + +class Command(BaseCommand): + """ + Management command for creating `EnterpriseLearner` instances for dummy data for learner progress report (LPR) V1. + """ + help = 'Creates an EnterpriseLearner with randomized data.' + + def add_arguments(self, parser): + parser.add_argument( + 'enterprise_customer_uuid', + type=str, + help='UUID for an enterprise' + ) + + def handle(self, *args, **options): + enterprise_customer_uuid = options['enterprise_customer_uuid'] + try: + ent_user = enterprise_data.tests.test_utils.EnterpriseLearnerFactory( + enterprise_customer_uuid=enterprise_customer_uuid + ) + except Exception as exc: + info = ( + 'Error trying to create EnterpriseLearner with uuid ' + '{}: {}'.format(enterprise_customer_uuid, exc) + ) + raise CommandError(info) from exc + + info = '\n\nCreated EnterpriseLearner with id {} for enterprise with uuid {}\n'.format( + ent_user.enterprise_user_id, + ent_user.enterprise_customer_uuid + ) + sys.stdout.write(info) + + # TODO: Need to update this to the correct comment for LPR V1 once that is added. + info = ( + 'You can create some enrollments for this user by running the following ' + 'command:\n\n ./manage.py create_enterprise_enrollment {} {}\n\n'.format( + ent_user.enterprise_customer_uuid, + ent_user.enterprise_user_id, + ) + ) + sys.stdout.write(info) diff --git a/enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py b/enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py new file mode 100644 index 00000000..5b709def --- /dev/null +++ b/enterprise_data/management/commands/tests/test_create_enterprise_learner_lpr_v1.py @@ -0,0 +1,49 @@ +""" +Tests for create_enterprise_learner_lpr_v1 management command +""" +from unittest import TestCase, mock + +from pytest import mark + +from django.core.management import call_command + +from enterprise_data.models import EnterpriseLearner +from enterprise_data.tests.test_utils import EnterpriseLearnerFactory + + +@mark.django_db +class TestCreateEnterpriseLearnerCommand(TestCase): + """ + Tests to validate the behavior of `./manage.py create_enterprise_learner_lpr_v1` management command. + """ + + def setUp(self): + super().setUp() + self.uuid = 'a'*32 + + def test_create_enterprise_learner(self): + """ + Management command should successfully be able to create EnterpriseLearner + """ + assert EnterpriseLearner.objects.count() == 0 + + args = [self.uuid] + call_command('create_enterprise_learner_lpr_v1', *args) + + assert EnterpriseLearner.objects.count() == 1 + assert EnterpriseLearner.objects.filter(enterprise_customer_uuid=args[0]).count() == 1 + + def test_create_enterprise_learner_error(self): + """ + Management command should handle exceptions gracefully. + """ + EnterpriseLearnerFactory(enterprise_customer_uuid=self.uuid) + assert EnterpriseLearner.objects.count() == 1 + + args = [self.uuid] + with mock.patch('enterprise_data.tests.test_utils.EnterpriseLearnerFactory') as mock_factory: + mock_factory.side_effect = [Exception] + with self.assertRaises(Exception): + call_command('create_enterprise_learner_lpr_v1', *args) + + assert EnterpriseLearner.objects.count() == 1 diff --git a/enterprise_data/tests/test_utils.py b/enterprise_data/tests/test_utils.py index 37b5f2f9..0e6c7e54 100644 --- a/enterprise_data/tests/test_utils.py +++ b/enterprise_data/tests/test_utils.py @@ -121,15 +121,21 @@ class Meta: enterprise_user_id = factory.lazy_attribute(lambda x: FAKER.random_int(min=1)) # pylint: disable=no-member enterprise_customer_uuid = str(FAKER.uuid4()) # pylint: disable=no-member - lms_user_created = datetime(2011, 1, 1, tzinfo=pytz.utc) + enterprise_user_created = FAKER.past_datetime(start_date='-30d') + enterprise_user_modified = FAKER.past_datetime(start_date='-30d') + enterprise_user_active = FAKER.pybool() + lms_user_id = factory.lazy_attribute( + lambda x: FAKER.random_int(min=1, max=999999) # pylint: disable=no-member + ) + is_linked = FAKER.pybool() user_username = factory.Sequence('robot{}'.format) user_email = factory.lazy_attribute(lambda x: FAKER.email()) # pylint: disable=no-member + lms_user_created = FAKER.past_datetime(start_date='-60d') + lms_last_login = FAKER.past_datetime(start_date='-10d') lms_user_country = factory.lazy_attribute(lambda x: FAKER.country_code()) # pylint: disable=no-member enterprise_sso_uid = factory.lazy_attribute(lambda x: FAKER.text(max_nb_chars=255)) # pylint: disable=no-member last_activity_date = datetime(2012, 1, 1).date() - lms_user_id = factory.lazy_attribute( - lambda x: FAKER.random_int(min=1, max=999999) # pylint: disable=no-member - ) + created_at = FAKER.past_datetime(start_date='-30d') class EnterpriseLearnerEnrollmentFactory(factory.django.DjangoModelFactory): diff --git a/requirements/base.in b/requirements/base.in index 29f766f3..6e06f4b9 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -10,3 +10,4 @@ django-fernet-fields django-model-utils edx-rbac rules +factory_boy diff --git a/requirements/base.txt b/requirements/base.txt index 497b2438..8824cca6 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -12,15 +12,15 @@ asn1crypto==1.4.0 # via # oscrypto # snowflake-connector-python -awscli==1.22.55 +awscli==1.22.64 # via -r requirements/reporting.in bcrypt==3.2.0 # via paramiko billiard==3.6.4.0 # via celery -boto3==1.21.0 +boto3==1.21.9 # via -r requirements/reporting.in -botocore==1.24.0 +botocore==1.24.9 # via # awscli # boto3 @@ -104,6 +104,10 @@ edx-rbac==1.6.0 # via -r requirements/base.in edx-rest-api-client==5.5.0 # via -r requirements/base.in +factory-boy==3.2.1 + # via -r requirements/base.in +faker==13.3.0 + # via factory-boy future==0.18.2 # via pyjwkest idna==3.3 @@ -120,7 +124,7 @@ kombu==4.6.11 # via celery monotonic==1.6 # via py2neo -newrelic==7.4.0.172 +newrelic==7.6.0.173 # via edx-django-utils oscrypto==1.2.1 # via snowflake-connector-python @@ -172,6 +176,7 @@ python-dateutil==2.8.2 # via # botocore # edx-drf-extensions + # faker # vertica-python pytz==2021.3 # via @@ -194,7 +199,7 @@ rsa==4.7.2 # via awscli rules==3.1 # via -r requirements/base.in -s3transfer==0.5.1 +s3transfer==0.5.2 # via # awscli # boto3 diff --git a/requirements/ci.txt b/requirements/ci.txt index dc4503e0..a5aa9350 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -10,11 +10,11 @@ charset-normalizer==2.0.12 # via requests codecov==2.1.12 # via -r requirements/ci.in -coverage==6.3.1 +coverage==6.3.2 # via codecov distlib==0.3.4 # via virtualenv -filelock==3.5.0 +filelock==3.6.0 # via # tox # virtualenv @@ -22,7 +22,7 @@ idna==3.3 # via requests packaging==21.3 # via tox -platformdirs==2.5.0 +platformdirs==2.5.1 # via virtualenv pluggy==1.0.0 # via tox @@ -48,5 +48,5 @@ tox-battery==0.5.2 # -r requirements/ci.in urllib3==1.26.8 # via requests -virtualenv==20.13.1 +virtualenv==20.13.2 # via tox diff --git a/requirements/dev.txt b/requirements/dev.txt index e2f08364..90a4e36e 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -16,7 +16,7 @@ astroid==2.9.3 # via # pylint # pylint-celery -awscli==1.22.55 +awscli==1.22.64 # via -r requirements/reporting.in bcrypt==3.2.0 # via paramiko @@ -24,9 +24,9 @@ billiard==3.6.4.0 # via celery bleach==4.1.0 # via readme-renderer -boto3==1.21.0 +boto3==1.21.9 # via -r requirements/reporting.in -botocore==1.24.0 +botocore==1.24.9 # via # awscli # boto3 @@ -50,7 +50,7 @@ charset-normalizer==2.0.12 # via # requests # snowflake-connector-python -click==8.0.3 +click==8.0.4 # via # click-log # code-annotations @@ -137,7 +137,11 @@ edx-rbac==1.6.0 # via -r requirements/base.in edx-rest-api-client==5.5.0 # via -r requirements/base.in -filelock==3.5.0 +factory-boy==3.2.1 + # via -r requirements/base.in +faker==13.3.0 + # via factory-boy +filelock==3.6.0 # via # tox # virtualenv @@ -147,7 +151,7 @@ idna==3.3 # via # requests # snowflake-connector-python -importlib-metadata==4.11.1 +importlib-metadata==4.11.2 # via # keyring # twine @@ -171,13 +175,13 @@ kombu==4.6.11 # via celery lazy-object-proxy==1.7.1 # via astroid -markupsafe==2.0.1 +markupsafe==2.1.0 # via jinja2 mccabe==0.6.1 # via pylint monotonic==1.6 # via py2neo -newrelic==7.4.0.172 +newrelic==7.6.0.173 # via edx-django-utils oscrypto==1.2.1 # via snowflake-connector-python @@ -190,7 +194,7 @@ pansi==2020.7.3 # via py2neo paramiko==2.9.2 # via -r requirements/reporting.in -path==16.3.0 +path==16.4.0 # via edx-i18n-tools pbr==5.8.1 # via stevedore @@ -202,7 +206,7 @@ pip-tools==6.5.1 # via -r requirements/dev-enterprise_data.in pkginfo==1.8.2 # via twine -platformdirs==2.5.0 +platformdirs==2.5.1 # via # pylint # virtualenv @@ -253,7 +257,7 @@ pylint==2.12.2 # pylint-plugin-utils pylint-celery==0.3 # via edx-lint -pylint-django==2.5.0 +pylint-django==2.5.2 # via edx-lint pylint-plugin-utils==0.7 # via @@ -273,8 +277,9 @@ python-dateutil==2.8.2 # via # botocore # edx-drf-extensions + # faker # vertica-python -python-slugify==5.0.2 +python-slugify==6.1.1 # via code-annotations pytz==2021.3 # via @@ -310,7 +315,7 @@ rsa==4.7.2 # via awscli rules==3.1 # via -r requirements/base.in -s3transfer==0.5.1 +s3transfer==0.5.2 # via # awscli # boto3 @@ -347,7 +352,7 @@ stevedore==3.5.0 # code-annotations # edx-django-utils # edx-opaque-keys -testfixtures==6.18.3 +testfixtures==6.18.4 # via -r requirements/quality.in text-unidecode==1.3 # via python-slugify @@ -365,7 +370,7 @@ tox-battery==0.5.2 # via # -c requirements/constraints.txt # -r requirements/dev-enterprise_data.in -tqdm==4.62.3 +tqdm==4.63.0 # via twine twine==3.8.0 # via -r requirements/dev-enterprise_data.in @@ -387,7 +392,7 @@ vine==1.3.0 # via # amqp # celery -virtualenv==20.13.1 +virtualenv==20.13.2 # via tox webencodings==0.5.1 # via bleach diff --git a/requirements/pip.txt b/requirements/pip.txt index 262bca6e..4ee0d0e7 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -10,5 +10,5 @@ wheel==0.37.1 # The following packages are considered to be unsafe in a requirements file: pip==20.0.2 # via -r requirements/pip.in -setuptools==60.9.1 +setuptools==60.9.3 # via -r requirements/pip.in diff --git a/requirements/pip_tools.txt b/requirements/pip_tools.txt index 6d571f6c..ffafd791 100644 --- a/requirements/pip_tools.txt +++ b/requirements/pip_tools.txt @@ -4,7 +4,7 @@ # # make upgrade # -click==8.0.3 +click==8.0.4 # via pip-tools pep517==0.12.0 # via pip-tools diff --git a/requirements/quality.txt b/requirements/quality.txt index 05e0378e..d7698049 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -18,7 +18,7 @@ astroid==2.9.3 # pylint-celery attrs==21.4.0 # via pytest -awscli==1.22.55 +awscli==1.22.64 # via -r requirements/reporting.in bcrypt==3.2.0 # via paramiko @@ -26,9 +26,9 @@ billiard==3.6.4.0 # via celery bleach==4.1.0 # via readme-renderer -boto3==1.21.0 +boto3==1.21.9 # via -r requirements/reporting.in -botocore==1.24.0 +botocore==1.24.9 # via # awscli # boto3 @@ -52,7 +52,7 @@ charset-normalizer==2.0.12 # via # requests # snowflake-connector-python -click==8.0.3 +click==8.0.4 # via # click-log # code-annotations @@ -66,7 +66,7 @@ colorama==0.4.3 # via # awscli # twine -coverage[toml]==6.3.1 +coverage[toml]==6.3.2 # via pytest-cov cryptography==36.0.1 # via @@ -147,10 +147,12 @@ edx-rbac==1.6.0 edx-rest-api-client==5.5.0 # via -r requirements/base.in factory-boy==3.2.1 - # via -r requirements/test.in -faker==13.0.0 + # via + # -r requirements/base.in + # -r requirements/test.in +faker==13.3.0 # via factory-boy -filelock==3.5.0 +filelock==3.6.0 # via # tox # virtualenv @@ -164,7 +166,7 @@ idna==3.3 # via # requests # snowflake-connector-python -importlib-metadata==4.11.1 +importlib-metadata==4.11.2 # via # keyring # twine @@ -190,7 +192,7 @@ kombu==4.6.11 # via celery lazy-object-proxy==1.7.1 # via astroid -markupsafe==2.0.1 +markupsafe==2.1.0 # via jinja2 mccabe==0.6.1 # via pylint @@ -198,7 +200,7 @@ mock==4.0.3 # via -r requirements/test.in monotonic==1.6 # via py2neo -newrelic==7.4.0.172 +newrelic==7.6.0.173 # via edx-django-utils oscrypto==1.2.1 # via snowflake-connector-python @@ -212,7 +214,7 @@ pansi==2020.7.3 # via py2neo paramiko==2.9.2 # via -r requirements/reporting.in -path==16.3.0 +path==16.4.0 # via edx-i18n-tools pbr==5.8.1 # via stevedore @@ -224,7 +226,7 @@ pip-tools==6.5.1 # via -r requirements/dev-enterprise_data.in pkginfo==1.8.2 # via twine -platformdirs==2.5.0 +platformdirs==2.5.1 # via # pylint # virtualenv @@ -278,7 +280,7 @@ pylint==2.12.2 # pylint-plugin-utils pylint-celery==0.3 # via edx-lint -pylint-django==2.5.0 +pylint-django==2.5.2 # via edx-lint pylint-plugin-utils==0.7 # via @@ -309,7 +311,7 @@ python-dateutil==2.8.2 # faker # freezegun # vertica-python -python-slugify==5.0.2 +python-slugify==6.1.1 # via code-annotations pytz==2021.3 # via @@ -348,7 +350,7 @@ rsa==4.7.2 # via awscli rules==3.1 # via -r requirements/base.in -s3transfer==0.5.1 +s3transfer==0.5.2 # via # awscli # boto3 @@ -385,7 +387,7 @@ stevedore==3.5.0 # code-annotations # edx-django-utils # edx-opaque-keys -testfixtures==6.18.3 +testfixtures==6.18.4 # via # -r requirements/quality.in # -r requirements/test.in @@ -408,7 +410,7 @@ tox-battery==0.5.2 # via # -c requirements/constraints.txt # -r requirements/dev-enterprise_data.in -tqdm==4.62.3 +tqdm==4.63.0 # via twine twine==3.8.0 # via -r requirements/dev-enterprise_data.in @@ -431,7 +433,7 @@ vine==1.3.0 # via # amqp # celery -virtualenv==20.13.1 +virtualenv==20.13.2 # via tox webencodings==0.5.1 # via bleach diff --git a/requirements/test-master.txt b/requirements/test-master.txt index f23da37b..a8e755c9 100644 --- a/requirements/test-master.txt +++ b/requirements/test-master.txt @@ -14,15 +14,15 @@ asn1crypto==1.4.0 # snowflake-connector-python attrs==21.4.0 # via pytest -awscli==1.22.55 +awscli==1.22.64 # via -r requirements/reporting.in bcrypt==3.2.0 # via paramiko billiard==3.6.4.0 # via celery -boto3==1.21.0 +boto3==1.21.9 # via -r requirements/reporting.in -botocore==1.24.0 +botocore==1.24.9 # via # awscli # boto3 @@ -46,7 +46,7 @@ charset-normalizer==2.0.12 # snowflake-connector-python colorama==0.4.3 # via awscli -coverage[toml]==6.3.1 +coverage[toml]==6.3.2 # via pytest-cov cryptography==36.0.1 # via @@ -116,8 +116,10 @@ edx-rbac==1.6.0 edx-rest-api-client==5.5.0 # via -r requirements/base.in factory-boy==3.2.1 - # via -r requirements/test.in -faker==13.0.0 + # via + # -r requirements/base.in + # -r requirements/test.in +faker==13.3.0 # via factory-boy flaky==3.7.0 # via -r requirements/test.in @@ -143,7 +145,7 @@ mock==4.0.3 # via -r requirements/test.in monotonic==1.6 # via py2neo -newrelic==7.4.0.172 +newrelic==7.6.0.173 # via edx-django-utils oscrypto==1.2.1 # via snowflake-connector-python @@ -236,7 +238,7 @@ rsa==4.7.2 # via awscli rules==3.1 # via -r requirements/base.in -s3transfer==0.5.1 +s3transfer==0.5.2 # via # awscli # boto3 @@ -265,7 +267,7 @@ stevedore==3.5.0 # via # edx-django-utils # edx-opaque-keys -testfixtures==6.18.3 +testfixtures==6.18.4 # via -r requirements/test.in tomli==2.0.1 # via diff --git a/requirements/test-reporting.txt b/requirements/test-reporting.txt index e7ec4eeb..8735cad2 100644 --- a/requirements/test-reporting.txt +++ b/requirements/test-reporting.txt @@ -14,15 +14,15 @@ atomicwrites==1.4.0 # via pytest attrs==21.4.0 # via pytest -awscli==1.22.55 +awscli==1.22.64 # via -r requirements/reporting.in bcrypt==3.2.0 # via paramiko billiard==3.6.4.0 # via celery -boto3==1.21.0 +boto3==1.21.9 # via -r requirements/reporting.in -botocore==1.24.0 +botocore==1.24.9 # via # awscli # boto3 @@ -46,7 +46,7 @@ charset-normalizer==2.0.12 # snowflake-connector-python colorama==0.4.3 # via awscli -coverage==6.3.1 +coverage==6.3.2 # via pytest-cov cryptography==36.0.1 # via @@ -63,7 +63,7 @@ distlib==0.3.4 # via virtualenv docutils==0.15.2 # via awscli -filelock==3.5.0 +filelock==3.6.0 # via # tox # virtualenv @@ -99,7 +99,7 @@ pbr==5.8.1 # via mock pgpy==0.5.4 # via -r requirements/reporting.in -platformdirs==2.5.0 +platformdirs==2.5.1 # via virtualenv pluggy==1.0.0 # via @@ -152,7 +152,7 @@ requests==2.27.1 # via snowflake-connector-python rsa==4.7.2 # via awscli -s3transfer==0.5.1 +s3transfer==0.5.2 # via # awscli # boto3 @@ -195,7 +195,7 @@ vine==1.3.0 # via # amqp # celery -virtualenv==20.13.1 +virtualenv==20.13.2 # via tox # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/test.txt b/requirements/test.txt index 819e9865..53ad027c 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -14,15 +14,15 @@ asn1crypto==1.4.0 # snowflake-connector-python attrs==21.4.0 # via pytest -awscli==1.22.55 +awscli==1.22.64 # via -r requirements/reporting.in bcrypt==3.2.0 # via paramiko billiard==3.6.4.0 # via celery -boto3==1.21.0 +boto3==1.21.9 # via -r requirements/reporting.in -botocore==1.24.0 +botocore==1.24.9 # via # awscli # boto3 @@ -46,7 +46,7 @@ charset-normalizer==2.0.12 # snowflake-connector-python colorama==0.4.3 # via awscli -coverage[toml]==6.3.1 +coverage[toml]==6.3.2 # via pytest-cov cryptography==36.0.1 # via @@ -114,8 +114,10 @@ edx-rbac==1.6.0 edx-rest-api-client==5.5.0 # via -r requirements/base.in factory-boy==3.2.1 - # via -r requirements/test.in -faker==13.0.0 + # via + # -r requirements/base.in + # -r requirements/test.in +faker==13.3.0 # via factory-boy flaky==3.7.0 # via -r requirements/test.in @@ -141,7 +143,7 @@ mock==4.0.3 # via -r requirements/test.in monotonic==1.6 # via py2neo -newrelic==7.4.0.172 +newrelic==7.6.0.173 # via edx-django-utils oscrypto==1.2.1 # via snowflake-connector-python @@ -234,7 +236,7 @@ rsa==4.7.2 # via awscli rules==3.1 # via -r requirements/base.in -s3transfer==0.5.1 +s3transfer==0.5.2 # via # awscli # boto3 @@ -263,7 +265,7 @@ stevedore==3.5.0 # via # edx-django-utils # edx-opaque-keys -testfixtures==6.18.3 +testfixtures==6.18.4 # via -r requirements/test.in tomli==2.0.1 # via diff --git a/setup.py b/setup.py index 5207cbf9..17e4ff18 100644 --- a/setup.py +++ b/setup.py @@ -29,6 +29,7 @@ def get_version(*file_paths): os.system("git push --tags") sys.exit() + def load_requirements(*requirements_paths): """ Load all requirements from the specified requirements files.