Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
63.64% covered (warning)
63.64%
14 / 22
62.50% covered (warning)
62.50%
5 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
ApieLib
63.64% covered (warning)
63.64%
14 / 22
62.50% covered (warning)
62.50%
5 / 8
25.82
0.00% covered (danger)
0.00%
0 / 1
 resetAliases
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 registerAlias
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 hasAlias
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getAlias
66.67% covered (warning)
66.67%
2 / 3
0.00% covered (danger)
0.00%
0 / 1
2.15
 __construct
n/a
0 / 0
n/a
0 / 0
1
 registerValueObject
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
5
 getPsrClock
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 setPsrClock
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 dumpValueException
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2namespace Apie\Core;
3
4use Apie\Common\Other\Audit\AuditEvent;
5use Apie\Core\Exceptions\IndexNotFoundException;
6use Apie\Core\Permissions\PermissionInterface;
7use Apie\Core\Permissions\SerializedPermission;
8use Apie\Core\Translator\ValueObjects\AbstractTranslation;
9use Apie\Core\Translator\ValueObjects\MenuHeader;
10use Apie\Core\Translator\ValueObjects\ResourceAddResourceButtonLabel;
11use Apie\Core\Translator\ValueObjects\ResourceAddResourceHeader;
12use Apie\Core\Translator\ValueObjects\ResourceModifyResourceButtonLabel;
13use Apie\Core\Translator\ValueObjects\ResourceModifyResourceHeader;
14use Apie\Core\Translator\ValueObjects\ResourceOverviewHeader;
15use Apie\Core\ValueObjects\Interfaces\ValueObjectInterface;
16use Apie\Core\ValueObjects\Utils;
17use Apie\SchemaGenerator\Other\JsonSchemaFormatValidator;
18use Beste\Clock\SystemClock;
19use League\OpenAPIValidation\Schema\TypeFormats\FormatsContainer;
20use Psr\Clock\ClockInterface;
21use ReflectionClass;
22use Symfony\Component\VarDumper\Cloner\VarCloner;
23use Symfony\Component\VarDumper\Dumper\CliDumper;
24
25final class ApieLib
26{
27    /**
28     * @var array<class-string<object>, string|class-string<object>> $aliases
29     */
30    private static $aliases = [
31        AbstractTranslation::class => MenuHeader::class
32            . '|' . ResourceOverviewHeader::class
33            . '|' . ResourceAddResourceButtonLabel::class
34            . '|' . ResourceAddResourceHeader::class
35            . '|' . ResourceModifyResourceButtonLabel::class
36            . '|' . ResourceModifyResourceHeader::class,
37        PermissionInterface::class => SerializedPermission::class,
38        AuditEvent::class => 'Apie\Common\Other\Audit\AuditCreate|Apie\Common\Other\Audit\AuditModified|Apie\Common\Other\Audit\AuditRemoved|Apie\Common\Other\Audit\AuditRead|Apie\Common\Other\Audit\AuditMethodCalled'
39    ];
40
41    public static function resetAliases(): void
42    {
43        $prop = new \ReflectionProperty(__CLASS__, 'aliases');
44        $prop->setValue(null, $prop->getDefaultValue());
45    }
46
47    /**
48     * @param class-string<object> $alias
49     * @param string|class-string<object> $target
50     * @return void
51     */
52    public static function registerAlias(string $alias, string $target): void
53    {
54        self::$aliases[$alias] = $target;
55    }
56
57    /**
58     * @param class-string<object> $alias
59     */
60    public static function hasAlias(string $alias): bool
61    {
62        return isset(self::$aliases[$alias]);
63    }
64
65    /**
66     * @param class-string<object> $alias
67     * @return string|class-string<object>
68     */
69    public static function getAlias(string $alias): string
70    {
71        if (!isset(self::$aliases[$alias])) {
72            throw new IndexNotFoundException($alias);
73        }
74        return self::$aliases[$alias];
75    }
76
77    /**
78     * @codeCoverageIgnore
79     */
80    private function __construct()
81    {
82    }
83
84    public const VERSION = '1.0.0-RC3';
85
86    public const APIE_FORM_ELEMENTS = '0.7.0';
87
88    public const APIE_STACKTRACE = '0.1.6';
89
90    private static ClockInterface $clock;
91
92
93    /**
94     * Workaround for many integration tests in validating string value objects in OneOf or AllOf schema's.
95     *
96     * @param class-string<ValueObjectInterface> $class
97     */
98    public static function registerValueObject(string $class): void
99    {
100        if (class_exists(FormatsContainer::class) && class_exists(JsonSchemaFormatValidator::class)) {
101            $format = strtolower(Utils::getDisplayNameForValueObject(new ReflectionClass($class)));
102            if (!FormatsContainer::getFormat('string', $format)) {
103                FormatsContainer::registerFormat('string', $format, new JsonSchemaFormatValidator($class));
104            }
105            if (!FormatsContainer::getFormat('number', $format)) {
106                FormatsContainer::registerFormat('number', $format, new JsonSchemaFormatValidator($class));
107            }
108        }
109    }
110
111    public static function getPsrClock(): ClockInterface
112    {
113        if (!isset(self::$clock)) {
114            self::$clock = SystemClock::create();
115        }
116        return self::$clock;
117    }
118
119    public static function setPsrClock(ClockInterface $clock): void
120    {
121        self::$clock = $clock;
122    }
123
124    public static function dumpValueException(mixed $input): never
125    {
126        $cloner = new VarCloner();
127        $dumper = new CliDumper();
128        $output = fopen('php://memory', 'r+b');
129
130        $dumper->dump($cloner->cloneVar($input), $output);
131        throw new \LogicException(stream_get_contents($output, -1, 0));
132    }
133}