Skip to content

Commit 684ab1e

Browse files
authored
Merge pull request #9 from kynx/php83
Add PHP 8.3 support, update dependencies
2 parents 12f42ee + c55f022 commit 684ab1e

21 files changed

+1019
-921
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
/vendor/
22
/.phpcs-cache
33
/.phpunit.result.cache
4+
/.phpunit.cache/

.markdownlint.json

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"default": true,
3+
"MD013": false,
4+
"MD014": false,
5+
"MD024": false,
6+
"MD028": false,
7+
"MD031": { "list_items": false },
8+
"MD034": false
9+
}

README.md

+28-24
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44

55
Utilities for generating PHP code.
66

7-
87
## Normalizers
98

10-
The normalizers generate readable PHP labels (class names, namespaces, property names, etc) from valid UTF-8 strings,
9+
The normalizers generate readable PHP labels (class names, namespaces, property names, etc) from valid UTF-8 strings,
1110
[transliterating] them to ASCII and spelling out any invalid characters.
1211

13-
### Usage:
12+
### Usage
1413

1514
The following code (forgive the Japanese - a certain translation tool tells me it means "Pet Store"):
15+
1616
```php
1717
<?php
1818

@@ -24,11 +24,13 @@ echo $namespace;
2424
```
2525

2626
outputs:
27-
```
27+
28+
```text
2829
Petto\Shoppu
2930
```
3031

3132
and:
33+
3234
```php
3335
<?php
3436

@@ -40,47 +42,48 @@ echo $property;
4042
```
4143

4244
outputs:
43-
```
45+
46+
```text
4447
twoDollarBill
4548
```
4649

4750
See the [tests] for more examples.
4851

4952
### Why?
5053

51-
You must **never** run code generated from untrusted user input. But there are a few cases where you do want to
54+
You must **never** run code generated from untrusted user input. But there are a few cases where you do want to
5255
_output_ code generated from (mostly) trusted input.
5356

5457
In my case, I need to generate classes and properties from an OpenAPI specification. There are no hard-and-fast rules
55-
on the characters present, just a vague "it is RECOMMENDED to follow common programming naming conventions". Whatever
56-
they are.
58+
on the characters present, just a vague "it is RECOMMENDED to follow common programming naming conventions". Whatever
59+
they are.
5760

5861
### How?
5962

60-
Each normalizer uses `ext-intl`'s [Transliterator] to turn the UTF-8 string into Latin-ASCII. Where a character has no
61-
equivalent in ASCII (the "€" symbol is a good example), it uses the [Unicode name] of the character to spell it out (to
62-
`Euro`, after some minor clean-up). For ASCII characters that are not valid in a PHP label, it provides its own spell
63+
Each normalizer uses `ext-intl`'s [Transliterator] to turn the UTF-8 string into Latin-ASCII. Where a character has no
64+
equivalent in ASCII (the "€" symbol is a good example), it uses the [Unicode name] of the character to spell it out (to
65+
`Euro`, after some minor clean-up). For ASCII characters that are not valid in a PHP label, it provides its own spell
6366
outs. For instance, a backtick "&#96;" becomes `Backtick`.
6467

65-
Initial digits are also spelt out: "123foo" becomes `OneTwoThreeFoo`. Finally reserved words are suffixed with a
66-
user-supplied string so they don't mess things up. In the first usage example above, if we normalized "class" it would
68+
Initial digits are also spelt out: "123foo" becomes `OneTwoThreeFoo`. Finally reserved words are suffixed with a
69+
user-supplied string so they don't mess things up. In the first usage example above, if we normalized "class" it would
6770
become `ClassController`.
6871

69-
The results may not be pretty. If for some mad reason your input contains ` ͖` - put your glasses on! - the label will
70-
contain `CombiningRightArrowheadAndUpArrowheadBelow`. But it _is_ valid PHP, and stands a chance of being as unique as
72+
The results may not be pretty. If for some mad reason your input contains `͖` - put your glasses on! - the label will
73+
contain `CombiningRightArrowheadAndUpArrowheadBelow`. But it _is_ valid PHP, and stands a chance of being as unique as
7174
the original. Which brings me to...
7275

73-
7476
## Unique labelers
7577

76-
The normalization process reduces around a million Unicode code points down to just 162 ASCII characters. Then it
77-
mangles the label further by stripping separators, reducing whitespace and turning it into camelCase, snake_case or
78+
The normalization process reduces around a million Unicode code points down to just 162 ASCII characters. Then it
79+
mangles the label further by stripping separators, reducing whitespace and turning it into camelCase, snake_case or
7880
whatever your programming preference. It's gonna be lossy - nothing we can do about that.
7981

8082
The unique labelers' job is to add back lost uniqueness, using a `UniqueStrategyInterface` to decorate any non-unique
8183
class names in the list it is given.
8284

8385
To guarantee uniqueness within a set of class name labels, use the `UniqueClassLabeller`:
86+
8487
```php
8588
<?php
8689

@@ -96,7 +99,8 @@ var_dump($unique);
9699
```
97100

98101
outputs:
99-
```
102+
103+
```text
100104
array(3) {
101105
'Déjà vu' =>
102106
string(7) "DejaVu1"
@@ -107,10 +111,11 @@ array(3) {
107111
}
108112
```
109113

110-
There are labelers for each of the normalizers: `UniqueClassLabeler`, `UniqueConstantLabeler`, `UniquePropertyLabeler`
111-
and `UniqueVariableLabeler`. Along with the `NumberSuffix` implementation of `UniqueStrategyInterface`, we provide a
114+
There are labelers for each of the normalizers: `UniqueClassLabeler`, `UniqueConstantLabeler`, `UniquePropertyLabeler`
115+
and `UniqueVariableLabeler`. Along with the `NumberSuffix` implementation of `UniqueStrategyInterface`, we provide a
112116
`SpellOutOrdinalPrefix` strategy. Using that instead of `NumberSuffix` above would output:
113-
```
117+
118+
```text
114119
array(3) {
115120
'Déjà vu' =>
116121
string(11) "FirstDejaVu"
@@ -123,8 +128,7 @@ array(3) {
123128

124129
Kinda cute, but a bit verbose for my taste.
125130

126-
127131
[transliterating]: https://unicode-org.github.io/icu/userguide/transforms/general/#script-transliteration
128132
[tests]: ./test/AbstractNormalizerTest.php
129133
[Transliterator]: https://www.php.net/manual/en/class.transliterator.php
130-
[Unicode name]: https://unicode.org/charts/charindex.html
134+
[Unicode name]: https://unicode.org/charts/charindex.html

composer.json

+5-4
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@
2222
"sort-packages": true
2323
},
2424
"require": {
25-
"php": "~8.1 || ~8.2",
25+
"php": "~8.2.0 || ~8.3.0",
2626
"ext-intl": "*"
2727
},
2828
"require-dev": {
29-
"laminas/laminas-coding-standard": "^2.4",
30-
"phpunit/phpunit": "^9.5",
31-
"vimeo/psalm": "^4.27"
29+
"laminas/laminas-coding-standard": "^3.0",
30+
"phpunit/phpunit": "^10.5.37",
31+
"psalm/plugin-phpunit": "^0.19.0",
32+
"vimeo/psalm": "^5.26"
3233
},
3334
"autoload": {
3435
"psr-4": {

0 commit comments

Comments
 (0)