Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit1eff44f

Browse files
committed
[Uid] Add Generate and Inspect commands
1 parent6ae59a9 commit1eff44f

File tree

12 files changed

+1021
-8
lines changed

12 files changed

+1021
-8
lines changed

‎src/Symfony/Component/Serializer/Normalizer/UidNormalizer.php‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ final class UidNormalizer implements NormalizerInterface, DenormalizerInterface,
2222
publicconstNORMALIZATION_FORMAT_KEY ='uid_normalization_format';
2323

2424
publicconstNORMALIZATION_FORMAT_CANONICAL ='canonical';
25-
publicconstNORMALIZATION_FORMAT_BASE_58 ='base_58';
26-
publicconstNORMALIZATION_FORMAT_BASE_32 ='base_32';
27-
publicconstNORMALIZATION_FORMAT_RFC_4122 ='rfc_4122';
25+
publicconstNORMALIZATION_FORMAT_BASE58 ='base58';
26+
publicconstNORMALIZATION_FORMAT_BASE32 ='base32';
27+
publicconstNORMALIZATION_FORMAT_RFC4122 ='rfc4122';
2828

2929
private$defaultContext = [
3030
self::NORMALIZATION_FORMAT_KEY =>self::NORMALIZATION_FORMAT_CANONICAL,
@@ -45,11 +45,11 @@ public function normalize($object, string $format = null, array $context = [])
4545
switch ($context[self::NORMALIZATION_FORMAT_KEY] ??$this->defaultContext[self::NORMALIZATION_FORMAT_KEY]) {
4646
caseself::NORMALIZATION_FORMAT_CANONICAL:
4747
return (string)$object;
48-
caseself::NORMALIZATION_FORMAT_BASE_58:
48+
caseself::NORMALIZATION_FORMAT_BASE58:
4949
return$object->toBase58();
50-
caseself::NORMALIZATION_FORMAT_BASE_32:
50+
caseself::NORMALIZATION_FORMAT_BASE32:
5151
return$object->toBase32();
52-
caseself::NORMALIZATION_FORMAT_RFC_4122:
52+
caseself::NORMALIZATION_FORMAT_RFC4122:
5353
return$object->toRfc4122();
5454
}
5555

‎src/Symfony/Component/Serializer/Tests/Normalizer/UidNormalizerTest.php‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public function testSupportsNormalization()
3939

4040
publicfunctionnormalizeProvider()
4141
{
42-
$uidFormats = [null,'canonical','base_58','base_32','rfc_4122'];
42+
$uidFormats = [null,'canonical','base58','base32','rfc4122'];
4343
$data = [
4444
[
4545
UuidV1::fromString('9b7541de-6f87-11ea-ab3c-9da9a81562fc'),
@@ -149,7 +149,7 @@ public function testDenormalize($uuidString, $class)
149149
publicfunctiontestNormalizeWithNormalizationFormatPassedInConstructor()
150150
{
151151
$uidNormalizer =newUidNormalizer([
152-
'uid_normalization_format' =>'rfc_4122',
152+
'uid_normalization_format' =>'rfc4122',
153153
]);
154154
$ulid = Ulid::fromString('01ETWV01C0GYQ5N92ZK7QRGB10');
155155

‎src/Symfony/Component/Uid/CHANGELOG.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ CHANGELOG
99
*[BC BREAK] Replace`UuidV1::getTime()`,`UuidV6::getTime()` and`Ulid::getTime()` by`UuidV1::getDateTime()`,`UuidV6::getDateTime()` and`Ulid::getDateTime()`
1010
* Add`Uuid::NAMESPACE_*` constants from RFC4122
1111
* Add`UlidFactory`,`UuidFactory`,`RandomBasedUuidFactory`,`TimeBasedUuidFactory` and`NameBasedUuidFactory`
12+
* Add commands to generate and inspect UUIDs and ULIDs
1213

1314
5.2.0
1415
-----
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespaceSymfony\Component\Uid\Command;
13+
14+
useSymfony\Component\Console\Command\Command;
15+
useSymfony\Component\Console\Input\InputInterface;
16+
useSymfony\Component\Console\Input\InputOption;
17+
useSymfony\Component\Console\Output\ConsoleOutputInterface;
18+
useSymfony\Component\Console\Output\OutputInterface;
19+
useSymfony\Component\Console\Style\SymfonyStyle;
20+
useSymfony\Component\Uid\Factory\UlidFactory;
21+
useSymfony\Component\Uid\Ulid;
22+
23+
class GenerateUlidCommandextends Command
24+
{
25+
protectedstatic$defaultName ='ulid:generate';
26+
protectedstatic$defaultDescription ='Generates a ULID';
27+
28+
private$factory;
29+
30+
publicfunction__construct(UlidFactory$factory =null)
31+
{
32+
$this->factory =$factory ??newUlidFactory();
33+
34+
parent::__construct();
35+
}
36+
37+
/**
38+
* {@inheritdoc}
39+
*/
40+
protectedfunctionconfigure():void
41+
{
42+
$this
43+
->setDefinition([
44+
newInputOption('timestamp',null, InputOption::VALUE_REQUIRED,'The ULID timestamp: a parsable date/time string by the \DateTimeImmutable constructor. It must be greater than or equals to the UNIX epoch (1970-01-01 00:00:00)'),
45+
newInputOption('count','c', InputOption::VALUE_REQUIRED,'The number of ULID to generate',1),
46+
newInputOption('format','f', InputOption::VALUE_REQUIRED,'The ULID output format: base32, base58 or rfc4122','base32'),
47+
])
48+
->setDescription(self::$defaultDescription)
49+
->setHelp(<<<'EOF'
50+
The <info>%command.name%</info> command generates a ULID.
51+
52+
<info>php %command.full_name%</info>
53+
54+
To specify the timestamp:
55+
56+
<info>php %command.full_name% --timestamp="2021-02-16 14:09:08"</info>
57+
58+
To generate several ULIDs:
59+
60+
<info>php %command.full_name% --count=10</info>
61+
62+
To output a specific format:
63+
64+
<info>php %command.full_name% --format=rfc4122</info>
65+
EOF
66+
)
67+
;
68+
}
69+
70+
/**
71+
* {@inheritdoc}
72+
*/
73+
protectedfunctionexecute(InputInterface$input,OutputInterface$output)
74+
{
75+
$io =newSymfonyStyle($input,$outputinstanceof ConsoleOutputInterface ?$output->getErrorOutput() :$output);
76+
77+
if (null !==$time =$input->getOption('timestamp')) {
78+
try {
79+
$time =new \DateTimeImmutable($time);
80+
}catch (\Exception$e) {
81+
$io->error(sprintf('Invalid timestamp "%s". It cannot be parsed.',$time));
82+
83+
return1;
84+
}
85+
86+
if (0 >$time->format('U')) {
87+
$io->error(sprintf('Invalid timestamp "%s". It must be greater than or equals to the UNIX epoch (1970-01-01 00:00:00).',$input->getOption('timestamp')));
88+
89+
return2;
90+
}
91+
}
92+
93+
switch ($input->getOption('format')) {
94+
case'base32':
95+
$format ='strval';
96+
97+
break;
98+
case'base58':
99+
$format =staticfunction (Ulid$ulid):string {return$ulid->toBase58(); };
100+
101+
break;
102+
case'rfc4122':
103+
$format =staticfunction (Ulid$ulid):string {return$ulid->toRfc4122(); };
104+
105+
break;
106+
default:
107+
$io->error(sprintf('Invalid format "%s". Supported formats are base32, base58 and rfc4122.',$input->getOption('format')));
108+
109+
return3;
110+
}
111+
112+
$count = (int)$input->getOption('count');
113+
for ($i =0;$i <$count; ++$i) {
114+
$output->writeln($format($this->factory->create($time)));
115+
}
116+
117+
return0;
118+
}
119+
}
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespaceSymfony\Component\Uid\Command;
13+
14+
useSymfony\Component\Console\Command\Command;
15+
useSymfony\Component\Console\Input\InputInterface;
16+
useSymfony\Component\Console\Input\InputOption;
17+
useSymfony\Component\Console\Output\ConsoleOutputInterface;
18+
useSymfony\Component\Console\Output\OutputInterface;
19+
useSymfony\Component\Console\Style\SymfonyStyle;
20+
useSymfony\Component\Uid\Factory\UuidFactory;
21+
useSymfony\Component\Uid\Uuid;
22+
23+
class GenerateUuidCommandextends Command
24+
{
25+
protectedstatic$defaultName ='uuid:generate';
26+
protectedstatic$defaultDescription ='Generates a UUID';
27+
28+
private$factory;
29+
30+
publicfunction__construct(UuidFactory$factory =null)
31+
{
32+
$this->factory =$factory ??newUuidFactory();
33+
34+
parent::__construct();
35+
}
36+
37+
/**
38+
* {@inheritdoc}
39+
*/
40+
protectedfunctionconfigure():void
41+
{
42+
$this
43+
->setDefinition([
44+
newInputOption('time-based',null, InputOption::VALUE_REQUIRED,'The timestamp, to generate a time based UUID: a parsable date/time string by the \DateTimeImmutable constructor. It must be greater than or equals to the UUID epoch (1582-10-15 00:00:00)'),
45+
newInputOption('node',null, InputOption::VALUE_REQUIRED,"The time based UUID's node: a UUID, in any of the supported formats (base 58, base 32 or RFC 4122)"),
46+
newInputOption('name-based',null, InputOption::VALUE_REQUIRED,'The name, to generate a name based UUID'),
47+
newInputOption('namespace',null, InputOption::VALUE_REQUIRED,"The name based UUID's namespace: a UUID, in any of the supported formats (base 58, base 32 or RFC 4122)"),
48+
newInputOption('random-based',null, InputOption::VALUE_NONE,'To generate a random based UUID'),
49+
newInputOption('count','c', InputOption::VALUE_REQUIRED,'The number of UUID to generate',1),
50+
newInputOption('format','f', InputOption::VALUE_REQUIRED,'The UUID output format: rfc4122, base58 or base32','rfc4122'),
51+
])
52+
->setDescription(self::$defaultDescription)
53+
->setHelp(<<<'EOF'
54+
The <info>%command.name%</info> generates a UUID.
55+
56+
<info>php %command.full_name%</info>
57+
58+
To generate a time based UUID:
59+
60+
<info>php %command.full_name% --time-based=now</info>
61+
62+
To specify a time based UUID's node:
63+
64+
<info>php %command.full_name% --time-based=@1613480254 --node=fb3502dc-137e-4849-8886-ac90d07f64a7</info>
65+
66+
To generate a name based UUID:
67+
68+
<info>php %command.full_name% --name-based=foo</info>
69+
70+
To specify a name based UUID's namespace:
71+
72+
<info>php %command.full_name% --name-based=bar --namespace=fb3502dc-137e-4849-8886-ac90d07f64a7</info>
73+
74+
To generate a random based UUID:
75+
76+
<info>php %command.full_name% --random-based</info>
77+
78+
To generate several UUIDs:
79+
80+
<info>php %command.full_name% --count=10</info>
81+
82+
To output a specific format:
83+
84+
<info>php %command.full_name% --format=base58</info>
85+
EOF
86+
)
87+
;
88+
}
89+
90+
/**
91+
* {@inheritdoc}
92+
*/
93+
protectedfunctionexecute(InputInterface$input,OutputInterface$output)
94+
{
95+
$io =newSymfonyStyle($input,$outputinstanceof ConsoleOutputInterface ?$output->getErrorOutput() :$output);
96+
97+
$time =$input->getOption('time-based');
98+
$node =$input->getOption('node');
99+
$name =$input->getOption('name-based');
100+
$namespace =$input->getOption('namespace');
101+
$random =$input->getOption('random-based');
102+
103+
switch (true) {
104+
case !$time && !$node && !$name && !$namespace && !$random:
105+
$create = [$this->factory,'create'];
106+
107+
break;
108+
case$time && !$name && !$namespace && !$random:
109+
if ($node) {
110+
try {
111+
$node = Uuid::fromString($node);
112+
}catch (\InvalidArgumentException$e) {
113+
$io->error(sprintf('Invalid node "%s". It cannot be parsed.',$node));
114+
115+
return1;
116+
}
117+
}
118+
119+
try {
120+
$time =new \DateTimeImmutable($time);
121+
}catch (\Exception$e) {
122+
$io->error(sprintf('Invalid timestamp "%s". It cannot be parsed.',$input->getOption('time-based')));
123+
124+
return2;
125+
}
126+
127+
if ($time <new \DateTimeImmutable('@-12219292800')) {
128+
$io->error(sprintf('Invalid timestamp "%s". It must be greater than or equals to the UUID epoch (1582-10-15 00:00:00).',$input->getOption('time-based')));
129+
130+
return3;
131+
}
132+
133+
$create =function ()use ($node,$time):Uuid {return$this->factory->timeBased($node)->create($time); };
134+
135+
break;
136+
case$name && !$time && !$node && !$random:
137+
if ($namespace) {
138+
try {
139+
$namespace = Uuid::fromString($namespace);
140+
}catch (\InvalidArgumentException$e) {
141+
$io->error(sprintf('Invalid namespace "%s". It cannot be parsed.',$namespace));
142+
143+
return4;
144+
}
145+
}else {
146+
$refl =new \ReflectionProperty($this->factory,'nameBasedNamespace');
147+
$refl->setAccessible(true);
148+
if (null ===$refl->getValue($this->factory)) {
149+
$io->error('Missing namespace. Use the "--namespace" option or configure a default namespace in the underlying factory.');
150+
151+
return5;
152+
}
153+
}
154+
155+
$create =function ()use ($namespace,$name):Uuid {return$this->factory->nameBased($namespace)->create($name); };
156+
157+
break;
158+
case$random && !$time && !$node && !$name && !$namespace:
159+
$create = [$this->factory->randomBased(),'create'];
160+
161+
break;
162+
default:
163+
$io->error('Invalid combination of options.');
164+
165+
return6;
166+
}
167+
168+
switch ($input->getOption('format')) {
169+
case'rfc4122':
170+
$format ='strval';
171+
172+
break;
173+
case'base58':
174+
$format =staticfunction (Uuid$uuid):string {return$uuid->toBase58(); };
175+
176+
break;
177+
case'base32':
178+
$format =staticfunction (Uuid$uuid):string {return$uuid->toBase32(); };
179+
180+
break;
181+
default:
182+
$io->error(sprintf('Invalid format "%s". Supported formats are rfc4122, base58 and base32.',$input->getOption('format')));
183+
184+
return7;
185+
}
186+
187+
$count = (int)$input->getOption('count');
188+
for ($i =0;$i <$count; ++$i) {
189+
$io->writeln($format($create()));
190+
}
191+
192+
return0;
193+
}
194+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp