コード例 #1
0
 def new(self, model_class, shelve=False, named_shelve=None, persist_dependencies=True, **kwargs):
     """
     Create an instance filled with data without persist it.
     1) validate all kwargs match Model.fields.
     2) validate model is a model.Model class.
     3) Iterate model fields: for each field, fill it with data.
     @shelve: the current configuration will be stored in the DDF library. It can be True or a string (named shelve).
     @named_shelve: restore configuration saved in DDF library with a name.
     @persist_dependencies: tell if internal dependencies will be saved in the database or not.
     """
     if self.debug_mode:
         LOGGER.debug('>>> [%s] Generating instance.' % get_unique_model_name(model_class))
     configuration = self._configure_params(model_class, shelve, named_shelve, **kwargs)
     instance = model_class()
     if not is_model_class(instance):
         raise InvalidModelError(get_unique_model_name(model_class)), None, sys.exc_info()[2]
     for field in get_fields_from_model(model_class):
         if is_key_field(field) and 'id' not in configuration: continue
         if field.name in self.ignore_fields: continue
         self.set_data_for_a_field(model_class, instance, field, persist_dependencies=persist_dependencies, **configuration)
     number_of_pending_fields = len(self.pending_fields)
     # For Copier fixtures: dealing with pending fields that need to receive values of another fields.
     i = 0
     while self.pending_fields != []:
         field_name = self.pending_fields.pop(0)
         field = get_field_by_name_or_raise(model_class, field_name)
         self.set_data_for_a_field(model_class, instance, field, persist_dependencies=persist_dependencies, **configuration)
         i += 1
         if i > 2 * number_of_pending_fields: # dealing with infinite loop too.
             raise InvalidConfigurationError(get_unique_field_name(field), u'Cyclic dependency of Copiers.'), None, sys.exc_info()[2]
     if self.debug_mode:
         LOGGER.debug('<<< [%s] Instance created.' % get_unique_model_name(model_class))
     return instance
コード例 #2
0
    def new(self, model_class, shelve=False, named_shelve=None, persist_dependencies=True, **kwargs):
        """
        Create an instance filled with data without persist it.
        1) validate all kwargs match Model.fields.
        2) validate model is a model.Model class.
        3) Iterate model fields: for each field, fill it with data.

        :shelve: the current configuration will be stored in the DDF library. It can be True or a string (named shelve).
        :named_shelve: restore configuration saved in DDF library with a name.
        :persist_dependencies: tell if internal dependencies will be saved in the database or not.
        """
        if self.debug_mode:
            LOGGER.debug('>>> [%s] Generating instance.' % get_unique_model_name(model_class))
        configuration = self._configure_params(model_class, shelve, named_shelve, **kwargs)
        instance = model_class()
        if not is_model_class(instance):
            raise InvalidModelError(get_unique_model_name(model_class))
        for field in get_fields_from_model(model_class):
            if is_key_field(field) and 'id' not in configuration: continue
            if field.name not in self.kwargs and self._is_ignored_field(field.name): continue
            self.set_data_for_a_field(model_class, instance, field, persist_dependencies=persist_dependencies, **configuration)
        number_of_pending_fields = len(self.pending_fields)
        # For Copier fixtures: dealing with pending fields that need to receive values of another fields.
        i = 0
        while self.pending_fields != []:
            field_name = self.pending_fields.pop(0)
            field = get_field_by_name_or_raise(model_class, field_name)
            self.set_data_for_a_field(model_class, instance, field, persist_dependencies=persist_dependencies, **configuration)
            i += 1
            if i > 2 * number_of_pending_fields: # dealing with infinite loop too.
                raise InvalidConfigurationError(get_unique_field_name(field), 'Cyclic dependency of Copiers.')
        if self.debug_mode:
            LOGGER.debug('<<< [%s] Instance created.' % get_unique_model_name(model_class))
        return instance
コード例 #3
0
 def _configure_params(self, model_class, shelve, named_shelve, **kwargs):
     """
     1) validate kwargs
     2) load default fixture from DDF library. Store default fixture in DDF library.
     3) Load fixtures defined in F attributes.
     """
     if self.validate_args:
         self._validate_kwargs(model_class, kwargs)
     library = DDFLibrary.get_instance()
     if shelve:  # shelving before use_library property: do not twist two different configurations (anti-pattern)
         for field_name in kwargs.keys():
             if field_name in self._DDF_CONFIGS:
                 continue
             field = get_field_by_name_or_raise(model_class, field_name)
             fixture = kwargs[field_name]
             if field.unique and not (isinstance(
                     fixture, (DynamicFixture, Copier, DataFixture))
                                      or callable(fixture)):
                 raise InvalidConfigurationError(
                     'It is not possible to store static values for fields with unique=True (%s)'
                     % get_unique_field_name(field))
         library.add_configuration(model_class, kwargs, name=shelve)
     if self.use_library:
         # load ddf_setup.py of the model application
         app_name = get_app_name_of_model(model_class)
         if app_name not in _LOADED_DDF_SETUP_MODULES:
             full_module_name = '%s.tests.ddf_setup' % app_name
             try:
                 _LOADED_DDF_SETUP_MODULES.append(app_name)
                 import_module(full_module_name)
             except ImportError:
                 pass  # ignoring if module does not exist
             except Exception as e:
                 six.reraise(InvalidDDFSetupError, InvalidDDFSetupError(e),
                             sys.exc_info()[2])
         configuration_default = library.get_configuration(
             model_class, name=DDFLibrary.DEFAULT_KEY)
         configuration_custom = library.get_configuration(model_class,
                                                          name=named_shelve)
         configuration = {}
         configuration.update(
             configuration_default)  # always use default configuration
         configuration.update(
             configuration_custom)  # override default configuration
         configuration.update(
             kwargs
         )  # override shelved configuration with current configuration
     else:
         configuration = kwargs
     configuration.update(
         self.kwargs
     )  # Used by F: kwargs are passed by constructor, not by get.
     return configuration
コード例 #4
0
 def teach(self, model_class, ddf_lesson=None, **kwargs):
     library = DDFLibrary.get_instance()
     for field_name in kwargs.keys():
         if field_name in self._DDF_CONFIGS:
             continue
         field = get_field_by_name_or_raise(model_class, field_name)
         fixture = kwargs[field_name]
         if field.unique and not (isinstance(
                 fixture,
             (DynamicFixture, Copier, DataFixture)) or callable(fixture)):
             raise InvalidConfigurationError(
                 'It is not possible to store static values for fields with unique=True (%s). Try using a lambda function instead.'
                 % get_unique_field_name(field))
     library.add_configuration(model_class, kwargs, name=ddf_lesson)
コード例 #5
0
 def _configure_params(self, model_class, shelve, named_shelve, **kwargs):
     """
     1) validate kwargs
     2) load default fixture from DDF library. Store default fixture in DDF library.
     3) Load fixtures defined in F attributes.
     """
     if self.validate_args:
         self._validate_kwargs(model_class, kwargs)
     library = DDFLibrary.get_instance()
     if shelve: # shelving before use_library property: do not twist two different configurations (anti-pattern)
         for field_name in kwargs.keys():
             if field_name in self._DDF_CONFIGS:
                 continue
             field = get_field_by_name_or_raise(model_class, field_name)
             fixture = kwargs[field_name]
             if field.unique and not (isinstance(fixture, (DynamicFixture, Copier, DataFixture)) or callable(fixture)):
                 raise InvalidConfigurationError('It is not possible to store static values for fields with unique=True (%s)' % get_unique_field_name(field))
         library.add_configuration(model_class, kwargs, name=shelve)
     if self.use_library:
         # load ddf_setup.py of the model application
         app_name = get_app_name_of_model(model_class)
         if app_name not in _LOADED_DDF_SETUP_MODULES:
             full_module_name = '%s.tests.ddf_setup' % app_name
             try:
                 _LOADED_DDF_SETUP_MODULES.append(app_name)
                 import_module(full_module_name)
             except ImportError:
                 pass # ignoring if module does not exist
             except Exception as e:
                 raise InvalidDDFSetupError(e), None, sys.exc_info()[2]
         configuration_default = library.get_configuration(model_class, name=DDFLibrary.DEFAULT_KEY)
         configuration_custom = library.get_configuration(model_class, name=named_shelve)
         configuration = {}
         configuration.update(configuration_default) # always use default configuration
         configuration.update(configuration_custom) # override default configuration
         configuration.update(kwargs) # override shelved configuration with current configuration
     else:
         configuration = kwargs
     configuration.update(self.kwargs) # Used by F: kwargs are passed by constructor, not by get.
     return configuration
コード例 #6
0
 def immediate_field_name(self, instance):
     model_class = instance.__class__
     field_name = self.expression.split('.')[0]
     get_field_by_name_or_raise(model_class, field_name)
     return field_name
コード例 #7
0
 def immediate_field_name(self, instance):
     model_class = instance.__class__
     field_name = self.expression.split('.')[0]
     get_field_by_name_or_raise(model_class, field_name)
     return field_name
コード例 #8
0
    def new(self,
            model_class,
            ddf_lesson=None,
            persist_dependencies=True,
            **kwargs):
        '''
        Create an instance filled with data without persist it.
        1) validate all kwargs match Model.fields.
        2) validate model is a model.Model class.
        3) Iterate model fields: for each field, fill it with data.

        :ddf_lesson: the lesson that will be used to create the model instance, if exists.
        :persist_dependencies: tell if internal dependencies will be saved in the database or not.
        '''
        if self.debug_mode:
            LOGGER.debug('>>> [%s] Generating instance.' %
                         get_unique_model_name(model_class))
        configuration = self._configure_params(model_class, ddf_lesson,
                                               **kwargs)
        instance = model_class()
        if not is_model_class(instance):
            raise InvalidModelError(get_unique_model_name(model_class))

        try:
            # https://github.com/paulocheque/django-dynamic-fixture/pull/112
            from polymorphic import PolymorphicModel
            is_polymorphic = isinstance(instance, PolymorphicModel)
        except ImportError:
            # Django-polymorphic is not installed so the model can't be polymorphic.
            is_polymorphic = False
        for field in get_fields_from_model(model_class):
            if is_key_field(field) and field.name not in configuration:
                continue
            if field.name not in self.kwargs and self._is_ignored_field(
                    field.name):
                continue
            if is_polymorphic and (field.name == 'polymorphic_ctype'
                                   or field.primary_key):
                continue
            self.set_data_for_a_field(
                model_class,
                instance,
                field,
                persist_dependencies=persist_dependencies,
                **configuration)
        number_of_pending_fields = len(self.pending_fields)
        # For Copier fixtures: dealing with pending fields that need to receive values of another fields.
        i = 0
        while self.pending_fields != []:
            field_name = self.pending_fields.pop(0)
            field = get_field_by_name_or_raise(model_class, field_name)
            self.set_data_for_a_field(
                model_class,
                instance,
                field,
                persist_dependencies=persist_dependencies,
                **configuration)
            i += 1
            if i > 2 * number_of_pending_fields:  # dealing with infinite loop too.
                raise InvalidConfigurationError(
                    get_unique_field_name(field),
                    'Cyclic dependency of Copiers.')
        if self.debug_mode:
            LOGGER.debug('<<< [%s] Instance created.' %
                         get_unique_model_name(model_class))
        return instance