Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for composer plugin api 2 , Drop support PHP 7 and composer version 1 #2

Merged
merged 5 commits into from
Dec 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .github/workflows/php-unit-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: PHP Unit Tests

on:
push:
paths:
- '**workflows/php-unit-tests.yml'
- '**.php'
- '**phpunit.xml.dist'
- '**composer.json'
pull_request:
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
unit-tests:
runs-on: ubuntu-latest
if: ${{ !contains(github.event.head_commit.message, 'skip unit') }}

env:
USE_COVERAGE: 'no'

strategy:
fail-fast: false
matrix:
php-versions: [ '8.0', '8.1', '8.2' ]

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
ini-values: zend.assertions=1, error_reporting=E_ALL, display_errors=On
coverage: ${{ env.USE_COVERAGE == 'yes' && 'xdebug' || 'none' }}

- name: Install Composer dependencies
uses: ramsey/composer-install@v2

- name: Run unit tests
run: composer tests
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
composer.phar
/vendor/
composer.lock
.phpunit.result.cache
42 changes: 28 additions & 14 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,25 +1,39 @@
{
"name": "wecodemore/wp-downloader",
"description": "A Composer plugin that downloads WordPress releases zip from official repo.",
"type": "composer-plugin",
"license": "MIT",
"authors": [
"name": "wecodemore/wp-downloader",
"description": "A Composer plugin that downloads WordPress releases zip from official repo.",
"type": "composer-plugin",
"license": "MIT",
"authors": [
{
"name": "Giuseppe Mazzapica",
"name": "Giuseppe Mazzapica",
"email": "[email protected]"
}
],
"minimum-stability": "stable",
"require": {
"php": ">=5.4",
"composer-plugin-api": "^1.1"
"require": {
"php": ">=8.0",
"composer-plugin-api": "^2.0"
},
"autoload": {
"classmap": [
"src/"
]
"autoload": {
"psr-4": {
"WCM\\WpDownloader\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"WCM\\WpDownloader\\Tests\\Unit\\": "tests/Unit/"
}
},
"extra": {
"extra": {
"class": "WCM\\WpDownloader\\WpDownloader"
},
"require-dev": {
"brain/monkey": "^2.6",
"phpunit/phpunit": "^9.6",
"composer/composer": "^2.0"
},
"scripts": {
"tests": "@php ./vendor/phpunit/phpunit/phpunit --coverage-text",
"tests:no-cov": "@php ./vendor/phpunit/phpunit/phpunit --no-coverage"
}
}
25 changes: 25 additions & 0 deletions phpunit.xml.dist
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"
bootstrap="tests/bootstrap.php"
backupGlobals="false"
backupStaticAttributes="false"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
stopOnFailure="false"
stopOnError="false"
verbose="true">
<coverage processUncoveredFiles="true">
<include>
<directory suffix=".php">src</directory>
</include>
</coverage>
<testsuites>
<testsuite name="unit">
<directory suffix="Test.php">tests/Unit</directory>
</testsuite>
</testsuites>
</phpunit>
10 changes: 7 additions & 3 deletions src/Unzipper.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
use Composer\Downloader\ZipDownloader;
use Composer\IO\IOInterface;
use Composer\Package\PackageInterface;
use React\Promise\Promise;
use React\Promise\PromiseInterface;
use Symfony\Component\Process\ExecutableFinder;

/**
Expand Down Expand Up @@ -51,15 +53,17 @@ public function unzip($zipPath, $target)
}

/**
* This this just un unzipper, we don't download anything.
* This is just an unzipper, we don't download anything.
*
* @param PackageInterface $package
* @param string $path
* @param PackageInterface|null $prevPackage
* @param bool $output
* @return string|void
* @return PromiseInterface
*/
public function download(PackageInterface $package, $path, $output = true)
public function download(PackageInterface $package, string $path, ?PackageInterface $prevPackage = null, bool $output = true): PromiseInterface
{
return new Promise(fn() => null);
}

/**
Expand Down
45 changes: 37 additions & 8 deletions src/WpDownloader.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,15 @@ class WpDownloader implements PluginInterface, EventSubscriberInterface
const RELEASES_URL = 'https://api.wordpress.org/core/version-check/1.7/';
const DOWNLOADS_BASE_URL = 'https://downloads.wordpress.org/release/wordpress-';

public function deactivate(Composer $composer, IOInterface $io)
{
}

public function uninstall(Composer $composer, IOInterface $io)
{
}


/**
* @var array
*/
Expand Down Expand Up @@ -103,23 +112,43 @@ public static function getSubscribedEvents()
*/
public function activate(Composer $composer, IOInterface $io)
{
$this->filesystem = $this->prepareFilesystem();
$this->remoteFilesystem = $this->prepareRemoteSystem($composer, $io);
$this->composer = $composer;
$this->filesystem = new Filesystem();
$this->remoteFilesystem = new RemoteFilesystem($io, $composer->getConfig());
$this->io = $io;
$this->config = $this->prepareConfig($composer);
}

protected function prepareFilesystem(): Filesystem
{
return new Filesystem();
}

protected function prepareRemoteSystem(Composer $composer, IOInterface $io): RemoteFilesystem
{
return new RemoteFilesystem($io, $composer->getConfig());
}

protected function prepareConfig(Composer $composer): array
{
$extra = (array)$composer->getPackage()->getExtra();
$dirs = empty($extra['wordpress-install-dir']) ? [] : $extra['wordpress-install-dir'];
is_string($dirs) and $dirs = [$dirs];
is_array($dirs) and $dirs = array_filter(array_filter($dirs, 'is_string'));
$dirs = $this->wpInstallationDirs($extra);

$default = [
'version' => '',
'no-content' => true,
'target-dir' => (is_array($dirs) && $dirs) ? reset($dirs) : 'wordpress',
'target-dir' => $dirs ? reset($dirs) : 'wordpress',
];
$config = array_key_exists('wp-downloader', $extra) ? $extra['wp-downloader'] : [];
$config = array_merge($default, $config);
$this->config = $config;
return array_merge($default, $config);
}

protected function wpInstallationDirs(array $extra): array
{
$dirs = empty($extra['wordpress-install-dir']) ? [] : $extra['wordpress-install-dir'];
is_string($dirs) and $dirs = [$dirs];
is_array($dirs) and $dirs = array_filter(array_filter($dirs, 'is_string'));
return $dirs;
}

/**
Expand Down
45 changes: 45 additions & 0 deletions tests/Unit/AbstractTestCase.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

/**
* This file is part of @package Mercury\Blocks.
*
* (c) Inpsyde GmbH
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace WCM\WpDownloader\Tests\Unit;

use PHPUnit\Framework\TestCase;
use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;
use Brain\Monkey;
abstract class AbstractTestCase extends TestCase
{
use MockeryPHPUnitIntegration;

/**
* Sets up the environment.
*
* @return void
*/
protected function setUp(): void
{
parent::setUp();
// Monkey\setUp();
}

/**
* Tears down the environment.
*
* @return void
*/
protected function tearDown(): void
{
// Monkey\tearDown();
parent::tearDown();

}
}
38 changes: 38 additions & 0 deletions tests/Unit/WpDownloaderTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

declare(strict_types=1);

namespace WCM\WpDownloader\Tests\Unit;

use Composer\Composer;
use Composer\IO\IOInterface;
use Composer\Util\Filesystem;
use Composer\Util\RemoteFilesystem;
use WCM\WpDownloader\WpDownloader;

class WpDownloaderTest extends AbstractTestCase
{
public function testCanInstantiateClass()
{
$instance = new WpDownloader();
$this->assertInstanceOf(WpDownloader::class, $instance);
}

public function testActivate()
{
$mock = \Mockery::mock(WpDownloader::class)->shouldAllowMockingProtectedMethods()->makePartial();
$composerMock = \Mockery::mock(Composer::class);
$ioMock = \Mockery::mock(IOInterface::class);
$filesystemMock = \Mockery::mock(Filesystem::class);
$remoteFsMock = \Mockery::mock(RemoteFilesystem::class);
$mock->shouldReceive('prepareFilesystem')->once()->andReturn($filesystemMock);
$mock->shouldReceive('prepareRemoteSystem')->withArgs([
$composerMock,
$ioMock
])->once()->andReturn($remoteFsMock);
$mock->shouldReceive('prepareConfig')->withArgs([
$composerMock,
])->once();
$mock->activate($composerMock, $ioMock);
}
}
26 changes: 26 additions & 0 deletions tests/bootstrap.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php


declare(strict_types=1);

//phpcs:disable PSR1.Files.SideEffects

$libraryPath = dirname(__DIR__, 1);
$vendorPath = "{$libraryPath}/vendor";
if (!realpath($vendorPath)) {
die('Please install via Composer before running tests.');
}

putenv('LIBRARY_PATH=' . $libraryPath);

if (!defined('PHPUNIT_COMPOSER_INSTALL')) {
define('PHPUNIT_COMPOSER_INSTALL', "{$vendorPath}/autoload.php");
}


require_once "{$vendorPath}/antecedent/patchwork/Patchwork.php";
require_once "{$vendorPath}/autoload.php";

unset($libraryPath, $vendorPath);

//phpcs:enable