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\AuditLogEventMessage;
10use Apie\Core\Translator\ValueObjects\CreateFormFieldProperty;
11use Apie\Core\Translator\ValueObjects\FormFieldProperty;
12use Apie\Core\Translator\ValueObjects\MenuHeader;
13use Apie\Core\Translator\ValueObjects\ResourceAddResourceButtonLabel;
14use Apie\Core\Translator\ValueObjects\ResourceAddResourceHeader;
15use Apie\Core\Translator\ValueObjects\ResourceCustomActionResourceButtonLabel;
16use Apie\Core\Translator\ValueObjects\ResourceCustomActionResourceHeader;
17use Apie\Core\Translator\ValueObjects\ResourceCustomGlobalActionResourceButtonLabel;
18use Apie\Core\Translator\ValueObjects\ResourceCustomGlobalActionResourceHeader;
19use Apie\Core\Translator\ValueObjects\ResourceModifyResourceButtonLabel;
20use Apie\Core\Translator\ValueObjects\ResourceModifyResourceHeader;
21use Apie\Core\Translator\ValueObjects\ResourceName;
22use Apie\Core\Translator\ValueObjects\ResourceOverviewHeader;
23use Apie\Core\ValueObjects\Interfaces\ValueObjectInterface;
24use Apie\Core\ValueObjects\Utils;
25use Apie\SchemaGenerator\Other\JsonSchemaFormatValidator;
26use Beste\Clock\SystemClock;
27use League\OpenAPIValidation\Schema\TypeFormats\FormatsContainer;
28use Psr\Clock\ClockInterface;
29use ReflectionClass;
30use Symfony\Component\VarDumper\Cloner\VarCloner;
31use Symfony\Component\VarDumper\Dumper\CliDumper;
32
33final class ApieLib
34{
35    /**
36     * @var array<class-string<object>, string|class-string<object>> $aliases
37     */
38    private static $aliases = [
39        AbstractTranslation::class => MenuHeader::class
40            . '|' . AuditLogEventMessage::class
41            . '|' . CreateFormFieldProperty::class
42            . '|' . FormFieldProperty::class
43            . '|' . ResourceOverviewHeader::class
44            . '|' . ResourceAddResourceButtonLabel::class
45            . '|' . ResourceAddResourceHeader::class
46            . '|' . ResourceCustomActionResourceButtonLabel::class
47            . '|' . ResourceCustomActionResourceHeader::class
48            . '|' . ResourceCustomGlobalActionResourceButtonLabel::class
49            . '|' . ResourceCustomGlobalActionResourceHeader::class
50            . '|' . ResourceModifyResourceButtonLabel::class
51            . '|' . ResourceModifyResourceHeader::class
52            . '|' . ResourceName::class,
53        PermissionInterface::class => SerializedPermission::class,
54        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'
55    ];
56
57    public static function resetAliases(): void
58    {
59        $prop = new \ReflectionProperty(__CLASS__, 'aliases');
60        $prop->setValue(null, $prop->getDefaultValue());
61    }
62
63    /**
64     * @param class-string<object> $alias
65     * @param string|class-string<object> $target
66     * @return void
67     */
68    public static function registerAlias(string $alias, string $target): void
69    {
70        self::$aliases[$alias] = $target;
71    }
72
73    /**
74     * @param class-string<object> $alias
75     */
76    public static function hasAlias(string $alias): bool
77    {
78        return isset(self::$aliases[$alias]);
79    }
80
81    /**
82     * @param class-string<object> $alias
83     * @return string|class-string<object>
84     */
85    public static function getAlias(string $alias): string
86    {
87        if (!isset(self::$aliases[$alias])) {
88            throw new IndexNotFoundException($alias);
89        }
90        return self::$aliases[$alias];
91    }
92
93    /**
94     * @codeCoverageIgnore
95     */
96    private function __construct()
97    {
98    }
99
100    public const VERSION = '1.0.0-RC3';
101
102    public const APIE_FORM_ELEMENTS = '0.7.0';
103
104    public const APIE_STACKTRACE = '0.1.6';
105
106    private static ClockInterface $clock;
107
108
109    /**
110     * Workaround for many integration tests in validating string value objects in OneOf or AllOf schema's.
111     *
112     * @param class-string<ValueObjectInterface> $class
113     */
114    public static function registerValueObject(string $class): void
115    {
116        if (class_exists(FormatsContainer::class) && class_exists(JsonSchemaFormatValidator::class)) {
117            $format = strtolower(Utils::getDisplayNameForValueObject(new ReflectionClass($class)));
118            if (!FormatsContainer::getFormat('string', $format)) {
119                FormatsContainer::registerFormat('string', $format, new JsonSchemaFormatValidator($class));
120            }
121            if (!FormatsContainer::getFormat('number', $format)) {
122                FormatsContainer::registerFormat('number', $format, new JsonSchemaFormatValidator($class));
123            }
124        }
125    }
126
127    public static function getPsrClock(): ClockInterface
128    {
129        if (!isset(self::$clock)) {
130            self::$clock = SystemClock::create();
131        }
132        return self::$clock;
133    }
134
135    public static function setPsrClock(ClockInterface $clock): void
136    {
137        self::$clock = $clock;
138    }
139
140    public static function dumpValueException(mixed $input): never
141    {
142        $cloner = new VarCloner();
143        $dumper = new CliDumper();
144        $output = fopen('php://memory', 'r+b');
145
146        $dumper->dump($cloner->cloneVar($input), $output);
147        throw new \LogicException(stream_get_contents($output, -1, 0));
148    }
149}