.scrutinizer.yml 0000666 00000001745 13436756475 0007765 0 ustar 00 before_commands:
- "composer install --no-dev --prefer-source"
tools:
external_code_coverage:
timeout: 1200
php_code_coverage:
enabled: true
php_code_sniffer:
enabled: true
config:
standard: PSR2
filter:
paths: ["src/*", "tests/*"]
php_cpd:
enabled: true
excluded_dirs: ["test", "vendor"]
php_cs_fixer:
enabled: true
config:
level: all
filter:
paths: ["src/*", "tests/*"]
php_loc:
enabled: true
excluded_dirs: ["test", "vendor"]
php_mess_detector:
enabled: true
filter:
paths: ["src/*"]
php_pdepend:
enabled: true
excluded_dirs: ["test", "vendor"]
php_analyzer:
enabled: true
filter:
paths: ["src/*", "test/*"]
php_hhvm:
enabled: true
filter:
paths: ["src/*", "test/*"]
sensiolabs_security_checker: true
LICENSE 0000666 00000002041 13436756475 0005576 0 ustar 00 Copyright (c) 2016 Marco Pivetta
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
README.md 0000666 00000003023 13436756475 0006051 0 ustar 00 # Package Versions
This utility provides very quick and easy access to installed composer dependency versions.
```php
$version = \PackageVersions\Versions::getVersion('ocramius/package-versions');
var_dump($versions); // 1.0.0@0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
```
[![Build Status](https://travis-ci.org/Ocramius/PackageVersions.svg?branch=master)](https://travis-ci.org/Ocramius/PackageVersions)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/Ocramius/PackageVersions/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/Ocramius/PackageVersions/?branch=master)
[![Code Coverage](https://scrutinizer-ci.com/g/Ocramius/PackageVersions/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/Ocramius/PackageVersions/?branch=master)
[![Packagist](https://img.shields.io/packagist/v/ocramius/package-versions.svg)](ocramius/package-versions)
[![Packagist Pre Release](https://img.shields.io/packagist/vpre/ocramius/package-versions.svg)](ocramius/package-versions)
### Installation
```sh
composer require ocramius/package-versions
```
### Use-cases
This repository implements `PackageVersions\Versions::getVersion()` in such a way that no IO
happens when calling it, because the list of package versions is compiled during composer
installation.
This is especially useful when you want to generate assets/code/artifacts that are computed from
the current version of a certain dependency. Doing so at runtime by checking the installed
version of a package would be too expensive, and this package mitigates that.
.travis.coverage.sh 0000666 00000000260 13436756475 0010306 0 ustar 00 set -x
if [ "$TRAVIS_PHP_VERSION" = '7.0' ] ; then
wget https://scrutinizer-ci.com/ocular.phar
php ocular.phar code-coverage:upload --format=php-clover ./clover.xml
fi
src/PackageVersions/Installer.php 0000666 00000007410 13436756475 0013117 0 ustar 00 getEventDispatcher()->addSubscriber($this);
}
/**
* {@inheritDoc}
*/
public static function getSubscribedEvents()
{
return [
ScriptEvents::POST_INSTALL_CMD => 'dumpVersionsClass',
ScriptEvents::POST_UPDATE_CMD => 'dumpVersionsClass',
];
}
/**
* @param Event $composerEvent
*
* @return void
*/
public static function dumpVersionsClass(Event $composerEvent)
{
$io = $composerEvent->getIO();
$io->write('Generating version class...');
$composer = $composerEvent->getComposer();
self::writeVersionClassToFile(self::generateVersionsClass($composer));
self::reDumpAutoloader($composer);
$io->write('...done generating version class');
}
private static function generateVersionsClass(Composer $composer) : string
{
return sprintf(
self::$generatedClassTemplate,
var_export(iterator_to_array(self::getVersions($composer->getLocker(), $composer->getPackage())), true)
);
}
/**
* @param string $versionClassSource
*
* @return void
*/
private static function writeVersionClassToFile(string $versionClassSource)
{
file_put_contents(__DIR__ . '/Versions.php', $versionClassSource, 0664);
}
/**
* @param Composer $composer
*
* @return void
*/
private static function reDumpAutoloader(Composer $composer)
{
$composer->getAutoloadGenerator()->dump(
$composer->getConfig(),
$composer->getRepositoryManager()->getLocalRepository(),
$composer->getPackage(),
$composer->getInstallationManager(),
'composer',
true // CBA to provide this manually, for now
);
}
/**
* @param Locker $locker
* @param RootPackageInterface $rootPackage
*
* @return \Generator|\string[]
*/
private static function getVersions(Locker $locker, RootPackageInterface $rootPackage) : \Generator
{
$lockData = $locker->getLockData();
foreach (array_merge($lockData['packages'], $lockData['packages-dev']) as $package) {
yield $package['name']
=> $package['version'] . '@' . $package['source']['reference'];
}
yield $rootPackage->getName() => $rootPackage->getVersion() . '@' . $rootPackage->getSourceReference();
}
} composer.json 0000666 00000002122 13436756475 0007313 0 ustar 00 {
"name": "ocramius/package-versions",
"description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
"type": "composer-plugin",
"license": "MIT",
"authors": [
{
"name": "Marco Pivetta",
"email": "ocramius@gmail.com"
}
],
"require": {
"php": "~7.0",
"composer-plugin-api": "^1.0"
},
"require-dev": {
"phpunit/phpunit": "^5.0",
"composer/composer": "^1.0.0-ALPHA8@ALPHA"
},
"autoload": {
"psr-4": {
"PackageVersions\\": "src/PackageVersions"
}
},
"autoload-dev": {
"psr-4": {
"PackageVersionsTest\\": "test/PackageVersionsTest"
}
},
"extra": {
"class": "PackageVersions\\Installer",
"branch-alias": {
"dev-master": "2.0.x-dev"
}
},
"scripts": {
"post-update-cmd": "PackageVersions\\Installer::dumpVersionsClass",
"post-install-cmd": "PackageVersions\\Installer::dumpVersionsClass"
}
}
.travis.yml 0000666 00000000471 13436756475 0006707 0 ustar 00 language: php
sudo: false
php:
- 7.0
env:
- DEPENDENCIES=""
- DEPENDENCIES="--prefer-lowest --prefer-stable"
before_script:
- sh .travis.install.sh
script:
- ./vendor/bin/phpunit --disallow-test-output --report-useless-tests --coverage-clover ./clover.xml
after_script:
- sh .travis.coverage.sh
phpunit.xml.dist 0000666 00000001174 13436756475 0007752 0 ustar 00
./test/PackageVersionsTest
./src
test/PackageVersionsTest/VersionsTest.php 0000666 00000001653 13436756475 0014665 0 ustar 00 setExpectedException(\OutOfBoundsException::class);
Versions::getVersion(uniqid('', true) . '/' . uniqid('', true));
}
}
test/PackageVersionsTest/InstallerTest.php 0000666 00000014725 13436756475 0015016 0 ustar 00 oldVersionContents = file_get_contents(__DIR__ . '/../../src/PackageVersions/Versions.php');
parent::setUp();
$this->installer = new Installer();
$this->io = $this->getMock(IOInterface::class);
$this->composer = $this->getMock(Composer::class);
$this->eventDispatcher = $this->getMockBuilder(EventDispatcher::class)->disableOriginalConstructor()->getMock();
$this->composer->expects(self::any())->method('getEventDispatcher')->willReturn($this->eventDispatcher);
}
public function testActivate()
{
$this->eventDispatcher->expects(self::once())->method('addSubscriber')->with($this->installer);
$this->installer->activate($this->composer, $this->io);
}
public function testGetSubscribedEvents()
{
$events = Installer::getSubscribedEvents();
self::assertSame(
[
'post-install-cmd' => 'dumpVersionsClass',
'post-update-cmd' => 'dumpVersionsClass',
],
$events
);
foreach ($events as $callback) {
self::assertInternalType('callable', [$this->installer, $callback]);
}
}
public function testDumpVersionsClass()
{
$config = $this->getMockBuilder(Config::class)->disableOriginalConstructor()->getMock();
$locker = $this->getMockBuilder(Locker::class)->disableOriginalConstructor()->getMock();
$autoloadGenerator = $this->getMockBuilder(AutoloadGenerator::class)->disableOriginalConstructor()->getMock();
$repositoryManager = $this->getMockBuilder(RepositoryManager::class)->disableOriginalConstructor()->getMock();
$installManager = $this->getMockBuilder(InstallationManager::class)->disableOriginalConstructor()->getMock();
$repository = $this->getMock(InstalledRepositoryInterface::class);
$package = $this->getMock(RootPackageInterface::class);
$locker
->expects(self::any())
->method('getLockData')
->willReturn([
'packages' => [
[
'name' => 'foo/bar',
'version' => '1.2.3',
'source' => [
'reference' => 'abc123',
],
],
[
'name' => 'baz/tab',
'version' => '4.5.6',
'source' => [
'reference' => 'def456',
],
],
],
'packages-dev' => [
[
'name' => 'tar/taz',
'version' => '7.8.9',
'source' => [
'reference' => 'ghi789',
],
]
],
]);
$autoloadGenerator->expects(self::once())->method('dump');
$repositoryManager->expects(self::any())->method('getLocalRepository')->willReturn($repository);
$this->composer->expects(self::any())->method('getConfig')->willReturn($config);
$this->composer->expects(self::any())->method('getLocker')->willReturn($locker);
$this->composer->expects(self::any())->method('getAutoloadGenerator')->willReturn($autoloadGenerator);
$this->composer->expects(self::any())->method('getRepositoryManager')->willReturn($repositoryManager);
$this->composer->expects(self::any())->method('getPackage')->willReturn($package);
$this->composer->expects(self::any())->method('getInstallationManager')->willReturn($installManager);
$package->expects(self::any())->method('getName')->willReturn('root/package');
$package->expects(self::any())->method('getVersion')->willReturn('1.3.5');
$package->expects(self::any())->method('getSourceReference')->willReturn('aaabbbcccddd');
$this->installer->dumpVersionsClass(new Event(
'post-install-cmd',
$this->composer,
$this->io
));
$expectedSource = <<<'PHP'
'1.2.3@abc123',
'baz/tab' => '4.5.6@def456',
'tar/taz' => '7.8.9@ghi789',
'root/package' => '1.3.5@aaabbbcccddd',
);
private function __construct()
{
}
/**
* @throws \OutOfBoundsException if a version cannot be located
*/
public static function getVersion(string $packageName) : string
{
if (! isset(self::VERSIONS[$packageName])) {
throw new \OutOfBoundsException(
'Required package "' . $packageName . '" is not installed: cannot detect its version'
);
}
return self::VERSIONS[$packageName];
}
}
PHP;
self::assertSame($expectedSource, file_get_contents(__DIR__ . '/../../src/PackageVersions/Versions.php'));
}
protected function tearDown()
{
parent::tearDown();
file_put_contents(__DIR__ . '/../../src/PackageVersions/Versions.php', $this->oldVersionContents);
}
}
CONTRIBUTING.md 0000666 00000002136 13436756475 0007027 0 ustar 00 ---
title: Contributing
---
# Contributing
* Coding standard for the project is [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)
* The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php)
* Any contribution must provide tests for additional introduced conditions
* Any un-confirmed issue needs a failing test case before being accepted
* Pull requests must be sent from a new hotfix/feature branch, not from `master`.
## Installation
To install the project and run the tests, you need to clone it first:
```sh
$ git clone git://github.com/Ocramius/PackageVersions.git
```
You will then need to run a composer installation:
```sh
$ cd PackageVersions
$ curl -s https://getcomposer.org/installer | php
$ php composer.phar update
```
## Testing
The PHPUnit version to be used is the one installed as a dev- dependency via composer:
```sh
$ ./vendor/bin/phpunit
```
Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement
won't be merged.
.travis.install.sh 0000666 00000000547 13436756475 0010171 0 ustar 00 set -x
if [ "$TRAVIS_PHP_VERSION" = 'hhvm' ] ; then
curl -sS https://getcomposer.org/installer > composer-installer.php
hhvm composer-installer.php
hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v Http.SlowQueryThreshold=30000 composer.phar update --prefer-source
else
composer self-update
composer update --prefer-source $DEPENDENCIES
fi
.gitignore 0000666 00000000065 13436756475 0006565 0 ustar 00 /vendor/
src/FooBar/Versions
composer.lock
clover.xml