Using and modifying Params for setting values

9 views
Skip to first unread message

Braiam

unread,
May 8, 2023, 5:18:42 PM5/8/23
to Factory Boy
I have a specific use case for NumericRange() from psycopg. I need to
both create, two numbers, where lower > upper. I created the following
factory to do that:

class NumericRangeFactory(factory.Factory):
  class Meta:
    model = NumericRange
  class Params:
    postgres_max_int = 2147483647
    lower_min = 1
    lower_max = 100000 + lower_min
    upper_min = lower_max + 1
    upper_max = postgres_max_int - 1
  lower = factory.fuzzy.FuzzyInteger(Params.lower_min, Params.lower_max)
  upper = factory.fuzzy.FuzzyInteger(Params.upper_min, Params.upper_max)
  bounds = '[]'


It seems that if I want to modify the Params values I just have to pass:

NumericRangeFactory(lower_min=new_lower,upper_max=new_upper)

except that is just incidental that is between the values:

>>> orig_range = factories.NumericRangeFactory()
>>> orig_range
NumericRange(58849, 855059099, '[]')
>>> new_lower = orig_range.lower
>>> new_upper = orig_range.upper
>>> factories.NumericRangeFactory(lower_min=new_lower,upper_max=new_upper)
NumericRange(67614, 2010711347, '[]')
>>> factories.NumericRangeFactory(lower_min=new_lower,upper_max=new_upper)
NumericRange(84472, 578135953, '[]')
>>> factories.NumericRangeFactory(lower_min=new_lower,upper_max=new_upper)
NumericRange(70769, 1875556475, '[]')
>>> factories.NumericRangeFactory(lower_min=new_lower,upper_max=new_upper)
NumericRange(57749, 227816600, '[]')
>>> factories.NumericRangeFactory(lower_min=new_lower,upper_max=new_upper)
NumericRange(74615, 436612708, '[]')

As can be seen there seems to be no guarantee that later instances would respect
my defined values.

Read a suggestion to override the _create() method with:

  @classmethod
  def _create(cls, model_class, *args, **kwargs):
    lower_min = kwargs.pop('lower_min', None)
    lower_max = kwargs.pop('lower_max', None)
    upper_min = kwargs.pop('upper_min', None)
    upper_max = kwargs.pop('upper_max', None)
    obj = super()._create(model_class, *args, **kwargs)
    if lower_min is not None or lower_max is not None:
      obj.lower = factory.fuzzy.FuzzyInteger(lower_min, lower_max).fuzz()
    if upper_min is not None or upper_max is not None:
      obj.upper = factory.fuzzy.FuzzyInteger(upper_min, upper_max).fuzz()
    if obj.lower and obj.upper and obj.lower > obj.upper:
      tmp_lower = obj.lower
      tmp_upper = obj.upper
      obj.upper = tmp_lower
      obj.lower = tmp_upper
    return obj

But that also doesn't seem to produce the desired effect either.

In summary, I want to generate a NumericRange with random ranges between some
specific ranges.
Reply all
Reply to author
Forward
0 new messages