loophp/typed-generators

生成随机类型值和任意形状。

dev-main 2024-05-28 07:37 UTC

This package is auto-updated.

Last update: 2024-09-22 12:40:09 UTC


README

Latest Stable Version GitHub stars Total Downloads GitHub Workflow Status Scrutinizer code quality Type Coverage Code Coverage Mutation testing badge License Donate!

PHP 类型生成器

描述

生成随机类型值和任意形状。

适用于编写测试,无需编写静态类型值集合,现在可以使用此工具生成它们。

每个生成的随机值或形状都完全类型化,可以安全地由现有的静态分析工具(如 PHPStan 或 PSalm)使用。

安装

composer require loophp/typed-generators

使用方法

此库有一个单入口点类工厂。通过使用单个工厂类,用户可以快速实例化对象并使用自动完成。

TG 中直接找到完整的 API。

快速 API 概览

<?php

declare(strict_types=1);

namespace Snippet;

use loophp\TypedGenerators\TypeGeneratorFactory as TG;

include __DIR__ . '/vendor/autoload.php';

$arrays    = TG::array(TG::string(), TG::string());
$arrayKeys = TG::arrayKey();
$booleans  = TG::bool();
$closures  = TG::closure();
$unions    = TG::union(TG::bool(), TG::int());
$customs   = TG::custom(TG::string(), static fn (): string => 'bar');
$datetimes = TG::datetime();
$faker     = TG::faker(TG::string(), static fn (Faker\Generator $faker): string => $faker->city());
$floats    = TG::float();
$integers  = TG::int();
$iterators = TG::iterator(TG::bool(), TG::string());
$lists     = TG::list(TG::string());
$negatives = TG::negativeInt();
$nulls     = TG::null();
$nullables = TG::nullable(TG::string());
$numerics  = TG::numeric();
$objects   = TG::object();
$positives = TG::positiveInt();
$statics   = TG::static(TG::string(), 'foo');
$strings   = TG::string();
$uniqids   = TG::uniqid();

生成值列表

<?php

declare(strict_types=1);

namespace Snippet;

use loophp\TypedGenerators\TypeGeneratorFactory as TG;

include __DIR__ . '/vendor/autoload.php';

$strings = TG::string();       // Generate strings

foreach ($strings as $string) {
    var_dump($string);         // Random string generated
}

echo $strings();               // Print one random string

生成键值对

<?php

declare(strict_types=1);

namespace Snippet;

use loophp\TypedGenerators\TypeGeneratorFactory as TG;

include __DIR__ . '/vendor/autoload.php';

$iteratorStringBool = TG::iterator(
    TG::string(),       // Keys: Generate strings for keys
    TG::bool()          // Values: Generate booleans for values
);

foreach ($iteratorStringBool() as $key => $value) {
    var_dump($key, $value);   // Random string for key, random boolean for value.
}

与 Faker 集成

<?php

declare(strict_types=1);

namespace Snippet;

use Faker\Generator;
use loophp\TypedGenerators\TypeGeneratorFactory as TG;

include __DIR__ . '/vendor/autoload.php';

$fakerType = TG::faker(
    TG::string(),
    fn (Generator $faker): string => $faker->city()
);

$iterator = TG::iterator(
    TG::string(4), // Keys: A random string of length 4
    $fakerType     // Values: A random city name
);

foreach ($iterator() as $key => $value) {
    var_dump($key, $value);
}

使用随机联合值

联合值可以是类型 A 或类型 B 的值。

<?php

declare(strict_types=1);

namespace Snippet;

use Faker\Generator;
use loophp\TypedGenerators\TypeGeneratorFactory as TG;

include __DIR__ . '/vendor/autoload.php';

$fakerType = TG::faker(
    TG::string(),
    fn (Generator $faker): string => $faker->firstName()
);

$iterator = TG::iterator(
    TG::bool(),    // Keys: A random boolean
    TG::union(  // Values: A random union value which can be
        $fakerType,// either a firstname
        TG::int()  // either an integer.
    )
);

foreach ($iterator() as $key => $value) {
    var_dump($key, $value);
}

生成复杂类型数组形状

<?php

declare(strict_types=1);

namespace Snippet;

use Faker\Generator;
use loophp\TypedGenerators\TypeGeneratorFactory as TG;

include __DIR__ . '/vendor/autoload.php';

$iterator = TG::array(TG::static(TG::string(), 'id'), TG::int(6))
    ->add(
        TG::static(TG::string(), 'uuid'),
        TG::uniqid()
    )
    ->add(
        TG::static(TG::string(), 'firstName'),
        TG::faker(
            TG::string(),
            static fn (Generator $faker): string => $faker->firstName()
        )
    )
    ->add(
        TG::static(TG::string(), 'country'),
        TG::faker(
            TG::string(),
            static fn (Generator $faker): string => $faker->country()
        )
    )
    ->add(
        TG::static(TG::string(), 'isCitizen'),
        TG::bool()
    )
    ->add(
        TG::static(TG::string(), 'hometowm'),
        TG::faker(
            TG::string(),
            static fn (Generator $faker): string => $faker->city()
        )
    )
    ->add(
        TG::static(TG::string(), 'lastSeen'),
        TG::datetime()
    );

foreach ($iterator as $k => $v) {
    // \PHPStan\dumpType($v);
    /** @psalm-trace $v */
    print_r($v);
}

此示例将生成这样的数组

Array
(
    [id] => 545327499
    [uuid] => 629f7198091ee
    [firstName] => Sandra
    [country] => Sardinia
    [isCitizen] => 1
    [hometowm] => Ecaussinnes
    [lastSeen] => DateTimeImmutable Object
        (
            [date] => 2009-06-02 07:40:37.000000
            [timezone_type] => 3
            [timezone] => UTC
        )
)
Array
(
    [id] => 623241523
    [uuid] => 629f719809290
    [firstName] => Paolo
    [country] => Sicily
    [isCitizen] =>
    [hometowm] => Quaregnon
    [lastSeen] => DateTimeImmutable Object
        (
            [date] => 1989-11-11 16:22:02.000000
            [timezone_type] => 3
            [timezone] => UTC
        )
)

使用 PSalm 和 PHPStan 分析 $iterator 变量将得到

$ ./vendor/bin/phpstan analyse --level=9 test.php
 1/1 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%

 ------ --------------------------------------------------------
  Line   test.php
 ------ --------------------------------------------------------
  45     Dumped type: array<string, bool|DateTimeInterface|int|string>
 ------ --------------------------------------------------------

使用 PSalm

$ ./vendor/bin/psalm --show-info=true --no-cache test.php
Target PHP version: 7.4 (inferred from composer.json)
Scanning files...
Analyzing files...

I

INFO: Trace - test.php:46:5 - $v: array<string, DateTimeInterface|bool|int|string> (see https://psalm.dev/224)

代码质量、测试、基准测试

每次向库中引入更改时,Github 都会运行测试。

此库使用 PHPUnit 编写测试。请随意在 tests 目录中查看它们。

在每次提交之前,都会使用 GrumPHP 执行一些检查;运行 composer grumphp 以手动检查。

使用 Infection(一个 PHP 突变测试框架)测试测试的质量 - 运行 composer infection 尝试。

静态分析器也控制代码。已将 PHPStanPSalm 设置为最大级别。

贡献

请随意通过发送拉取请求来贡献。我们通常是一个非常响应的团队,我们将帮助您从开始到结束通过您的拉取请求。

由于某些原因,如果您无法对代码做出贡献并愿意提供帮助,赞助是一个好、可靠且安全的方式,以表达对我们在此包上投入时间的感激之情。

Github 上赞助我以及 任何贡献者

变更日志

请参阅 CHANGELOG.md 以获取基于 git 提交 的变更日志。

有关更详细的变更日志,请查看 发布变更日志