跳转到主要内容

简约、独立且无依赖的假数据生成器。

项目描述

简约、独立且无依赖的假数据生成器。

PyPI Version Supported Python versions Build Status Documentation Status MIT Coverage

fake.py 是一个独立、便携的库,用于为测试生成各种随机数据类型。

它提供了一个简化且无依赖的替代方案,用于创建随机文本、(人)名、URL、日期、文件名、IP、原始Python数据类型(如 uuidstrintfloatbool)、GEO数据(如城市、国家、地理位置、国家代码、纬度、经度)以及多种文件格式的字节内容,包括 PDFDOCXODTPNGSVGBMPGIFTIFPPMWAVZIPTAREML

该软件包还支持在文件系统中创建文件,并包括与 DjangoTortoiseORMPydanticSQLAlchemy 兼容的工厂(动态固定值)(这意味着它与 SQLModel 也兼容)。

功能

  • 生成随机文本、(人物)姓名、电子邮件、URL、日期、IP和原始Python数据类型。

  • 支持各种文件格式(PDFDOCXODTTXTPNGSVGBMPGIFTIFPPMWAVZIPTAREML)以及在文件系统上创建文件。

  • 基本工厂,用于与DjangoPydanticTortoiseORMSQLAlchemy集成。

  • 命令行界面(CLI),用于从命令行生成数据。

先决条件

Python 3.9+

安装

pip

pip install fake.py

下载并复制

fake.py是该包的唯一、独立的模块。它还包括测试。如果您觉得更方便,可以简单下载fake.py模块并将其包含在您的仓库中。

由于包含测试,它不会对您的测试覆盖率产生负面影响(您可能需要调整覆盖率配置)。

文档

  • 文档可在Read the Docs上找到。

  • 有关各种代码示例,请参阅食谱

  • 有关如何使用工厂的提示,请参阅工厂

  • 有关定制的提示,请参阅定制

  • 有关创建PDF的提示,请参阅创建PDF

  • 有关创建DOCX的提示,请参阅创建DOCX

  • 有关创建ODT的提示,请参阅创建ODT

  • 有关创建图像的提示,请参阅创建图像

  • 有关创建存档的提示,请参阅创建存档

  • 有关各种实现示例,请参阅示例

  • 有关命令行界面(CLI)文档,请参阅CLI

  • 有关贡献指南,请参阅贡献者指南

用法

生成数据

人物姓名

from fake import FAKER

FAKER.first_name()  # str
FAKER.first_names()  # list[str]
FAKER.last_name()  # str
FAKER.last_names()  # list[str]
FAKER.name()  # str
FAKER.names()  # list[str]
FAKER.username()  # str
FAKER.usernames()  # list[str]

随机文本

from fake import FAKER

FAKER.password()  # str
FAKER.paragraph()  # str
FAKER.paragraphs()  # list[str]
FAKER.sentence()  # str
FAKER.sentences()  # list[str]
FAKER.slug()  # str
FAKER.slugs()  # list[str]
FAKER.text()  # str
FAKER.texts()  # list[str]
FAKER.word()  # str
FAKER.words()  # list[str]

互联网

from fake import FAKER

FAKER.company_email()  # str
FAKER.domain_name()  # str
FAKER.email()  # str
FAKER.free_email()  # str
FAKER.free_email_domain()  # str
FAKER.image_url()  # str
FAKER.ipv4()  # str
FAKER.tld()  # str
FAKER.url()  # str

文件名

from fake import FAKER

FAKER.file_extension()  # str
FAKER.file_name()  # str
FAKER.mime_type()  # str

原始数据类型

from fake import FAKER

FAKER.pybool()  # bool
FAKER.pyfloat()  # flot
FAKER.pyint()  # int
FAKER.pystr()  # str
FAKER.uuid()  # uuid.UUID

日期

from fake import FAKER

FAKER.date()  # datetime.date
FAKER.date_time()  # datetime.datetime

地理数据

from fake import FAKER

FAKER.city()  # str
FAKER.country()  # str
FAKER.geo_location()  # str
FAKER.country_code()  # str
FAKER.locale()  # str
FAKER.latitude()  # float
FAKER.longitude()  # float
FAKER.latitude_longitude()  # tuple[float, float]

书籍

from fake import FAKER

FAKER.isbn10()  # str
FAKER.isbn13()  # str

银行

from fake import FAKER

FAKER.iban()  # str

生成文件

作为字节

from fake import FAKER

FAKER.bmp()  # bytes
FAKER.docx()  # bytes
FAKER.eml()  # bytes
FAKER.gif()  # bytes
FAKER.odt()  # bytes
FAKER.pdf()  # bytes
FAKER.png()  # bytes
FAKER.ppm()  # bytes
FAKER.svg()  # bytes
FAKER.tar()  # bytes
FAKER.tif()  # bytes
FAKER.wav()  # bytes
FAKER.zip()  # bytes

作为文件系统上的文件

from fake import FAKER

FAKER.bmp_file()  # str
FAKER.docx_file()  # str
FAKER.eml_file()  # str
FAKER.gif_file()  # str
FAKER.odt_file()  # str
FAKER.pdf_file()  # str
FAKER.png_file()  # str
FAKER.ppm_file()  # str
FAKER.svg_file()  # str
FAKER.tar_file()  # str
FAKER.tif_file()  # str
FAKER.txt_file()  # str
FAKER.wav_file()  # str
FAKER.zip_file()  # str

工厂/动态固定值

这是如何为Django的内置GroupUser模型定义工厂的方法。

文件名:factories.py

from django.contrib.auth.models import Group, User
from fake import (
    DjangoModelFactory,
    FACTORY,
    PostSave,
    PreSave,
    trait,
)


class GroupFactory(DjangoModelFactory):
    """Group factory."""

    name = FACTORY.word()

    class Meta:
        model = Group
        get_or_create = ("name",)


def set_password(user: User, password: str) -> None:
    """Helper function for setting password for the User."""
    user.set_password(password)


def add_to_group(user: User, name: str) -> None:
    """Helper function for adding the User to a Group."""
    group = GroupFactory(name=name)
    user.groups.add(group)


class UserFactory(DjangoModelFactory):
    """User factory."""

    username = FACTORY.username()
    first_name = FACTORY.first_name()
    last_name = FACTORY.last_name()
    email = FACTORY.email()
    date_joined = FACTORY.date_time()
    last_login = FACTORY.date_time()
    is_superuser = False
    is_staff = False
    is_active = FACTORY.pybool()
    password = PreSave(set_password, password="test1234")
    group = PostSave(add_to_group, name="Test group")

    class Meta:
        model = User
        get_or_create = ("username",)

    @trait
    def is_admin_user(self, instance: User) -> None:
        """Trait."""
        instance.is_superuser = True
        instance.is_staff = True
        instance.is_active = True

以下是使用它的方法

# Create just one user
user = UserFactory()

# Create 5 users
users = UserFactory.create_batch(5)

# Create a user using `is_admin_user` trait
user = UserFactory(is_admin_user=True)

# Create a user with custom password
user = UserFactory(
    password=PreSave(set_password, password="another-password"),
)

# Add a user to another group
user = UserFactory(
    group=PostSave(add_to_group, name="Another group"),
)

# Or even add user to multiple groups at once
user = UserFactory(
    group_1=PostSave(add_to_group, name="Another group"),
    group_2=PostSave(add_to_group, name="Yet another group"),
)

自定义

创建自己的自定义提供者,并利用它们使用工厂。

文件名:custom_fake.py

import random
import string

from fake import Faker, Factory, provider


class CustomFaker(Faker):

    @provider
    def postal_code(self) -> str:
        number_part = "".join(random.choices(string.digits, k=4))
        letter_part = "".join(random.choices(string.ascii_uppercase, k=2))
        return f"{number_part} {letter_part}"


FAKER = CustomFaker()
FACTORY = Factory(FAKER)

现在您可以使用它如下(请确保导入您的自定义FAKERFACTORY实例)

from custom_fake import FAKER  # Custom `FAKER` instance

FAKER.postal_code()

或如下

from fake import ModelFactory

from custom_fake import FACTORY  # Custom `FACTORY` instance


class AddressFactory(ModelFactory):

    # ... other definitions
    postal_code = FACTORY.postal_code()
    # ... other definitions

    class Meta:
        model = Address

测试

使用unittest运行测试

python -m unittest fake.py

或pytest

pytest

与替代方案的区别

fake.py 是一个打包了 Fakerfactory_boyfaker-file 的工具,功能大幅简化,减少了特性,但没有任何外部依赖(甚至不包括 Pillowdateutil)。

fake.py 的设计灵感来源于著名的 Faker 包。它的 API 与 Faker 兼容性很高,尽管功能大幅减少。它不支持多语言,也不支持邮政编码或许多 RAW 文件格式。然而,您可以轻松地将它集成到生产环境中,无需担心额外的依赖。

另一方面,fake.py 的工厂看起来与 factory_boy 的工厂非常相似,尽管功能再次大幅简化。

fake.py 的文件生成部分模仿了 faker-file。您不会获得大量支持的文件类型,并且对生成文件的内容的控制也不多,但您会得到无依赖的有效文件,如果您只需要这些,那么您不需要再寻找其他工具。

然而,如果您在任何时候发现“需要更多”,可以选择使用 Fakerfactory_boyfaker-file 的组合。

编写文档

请保持以下层次结构。

=====
title
=====

header
======

sub-header
----------

sub-sub-header
~~~~~~~~~~~~~~

sub-sub-sub-header
^^^^^^^^^^^^^^^^^^

sub-sub-sub-sub-header
++++++++++++++++++++++

sub-sub-sub-sub-sub-header
**************************

许可

MIT

支持

有关安全问题,请联系作者部分提供的电子邮件。

有关总体问题,请访问 GitHub

作者

Artur Barseghyan <artur.barseghyan@gmail.com>

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

fake_py-0.10.1.tar.gz (163.5 kB 查看哈希值)

上传时间

构建分布

fake.py-0.10.1-py3-none-any.whl (50.4 kB 查看哈希值)

上传时间 Python 3

由以下组织支持