diff --git a/composer.json b/composer.json index 48d4820..0638d56 100644 --- a/composer.json +++ b/composer.json @@ -18,6 +18,7 @@ "phpunit/phpunit": "^9" }, "require": { + "php": ">=8.0", "ext-dom": "*", "ext-libxml": "*" } diff --git a/src/Builder/SRSSBuilder.php b/src/Builder/SRSSBuilder.php index e1a1b6c..11f1fd3 100644 --- a/src/Builder/SRSSBuilder.php +++ b/src/Builder/SRSSBuilder.php @@ -6,165 +6,79 @@ use DOMDocument; use DOMElement; use Shikiryu\SRSS\Entity\Channel; use Shikiryu\SRSS\Entity\Item; +use Shikiryu\SRSS\Exception\DOMBuilderException; use Shikiryu\SRSS\SRSS; -use Shikiryu\SRSS\SRSSTools; class SRSSBuilder extends DomDocument { - private function buildRSS(SRSS $srss) + /** + * @throws \Shikiryu\SRSS\Exception\DOMBuilderException + */ + private function buildRSS(SRSS $srss): SRSSBuilder { - $root = $this->createElement('rss'); - $root->setAttribute('version', '2.0'); - $channel = $this->createElement('channel'); + try { + $root = $this->createElement('rss'); - $srss->channel->generator = 'Shikiryu RSS'; + $root->setAttribute('version', '2.0'); + $channel = $this->createElement('channel'); - $this->appendChannelToDom($srss->channel, $channel); + $srss->channel->generator = 'Shikiryu RSS'; - $this->appendItemsToDom($srss->items, $channel); + $this->appendChannelToDom($srss->channel, $channel); - $root->appendChild($channel); - $this->appendChild($root); - $this->encoding = 'UTF-8'; - $this->formatOutput = true; - $this->preserveWhiteSpace = false; - // $docs = 'http://www.scriptol.fr/rss/RSS-2.0.html'; + $this->appendItemsToDom($srss->items, $channel); + + $root->appendChild($channel); + $this->appendChild($root); + $this->encoding = 'UTF-8'; + $this->formatOutput = true; + $this->preserveWhiteSpace = false; + // $docs = 'http://www.scriptol.fr/rss/RSS-2.0.html'; + + } catch (\DOMException $e) { + throw new DOMBuilderException($e); + } return $this; } - public function build(SRSS $srss, string $filepath) - { - $this->buildRSS($srss); - $this->save($filepath); + /** + * @throws \Shikiryu\SRSS\Exception\DOMBuilderException + */ + public function build(SRSS $srss, string $filepath): void + { + $this + ->buildRSS($srss) + ->save($filepath); } /** * @return false|string + * @throws \Shikiryu\SRSS\Exception\DOMBuilderException */ - public function show(SRSS $srss) + public function show(SRSS $srss): bool|string { - $this->buildRSS($srss); - - return $this->saveXml(); + return $this + ->buildRSS($srss) + ->saveXml(); } - /** - * setter of "image"'s channel attributes - * @param $url string picture's url - * @param $title string picture's title - * @param $link string link on the picture - * @param $width int width - * @param $height int height - * @param $description string description - * TODO - */ - public function setImage($url, $title, $link, $width = 0, $height = 0, $description = '') + private function appendChannelToDom(Channel $channel, DOMElement $node): void { - $channel = $this->_getChannel(); - $array = []; - $url = SRSSTools::checkLink($url); - $array['url'] = $url; - $title = SRSSTools::noHTML($title); - $array['title'] = $title; - $link = SRSSTools::checkLink($link); - $array['link'] = $link; - if($width != 0) - { - $width = SRSSTools::checkInt($width); - $array['width'] = $width; - } - if($height != 0) - { - $height = SRSSTools::checkInt($height); - $array['height'] = $height; - } - if($description != 0) - { - $description = SRSSTools::noHTML($description); - $array['description'] = $description; - } - if($this->image == null) - { - $node = $this->createElement('image'); - $urlNode = $this->createElement('url', $url); - $titleNode = $this->createElement('title', $title); - $linkNode = $this->createElement('link', $link); - $node->appendChild($urlNode); - $node->appendChild($titleNode); - $node->appendChild($linkNode); - if($width != 0) - { - $widthNode = $this->createElement('width', $width); - $node->appendChild($widthNode); - } - if($height != 0) - { - $heightNode = $this->createElement('height', $height); - $node->appendChild($heightNode); - } - if($description != '') - { - $descNode = $this->createElement('description', $description); - $node->appendChild($descNode); - } - $channel->appendChild($node); - } - $this->attr['image'] = $array; - } - - /** - * setter of "cloud"'s channel attributes - * @param $domain string domain - * @param $port int port - * @param $path string path - * @param $registerProcedure string register procedure - * @param $protocol string protocol - * TODO - */ - public function setCloud($domain, $port, $path, $registerProcedure, $protocol) - { - $channel = $this->_getChannel(); - $array = array(); - $domain = SRSSTools::noHTML($domain); - $array['domain'] = $domain; - $port = SRSSTools::checkInt($port); - $array['port'] = $port; - $path = SRSSTools::noHTML($path); - $array['path'] = $path; - $registerProcedure = SRSSTools::noHTML($registerProcedure); - $array['registerProcedure'] = $registerProcedure; - $protocol = SRSSTools::noHTML($protocol); - $array['protocol'] = $protocol; - if($this->cloud == null) - { - $node = $this->createElement('cloud'); - $node->setAttribute('domain', $domain); - $node->setAttribute('port', $port); - $node->setAttribute('path', $path); - $node->setAttribute('registerProcedure', $registerProcedure); - $node->setAttribute('protocol', $protocol); - $channel->appendChild($node); - } - $this->attr['cloud'] = $array; - } - - private function appendChannelToDom(Channel $channel, DOMElement $node) - { - foreach (array_filter($channel->toArray(), fn($el) => !empty($el)) as $name => $value) { + foreach (array_filter($channel->toArray(), static fn($el) => !empty($el)) as $name => $value) { $new_node = $this->createElement($name, $value); $node->appendChild($new_node); } } - private function appendItemsToDom(array $items, DOMElement $channel) + private function appendItemsToDom(array $items, DOMElement $channel): void { foreach ($items as $item) { $this->appendItemToDom($item, $channel); } } - private function appendItemToDom(Item $item, DOMElement $channel) + private function appendItemToDom(Item $item, DOMElement $channel): void { $itemNode = $this->createElement('item'); foreach (array_filter($item->toArray()) as $name => $value) { diff --git a/src/Entity/Channel/Category.php b/src/Entity/Channel/Category.php index 7bc4557..6923c47 100644 --- a/src/Entity/Channel/Category.php +++ b/src/Entity/Channel/Category.php @@ -2,6 +2,7 @@ namespace Shikiryu\SRSS\Entity\Channel; +use ReflectionException; use Shikiryu\SRSS\Entity\SRSSElement; use Shikiryu\SRSS\Validator\HasValidator; use Shikiryu\SRSS\Validator\Validator; @@ -21,7 +22,7 @@ class Category extends HasValidator implements SRSSElement { try { return (new Validator())->isObjectValid($this); - } catch (\ReflectionException $e) { + } catch (ReflectionException) { return false; } } diff --git a/src/Entity/Channel/Cloud.php b/src/Entity/Channel/Cloud.php index 71b6875..9d379f3 100644 --- a/src/Entity/Channel/Cloud.php +++ b/src/Entity/Channel/Cloud.php @@ -2,6 +2,7 @@ namespace Shikiryu\SRSS\Entity\Channel; +use ReflectionException; use Shikiryu\SRSS\Entity\SRSSElement; use Shikiryu\SRSS\Validator\HasValidator; use Shikiryu\SRSS\Validator\Validator; @@ -29,13 +30,11 @@ class Cloud extends HasValidator implements SRSSElement */ public ?string $protocol = null; - // - public function isValid(): bool { try { return (new Validator())->isObjectValid($this); - } catch (\ReflectionException $e) { + } catch (ReflectionException) { return false; } } diff --git a/src/Entity/Channel/Image.php b/src/Entity/Channel/Image.php index b45b9d0..a4dfaaa 100644 --- a/src/Entity/Channel/Image.php +++ b/src/Entity/Channel/Image.php @@ -2,6 +2,7 @@ namespace Shikiryu\SRSS\Entity\Channel; +use ReflectionException; use Shikiryu\SRSS\Entity\SRSSElement; use Shikiryu\SRSS\Validator\HasValidator; use Shikiryu\SRSS\Validator\Validator; @@ -40,7 +41,7 @@ class Image extends HasValidator implements SRSSElement { try { return (new Validator())->isObjectValid($this); - } catch (\ReflectionException $e) { + } catch (ReflectionException) { return false; } } diff --git a/src/Entity/Item.php b/src/Entity/Item.php index 1149870..3faa0fd 100644 --- a/src/Entity/Item.php +++ b/src/Entity/Item.php @@ -2,6 +2,7 @@ namespace Shikiryu\SRSS\Entity; +use ReflectionException; use Shikiryu\SRSS\Entity\Item\Category; use Shikiryu\SRSS\Entity\Item\Enclosure; use Shikiryu\SRSS\Entity\Item\Source; @@ -64,7 +65,7 @@ class Item extends HasValidator implements SRSSElement { try { return (new Validator())->isObjectValid($this); - } catch (\ReflectionException $e) { + } catch (ReflectionException) { return false; } } diff --git a/src/Entity/Item/Category.php b/src/Entity/Item/Category.php index 6d8c318..fe9b493 100644 --- a/src/Entity/Item/Category.php +++ b/src/Entity/Item/Category.php @@ -2,6 +2,7 @@ namespace Shikiryu\SRSS\Entity\Item; +use ReflectionException; use Shikiryu\SRSS\Entity\SRSSElement; use Shikiryu\SRSS\Validator\HasValidator; use Shikiryu\SRSS\Validator\Validator; @@ -21,7 +22,7 @@ class Category extends HasValidator implements SRSSElement { try { return (new Validator())->isObjectValid($this); - } catch (\ReflectionException $e) { + } catch (ReflectionException) { return false; } } diff --git a/src/Entity/Item/Enclosure.php b/src/Entity/Item/Enclosure.php index 1ec2169..fa9d8fb 100644 --- a/src/Entity/Item/Enclosure.php +++ b/src/Entity/Item/Enclosure.php @@ -2,6 +2,7 @@ namespace Shikiryu\SRSS\Entity\Item; +use ReflectionException; use Shikiryu\SRSS\Entity\SRSSElement; use Shikiryu\SRSS\Validator\HasValidator; use Shikiryu\SRSS\Validator\Validator; @@ -27,7 +28,7 @@ class Enclosure extends HasValidator implements SRSSElement { try { return (new Validator())->isObjectValid($this); - } catch (\ReflectionException $e) { + } catch (ReflectionException) { return false; } } diff --git a/src/Entity/Item/Source.php b/src/Entity/Item/Source.php index 1d75ebc..355a1e0 100644 --- a/src/Entity/Item/Source.php +++ b/src/Entity/Item/Source.php @@ -2,6 +2,7 @@ namespace Shikiryu\SRSS\Entity\Item; +use ReflectionException; use Shikiryu\SRSS\Entity\SRSSElement; use Shikiryu\SRSS\Validator\HasValidator; use Shikiryu\SRSS\Validator\Validator; @@ -22,7 +23,7 @@ class Source extends HasValidator implements SRSSElement { try { return (new Validator())->isObjectValid($this); - } catch (\ReflectionException $e) { + } catch (ReflectionException) { return false; } } diff --git a/src/Entity/Media/Content.php b/src/Entity/Media/Content.php index a776957..0cbacdc 100644 --- a/src/Entity/Media/Content.php +++ b/src/Entity/Media/Content.php @@ -2,6 +2,7 @@ namespace Shikiryu\SRSS\Entity\Media; +use ReflectionException; use Shikiryu\SRSS\Entity\SRSSElement; use Shikiryu\SRSS\Validator\HasValidator; use Shikiryu\SRSS\Validator\Validator; @@ -69,7 +70,7 @@ class Content extends HasValidator implements SRSSElement { try { return (new Validator())->isObjectValid($this); - } catch (\ReflectionException $e) { + } catch (ReflectionException) { return false; } } diff --git a/src/Exception/DOMBuilderException.php b/src/Exception/DOMBuilderException.php new file mode 100644 index 0000000..8b3fd26 --- /dev/null +++ b/src/Exception/DOMBuilderException.php @@ -0,0 +1,12 @@ +getMessage())); + } + +} \ No newline at end of file diff --git a/src/Exception/SRSSException.php b/src/Exception/SRSSException.php index fd35775..0232a70 100644 --- a/src/Exception/SRSSException.php +++ b/src/Exception/SRSSException.php @@ -11,7 +11,10 @@ class SRSSException extends Exception parent :: __construct($msg); } - public function getError() + /** + * @return string + */ + public function getError(): string { return 'Une exception a été générée : Message : ' . $this->getMessage() . ' à la ligne : ' . $this->getLine(); } diff --git a/src/Parser/ItemParser.php b/src/Parser/ItemParser.php index 0fe7471..0c311ba 100644 --- a/src/Parser/ItemParser.php +++ b/src/Parser/ItemParser.php @@ -95,33 +95,6 @@ class ItemParser extends DomDocument return $this->getElementsByTagName('item')->item(0); } - /** - * setter for enclosure's properties - * - * @param $url string url - * @param $length int length - * @param $type string type - * @throws DOMException - */ - public function setEnclosure(string $url, int $length, string $type): void - { - $array = []; - $url = SRSSTools::checkLink($url); - $array['url'] = $url; - $length = SRSSTools::checkInt($length); - $array['length'] = $length; - $type = SRSSTools::noHTML($type); - $array['type'] = $type; - if ($this->enclosure == null) { - $node = $this->createElement('enclosure'); - $node->setAttribute('url', $url); - $node->setAttribute('length', $length); - $node->setAttribute('type', $type); - $this->node->appendChild($node); - } - $this->attr['enclosure'] = $array; - } - /** * check if current item is valid (following specifications) * @return bool @@ -156,12 +129,13 @@ class ItemParser extends DomDocument } $flag = $this->possibilities[$name]; - if ($flag !== '') + if ($flag !== '') { $val = SRSSTools::check($val, $flag); + } if (!empty($val)) { if ($val instanceof DOMElement) { $this->node->appendChild($val); - } elseif ($this->$name == null) { + } elseif ($this->$name === null) { $this->node->appendChild(new DomElement($name, $val)); } $this->attr[$name] = $val; @@ -178,11 +152,17 @@ class ItemParser extends DomDocument */ public function __get($name) { - if (isset($this->attr[$name])) + if (isset($this->attr[$name])) { return $this->attr[$name]; + } + if (array_key_exists($name, $this->possibilities)) { + $tmp = $this->node->getElementsByTagName($name); - if ($tmp->length != 1) return null; + + if ($tmp->length !== 1) { + return null; + } return $tmp->item(0)->nodeValue; } @@ -194,7 +174,7 @@ class ItemParser extends DomDocument * transform current item's object into an array * @return array */ - public function toArray() + public function toArray(): array { $infos = []; foreach ($this->attr as $attrName => $attrVal) { diff --git a/src/Parser/SRSSParser.php b/src/Parser/SRSSParser.php index 4d8b066..684d450 100644 --- a/src/Parser/SRSSParser.php +++ b/src/Parser/SRSSParser.php @@ -5,10 +5,8 @@ namespace Shikiryu\SRSS\Parser; use DOMDocument; use DOMNode; use DOMNodeList; -use DOMXPath; use Shikiryu\SRSS\Entity\Channel; use Shikiryu\SRSS\Entity\Channel\Image; -use Shikiryu\SRSS\Entity\Item; use Shikiryu\SRSS\Exception\ChannelNotFoundInRSSException; use Shikiryu\SRSS\Exception\SRSSException; use Shikiryu\SRSS\Exception\UnreadableRSSException; @@ -17,13 +15,11 @@ use Shikiryu\SRSS\SRSS; class SRSSParser extends DomDocument { private SRSS $doc; - private DOMXPath $xpath; public function __construct() { libxml_use_internal_errors(true); parent::__construct(); - $this->xpath = new DOMXpath($this); $this->doc = new SRSS(); } @@ -65,10 +61,9 @@ class SRSSParser extends DomDocument } /** - * @return Item[] * @throws SRSSException */ - private function _parseItems(): array + private function _parseItems(): void { $channel = $this->_getChannel(); /** @var DOMNodeList $items */ @@ -80,9 +75,8 @@ class SRSSParser extends DomDocument $this->doc->items[$i] = ItemParser::read($items->item($i)); } } - - return $this->doc->items; } + /** * putting all RSS attributes into the object * @throws SRSSException @@ -132,36 +126,10 @@ class SRSSParser extends DomDocument private function _getChannel(): DOMNode { $channel = $this->getElementsByTagName('channel'); - if($channel->length != 1) { + if($channel->length !== 1) { throw new ChannelNotFoundInRSSException('channel node not created, or too many channel nodes'); } return $channel->item(0); } - - /** - * getter of "image"'s channel attributes - * @return string|array - * TODO - */ - public function image() - { - $args = func_get_args(); - if (func_num_args() == 0) { - $args[0] = 'url'; - } - $img = $this->xpath->query('//channel/image'); - if ($img->length != 1) { // is not in channel - return null; - } - $img = $img->item(0); - $r = []; - foreach ($img->childNodes as $child) { - if ($child->nodeType == XML_ELEMENT_NODE && in_array($child->nodeName, $args)) { - $r[$child->nodeName] = $child->nodeValue; - } - } - - return (func_num_args() > 1) ? $r : $r[$args[0]]; - } } \ No newline at end of file diff --git a/src/SRSS.php b/src/SRSS.php index fad830a..4920aba 100644 --- a/src/SRSS.php +++ b/src/SRSS.php @@ -6,6 +6,9 @@ use Iterator; use ReflectionException; use Shikiryu\SRSS\Builder\SRSSBuilder; use Shikiryu\SRSS\Entity\Channel; +use Shikiryu\SRSS\Entity\Channel\Category; +use Shikiryu\SRSS\Entity\Channel\Cloud; +use Shikiryu\SRSS\Entity\Channel\Image; use Shikiryu\SRSS\Entity\Item; use Shikiryu\SRSS\Exception\ChannelNotFoundInRSSException; use Shikiryu\SRSS\Exception\PropertyNotFoundException; @@ -13,6 +16,27 @@ use Shikiryu\SRSS\Exception\SRSSException; use Shikiryu\SRSS\Exception\UnreadableRSSException; use Shikiryu\SRSS\Parser\SRSSParser; +/** + * @property null|string $title + * @property null|string $link + * @property null|string $description + * @property null|string $language + * @property null|string $copyright + * @property null|string $managingEditor + * @property null|string $webMaster + * @property null|string $pubDate + * @property null|string $lastBuildDate + * @property null|Category[] $category + * @property null|string $generator + * @property null|string $docs + * @property null|Cloud $cloud + * @property null|string $ttl + * @property null|Image $image + * @property null|string $rating + * @property null|string $textInput + * @property null|string $skipHours + * @property null|string $skipDays + */ class SRSS implements Iterator { public Channel $channel; @@ -72,7 +96,7 @@ class SRSS implements Iterator } return ($valid && $this->channel->isValid()); - } catch (ReflectionException $e) { + } catch (ReflectionException) { return false; } } @@ -244,6 +268,7 @@ class SRSS implements Iterator * @param string $path * * @return void + * @throws \Shikiryu\SRSS\Exception\DOMBuilderException */ public function save(string $path): void { @@ -252,8 +277,9 @@ class SRSS implements Iterator /** * @return false|string + * @throws \Shikiryu\SRSS\Exception\DOMBuilderException */ - public function show() + public function show(): bool|string { return (new SRSSBuilder('1.0', 'UTF-8'))->show($this); } diff --git a/src/SRSSTools.php b/src/SRSSTools.php index f677047..b83d714 100644 --- a/src/SRSSTools.php +++ b/src/SRSSTools.php @@ -28,37 +28,38 @@ class SRSSTools /** * format the RSS to the wanted format + * * @param $format string wanted format - * @param $date string RSS date + * @param $date string RSS date + * * @return string date */ - public static function formatDate($format, $date) + public static function formatDate(string $format, string $date): string { return date($format, strtotime($date)); } /** * format a date for RSS format + * * @param string $date date to format * @param string $format + * * @return string */ - public static function getRSSDate($date, $format='') + public static function getRSSDate(string $date, string $format = ''): string { - $datepos = 'dDjlNSwzWFmMntLoYyaABgGhHisueIOPTZcrU'; - if($format != '' && preg_match('~^(['.$datepos.']{1})(-|/)(['.$datepos.']{1})(-|/)(['.$datepos.']{1})$~', $format, $match)){ - $sep = $match[2]; - $format = '%'.$match[1].$sep.'%'.$match[3].$sep.'%'.$match[5]; - if($dateArray = strptime($date, $format)){ - $mois = (int)$dateArray['tm_mon'] + 1; - $annee = strlen($dateArray['tm_year']) > 2 ? '20'.substr($dateArray['tm_year'], -2) : '19'.$dateArray['tm_year']; - $date = $annee.'-'.$mois.'-'.$dateArray['tm_mday']; - return date("D, d M Y H:i:s T", strtotime($date)); + $date_position = 'dDjlNSwzWFmMntLoYyaABgGhHisueIOPTZcrU'; + if($format !== '' && preg_match('~^(['.$date_position.']{1})([-/])(['.$date_position.']{1})([-/])(['.$date_position.']{1})$~', $format)){ + $datetime = DateTime::createFromFormat($format, $date); + if ($datetime === false) { + return ''; } - return ''; + + return $datetime->format(DATE_RSS); } - if(strtotime($date) !==false ){ + if (strtotime($date) !==false ) { return date("D, d M Y H:i:s T", strtotime($date)); } @@ -73,41 +74,49 @@ class SRSSTools /** * check if it's an url + * * @param $check string to check + * * @return string|boolean the filtered data, or FALSE if the filter fails. */ - public static function checkLink($check) + public static function checkLink(string $check): bool|string { return filter_var($check, FILTER_VALIDATE_URL); } /** * make a string XML-compatible + * * @param $check string to format + * * @return string formatted string * TODO CDATA ? */ - public static function HTML4XML($check) + public static function HTML4XML(string $check): string { return htmlspecialchars($check); } /** * delete html tags + * * @param $check string to format + * * @return string formatted string */ - public static function noHTML($check) + public static function noHTML(string $check): string { return strip_tags($check); } /** * check if it's a day (in RSS terms) + * * @param $check string to check + * * @return string the day, or empty string */ - public static function checkDay($check) + public static function checkDay(string $check): string { $possibleDay = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']; return in_array(strtolower($check), $possibleDay) ? $check : ''; @@ -115,20 +124,24 @@ class SRSSTools /** * check if it's an email + * * @param $check string to check + * * @return string|boolean the filtered data, or FALSE if the filter fails. */ - public static function checkEmail($check) + public static function checkEmail(string $check): bool|string { return filter_var($check, FILTER_VALIDATE_EMAIL); } /** * check if it's an hour (in RSS terms) + * * @param $check string to check + * * @return string|boolean the filtered data, or FALSE if the filter fails. */ - public static function checkHour($check) + public static function checkHour(string $check): bool|string { $options = [ 'options' => [ @@ -142,10 +155,12 @@ class SRSSTools /** * check if it's an int + * * @param $check int to check + * * @return int|boolean the filtered data, or FALSE if the filter fails. */ - public static function checkInt($check) + public static function checkInt(int $check): bool|int { return filter_var($check, FILTER_VALIDATE_INT); } @@ -155,7 +170,7 @@ class SRSSTools * * @return mixed */ - private static function checkMediaType($check) + public static function checkMediaType($check): mixed { return $check; } @@ -165,7 +180,7 @@ class SRSSTools * * @return mixed|null */ - private static function checkMediaMedium($check) + public static function checkMediaMedium($check): ?string { return in_array($check, ['image', 'audio', 'video', 'document', 'executable']) ? $check : null; } @@ -175,7 +190,7 @@ class SRSSTools * * @return mixed|null */ - private static function checkBool($check) + public static function checkBool($check): ?string { return in_array($check, ['true', 'false']) ? $check : null; } @@ -185,7 +200,7 @@ class SRSSTools * * @return mixed|null */ - private static function checkMediumExpression($check) + public static function checkMediumExpression($check): ?string { return in_array($check, ['sample', 'full', 'nonstop']) ? $check : null; } diff --git a/src/Validator/Validator.php b/src/Validator/Validator.php index 4652d28..92358fa 100644 --- a/src/Validator/Validator.php +++ b/src/Validator/Validator.php @@ -15,9 +15,9 @@ class Validator /** * @throws ReflectionException */ - public function isPropertyValid($object, $property) + public function isPropertyValid($object, $property): bool { - $properties = array_filter($this->_getClassProperties(get_class($object)), fn($p) => $p->getName() === $property); + $properties = array_filter($this->_getClassProperties(get_class($object)), static fn($p) => $p->getName() === $property); if (count($properties) !== 1) { return false; } @@ -26,7 +26,7 @@ class Validator $propertyValue = $object->{$properties->name}; $propertyAnnotations = $this->_getPropertyAnnotations($properties); - if (!in_array('required', $propertyAnnotations, true) && empty($propertyValue)) { + if (empty($propertyValue) && !in_array('required', $propertyAnnotations, true)) { return true; } @@ -67,7 +67,7 @@ class Validator $propertyValue = $object->{$property['name']}; // $propertyAnnotations = $this->_getPropertyAnnotations($property, get_class($object)); - if (!in_array('required', $property['rules'], true) && empty($propertyValue)) { + if (empty($propertyValue) && !in_array('required', $property['rules'], true)) { continue; } @@ -109,7 +109,7 @@ class Validator { preg_match_all('#@(.*?)\n#s', $property->getDocComment(), $annotations); - return array_map(fn($annotation) => trim($annotation), $annotations[1]); + return array_map(static fn($annotation) => trim($annotation), $annotations[1]); } private function _validateString($value): bool @@ -199,7 +199,7 @@ class Validator ); } - private function _validateContentMedia($value) + private function _validateContentMedia($value): bool { if (is_array($value)) { foreach ($value as $content) { diff --git a/tests/BasicBuilderTest.php b/tests/BasicBuilderTest.php index b3a433c..2297453 100644 --- a/tests/BasicBuilderTest.php +++ b/tests/BasicBuilderTest.php @@ -16,7 +16,7 @@ class BasicBuilderTest extends TestCase unlink($this->saved); } } - public function testCreateBasicRSS() + public function testCreateBasicRSS(): void { $srss = SRSS::create(); $srss->title = 'My Blog'; diff --git a/tests/BasicReaderTest.php b/tests/BasicReaderTest.php index 3660a01..1f987c5 100644 --- a/tests/BasicReaderTest.php +++ b/tests/BasicReaderTest.php @@ -9,7 +9,7 @@ use Shikiryu\SRSS\SRSS; class BasicReaderTest extends TestCase { - public function testReadBasicRSS() + public function testReadBasicRSS(): void { $rss = SRSS::read(__DIR__.'/resources/basic.xml'); self::assertEquals('test Home Page', $rss->title); @@ -20,7 +20,7 @@ class BasicReaderTest extends TestCase self::assertTrue($rss->isValid()); } - public function testSpecificationExampleRSS() + public function testSpecificationExampleRSS(): void { $rss = SRSS::read(__DIR__.'/resources/harvard.xml'); self::assertEquals('Liftoff News', $rss->title); @@ -41,7 +41,7 @@ class BasicReaderTest extends TestCase self::assertTrue($rss->isValid()); } - public function testChannelImage() + public function testChannelImage(): void { $rss = SRSS::read(__DIR__.'/resources/media/cnn.xml'); $image = $rss->image; @@ -51,7 +51,7 @@ class BasicReaderTest extends TestCase self::assertEquals('https://www.cnn.com/entertainment/index.html', $image->link, var_export($image, true)); } - public function testChannelCategory() + public function testChannelCategory(): void { $rss = SRSS::read(__DIR__.'/resources/cloud.xml'); $categories = $rss->category; @@ -62,7 +62,7 @@ class BasicReaderTest extends TestCase self::assertEquals('rssUpdates', $category->value, var_export($category, true)); } - public function testCloud() + public function testCloud(): void { $rss = SRSS::read(__DIR__.'/resources/cloud.xml'); $cloud = $rss->cloud; @@ -74,7 +74,7 @@ class BasicReaderTest extends TestCase self::assertEquals('xml-rpc', $cloud->protocol, var_export($cloud, true)); } - public function testSource() + public function testSource(): void { $rss = SRSS::read(__DIR__.'/resources/basic.xml'); $firstItem = $rss->getFirst(); @@ -85,7 +85,7 @@ class BasicReaderTest extends TestCase self::assertEquals('Tomalak\'s Realm', $source->value); } - public function testEnclosure() + public function testEnclosure(): void { $rss = SRSS::read(__DIR__.'/resources/basic.xml'); $item = $rss->getItem(2); diff --git a/tests/ExceptionTest.php b/tests/ExceptionTest.php index 004f4dc..19fca5a 100644 --- a/tests/ExceptionTest.php +++ b/tests/ExceptionTest.php @@ -8,22 +8,22 @@ use Shikiryu\SRSS\SRSS; class ExceptionTest extends TestCase { - public function testPropertyNotFound() + public function testPropertyNotFound(): void { $srss = new SRSS(); $this->expectException(PropertyNotFoundException::class); $srss->notfound = 'true'; } - public function testRssNotFound() + public function testRssNotFound(): void { $this->expectException(UnreadableRSSException::class); - $rss = SRSS::read('not_found.xml'); + SRSS::read('not_found.xml'); } - public function testMissingChannel() + public function testMissingChannel(): void { $this->expectException(ChannelNotFoundInRSSException::class); - $rss = SRSS::read(__DIR__ . '/resources/invalid-no-channel.xml'); + SRSS::read(__DIR__ . '/resources/invalid-no-channel.xml'); } } \ No newline at end of file diff --git a/tests/MediaTest.php b/tests/MediaTest.php index 0e88c10..0abb611 100644 --- a/tests/MediaTest.php +++ b/tests/MediaTest.php @@ -5,7 +5,7 @@ use Shikiryu\SRSS\SRSS; class MediaTest extends TestCase { - public function testImages() + public function testImages(): void { $rss = SRSS::read(__DIR__.'/resources/media/cnn.xml'); self::assertEquals('CNN.com - RSS Channel - Entertainment', $rss->title); @@ -17,7 +17,7 @@ class MediaTest extends TestCase self::assertTrue($rss->isValid(), var_export($rss->channel->validated, true)); } - public function testMusicVideo() + public function testMusicVideo(): void { $rss = SRSS::read(__DIR__.'/resources/media/music-video.xml'); self::assertEquals('Music Videos 101', $rss->title); diff --git a/tests/OriginalReaderSRSSTest.php b/tests/OriginalReaderSRSSTest.php index d702121..0b1bd7a 100644 --- a/tests/OriginalReaderSRSSTest.php +++ b/tests/OriginalReaderSRSSTest.php @@ -16,7 +16,7 @@ class OriginalReaderSRSSTest extends TestCase } } - public function testOriginalReader() + public function testOriginalReader(): void { $rss = SRSS::read($this->original); self::assertEquals('Liftoff News', $rss->title); diff --git a/tests/OriginalWriterSRSSTest.php b/tests/OriginalWriterSRSSTest.php index 40b1f36..c57cc73 100644 --- a/tests/OriginalWriterSRSSTest.php +++ b/tests/OriginalWriterSRSSTest.php @@ -7,7 +7,7 @@ use Shikiryu\SRSS\SRSSTools; class OriginalWriterSRSSTest extends TestCase { - public function testOriginalWriter() + public function testOriginalWriter(): void { $rss = SRSS::create(); $rss->title = 'My Awesome Blog'; @@ -22,12 +22,12 @@ class OriginalWriterSRSSTest extends TestCase ]; foreach($items as $item){ - $rssitem = new Item(); - $rssitem->title = $item["title"]; - $rssitem->link = $item['link']; - $rssitem->pubDate = $item["pubDate"]; - $rssitem->description = $item["description"]; - $rss->addItem($rssitem); + $rss_item = new Item(); + $rss_item->title = $item["title"]; + $rss_item->link = $item['link']; + $rss_item->pubDate = $item["pubDate"]; + $rss_item->description = $item["description"]; + $rss->addItem($rss_item); } $firstItem = new Item();