From 0d6f8d2921db827c8ba06bf963d65c5d32b96a80 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Fri, 27 Jan 2023 15:33:34 -0500 Subject: [PATCH 1/3] Avoid most deprecation warnings The Feed class sets dynamic properties on Picofeed classes; this will need to be completely rewritten. Version 1.2 of the Laminas XML class also uses a deprecated function, but upgrading it to 1.3 will require PHP 7.3. --- .gitignore | 1 + arsse.php | 2 +- composer.json | 6 +++++- composer.lock | 21 ++++++++++--------- lib/Conf.php | 4 +++- lib/Db/SQLite3/Driver.php | 1 + tests/cases/CLI/TestCLI.php | 2 ++ tests/cases/Database/AbstractTest.php | 4 ++++ tests/cases/Database/SeriesArticle.php | 2 ++ tests/cases/Database/SeriesFeed.php | 2 ++ tests/cases/Database/SeriesLabel.php | 2 ++ tests/cases/Database/SeriesTag.php | 3 +++ tests/cases/Db/SQLite3/TestCreation.php | 2 ++ tests/cases/Db/SQLite3PDO/TestCreation.php | 2 ++ tests/cases/ImportExport/TestImportExport.php | 2 ++ tests/cases/Service/TestDaemon.php | 1 + tests/cases/User/TestUser.php | 2 ++ vendor-bin/phpunit/composer.lock | 12 +++++------ 18 files changed, 52 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 42f0b63a..b367592e 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ /arsse.db* /config.php /.php_cs.cache +/.php-cs-fixer.cache /tests/.phpunit.result.cache # Dependencies diff --git a/arsse.php b/arsse.php index f5f26732..dff59c01 100644 --- a/arsse.php +++ b/arsse.php @@ -13,7 +13,7 @@ require_once BASE."vendor".DIRECTORY_SEPARATOR."autoload.php"; ignore_user_abort(true); ini_set("memory_limit", "-1"); ini_set("max_execution_time", "0"); -// FIXME: This is required because various dependencies have yet to adjust to PHP 8.1 +// NOTE: While running in the wild we don't want to spew deprecation warnings if users are ahead of us in PHP versions error_reporting(\E_ALL & ~\E_DEPRECATED); if (\PHP_SAPI === "cli") { diff --git a/composer.json b/composer.json index a44ac8de..6f534906 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,7 @@ "ext-dom": "*", "nicolus/picofeed": "dev-bugfix", "hosteurope/password-generator": "1.*", - "docopt/docopt": "1.*", + "docopt/docopt": "dev-master", "jkingweb/druuid": "3.*", "guzzlehttp/psr7": "1.*", "laminas/laminas-httphandlerrunner": "1.*" @@ -64,6 +64,10 @@ { "type": "vcs", "url": "https://github.com/rhukster/picoFeed" + }, + { + "type": "vcs", + "url": "https://github.com/docopt/docopt.php" } ] } diff --git a/composer.lock b/composer.lock index 67d713cb..a9f44a26 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "21a116823c3335992910966f31861811", + "content-hash": "62bf2d6fdc0ccbeb090399f708928a02", "packages": [ { "name": "docopt/docopt", - "version": "1.0.4", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/docopt/docopt.php.git", - "reference": "bf3683a16e09fa1665e493eb4d5a29469e132a4f" + "reference": "5ad491cb9fc072e8bb0497061a09b0efcf25cbcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/docopt/docopt.php/zipball/bf3683a16e09fa1665e493eb4d5a29469e132a4f", - "reference": "bf3683a16e09fa1665e493eb4d5a29469e132a4f", + "url": "https://api.github.com/repos/docopt/docopt.php/zipball/5ad491cb9fc072e8bb0497061a09b0efcf25cbcf", + "reference": "5ad491cb9fc072e8bb0497061a09b0efcf25cbcf", "shasum": "" }, "require": { @@ -26,13 +26,13 @@ "require-dev": { "phpunit/phpunit": "4.1.*" }, + "default-branch": true, "type": "library", "autoload": { "classmap": [ "src/docopt.php" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -51,10 +51,10 @@ "docs" ], "support": { - "issues": "https://github.com/docopt/docopt.php/issues", - "source": "https://github.com/docopt/docopt.php/tree/1.0.4" + "source": "https://github.com/docopt/docopt.php/tree/master", + "issues": "https://github.com/docopt/docopt.php/issues" }, - "time": "2019-12-03T02:48:46+00:00" + "time": "2022-05-11T23:52:25+00:00" }, { "name": "guzzlehttp/guzzle", @@ -1299,7 +1299,8 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { - "nicolus/picofeed": 20 + "nicolus/picofeed": 20, + "docopt/docopt": 20 }, "prefer-stable": false, "prefer-lowest": false, diff --git a/lib/Conf.php b/lib/Conf.php index 428e87a4..07a8e5d3 100644 --- a/lib/Conf.php +++ b/lib/Conf.php @@ -7,13 +7,15 @@ declare(strict_types=1); namespace JKingWeb\Arsse; +use AllowDynamicProperties; use JKingWeb\Arsse\Misc\ValueInfo as Value; /** Class for loading, saving, and querying configuration * * The Conf class serves both as a means of importing and querying configuration information, as well as a source for default parameters when a configuration file does not specify a value. * All public properties are configuration parameters that may be set by the server administrator. */ -class Conf { +#[AllowDynamicProperties] + class Conf { /** @var string Default language to use for logging and errors */ public $lang = "en"; diff --git a/lib/Db/SQLite3/Driver.php b/lib/Db/SQLite3/Driver.php index b4f91297..b23d42b0 100644 --- a/lib/Db/SQLite3/Driver.php +++ b/lib/Db/SQLite3/Driver.php @@ -20,6 +20,7 @@ class Driver extends \JKingWeb\Arsse\Db\AbstractDriver { public const SQLITE_MISMATCH = 20; protected $db; + protected $collator; public function __construct() { // check to make sure required extension is loaded diff --git a/tests/cases/CLI/TestCLI.php b/tests/cases/CLI/TestCLI.php index a17ecbb5..67fc4e4a 100644 --- a/tests/cases/CLI/TestCLI.php +++ b/tests/cases/CLI/TestCLI.php @@ -21,6 +21,8 @@ use JKingWeb\Arsse\Service\Daemon; /** @covers \JKingWeb\Arsse\CLI */ class TestCLI extends \JKingWeb\Arsse\Test\AbstractTest { + protected $cli; + public function setUp(): void { parent::setUp(); $this->cli = $this->partialMock(CLI::class); diff --git a/tests/cases/Database/AbstractTest.php b/tests/cases/Database/AbstractTest.php index ef1f0d7b..479ad9cd 100644 --- a/tests/cases/Database/AbstractTest.php +++ b/tests/cases/Database/AbstractTest.php @@ -29,6 +29,10 @@ abstract class AbstractTest extends \JKingWeb\Arsse\Test\AbstractTest { protected static $drv; protected static $failureReason = ""; protected $primed = false; + protected $data; + protected $user; + protected $checkTables; + protected $series; abstract protected function nextID(string $table): int; diff --git a/tests/cases/Database/SeriesArticle.php b/tests/cases/Database/SeriesArticle.php index efd78e18..197ec551 100644 --- a/tests/cases/Database/SeriesArticle.php +++ b/tests/cases/Database/SeriesArticle.php @@ -15,6 +15,8 @@ use JKingWeb\Arsse\Misc\Date; use JKingWeb\Arsse\Misc\ValueInfo; trait SeriesArticle { + protected $fields; + protected function setUpSeriesArticle(): void { $this->data = [ 'arsse_users' => [ diff --git a/tests/cases/Database/SeriesFeed.php b/tests/cases/Database/SeriesFeed.php index 5cc0d84c..bc7224e1 100644 --- a/tests/cases/Database/SeriesFeed.php +++ b/tests/cases/Database/SeriesFeed.php @@ -10,6 +10,8 @@ use JKingWeb\Arsse\Arsse; use JKingWeb\Arsse\Test\Result; trait SeriesFeed { + protected $matches; + protected function setUpSeriesFeed(): void { // set up the test data $past = gmdate("Y-m-d H:i:s", strtotime("now - 1 minute")); diff --git a/tests/cases/Database/SeriesLabel.php b/tests/cases/Database/SeriesLabel.php index 4a4fac66..41e39446 100644 --- a/tests/cases/Database/SeriesLabel.php +++ b/tests/cases/Database/SeriesLabel.php @@ -11,6 +11,8 @@ use JKingWeb\Arsse\Database; use JKingWeb\Arsse\Context\Context; trait SeriesLabel { + protected $checkLabels; + protected function setUpSeriesLabel(): void { $this->data = [ 'arsse_users' => [ diff --git a/tests/cases/Database/SeriesTag.php b/tests/cases/Database/SeriesTag.php index 1f2ea9cd..5be12177 100644 --- a/tests/cases/Database/SeriesTag.php +++ b/tests/cases/Database/SeriesTag.php @@ -10,6 +10,9 @@ use JKingWeb\Arsse\Arsse; use JKingWeb\Arsse\Database; trait SeriesTag { + protected $checkMembers; + protected $checkTags; + protected function setUpSeriesTag(): void { $this->data = [ 'arsse_users' => [ diff --git a/tests/cases/Db/SQLite3/TestCreation.php b/tests/cases/Db/SQLite3/TestCreation.php index cc4927df..a96dc289 100644 --- a/tests/cases/Db/SQLite3/TestCreation.php +++ b/tests/cases/Db/SQLite3/TestCreation.php @@ -17,6 +17,8 @@ class TestCreation extends \JKingWeb\Arsse\Test\AbstractTest { protected $data; protected $drv; protected $ch; + protected $files; + protected $path; public function setUp(): void { if (!Driver::requirementsMet()) { diff --git a/tests/cases/Db/SQLite3PDO/TestCreation.php b/tests/cases/Db/SQLite3PDO/TestCreation.php index ea5e9a32..b59f6f63 100644 --- a/tests/cases/Db/SQLite3PDO/TestCreation.php +++ b/tests/cases/Db/SQLite3PDO/TestCreation.php @@ -19,6 +19,8 @@ class TestCreation extends \JKingWeb\Arsse\Test\AbstractTest { protected $data; protected $drv; protected $ch; + protected $files; + protected $path; public function setUp(): void { if (!Driver::requirementsMet()) { diff --git a/tests/cases/ImportExport/TestImportExport.php b/tests/cases/ImportExport/TestImportExport.php index ae0c7a4a..2dbac5a9 100644 --- a/tests/cases/ImportExport/TestImportExport.php +++ b/tests/cases/ImportExport/TestImportExport.php @@ -15,6 +15,8 @@ use JKingWeb\Arsse\Test\Database; class TestImportExport extends \JKingWeb\Arsse\Test\AbstractTest { protected $drv; protected $proc; + protected $data; + protected $primed; protected $checkTables = [ 'arsse_folders' => ["id", "owner", "parent", "name"], 'arsse_feeds' => ["id", "url", "title"], diff --git a/tests/cases/Service/TestDaemon.php b/tests/cases/Service/TestDaemon.php index b9116569..c7478035 100644 --- a/tests/cases/Service/TestDaemon.php +++ b/tests/cases/Service/TestDaemon.php @@ -39,6 +39,7 @@ class TestDaemon extends \JKingWeb\Arsse\Test\AbstractTest { 'unwritable' => "", // this file will be chmodded by the test ], ]; + protected $daemon; public function setUp(): void { parent::setUp(); diff --git a/tests/cases/User/TestUser.php b/tests/cases/User/TestUser.php index 0066028d..19370c00 100644 --- a/tests/cases/User/TestUser.php +++ b/tests/cases/User/TestUser.php @@ -17,6 +17,8 @@ use JKingWeb\Arsse\User\Driver; /** @covers \JKingWeb\Arsse\User */ class TestUser extends \JKingWeb\Arsse\Test\AbstractTest { + protected $drv; + public function setUp(): void { parent::setUp(); self::setConf(); diff --git a/vendor-bin/phpunit/composer.lock b/vendor-bin/phpunit/composer.lock index 70001b25..7be719d1 100644 --- a/vendor-bin/phpunit/composer.lock +++ b/vendor-bin/phpunit/composer.lock @@ -615,16 +615,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.23", + "version": "9.2.24", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c" + "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", - "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2cf940ebc6355a9d430462811b5aaa308b174bed", + "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed", "shasum": "" }, "require": { @@ -680,7 +680,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.23" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.24" }, "funding": [ { @@ -688,7 +688,7 @@ "type": "github" } ], - "time": "2022-12-28T12:41:10+00:00" + "time": "2023-01-26T08:26:55+00:00" }, { "name": "phpunit/php-file-iterator", From fe06ffc1768eb1aec4541273f683020784c9e2e6 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Sat, 28 Jan 2023 11:18:14 -0500 Subject: [PATCH 2/3] Avoid dynamic property creation with PicoFeed This only leaves the Laminas XML deprecated behaviour to handle --- lib/Database.php | 8 +-- lib/Feed.php | 107 +++++++++++++++++++--------------- lib/Feed/Item.php | 24 ++++++++ tests/cases/Feed/TestFeed.php | 48 +++++++-------- 4 files changed, 112 insertions(+), 75 deletions(-) create mode 100644 lib/Feed/Item.php diff --git a/lib/Database.php b/lib/Database.php index 107c6dff..7910a4a1 100644 --- a/lib/Database.php +++ b/lib/Database.php @@ -1335,12 +1335,12 @@ class Database { "UPDATE arsse_feeds SET title = ?, source = ?, updated = CURRENT_TIMESTAMP, modified = ?, etag = ?, err_count = 0, err_msg = '', next_fetch = ?, size = ?, icon = ? WHERE id = ?", ["str", "str", "datetime", "strict str", "datetime", "int", "int", "int"] )->run( - $feed->data->title, - $feed->data->siteUrl, + $feed->title, + $feed->siteUrl, $feed->lastModified, - $feed->resource->getEtag(), + $feed->etag, $feed->nextFetch, - sizeof($feed->data->items), + sizeof($feed->items), $icon, $feedID ); diff --git a/lib/Feed.php b/lib/Feed.php index ce4ab4c1..69f94643 100644 --- a/lib/Feed.php +++ b/lib/Feed.php @@ -6,6 +6,7 @@ declare(strict_types=1); namespace JKingWeb\Arsse; +use JKingWeb\Arsse\Feed\Item; use JKingWeb\Arsse\Misc\Date; use JKingWeb\Arsse\Rule\Rule; use PicoFeed\PicoFeedException; @@ -15,63 +16,63 @@ use PicoFeed\Reader\Reader; use PicoFeed\Reader\Favicon; use PicoFeed\Scraper\Scraper; -class Feed { - public $data = null; +class Feed { + public $title; + public $siteUrl; public $iconUrl; public $iconType; public $iconData; - public $resource; public $modified = false; public $lastModified; + public $etag; public $nextFetch; + public $items = []; public $newItems = []; public $changedItems = []; public $filteredItems = []; public static function discover(string $url, string $username = '', string $password = ''): string { // fetch the candidate feed - $f = self::download($url, "", "", $username, $password); - if ($f->reader->detectFormat($f->getContent())) { + [$client, $reader] = self::download($url, "", "", $username, $password); + if ($reader->detectFormat($client->getContent())) { // if the prospective URL is a feed, use it $out = $url; } else { - $links = $f->reader->find($f->getUrl(), $f->getContent()); + $links = $reader->find($client->getUrl(), $client->getContent()); if (!$links) { - // work around a PicoFeed memory leak - libxml_use_internal_errors(false); throw new Feed\Exception("", ['url' => $url], new \PicoFeed\Reader\SubscriptionNotFoundException('Unable to find a subscription')); } else { $out = $links[0]; } } - // work around a PicoFeed memory leak - libxml_use_internal_errors(false); return $out; } public static function discoverAll(string $url, string $username = '', string $password = ''): array { // fetch the candidate feed - $f = self::download($url, "", "", $username, $password); - if ($f->reader->detectFormat($f->getContent())) { + [$client, $reader] = self::download($url, "", "", $username, $password); + if ($reader->detectFormat($client->getContent())) { // if the prospective URL is a feed, use it return [$url]; } else { - return $f->reader->find($f->getUrl(), $f->getContent()); + return $reader->find($client->getUrl(), $client->getContent()); } } public function __construct(int $feedID = null, string $url, string $lastModified = '', string $etag = '', string $username = '', string $password = '', bool $scrape = false) { // fetch the feed - $this->resource = self::download($url, $lastModified, $etag, $username, $password); + [$client, $reader] = self::download($url, $lastModified, $etag, $username, $password); // format the HTTP Last-Modified date returned - $lastMod = $this->resource->getLastModified(); + $lastMod = $client->getLastModified(); if (strlen($lastMod ?? "")) { $this->lastModified = Date::normalize($lastMod, "http"); } - $this->modified = $this->resource->isModified(); - //parse the feed, if it has been modified + $this->modified = $client->isModified(); + // get the ETag + $this->etag = $client->getEtag(); + // parse the feed, if it has been modified if ($this->modified) { - $this->parse(); + $this->parse($client, $reader); // ascertain whether there are any articles not in the database $this->matchToDatabase($feedID); // if caching header fields are not sent by the server, try to ascertain a last-modified date from the feed contents @@ -112,12 +113,11 @@ class Feed { return $config; } - protected static function download(string $url, string $lastModified, string $etag, string $username, string $password): Client { + protected static function download(string $url, string $lastModified, string $etag, string $username, string $password): array { try { $reader = new Reader(self::configure()); $client = $reader->download($url, $lastModified, $etag, $username, $password); - $client->reader = $reader; - return $client; + return [$client, $reader]; } catch (PicoFeedException $e) { throw new Feed\Exception("", ['url' => $url], $e); // @codeCoverageIgnore } catch (\GuzzleHttp\Exception\GuzzleException $e) { @@ -125,17 +125,17 @@ class Feed { } } - protected function parse(): void { + protected function parse(Client $client, Reader $reader): void { try { - $feed = $this->resource->reader->getParser( - $this->resource->getUrl(), - $this->resource->getContent(), - $this->resource->getEncoding() + $feed = $reader->getParser( + $client->getUrl(), + $client->getContent(), + $client->getEncoding() )->execute(); } catch (PicoFeedException $e) { - throw new Feed\Exception("", ['url' => $this->resource->getUrl()], $e); + throw new Feed\Exception("", ['url' => $client->getUrl()], $e); } catch (\GuzzleHttp\Exception\GuzzleException $e) { // @codeCoverageIgnore - throw new Feed\Exception("", ['url' => $this->resource->getUrl()], $e); // @codeCoverageIgnore + throw new Feed\Exception("", ['url' => $client->getUrl()], $e); // @codeCoverageIgnore } // Grab the favicon for the feed, or null if no valid icon is found @@ -150,6 +150,10 @@ class Feed { $this->iconUrl = $this->iconData = null; } + // Next gather all other feed-level information we want out of the feed + $this->siteUrl = $feed->siteUrl; + $this->title = $feed->title; + // PicoFeed does not provide valid ids when there is no id element. Its solution // of hashing the url, title, and content together for the id if there is no id // element is stupid. Many feeds are frankenstein mixtures of Atom and RSS, but @@ -158,29 +162,38 @@ class Feed { // only be reserved for severely broken feeds. foreach ($feed->items as $f) { - // Hashes used for comparison to check for updates and also to identify when an + // copy the basic information of an article + $i = new Item; + $i->url = $f->url; + $i->title = $f->title; + $i->content = $f->content; + $i->author = $f->author; + $i->publishedDate = $f->publishedDate; + $i->updatedDate = $f->updatedDate; + $i->enclosureType = $f->enclosureType; + $i->enclosureUrl = $f->enclosureUrl; + // add hashes used for comparison to check for updates and also to identify when an // id doesn't exist. $content = $f->content.$f->enclosureUrl.$f->enclosureType; // if the item link URL and item title are both equal to the feed link URL, then the item has neither a link URL nor a title if ($f->url === $feed->siteUrl && $f->title === $feed->siteUrl) { - $f->urlTitleHash = ""; + $i->urlTitleHash = ""; } else { - $f->urlTitleHash = hash('sha256', $f->url.$f->title); + $i->urlTitleHash = hash('sha256', $f->url.$f->title); } // if the item link URL is equal to the feed link URL, it has no link URL; if there is additionally no content, these should not be hashed if (!strlen($content) && $f->url === $feed->siteUrl) { - $f->urlContentHash = ""; + $i->urlContentHash = ""; } else { - $f->urlContentHash = hash('sha256', $f->url.$content); + $i->urlContentHash = hash('sha256', $f->url.$content); } // if the item's title is the same as its link URL, it has no title; if there is additionally no content, these should not be hashed if (!strlen($content) && $f->title === $f->url) { - $f->titleContentHash = ""; + $i->titleContentHash = ""; } else { - $f->titleContentHash = hash('sha256', $f->title.$content); + $i->titleContentHash = hash('sha256', $f->title.$content); } - $f->id = null; - // prefer an Atom ID as the item's ID + // next add an id; prefer an Atom ID as the item's ID $id = (string) $f->xml->children('http://www.w3.org/2005/Atom')->id; // otherwise use the RSS2 guid element if (!strlen($id)) { @@ -192,11 +205,10 @@ class Feed { } // otherwise there is no ID; if there is one, hash it if (strlen($id)) { - $f->id = hash('sha256', $id); + $i->id = hash('sha256', $id); } // PicoFeed also doesn't gather up categories, so we do this as well - $f->categories = []; // first add Atom categories foreach ($f->xml->children('http://www.w3.org/2005/Atom')->category as $c) { // if the category has a label, use that @@ -207,27 +219,28 @@ class Feed { } // ... assuming it has that much if (strlen($name)) { - $f->categories[] = $name; + $i->categories[] = $name; } } // next add RSS2 categories foreach ($f->xml->children()->category as $c) { $name = (string) $c; if (strlen($name)) { - $f->categories[] = $name; + $i->categories[] = $name; } } // and finally try Dublin Core subjects foreach ($f->xml->children('http://purl.org/dc/elements/1.1/')->subject as $c) { $name = (string) $c; if (strlen($name)) { - $f->categories[] = $name; + $i->categories[] = $name; } } //sort the results - sort($f->categories); + sort($i->categories); + // add the item to the feed's list of items + $this->items[] = $i; } - $this->data = $feed; } protected function deduplicateItems(array $items): array { @@ -251,7 +264,7 @@ class Feed { ($item->urlContentHash && $item->urlContentHash === $check->urlContentHash) || ($item->titleContentHash && $item->titleContentHash === $check->titleContentHash) ) { - if (// because newsfeeds are usually order newest-first, the later item should only be used if... + if (// because newsfeeds are usually ordered newest-first, the later item should only be used if... // the later item has an update date and the existing item does not ($item->updatedDate && !$check->updatedDate) || // the later item has an update date newer than the existing item's @@ -276,7 +289,7 @@ class Feed { protected function matchToDatabase(int $feedID = null): void { // first perform deduplication on items - $items = $this->deduplicateItems($this->data->items); + $items = $this->deduplicateItems($this->items); // if we haven't been given a database feed ID to check against, all items are new if (is_null($feedID)) { $this->newItems = $items; @@ -429,7 +442,7 @@ class Feed { protected function gatherDates(): array { $dates = []; - foreach ($this->data->items as $item) { + foreach ($this->items as $item) { if ($item->updatedDate) { $dates[] = $item->updatedDate->getTimestamp(); } diff --git a/lib/Feed/Item.php b/lib/Feed/Item.php new file mode 100644 index 00000000..fd53046b --- /dev/null +++ b/lib/Feed/Item.php @@ -0,0 +1,24 @@ +assertSame($h0, $f->data->items[0]->id); - $this->assertSame($h1, $f->data->items[1]->id); - $this->assertSame($h2, $f->data->items[2]->id); + $this->assertSame($h0, $f->items[0]->id); + $this->assertSame($h1, $f->items[1]->id); + $this->assertSame($h2, $f->items[2]->id); // check null hashes $h3 = "6287ba30f534e404e68356237e809683e311285d8b9f47d046ac58784eece052"; // URL hash $h4 = "6cbb5d2dcb11610a99eb3f633dc246690c0acf33327bf7534f95542caa8f27c4"; // title hash $h5 = "2b7c57ffa9adde92ccd1884fa1153a5bcd3211e48d99e27be5414cb078e6891c"; // content/enclosure hash - $this->assertNotEquals("", $f->data->items[3]->urlTitleHash); - $this->assertSame($h3, $f->data->items[3]->urlContentHash); - $this->assertSame("", $f->data->items[3]->titleContentHash); - $this->assertNotEquals("", $f->data->items[4]->urlTitleHash); - $this->assertSame("", $f->data->items[4]->urlContentHash); - $this->assertSame($h4, $f->data->items[4]->titleContentHash); - $this->assertSame("", $f->data->items[5]->urlTitleHash); - $this->assertNotEquals("", $f->data->items[5]->urlContentHash); - $this->assertNotEquals("", $f->data->items[5]->titleContentHash); + $this->assertNotEquals("", $f->items[3]->urlTitleHash); + $this->assertSame($h3, $f->items[3]->urlContentHash); + $this->assertSame("", $f->items[3]->titleContentHash); + $this->assertNotEquals("", $f->items[4]->urlTitleHash); + $this->assertSame("", $f->items[4]->urlContentHash); + $this->assertSame($h4, $f->items[4]->titleContentHash); + $this->assertSame("", $f->items[5]->urlTitleHash); + $this->assertNotEquals("", $f->items[5]->urlContentHash); + $this->assertNotEquals("", $f->items[5]->titleContentHash); // check null IDs - $this->assertSame(null, $f->data->items[3]->id); - $this->assertSame(null, $f->data->items[4]->id); - $this->assertSame(null, $f->data->items[5]->id); + $this->assertSame(null, $f->items[3]->id); + $this->assertSame(null, $f->items[4]->id); + $this->assertSame(null, $f->items[5]->id); // check categories $categories = [ "Aniki!", @@ -140,11 +140,11 @@ class TestFeed extends \JKingWeb\Arsse\Test\AbstractTest { "Bodybuilders", "Men", ]; - $this->assertSame([], $f->data->items[0]->categories); - $this->assertSame([], $f->data->items[1]->categories); - $this->assertSame([], $f->data->items[3]->categories); - $this->assertSame([], $f->data->items[4]->categories); - $this->assertSame($categories, $f->data->items[5]->categories); + $this->assertSame([], $f->items[0]->categories); + $this->assertSame([], $f->items[1]->categories); + $this->assertSame([], $f->items[3]->categories); + $this->assertSame([], $f->items[4]->categories); + $this->assertSame($categories, $f->items[5]->categories); } public function testDiscoverAFeedSuccessfully(): void { @@ -232,7 +232,7 @@ class TestFeed extends \JKingWeb\Arsse\Test\AbstractTest { $e = "78567a"; $f = new Feed(null, $this->base.$url."?t=$t&e=$e", Date::transform($t, "http"), $e); $this->assertTime($t, $f->lastModified); - $this->assertSame($e, $f->resource->getETag()); + $this->assertSame($e, $f->etag); } public function provide304ResponseURLs() { @@ -250,15 +250,15 @@ class TestFeed extends \JKingWeb\Arsse\Test\AbstractTest { $t = time() - 2000; $f = new Feed(null, $this->base."Caching/200Past"); $this->assertTime($t, $f->lastModified); - $this->assertNotEmpty($f->resource->getETag()); + $this->assertNotEmpty($f->etag); $t = time() - 2000; $f = new Feed(null, $this->base."Caching/200Past", Date::transform(time(), "http")); $this->assertTime($t, $f->lastModified); - $this->assertNotEmpty($f->resource->getETag()); + $this->assertNotEmpty($f->etag); $t = time() + 2000; $f = new Feed(null, $this->base."Caching/200Future"); $this->assertTime($t, $f->lastModified); - $this->assertNotEmpty($f->resource->getETag()); + $this->assertNotEmpty($f->etag); // these tests have no HTTP headers and rely on article dates $t = strtotime("2002-05-19T15:21:36Z"); $f = new Feed(null, $this->base."Caching/200PubDateOnly"); From 0a8d19d37d31720aefda3aad1b81653fe4f68ebb Mon Sep 17 00:00:00 2001 From: "J. King" Date: Sat, 28 Jan 2023 12:43:42 -0500 Subject: [PATCH 3/3] Require PHP 7.3 This addresses the last of the deprecation warnings in PHP 8.2 --- CHANGELOG | 6 + UPGRADING | 6 + composer.json | 2 +- composer.lock | 408 +++++++----------- dist/arch/PKGBUILD | 8 +- dist/arch/PKGBUILD-git | 8 +- dist/debian/control | 2 +- .../999_ On_Other_Systems.md | 2 +- tests/bootstrap.php | 3 +- 9 files changed, 175 insertions(+), 270 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index c377b228..367585ff 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,9 @@ +Version 0.??.? (????-??-??) +=========================== + +Changes: +- Require PHP 7.3 + Version 0.10.4 (2023-01-24) =========================== diff --git a/UPGRADING b/UPGRADING index da643168..ab368882 100644 --- a/UPGRADING +++ b/UPGRADING @@ -11,6 +11,12 @@ usually prudent: `composer install -o --no-dev` +Upgrading from 0.10.2 to 0.10.3 +============================= + +- PHP 7.3 is now required + + Upgrading from 0.10.2 to 0.10.3 ============================= diff --git a/composer.json b/composer.json index 6f534906..e02d31e7 100644 --- a/composer.json +++ b/composer.json @@ -39,7 +39,7 @@ }, "config": { "platform": { - "php": "7.1.33" + "php": "7.3.33" }, "allow-plugins": { "bamarni/composer-bin-plugin": true diff --git a/composer.lock b/composer.lock index a9f44a26..e0efbbea 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": "62bf2d6fdc0ccbeb090399f708928a02", + "content-hash": "2e8ad0d4821fdfc0d975e98f2e2c3efe", "packages": [ { "name": "docopt/docopt", @@ -58,37 +58,49 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.5.8", + "version": "7.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981" + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981", - "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.9", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.17" + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.1" + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, "branch-alias": { - "dev-master": "6.5-dev" + "dev-master": "7.5-dev" } }, "autoload": { @@ -141,19 +153,20 @@ } ], "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", "keywords": [ "client", "curl", "framework", "http", "http client", + "psr-18", + "psr-7", "rest", "web service" ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/6.5.8" + "source": "https://github.com/guzzle/guzzle/tree/7.5.0" }, "funding": [ { @@ -169,7 +182,7 @@ "type": "tidelift" } ], - "time": "2022-06-20T22:16:07+00:00" + "time": "2022-08-28T15:39:27+00:00" }, { "name": "guzzlehttp/promises", @@ -539,21 +552,21 @@ }, { "name": "laminas/laminas-httphandlerrunner", - "version": "1.2.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-httphandlerrunner.git", - "reference": "e1a5dad040e0043135e8095ee27d1fbf6fb640e1" + "reference": "5f94e55d93f756e8ad07b9049aeb3d6d84582d0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/e1a5dad040e0043135e8095ee27d1fbf6fb640e1", - "reference": "e1a5dad040e0043135e8095ee27d1fbf6fb640e1", + "url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/5f94e55d93f756e8ad07b9049aeb3d6d84582d0e", + "reference": "5f94e55d93f756e8ad07b9049aeb3d6d84582d0e", "shasum": "" }, "require": { "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^7.1", + "php": "^7.3 || ~8.0.0 || ~8.1.0", "psr/http-message": "^1.0", "psr/http-message-implementation": "^1.0", "psr/http-server-handler": "^1.0" @@ -563,15 +576,13 @@ }, "require-dev": { "laminas/laminas-coding-standard": "~1.0.0", - "laminas/laminas-diactoros": "^1.7 || ^2.1.1", - "phpunit/phpunit": "^7.0.2" + "laminas/laminas-diactoros": "^2.8.0", + "phpunit/phpunit": "^9.5.9", + "psalm/plugin-phpunit": "^0.16.1", + "vimeo/psalm": "^4.10.0" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev", - "dev-develop": "1.3.x-dev" - }, "laminas": { "config-provider": "Laminas\\HttpHandlerRunner\\ConfigProvider" } @@ -608,40 +619,37 @@ "type": "community_bridge" } ], - "time": "2020-06-03T15:52:17+00:00" + "time": "2021-09-22T09:17:54+00:00" }, { "name": "laminas/laminas-xml", - "version": "1.2.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-xml.git", - "reference": "879cc66d1bba6a37705e98074f52a6960c220020" + "reference": "dcadeefdb6d7ed6b39d772b47e3845003d6ea60f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-xml/zipball/879cc66d1bba6a37705e98074f52a6960c220020", - "reference": "879cc66d1bba6a37705e98074f52a6960c220020", + "url": "https://api.github.com/repos/laminas/laminas-xml/zipball/dcadeefdb6d7ed6b39d772b47e3845003d6ea60f", + "reference": "dcadeefdb6d7ed6b39d772b47e3845003d6ea60f", "shasum": "" }, "require": { - "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^5.6 || ^7.0" + "ext-dom": "*", + "ext-simplexml": "*", + "php": "^7.3 || ~8.0.0 || ~8.1.0" }, - "replace": { - "zendframework/zendxml": "self.version" + "conflict": { + "zendframework/zendxml": "*" }, "require-dev": { + "ext-iconv": "*", "laminas/laminas-coding-standard": "~1.0.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.4" + "phpunit/phpunit": "^9.5.8", + "squizlabs/php_codesniffer": "3.6.1 as 2.9999999.9999999" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev", - "dev-develop": "1.3.x-dev" - } - }, "autoload": { "psr-4": { "Laminas\\Xml\\": "src/" @@ -660,34 +668,41 @@ ], "support": { "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-xml/", "forum": "https://discourse.laminas.dev", "issues": "https://github.com/laminas/laminas-xml/issues", "rss": "https://github.com/laminas/laminas-xml/releases.atom", "source": "https://github.com/laminas/laminas-xml" }, - "time": "2019-12-31T18:05:42+00:00" + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2021-11-30T02:16:35+00:00" }, { "name": "laminas/laminas-zendframework-bridge", - "version": "1.1.1", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642" + "reference": "88bf037259869891afce6504cacc4f8a07b24d0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642", + "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/88bf037259869891afce6504cacc4f8a07b24d0f", + "reference": "88bf037259869891afce6504cacc4f8a07b24d0f", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0 || ^8.0" + "php": "^7.3 || ~8.0.0 || ~8.1.0" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", - "squizlabs/php_codesniffer": "^3.5" + "phpunit/phpunit": "^9.3", + "psalm/plugin-phpunit": "^0.15.1", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.6" }, "type": "library", "extra": { @@ -726,7 +741,7 @@ "type": "community_bridge" } ], - "time": "2020-09-14T14:23:00+00:00" + "time": "2021-12-21T14:34:37+00:00" }, { "name": "nicolus/picofeed", @@ -792,6 +807,58 @@ }, "time": "2022-09-23T17:42:18+00:00" }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, { "name": "psr/http-message", "version": "1.0.1", @@ -997,131 +1064,35 @@ "time": "2019-03-08T08:55:37+00:00" }, { - "name": "symfony/polyfill-intl-idn", - "version": "v1.27.0", + "name": "symfony/deprecation-contracts", + "version": "v2.5.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-11-03T14:55:06+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { "php": ">=7.1" }, - "suggest": { - "ext-intl": "For best performance" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "2.5-dev" }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" + "function.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -1138,18 +1109,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", + "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -1165,111 +1128,42 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2022-01-02T09:53:40+00:00" } ], "packages-dev": [ { "name": "bamarni/composer-bin-plugin", - "version": "v1.5.0", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/bamarni/composer-bin-plugin.git", - "reference": "49934ffea764864788334c1485fbb08a4b852031" + "reference": "92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/49934ffea764864788334c1485fbb08a4b852031", - "reference": "49934ffea764864788334c1485fbb08a4b852031", + "url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880", + "reference": "92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0 || ^2.0", - "php": "^5.5.9 || ^7.0 || ^8.0" + "composer-plugin-api": "^2.0", + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "composer/composer": "^1.0 || ^2.0", - "symfony/console": "^2.5 || ^3.0 || ^4.0" + "composer/composer": "^2.0", + "ext-json": "*", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.5", + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" }, "type": "composer-plugin", "extra": { - "class": "Bamarni\\Composer\\Bin\\Plugin" + "class": "Bamarni\\Composer\\Bin\\BamarniBinPlugin" }, "autoload": { "psr-4": { @@ -1291,9 +1185,9 @@ ], "support": { "issues": "https://github.com/bamarni/composer-bin-plugin/issues", - "source": "https://github.com/bamarni/composer-bin-plugin/tree/v1.5.0" + "source": "https://github.com/bamarni/composer-bin-plugin/tree/1.8.2" }, - "time": "2022-02-22T21:01:25+00:00" + "time": "2022-10-31T08:38:03+00:00" } ], "aliases": [], @@ -1314,7 +1208,7 @@ }, "platform-dev": [], "platform-overrides": { - "php": "7.1.33" + "php": "7.3.33" }, "plugin-api-version": "2.3.0" } diff --git a/dist/arch/PKGBUILD b/dist/arch/PKGBUILD index 872f06b7..76afba7d 100644 --- a/dist/arch/PKGBUILD +++ b/dist/arch/PKGBUILD @@ -1,6 +1,6 @@ # Maintainer: J. King pkgname="arsse" -pkgver=0.9.2 +pkgver=0.10.4 pkgrel=1 epoch= pkgdesc="Multi-protocol RSS/Atom newsfeed synchronization server" @@ -14,7 +14,7 @@ optdepends=("nginx: HTTP server" "apache>=2.4: HTTP server" "percona-server: Alternate database" "postgresql>=10: Alternate database" - "php-pgsql>=7.1: PostgreSQL database support") + "php-pgsql>=7.3: PostgreSQL database support") backup=("etc/webapps/arsse/config.php" "etc/php/php-fpm.d/arsse.conf" "etc/webapps/arsse/nginx/example.conf" @@ -24,12 +24,12 @@ backup=("etc/webapps/arsse/config.php" "etc/webapps/arsse/apache/example.conf" "etc/webapps/arsse/apache/arsse.conf" "etc/webapps/arsse/apache/arsse-loc.conf") -source=("arsse-0.9.2.tar.gz") +source=("arsse-0.10.4.tar.gz") md5sums=("SKIP") package() { # define runtime dependencies - depends=("php>=7.1" "php-intl>=7.1" "php-sqlite>=7.1" "php-fpm>=7.1") + depends=("php>=7.3" "php-intl>=7.3" "php-sqlite>=7.3" "php-fpm>=7.3") # create most directories necessary for the final package cd "$pkgdir" mkdir -p "usr/share/webapps/arsse" "usr/share/doc/arsse" "usr/share/licenses/arsse" "usr/lib/systemd/system" "usr/lib/sysusers.d" "usr/lib/tmpfiles.d" "etc/php/php-fpm.d" "etc/webapps/arsse" diff --git a/dist/arch/PKGBUILD-git b/dist/arch/PKGBUILD-git index 428456ca..c366e893 100644 --- a/dist/arch/PKGBUILD-git +++ b/dist/arch/PKGBUILD-git @@ -1,6 +1,6 @@ # Maintainer: J. King pkgname="arsse-git" -pkgver=0.9.2 +pkgver=0.10.4 pkgrel=1 epoch= pkgdesc="Multi-protocol RSS/Atom newsfeed synchronization server, bugfix-testing version" @@ -9,14 +9,14 @@ url="https://thearsse.com/" license=("MIT") provides=("arsse") conflicts=("arsse") -depends=("php>=7.1" "php-intl>=7.1" "php-sqlite>=7.1") +depends=("php>=7.3" "php-intl>=7.3" "php-sqlite>=7.3") makedepends=("composer" "pandoc") checkdepends=() optdepends=("nginx: HTTP server" "apache>=2.4: HTTP server" "percona-server: Alternate database" "postgresql>=10: Alternate database" - "php-pgsql>=7.1: PostgreSQL database support") + "php-pgsql>=7.3: PostgreSQL database support") backup=("etc/webapps/arsse/config.php" "etc/php/php-fpm.d/arsse.conf" "etc/webapps/arsse/nginx/example.conf" @@ -46,7 +46,7 @@ build() { package() { # define runtime dependencies - depends=("php>=7.1" "php-intl>=7.1" "php-sqlite>=7.1" "php-fpm>=7.1") + depends=("php>=7.3" "php-intl>=7.3" "php-sqlite>=7.3" "php-fpm>=7.3") # create most directories necessary for the final package cd "$pkgdir" mkdir -p "usr/share/webapps/arsse" "usr/share/doc/arsse" "usr/share/licenses/arsse" "usr/lib/systemd/system" "usr/lib/sysusers.d" "usr/lib/tmpfiles.d" "etc/php/php-fpm.d" "etc/webapps/arsse" diff --git a/dist/debian/control b/dist/debian/control index 083c5080..d4818ed2 100644 --- a/dist/debian/control +++ b/dist/debian/control @@ -20,7 +20,7 @@ Description: Multi-protocol RSS/Atom newsfeed synchronization server server. Depends: ${misc:Depends}, dbconfig-sqlite3 | dbconfig-pgsql | dbconfig-mysql | dbconfig-no-thanks, - php (>= 7.1.0), + php (>= 7.3.0), php-cli, php-intl, php-json, diff --git a/docs/en/020_Getting_Started/020_Download_and_Installation/999_ On_Other_Systems.md b/docs/en/020_Getting_Started/020_Download_and_Installation/999_ On_Other_Systems.md index a496aa04..a1d088d9 100644 --- a/docs/en/020_Getting_Started/020_Download_and_Installation/999_ On_Other_Systems.md +++ b/docs/en/020_Getting_Started/020_Download_and_Installation/999_ On_Other_Systems.md @@ -11,7 +11,7 @@ The Arsse has the following requirements: - A Web server such as: - [Nginx](https://nginx.org) - [Apache HTTP server](https://httpd.apache.org) 2.4 or later -- PHP 7.1.0 or later with the following extensions: +- PHP 7.3.0 or later with the following extensions: - [intl](https://php.net/manual/en/book.intl.php), [json](https://php.net/manual/en/book.json.php), [hash](https://php.net/manual/en/book.hash.php), [filter](https://php.net/manual/en/book.filter.php), and [dom](https://php.net/manual/en/book.dom.php) - [simplexml](https://php.net/manual/en/book.simplexml.php), and [iconv](https://php.net/manual/en/book.iconv.php) - One of: diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 379a7137..c8f36508 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -12,8 +12,7 @@ const DOCROOT = BASE."tests".DIRECTORY_SEPARATOR."docroot".DIRECTORY_SEPARATOR; ini_set("memory_limit", "-1"); ini_set("zend.assertions", "1"); ini_set("assert.exception", "true"); -// FIXME: This is required because various dependencies have yet to adjust to PHP 8.1 -error_reporting(\E_ALL & ~\E_DEPRECATED); +error_reporting(\E_ALL); require_once BASE."vendor".DIRECTORY_SEPARATOR."autoload.php"; if (function_exists("xdebug_set_filter")) {