diff --git a/composer.json b/composer.json index 63b08d9a2d45392bb6c67e03db1a500e9880b037..8da852da9288c8c13a8ff3a4da3d6edbb96c16a7 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "symfony/lock": "^4.4", "symfony/browser-kit": "^4.4", "symfony/dom-crawler": "^4.4 !=4.4.5", - "easyrdf/easyrdf": "^0.9" + "easyrdf/easyrdf": "^0.9 || ^1.0" }, "replace": { "paragonie/random_compat": "9.99.99", diff --git a/composer.lock b/composer.lock index 648712d1c2bdb38e2f2e1e34e4cefa87785b7170..7654dfbdb221db6a990331224243101d40c26bc2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8877ebb73b0fca58e145989738ba04b4", + "content-hash": "059e8aee61edb73b1526b840eb6c624c", "packages": [ { "name": "asm89/stack-cors", @@ -4805,35 +4805,39 @@ }, { "name": "easyrdf/easyrdf", - "version": "0.9.1", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/easyrdf/easyrdf.git", - "reference": "acd09dfe0555fbcfa254291e433c45fdd4652566" + "reference": "8735708426066b791c2a6d40329050d5cf31385c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easyrdf/easyrdf/zipball/acd09dfe0555fbcfa254291e433c45fdd4652566", - "reference": "acd09dfe0555fbcfa254291e433c45fdd4652566", + "url": "https://api.github.com/repos/easyrdf/easyrdf/zipball/8735708426066b791c2a6d40329050d5cf31385c", + "reference": "8735708426066b791c2a6d40329050d5cf31385c", "shasum": "" }, "require": { "ext-mbstring": "*", "ext-pcre": "*", - "php": ">=5.2.8" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "~3.5", - "sami/sami": "~1.4", - "squizlabs/php_codesniffer": "~1.4.3" + "ml/json-ld": "~1.0", + "phpunit/phpunit": "^7", + "sami/sami": "^4", + "semsol/arc2": "~2.2", + "squizlabs/php_codesniffer": "3.*", + "zendframework/zend-http": "~2.3" }, "suggest": { - "ml/json-ld": "~1.0" + "ml/json-ld": "~1.0", + "semsol/arc2": "~2.2" }, "type": "library", "autoload": { - "psr-0": { - "EasyRdf_": "lib/" + "psr-4": { + "EasyRdf\\": "lib" } }, "notification-url": "https://packagist.org/downloads/", @@ -4850,6 +4854,7 @@ { "name": "Alexey Zakhlestin", "email": "indeyets@gmail.com", + "homepage": "http://indeyets.ru/", "role": "Developer" } ], @@ -4863,7 +4868,12 @@ "rdfa", "sparql" ], - "time": "2015-02-27T09:45:49+00:00" + "support": { + "forum": "http://groups.google.com/group/easyrdf/", + "issues": "http://github.com/easyrdf/easyrdf/issues", + "source": "https://github.com/easyrdf/easyrdf/tree/master" + }, + "time": "2020-07-14T23:45:20+00:00" }, { "name": "fabpot/goutte", diff --git a/composer/Metapackage/DevDependencies/composer.json b/composer/Metapackage/DevDependencies/composer.json index 3c107300090c2fbad10e835bfb9c24ee31928466..b6de7308ab55b9eccf565d35674c9a726befb382 100644 --- a/composer/Metapackage/DevDependencies/composer.json +++ b/composer/Metapackage/DevDependencies/composer.json @@ -12,7 +12,7 @@ "behat/mink-selenium2-driver": "^1.4", "composer/composer": "^1.9.1", "drupal/coder": "^8.3.7", - "easyrdf/easyrdf": "^0.9", + "easyrdf/easyrdf": "^0.9 || ^1.0", "justinrainbow/json-schema": "^5.2", "mikey179/vfsstream": "^1.6.8", "phpspec/prophecy": "^1.7", diff --git a/composer/Metapackage/PinnedDevDependencies/composer.json b/composer/Metapackage/PinnedDevDependencies/composer.json index d49579d3d2ba61774b18f29d9e88848073274b8b..d6cec67a878a5bd0ec46623fb251d894ba2c30d4 100644 --- a/composer/Metapackage/PinnedDevDependencies/composer.json +++ b/composer/Metapackage/PinnedDevDependencies/composer.json @@ -18,7 +18,7 @@ "composer/xdebug-handler": "1.4.3", "doctrine/instantiator": "1.3.1", "drupal/coder": "8.3.9", - "easyrdf/easyrdf": "0.9.1", + "easyrdf/easyrdf": "1.0.0", "fabpot/goutte": "v3.3.0", "instaclick/php-webdriver": "1.4.7", "justinrainbow/json-schema": "5.2.10", diff --git a/core/modules/rdf/tests/src/Traits/EasyRdf_ParsedUri.php b/core/modules/rdf/tests/src/Traits/EasyRdf_ParsedUri.php deleted file mode 100644 index e433d46bfb008d9ab877376ec9d74764451c70ee..0000000000000000000000000000000000000000 --- a/core/modules/rdf/tests/src/Traits/EasyRdf_ParsedUri.php +++ /dev/null @@ -1,352 +0,0 @@ -<?php -// @codingStandardsIgnoreFile - -namespace Drupal\Tests\rdf\Traits; - -/** - * This is copy of \EasyRdf_ParsedUri from the easyrdf/easyrdf library. - * - * It fixes a PHP 7.4 deprecation in \EasyRdf_ParsedUri::normalize(). - * - * @todo https://www.drupal.org/project/drupal/issues/3110972 Remove this work - * around. - */ - -/** - * EasyRdf - * - * LICENSE - * - * Copyright (c) 2009-2013 Nicholas J Humfrey. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author 'Nicholas J Humfrey" may be used to endorse or - * promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package EasyRdf - * @copyright Copyright (c) 2009-2013 Nicholas J Humfrey - * @license http://www.opensource.org/licenses/bsd-license.php - */ - - -/** - * A RFC3986 compliant URI parser - * - * @package EasyRdf - * @copyright Copyright (c) 2009-2013 Nicholas J Humfrey - * @license http://www.opensource.org/licenses/bsd-license.php - * @link http://www.ietf.org/rfc/rfc3986.txt - */ -class EasyRdf_ParsedUri -{ - // For all URIs: - private $scheme = null; - private $fragment = null; - - // For hierarchical URIs: - private $authority = null; - private $path = null; - private $query = null; - - const URI_REGEX = "|^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?|"; - - /** Constructor for creating a new parsed URI - * - * The $uri parameter can either be a string or an - * associative array with the following keys: - * scheme, authority, path, query, fragment - * - * @param mixed $uri The URI as a string or an array - * @return object EasyRdf_ParsedUri - */ - public function __construct($uri = null) - { - if (is_string($uri)) { - if (preg_match(self::URI_REGEX, $uri, $matches)) { - if (!empty($matches[1])) { - $this->scheme = isset($matches[2]) ? $matches[2] : ''; - } - if (!empty($matches[3])) { - $this->authority = isset($matches[4]) ? $matches[4] : ''; - } - $this->path = isset($matches[5]) ? $matches[5] : ''; - if (!empty($matches[6])) { - $this->query = isset($matches[7]) ? $matches[7] : ''; - } - if (!empty($matches[8])) { - $this->fragment = isset($matches[9]) ? $matches[9] : ''; - } - } - } elseif (is_array($uri)) { - $this->scheme = isset($uri['scheme']) ? $uri['scheme'] : null; - $this->authority = isset($uri['authority']) ? $uri['authority'] : null; - $this->path = isset($uri['path']) ? $uri['path'] : null; - $this->query = isset($uri['query']) ? $uri['query'] : null; - $this->fragment = isset($uri['fragment']) ? $uri['fragment'] : null; - } - } - - - /** Returns true if this is an absolute (complete) URI - * @return boolean - */ - public function isAbsolute() - { - return $this->scheme !== null; - } - - /** Returns true if this is an relative (partial) URI - * @return boolean - */ - public function isRelative() - { - return $this->scheme === null; - } - - /** Returns the scheme of the URI (e.g. http) - * @return string - */ - public function getScheme() - { - return $this->scheme; - } - - /** Sets the scheme of the URI (e.g. http) - * @param string $scheme The new value for the scheme of the URI - */ - public function setScheme($scheme) - { - $this->scheme = $scheme; - } - - /** Returns the authority of the URI (e.g. www.example.com:8080) - * @return string - */ - public function getAuthority() - { - return $this->authority; - } - - /** Sets the authority of the URI (e.g. www.example.com:8080) - * @param string $authority The new value for the authority component of the URI - */ - public function setAuthority($authority) - { - $this->authority = $authority; - } - - /** Returns the path of the URI (e.g. /foo/bar) - * @return string - */ - public function getPath() - { - return $this->path; - } - - /** Set the path of the URI (e.g. /foo/bar) - * @param string $path The new value for the path component of the URI - */ - public function setPath($path) - { - $this->path = $path; - } - - /** Returns the query string part of the URI (e.g. foo=bar) - * @return string - */ - public function getQuery() - { - return $this->query; - } - - /** Set the query string of the URI (e.g. foo=bar) - * @param string $query The new value for the query string component of the URI - */ - public function setQuery($query) - { - $this->query = $query; - } - - /** Returns the fragment part of the URI (i.e. after the #) - * @return string - */ - public function getFragment() - { - return $this->fragment; - } - - /** Set the fragment of the URI (i.e. after the #) - * @param string $fragment The new value for the fragment component of the URI - */ - public function setFragment($fragment) - { - $this->fragment = $fragment; - } - - - /** - * Normalizes the path of this URI if it has one. Normalizing a path means - * that any unnecessary '.' and '..' segments are removed. For example, the - * URI http://example.com/a/b/../c/./d would be normalized to - * http://example.com/a/c/d - * - * @return object EasyRdf_ParsedUri - */ - public function normalize() - { - if (empty($this->path)) { - return $this; - } - - // Remove ./ from the start - if (substr($this->path, 0, 2) == './') { - // Remove both characters - $this->path = substr($this->path, 2); - } - - // Remove /. from the end - if (substr($this->path, -2) == '/.') { - // Remove only the last dot, not the slash! - $this->path = substr($this->path, 0, -1); - } - - if (substr($this->path, -3) == '/..') { - $this->path .= '/'; - } - - // Split the path into its segments - $segments = explode('/', $this->path); - $newSegments = array(); - - // Remove all unnecessary '.' and '..' segments - foreach ($segments as $segment) { - if ($segment == '..') { - // Remove the previous part of the path - $count = count($newSegments); - if ($count > 0 && $newSegments[$count-1]) { - array_pop($newSegments); - } - } elseif ($segment == '.') { - // Ignore - continue; - } else { - array_push($newSegments, $segment); - } - } - - // Construct the new normalized path - $this->path = implode('/', $newSegments); - - // Allow easy chaining of methods - return $this; - } - - /** - * Resolves a relative URI using this URI as the base URI. - */ - public function resolve($relUri) - { - // If it is a string, then convert it to a parsed object - if (is_string($relUri)) { - $relUri = new EasyRdf_ParsedUri($relUri); - } - - // This code is based on the pseudocode in section 5.2.2 of RFC3986 - $target = new EasyRdf_ParsedUri(); - if ($relUri->scheme) { - $target->scheme = $relUri->scheme; - $target->authority = $relUri->authority; - $target->path = $relUri->path; - $target->query = $relUri->query; - } else { - if ($relUri->authority) { - $target->authority = $relUri->authority; - $target->path = $relUri->path; - $target->query = $relUri->query; - } else { - if (empty($relUri->path)) { - $target->path = $this->path; - if ($relUri->query) { - $target->query = $relUri->query; - } else { - $target->query = $this->query; - } - } else { - if (substr($relUri->path, 0, 1) == '/') { - $target->path = $relUri->path; - } else { - $path = $this->path; - $lastSlash = strrpos($path, '/'); - if ($lastSlash !== false) { - $path = substr($path, 0, $lastSlash + 1); - } else { - $path = '/'; - } - - $target->path .= $path . $relUri->path; - } - $target->query = $relUri->query; - } - $target->authority = $this->authority; - } - $target->scheme = $this->scheme; - } - - $target->fragment = $relUri->fragment; - - $target->normalize(); - - return $target; - } - - /** Convert the parsed URI back into a string - * - * @return string The URI as a string - */ - public function toString() - { - $str = ''; - if ($this->scheme !== null) { - $str .= $this->scheme . ':'; - } - if ($this->authority !== null) { - $str .= '//' . $this->authority; - } - $str .= $this->path; - if ($this->query !== null) { - $str .= '?' . $this->query; - } - if ($this->fragment !== null) { - $str .= '#' . $this->fragment; - } - return $str; - } - - /** Magic method to convert the URI, when casted, back to a string - * - * @return string The URI as a string - */ - public function __toString() - { - return $this->toString(); - } -} diff --git a/core/modules/rdf/tests/src/Traits/RdfParsingTrait.php b/core/modules/rdf/tests/src/Traits/RdfParsingTrait.php index 143e658323bf01c1dba34f496c3881ba733d79cd..92fd6aba7a688bb63b1b5889810ab206bd02484c 100644 --- a/core/modules/rdf/tests/src/Traits/RdfParsingTrait.php +++ b/core/modules/rdf/tests/src/Traits/RdfParsingTrait.php @@ -3,14 +3,8 @@ namespace Drupal\Tests\rdf\Traits; use Drupal\Core\Url; - -/** - * Override \EasyRdf_ParsedUri for PHP 7.4 compatibility. - * - * @todo https://www.drupal.org/project/drupal/issues/3110972 Remove this work - * around. - */ -class_alias('\Drupal\Tests\rdf\Traits\EasyRdf_ParsedUri', '\EasyRdf_ParsedUri'); +use EasyRdf\Graph; +use EasyRdf\Parser\Rdfa; /** * Defines a trait for parsing RDF properties from HTML. @@ -39,10 +33,12 @@ trait RdfParsingTrait { * * @return bool * TRUE if the property exists with the given value. + * + * @throws \EasyRdf\Exception */ protected function hasRdfProperty($html, $base_uri, $resource, $property, array $value) { - $parser = new \EasyRdf_Parser_Rdfa(); - $graph = new \EasyRdf_Graph(); + $parser = $this->getInstanceParser(); + $graph = $this->getInstanceGraph(); $parser->parse($graph, $html, 'rdfa', $base_uri); return $graph->hasProperty($resource, $property, $value); @@ -72,10 +68,12 @@ protected function hasRdfProperty($html, $base_uri, $resource, $property, array * * @return bool * TRUE if the property exists with the given value. + * + * @throws \EasyRdf\Exception */ protected function hasRdfChildProperty($html, $base_uri, $resource, $parent_property, string $child_property, array $value) { - $parser = new \EasyRdf_Parser_Rdfa(); - $graph = new \EasyRdf_Graph(); + $parser = $this->getInstanceParser(); + $graph = $this->getInstanceGraph(); $parser->parse($graph, $html, 'rdfa', $base_uri); $node = $graph->get($resource, $parent_property); return $graph->hasProperty($node, $child_property, $value); @@ -93,10 +91,12 @@ protected function hasRdfChildProperty($html, $base_uri, $resource, $parent_prop * * @return int * The number of resources of the provided type. + * + * @throws \EasyRdf\Exception */ protected function getElementByRdfTypeCount(Url $url, $base_uri, $type) { - $parser = new \EasyRdf_Parser_Rdfa(); - $graph = new \EasyRdf_Graph(); + $parser = $this->getInstanceParser(); + $graph = $this->getInstanceGraph(); $parser->parse($graph, $this->drupalGet($url), 'rdfa', $base_uri); return count($graph->allOfType($type)); } @@ -113,10 +113,12 @@ protected function getElementByRdfTypeCount(Url $url, $base_uri, $type) { * * @return string|null * The type of resource or NULL if the resource has no type. + * + * @throws \EasyRdf\Exception */ protected function getElementRdfType(Url $url, $base_uri, $resource_uri) { - $parser = new \EasyRdf_Parser_Rdfa(); - $graph = new \EasyRdf_Graph(); + $parser = $this->getInstanceParser(); + $graph = $this->getInstanceGraph(); $parser->parse($graph, $this->drupalGet($url), 'rdfa', $base_uri); return $graph->type($resource_uri); } @@ -135,12 +137,46 @@ protected function getElementRdfType(Url $url, $base_uri, $resource_uri) { * * @return bool * TRUE if the given property is blank. + * + * @throws \EasyRdf\Exception */ protected function rdfElementIsBlankNode($html, $base_uri, $resource_uri, $property) { - $parser = new \EasyRdf_Parser_Rdfa(); - $graph = new \EasyRdf_Graph(); + $parser = $this->getInstanceParser(); + $graph = $this->getInstanceGraph(); $parser->parse($graph, $html, 'rdfa', $base_uri); return $graph->get($resource_uri, $property)->isBnode(); } + /** + * Gets a new instance of EasyRdf\Parser\Rdfa or EasyRdf_Parser_Rdfa. + * + * @return \EasyRdf\Parser\Rdfa|\EasyRdf_Parser_Rdfa + * The instance. + * + * @todo Clean this up in drupal:10.0.0. + * @see https://www.drupal.org/node/3176468 + */ + private function getInstanceParser() { + if (class_exists('EasyRdf\Parser\Rdfa')) { + return new Rdfa(); + } + return new \EasyRdf_Parser_Rdfa(); + } + + /** + * Gets a new instance of EasyRdf\Graph or EasyRdf_Graph. + * + * @return \EasyRdf\Graph|\EasyRdf_Graph + * The instance. + * + * @todo Clean this up in drupal:10.0.0. + * @see https://www.drupal.org/node/3176468 + */ + private function getInstanceGraph() { + if (class_exists('EasyRdf\Graph')) { + return new Graph(); + } + return new \EasyRdf_Graph(); + } + }