Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
88.89% covered (warning)
88.89%
16 / 18
75.00% covered (warning)
75.00%
6 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
KebabCaseSlug
88.89% covered (warning)
88.89%
16 / 18
75.00% covered (warning)
75.00%
6 / 8
10.14
0.00% covered (danger)
0.00%
0 / 1
 fromClass
83.33% covered (warning)
83.33%
5 / 6
0.00% covered (danger)
0.00%
0 / 1
3.04
 fromText
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 humanize
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getRegularExpression
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 toCamelCaseSlug
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 toPascalCaseSlug
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 toSnakeCaseSlug
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 createRandom
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2namespace Apie\Core\Identifiers;
3
4use Apie\Core\Attributes\Description;
5use Apie\Core\Attributes\FakeMethod;
6use Apie\Core\ValueObjects\Interfaces\HasRegexValueObjectInterface;
7use Apie\Core\ValueObjects\IsStringWithRegexValueObject;
8use Faker\Generator;
9use ReflectionClass;
10use ReflectionMethod;
11use ReflectionProperty;
12
13/**
14 * Indicate an identifier written with dashes (kebab-case).
15 */
16#[FakeMethod('createRandom')]
17#[Description('lowercase text written in kebab case, for example "example-object"')]
18class KebabCaseSlug implements HasRegexValueObjectInterface
19{
20    use IsStringWithRegexValueObject;
21
22    /**
23     * @param ReflectionClass<object>|ReflectionMethod|ReflectionProperty|string $class
24     */
25    public static function fromClass(ReflectionClass|ReflectionMethod|ReflectionProperty|string $class): self
26    {
27        if (is_object($class)) {
28            $shortName = $class instanceof ReflectionClass ? $class->getShortName() : $class->name;
29            $shortName = preg_replace('/^__/', 'magicMethod', $shortName);
30            $short = preg_replace('/([a-z])([A-Z])/', '$1-$2', $shortName);
31        } else {
32            $short = $class;
33        }
34        return static::fromNative(strtolower($short));
35    }
36
37    public static function fromText(string $text): self
38    {
39        // Replace camelCase with kebab-case
40        $text = preg_replace('/([a-z])([A-Z])/', '$1-$2', $text);
41        // Replace any non-alphanumeric character with dash
42        $text = preg_replace('/[^a-zA-Z0-9]+/', '-', $text);
43        // Convert to lowercase
44        $text = strtolower($text);
45        // Remove leading/trailing dashes
46        $text = trim($text, '-');
47        // Collapse multiple dashes into one
48        $text = preg_replace('/-+/', '-', $text);
49        return static::fromNative($text);
50    }
51
52    public function humanize(): string
53    {
54        return str_replace('-', ' ', $this->internal);
55    }
56
57    public static function getRegularExpression(): string
58    {
59        return '/^[a-z0-9]+(\-[a-z0-9]+)*$/';
60    }
61
62    public function toCamelCaseSlug(): CamelCaseSlug
63    {
64        return new CamelCaseSlug(lcfirst(str_replace('-', '', ucwords($this->internal, '-'))));
65    }
66
67    public function toPascalCaseSlug(): PascalCaseSlug
68    {
69        return new PascalCaseSlug(str_replace('-', '', ucwords($this->internal, '-')));
70    }
71
72    public function toSnakeCaseSlug(): SnakeCaseSlug
73    {
74        return new SnakeCaseSlug(str_replace('-', '_', $this->internal));
75    }
76
77    public static function createRandom(Generator $faker): static
78    {
79        return static::fromNative(CamelCaseSlug::createRandom($faker)->toKebabCaseSlug()->toNative());
80    }
81}