johnykvsky / dummygenerator
Dummy / fake data generator for modern PHP
Requires
- php: ^8.3
- php-di/php-di: ^7.0
- psr/clock: ^1.0
Requires (Dev)
- phpstan/extension-installer: ^1.4.3
- phpstan/phpstan: ^2.3.0
- phpunit/phpunit: ^12.5.14
- slevomat/coding-standard: ^8.31.1
- squizlabs/php_codesniffer: ^4.0.4
Suggests
- ext-intl: Required for better transliteration i.e. in Internet Extension
- ext-mbstring: Required for multibyte Unicode string functionality.
Provides
None
Conflicts
None
Replaces
None
README
Your Random Data Source
Installation
composer require johnykvsky/dummygenerator --dev
Notice
DummyGenerator has evolved into Quidam. It's not abandoned - just at point where being more or less aligned with old Faker reached it's limits. This is why QuidamPHP came to life, to do it with similar idea, but in a different way. Without looking back, without any magic - clean and simple.
About
DummyGenerator is dummy/fake data generator for PHP. It's a fork of Faker, heavily rewritten at core, but overall is same easy to use. In example:
$generator = DummyGenerator::create(); // all extensions are loaded echo $generator->firstName();
Documentation
Full documentation is available in docs/index.md
But why...?
Faker died for our because of being hard to maintain as mentioned in sunsetting-faker.
Faker 2.0 seems to be dead because of "death by committee" kind of stuff.
I needed simple dummy data generator for PHP 8.3, with modern architecture in mind. This is how DummyGenerator came to life.
Changes in compare to Faker
- required PHP >= 8.3
- PHPStan level 8 friendly
- PHPUnit tests for core and extensions (yep, some just check for not empty, but hey, it's random data)
- all
mt_rand/array_randreplaced with\Random\Randomizer - no static methods, only one magic method (
__call()in generator) - interfaces and dependency injection for everything (all core implementations can be replaced with different ones)
- implementations can be changed on the fly with
withDefinition() - language providers removed from core, that makes generator ~9.5Mb smaller
- modernized
Uuid, supportsuuid4(),uuid7(),ulid(), andnilUuid() - removed database providers (core is only for dummy data generation)
- removed
HmlLorem - removed
File::filePath()since it was interacting with system, not only generating dummy data regexifyhas been removed from core as it is not used any more, it's available in dummyproviders if needed- added
Enum, to get random values from PHP enums - added
String, to generate random string from given pool (astext()is not that good for short lengths) - added support for
SystemClock, PSR-20 implementation of Clock, used in date/time generation - added
AnyDateTime, as alternative/replacement forDateTimeextension (see docs for more info) - some extensions have updated properties, i.e. list of available currencies
Worth noticing:
DateTimeextension now also supportsDateTimeInterfacefor methods params (not only strings)boolean()supports also float values from range 0 to 1, i.e.->boolean(0.001)for 0.1% chance
This package also fixes following problems with FakerPHP:
__destruct()messing up withseed()- bug with
unique()->optional()causing massive memory usage - not allowing combination of
validandunique(more about chaining in strategies) Factroy::create()sharing state with other instances- and other various items, mostly fixed by with switching to
\Random\Randomizerand making proper use of it
But most of all: this is written from scratch, no looking back at old Fake architecture. Core is just an organizer (knows nothing about extensions or clock), depends on Container, which holds everything:
- Strategy (Unique, Valid, Chance...)
- Extensions (Person, Address, Internet...)
- Calculators (Iban, Ean...)
- Randomizer (\Random\Randomizer, Xoshiro256StarStar engine for seed...`)
- Clock (PSR-20)
- Replacer
And all that can be replaced with your own implementation. Check overview for more info.
Languages
One of main points of DummyGenerator is to keep core language agnostic. This is why all languages have been moved to dedicated provider packages.
However, core uses general English language for generating fallback data.
The core Person extension provides basic names that can be used as first name, last name, part of email etc. If you want full localized data (names, addresses, phone numbers, localized identifiers like pesel, ssn, nip, ein, etc.), check dummyproviders for 75 standalone language packs.
Keep in mind:
- core will stay language agnostic with some small samples in English
- all language-specific data and localized providers are maintained in dummyproviders
Why PHP >= 8.3
Because of introduced in PHP 8.3:
Randomizer::getFloat()Randomizer::getBytesFromString()- and not so important but nice: typed class constants
What is this fake / dummy data
When writing tests or populating test database you need to came up with various data, like first name, last name, some dates, maybe description, location coordinates and so on. When you deal with multi-language site and want to have it also multilanguage - you need to came up with every language names or address format.
All of that can be done by hand, but it's much easier to do $generator->firstName() and just don't care about what name it will be. Load provider and don't care about given locale names or phone formats.
Another use case - imagine you have description with 100 chars limit and want to test if it properly gives error when more is passed - instead of copying some text you can just use $generator->text(150) to get ~150 characters long text.
Last but not least - it make sure your tests will get random data on each run, not every single time same value. If your code is good and tests correct - then it should be no problem. If tests start failing from time to time - then what you think, where is the problem:
- with code
- with tests
- with random data, it should not be random
I leave answer to you. And yes, there might be cases when data should not be random, but usually it's not that case ;)
Other stuff
There are two Randomizer implementations available:
- default
Randomizer - additional
XoshiroRandomizer, which supportsseed- to be used in tests
There is script\ExtensionsDocs.php that can be used to generate list of available extensions and their methods (look at generate-spec.php)
Since PHPUnit is still missing --repeat, in repository phpunit-repeat you can find Linux shell script for running tests multiple times.
