model-bakery 1.11.0__tar.gz → 1.13.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of model-bakery might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: model-bakery
3
- Version: 1.11.0
3
+ Version: 1.13.0
4
4
  Summary: Smart object creation facility for Django.
5
5
  Project-URL: Homepage, https://github.com/model-bakers/model_bakery
6
6
  Author-email: berin <bernardoxhc@gmail.com>, amureki <amureki@hey.com>
@@ -12,6 +12,7 @@ Classifier: Framework :: Django
12
12
  Classifier: Framework :: Django :: 3.2
13
13
  Classifier: Framework :: Django :: 4.0
14
14
  Classifier: Framework :: Django :: 4.1
15
+ Classifier: Framework :: Django :: 4.2
15
16
  Classifier: Intended Audience :: Developers
16
17
  Classifier: License :: OSI Approved :: Apache Software License
17
18
  Classifier: Operating System :: OS Independent
@@ -0,0 +1 @@
1
+ __version__ = "1.13.0"
@@ -59,6 +59,10 @@ def _valid_quantity(quantity: Optional[Union[str, int]]) -> bool:
59
59
  return quantity is not None and (not isinstance(quantity, int) or quantity < 1)
60
60
 
61
61
 
62
+ def seed(seed: Union[int, float, str, bytes, bytearray, None]) -> None:
63
+ Baker.seed(seed)
64
+
65
+
62
66
  @overload
63
67
  def make(
64
68
  _model: Union[str, Type[M]],
@@ -312,13 +316,22 @@ def _custom_baker_class() -> Optional[Type]:
312
316
 
313
317
 
314
318
  class Baker(Generic[M]):
319
+ SENTINEL = object()
320
+
315
321
  attr_mapping: Dict[str, Any] = {}
316
322
  type_mapping: Dict = {}
317
323
 
324
+ _global_seed: Union[object, int, float, str, bytes, bytearray, None] = SENTINEL
325
+
318
326
  # Note: we're using one finder for all Baker instances to avoid
319
327
  # rebuilding the model cache for every make_* or prepare_* call.
320
328
  finder = ModelFinder()
321
329
 
330
+ @classmethod
331
+ def seed(cls, seed: Union[int, float, str, bytes, bytearray, None]) -> None:
332
+ random_gen.baker_random.seed(seed)
333
+ cls._global_seed = seed
334
+
322
335
  @classmethod
323
336
  def create(
324
337
  cls,
@@ -14,7 +14,7 @@ import warnings
14
14
  from datetime import date, datetime, time, timedelta
15
15
  from decimal import Decimal
16
16
  from os.path import abspath, dirname, join
17
- from random import choice, randint, random, uniform
17
+ from random import Random
18
18
  from typing import Any, Callable, List, Optional, Tuple, Union
19
19
  from uuid import UUID
20
20
 
@@ -27,6 +27,8 @@ MAX_LENGTH = 300
27
27
  # Postgres database.
28
28
  MAX_INT = 100000000000
29
29
 
30
+ baker_random = Random()
31
+
30
32
 
31
33
  def get_content_file(content: bytes, name: str) -> ContentFile:
32
34
  return ContentFile(content, name=name)
@@ -57,7 +59,7 @@ def gen_from_list(a_list: Union[List[str], range]) -> Callable:
57
59
  >>> attr_mapping = {'some_field': gen_from_list(['A', 'B', 'C'])}
58
60
 
59
61
  """
60
- return lambda: choice(list(a_list))
62
+ return lambda: baker_random.choice(list(a_list))
61
63
 
62
64
 
63
65
  # -- DEFAULT GENERATORS --
@@ -75,16 +77,16 @@ def gen_from_choices(choices: List) -> Callable:
75
77
 
76
78
 
77
79
  def gen_integer(min_int: int = -MAX_INT, max_int: int = MAX_INT) -> int:
78
- return randint(min_int, max_int)
80
+ return baker_random.randint(min_int, max_int)
79
81
 
80
82
 
81
83
  def gen_float() -> float:
82
- return random() * gen_integer()
84
+ return baker_random.random() * gen_integer()
83
85
 
84
86
 
85
87
  def gen_decimal(max_digits: int, decimal_places: int) -> Decimal:
86
88
  def num_as_str(x: int) -> str:
87
- return "".join([str(randint(0, 9)) for _ in range(x)])
89
+ return "".join([str(baker_random.randint(0, 9)) for _ in range(x)])
88
90
 
89
91
  if decimal_places:
90
92
  return Decimal(
@@ -110,15 +112,24 @@ def gen_time() -> time:
110
112
 
111
113
 
112
114
  def gen_string(max_length: int) -> str:
113
- return str("".join(choice(string.ascii_letters) for _ in range(max_length)))
115
+ return str(
116
+ "".join(baker_random.choice(string.ascii_letters) for _ in range(max_length))
117
+ )
118
+
119
+
120
+ def _gen_string_get_max_length(field: Field) -> Tuple[str, int]:
121
+ max_length = getattr(field, "max_length", None)
122
+ if max_length is None:
123
+ max_length = MAX_LENGTH
124
+ return "max_length", max_length
114
125
 
115
126
 
116
- gen_string.required = ["max_length"] # type: ignore[attr-defined]
127
+ gen_string.required = [_gen_string_get_max_length] # type: ignore[attr-defined]
117
128
 
118
129
 
119
130
  def gen_slug(max_length: int) -> str:
120
131
  valid_chars = string.ascii_letters + string.digits + "_-"
121
- return str("".join(choice(valid_chars) for _ in range(max_length)))
132
+ return str("".join(baker_random.choice(valid_chars) for _ in range(max_length)))
122
133
 
123
134
 
124
135
  gen_slug.required = ["max_length"] # type: ignore[attr-defined]
@@ -129,11 +140,11 @@ def gen_text() -> str:
129
140
 
130
141
 
131
142
  def gen_boolean() -> bool:
132
- return choice((True, False))
143
+ return baker_random.choice((True, False))
133
144
 
134
145
 
135
146
  def gen_null_boolean():
136
- return choice((True, False, None))
147
+ return baker_random.choice((True, False, None))
137
148
 
138
149
 
139
150
  def gen_url() -> str:
@@ -145,15 +156,15 @@ def gen_email() -> str:
145
156
 
146
157
 
147
158
  def gen_ipv6() -> str:
148
- return ":".join(format(randint(1, 65535), "x") for _ in range(8))
159
+ return ":".join(format(baker_random.randint(1, 65535), "x") for _ in range(8))
149
160
 
150
161
 
151
162
  def gen_ipv4() -> str:
152
- return ".".join(str(randint(1, 255)) for _ in range(4))
163
+ return ".".join(str(baker_random.randint(1, 255)) for _ in range(4))
153
164
 
154
165
 
155
166
  def gen_ipv46() -> str:
156
- ip_gen = choice([gen_ipv4, gen_ipv6])
167
+ ip_gen = baker_random.choice([gen_ipv4, gen_ipv6])
157
168
  return ip_gen()
158
169
 
159
170
 
@@ -190,7 +201,7 @@ gen_ip.required = ["protocol", "default_validators"] # type: ignore[attr-define
190
201
 
191
202
 
192
203
  def gen_byte_string(max_length: int = 16) -> bytes:
193
- generator = (randint(0, 255) for x in range(max_length))
204
+ generator = (baker_random.randint(0, 255) for x in range(max_length))
194
205
  return bytes(generator)
195
206
 
196
207
 
@@ -205,7 +216,7 @@ def gen_content_type():
205
216
  from django.contrib.contenttypes.models import ContentType
206
217
 
207
218
  try:
208
- return ContentType.objects.get_for_model(choice(apps.get_models()))
219
+ return ContentType.objects.get_for_model(baker_random.choice(apps.get_models()))
209
220
  except (AssertionError, RuntimeError):
210
221
  # AssertionError is raised by Django's test framework when db access is not available:
211
222
  # https://github.com/django/django/blob/stable/4.0.x/django/test/testcases.py#L150
@@ -269,7 +280,7 @@ gen_m2m.required = [_fk_model, "_using"] # type: ignore[attr-defined]
269
280
 
270
281
 
271
282
  def gen_coord() -> float:
272
- return uniform(0, 1)
283
+ return baker_random.uniform(0, 1)
273
284
 
274
285
 
275
286
  def gen_coords() -> str:
@@ -94,7 +94,9 @@ def seq(value, increment_by=1, start=None, suffix=None):
94
94
  else:
95
95
  yield series_date
96
96
  else:
97
- for n in itertools.count(start or increment_by, increment_by):
97
+ for n in itertools.count(
98
+ increment_by if start is None else start, increment_by
99
+ ):
98
100
  if suffix:
99
101
  yield value + str(n) + suffix
100
102
  else:
@@ -25,6 +25,7 @@ classifiers = [
25
25
  "Framework :: Django :: 3.2",
26
26
  "Framework :: Django :: 4.0",
27
27
  "Framework :: Django :: 4.1",
28
+ "Framework :: Django :: 4.2",
28
29
  "Intended Audience :: Developers",
29
30
  "License :: OSI Approved :: Apache Software License",
30
31
  "Operating System :: OS Independent",
@@ -1 +0,0 @@
1
- __version__ = "1.11.0"
File without changes
File without changes
File without changes