Skip to content

Commit ca74f3c

Browse files
committed
Add filter factory for preconfigured filters - Close #1 #2 #3 #4 #9
1 parent db5aa15 commit ca74f3c

File tree

3 files changed

+261
-0
lines changed

3 files changed

+261
-0
lines changed

README.md

+35
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,38 @@ Common PHP filters for code generation.
77
```bash
88
$ composer require open-code-modeling/php-filter --dev
99
```
10+
11+
If you want to use the `FilterFactory` to get complete preconfigured filters install also [`laminas/laminas-filter`](https://github.com/laminas/laminas-filter).
12+
13+
```bash
14+
$ composer require laminas/laminas-filter
15+
```
16+
17+
## Usage
18+
19+
```php
20+
<?php
21+
22+
use OpenCodeModeling\Filter;
23+
24+
$filter = Filter\FilterFactory::classNameFilter();
25+
($filter)(' Add Building '); // AddBuilding
26+
27+
$filter = Filter\FilterFactory::methodNameFilter();
28+
($filter)(' Add Building '); // addBuilding
29+
30+
$filter = Filter\FilterFactory::propertyNameFilter();
31+
($filter)(' Add Building '); // addBuilding
32+
33+
$filter = Filter\FilterFactory::constantNameFilter();
34+
($filter)(' Add Building '); // ADD_BUILDING
35+
36+
$filter = Filter\FilterFactory::constantValueFilter();
37+
($filter)(' Add Building '); // add_building
38+
39+
$filter = Filter\FilterFactory::namespaceToDirectoryFilter();
40+
($filter)('My\\App\\Service'); // My/App/Service
41+
42+
$filter = Filter\FilterFactory::directoryToNamespaceFilter();
43+
($filter)('My/App/Service'); // My\\App\\Service
44+
```

src/FilterFactory.php

+126
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
<?php
2+
3+
/**
4+
* @see https://github.com/open-code-modeling/php-filter for the canonical source repository
5+
* @copyright https://github.com/open-code-modeling/php-filter/blob/master/COPYRIGHT.md
6+
* @license https://github.com/open-code-modeling/php-filter/blob/master/LICENSE.md MIT License
7+
*/
8+
9+
declare(strict_types=1);
10+
11+
namespace OpenCodeModeling\Filter;
12+
13+
use Laminas\Filter;
14+
use Laminas\Filter\FilterChain;
15+
use Laminas\Filter\Word\SeparatorToSeparator;
16+
use OpenCodeModeling\Filter\Filter\LowerCaseFirst;
17+
use OpenCodeModeling\Filter\Filter\NormalizeLabel;
18+
use OpenCodeModeling\Filter\Filter\UpperCaseFirst;
19+
20+
final class FilterFactory
21+
{
22+
/**
23+
* Returns a normalize filter for labels, names ...
24+
*
25+
* @param callable ...$callables Attached to the end of the filter chain
26+
* @return callable
27+
*/
28+
public static function normalizeFilter(callable ...$callables): callable
29+
{
30+
$filter = new Filter\FilterChain();
31+
$filter->attach(new NormalizeLabel());
32+
$filter->attach(new Filter\Word\SeparatorToSeparator(' ', '-'));
33+
$filter->attach(new Filter\Word\UnderscoreToCamelCase());
34+
$filter->attach(new Filter\Word\DashToCamelCase());
35+
36+
foreach ($callables as $callable) {
37+
$filter->attach($callable);
38+
}
39+
40+
return $filter;
41+
}
42+
43+
/**
44+
* Returns a filter for valid class names e.g. AddBuilding
45+
*
46+
* @return callable
47+
*/
48+
public static function classNameFilter(): callable
49+
{
50+
return new UpperCaseFirst(self::normalizeFilter());
51+
}
52+
53+
/**
54+
* Returns a filter for valid constant names e.g. ADD_BUILDING
55+
*
56+
* @return callable
57+
*/
58+
public static function constantNameFilter(): callable
59+
{
60+
return self::normalizeFilter(
61+
new Filter\Word\CamelCaseToUnderscore(),
62+
new Filter\StringToUpper()
63+
);
64+
}
65+
66+
/**
67+
* Returns a filter for constant values e.g. add_building
68+
*
69+
* @return callable
70+
*/
71+
public static function constantValueFilter(): callable
72+
{
73+
return self::normalizeFilter(
74+
new Filter\Word\CamelCaseToUnderscore(),
75+
new Filter\StringToLower()
76+
);
77+
}
78+
79+
/**
80+
* Returns a filter for valid property names e.g. addBuilding
81+
*
82+
* @return callable
83+
*/
84+
public static function propertyNameFilter(): callable
85+
{
86+
return new LowerCaseFirst(self::normalizeFilter());
87+
}
88+
89+
/**
90+
* Returns a filter for valid property names e.g. addBuilding
91+
*
92+
* @return callable
93+
*/
94+
public static function methodNameFilter(): callable
95+
{
96+
return new LowerCaseFirst(self::normalizeFilter());
97+
}
98+
99+
/**
100+
* Returns a filter for converting a directory to a namespace
101+
*
102+
* @return callable
103+
*/
104+
public static function directoryToNamespaceFilter(): callable
105+
{
106+
$filter = new Filter\FilterChain();
107+
$filter->attach(new Filter\Word\SeparatorToSeparator(DIRECTORY_SEPARATOR, '|'));
108+
$filter->attach(new Filter\Word\SeparatorToSeparator('|', '\\\\'));
109+
110+
return $filter;
111+
}
112+
113+
/**
114+
* Returns a filter for converting a namespace to a directory
115+
*
116+
* @return callable
117+
*/
118+
public static function namespaceToDirectoryFilter(): callable
119+
{
120+
$filter = new FilterChain();
121+
$filter->attach(new SeparatorToSeparator('\\', '|'));
122+
$filter->attach(new SeparatorToSeparator('|', DIRECTORY_SEPARATOR));
123+
124+
return $filter;
125+
}
126+
}

tests/FilterFactoryTest.php

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenCodeModelingTest\Filter;
6+
7+
use Generator;
8+
use OpenCodeModeling\Filter\FilterFactory;
9+
use PHPUnit\Framework\TestCase;
10+
11+
final class FilterFactoryTest extends TestCase
12+
{
13+
/**
14+
* @return Generator<string, array>
15+
*/
16+
public function providerForLabel(): Generator
17+
{
18+
yield 'add building' => ['add building'];
19+
yield 'add_building' => ['add_building'];
20+
yield 'add-building' => ['add-building'];
21+
yield 'addBuilding' => ['addBuilding'];
22+
yield 'AddBuilding' => ['AddBuilding'];
23+
yield ' Add Building ' => [' Add Building '];
24+
yield 'Add building ' => ['Add building '];
25+
yield 'html' => ['Add Building<hr id="null"><div style="text-align: left;">- buildingId: string</div><div style="text-align: left;">- name: string</div>'];
26+
}
27+
28+
/**
29+
* @test
30+
* @dataProvider providerForLabel
31+
* @param string $label
32+
*/
33+
public function it_filters_method_name(string $label): void
34+
{
35+
$filter = FilterFactory::methodNameFilter();
36+
$this->assertSame('addBuilding', ($filter)($label));
37+
}
38+
39+
/**
40+
* @test
41+
* @dataProvider providerForLabel
42+
* @param string $label
43+
*/
44+
public function it_filters_property_name(string $label): void
45+
{
46+
$filter = FilterFactory::propertyNameFilter();
47+
$this->assertSame('addBuilding', ($filter)($label));
48+
}
49+
50+
/**
51+
* @test
52+
* @dataProvider providerForLabel
53+
* @param string $label
54+
*/
55+
public function it_filters_constant_name(string $label): void
56+
{
57+
$filter = FilterFactory::constantNameFilter();
58+
$this->assertSame('ADD_BUILDING', ($filter)($label));
59+
}
60+
61+
/**
62+
* @test
63+
* @dataProvider providerForLabel
64+
* @param string $label
65+
*/
66+
public function it_filters_constant_value(string $label): void
67+
{
68+
$filter = FilterFactory::constantValueFilter();
69+
$this->assertSame('add_building', ($filter)($label));
70+
}
71+
72+
/**
73+
* @test
74+
* @dataProvider providerForLabel
75+
* @param string $label
76+
*/
77+
public function it_filters_class_name(string $label): void
78+
{
79+
$filter = FilterFactory::classNameFilter();
80+
$this->assertSame('AddBuilding', ($filter)($label));
81+
}
82+
83+
/**
84+
* @test
85+
*/
86+
public function it_filters_namespace_to_directory(): void
87+
{
88+
$filter = FilterFactory::namespaceToDirectoryFilter();
89+
$this->assertSame('My/App/Service', ($filter)('My\\App\\Service'));
90+
}
91+
92+
/**
93+
* @test
94+
*/
95+
public function it_filters_directory_to_namespace(): void
96+
{
97+
$filter = FilterFactory::directoryToNamespaceFilter();
98+
$this->assertSame('My\\App\\Service', ($filter)('My/App/Service'));
99+
}
100+
}

0 commit comments

Comments
 (0)