model-bakery 1.16.0__py3-none-any.whl → 1.18.0__py3-none-any.whl
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.
- model_bakery/__about__.py +1 -1
- model_bakery/baker.py +50 -28
- model_bakery/content_types.py +14 -0
- model_bakery/generators.py +12 -54
- model_bakery/random_gen.py +3 -5
- model_bakery/recipe.py +4 -8
- {model_bakery-1.16.0.dist-info → model_bakery-1.18.0.dist-info}/METADATA +6 -6
- model_bakery-1.18.0.dist-info/RECORD +19 -0
- {model_bakery-1.16.0.dist-info → model_bakery-1.18.0.dist-info}/WHEEL +1 -1
- model_bakery-1.16.0.dist-info/RECORD +0 -18
- {model_bakery-1.16.0.dist-info → model_bakery-1.18.0.dist-info}/licenses/LICENSE +0 -0
model_bakery/__about__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "1.
|
|
1
|
+
__version__ = "1.18.0"
|
model_bakery/baker.py
CHANGED
|
@@ -15,10 +15,8 @@ from typing import (
|
|
|
15
15
|
overload,
|
|
16
16
|
)
|
|
17
17
|
|
|
18
|
-
from django import VERSION as DJANGO_VERSION
|
|
19
18
|
from django.apps import apps
|
|
20
19
|
from django.conf import settings
|
|
21
|
-
from django.contrib import contenttypes
|
|
22
20
|
from django.db.models import (
|
|
23
21
|
AutoField,
|
|
24
22
|
BooleanField,
|
|
@@ -37,6 +35,7 @@ from django.db.models.fields.reverse_related import ManyToOneRel, OneToOneRel
|
|
|
37
35
|
|
|
38
36
|
from . import generators, random_gen
|
|
39
37
|
from ._types import M, NewM
|
|
38
|
+
from .content_types import BAKER_CONTENTTYPES
|
|
40
39
|
from .exceptions import (
|
|
41
40
|
AmbiguousModelName,
|
|
42
41
|
CustomBakerNotFound,
|
|
@@ -50,6 +49,13 @@ from .utils import (
|
|
|
50
49
|
seq, # noqa: F401 - Enable seq to be imported from recipes
|
|
51
50
|
)
|
|
52
51
|
|
|
52
|
+
if BAKER_CONTENTTYPES:
|
|
53
|
+
from django.contrib.contenttypes import models as contenttypes_models
|
|
54
|
+
from django.contrib.contenttypes.fields import GenericRelation
|
|
55
|
+
else:
|
|
56
|
+
contenttypes_models = None
|
|
57
|
+
GenericRelation = None
|
|
58
|
+
|
|
53
59
|
recipes = None
|
|
54
60
|
|
|
55
61
|
# FIXME: use pkg_resource
|
|
@@ -78,8 +84,7 @@ def make(
|
|
|
78
84
|
_using: str = "",
|
|
79
85
|
_bulk_create: bool = False,
|
|
80
86
|
**attrs: Any,
|
|
81
|
-
) -> M:
|
|
82
|
-
...
|
|
87
|
+
) -> M: ...
|
|
83
88
|
|
|
84
89
|
|
|
85
90
|
@overload
|
|
@@ -94,8 +99,7 @@ def make(
|
|
|
94
99
|
_bulk_create: bool = False,
|
|
95
100
|
_fill_optional: Union[List[str], bool] = False,
|
|
96
101
|
**attrs: Any,
|
|
97
|
-
) -> List[M]:
|
|
98
|
-
...
|
|
102
|
+
) -> List[M]: ...
|
|
99
103
|
|
|
100
104
|
|
|
101
105
|
def make(
|
|
@@ -147,8 +151,7 @@ def prepare(
|
|
|
147
151
|
_save_related: bool = False,
|
|
148
152
|
_using: str = "",
|
|
149
153
|
**attrs,
|
|
150
|
-
) -> M:
|
|
151
|
-
...
|
|
154
|
+
) -> M: ...
|
|
152
155
|
|
|
153
156
|
|
|
154
157
|
@overload
|
|
@@ -159,8 +162,7 @@ def prepare(
|
|
|
159
162
|
_using: str = "",
|
|
160
163
|
_fill_optional: Union[List[str], bool] = False,
|
|
161
164
|
**attrs,
|
|
162
|
-
) -> List[M]:
|
|
163
|
-
...
|
|
165
|
+
) -> List[M]: ...
|
|
164
166
|
|
|
165
167
|
|
|
166
168
|
def prepare(
|
|
@@ -498,17 +500,30 @@ class Baker(Generic[M]):
|
|
|
498
500
|
self, attrs: Dict[str, Any], _commit, _save_kwargs, _from_manager
|
|
499
501
|
) -> M:
|
|
500
502
|
one_to_many_keys = {}
|
|
503
|
+
auto_now_keys = {}
|
|
504
|
+
|
|
501
505
|
for k in tuple(attrs.keys()):
|
|
502
506
|
field = getattr(self.model, k, None)
|
|
507
|
+
|
|
508
|
+
if not field:
|
|
509
|
+
continue
|
|
510
|
+
|
|
503
511
|
if isinstance(field, ForeignRelatedObjectsDescriptor):
|
|
504
512
|
one_to_many_keys[k] = attrs.pop(k)
|
|
505
513
|
|
|
514
|
+
if hasattr(field, "field") and (
|
|
515
|
+
getattr(field.field, "auto_now_add", False)
|
|
516
|
+
or getattr(field.field, "auto_now", False)
|
|
517
|
+
):
|
|
518
|
+
auto_now_keys[k] = attrs[k]
|
|
519
|
+
|
|
506
520
|
instance = self.model(**attrs)
|
|
507
521
|
# m2m only works for persisted instances
|
|
508
522
|
if _commit:
|
|
509
523
|
instance.save(**_save_kwargs)
|
|
510
524
|
self._handle_one_to_many(instance, one_to_many_keys)
|
|
511
525
|
self._handle_m2m(instance)
|
|
526
|
+
self._handle_auto_now(instance, auto_now_keys)
|
|
512
527
|
|
|
513
528
|
if _from_manager:
|
|
514
529
|
# Fetch the instance using the given Manager, e.g.
|
|
@@ -554,13 +569,9 @@ class Baker(Generic[M]):
|
|
|
554
569
|
}
|
|
555
570
|
self.model_attrs = {k: v for k, v in attrs.items() if not is_rel_field(k)}
|
|
556
571
|
self.rel_attrs = {k: v for k, v in attrs.items() if is_rel_field(k)}
|
|
557
|
-
self.rel_fields = [
|
|
558
|
-
x.split("__")[0] for x in self.rel_attrs.keys() if is_rel_field(x)
|
|
559
|
-
]
|
|
560
|
-
|
|
561
|
-
def _skip_field(self, field: Field) -> bool:
|
|
562
|
-
from django.contrib.contenttypes.fields import GenericRelation
|
|
572
|
+
self.rel_fields = [x.split("__")[0] for x in self.rel_attrs if is_rel_field(x)]
|
|
563
573
|
|
|
574
|
+
def _skip_field(self, field: Field) -> bool: # noqa: C901
|
|
564
575
|
# check for fill optional argument
|
|
565
576
|
if isinstance(self.fill_in_optional, bool):
|
|
566
577
|
field.fill_optional = self.fill_in_optional
|
|
@@ -582,10 +593,18 @@ class Baker(Generic[M]):
|
|
|
582
593
|
if isinstance(field, OneToOneField) and self._remote_field(field).parent_link:
|
|
583
594
|
return True
|
|
584
595
|
|
|
585
|
-
|
|
596
|
+
other_fields_to_skip = [
|
|
597
|
+
AutoField,
|
|
598
|
+
OrderWrt,
|
|
599
|
+
]
|
|
600
|
+
|
|
601
|
+
if BAKER_CONTENTTYPES:
|
|
602
|
+
other_fields_to_skip.append(GenericRelation)
|
|
603
|
+
|
|
604
|
+
if isinstance(field, tuple(other_fields_to_skip)):
|
|
586
605
|
return True
|
|
587
606
|
|
|
588
|
-
if all(
|
|
607
|
+
if all( # noqa: SIM102
|
|
589
608
|
[
|
|
590
609
|
field.name not in self.model_attrs,
|
|
591
610
|
field.name not in self.rel_fields,
|
|
@@ -601,7 +620,7 @@ class Baker(Generic[M]):
|
|
|
601
620
|
):
|
|
602
621
|
return True
|
|
603
622
|
|
|
604
|
-
if field.name not in self.model_attrs:
|
|
623
|
+
if field.name not in self.model_attrs: # noqa: SIM102
|
|
605
624
|
if field.name not in self.rel_fields and (
|
|
606
625
|
field.null and not field.fill_optional
|
|
607
626
|
):
|
|
@@ -609,6 +628,12 @@ class Baker(Generic[M]):
|
|
|
609
628
|
|
|
610
629
|
return False
|
|
611
630
|
|
|
631
|
+
def _handle_auto_now(self, instance: Model, attrs: Dict[str, Any]):
|
|
632
|
+
if not attrs:
|
|
633
|
+
return
|
|
634
|
+
|
|
635
|
+
instance.__class__.objects.filter(pk=instance.pk).update(**attrs)
|
|
636
|
+
|
|
612
637
|
def _handle_one_to_many(self, instance: Model, attrs: Dict[str, Any]):
|
|
613
638
|
for key, values in attrs.items():
|
|
614
639
|
manager = getattr(instance, key)
|
|
@@ -670,9 +695,11 @@ class Baker(Generic[M]):
|
|
|
670
695
|
`attr_mapping` and `type_mapping` can be defined easily overwriting the
|
|
671
696
|
model.
|
|
672
697
|
"""
|
|
673
|
-
is_content_type_fk =
|
|
674
|
-
|
|
675
|
-
|
|
698
|
+
is_content_type_fk = False
|
|
699
|
+
if BAKER_CONTENTTYPES:
|
|
700
|
+
is_content_type_fk = isinstance(field, ForeignKey) and issubclass(
|
|
701
|
+
self._remote_field(field).model, contenttypes_models.ContentType
|
|
702
|
+
)
|
|
676
703
|
# we only use default unless the field is overwritten in `self.rel_fields`
|
|
677
704
|
if field.has_default() and field.name not in self.rel_fields:
|
|
678
705
|
if callable(field.default):
|
|
@@ -683,7 +710,7 @@ class Baker(Generic[M]):
|
|
|
683
710
|
elif field.choices:
|
|
684
711
|
generator = random_gen.gen_from_choices(field.choices)
|
|
685
712
|
elif is_content_type_fk:
|
|
686
|
-
generator = self.type_mapping[
|
|
713
|
+
generator = self.type_mapping[contenttypes_models.ContentType]
|
|
687
714
|
elif generators.get(field.__class__):
|
|
688
715
|
generator = generators.get(field.__class__)
|
|
689
716
|
elif field.__class__ in self.type_mapping:
|
|
@@ -801,12 +828,7 @@ def bulk_create(baker: Baker[M], quantity: int, **kwargs) -> List[M]:
|
|
|
801
828
|
else:
|
|
802
829
|
manager = baker.model._base_manager
|
|
803
830
|
|
|
804
|
-
existing_entries = list(manager.values_list("pk", flat=True))
|
|
805
831
|
created_entries = manager.bulk_create(entries)
|
|
806
|
-
# bulk_create in Django < 4.0 does not return ids of created objects.
|
|
807
|
-
# drop this after 01 Apr 2024 (Django 3.2 LTS end of life)
|
|
808
|
-
if DJANGO_VERSION < (4, 0):
|
|
809
|
-
created_entries = manager.exclude(pk__in=existing_entries)
|
|
810
832
|
|
|
811
833
|
# set many-to-many relations from kwargs
|
|
812
834
|
for entry in created_entries:
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from django.apps import apps
|
|
2
|
+
|
|
3
|
+
BAKER_CONTENTTYPES = apps.is_installed("django.contrib.contenttypes")
|
|
4
|
+
|
|
5
|
+
default_contenttypes_mapping = {}
|
|
6
|
+
|
|
7
|
+
__all__ = ["BAKER_CONTENTTYPES", "default_contenttypes_mapping"]
|
|
8
|
+
|
|
9
|
+
if BAKER_CONTENTTYPES:
|
|
10
|
+
from django.contrib.contenttypes.models import ContentType
|
|
11
|
+
|
|
12
|
+
from . import random_gen
|
|
13
|
+
|
|
14
|
+
default_contenttypes_mapping[ContentType] = random_gen.gen_content_type
|
model_bakery/generators.py
CHANGED
|
@@ -3,6 +3,8 @@ from typing import Any, Callable, Dict, Optional, Type, Union
|
|
|
3
3
|
|
|
4
4
|
from django.db.backends.base.operations import BaseDatabaseOperations
|
|
5
5
|
from django.db.models import (
|
|
6
|
+
AutoField,
|
|
7
|
+
BigAutoField,
|
|
6
8
|
BigIntegerField,
|
|
7
9
|
BinaryField,
|
|
8
10
|
BooleanField,
|
|
@@ -19,11 +21,14 @@ from django.db.models import (
|
|
|
19
21
|
ImageField,
|
|
20
22
|
IntegerField,
|
|
21
23
|
IPAddressField,
|
|
24
|
+
JSONField,
|
|
22
25
|
ManyToManyField,
|
|
23
26
|
OneToOneField,
|
|
27
|
+
PositiveBigIntegerField,
|
|
24
28
|
PositiveIntegerField,
|
|
25
29
|
PositiveSmallIntegerField,
|
|
26
30
|
SlugField,
|
|
31
|
+
SmallAutoField,
|
|
27
32
|
SmallIntegerField,
|
|
28
33
|
TextField,
|
|
29
34
|
TimeField,
|
|
@@ -34,40 +39,12 @@ from django.db.models import (
|
|
|
34
39
|
from . import random_gen
|
|
35
40
|
from .utils import import_from_str
|
|
36
41
|
|
|
37
|
-
try:
|
|
38
|
-
# Proper support starts with Django 3.0
|
|
39
|
-
# (as it uses `django/db/backends/base/operations.py` for matching ranges)
|
|
40
|
-
from django.db.models import AutoField, BigAutoField, SmallAutoField
|
|
41
|
-
except ImportError:
|
|
42
|
-
AutoField = None
|
|
43
|
-
BigAutoField = None
|
|
44
|
-
SmallAutoField = None
|
|
45
|
-
|
|
46
|
-
try:
|
|
47
|
-
# added in Django 3.1
|
|
48
|
-
from django.db.models import PositiveBigIntegerField
|
|
49
|
-
except ImportError:
|
|
50
|
-
PositiveBigIntegerField = None
|
|
51
|
-
|
|
52
|
-
try:
|
|
53
|
-
# Replaced `django.contrib.postgres.fields.JSONField` in Django 3.1
|
|
54
|
-
from django.db.models import JSONField
|
|
55
|
-
except ImportError:
|
|
56
|
-
JSONField = None
|
|
57
|
-
|
|
58
42
|
try:
|
|
59
43
|
# PostgreSQL-specific field (only available when psycopg is installed)
|
|
60
44
|
from django.contrib.postgres.fields import ArrayField
|
|
61
45
|
except ImportError:
|
|
62
46
|
ArrayField = None
|
|
63
47
|
|
|
64
|
-
try:
|
|
65
|
-
# Deprecated since Django 3.1, removed in Django 4.0
|
|
66
|
-
# PostgreSQL-specific field (only available when psycopg is installed)
|
|
67
|
-
from django.contrib.postgres.fields import JSONField as PostgresJSONField
|
|
68
|
-
except ImportError:
|
|
69
|
-
PostgresJSONField = None
|
|
70
|
-
|
|
71
48
|
try:
|
|
72
49
|
# PostgreSQL-specific field (only available when psycopg is installed)
|
|
73
50
|
from django.contrib.postgres.fields import HStoreField
|
|
@@ -86,12 +63,6 @@ except ImportError:
|
|
|
86
63
|
CIEmailField = None
|
|
87
64
|
CITextField = None
|
|
88
65
|
|
|
89
|
-
try:
|
|
90
|
-
# Deprecated since Django 3.1, removed in Django 4.0
|
|
91
|
-
from django.db.models import NullBooleanField
|
|
92
|
-
except ImportError:
|
|
93
|
-
NullBooleanField = None
|
|
94
|
-
|
|
95
66
|
|
|
96
67
|
try:
|
|
97
68
|
# PostgreSQL-specific fields (only available when psycopg is installed)
|
|
@@ -124,9 +95,13 @@ default_mapping = {
|
|
|
124
95
|
OneToOneField: random_gen.gen_related,
|
|
125
96
|
ManyToManyField: random_gen.gen_m2m,
|
|
126
97
|
BooleanField: random_gen.gen_boolean,
|
|
98
|
+
AutoField: _make_integer_gen_by_range(AutoField),
|
|
99
|
+
BigAutoField: _make_integer_gen_by_range(BigAutoField),
|
|
127
100
|
IntegerField: _make_integer_gen_by_range(IntegerField),
|
|
101
|
+
SmallAutoField: _make_integer_gen_by_range(SmallAutoField),
|
|
128
102
|
BigIntegerField: _make_integer_gen_by_range(BigIntegerField),
|
|
129
103
|
SmallIntegerField: _make_integer_gen_by_range(SmallIntegerField),
|
|
104
|
+
PositiveBigIntegerField: _make_integer_gen_by_range(PositiveBigIntegerField),
|
|
130
105
|
PositiveIntegerField: _make_integer_gen_by_range(PositiveIntegerField),
|
|
131
106
|
PositiveSmallIntegerField: _make_integer_gen_by_range(PositiveSmallIntegerField),
|
|
132
107
|
FloatField: random_gen.gen_float,
|
|
@@ -146,14 +121,11 @@ default_mapping = {
|
|
|
146
121
|
FileField: random_gen.gen_file_field,
|
|
147
122
|
ImageField: random_gen.gen_image_field,
|
|
148
123
|
DurationField: random_gen.gen_interval,
|
|
124
|
+
JSONField: random_gen.gen_json,
|
|
149
125
|
} # type: Dict[Type, Callable]
|
|
150
126
|
|
|
151
127
|
if ArrayField:
|
|
152
128
|
default_mapping[ArrayField] = random_gen.gen_array
|
|
153
|
-
if JSONField:
|
|
154
|
-
default_mapping[JSONField] = random_gen.gen_json
|
|
155
|
-
if PostgresJSONField:
|
|
156
|
-
default_mapping[PostgresJSONField] = random_gen.gen_json
|
|
157
129
|
if HStoreField:
|
|
158
130
|
default_mapping[HStoreField] = random_gen.gen_hstore
|
|
159
131
|
if CICharField:
|
|
@@ -162,16 +134,6 @@ if CIEmailField:
|
|
|
162
134
|
default_mapping[CIEmailField] = random_gen.gen_email
|
|
163
135
|
if CITextField:
|
|
164
136
|
default_mapping[CITextField] = random_gen.gen_text
|
|
165
|
-
if AutoField:
|
|
166
|
-
default_mapping[AutoField] = _make_integer_gen_by_range(AutoField)
|
|
167
|
-
if BigAutoField:
|
|
168
|
-
default_mapping[BigAutoField] = _make_integer_gen_by_range(BigAutoField)
|
|
169
|
-
if SmallAutoField:
|
|
170
|
-
default_mapping[SmallAutoField] = _make_integer_gen_by_range(SmallAutoField)
|
|
171
|
-
if PositiveBigIntegerField:
|
|
172
|
-
default_mapping[PositiveBigIntegerField] = _make_integer_gen_by_range(
|
|
173
|
-
PositiveBigIntegerField
|
|
174
|
-
)
|
|
175
137
|
if DecimalRangeField:
|
|
176
138
|
default_mapping[DecimalRangeField] = random_gen.gen_pg_numbers_range(Decimal)
|
|
177
139
|
if IntegerRangeField:
|
|
@@ -182,22 +144,18 @@ if DateRangeField:
|
|
|
182
144
|
default_mapping[DateRangeField] = random_gen.gen_date_range
|
|
183
145
|
if DateTimeRangeField:
|
|
184
146
|
default_mapping[DateTimeRangeField] = random_gen.gen_datetime_range
|
|
185
|
-
if NullBooleanField:
|
|
186
|
-
default_mapping[NullBooleanField] = random_gen.gen_boolean
|
|
187
147
|
|
|
188
148
|
|
|
189
149
|
# Add GIS fields
|
|
190
150
|
|
|
191
151
|
|
|
192
152
|
def get_type_mapping() -> Dict[Type, Callable]:
|
|
193
|
-
from
|
|
194
|
-
|
|
153
|
+
from .content_types import default_contenttypes_mapping
|
|
195
154
|
from .gis import default_gis_mapping
|
|
196
155
|
|
|
197
156
|
mapping = default_mapping.copy()
|
|
198
|
-
mapping
|
|
157
|
+
mapping.update(default_contenttypes_mapping)
|
|
199
158
|
mapping.update(default_gis_mapping)
|
|
200
|
-
|
|
201
159
|
return mapping.copy()
|
|
202
160
|
|
|
203
161
|
|
model_bakery/random_gen.py
CHANGED
|
@@ -27,7 +27,7 @@ MAX_LENGTH = 300
|
|
|
27
27
|
# Postgres database.
|
|
28
28
|
MAX_INT = 100000000000
|
|
29
29
|
|
|
30
|
-
baker_random = Random()
|
|
30
|
+
baker_random = Random() # noqa: S311
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
def get_content_file(content: bytes, name: str) -> ContentFile:
|
|
@@ -112,9 +112,7 @@ def gen_time() -> time:
|
|
|
112
112
|
|
|
113
113
|
|
|
114
114
|
def gen_string(max_length: int) -> str:
|
|
115
|
-
return
|
|
116
|
-
"".join(baker_random.choice(string.ascii_letters) for _ in range(max_length))
|
|
117
|
-
)
|
|
115
|
+
return "".join(baker_random.choice(string.ascii_letters) for _ in range(max_length))
|
|
118
116
|
|
|
119
117
|
|
|
120
118
|
def _gen_string_get_max_length(field: Field) -> Tuple[str, int]:
|
|
@@ -129,7 +127,7 @@ gen_string.required = [_gen_string_get_max_length] # type: ignore[attr-defined]
|
|
|
129
127
|
|
|
130
128
|
def gen_slug(max_length: int) -> str:
|
|
131
129
|
valid_chars = string.ascii_letters + string.digits + "_-"
|
|
132
|
-
return
|
|
130
|
+
return "".join(baker_random.choice(valid_chars) for _ in range(max_length))
|
|
133
131
|
|
|
134
132
|
|
|
135
133
|
gen_slug.required = ["max_length"] # type: ignore[attr-defined]
|
model_bakery/recipe.py
CHANGED
|
@@ -94,8 +94,7 @@ class Recipe(Generic[M]):
|
|
|
94
94
|
_bulk_create: bool = False,
|
|
95
95
|
_save_kwargs: Optional[Dict[str, Any]] = None,
|
|
96
96
|
**attrs: Any,
|
|
97
|
-
) -> M:
|
|
98
|
-
...
|
|
97
|
+
) -> M: ...
|
|
99
98
|
|
|
100
99
|
@overload
|
|
101
100
|
def make(
|
|
@@ -108,8 +107,7 @@ class Recipe(Generic[M]):
|
|
|
108
107
|
_bulk_create: bool = False,
|
|
109
108
|
_save_kwargs: Optional[Dict[str, Any]] = None,
|
|
110
109
|
**attrs: Any,
|
|
111
|
-
) -> List[M]:
|
|
112
|
-
...
|
|
110
|
+
) -> List[M]: ...
|
|
113
111
|
|
|
114
112
|
def make(
|
|
115
113
|
self,
|
|
@@ -146,8 +144,7 @@ class Recipe(Generic[M]):
|
|
|
146
144
|
_save_related: bool = False,
|
|
147
145
|
_using: str = "",
|
|
148
146
|
**attrs: Any,
|
|
149
|
-
) -> M:
|
|
150
|
-
...
|
|
147
|
+
) -> M: ...
|
|
151
148
|
|
|
152
149
|
@overload
|
|
153
150
|
def prepare(
|
|
@@ -156,8 +153,7 @@ class Recipe(Generic[M]):
|
|
|
156
153
|
_save_related: bool = False,
|
|
157
154
|
_using: str = "",
|
|
158
155
|
**attrs: Any,
|
|
159
|
-
) -> List[M]:
|
|
160
|
-
...
|
|
156
|
+
) -> List[M]: ...
|
|
161
157
|
|
|
162
158
|
def prepare(
|
|
163
159
|
self,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: model-bakery
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.18.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>
|
|
@@ -9,9 +9,8 @@ License-File: LICENSE
|
|
|
9
9
|
Keywords: django,factory,python,testing
|
|
10
10
|
Classifier: Development Status :: 5 - Production/Stable
|
|
11
11
|
Classifier: Framework :: Django
|
|
12
|
-
Classifier: Framework :: Django :: 3.2
|
|
13
|
-
Classifier: Framework :: Django :: 4.1
|
|
14
12
|
Classifier: Framework :: Django :: 4.2
|
|
13
|
+
Classifier: Framework :: Django :: 5.0
|
|
15
14
|
Classifier: Intended Audience :: Developers
|
|
16
15
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
17
16
|
Classifier: Operating System :: OS Independent
|
|
@@ -24,8 +23,9 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
24
23
|
Classifier: Programming Language :: Python :: 3.12
|
|
25
24
|
Classifier: Topic :: Software Development
|
|
26
25
|
Requires-Python: >=3.8
|
|
27
|
-
Requires-Dist: django>=
|
|
26
|
+
Requires-Dist: django>=4.2
|
|
28
27
|
Provides-Extra: docs
|
|
28
|
+
Requires-Dist: myst-parser; extra == 'docs'
|
|
29
29
|
Requires-Dist: sphinx; extra == 'docs'
|
|
30
30
|
Requires-Dist: sphinx-rtd-theme; extra == 'docs'
|
|
31
31
|
Provides-Extra: test
|
|
@@ -55,7 +55,7 @@ Model Bakery is a rename of the legacy [Model Mommy project](https://pypi.org/pr
|
|
|
55
55
|
## Install
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
|
-
pip install
|
|
58
|
+
pip install model-bakery
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
## Usage and Info
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
model_bakery/__about__.py,sha256=eOdR8Sg_yEJg0qk8bqKXxy1LJBKxzo3fV50mKHzE9zE,23
|
|
2
|
+
model_bakery/__init__.py,sha256=yY0xZUrr_mskBm07iF-MFBEiXzOuKrlMwpKWkXZs8v0,31
|
|
3
|
+
model_bakery/_types.py,sha256=P0iKC5-Cnh3lyzyZs1mlCfOW31zbEZpxqWCuYonucKo,130
|
|
4
|
+
model_bakery/baker.py,sha256=yhtA9bj8oxB6lLFZIQZ7RmWMFV2pckf6JQpHTgGU5rI,28096
|
|
5
|
+
model_bakery/content_types.py,sha256=3POJ12aqPuSvCdKYuwb1GlJpSocgByG2JW5kw7VBNxQ,395
|
|
6
|
+
model_bakery/exceptions.py,sha256=q1oBZvfxL7HAD-F9aWgiYs4P4rz-hJ5TjeX7gcb3Q0I,333
|
|
7
|
+
model_bakery/generators.py,sha256=agY6pH14vjehVI0wJDw3Q-u4zt7mq2M1a3CUPTkAxp0,5169
|
|
8
|
+
model_bakery/gis.py,sha256=eTNOfT98_ncLAb4KmOYJhE-3ALU2_pQbUpWPTolFZJI,1028
|
|
9
|
+
model_bakery/mock_file.txt,sha256=CO5zPS6Uydk48ZRnGcRKVEYKd2YjaUMa9QOgF5gGMCo,10
|
|
10
|
+
model_bakery/mock_img.jpeg,sha256=iF2ybgAVtDvl48-8VKdv_QFHKfnqeOaeGwR6ZLexJkY,1916
|
|
11
|
+
model_bakery/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
+
model_bakery/random_gen.py,sha256=IYhDhqsRBftceQRHtc9B4bUWLTjvEXkgEwhNhp9DajE,9787
|
|
13
|
+
model_bakery/recipe.py,sha256=dJcn5WQpB1r5mXGIJNAzoCaSYSdsyhvJQqEJNAUVwmo,8379
|
|
14
|
+
model_bakery/timezone.py,sha256=rd-KGVHqJoHdHKBgENPMBTRqqxgKE91CM9C0f9nS90M,325
|
|
15
|
+
model_bakery/utils.py,sha256=fw4ewtwkJ6wZ9PbDzBGvODX7CV81ozy2_6JAQmITmX4,4581
|
|
16
|
+
model_bakery-1.18.0.dist-info/METADATA,sha256=h-afx4_DFHrR4gfFFJpeBix1DLUaqBjjyN8GD6c8xB8,4316
|
|
17
|
+
model_bakery-1.18.0.dist-info/WHEEL,sha256=osohxoshIHTFJFVPhsi1UkZuLRGMHRXZzwEBW2ezjrc,87
|
|
18
|
+
model_bakery-1.18.0.dist-info/licenses/LICENSE,sha256=kCwHls7z8Y7NyZCmdnV1qLSdLrQ8bHrXLji5HOasgUc,611
|
|
19
|
+
model_bakery-1.18.0.dist-info/RECORD,,
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
model_bakery/__about__.py,sha256=zXjo5icgcGx5X40awUvUOk5_ohh0Pz1N3VFKYCfYEcM,23
|
|
2
|
-
model_bakery/__init__.py,sha256=yY0xZUrr_mskBm07iF-MFBEiXzOuKrlMwpKWkXZs8v0,31
|
|
3
|
-
model_bakery/_types.py,sha256=P0iKC5-Cnh3lyzyZs1mlCfOW31zbEZpxqWCuYonucKo,130
|
|
4
|
-
model_bakery/baker.py,sha256=ah9X--BaBxflvkbXxek2RyCR72zLa5dpdzwefDVKhRE,27482
|
|
5
|
-
model_bakery/exceptions.py,sha256=q1oBZvfxL7HAD-F9aWgiYs4P4rz-hJ5TjeX7gcb3Q0I,333
|
|
6
|
-
model_bakery/generators.py,sha256=IkYFBTwSVwa_wwPnZRiVR1vHqUfjWqmyPGCl10RElB0,6467
|
|
7
|
-
model_bakery/gis.py,sha256=eTNOfT98_ncLAb4KmOYJhE-3ALU2_pQbUpWPTolFZJI,1028
|
|
8
|
-
model_bakery/mock_file.txt,sha256=CO5zPS6Uydk48ZRnGcRKVEYKd2YjaUMa9QOgF5gGMCo,10
|
|
9
|
-
model_bakery/mock_img.jpeg,sha256=iF2ybgAVtDvl48-8VKdv_QFHKfnqeOaeGwR6ZLexJkY,1916
|
|
10
|
-
model_bakery/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
-
model_bakery/random_gen.py,sha256=ZDtUwEEd735ot2V0HeVb8oX3_0QOwdmKAdBpl0bt7oI,9797
|
|
12
|
-
model_bakery/recipe.py,sha256=miruAnulPVL4N7Q3tXRfRV95MUvbpZZ3A5M7afv-2O8,8411
|
|
13
|
-
model_bakery/timezone.py,sha256=rd-KGVHqJoHdHKBgENPMBTRqqxgKE91CM9C0f9nS90M,325
|
|
14
|
-
model_bakery/utils.py,sha256=fw4ewtwkJ6wZ9PbDzBGvODX7CV81ozy2_6JAQmITmX4,4581
|
|
15
|
-
model_bakery-1.16.0.dist-info/METADATA,sha256=g5uiWnzpgE3sv0GkrH9SUveRiSm4pNub7puA_CGBVMI,4311
|
|
16
|
-
model_bakery-1.16.0.dist-info/WHEEL,sha256=9QBuHhg6FNW7lppboF2vKVbCGTVzsFykgRQjjlajrhA,87
|
|
17
|
-
model_bakery-1.16.0.dist-info/licenses/LICENSE,sha256=kCwHls7z8Y7NyZCmdnV1qLSdLrQ8bHrXLji5HOasgUc,611
|
|
18
|
-
model_bakery-1.16.0.dist-info/RECORD,,
|
|
File without changes
|