Skip to content

Commit

Permalink
[feature] Refactor global variables initialisation and also accept co…
Browse files Browse the repository at this point in the history
…nfigs from Env variables as priority.
  • Loading branch information
paulocheque committed Mar 28, 2020
1 parent 9fec69b commit 7ee8059
Showing 1 changed file with 42 additions and 48 deletions.
90 changes: 42 additions & 48 deletions django_dynamic_fixture/global_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
Module that contains wrappers and shortcuts.
This is the facade of all features of DDF.
"""
import os
import sys
import warnings

Expand All @@ -28,67 +29,60 @@ class DDFImproperlyConfigured(Exception):
"DDF is improperly configured. Some global settings has bad value in django settings."


def get_boolean_config(config_name, default=False):
def get_ddf_config(name, default, cast=None, options=None, msg=''):
try:
if hasattr(settings, config_name) and getattr(settings, config_name) not in [True, False]:
# to educate users to use this property correctly.
value = os.getenv(name) # Priority for Env variables
if not value:
value = getattr(settings, name) if hasattr(settings, name) else default
value = cast(value) if cast else value
if options and value not in options:
# to educate users to use the property correctly.
raise DDFImproperlyConfigured()
return getattr(settings, config_name) if hasattr(settings, config_name) else default
except DDFImproperlyConfigured:
six.reraise(DDFImproperlyConfigured, DDFImproperlyConfigured("%s (%s) must be True or False." % (config_name, getattr(settings, config_name))), sys.exc_info()[2])
return value
except Exception as e:
six.reraise(
DDFImproperlyConfigured,
DDFImproperlyConfigured('{}="{}": {} ({})'.format(name, value, msg, e),
sys.exc_info()[2])
)


# DDF_DEFAULT_DATA_FIXTURE default = 'sequential'
# It must be 'sequential', 'static_sequential', 'global_sequential', 'random' or 'path.to.CustomDataFixtureClass'
try:
INTERNAL_DATA_FIXTURES = {'sequential': SequentialDataFixture(),
'static_sequential': StaticSequentialDataFixture(),
'global_sequential': GlobalSequentialDataFixture(),
'random': RandomDataFixture()}
if hasattr(settings, 'DDF_DEFAULT_DATA_FIXTURE'):
if settings.DDF_DEFAULT_DATA_FIXTURE in INTERNAL_DATA_FIXTURES.keys():
DDF_DEFAULT_DATA_FIXTURE = INTERNAL_DATA_FIXTURES[settings.DDF_DEFAULT_DATA_FIXTURE]
else:
# path.to.CustomDataFixtureClass
mod_name, obj_name = get_mod_func(settings.DDF_DEFAULT_DATA_FIXTURE)
module = import_module(mod_name)
custom_data_fixture = getattr(module, obj_name)
DDF_DEFAULT_DATA_FIXTURE = custom_data_fixture()
else:
DDF_DEFAULT_DATA_FIXTURE = INTERNAL_DATA_FIXTURES['sequential']
except:
six.reraise(DDFImproperlyConfigured, DDFImproperlyConfigured("DDF_DEFAULT_DATA_FIXTURE (%s) must be 'sequential', 'static_sequential', 'global_sequential', 'random' or 'path.to.CustomDataFixtureClass'." % settings.DDF_DEFAULT_DATA_FIXTURE), sys.exc_info()[2])
def get_boolean_config(config_name, default=False):
return get_ddf_config(config_name, default, options=[True, False], msg='it must be True or False')


# DDF_IGNORE_FIELDS default = []
try:
DDF_IGNORE_FIELDS = list(settings.DDF_IGNORE_FIELDS) if hasattr(settings, 'DDF_IGNORE_FIELDS') else []
except Exception as e:
six.reraise(DDFImproperlyConfigured, DDFImproperlyConfigured("DDF_IGNORE_FIELDS (%s) must be a list of strings" % settings.DDF_IGNORE_FIELDS), sys.exc_info()[2])
def get_data_fixture(default='sequential'):
# It must be 'sequential', 'static_sequential', 'global_sequential', 'random' or 'path.to.CustomDataFixtureClass'
try:
INTERNAL_DATA_FIXTURES = {'sequential': SequentialDataFixture(),
'static_sequential': StaticSequentialDataFixture(),
'global_sequential': GlobalSequentialDataFixture(),
'random': RandomDataFixture()}
if hasattr(settings, 'DDF_DEFAULT_DATA_FIXTURE'):
if settings.DDF_DEFAULT_DATA_FIXTURE in INTERNAL_DATA_FIXTURES.keys():
return INTERNAL_DATA_FIXTURES[settings.DDF_DEFAULT_DATA_FIXTURE]
else:
# path.to.CustomDataFixtureClass
mod_name, obj_name = get_mod_func(settings.DDF_DEFAULT_DATA_FIXTURE)
module = import_module(mod_name)
custom_data_fixture = getattr(module, obj_name)
return custom_data_fixture()
else:
return INTERNAL_DATA_FIXTURES[default]
except:
six.reraise(DDFImproperlyConfigured, DDFImproperlyConfigured("DDF_DEFAULT_DATA_FIXTURE (%s) must be 'sequential', 'static_sequential', 'global_sequential', 'random' or 'path.to.CustomDataFixtureClass'." % settings.DDF_DEFAULT_DATA_FIXTURE), sys.exc_info()[2])


# DDF_FK_MIN_DEPTH default = 0
try:
DDF_FK_MIN_DEPTH = int(settings.DDF_FK_MIN_DEPTH) if hasattr(settings, 'DDF_FK_MIN_DEPTH') else 0
except Exception as e:
six.reraise(DDFImproperlyConfigured, DDFImproperlyConfigured("DDF_FK_MIN_DEPTH (%s) must be a integer number." % settings.DDF_FK_MIN_DEPTH), sys.exc_info()[2])

DDF_DEFAULT_DATA_FIXTURE = get_data_fixture(default='sequential')
DDF_IGNORE_FIELDS = get_ddf_config('DDF_IGNORE_FIELDS', default=[], cast=list, msg='it must be a list of strings')
DDF_FK_MIN_DEPTH = get_ddf_config('DDF_FK_MIN_DEPTH', default=0, cast=int, msg='it must be a integer number')
if hasattr(settings, 'DDF_NUMBER_OF_LAPS'):
warnings.warn(
"The old DDF_NUMBER_OF_LAPS settings was replaced by the new DDF_FK_MIN_DEPTH.",
DeprecationWarning
)

# DDF_FIELD_FIXTURES default = {}
try:
DDF_FIELD_FIXTURES = dict(settings.DDF_FIELD_FIXTURES) if hasattr(settings, 'DDF_FIELD_FIXTURES') else {}
DDF_DEFAULT_DATA_FIXTURE.plugins = DDF_FIELD_FIXTURES
except Exception as e:
six.reraise(DDFImproperlyConfigured, DDFImproperlyConfigured("DDF_FIELD_FIXTURES (%s) must be a dict." % settings.DDF_FIELD_FIXTURES), sys.exc_info()[2])



DDF_FIELD_FIXTURES = get_ddf_config('DDF_FIELD_FIXTURES', default={}, cast=dict, msg='it must be a dict')
DDF_DEFAULT_DATA_FIXTURE.plugins = DDF_FIELD_FIXTURES
DDF_FILL_NULLABLE_FIELDS = get_boolean_config('DDF_FILL_NULLABLE_FIELDS', default=False)
DDF_VALIDATE_MODELS = get_boolean_config('DDF_VALIDATE_MODELS', default=False)
DDF_DEBUG_MODE = get_boolean_config('DDF_DEBUG_MODE', default=False)

0 comments on commit 7ee8059

Please sign in to comment.