loophp / typed-generators
生成随机类型值和任意形状。
dev-main
2024-05-28 07:37 UTC
Requires
- php: >= 7.4
Requires (Dev)
- ext-pcov: *
- drupol/php-conventions: ^5
- fakerphp/faker: ^1.19
- infection/infection: ^0.29
- phpbench/phpbench: ^1.2
- phpstan/phpstan-phpunit: ^1.1
- phpstan/phpstan-strict-rules: ^1.0
- phpunit/php-code-coverage: ^9.2
- phpunit/phpunit: ^9.5
- symfony/var-dumper: ^6.1
README
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
尝试。
静态分析器也控制代码。已将 PHPStan 和 PSalm 设置为最大级别。
贡献
请随意通过发送拉取请求来贡献。我们通常是一个非常响应的团队,我们将帮助您从开始到结束通过您的拉取请求。
由于某些原因,如果您无法对代码做出贡献并愿意提供帮助,赞助是一个好、可靠且安全的方式,以表达对我们在此包上投入时间的感激之情。
变更日志
请参阅 CHANGELOG.md 以获取基于 git 提交 的变更日志。
有关更详细的变更日志,请查看 发布变更日志。