From ac752fc052d708b16c4365f97c9fb1b88255a5da Mon Sep 17 00:00:00 2001 From: Sean Molenaar Date: Mon, 29 May 2023 17:43:42 +0200 Subject: [PATCH] fix: PHPStan types --- src/PHPDraft/In/ApibFileParser.php | 7 +++++++ .../Model/Elements/BasicStructureElement.php | 4 ++-- .../Model/Elements/EnumStructureElement.php | 10 ++++++---- .../Model/Elements/ObjectStructureElement.php | 2 +- src/PHPDraft/Model/Elements/RequestBodyElement.php | 5 +++-- src/PHPDraft/Model/HTTPRequest.php | 6 +++--- src/PHPDraft/Model/HTTPResponse.php | 4 ++-- src/PHPDraft/Model/Resource.php | 2 +- src/PHPDraft/Model/Transition.php | 13 +++++++------ src/PHPDraft/Out/BaseTemplateRenderer.php | 2 +- src/PHPDraft/Out/TemplateRenderer.php | 12 +++++++++--- src/PHPDraft/Parse/Drafter.php | 13 +++++++++++-- src/PHPDraft/Parse/DrafterAPI.php | 2 +- 13 files changed, 54 insertions(+), 28 deletions(-) diff --git a/src/PHPDraft/In/ApibFileParser.php b/src/PHPDraft/In/ApibFileParser.php index e9ec4d18..59615380 100644 --- a/src/PHPDraft/In/ApibFileParser.php +++ b/src/PHPDraft/In/ApibFileParser.php @@ -91,6 +91,9 @@ private function get_apib(string $filename, ?string $rel_path = null): string { $path = $this->file_path($filename, $rel_path); $file = file_get_contents($path); + if ($file === FALSE) { + throw new ExecutionException("API File not readable: $filename", 1); + } $matches = []; preg_match_all('', $file, $matches); for ($i = 0; $i < count($matches[1]); $i++) { @@ -160,6 +163,10 @@ private function get_schema(string $url): string $result = curl_exec($ch); curl_close($ch); + if (is_bool($result)) { + throw new ExecutionException("Could not retreive schema from: $url", 1); + } + return $result; } diff --git a/src/PHPDraft/Model/Elements/BasicStructureElement.php b/src/PHPDraft/Model/Elements/BasicStructureElement.php index 6e88d927..a52abc4a 100644 --- a/src/PHPDraft/Model/Elements/BasicStructureElement.php +++ b/src/PHPDraft/Model/Elements/BasicStructureElement.php @@ -173,14 +173,14 @@ public function string_value(bool $flat = false) { if (is_array($this->value)) { $value_key = rand(0, count($this->value)); - if (is_subclass_of($this->value[$value_key], StructureElement::class) && $flat === false) { + if (is_subclass_of($this->value[$value_key], StructureElement::class, false) && $flat === false) { return $this->value[$value_key]->string_value($flat); } return $this->value[$value_key]; } - if (is_subclass_of($this->value, BasicStructureElement::class) && $flat === true) { + if (is_subclass_of($this->value, BasicStructureElement::class, false) && $flat === true) { return is_array($this->value->value) ? array_keys($this->value->value)[0] : $this->value->value; } diff --git a/src/PHPDraft/Model/Elements/EnumStructureElement.php b/src/PHPDraft/Model/Elements/EnumStructureElement.php index 040d15a8..afad49fd 100644 --- a/src/PHPDraft/Model/Elements/EnumStructureElement.php +++ b/src/PHPDraft/Model/Elements/EnumStructureElement.php @@ -61,10 +61,12 @@ public function parse(?object $object, array &$dependencies): StructureElement return $this; } - foreach ($object->attributes->enumerations->content as $sub_item) { - $element = new ElementStructureElement(); - $element->parse($sub_item, $dependencies); - $this->value[] = $element; + if (isset($object->attributes->enumerations)) { + foreach ($object->attributes->enumerations->content as $sub_item) { + $element = new ElementStructureElement(); + $element->parse($sub_item, $dependencies); + $this->value[] = $element; + } } $this->deps = $dependencies; diff --git a/src/PHPDraft/Model/Elements/ObjectStructureElement.php b/src/PHPDraft/Model/Elements/ObjectStructureElement.php index 6aaa5dc5..abc14ab9 100644 --- a/src/PHPDraft/Model/Elements/ObjectStructureElement.php +++ b/src/PHPDraft/Model/Elements/ObjectStructureElement.php @@ -109,7 +109,7 @@ protected function parse_value_structure(object $object, array &$dependencies) * * @return ObjectStructureElement */ - protected function new_instance(): StructureElement + protected function new_instance(): self { return new self(); } diff --git a/src/PHPDraft/Model/Elements/RequestBodyElement.php b/src/PHPDraft/Model/Elements/RequestBodyElement.php index f2305efb..c36ca32c 100644 --- a/src/PHPDraft/Model/Elements/RequestBodyElement.php +++ b/src/PHPDraft/Model/Elements/RequestBodyElement.php @@ -54,7 +54,8 @@ public function print_request(?string $type = 'application/x-www-form-urlencoded $object = []; $object[$this->key->value] = $value; - return json_encode($object); + $encoded = json_encode($object); + return is_string($encoded) ? $encoded : ''; } } @@ -63,7 +64,7 @@ public function print_request(?string $type = 'application/x-www-form-urlencoded * * @return RequestBodyElement */ - protected function new_instance(): StructureElement + protected function new_instance(): self { return new self(); } diff --git a/src/PHPDraft/Model/HTTPRequest.php b/src/PHPDraft/Model/HTTPRequest.php index bc2a2b58..5b0e39cb 100644 --- a/src/PHPDraft/Model/HTTPRequest.php +++ b/src/PHPDraft/Model/HTTPRequest.php @@ -21,7 +21,7 @@ class HTTPRequest implements Comparable /** * HTTP Headers. * - * @var array + * @var array */ public array $headers = []; @@ -69,7 +69,7 @@ class HTTPRequest implements Comparable /** * Structure of the request. * - * @var RequestBodyElement[]|RequestBodyElement + * @var array|RequestBodyElement */ public mixed $struct = []; /** @@ -194,7 +194,7 @@ public function get_curl_command(string $base_url, array $additional = []): stri $options[] = '--data-binary ' . escapeshellarg($this->body); } elseif (is_array($this->body) && $this->body !== []) { $options[] = '--data-binary ' . escapeshellarg(join('', $this->body)); - } elseif (is_subclass_of($this->struct, StructureElement::class)) { + } elseif (!is_array($this->struct)) { foreach ($this->struct->value as $body) { if (is_null($body) || $body === []) { continue; diff --git a/src/PHPDraft/Model/HTTPResponse.php b/src/PHPDraft/Model/HTTPResponse.php index df08f701..d05f6edf 100644 --- a/src/PHPDraft/Model/HTTPResponse.php +++ b/src/PHPDraft/Model/HTTPResponse.php @@ -40,14 +40,14 @@ class HTTPResponse implements Comparable /** * Response headers. * - * @var array + * @var array */ public array $headers = []; /** * Response bodies. * - * @var array + * @var array */ public array $content = []; diff --git a/src/PHPDraft/Model/Resource.php b/src/PHPDraft/Model/Resource.php index 9606baf0..22c046f2 100644 --- a/src/PHPDraft/Model/Resource.php +++ b/src/PHPDraft/Model/Resource.php @@ -26,7 +26,7 @@ class Resource extends HierarchyElement /** * URL variables. * - * @var ObjectStructureElement[] + * @var array */ public array $url_variables = []; diff --git a/src/PHPDraft/Model/Transition.php b/src/PHPDraft/Model/Transition.php index 0b59b6af..4d575247 100644 --- a/src/PHPDraft/Model/Transition.php +++ b/src/PHPDraft/Model/Transition.php @@ -37,7 +37,7 @@ class Transition extends HierarchyElement /** * URL variables. * - * @var StructureElement[] + * @var array */ public array $url_variables = []; @@ -51,21 +51,21 @@ class Transition extends HierarchyElement /** * The request. * - * @var HTTPRequest[] + * @var array */ public array $requests = []; /** * The responses. * - * @var HTTPResponse[] + * @var array */ public array $responses = []; /** * Structures used (if any). * - * @var StructureElement[] + * @var array */ public array $structures = []; @@ -176,7 +176,7 @@ public function build_url(string $base_url = '', bool $clean = false): string } if ($this->parent->url_variables !== []) { foreach ($this->parent->url_variables as $item) { - if (!is_subclass_of($item, BasicStructureElement::class)) { + if (!is_subclass_of($item, BasicStructureElement::class, false)) { continue; } @@ -204,7 +204,8 @@ public function build_url(string $base_url = '', bool $clean = false): string */ private function overlap_urls(string $str1, string $str2): false|string { - if ($overlap = $this->find_overlap($str1, $str2)) { + $overlap = $this->find_overlap($str1, $str2); + if (is_array($overlap)) { $overlap = $overlap[count($overlap) - 1]; $str1 = substr($str1, 0, -strlen($overlap)); $str2 = substr($str2, strlen($overlap)); diff --git a/src/PHPDraft/Out/BaseTemplateRenderer.php b/src/PHPDraft/Out/BaseTemplateRenderer.php index b8052cad..a22f2691 100644 --- a/src/PHPDraft/Out/BaseTemplateRenderer.php +++ b/src/PHPDraft/Out/BaseTemplateRenderer.php @@ -51,7 +51,7 @@ abstract class BaseTemplateRenderer /** * The base data of the API. * - * @var array + * @var array */ protected array $base_data; /** diff --git a/src/PHPDraft/Out/TemplateRenderer.php b/src/PHPDraft/Out/TemplateRenderer.php index 7b709143..397193d3 100644 --- a/src/PHPDraft/Out/TemplateRenderer.php +++ b/src/PHPDraft/Out/TemplateRenderer.php @@ -80,8 +80,14 @@ public function get(object $object): string } $loader = new FilesystemLoader([]); - $loader->addPath(stream_resolve_include_path(dirname($include))); - $loader->addPath(stream_resolve_include_path(dirname($this->find_include_file('default', 'twig')))); + $dirpath = stream_resolve_include_path(dirname($include)); + if ($dirpath !== FALSE) { + $loader->addPath($dirpath); + } + $twig_path = stream_resolve_include_path(dirname($this->find_include_file('default', 'twig'))); + if ($twig_path !== FALSE) { + $loader->addPath($twig_path); + } $twig = TwigFactory::get($loader); $template = $twig->load('main.twig'); @@ -161,7 +167,7 @@ public function find_include_file(string $template, string $extension = 'twig', 'PHPDraft/Out/HTML/' . $template . DIRECTORY_SEPARATOR . 'main' . ".{$extension}", ]; foreach ($includes as $include) { - if (!stream_resolve_include_path($include)) { + if (stream_resolve_include_path($include) === FALSE) { continue; } return $include; diff --git a/src/PHPDraft/Parse/Drafter.php b/src/PHPDraft/Parse/Drafter.php index 452cd86a..b70c444a 100644 --- a/src/PHPDraft/Parse/Drafter.php +++ b/src/PHPDraft/Parse/Drafter.php @@ -50,6 +50,10 @@ public function init(ApibFileParser $apib): BaseParser public static function location() { $returnVal = shell_exec('which drafter 2> /dev/null'); + if (!is_string($returnVal)) { + return false; + } + $returnVal = preg_replace('/^\s+|\n|\r|\s+$/m', '', $returnVal); return $returnVal === null || $returnVal === '' ? false : $returnVal; @@ -79,10 +83,15 @@ protected function parse(): void public static function available(): bool { $path = self::location(); + if ($path === FALSE) { + return FALSE; + } $version = shell_exec('drafter -v 2> /dev/null'); - $version = preg_match('/^v([45])/', $version); + if (!is_string($version)) { + return FALSE; + } - return $path && $version === 1; + return preg_match('/^v([45])/', $version) === 1; } } diff --git a/src/PHPDraft/Parse/DrafterAPI.php b/src/PHPDraft/Parse/DrafterAPI.php index d9b6b47f..348bc27e 100644 --- a/src/PHPDraft/Parse/DrafterAPI.php +++ b/src/PHPDraft/Parse/DrafterAPI.php @@ -42,7 +42,7 @@ protected function parse(): void $response = curl_exec($ch); - if (curl_errno($ch) !== 0) { + if (curl_errno($ch) !== 0 || is_bool($response)) { throw new ResourceException('Drafter webservice failed to parse input', 1); }