Skip to content

Commit c48baf5

Browse files
authored
Enhancement: Reuse NumberExtension (#715)
1 parent c77a91b commit c48baf5

File tree

6 files changed

+69
-46
lines changed

6 files changed

+69
-46
lines changed

src/Faker/Core/Barcode.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@
1212
*/
1313
final class Barcode implements Extension\BarcodeExtension
1414
{
15+
private Extension\NumberExtension $numberExtension;
16+
17+
public function __construct(Extension\NumberExtension $numberExtension = null)
18+
{
19+
$this->numberExtension = $numberExtension ?: new Number();
20+
}
21+
1522
private function ean(int $length = 13): string
1623
{
1724
$code = Extension\Helper::numerify(str_repeat('#', $length - 1));
@@ -38,7 +45,7 @@ public function isbn10(): string
3845

3946
public function isbn13(): string
4047
{
41-
$code = '97' . mt_rand(8, 9) . Extension\Helper::numerify(str_repeat('#', 9));
48+
$code = '97' . $this->numberExtension->numberBetween(8, 9) . Extension\Helper::numerify(str_repeat('#', 9));
4249

4350
return sprintf('%s%s', $code, Calculator\Ean::checksum($code));
4451
}

src/Faker/Core/Color.php

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
*/
1313
final class Color implements Extension\ColorExtension
1414
{
15+
private Extension\NumberExtension $numberExtension;
16+
1517
/**
1618
* @var string[]
1719
*/
@@ -20,7 +22,6 @@ final class Color implements Extension\ColorExtension
2022
'purple', 'teal', 'lime', 'blue', 'silver',
2123
'gray', 'yellow', 'fuchsia', 'aqua', 'white',
2224
];
23-
2425
/**
2526
* @var string[]
2627
*/
@@ -53,23 +54,25 @@ final class Color implements Extension\ColorExtension
5354
'Turquoise', 'Violet', 'Wheat', 'White', 'WhiteSmoke', 'Yellow', 'YellowGreen',
5455
];
5556

57+
public function __construct(Extension\NumberExtension $numberExtension = null)
58+
{
59+
$this->numberExtension = $numberExtension ?: new Number();
60+
}
61+
5662
/**
5763
* @example '#fa3cc2'
5864
*/
5965
public function hexColor(): string
6066
{
61-
$number = new Number();
62-
63-
return '#' . str_pad(dechex($number->numberBetween(1, 16777215)), 6, '0', STR_PAD_LEFT);
67+
return '#' . str_pad(dechex($this->numberExtension->numberBetween(1, 16777215)), 6, '0', STR_PAD_LEFT);
6468
}
6569

6670
/**
6771
* @example '#ff0044'
6872
*/
6973
public function safeHexColor(): string
7074
{
71-
$number = new Number();
72-
$color = str_pad(dechex($number->numberBetween(0, 255)), 3, '0', STR_PAD_LEFT);
75+
$color = str_pad(dechex($this->numberExtension->numberBetween(0, 255)), 3, '0', STR_PAD_LEFT);
7376

7477
return sprintf(
7578
'#%s%s%s%s%s%s',
@@ -122,12 +125,10 @@ public function rgbCssColor(): string
122125
*/
123126
public function rgbaCssColor(): string
124127
{
125-
$number = new Number();
126-
127128
return sprintf(
128129
'rgba(%s,%s)',
129130
$this->rgbColor(),
130-
$number->randomFloat(1, 0, 1),
131+
$this->numberExtension->randomFloat(1, 0, 1),
131132
);
132133
}
133134

@@ -152,13 +153,11 @@ public function colorName(): string
152153
*/
153154
public function hslColor(): string
154155
{
155-
$number = new Number();
156-
157156
return sprintf(
158157
'%s,%s,%s',
159-
$number->numberBetween(0, 360),
160-
$number->numberBetween(0, 100),
161-
$number->numberBetween(0, 100),
158+
$this->numberExtension->numberBetween(0, 360),
159+
$this->numberExtension->numberBetween(0, 100),
160+
$this->numberExtension->numberBetween(0, 100),
162161
);
163162
}
164163

@@ -169,12 +168,10 @@ public function hslColor(): string
169168
*/
170169
public function hslColorAsArray(): array
171170
{
172-
$number = new Number();
173-
174171
return [
175-
$number->numberBetween(0, 360),
176-
$number->numberBetween(0, 100),
177-
$number->numberBetween(0, 100),
172+
$this->numberExtension->numberBetween(0, 360),
173+
$this->numberExtension->numberBetween(0, 100),
174+
$this->numberExtension->numberBetween(0, 100),
178175
];
179176
}
180177
}

src/Faker/Core/Coordinates.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,17 @@
44

55
namespace Faker\Core;
66

7-
use Faker\Extension\Extension;
7+
use Faker\Extension;
88

9-
class Coordinates implements Extension
9+
class Coordinates implements Extension\Extension
1010
{
11+
private Extension\NumberExtension $numberExtension;
12+
13+
public function __construct(Extension\NumberExtension $numberExtension = null)
14+
{
15+
$this->numberExtension = $numberExtension ?: new Number();
16+
}
17+
1118
/**
1219
* @example '77.147489'
1320
*
@@ -63,6 +70,6 @@ private function randomFloat(int $nbMaxDecimals, float $min, float $max): float
6370
throw new \LogicException('Invalid coordinates boundaries');
6471
}
6572

66-
return round($min + mt_rand() / mt_getrandmax() * ($max - $min), $nbMaxDecimals);
73+
return $this->numberExtension->randomFloat($nbMaxDecimals, $min, $max);
6774
}
6875
}

src/Faker/Core/Number.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public function numberBetween(int $min = 0, int $max = 2147483647): int
2121

2222
public function randomDigit(): int
2323
{
24-
return mt_rand(0, 9);
24+
return $this->numberBetween(0, 9);
2525
}
2626

2727
public function randomDigitNot(int $except): int
@@ -37,7 +37,7 @@ public function randomDigitNot(int $except): int
3737

3838
public function randomDigitNotZero(): int
3939
{
40-
return mt_rand(1, 9);
40+
return $this->numberBetween(1, 9);
4141
}
4242

4343
public function randomFloat(?int $nbMaxDecimals = null, float $min = 0, ?float $max = null): float
@@ -60,7 +60,7 @@ public function randomFloat(?int $nbMaxDecimals = null, float $min = 0, ?float $
6060
$max = $tmp;
6161
}
6262

63-
return round($min + mt_rand() / mt_getrandmax() * ($max - $min), $nbMaxDecimals);
63+
return round($min + $this->numberBetween() / mt_getrandmax() * ($max - $min), $nbMaxDecimals);
6464
}
6565

6666
public function randomNumber(int $nbDigits = null, bool $strict = false): int
@@ -75,9 +75,9 @@ public function randomNumber(int $nbDigits = null, bool $strict = false): int
7575
}
7676

7777
if ($strict) {
78-
return mt_rand(10 ** ($nbDigits - 1), $max);
78+
return $this->numberBetween(10 ** ($nbDigits - 1), $max);
7979
}
8080

81-
return mt_rand(0, $max);
81+
return $this->numberBetween(0, $max);
8282
}
8383
}

src/Faker/Core/Uuid.php

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,23 @@
22

33
namespace Faker\Core;
44

5-
use Faker\Extension\UuidExtension;
5+
use Faker\Extension;
66

7-
final class Uuid implements UuidExtension
7+
final class Uuid implements Extension\UuidExtension
88
{
9-
public function uuid3(): string
9+
private Extension\NumberExtension $numberExtension;
10+
11+
public function __construct(Extension\NumberExtension $numberExtension = null)
1012
{
11-
$number = new Number();
1213

14+
$this->numberExtension = $numberExtension ?: new Number();
15+
}
16+
17+
public function uuid3(): string
18+
{
1319
// fix for compatibility with 32bit architecture; each mt_rand call is restricted to 32bit
1420
// two such calls will cause 64bits of randomness regardless of architecture
15-
$seed = $number->numberBetween(0, 2147483647) . '#' . $number->numberBetween(0, 2147483647);
21+
$seed = $this->numberExtension->numberBetween(0, 2147483647) . '#' . $this->numberExtension->numberBetween(0, 2147483647);
1622

1723
// Hash the seed and convert to a byte array
1824
$val = md5($seed, true);

src/Faker/Core/Version.php

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,35 @@
44

55
namespace Faker\Core;
66

7-
use Faker\Extension\Helper;
8-
use Faker\Extension\VersionExtension;
7+
use Faker\Extension;
98
use Faker\Provider\DateTime;
109

11-
final class Version implements VersionExtension
10+
final class Version implements Extension\VersionExtension
1211
{
12+
private Extension\NumberExtension $numberExtension;
1313
/**
1414
* @var string[]
1515
*/
1616
private $semverCommonPreReleaseIdentifiers = ['alpha', 'beta', 'rc'];
1717

18+
public function __construct(Extension\NumberExtension $numberExtension = null)
19+
{
20+
21+
$this->numberExtension = $numberExtension ?: new Number();
22+
}
23+
1824
/**
1925
* Represents v2.0.0 of the semantic versioning: https://semver.org/spec/v2.0.0.html
2026
*/
2127
public function semver(bool $preRelease = false, bool $build = false): string
2228
{
2329
return sprintf(
2430
'%d.%d.%d%s%s',
25-
mt_rand(0, 9),
26-
mt_rand(0, 99),
27-
mt_rand(0, 99),
28-
$preRelease && mt_rand(0, 1) === 1 ? '-' . $this->semverPreReleaseIdentifier() : '',
29-
$build && mt_rand(0, 1) === 1 ? '+' . $this->semverBuildIdentifier() : '',
31+
$this->numberExtension->numberBetween(0, 9),
32+
$this->numberExtension->numberBetween(0, 99),
33+
$this->numberExtension->numberBetween(0, 99),
34+
$preRelease && $this->numberExtension->numberBetween(0, 1) === 1 ? '-' . $this->semverPreReleaseIdentifier() : '',
35+
$build && $this->numberExtension->numberBetween(0, 1) === 1 ? '+' . $this->semverBuildIdentifier() : '',
3036
);
3137
}
3238

@@ -35,23 +41,23 @@ public function semver(bool $preRelease = false, bool $build = false): string
3541
*/
3642
private function semverPreReleaseIdentifier(): string
3743
{
38-
$ident = Helper::randomElement($this->semverCommonPreReleaseIdentifiers);
44+
$ident = Extension\Helper::randomElement($this->semverCommonPreReleaseIdentifiers);
3945

40-
if (mt_rand(0, 1) !== 1) {
46+
if ($this->numberExtension->numberBetween(0, 1) !== 1) {
4147
return $ident;
4248
}
4349

44-
return $ident . '.' . mt_rand(1, 99);
50+
return $ident . '.' . $this->numberExtension->numberBetween(1, 99);
4551
}
4652

4753
/**
4854
* Common random build identifier
4955
*/
5056
private function semverBuildIdentifier(): string
5157
{
52-
if (mt_rand(0, 1) === 1) {
58+
if ($this->numberExtension->numberBetween(0, 1) === 1) {
5359
// short git revision syntax: https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection
54-
return substr(sha1(Helper::lexify('??????')), 0, 7);
60+
return substr(sha1(Extension\Helper::lexify('??????')), 0, 7);
5561
}
5662

5763
// date syntax

0 commit comments

Comments
 (0)