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