composer.json000064400000002671150250362200007267 0ustar00{ "name": "fakerphp/faker", "type": "library", "description": "Faker is a PHP library that generates fake data for you.", "keywords": [ "faker", "fixtures", "data" ], "license": "MIT", "authors": [ { "name": "François Zaninotto" } ], "require": { "php": "^7.4 || ^8.0", "psr/container": "^2.0", "symfony/deprecation-contracts": "^3.0" }, "require-dev": { "ext-intl": "*", "bamarni/composer-bin-plugin": "^1.4.1", "symfony/phpunit-bridge": "^4.4 || ^5.2" }, "autoload": { "psr-4": { "Faker\\": "src/" } }, "autoload-dev": { "psr-4": { "Faker\\Test\\": "test/Faker/", "Faker\\Test\\Fixture\\": "test/Fixture/" } }, "conflict": { "fzaninotto/faker": "*" }, "suggest": { "ext-curl": "Required by Faker\\Provider\\Image to download images.", "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", "ext-mbstring": "Required for multibyte Unicode string functionality." }, "config": { "allow-plugins": { "bamarni/composer-bin-plugin": true, "composer/package-versions-deprecated": true }, "sort-packages": true }, "extra": { "branch-alias": { "dev-main": "v1.19-dev" } } } CHANGELOG.md000064400000015152150250362200006354 0ustar00# CHANGELOG ## [Unreleased](https://github.com/FakerPHP/Faker/compare/v1.19.0...main) ## [2022-02-02, v1.19.0](https://github.com/FakerPHP/Faker/compare/v1.18.0..v1.19.0) - Added color extension to core (#442) - Added conflict with `doctrine/persistence` below version `1.4` - Fix for support on different Doctrine ORM versions (#414) - Fix usage of `Doctrine\Persistence` dependency - Fix CZ Person birthNumber docblock return type (#437) - Fix is_IS Person docbock types (#439) - Fix is_IS Address docbock type (#438) - Fix regexify escape backslash in character class (#434) - Removed UUID from Generator to be able to extend it (#441) - ## [2022-01-23, v1.18.0](https://github.com/FakerPHP/Faker/compare/v1.17.0..v1.18.0) - Deprecated UUID, use uuid3 to specify version (#427) - Reset formatters when adding a new provider (#366) - Helper methods to use our custom generators (#155) - Set allow-plugins for Composer 2.2 (#405) - Fix kk_KZ\Person::individualIdentificationNumber generation (#411) - Allow for -> syntax to be used in parsing (#423) - Person->name was missing string return type (#424) - Generate a valid BE TAX number (#415) - Added the UUID extension to Core (#427) ## [2021-12-05, v1.17.0](https://github.com/FakerPHP/Faker/compare/v1.16.0..v1.17.0) - Partial PHP 8.1 compatibility (#373) - Add payment provider for `ne_NP` locale (#375) - Add Egyptian Arabic `ar_EG` locale (#377) - Updated list of South African TLDs (#383) - Fixed formatting of E.164 numbers (#380) - Allow `symfony/deprecation-contracts` `^3.0` (#397) ## [2021-09-06, v1.16.0](https://github.com/FakerPHP/Faker/compare/v1.15.0..v1.16.0) - Add Company extension - Add Address extension - Add Person extension - Add PhoneNumber extension - Add VersionExtension (#350) - Stricter types in Extension\Container and Extension\GeneratorAwareExtension (#345) - Fix deprecated property access in `nl_NL` (#348) - Add support for `psr/container` >= 2.0 (#354) - Add missing union types in Faker\Generator (#352) ## [2021-07-06, v1.15.0](https://github.com/FakerPHP/Faker/compare/v1.14.1..v1.15.0) - Updated the generator phpdoc to help identify magic methods (#307) - Prevent direct access and triggered deprecation warning for "word" (#302) - Updated length on all global e164 numbers (#301) - Updated last names from different source (#312) - Don't generate birth number of '000' for Swedish personal identity (#306) - Add job list for localization id_ID (#339) ## [2021-03-30, v1.14.1](https://github.com/FakerPHP/Faker/compare/v1.14.0..v1.14.1) - Fix where randomNumber and randomFloat would return a 0 value (#291 / #292) ## [2021-03-29, v1.14.0](https://github.com/FakerPHP/Faker/compare/v1.13.0..v1.14.0) - Fix for realText to ensure the text keeps closer to its boundaries (#152) - Fix where regexify produces a random character instead of a literal dot (#135 - Deprecate zh_TW methods that only call base methods (#122) - Add used extensions to composer.json as suggestion (#120) - Moved TCNo and INN from calculator to localized providers (#108) - Fix regex dot/backslash issue where a dot is replaced with a backslash as escape character (#206) - Deprecate direct property access (#164) - Added test to assert unique() behaviour (#233) - Added RUC for the es_PE locale (#244) - Test IBAN formats for Latin America (AR/PE/VE) (#260) - Added VAT number for en_GB (#255) - Added new districts for the ne_NP locale (#258) - Fix for U.S. Area Code Generation (#261) - Fix in numerify where a better random numeric value is guaranteed (#256) - Fix e164PhoneNumber to only generate valid phone numbers with valid country codes (#264) - Extract fixtures into separate classes (#234) - Remove french domains that no longer exists (#277) - Fix error that occurs when getting a polish title (#279) - Use valid area codes for North America E164 phone numbers (#280) - Adding support for extensions and PSR-11 (#154) - Adding trait for GeneratorAwareExtension (#165) - Added helper class for extension (#162) - Added blood extension to core (#232) - Added barcode extension to core (#252) - Added number extension (#257) - Various code style updates - Added a note about our breaking change promise (#273) ## [2020-12-18, v1.13.0](https://github.com/FakerPHP/Faker/compare/v1.12.1..v1.13.0) Several fixes and new additions in this release. A lot of cleanup has been done on the codebase on both tests and consistency. - Feature/pl pl license plate (#62) - Fix greek phone numbers (#16) - Move AT payment provider logic to de_AT (#72) - Fix wiktionary links (#73) - Fix AT person links (#74) - Fix AT cities (#75) - Deprecate at_AT providers (#78) - Add Austrian `ssn()` to `Person` provider (#79) - Fix typos in id_ID Address (#83) - Austrian post codes (#86) - Updated Polish data (#70) - Improve Austrian social security number generation (#88) - Move US phone numbers with extension to own method (#91) - Add UK National Insurance number generator (#89) - Fix en_SG phone number generator (#100) - Remove usage of mt_rand (#87) - Remove whitespace from beginning of el_GR phone numbers (#105) - Building numbers can not be 0, 00, 000 (#107) - Add 172.16/12 local IPv4 block (#121) - Add JCB credit card type (#124) - Remove json_decode from emoji generation (#123) - Remove ro street address (#146) ## [2020-12-11, v1.12.1](https://github.com/FakerPHP/Faker/compare/v1.12.0..v1.12.1) This is a security release that prevents a hacker to execute code on the server. ## [2020-11-23, v1.12.0](https://github.com/FakerPHP/Faker/compare/v1.11.0..v1.12.0) - Fix ro_RO first and last day of year calculation offset (#65) - Fix en_NG locale test namespaces that did not match PSR-4 (#57) - Added Singapore NRIC/FIN provider (#56) - Added provider for Lithuanian municipalities (#58) - Added blood types provider (#61) ## [2020-11-15, v1.11.0](https://github.com/FakerPHP/Faker/compare/v1.10.1..v1.11.0) - Added Provider for Swedish Municipalities - Updates to person names in pt_BR - Many code style changes ## [2020-10-28, v1.10.1](https://github.com/FakerPHP/Faker/compare/v1.10.0..v1.10.1) - Updates the Danish addresses in dk_DK - Removed offense company names in nl_NL - Clarify changelog with original fork - Standin replacement for LoremPixel to Placeholder.com (#11) ## [2020-10-27, v1.10.0](https://github.com/FakerPHP/Faker/compare/v1.9.1..v1.10.0) - Support PHP 7.1-8.0 - Fix typo in de_DE Company Provider - Fix dateTimeThisYear method - Fix typo in de_DE jobTitleFormat - Fix IBAN generation for CR - Fix typos in greek first names - Fix US job title typo - Do not clear entity manager for doctrine orm populator - Remove persian rude words - Corrections to RU names ## 2020-10-27, v1.9.1 - Initial version. Same as `fzaninotto/Faker:v1.9.1`. src/ValidGenerator.php000064400000004122150250362200010744 0ustar00valid() * * @mixin Generator */ class ValidGenerator { protected $generator; protected $validator; protected $maxRetries; /** * @param Extension|Generator $generator * @param callable|null $validator * @param int $maxRetries */ public function __construct($generator, $validator = null, $maxRetries = 10000) { if (null === $validator) { $validator = static function () { return true; }; } elseif (!is_callable($validator)) { throw new \InvalidArgumentException('valid() only accepts callables as first argument'); } $this->generator = $generator; $this->validator = $validator; $this->maxRetries = $maxRetries; } public function ext(string $id) { return new self($this->generator->ext($id), $this->validator, $this->maxRetries); } /** * Catch and proxy all generator calls but return only valid values * * @param string $attribute * * @deprecated Use a method instead. */ public function __get($attribute) { trigger_deprecation('fakerphp/faker', '1.14', 'Accessing property "%s" is deprecated, use "%s()" instead.', $attribute, $attribute); return $this->__call($attribute, []); } /** * Catch and proxy all generator calls with arguments but return only valid values * * @param string $name * @param array $arguments */ public function __call($name, $arguments) { $i = 0; do { $res = call_user_func_array([$this->generator, $name], $arguments); ++$i; if ($i > $this->maxRetries) { throw new \OverflowException(sprintf('Maximum retries of %d reached without finding a valid value', $this->maxRetries)); } } while (!call_user_func($this->validator, $res)); return $res; } } src/Calculator/Isbn.php000064400000003012150250362200011017 0ustar00= 0; $i -= 2) { $sum += (int) $number[$i]; } for ($i = $length - 2; $i >= 0; $i -= 2) { $sum += array_sum(str_split((string) ((int) $number[$i] * 2))); } return $sum % 10; } public static function computeCheckDigit(string $partialNumber): string { $checkDigit = self::checksum($partialNumber . '0'); if ($checkDigit === 0) { return '0'; } return (string) (10 - $checkDigit); } /** * Checks whether a number (partial number + check digit) is Luhn compliant */ public static function isValid(string $number): bool { return self::checksum($number) === 0; } /** * Generate a Luhn compliant number. */ public static function generateLuhnNumber(string $partialValue): string { if (!preg_match('/^\d+$/', $partialValue)) { throw new \InvalidArgumentException('Argument should be an integer.'); } return $partialValue . Luhn::computeCheckDigit($partialValue); } } src/Calculator/Iban.php000064400000003031150250362200010776 0ustar00 $digit) { $sums += ((int) $digit) * $sequence[$n % 2]; } return (10 - $sums % 10) % 10; } /** * Checks whether the provided number is an EAN compliant number and that * the checksum is correct. * * @param string $ean An EAN number * * @return bool */ public static function isValid($ean) { if (!preg_match(self::PATTERN, $ean)) { return false; } return self::checksum(substr($ean, 0, -1)) === (int) substr($ean, -1); } } src/Generator.php000064400000026611150250362200007773 0ustar00container = $container ?: Container\ContainerBuilder::getDefault(); } /** * @template T of Extension\Extension * * @param class-string $id * * @throws Extension\ExtensionNotFound * * @return T */ public function ext(string $id) { if (!$this->container->has($id)) { throw new Extension\ExtensionNotFound(sprintf( 'No Faker extension with id "%s" was loaded.', $id )); } $extension = $this->container->get($id); if ($extension instanceof Extension\GeneratorAwareExtension) { $extension = $extension->withGenerator($this); } return $extension; } /** * With the unique generator you are guaranteed to never get the same two * values. * * * // will never return twice the same value * $faker->unique()->randomElement(array(1, 2, 3)); * * * @param bool $reset If set to true, resets the list of existing values * @param int $maxRetries Maximum number of retries to find a unique value, * After which an OverflowException is thrown. * * @throws \OverflowException When no unique value can be found by iterating $maxRetries times * * @return self A proxy class returning only non-existing values */ public function unique($reset = false, $maxRetries = 10000) { if ($reset || $this->uniqueGenerator === null) { $this->uniqueGenerator = new UniqueGenerator($this, $maxRetries); } return $this->uniqueGenerator; } /** * Get a value only some percentage of the time. * * @param float $weight A probability between 0 and 1, 0 means that we always get the default value. * * @return self */ public function optional(float $weight = 0.5, $default = null) { if ($weight > 1) { trigger_deprecation('fakerphp/faker', '1.16', 'First argument ($weight) to method "optional()" must be between 0 and 1. You passed %f, we assume you meant %f.', $weight, $weight / 100); $weight = $weight / 100; } return new ChanceGenerator($this, $weight, $default); } /** * To make sure the value meet some criteria, pass a callable that verifies the * output. If the validator fails, the generator will try again. * * The value validity is determined by a function passed as first argument. * * * $values = array(); * $evenValidator = function ($digit) { * return $digit % 2 === 0; * }; * for ($i=0; $i < 10; $i++) { * $values []= $faker->valid($evenValidator)->randomDigit; * } * print_r($values); // [0, 4, 8, 4, 2, 6, 0, 8, 8, 6] * * * @param ?\Closure $validator A function returning true for valid values * @param int $maxRetries Maximum number of retries to find a valid value, * After which an OverflowException is thrown. * * @throws \OverflowException When no valid value can be found by iterating $maxRetries times * * @return self A proxy class returning only valid values */ public function valid(?\Closure $validator = null, int $maxRetries = 10000) { return new ValidGenerator($this, $validator, $maxRetries); } public function seed($seed = null) { if ($seed === null) { mt_srand(); } else { mt_srand((int) $seed, MT_RAND_PHP); } } public function format($format, $arguments = []) { return call_user_func_array($this->getFormatter($format), $arguments); } /** * @param string $format * * @return callable */ public function getFormatter($format) { if (isset($this->formatters[$format])) { return $this->formatters[$format]; } if (method_exists($this, $format)) { $this->formatters[$format] = [$this, $format]; return $this->formatters[$format]; } // "Faker\Core\Barcode->ean13" if (preg_match('|^([a-zA-Z0-9\\\]+)->([a-zA-Z0-9]+)$|', $format, $matches)) { $this->formatters[$format] = [$this->ext($matches[1]), $matches[2]]; return $this->formatters[$format]; } foreach ($this->providers as $provider) { if (method_exists($provider, $format)) { $this->formatters[$format] = [$provider, $format]; return $this->formatters[$format]; } } throw new \InvalidArgumentException(sprintf('Unknown format "%s"', $format)); } /** * Replaces tokens ('{{ tokenName }}') with the result from the token method call * * @param string $string String that needs to bet parsed * * @return string */ public function parse($string) { $callback = function ($matches) { return $this->format($matches[1]); }; return preg_replace_callback('/{{\s?(\w+|[\w\\\]+->\w+?)\s?}}/u', $callback, $string); } /** * Get a random MIME type * * @example 'video/avi' */ public function mimeType() { return $this->ext(Extension\FileExtension::class)->mimeType(); } /** * Get a random file extension (without a dot) * * @example avi */ public function fileExtension() { return $this->ext(Extension\FileExtension::class)->extension(); } /** * Get a full path to a new real file on the system. */ public function filePath() { return $this->ext(Extension\FileExtension::class)->filePath(); } /** * Get an actual blood type * * @example 'AB' */ public function bloodType(): string { return $this->ext(Extension\BloodExtension::class)->bloodType(); } /** * Get a random resis value * * @example '+' */ public function bloodRh(): string { return $this->ext(Extension\BloodExtension::class)->bloodRh(); } /** * Get a full blood group * * @example 'AB+' */ public function bloodGroup(): string { return $this->ext(Extension\BloodExtension::class)->bloodGroup(); } /** * Get a random EAN13 barcode. * * @example '4006381333931' */ public function ean13(): string { return $this->ext(Extension\BarcodeExtension::class)->ean13(); } /** * Get a random EAN8 barcode. * * @example '73513537' */ public function ean8(): string { return $this->ext(Extension\BarcodeExtension::class)->ean8(); } /** * Get a random ISBN-10 code * * @see http://en.wikipedia.org/wiki/International_Standard_Book_Number * * @example '4881416324' */ public function isbn10(): string { return $this->ext(Extension\BarcodeExtension::class)->isbn10(); } /** * Get a random ISBN-13 code * * @see http://en.wikipedia.org/wiki/International_Standard_Book_Number * * @example '9790404436093' */ public function isbn13(): string { return $this->ext(Extension\BarcodeExtension::class)->isbn13(); } /** * Returns a random number between $int1 and $int2 (any order) * * @example 79907610 */ public function numberBetween($int1 = 0, $int2 = 2147483647): int { return $this->ext(Extension\NumberExtension::class)->numberBetween((int) $int1, (int) $int2); } /** * Returns a random number between 0 and 9 */ public function randomDigit(): int { return $this->ext(Extension\NumberExtension::class)->randomDigit(); } /** * Generates a random digit, which cannot be $except */ public function randomDigitNot($except): int { return $this->ext(Extension\NumberExtension::class)->randomDigitNot((int) $except); } /** * Returns a random number between 1 and 9 */ public function randomDigitNotZero(): int { return $this->ext(Extension\NumberExtension::class)->randomDigitNotZero(); } /** * Return a random float number * * @example 48.8932 */ public function randomFloat($nbMaxDecimals = null, $min = 0, $max = null): float { return $this->ext(Extension\NumberExtension::class)->randomFloat( $nbMaxDecimals !== null ? (int) $nbMaxDecimals : null, (float) $min, $max !== null ? (float) $max : null ); } /** * Returns a random integer with 0 to $nbDigits digits. * * The maximum value returned is mt_getrandmax() * * @param int|null $nbDigits Defaults to a random number between 1 and 9 * @param bool $strict Whether the returned number should have exactly $nbDigits * * @example 79907610 */ public function randomNumber($nbDigits = null, $strict = false): int { return $this->ext(Extension\NumberExtension::class)->randomNumber( $nbDigits !== null ? (int) $nbDigits : null, (bool) $strict ); } /** * Get a version number in semantic versioning syntax 2.0.0. (https://semver.org/spec/v2.0.0.html) * * @param bool $preRelease Pre release parts may be randomly included * @param bool $build Build parts may be randomly included * * @example 1.0.0 * @example 1.0.0-alpha.1 * @example 1.0.0-alpha.1+b71f04d */ public function semver(bool $preRelease = false, bool $build = false): string { return $this->ext(Extension\VersionExtension::class)->semver($preRelease, $build); } /** * @deprecated */ protected function callFormatWithMatches($matches) { trigger_deprecation('fakerphp/faker', '1.14', 'Protected method "callFormatWithMatches()" is deprecated and will be removed.'); return $this->format($matches[1]); } /** * @param string $attribute * * @deprecated Use a method instead. */ public function __get($attribute) { trigger_deprecation('fakerphp/faker', '1.14', 'Accessing property "%s" is deprecated, use "%s()" instead.', $attribute, $attribute); return $this->format($attribute); } /** * @param string $method * @param array $attributes */ public function __call($method, $attributes) { return $this->format($method, $attributes); } public function __destruct() { $this->seed(); } public function __wakeup() { $this->formatters = []; } } src/Core/Color.php000064400000012034150250362200010005 0ustar00numberBetween(1, 16777215)), 6, '0', STR_PAD_LEFT); } /** * @example '#ff0044' */ public function safeHexColor(): string { $number = new Number(); $color = str_pad(dechex($number->numberBetween(0, 255)), 3, '0', STR_PAD_LEFT); return sprintf( '#%s%s%s%s%s%s', $color[0], $color[0], $color[1], $color[1], $color[2], $color[2] ); } /** * @example 'array(0,255,122)' * * @return int[] */ public function rgbColorAsArray(): array { $color = $this->hexColor(); return [ hexdec(substr($color, 1, 2)), hexdec(substr($color, 3, 2)), hexdec(substr($color, 5, 2)), ]; } /** * @example '0,255,122' */ public function rgbColor(): string { return implode(',', $this->rgbColorAsArray()); } /** * @example 'rgb(0,255,122)' */ public function rgbCssColor(): string { return sprintf( 'rgb(%s)', $this->rgbColor() ); } /** * @example 'rgba(0,255,122,0.8)' */ public function rgbaCssColor(): string { $number = new Number(); return sprintf( 'rgba(%s,%s)', $this->rgbColor(), $number->randomFloat(1, 0, 1) ); } /** * @example 'blue' */ public function safeColorName(): string { return Helper::randomElement($this->safeColorNames); } /** * @example 'NavajoWhite' */ public function colorName(): string { return Helper::randomElement($this->allColorNames); } /** * @example '340,50,20' */ public function hslColor(): string { $number = new Number(); return sprintf( '%s,%s,%s', $number->numberBetween(0, 360), $number->numberBetween(0, 100), $number->numberBetween(0, 100) ); } /** * @example array(340, 50, 20) * * @return int[] */ public function hslColorAsArray(): array { $number = new Number(); return [ $number->numberBetween(0, 360), $number->numberBetween(0, 100), $number->numberBetween(0, 100), ]; } } src/Core/Number.php000064400000003543150250362200010164 0ustar00= $except) { ++$result; } return $result; } public function randomDigitNotZero(): int { return mt_rand(1, 9); } public function randomFloat(?int $nbMaxDecimals = null, float $min = 0, ?float $max = null): float { if (null === $nbMaxDecimals) { $nbMaxDecimals = $this->randomDigit(); } if (null === $max) { $max = $this->randomNumber(); if ($min > $max) { $max = $min; } } if ($min > $max) { $tmp = $min; $min = $max; $max = $tmp; } return round($min + mt_rand() / mt_getrandmax() * ($max - $min), $nbMaxDecimals); } public function randomNumber(int $nbDigits = null, bool $strict = false): int { if (null === $nbDigits) { $nbDigits = $this->randomDigitNotZero(); } $max = 10 ** $nbDigits - 1; if ($max > mt_getrandmax()) { throw new \InvalidArgumentException('randomNumber() can only generate numbers up to mt_getrandmax()'); } if ($strict) { return mt_rand(10 ** ($nbDigits - 1), $max); } return mt_rand(0, $max); } } src/Core/Barcode.php000064400000001771150250362200010274 0ustar00ean(); } public function ean8(): string { return $this->ean(8); } public function isbn10(): string { $code = Extension\Helper::numerify(str_repeat('#', 9)); return sprintf('%s%s', $code, Calculator\Isbn::checksum($code)); } public function isbn13(): string { $code = '97' . mt_rand(8, 9) . Extension\Helper::numerify(str_repeat('#', 9)); return sprintf('%s%s', $code, Calculator\Ean::checksum($code)); } } src/Core/Coordinates.php000064400000003437150250362200011210 0ustar00 90 || $max > 90) { throw new \LogicException('Latitude cannot be greater that 90.0'); } return $this->randomFloat(6, $min, $max); } /** * @example '86.211205' * * @return float Uses signed degrees format (returns a float number between -180 and 180) */ public function longitude(float $min = -180.0, float $max = 180.0): float { if ($min < -180 || $max < -180) { throw new \LogicException('Longitude cannot be less that -180.0'); } if ($min > 180 || $max > 180) { throw new \LogicException('Longitude cannot be greater that 180.0'); } return $this->randomFloat(6, $min, $max); } /** * @example array('77.147489', '86.211205') * * @return array{latitude: float, longitude: float} */ public function localCoordinates(): array { return [ 'latitude' => static::latitude(), 'longitude' => static::longitude(), ]; } private function randomFloat(int $nbMaxDecimals, float $min, float $max): float { if ($min > $max) { throw new \LogicException('Invalid coordinates boundaries'); } return round($min + mt_rand() / mt_getrandmax() * ($max - $min), $nbMaxDecimals); } } src/Core/DateTime.php000064400000014200150250362200010420 0ustar00getTimestamp(); } return strtotime(empty($until) ? 'now' : $until); } /** * Get a DateTime created based on a POSIX-timestamp. * * @param int $timestamp the UNIX / POSIX-compatible timestamp */ protected function getTimestampDateTime(int $timestamp): \DateTime { return new \DateTime('@' . $timestamp); } protected function setDefaultTimezone(string $timezone = null): void { $this->defaultTimezone = $timezone; } protected function getDefaultTimezone(): ?string { return $this->defaultTimezone; } protected function resolveTimezone(?string $timezone): string { if ($timezone !== null) { return $timezone; } return null === $this->defaultTimezone ? date_default_timezone_get() : $this->defaultTimezone; } /** * Internal method to set the timezone on a DateTime object. */ protected function setTimezone(\DateTime $dateTime, ?string $timezone): \DateTime { $timezone = $this->resolveTimezone($timezone); return $dateTime->setTimezone(new \DateTimeZone($timezone)); } public function dateTime($until = 'now', string $timezone = null): \DateTime { return $this->setTimezone( $this->getTimestampDateTime($this->unixTime($until)), $timezone ); } public function dateTimeAD($until = 'now', string $timezone = null): \DateTime { $min = (PHP_INT_SIZE > 4) ? -62135597361 : -PHP_INT_MAX; return $this->setTimezone( $this->getTimestampDateTime($this->generator->numberBetween($min, $this->getTimestamp($until))), $timezone ); } public function dateTimeBetween($from = '-30 years', $until = 'now', string $timezone = null): \DateTime { $start = $this->getTimestamp($from); $end = $this->getTimestamp($until); if ($start > $end) { throw new \InvalidArgumentException('"$from" must be anterior to "$until".'); } $timestamp = $this->generator->numberBetween($start, $end); return $this->setTimezone( $this->getTimestampDateTime($timestamp), $timezone ); } public function dateTimeInInterval($from = '-30 years', string $interval = '+5 days', string $timezone = null): \DateTime { $intervalObject = \DateInterval::createFromDateString($interval); $datetime = $from instanceof \DateTime ? $from : new \DateTime($from); $other = (clone $datetime)->add($intervalObject); $begin = min($datetime, $other); $end = $datetime === $begin ? $other : $datetime; return $this->dateTimeBetween($begin, $end, $timezone); } public function dateTimeThisWeek($until = 'sunday this week', string $timezone = null): \DateTime { return $this->dateTimeBetween('monday this week', $until, $timezone); } public function dateTimeThisMonth($until = 'last day of this month', string $timezone = null): \DateTime { return $this->dateTimeBetween('first day of this month', $until, $timezone); } public function dateTimeThisYear($until = 'last day of december', string $timezone = null): \DateTime { return $this->dateTimeBetween('first day of january', $until, $timezone); } public function dateTimeThisDecade($until = 'now', string $timezone = null): \DateTime { $year = floor(date('Y') / 10) * 10; return $this->dateTimeBetween("first day of january $year", $until, $timezone); } public function dateTimeThisCentury($until = 'now', string $timezone = null): \DateTime { $year = floor(date('Y') / 100) * 100; return $this->dateTimeBetween("first day of january $year", $until, $timezone); } public function date(string $format = 'Y-m-d', $until = 'now'): string { return $this->dateTime($until)->format($format); } public function time(string $format = 'H:i:s', $until = 'now'): string { return $this->date($format, $until); } public function unixTime($until = 'now'): int { return $this->generator->numberBetween(0, $this->getTimestamp($until)); } public function iso8601($until = 'now'): string { return $this->date(\DateTime::ISO8601, $until); } public function amPm($until = 'now'): string { return $this->date('a', $until); } public function dayOfMonth($until = 'now'): string { return $this->date('d', $until); } public function dayOfWeek($until = 'now'): string { return $this->date('l', $until); } public function month($until = 'now'): string { return $this->date('m', $until); } public function monthName($until = 'now'): string { return $this->date('F', $until); } public function year($until = 'now'): string { return $this->date('Y', $until); } public function century(): string { return Helper::randomElement($this->centuries); } public function timezone(): string { return Helper::randomElement(\DateTimeZone::listIdentifiers()); } } src/Core/Version.php000064400000003310150250362200010351 0ustar00semverPreReleaseIdentifier() : '', $build && mt_rand(0, 1) ? '+' . $this->semverBuildIdentifier() : '' ); } /** * Common pre-release identifier */ private function semverPreReleaseIdentifier(): string { $ident = Helper::randomElement($this->semverCommonPreReleaseIdentifiers); if (!mt_rand(0, 1)) { return $ident; } return $ident . '.' . mt_rand(1, 99); } /** * Common random build identifier */ private function semverBuildIdentifier(): string { if (mt_rand(0, 1)) { // short git revision syntax: https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection return substr(sha1(Helper::lexify('??????')), 0, 7); } // date syntax return $this->generator->ext(\Faker\Extension\DateTimeExtension::class)->date('YmdHis'); } } src/Core/File.php000064400000056227150250362200007622 0ustar00 file extension(s) * * @see http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types */ private $mimeTypes = [ 'application/atom+xml' => 'atom', 'application/ecmascript' => 'ecma', 'application/emma+xml' => 'emma', 'application/epub+zip' => 'epub', 'application/java-archive' => 'jar', 'application/java-vm' => 'class', 'application/javascript' => 'js', 'application/json' => 'json', 'application/jsonml+json' => 'jsonml', 'application/lost+xml' => 'lostxml', 'application/mathml+xml' => 'mathml', 'application/mets+xml' => 'mets', 'application/mods+xml' => 'mods', 'application/mp4' => 'mp4s', 'application/msword' => ['doc', 'dot'], 'application/octet-stream' => [ 'bin', 'dms', 'lrf', 'mar', 'so', 'dist', 'distz', 'pkg', 'bpk', 'dump', 'elc', 'deploy', ], 'application/ogg' => 'ogx', 'application/omdoc+xml' => 'omdoc', 'application/pdf' => 'pdf', 'application/pgp-encrypted' => 'pgp', 'application/pgp-signature' => ['asc', 'sig'], 'application/pkix-pkipath' => 'pkipath', 'application/pkixcmp' => 'pki', 'application/pls+xml' => 'pls', 'application/postscript' => ['ai', 'eps', 'ps'], 'application/pskc+xml' => 'pskcxml', 'application/rdf+xml' => 'rdf', 'application/reginfo+xml' => 'rif', 'application/rss+xml' => 'rss', 'application/rtf' => 'rtf', 'application/sbml+xml' => 'sbml', 'application/vnd.adobe.air-application-installer-package+zip' => 'air', 'application/vnd.adobe.xdp+xml' => 'xdp', 'application/vnd.adobe.xfdf' => 'xfdf', 'application/vnd.ahead.space' => 'ahead', 'application/vnd.dart' => 'dart', 'application/vnd.data-vision.rdz' => 'rdz', 'application/vnd.dece.data' => ['uvf', 'uvvf', 'uvd', 'uvvd'], 'application/vnd.dece.ttml+xml' => ['uvt', 'uvvt'], 'application/vnd.dece.unspecified' => ['uvx', 'uvvx'], 'application/vnd.dece.zip' => ['uvz', 'uvvz'], 'application/vnd.denovo.fcselayout-link' => 'fe_launch', 'application/vnd.dna' => 'dna', 'application/vnd.dolby.mlp' => 'mlp', 'application/vnd.dpgraph' => 'dpg', 'application/vnd.dreamfactory' => 'dfac', 'application/vnd.ds-keypoint' => 'kpxx', 'application/vnd.dvb.ait' => 'ait', 'application/vnd.dvb.service' => 'svc', 'application/vnd.dynageo' => 'geo', 'application/vnd.ecowin.chart' => 'mag', 'application/vnd.enliven' => 'nml', 'application/vnd.epson.esf' => 'esf', 'application/vnd.epson.msf' => 'msf', 'application/vnd.epson.quickanime' => 'qam', 'application/vnd.epson.salt' => 'slt', 'application/vnd.epson.ssf' => 'ssf', 'application/vnd.ezpix-album' => 'ez2', 'application/vnd.ezpix-package' => 'ez3', 'application/vnd.fdf' => 'fdf', 'application/vnd.fdsn.mseed' => 'mseed', 'application/vnd.fdsn.seed' => ['seed', 'dataless'], 'application/vnd.flographit' => 'gph', 'application/vnd.fluxtime.clip' => 'ftc', 'application/vnd.hal+xml' => 'hal', 'application/vnd.hydrostatix.sof-data' => 'sfd-hdstx', 'application/vnd.ibm.minipay' => 'mpy', 'application/vnd.ibm.secure-container' => 'sc', 'application/vnd.iccprofile' => ['icc', 'icm'], 'application/vnd.igloader' => 'igl', 'application/vnd.immervision-ivp' => 'ivp', 'application/vnd.kde.karbon' => 'karbon', 'application/vnd.kde.kchart' => 'chrt', 'application/vnd.kde.kformula' => 'kfo', 'application/vnd.kde.kivio' => 'flw', 'application/vnd.kde.kontour' => 'kon', 'application/vnd.kde.kpresenter' => ['kpr', 'kpt'], 'application/vnd.kde.kspread' => 'ksp', 'application/vnd.kde.kword' => ['kwd', 'kwt'], 'application/vnd.kenameaapp' => 'htke', 'application/vnd.kidspiration' => 'kia', 'application/vnd.kinar' => ['kne', 'knp'], 'application/vnd.koan' => ['skp', 'skd', 'skt', 'skm'], 'application/vnd.kodak-descriptor' => 'sse', 'application/vnd.las.las+xml' => 'lasxml', 'application/vnd.llamagraphics.life-balance.desktop' => 'lbd', 'application/vnd.llamagraphics.life-balance.exchange+xml' => 'lbe', 'application/vnd.lotus-1-2-3' => '123', 'application/vnd.lotus-approach' => 'apr', 'application/vnd.lotus-freelance' => 'pre', 'application/vnd.lotus-notes' => 'nsf', 'application/vnd.lotus-organizer' => 'org', 'application/vnd.lotus-screencam' => 'scm', 'application/vnd.mozilla.xul+xml' => 'xul', 'application/vnd.ms-artgalry' => 'cil', 'application/vnd.ms-cab-compressed' => 'cab', 'application/vnd.ms-excel' => [ 'xls', 'xlm', 'xla', 'xlc', 'xlt', 'xlw', ], 'application/vnd.ms-excel.addin.macroenabled.12' => 'xlam', 'application/vnd.ms-excel.sheet.binary.macroenabled.12' => 'xlsb', 'application/vnd.ms-excel.sheet.macroenabled.12' => 'xlsm', 'application/vnd.ms-excel.template.macroenabled.12' => 'xltm', 'application/vnd.ms-fontobject' => 'eot', 'application/vnd.ms-htmlhelp' => 'chm', 'application/vnd.ms-ims' => 'ims', 'application/vnd.ms-lrm' => 'lrm', 'application/vnd.ms-officetheme' => 'thmx', 'application/vnd.ms-pki.seccat' => 'cat', 'application/vnd.ms-pki.stl' => 'stl', 'application/vnd.ms-powerpoint' => ['ppt', 'pps', 'pot'], 'application/vnd.ms-powerpoint.addin.macroenabled.12' => 'ppam', 'application/vnd.ms-powerpoint.presentation.macroenabled.12' => 'pptm', 'application/vnd.ms-powerpoint.slide.macroenabled.12' => 'sldm', 'application/vnd.ms-powerpoint.slideshow.macroenabled.12' => 'ppsm', 'application/vnd.ms-powerpoint.template.macroenabled.12' => 'potm', 'application/vnd.ms-project' => ['mpp', 'mpt'], 'application/vnd.ms-word.document.macroenabled.12' => 'docm', 'application/vnd.ms-word.template.macroenabled.12' => 'dotm', 'application/vnd.ms-works' => ['wps', 'wks', 'wcm', 'wdb'], 'application/vnd.ms-wpl' => 'wpl', 'application/vnd.ms-xpsdocument' => 'xps', 'application/vnd.mseq' => 'mseq', 'application/vnd.musician' => 'mus', 'application/vnd.oasis.opendocument.chart' => 'odc', 'application/vnd.oasis.opendocument.chart-template' => 'otc', 'application/vnd.oasis.opendocument.database' => 'odb', 'application/vnd.oasis.opendocument.formula' => 'odf', 'application/vnd.oasis.opendocument.formula-template' => 'odft', 'application/vnd.oasis.opendocument.graphics' => 'odg', 'application/vnd.oasis.opendocument.graphics-template' => 'otg', 'application/vnd.oasis.opendocument.image' => 'odi', 'application/vnd.oasis.opendocument.image-template' => 'oti', 'application/vnd.oasis.opendocument.presentation' => 'odp', 'application/vnd.oasis.opendocument.presentation-template' => 'otp', 'application/vnd.oasis.opendocument.spreadsheet' => 'ods', 'application/vnd.oasis.opendocument.spreadsheet-template' => 'ots', 'application/vnd.oasis.opendocument.text' => 'odt', 'application/vnd.oasis.opendocument.text-master' => 'odm', 'application/vnd.oasis.opendocument.text-template' => 'ott', 'application/vnd.oasis.opendocument.text-web' => 'oth', 'application/vnd.olpc-sugar' => 'xo', 'application/vnd.oma.dd2+xml' => 'dd2', 'application/vnd.openofficeorg.extension' => 'oxt', 'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'pptx', 'application/vnd.openxmlformats-officedocument.presentationml.slide' => 'sldx', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => 'ppsx', 'application/vnd.openxmlformats-officedocument.presentationml.template' => 'potx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => 'xltx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => 'dotx', 'application/vnd.pvi.ptid1' => 'ptid', 'application/vnd.quark.quarkxpress' => [ 'qxd', 'qxt', 'qwd', 'qwt', 'qxl', 'qxb', ], 'application/vnd.realvnc.bed' => 'bed', 'application/vnd.recordare.musicxml' => 'mxl', 'application/vnd.recordare.musicxml+xml' => 'musicxml', 'application/vnd.rig.cryptonote' => 'cryptonote', 'application/vnd.rim.cod' => 'cod', 'application/vnd.rn-realmedia' => 'rm', 'application/vnd.rn-realmedia-vbr' => 'rmvb', 'application/vnd.route66.link66+xml' => 'link66', 'application/vnd.sailingtracker.track' => 'st', 'application/vnd.seemail' => 'see', 'application/vnd.sema' => 'sema', 'application/vnd.semd' => 'semd', 'application/vnd.semf' => 'semf', 'application/vnd.shana.informed.formdata' => 'ifm', 'application/vnd.shana.informed.formtemplate' => 'itp', 'application/vnd.shana.informed.interchange' => 'iif', 'application/vnd.shana.informed.package' => 'ipk', 'application/vnd.simtech-mindmapper' => ['twd', 'twds'], 'application/vnd.smaf' => 'mmf', 'application/vnd.stepmania.stepchart' => 'sm', 'application/vnd.sun.xml.calc' => 'sxc', 'application/vnd.sun.xml.calc.template' => 'stc', 'application/vnd.sun.xml.draw' => 'sxd', 'application/vnd.sun.xml.draw.template' => 'std', 'application/vnd.sun.xml.impress' => 'sxi', 'application/vnd.sun.xml.impress.template' => 'sti', 'application/vnd.sun.xml.math' => 'sxm', 'application/vnd.sun.xml.writer' => 'sxw', 'application/vnd.sun.xml.writer.global' => 'sxg', 'application/vnd.sun.xml.writer.template' => 'stw', 'application/vnd.sus-calendar' => ['sus', 'susp'], 'application/vnd.svd' => 'svd', 'application/vnd.symbian.install' => ['sis', 'sisx'], 'application/vnd.syncml+xml' => 'xsm', 'application/vnd.syncml.dm+wbxml' => 'bdm', 'application/vnd.syncml.dm+xml' => 'xdm', 'application/vnd.tao.intent-module-archive' => 'tao', 'application/vnd.tcpdump.pcap' => ['pcap', 'cap', 'dmp'], 'application/vnd.tmobile-livetv' => 'tmo', 'application/vnd.trid.tpt' => 'tpt', 'application/vnd.triscape.mxs' => 'mxs', 'application/vnd.trueapp' => 'tra', 'application/vnd.ufdl' => ['ufd', 'ufdl'], 'application/vnd.uiq.theme' => 'utz', 'application/vnd.umajin' => 'umj', 'application/vnd.unity' => 'unityweb', 'application/vnd.uoml+xml' => 'uoml', 'application/vnd.vcx' => 'vcx', 'application/vnd.visio' => ['vsd', 'vst', 'vss', 'vsw'], 'application/vnd.visionary' => 'vis', 'application/vnd.vsf' => 'vsf', 'application/vnd.wap.wbxml' => 'wbxml', 'application/vnd.wap.wmlc' => 'wmlc', 'application/vnd.wap.wmlscriptc' => 'wmlsc', 'application/vnd.webturbo' => 'wtb', 'application/vnd.wolfram.player' => 'nbp', 'application/vnd.wordperfect' => 'wpd', 'application/vnd.wqd' => 'wqd', 'application/vnd.wt.stf' => 'stf', 'application/vnd.xara' => 'xar', 'application/vnd.xfdl' => 'xfdl', 'application/voicexml+xml' => 'vxml', 'application/widget' => 'wgt', 'application/winhlp' => 'hlp', 'application/wsdl+xml' => 'wsdl', 'application/wspolicy+xml' => 'wspolicy', 'application/x-7z-compressed' => '7z', 'application/x-bittorrent' => 'torrent', 'application/x-blorb' => ['blb', 'blorb'], 'application/x-bzip' => 'bz', 'application/x-cdlink' => 'vcd', 'application/x-cfs-compressed' => 'cfs', 'application/x-chat' => 'chat', 'application/x-chess-pgn' => 'pgn', 'application/x-conference' => 'nsc', 'application/x-cpio' => 'cpio', 'application/x-csh' => 'csh', 'application/x-debian-package' => ['deb', 'udeb'], 'application/x-dgc-compressed' => 'dgc', 'application/x-director' => [ 'dir', 'dcr', 'dxr', 'cst', 'cct', 'cxt', 'w3d', 'fgd', 'swa', ], 'application/x-font-ttf' => ['ttf', 'ttc'], 'application/x-font-type1' => ['pfa', 'pfb', 'pfm', 'afm'], 'application/x-font-woff' => 'woff', 'application/x-freearc' => 'arc', 'application/x-futuresplash' => 'spl', 'application/x-gca-compressed' => 'gca', 'application/x-glulx' => 'ulx', 'application/x-gnumeric' => 'gnumeric', 'application/x-gramps-xml' => 'gramps', 'application/x-gtar' => 'gtar', 'application/x-hdf' => 'hdf', 'application/x-install-instructions' => 'install', 'application/x-iso9660-image' => 'iso', 'application/x-java-jnlp-file' => 'jnlp', 'application/x-latex' => 'latex', 'application/x-lzh-compressed' => ['lzh', 'lha'], 'application/x-mie' => 'mie', 'application/x-mobipocket-ebook' => ['prc', 'mobi'], 'application/x-ms-application' => 'application', 'application/x-ms-shortcut' => 'lnk', 'application/x-ms-wmd' => 'wmd', 'application/x-ms-wmz' => 'wmz', 'application/x-ms-xbap' => 'xbap', 'application/x-msaccess' => 'mdb', 'application/x-msbinder' => 'obd', 'application/x-mscardfile' => 'crd', 'application/x-msclip' => 'clp', 'application/x-msdownload' => ['exe', 'dll', 'com', 'bat', 'msi'], 'application/x-msmediaview' => [ 'mvb', 'm13', 'm14', ], 'application/x-msmetafile' => ['wmf', 'wmz', 'emf', 'emz'], 'application/x-rar-compressed' => 'rar', 'application/x-research-info-systems' => 'ris', 'application/x-sh' => 'sh', 'application/x-shar' => 'shar', 'application/x-shockwave-flash' => 'swf', 'application/x-silverlight-app' => 'xap', 'application/x-sql' => 'sql', 'application/x-stuffit' => 'sit', 'application/x-stuffitx' => 'sitx', 'application/x-subrip' => 'srt', 'application/x-sv4cpio' => 'sv4cpio', 'application/x-sv4crc' => 'sv4crc', 'application/x-t3vm-image' => 't3', 'application/x-tads' => 'gam', 'application/x-tar' => 'tar', 'application/x-tcl' => 'tcl', 'application/x-tex' => 'tex', 'application/x-tex-tfm' => 'tfm', 'application/x-texinfo' => ['texinfo', 'texi'], 'application/x-tgif' => 'obj', 'application/x-ustar' => 'ustar', 'application/x-wais-source' => 'src', 'application/x-x509-ca-cert' => ['der', 'crt'], 'application/x-xfig' => 'fig', 'application/x-xliff+xml' => 'xlf', 'application/x-xpinstall' => 'xpi', 'application/x-xz' => 'xz', 'application/x-zmachine' => 'z1', 'application/xaml+xml' => 'xaml', 'application/xcap-diff+xml' => 'xdf', 'application/xenc+xml' => 'xenc', 'application/xhtml+xml' => ['xhtml', 'xht'], 'application/xml' => ['xml', 'xsl'], 'application/xml-dtd' => 'dtd', 'application/xop+xml' => 'xop', 'application/xproc+xml' => 'xpl', 'application/xslt+xml' => 'xslt', 'application/xspf+xml' => 'xspf', 'application/xv+xml' => ['mxml', 'xhvml', 'xvml', 'xvm'], 'application/yang' => 'yang', 'application/yin+xml' => 'yin', 'application/zip' => 'zip', 'audio/adpcm' => 'adp', 'audio/basic' => ['au', 'snd'], 'audio/midi' => ['mid', 'midi', 'kar', 'rmi'], 'audio/mp4' => 'mp4a', 'audio/mpeg' => [ 'mpga', 'mp2', 'mp2a', 'mp3', 'm2a', 'm3a', ], 'audio/ogg' => ['oga', 'ogg', 'spx'], 'audio/vnd.dece.audio' => ['uva', 'uvva'], 'audio/vnd.rip' => 'rip', 'audio/webm' => 'weba', 'audio/x-aac' => 'aac', 'audio/x-aiff' => ['aif', 'aiff', 'aifc'], 'audio/x-caf' => 'caf', 'audio/x-flac' => 'flac', 'audio/x-matroska' => 'mka', 'audio/x-mpegurl' => 'm3u', 'audio/x-ms-wax' => 'wax', 'audio/x-ms-wma' => 'wma', 'audio/x-pn-realaudio' => ['ram', 'ra'], 'audio/x-pn-realaudio-plugin' => 'rmp', 'audio/x-wav' => 'wav', 'audio/xm' => 'xm', 'image/bmp' => 'bmp', 'image/cgm' => 'cgm', 'image/g3fax' => 'g3', 'image/gif' => 'gif', 'image/ief' => 'ief', 'image/jpeg' => ['jpeg', 'jpg', 'jpe'], 'image/ktx' => 'ktx', 'image/png' => 'png', 'image/prs.btif' => 'btif', 'image/sgi' => 'sgi', 'image/svg+xml' => ['svg', 'svgz'], 'image/tiff' => ['tiff', 'tif'], 'image/vnd.adobe.photoshop' => 'psd', 'image/vnd.dece.graphic' => ['uvi', 'uvvi', 'uvg', 'uvvg'], 'image/vnd.dvb.subtitle' => 'sub', 'image/vnd.djvu' => ['djvu', 'djv'], 'image/vnd.dwg' => 'dwg', 'image/vnd.dxf' => 'dxf', 'image/vnd.fastbidsheet' => 'fbs', 'image/vnd.fpx' => 'fpx', 'image/vnd.fst' => 'fst', 'image/vnd.fujixerox.edmics-mmr' => 'mmr', 'image/vnd.fujixerox.edmics-rlc' => 'rlc', 'image/vnd.ms-modi' => 'mdi', 'image/vnd.ms-photo' => 'wdp', 'image/vnd.net-fpx' => 'npx', 'image/vnd.wap.wbmp' => 'wbmp', 'image/vnd.xiff' => 'xif', 'image/webp' => 'webp', 'image/x-3ds' => '3ds', 'image/x-cmu-raster' => 'ras', 'image/x-cmx' => 'cmx', 'image/x-freehand' => ['fh', 'fhc', 'fh4', 'fh5', 'fh7'], 'image/x-icon' => 'ico', 'image/x-mrsid-image' => 'sid', 'image/x-pcx' => 'pcx', 'image/x-pict' => ['pic', 'pct'], 'image/x-portable-anymap' => 'pnm', 'image/x-portable-bitmap' => 'pbm', 'image/x-portable-graymap' => 'pgm', 'image/x-portable-pixmap' => 'ppm', 'image/x-rgb' => 'rgb', 'image/x-tga' => 'tga', 'image/x-xbitmap' => 'xbm', 'image/x-xpixmap' => 'xpm', 'image/x-xwindowdump' => 'xwd', 'message/rfc822' => ['eml', 'mime'], 'model/iges' => ['igs', 'iges'], 'model/mesh' => ['msh', 'mesh', 'silo'], 'model/vnd.collada+xml' => 'dae', 'model/vnd.dwf' => 'dwf', 'model/vnd.gdl' => 'gdl', 'model/vnd.gtw' => 'gtw', 'model/vnd.mts' => 'mts', 'model/vnd.vtu' => 'vtu', 'model/vrml' => ['wrl', 'vrml'], 'model/x3d+binary' => 'x3db', 'model/x3d+vrml' => 'x3dv', 'model/x3d+xml' => 'x3d', 'text/cache-manifest' => 'appcache', 'text/calendar' => ['ics', 'ifb'], 'text/css' => 'css', 'text/csv' => 'csv', 'text/html' => ['html', 'htm'], 'text/n3' => 'n3', 'text/plain' => [ 'txt', 'text', 'conf', 'def', 'list', 'log', 'in', ], 'text/prs.lines.tag' => 'dsc', 'text/richtext' => 'rtx', 'text/sgml' => ['sgml', 'sgm'], 'text/tab-separated-values' => 'tsv', 'text/troff' => [ 't', 'tr', 'roff', 'man', 'me', 'ms', ], 'text/turtle' => 'ttl', 'text/uri-list' => ['uri', 'uris', 'urls'], 'text/vcard' => 'vcard', 'text/vnd.curl' => 'curl', 'text/vnd.curl.dcurl' => 'dcurl', 'text/vnd.curl.scurl' => 'scurl', 'text/vnd.curl.mcurl' => 'mcurl', 'text/vnd.dvb.subtitle' => 'sub', 'text/vnd.fly' => 'fly', 'text/vnd.fmi.flexstor' => 'flx', 'text/vnd.graphviz' => 'gv', 'text/vnd.in3d.3dml' => '3dml', 'text/vnd.in3d.spot' => 'spot', 'text/vnd.sun.j2me.app-descriptor' => 'jad', 'text/vnd.wap.wml' => 'wml', 'text/vnd.wap.wmlscript' => 'wmls', 'text/x-asm' => ['s', 'asm'], 'text/x-fortran' => ['f', 'for', 'f77', 'f90'], 'text/x-java-source' => 'java', 'text/x-opml' => 'opml', 'text/x-pascal' => ['p', 'pas'], 'text/x-nfo' => 'nfo', 'text/x-setext' => 'etx', 'text/x-sfv' => 'sfv', 'text/x-uuencode' => 'uu', 'text/x-vcalendar' => 'vcs', 'text/x-vcard' => 'vcf', 'video/3gpp' => '3gp', 'video/3gpp2' => '3g2', 'video/h261' => 'h261', 'video/h263' => 'h263', 'video/h264' => 'h264', 'video/jpeg' => 'jpgv', 'video/jpm' => ['jpm', 'jpgm'], 'video/mj2' => 'mj2', 'video/mp4' => 'mp4', 'video/mpeg' => ['mpeg', 'mpg', 'mpe', 'm1v', 'm2v'], 'video/ogg' => 'ogv', 'video/quicktime' => ['qt', 'mov'], 'video/vnd.dece.hd' => ['uvh', 'uvvh'], 'video/vnd.dece.mobile' => ['uvm', 'uvvm'], 'video/vnd.dece.pd' => ['uvp', 'uvvp'], 'video/vnd.dece.sd' => ['uvs', 'uvvs'], 'video/vnd.dece.video' => ['uvv', 'uvvv'], 'video/vnd.dvb.file' => 'dvb', 'video/vnd.fvt' => 'fvt', 'video/vnd.mpegurl' => ['mxu', 'm4u'], 'video/vnd.ms-playready.media.pyv' => 'pyv', 'video/vnd.uvvu.mp4' => ['uvu', 'uvvu'], 'video/vnd.vivo' => 'viv', 'video/webm' => 'webm', 'video/x-f4v' => 'f4v', 'video/x-fli' => 'fli', 'video/x-flv' => 'flv', 'video/x-m4v' => 'm4v', 'video/x-matroska' => ['mkv', 'mk3d', 'mks'], 'video/x-mng' => 'mng', 'video/x-ms-asf' => ['asf', 'asx'], 'video/x-ms-vob' => 'vob', 'video/x-ms-wm' => 'wm', 'video/x-ms-wmv' => 'wmv', 'video/x-ms-wmx' => 'wmx', 'video/x-ms-wvx' => 'wvx', 'video/x-msvideo' => 'avi', 'video/x-sgi-movie' => 'movie', ]; public function mimeType(): string { return array_rand($this->mimeTypes, 1); } public function extension(): string { $extension = $this->mimeTypes[array_rand($this->mimeTypes, 1)]; return is_array($extension) ? $extension[array_rand($extension, 1)] : $extension; } public function filePath(): string { return tempnam(sys_get_temp_dir(), 'faker'); } } src/Core/Uuid.php000064400000003331150250362200007635 0ustar00numberBetween(0, 2147483647) . '#' . $number->numberBetween(0, 2147483647); // Hash the seed and convert to a byte array $val = md5($seed, true); $byte = array_values(unpack('C16', $val)); // extract fields from byte array $tLo = ($byte[0] << 24) | ($byte[1] << 16) | ($byte[2] << 8) | $byte[3]; $tMi = ($byte[4] << 8) | $byte[5]; $tHi = ($byte[6] << 8) | $byte[7]; $csLo = $byte[9]; $csHi = $byte[8] & 0x3f | (1 << 7); // correct byte order for big edian architecture if (pack('L', 0x6162797A) == pack('N', 0x6162797A)) { $tLo = (($tLo & 0x000000ff) << 24) | (($tLo & 0x0000ff00) << 8) | (($tLo & 0x00ff0000) >> 8) | (($tLo & 0xff000000) >> 24); $tMi = (($tMi & 0x00ff) << 8) | (($tMi & 0xff00) >> 8); $tHi = (($tHi & 0x00ff) << 8) | (($tHi & 0xff00) >> 8); } // apply version number $tHi &= 0x0fff; $tHi |= (3 << 12); // cast to string return sprintf( '%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x', $tLo, $tMi, $tHi, $csHi, $csLo, $byte[10], $byte[11], $byte[12], $byte[13], $byte[14], $byte[15] ); } } src/Core/Blood.php000064400000001445150250362200007772 0ustar00bloodTypes); } public function bloodRh(): string { return Extension\Helper::randomElement($this->bloodRhFactors); } public function bloodGroup(): string { return sprintf( '%s%s', $this->bloodType(), $this->bloodRh() ); } } src/UniqueGenerator.php000064400000004440150250362200011156 0ustar00 ['0123' => null], * 'city' => ['London' => null, 'Tokyo' => null], * ] * * @var array> */ protected $uniques = []; /** * @param Extension|Generator $generator * @param int $maxRetries * @param array> $uniques */ public function __construct($generator, $maxRetries = 10000, &$uniques = []) { $this->generator = $generator; $this->maxRetries = $maxRetries; $this->uniques = &$uniques; } public function ext(string $id) { return new self($this->generator->ext($id), $this->maxRetries, $this->uniques); } /** * Catch and proxy all generator calls but return only unique values * * @param string $attribute * * @deprecated Use a method instead. */ public function __get($attribute) { trigger_deprecation('fakerphp/faker', '1.14', 'Accessing property "%s" is deprecated, use "%s()" instead.', $attribute, $attribute); return $this->__call($attribute, []); } /** * Catch and proxy all generator calls with arguments but return only unique values * * @param string $name * @param array $arguments */ public function __call($name, $arguments) { if (!isset($this->uniques[$name])) { $this->uniques[$name] = []; } $i = 0; do { $res = call_user_func_array([$this->generator, $name], $arguments); ++$i; if ($i > $this->maxRetries) { throw new \OverflowException(sprintf('Maximum retries of %d reached without finding a unique value', $this->maxRetries)); } } while (array_key_exists(serialize($res), $this->uniques[$name])); $this->uniques[$name][serialize($res)] = null; return $res; } } src/Container/Container.php000064400000007457150250362200011720 0ustar00 */ private $definitions; private $services = []; /** * Create a container object with a set of definitions. The array value MUST * produce an object that implements Extension. * * @param array $definitions */ public function __construct(array $definitions) { $this->definitions = $definitions; } /** * Retrieve a definition from the container. * * @param string $id * * @throws \InvalidArgumentException * @throws \RuntimeException * @throws ContainerException * @throws NotInContainerException */ public function get($id): Extension { if (!is_string($id)) { throw new \InvalidArgumentException(sprintf( 'First argument of %s::get() must be string', self::class )); } if (array_key_exists($id, $this->services)) { return $this->services[$id]; } if (!$this->has($id)) { throw new NotInContainerException(sprintf( 'There is not service with id "%s" in the container.', $id )); } $definition = $this->definitions[$id]; $service = $this->services[$id] = $this->getService($id, $definition); if (!$service instanceof Extension) { throw new \RuntimeException(sprintf( 'Service resolved for identifier "%s" does not implement the %s" interface.', $id, Extension::class )); } return $service; } /** * Get the service from a definition. * * @param callable|object|string $definition */ private function getService($id, $definition) { if (is_callable($definition)) { try { return $definition(); } catch (\Throwable $e) { throw new ContainerException( sprintf('Error while invoking callable for "%s"', $id), 0, $e ); } } elseif (is_object($definition)) { return $definition; } elseif (is_string($definition)) { if (class_exists($definition)) { try { return new $definition(); } catch (\Throwable $e) { throw new ContainerException(sprintf('Could not instantiate class "%s"', $id), 0, $e); } } throw new ContainerException(sprintf( 'Could not instantiate class "%s". Class was not found.', $id )); } else { throw new ContainerException(sprintf( 'Invalid type for definition with id "%s"', $id )); } } /** * Check if the container contains a given identifier. * * @param string $id * * @throws \InvalidArgumentException */ public function has($id): bool { if (!is_string($id)) { throw new \InvalidArgumentException(sprintf( 'First argument of %s::get() must be string', self::class )); } return array_key_exists($id, $this->definitions); } /** * Get the bindings between Extension interfaces and implementations. */ public function getDefinitions(): array { return $this->definitions; } } src/Container/ContainerBuilder.php000064400000005072150250362200013216 0ustar00 */ private $definitions = []; /** * @param callable|object|string $value * * @throws \InvalidArgumentException */ public function add($value, string $name = null): self { if (!is_string($value) && !is_callable($value) && !is_object($value)) { throw new \InvalidArgumentException(sprintf( 'First argument to "%s::add()" must be a string, callable or object.', self::class )); } if ($name === null) { if (is_string($value)) { $name = $value; } elseif (is_object($value)) { $name = get_class($value); } else { throw new \InvalidArgumentException(sprintf( 'Second argument to "%s::add()" is required not passing a string or object as first argument', self::class )); } } $this->definitions[$name] = $value; return $this; } public function build(): ContainerInterface { return new Container($this->definitions); } /** * Get an array with extension that represent the default English * functionality. */ public static function defaultExtensions(): array { return [ BarcodeExtension::class => Core\Barcode::class, BloodExtension::class => Core\Blood::class, ColorExtension::class => Core\Color::class, DateTimeExtension::class => Core\DateTime::class, FileExtension::class => Core\File::class, NumberExtension::class => Core\Number::class, VersionExtension::class => Core\Version::class, UuidExtension::class => Core\Uuid::class, ]; } public static function getDefault(): ContainerInterface { $instance = new self(); foreach (self::defaultExtensions() as $id => $definition) { $instance->add($definition, $id); } return $instance->build(); } } src/Container/ContainerException.php000064400000000454150250362200013565 0ustar00default = $default; $this->generator = $generator; $this->weight = $weight; } public function ext(string $id) { return new self($this->generator->ext($id), $this->weight, $this->default); } /** * Catch and proxy all generator calls but return only valid values * * @param string $attribute * * @deprecated Use a method instead. */ public function __get($attribute) { trigger_deprecation('fakerphp/faker', '1.14', 'Accessing property "%s" is deprecated, use "%s()" instead.', $attribute, $attribute); return $this->__call($attribute, []); } /** * @param string $name * @param array $arguments */ public function __call($name, $arguments) { if (mt_rand(1, 100) <= (100 * $this->weight)) { return call_user_func_array([$this->generator, $name], $arguments); } return $this->default; } } src/Guesser/Name.php000064400000012476150250362200010346 0ustar00generator = $generator; } /** * Guess a generator based on the name of a field. * * @param string $name Name of the field to guess * @param int|null $size Length of field, if known * * @return callable|null */ public function guessFormat(string $name, ?int $size = null) { $name = Helper::toLower($name); $generator = $this->generator; if (preg_match('/^is[_A-Z]/', $name)) { return static function () use ($generator) { return $generator->boolean; }; } if (preg_match('/(_a|A)t$/', $name)) { return static function () use ($generator) { return $generator->dateTime; }; } switch (str_replace('_', '', $name)) { case 'firstname': return static function () use ($generator) { return $generator->firstName; }; case 'lastname': return static function () use ($generator) { return $generator->lastName; }; case 'username': case 'login': return static function () use ($generator) { return $generator->userName; }; case 'email': case 'emailaddress': return static function () use ($generator) { return $generator->email; }; case 'phonenumber': case 'phone': case 'telephone': case 'telnumber': return static function () use ($generator) { return $generator->phoneNumber; }; case 'address': return static function () use ($generator) { return $generator->address; }; case 'city': case 'town': return static function () use ($generator) { return $generator->city; }; case 'streetaddress': return static function () use ($generator) { return $generator->streetAddress; }; case 'postcode': case 'zipcode': return static function () use ($generator) { return $generator->postcode; }; case 'state': return static function () use ($generator) { return $generator->state; }; case 'county': if ($this->generator->locale == 'en_US') { return static function () use ($generator) { return sprintf('%s County', $generator->city); }; } return static function () use ($generator) { return $generator->state; }; case 'country': switch ($size) { case 2: return static function () use ($generator) { return $generator->countryCode; }; case 3: return static function () use ($generator) { return $generator->countryISOAlpha3; }; case 5: case 6: return static function () use ($generator) { return $generator->locale; }; default: return static function () use ($generator) { return $generator->country; }; } // no break case 'locale': return static function () use ($generator) { return $generator->locale; }; case 'currency': case 'currencycode': return static function () use ($generator) { return $generator->currencyCode; }; case 'url': case 'website': return static function () use ($generator) { return $generator->url; }; case 'company': case 'companyname': case 'employer': return static function () use ($generator) { return $generator->company; }; case 'title': if ($size !== null && $size <= 10) { return static function () use ($generator) { return $generator->title; }; } return static function () use ($generator) { return $generator->sentence; }; case 'body': case 'summary': case 'article': case 'description': return static function () use ($generator) { return $generator->text; }; } return null; } } src/Extension/PersonExtension.php000064400000002142150250362200013155 0ustar00generator = $generator; return $instance; } } src/Extension/Helper.php000064400000006763150250362200011246 0ustar00addProvider(new $providerClassName($generator)); } return $generator; } /** * @param string $provider * @param string $locale * * @return string */ protected static function getProviderClassname($provider, $locale = '') { if ($providerClass = self::findProviderClassname($provider, $locale)) { return $providerClass; } // fallback to default locale if ($providerClass = self::findProviderClassname($provider, static::DEFAULT_LOCALE)) { return $providerClass; } // fallback to no locale if ($providerClass = self::findProviderClassname($provider)) { return $providerClass; } throw new \InvalidArgumentException(sprintf('Unable to find provider "%s" with locale "%s"', $provider, $locale)); } /** * @param string $provider * @param string $locale * * @return string|null */ protected static function findProviderClassname($provider, $locale = '') { $providerClass = 'Faker\\' . ($locale ? sprintf('Provider\%s\%s', $locale, $provider) : sprintf('Provider\%s', $provider)); if (class_exists($providerClass, true)) { return $providerClass; } return null; } } psalm.baseline.xml000064400000014337150250362200010166 0ustar00 0 string $this->uniqueGenerator new ChanceGenerator($this, $weight, $default) new ValidGenerator($this, $validator, $maxRetries) self self self TableRegistry $this->class \Doctrine\ODM\MongoDB\Mapping\ClassMetadata \Doctrine\ODM\MongoDB\Mapping\ClassMetadata \Doctrine\ODM\MongoDB\Mapping\ClassMetadata \Doctrine\ORM\Mapping\ClassMetadata \Doctrine\ORM\Mapping\ClassMetadata createQueryBuilder getAssociationMappings newInstance Mandango Mandango $this->mandango Mandango \ColumnMap $columnMap $columnMap $columnMap $columnMap $columnMap $columnMap $columnMap $columnMap \ColumnMap \Propel PropelPDO ColumnMap $columnMap $columnMap $columnMap $columnMap $columnMap $columnMap $columnMap $columnMap ColumnMap Propel PropelPDO $this->mapper string $relation $relation BelongsTo Locator Mapper $locator $this->mapper $this->mapper $this->mapper $this->mapper $this->mapper Locator Mapper $this->locator Locator Locator Closure false $imei int static::$cityPrefix static::birthNumber(static::GENDER_FEMALE) static::birthNumber(static::GENDER_MALE) $checksumArr[$checksum % 11] $ref[$i] static::split($text) DateTime static::lastName() static::lastName() README.md000064400000005607150250362200006026 0ustar00

Social card of FakerPHP

# Faker [![Packagist Downloads](https://img.shields.io/packagist/dm/FakerPHP/Faker)](https://packagist.org/packages/fakerphp/faker) [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/FakerPHP/Faker/Tests/main)](https://github.com/FakerPHP/Faker/actions) [![Type Coverage](https://shepherd.dev/github/FakerPHP/Faker/coverage.svg)](https://shepherd.dev/github/FakerPHP/Faker) [![Code Coverage](https://codecov.io/gh/FakerPHP/Faker/branch/main/graph/badge.svg)](https://codecov.io/gh/FakerPHP/Faker) Faker is a PHP library that generates fake data for you. Whether you need to bootstrap your database, create good-looking XML documents, fill-in your persistence to stress test it, or anonymize data taken from a production service, Faker is for you. It's heavily inspired by Perl's [Data::Faker](https://metacpan.org/pod/Data::Faker), and by Ruby's [Faker](https://rubygems.org/gems/faker). ## Getting Started ### Installation Faker requires PHP >= 7.1. ```shell composer require fakerphp/faker ``` ### Documentation Full documentation can be found over on [fakerphp.github.io](https://fakerphp.github.io). ### Basic Usage Use `Faker\Factory::create()` to create and initialize a Faker generator, which can generate data by accessing methods named after the type of data you want. ```php name(); // 'Vince Sporer' echo $faker->email(); // 'walter.sophia@hotmail.com' echo $faker->text(); // 'Numquam ut mollitia at consequuntur inventore dolorem.' ``` Each call to `$faker->name()` yields a different (random) result. This is because Faker uses `__call()` magic, and forwards `Faker\Generator->$method()` calls to `Faker\Generator->format($method, $attributes)`. ```php name() . "\n"; } // 'Cyrus Boyle' // 'Alena Cummerata' // 'Orlo Bergstrom' ``` ## License Faker is released under the MIT License. See [`LICENSE`](LICENSE) for details. ## Backward compatibility promise Faker is using [Semver](https://semver.org/). This means that versions are tagged with MAJOR.MINOR.PATCH. Only a new major version will be allowed to break backward compatibility (BC). Classes marked as `@experimental` or `@internal` are not included in our backward compatibility promise. You are also not guaranteed that the value returned from a method is always the same. You are guaranteed that the data type will not change. PHP 8 introduced [named arguments](https://wiki.php.net/rfc/named_params), which increased the cost and reduces flexibility for package maintainers. The names of the arguments for methods in Faker is not included in our BC promise. LICENSE000064400000002242150250362200005544 0ustar00Copyright (c) 2011 François Zaninotto Portions Copyright (c) 2008 Caius Durling Portions Copyright (c) 2008 Adam Royle Portions Copyright (c) 2008 Fiona Burrows Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.