• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

api-platform / core / 15133993414

20 May 2025 09:30AM UTC coverage: 26.313% (-1.2%) from 27.493%
15133993414

Pull #7161

github

web-flow
Merge e2c03d45f into 5459ba375
Pull Request #7161: fix(metadata): infer parameter string type from schema

0 of 2 new or added lines in 1 file covered. (0.0%)

11019 existing lines in 363 files now uncovered.

12898 of 49018 relevant lines covered (26.31%)

34.33 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

78.33
/src/Metadata/Extractor/XmlPropertyExtractor.php
1
<?php
2

3
/*
4
 * This file is part of the API Platform project.
5
 *
6
 * (c) Kévin Dunglas <dunglas@gmail.com>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11

12
declare(strict_types=1);
13

14
namespace ApiPlatform\Metadata\Extractor;
15

16
use ApiPlatform\Metadata\Exception\InvalidArgumentException;
17
use Symfony\Component\Config\Util\XmlUtils;
18

19
/**
20
 * Extracts an array of metadata from a list of XML files.
21
 *
22
 * @author Vincent Chalamon <vincentchalamon@gmail.com>
23
 */
24
final class XmlPropertyExtractor extends AbstractPropertyExtractor
25
{
26
    public const SCHEMA = __DIR__.'/schema/properties.xsd';
27

28
    /**
29
     * {@inheritdoc}
30
     */
31
    protected function extractPath(string $path): void
32
    {
33
        try {
34
            /** @var \SimpleXMLElement $xml */
UNCOV
35
            $xml = simplexml_import_dom(XmlUtils::loadFile($path, self::SCHEMA));
241✔
UNCOV
36
        } catch (\InvalidArgumentException $e) {
241✔
37
            // Ensure it's not a resource
38
            try {
UNCOV
39
                simplexml_import_dom(XmlUtils::loadFile($path, XmlResourceExtractor::SCHEMA));
241✔
40
            } catch (\InvalidArgumentException) {
×
41
                throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
×
42
            }
43

44
            // It's a resource: ignore error
UNCOV
45
            return;
241✔
46
        }
47

UNCOV
48
        foreach ($xml->property as $property) {
241✔
UNCOV
49
            $this->properties[$this->resolve((string) $property['resource'])][(string) $property['name']] = [
241✔
UNCOV
50
                'description' => $this->phpize($property, 'description', 'string'),
241✔
UNCOV
51
                'readable' => $this->phpize($property, 'readable', 'bool'),
241✔
UNCOV
52
                'writable' => $this->phpize($property, 'writable', 'bool'),
241✔
UNCOV
53
                'readableLink' => $this->phpize($property, 'readableLink', 'bool'),
241✔
UNCOV
54
                'writableLink' => $this->phpize($property, 'writableLink', 'bool'),
241✔
UNCOV
55
                'required' => $this->phpize($property, 'required', 'bool'),
241✔
UNCOV
56
                'identifier' => $this->phpize($property, 'identifier', 'bool'),
241✔
UNCOV
57
                'default' => $this->phpize($property, 'default', 'string'),
241✔
UNCOV
58
                'example' => $this->phpize($property, 'example', 'string'),
241✔
UNCOV
59
                'deprecationReason' => $this->phpize($property, 'deprecationReason', 'string'),
241✔
UNCOV
60
                'fetchable' => $this->phpize($property, 'fetchable', 'bool'),
241✔
UNCOV
61
                'fetchEager' => $this->phpize($property, 'fetchEager', 'bool'),
241✔
UNCOV
62
                'jsonldContext' => isset($property->jsonldContext->values) ? $this->buildValues($property->jsonldContext->values) : null,
241✔
UNCOV
63
                'openapiContext' => isset($property->openapiContext->values) ? $this->buildValues($property->openapiContext->values) : null,
241✔
UNCOV
64
                'jsonSchemaContext' => isset($property->jsonSchemaContext->values) ? $this->buildValues($property->jsonSchemaContext->values) : null,
241✔
UNCOV
65
                'push' => $this->phpize($property, 'push', 'bool'),
241✔
UNCOV
66
                'security' => $this->phpize($property, 'security', 'string'),
241✔
UNCOV
67
                'securityPostDenormalize' => $this->phpize($property, 'securityPostDenormalize', 'string'),
241✔
UNCOV
68
                'types' => $this->buildArrayValue($property, 'type'),
241✔
UNCOV
69
                'builtinTypes' => $this->buildArrayValue($property, 'builtinType'),
241✔
UNCOV
70
                'schema' => isset($property->schema->values) ? $this->buildValues($property->schema->values) : null,
241✔
UNCOV
71
                'initializable' => $this->phpize($property, 'initializable', 'bool'),
241✔
UNCOV
72
                'extraProperties' => $this->buildExtraProperties($property, 'extraProperties'),
241✔
UNCOV
73
                'iris' => $this->buildArrayValue($property, 'iri'),
241✔
UNCOV
74
                'genId' => $this->phpize($property, 'genId', 'bool'),
241✔
UNCOV
75
                'uriTemplate' => $this->phpize($property, 'uriTemplate', 'string'),
241✔
UNCOV
76
                'property' => $this->phpize($property, 'property', 'string'),
241✔
UNCOV
77
            ];
241✔
78
        }
79
    }
80

81
    private function buildExtraProperties(\SimpleXMLElement $resource, ?string $key = null): ?array
82
    {
UNCOV
83
        if (null !== $key) {
241✔
UNCOV
84
            if (!isset($resource->{$key})) {
241✔
UNCOV
85
                return null;
241✔
86
            }
87

88
            $resource = $resource->{$key};
×
89
        }
90

91
        return $this->buildValues($resource->values);
×
92
    }
93

94
    /**
95
     * @return string[]
96
     */
97
    private function buildValues(\SimpleXMLElement $resource): array
98
    {
99
        $data = [];
×
100
        foreach ($resource->value as $value) {
×
101
            if (null !== $value->attributes()->name) {
×
102
                $data[(string) $value->attributes()->name] = isset($value->values) ? $this->buildValues($value->values) : (string) $value;
×
103
                continue;
×
104
            }
105

106
            $data[] = isset($value->values) ? $this->buildValues($value->values) : (string) $value;
×
107
        }
108

109
        return $data;
×
110
    }
111

112
    private function buildArrayValue(?\SimpleXMLElement $resource, string $key, mixed $default = null)
113
    {
UNCOV
114
        if (!isset($resource->{$key.'s'}->{$key})) {
241✔
UNCOV
115
            return $default;
241✔
116
        }
117

UNCOV
118
        return (array) $resource->{$key.'s'}->{$key};
241✔
119
    }
120

121
    /**
122
     * Transforms an XML attribute's value in a PHP value.
123
     */
124
    private function phpize(\SimpleXMLElement $resource, string $key, string $type, mixed $default = null): array|bool|int|string|null
125
    {
UNCOV
126
        if (!isset($resource[$key])) {
241✔
UNCOV
127
            return $default;
241✔
128
        }
129

UNCOV
130
        return match ($type) {
241✔
131
            'bool|string' => \in_array((string) $resource[$key], ['1', '0', 'true', 'false'], true) ? $this->phpize($resource, $key, 'bool') : $this->phpize($resource, $key, 'string'),
×
UNCOV
132
            'string' => (string) $resource[$key],
241✔
133
            'integer' => (int) $resource[$key],
×
UNCOV
134
            'bool' => (bool) XmlUtils::phpize($resource[$key]),
241✔
UNCOV
135
            default => null,
241✔
UNCOV
136
        };
241✔
137
    }
138
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc