When using with Faker
, there are two ways of using the providers.
from faker import Faker
from faker_file.providers.bin_file import BinFileProvider
from faker_file.providers.docx_file import DocxFileProvider
from faker_file.providers.pdf_file import PdfFileProvider
from faker_file.providers.pptx_file import PptxFileProvider
from faker_file.providers.txt_file import TxtFileProvider
from faker_file.providers.zip_file import ZipFileProvider
FAKER = Faker()
# Usage example
file = TxtFileProvider(FAKER).txt_file(content="Lorem ipsum")
from faker import Faker
from faker_file.providers.docx_file import DocxFileProvider
from faker_file.providers.pdf_file import PdfFileProvider
from faker_file.providers.pptx_file import PptxFileProvider
from faker_file.providers.txt_file import TxtFileProvider
from faker_file.providers.zip_file import ZipFileProvider
FAKER = Faker()
FAKER.add_provider(DocxFileProvider)
FAKER.add_provider(PdfFileProvider)
FAKER.add_provider(PptxFileProvider)
FAKER.add_provider(TxtFileProvider)
FAKER.add_provider(ZipFileProvider)
# Usage example
file = FAKER.txt_file(content="Lorem ipsum")
Throughout documentation we will be mixing these approaches.
- Content of the file is
Lorem ipsum
.
file = TxtFileProvider(FAKER).txt_file(content="Lorem ipsum")
- Content is generated dynamically.
- Content is limited to 1024 chars.
- Wrap lines after 80 chars.
- Prefix the filename with
zzz
.
file = DocxFileProvider(FAKER).docx_file(
prefix="zzz",
max_nb_chars=1_024,
wrap_chars_after=80,
)
- 5 TXT files in the ZIP archive (default value is 5).
- Content of all files is
Lorem ipsum
.
file = ZipFileProvider(FAKER).zip_file(options={"content": "Lorem ipsum"})
- 3 DOCX files in the ZIP archive.
- Content is generated dynamically.
- Content is limited to 1024 chars.
- Prefix the filenames in archive with
xxx_
. - Prefix the filename of the archive itself with
zzz
. - Inside the ZIP, put all files in directory
yyy
.
from faker_file.providers.zip_file import create_inner_docx_file
file = ZipFileProvider(FAKER).zip_file(
prefix="zzz",
options={
"count": 3,
"create_inner_file_func": create_inner_docx_file,
"create_inner_file_args": {
"prefix": "xxx_",
"max_nb_chars": 1_024,
}
"directory": "yyy",
}
)
Create a ZIP file which contains 5 ZIP files which contain 5 ZIP files which contain 5 DOCX files.
- 5 ZIP files in the ZIP archive.
- Content is generated dynamically.
- Prefix the filenames in archive with
nested_level_1_
. - Prefix the filename of the archive itself with
nested_level_0_
. - Each of the ZIP files inside the ZIP file in their turn contains 5 other ZIP files, prefixed with
nested_level_2_
, which in their turn contain 5 DOCX files.
from faker_file.providers.zip_file import create_inner_docx_file, create_inner_zip_file
file = ZipFileProvider(FAKER).zip_file(
prefix="nested_level_0_",
options={
"create_inner_file_func": create_inner_zip_file,
"create_inner_file_args": {
"prefix": "nested_level_1_",
"options": {
"create_inner_file_func": create_inner_zip_file,
"create_inner_file_args": {
"prefix": "nested_level_2_",
"options": {
"create_inner_file_func": create_inner_docx_file,
}
},
}
},
}
)
file = FAKER.txt_file(content="Lorem ipsum dolor sit amet")
- Content is generated dynamically.
- Content is limited to 1024 chars.
- Wrap lines after 80 chars.
- Prefix the filename with
zzz
.
file = FAKER.docx_file(
prefix="zzz",
max_nb_chars=1_024,
wrap_chars_after=80,
)
- Content template is predefined and contains dynamic fixtures.
- Wrap lines after 80 chars.
template = """
{{date}} {{city}}, {{country}}
Hello {{name}},
{{text}} {{text}} {{text}}
{{text}} {{text}} {{text}}
{{text}} {{text}} {{text}}
Address: {{address}}
Best regards,
{{name}}
{{address}}
{{phone_number}}
"""
file = FAKER.pdf_file(content=template, wrap_chars_after=80)
- Create an exact copy of the randomly picked file under a different name.
- Prefix of the destination file would be
zzz
. source_dir_path
is the absolute path to the directory to pick files from.
from faker_file.providers.random_file_from_dir import (
RandomFileFromDirProvider,
)
file = RandomFileFromDirProvider(FAKER).random_file_from_dir(
source_dir_path="/tmp/tmp/",
prefix="zzz",
)
When used with Django (to generate fake data with factory_boy
factories), the root_path
argument shall be provided. Otherwise (although no errors will be triggered) the generated files will reside outside the MEDIA_ROOT
directory (by default in /tmp/tmp/
on Linux) and further operations with those files through Django will cause SuspiciousOperation
exception.
from django.db import models
class Upload(models.Model):
"""Upload model."""
name = models.CharField(max_length=255, unique=True)
description = models.TextField(null=True, blank=True)
# Files
docx_file = models.FileField(null=True)
pdf_file = models.FileField(null=True)
pptx_file = models.FileField(null=True)
txt_file = models.FileField(null=True)
zip_file = models.FileField(null=True)
file = models.FileField(null=True)
class Meta:
verbose_name = "Upload"
verbose_name_plural = "Upload"
def __str__(self):
return self.name
from django.conf import settings
from factory import Faker
from factory.django import DjangoModelFactory
# Import all providers we want to use
from faker_file.providers.docx_file import DocxFileProvider
from faker_file.providers.pdf_file import PdfFileProvider
from faker_file.providers.pptx_file import PptxFileProvider
from faker_file.providers.txt_file import TxtFileProvider
from faker_file.providers.zip_file import ZipFileProvider
from upload.models import Upload
# Add all providers we want to use
Faker.add_provider(DocxFileProvider)
Faker.add_provider(PdfFileProvider)
Faker.add_provider(PptxFileProvider)
Faker.add_provider(TxtFileProvider)
Faker.add_provider(ZipFileProvider)
class UploadFactory(DjangoModelFactory):
"""Upload factory."""
name = Faker("text", max_nb_chars=100)
description = Faker("text", max_nb_chars=1000)
# Files
docx_file = Faker("docx_file", root_path=settings.MEDIA_ROOT)
pdf_file = Faker("pdf_file", root_path=settings.MEDIA_ROOT)
pptx_file = Faker("pptx_file", root_path=settings.MEDIA_ROOT)
txt_file = Faker("txt_file", root_path=settings.MEDIA_ROOT)
zip_file = Faker("zip_file", root_path=settings.MEDIA_ROOT)
file = Faker("txt_file", root_path=settings.MEDIA_ROOT)
class Meta:
model = Upload
from random import choice
from factory import LazyAttribute
from faker import Faker as FakerFaker
FAKER = FakerFaker()
PROVIDER_CHOICES = [
lambda: DocxFileProvider(FAKER).docx_file(root_path=settings.MEDIA_ROOT),
lambda: PdfFileProvider(FAKER).pdf_file(root_path=settings.MEDIA_ROOT),
lambda: PptxFileProvider(FAKER).pptx_file(root_path=settings.MEDIA_ROOT),
lambda: TxtFileProvider(FAKER).txt_file(root_path=settings.MEDIA_ROOT),
lambda: ZipFileProvider(FAKER).zip_file(root_path=settings.MEDIA_ROOT),
]
def pick_random_provider(*args, **kwargs):
return choice(PROVIDER_CHOICES)()
class UploadFactory(DjangoModelFactory):
"""Upload factory that randomly picks a file provider."""
# ...
file = LazyAttribute(pick_random_provider)
# ...
The only two file types for which it is easy to foresee the file size are BIN and TXT. Note, that size of BIN files is always exact, while for TXT it is approximate.
file = BinFileProvider(FAKER).bin_file(length=1024**2) # 1 Mb
file = BinFileProvider(FAKER).bin_file(length=3*1024**2) # 3 Mb
file = BinFileProvider(FAKER).bin_file(length=10*1024**2) # 10 Mb
file = BinFileProvider(FAKER).bin_file(length=1024) # 1 Kb
file = BinFileProvider(FAKER).bin_file(length=3*1024) # 3 Kb
file = BinFileProvider(FAKER).bin_file(length=10*1024) # 10 Kb
file = TxtFileProvider(FAKER).txt_file(max_nb_chars=1024**2) # 1 Mb
file = TxtFileProvider(FAKER).txt_file(max_nb_chars=3*1024**2) # 3 Mb
file = TxtFileProvider(FAKER).txt_file(max_nb_chars=10*1024**2) # 10 Mb
file = TxtFileProvider(FAKER).txt_file(max_nb_chars=1024) # 1 Kb
file = TxtFileProvider(FAKER).txt_file(max_nb_chars=3*1024) # 3 Kb
file = TxtFileProvider(FAKER).txt_file(max_nb_chars=10*1024) # 10 Kb