parent
c211f92313
commit
e4c40c76af
240
PHPCI/Plugin/Phar.php
Normal file
240
PHPCI/Plugin/Phar.php
Normal file
|
@ -0,0 +1,240 @@
|
|||
<?php
|
||||
namespace PHPCI\Plugin;
|
||||
|
||||
use Exception;
|
||||
use PHPCI\Builder;
|
||||
use PHPCI\Model\Build;
|
||||
use Phar as PHPPhar;
|
||||
|
||||
/**
|
||||
* Phar Plugin
|
||||
*/
|
||||
class Phar implements \PHPCI\Plugin
|
||||
{
|
||||
/**
|
||||
* PHPCI
|
||||
* @var Builder
|
||||
*/
|
||||
protected $phpci;
|
||||
|
||||
/**
|
||||
* Build
|
||||
* @var Build
|
||||
*/
|
||||
protected $build;
|
||||
|
||||
/**
|
||||
* Output Directory
|
||||
* @var string
|
||||
*/
|
||||
protected $directory;
|
||||
|
||||
/**
|
||||
* Phar Filename
|
||||
* @var string
|
||||
*/
|
||||
protected $filename;
|
||||
|
||||
/**
|
||||
* Regular Expression Filename Capture
|
||||
* @var string
|
||||
*/
|
||||
protected $regexp;
|
||||
|
||||
/**
|
||||
* Stub Filename
|
||||
* @var string
|
||||
*/
|
||||
protected $stub;
|
||||
|
||||
/**
|
||||
* Standard Constructor
|
||||
*
|
||||
* $options['directory'] Output Directory. Default: %BUILDPATH%
|
||||
* $options['filename'] Phar Filename. Default: build.phar
|
||||
* $options['regexp'] Regular Expression Filename Capture. Default: /\.php$/
|
||||
* $options['stub'] Stub Content. No Default Value
|
||||
*
|
||||
* @param Builder $phpci
|
||||
* @param Build $build
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct(Builder $phpci, Build $build, array $options = array())
|
||||
{
|
||||
// Basic
|
||||
$this->phpci = $phpci;
|
||||
$this->build = $build;
|
||||
|
||||
// Directory?
|
||||
if (isset($options['directory'])) {
|
||||
$this->setDirectory($options['directory']);
|
||||
}
|
||||
|
||||
// Filename?
|
||||
if (isset($options['filename'])) {
|
||||
$this->setFilename($options['filename']);
|
||||
}
|
||||
|
||||
// RegExp?
|
||||
if (isset($options['regexp'])) {
|
||||
$this->setRegExp($options['regexp']);
|
||||
}
|
||||
|
||||
// Stub?
|
||||
if (isset($options['stub'])) {
|
||||
$this->setStub($options['stub']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns PHPCI
|
||||
*
|
||||
* @return PHPCI
|
||||
*/
|
||||
public function getPHPCI()
|
||||
{
|
||||
return $this->phpci;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns Build
|
||||
*
|
||||
* @return Build
|
||||
*/
|
||||
public function getBuild()
|
||||
{
|
||||
return $this->build;
|
||||
}
|
||||
|
||||
/**
|
||||
* Directory Setter
|
||||
*
|
||||
* @param string $directory Configuration Value
|
||||
* @return Phar Fluent Interface
|
||||
*/
|
||||
public function setDirectory($directory)
|
||||
{
|
||||
$this->directory = $directory;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Directory Getter
|
||||
*
|
||||
* @return string Configurated or Default Value
|
||||
*/
|
||||
public function getDirectory()
|
||||
{
|
||||
if (!isset($this->directory)) {
|
||||
$this->setDirectory($this->getPHPCI()->buildPath);
|
||||
}
|
||||
return $this->directory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filename Setter
|
||||
*
|
||||
* @param string $filename Configuration Value
|
||||
* @return Phar Fluent Interface
|
||||
*/
|
||||
public function setFilename($filename)
|
||||
{
|
||||
$this->filename = $filename;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filename Getter
|
||||
*
|
||||
* @return string Configurated or Default Value
|
||||
*/
|
||||
public function getFilename()
|
||||
{
|
||||
if (!isset($this->filename)) {
|
||||
$this->setFilename('build.phar');
|
||||
}
|
||||
return $this->filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* Regular Expression Setter
|
||||
*
|
||||
* @param string $regexp Configuration Value
|
||||
* @return Phar Fluent Interface
|
||||
*/
|
||||
public function setRegExp($regexp)
|
||||
{
|
||||
$this->regexp = $regexp;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Regular Expression Getter
|
||||
*
|
||||
* @return string Configurated or Default Value
|
||||
*/
|
||||
public function getRegExp()
|
||||
{
|
||||
if (!isset($this->regexp)) {
|
||||
$this->setRegExp('/\.php$/');
|
||||
}
|
||||
return $this->regexp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stub Filename Setter
|
||||
*
|
||||
* @param string $stub Configuration Value
|
||||
* @return Phar Fluent Interface
|
||||
*/
|
||||
public function setStub($stub)
|
||||
{
|
||||
$this->stub = $stub;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stub Filename Getter
|
||||
*
|
||||
* @return string Configurated Value
|
||||
*/
|
||||
public function getStub()
|
||||
{
|
||||
return $this->stub;
|
||||
}
|
||||
|
||||
public function getStubContent()
|
||||
{
|
||||
$content = '';
|
||||
$filename = $this->getStub();
|
||||
if ($filename) {
|
||||
$content = file_get_contents($this->getPHPCI()->buildPath . '/' . $this->getStub());
|
||||
}
|
||||
return $content;
|
||||
}
|
||||
|
||||
// Execution
|
||||
public function execute()
|
||||
{
|
||||
$success = false;
|
||||
|
||||
try {
|
||||
|
||||
$phar = new PHPPhar($this->getDirectory() . '/' . $this->getFilename(), 0, $this->getFilename());
|
||||
$phar->buildFromDirectory($this->getPHPCI()->buildPath, $this->getRegExp());
|
||||
|
||||
$stub = $this->getStubContent();
|
||||
if ($stub) {
|
||||
$phar->setStub($stub);
|
||||
}
|
||||
|
||||
$success = true;
|
||||
|
||||
} catch (Exception $e) {
|
||||
$this->getPHPCI()->log('Phar Plugin Internal Error');
|
||||
$this->getPHPCI()->log($e->getMessage());
|
||||
}
|
||||
|
||||
return $success;
|
||||
}
|
||||
}
|
201
Tests/PHPCI/Plugin/PharTest.php
Normal file
201
Tests/PHPCI/Plugin/PharTest.php
Normal file
|
@ -0,0 +1,201 @@
|
|||
<?php
|
||||
namespace PHPCI\Plugin\Tests;
|
||||
|
||||
use PHPCI\Plugin\Phar as PharPlugin;
|
||||
use Phar as PHPPhar;
|
||||
use RuntimeException;
|
||||
|
||||
class PharTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
protected $directory;
|
||||
|
||||
protected function tearDown()
|
||||
{
|
||||
$this->cleanSource();
|
||||
}
|
||||
|
||||
protected function getPlugin(array $options = array())
|
||||
{
|
||||
$build = $this
|
||||
->getMockBuilder('PHPCI\Model\Build')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$phpci = $this
|
||||
->getMockBuilder('PHPCI\Builder')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
return new PharPlugin($phpci, $build, $options);
|
||||
}
|
||||
|
||||
protected function buildTemp()
|
||||
{
|
||||
$directory = tempnam(APPLICATION_PATH . '/Tests/temp', 'source');
|
||||
unlink($directory);
|
||||
return $directory;
|
||||
}
|
||||
|
||||
protected function buildSource()
|
||||
{
|
||||
$directory = $this->buildTemp();
|
||||
mkdir($directory);
|
||||
file_put_contents($directory . '/one.php', '<?php echo "one";');
|
||||
file_put_contents($directory . '/two.php', '<?php echo "two";');
|
||||
mkdir($directory . '/config');
|
||||
file_put_contents($directory . '/config/config.ini', '[config]');
|
||||
mkdir($directory . '/views');
|
||||
file_put_contents($directory . '/views/index.phtml', '<?php echo "hello";');
|
||||
$this->directory = $directory;
|
||||
return $directory;
|
||||
}
|
||||
|
||||
protected function cleanSource()
|
||||
{
|
||||
if ($this->directory) {
|
||||
$filenames = array(
|
||||
'/build.phar',
|
||||
'/stub.php',
|
||||
'/views/index.phtml',
|
||||
'/views',
|
||||
'/config/config.ini',
|
||||
'/config',
|
||||
'/two.php',
|
||||
'/one.php',
|
||||
);
|
||||
foreach ($filenames as $filename) {
|
||||
if (is_dir($this->directory . $filename)) {
|
||||
rmdir($this->directory . $filename);
|
||||
} else if (is_file($this->directory . $filename)) {
|
||||
unlink($this->directory . $filename);
|
||||
}
|
||||
}
|
||||
rmdir($this->directory);
|
||||
$this->directory = null;
|
||||
}
|
||||
}
|
||||
|
||||
protected function checkReadonly()
|
||||
{
|
||||
if (ini_get('phar.readonly')) {
|
||||
$this->markTestSkipped();
|
||||
throw new RuntimeException('Readonly Phar');
|
||||
}
|
||||
}
|
||||
|
||||
public function testPlugin()
|
||||
{
|
||||
$plugin = $this->getPlugin();
|
||||
$this->assertInstanceOf('PHPCI\Plugin', $plugin);
|
||||
$this->assertInstanceOf('PHPCI\Model\Build', $plugin->getBuild());
|
||||
$this->assertInstanceOf('PHPCI\Builder', $plugin->getPHPCI());
|
||||
}
|
||||
|
||||
public function testDirectory()
|
||||
{
|
||||
$plugin = $this->getPlugin();
|
||||
$plugin->getPHPCI()->buildPath = 'foo';
|
||||
$this->assertEquals('foo', $plugin->getDirectory());
|
||||
|
||||
$plugin = $this->getPlugin(array('directory' => 'dirname'));
|
||||
$this->assertEquals('dirname', $plugin->getDirectory());
|
||||
}
|
||||
|
||||
public function testFilename()
|
||||
{
|
||||
$plugin = $this->getPlugin();
|
||||
$this->assertEquals('build.phar', $plugin->getFilename());
|
||||
|
||||
$plugin = $this->getPlugin(array('filename' => 'another.phar'));
|
||||
$this->assertEquals('another.phar', $plugin->getFilename());
|
||||
}
|
||||
|
||||
public function testRegExp()
|
||||
{
|
||||
$plugin = $this->getPlugin();
|
||||
$this->assertEquals('/\.php$/', $plugin->getRegExp());
|
||||
|
||||
$plugin = $this->getPlugin(array('regexp' => '/\.(php|phtml)$/'));
|
||||
$this->assertEquals('/\.(php|phtml)$/', $plugin->getRegExp());
|
||||
}
|
||||
|
||||
public function testStub()
|
||||
{
|
||||
$plugin = $this->getPlugin();
|
||||
$this->assertNull($plugin->getStub());
|
||||
|
||||
$plugin = $this->getPlugin(array('stub' => 'stub.php'));
|
||||
$this->assertEquals('stub.php', $plugin->getStub());
|
||||
}
|
||||
|
||||
public function testExecute()
|
||||
{
|
||||
$this->checkReadonly();
|
||||
|
||||
$plugin = $this->getPlugin();
|
||||
$path = $this->buildSource();
|
||||
$plugin->getPHPCI()->buildPath = $path;
|
||||
|
||||
$this->assertTrue($plugin->execute());
|
||||
|
||||
$this->assertFileExists($path . '/build.phar');
|
||||
PHPPhar::loadPhar($path . '/build.phar');
|
||||
$this->assertFileEquals($path . '/one.php', 'phar://build.phar/one.php');
|
||||
$this->assertFileEquals($path . '/two.php', 'phar://build.phar/two.php');
|
||||
$this->assertFileNotExists('phar://build.phar/config/config.ini');
|
||||
$this->assertFileNotExists('phar://build.phar/views/index.phtml');
|
||||
}
|
||||
|
||||
public function testExecuteRegExp()
|
||||
{
|
||||
$this->checkReadonly();
|
||||
|
||||
$plugin = $this->getPlugin(array('regexp' => '/\.(php|phtml)$/'));
|
||||
$path = $this->buildSource();
|
||||
$plugin->getPHPCI()->buildPath = $path;
|
||||
|
||||
$this->assertTrue($plugin->execute());
|
||||
|
||||
$this->assertFileExists($path . '/build.phar');
|
||||
PHPPhar::loadPhar($path . '/build.phar');
|
||||
$this->assertFileEquals($path . '/one.php', 'phar://build.phar/one.php');
|
||||
$this->assertFileEquals($path . '/two.php', 'phar://build.phar/two.php');
|
||||
$this->assertFileNotExists('phar://build.phar/config/config.ini');
|
||||
$this->assertFileEquals($path . '/views/index.phtml', 'phar://build.phar/views/index.phtml');
|
||||
}
|
||||
|
||||
public function testExecuteStub()
|
||||
{
|
||||
$this->checkReadonly();
|
||||
|
||||
$content = <<<STUB
|
||||
<?php
|
||||
Phar::mapPhar();
|
||||
__HALT_COMPILER(); ?>
|
||||
STUB;
|
||||
|
||||
$path = $this->buildSource();
|
||||
file_put_contents($path . '/stub.php', $content);
|
||||
|
||||
$plugin = $this->getPlugin(array('stub' => 'stub.php'));
|
||||
$plugin->getPHPCI()->buildPath = $path;
|
||||
|
||||
$this->assertTrue($plugin->execute());
|
||||
|
||||
$this->assertFileExists($path . '/build.phar');
|
||||
$phar = new PHPPhar($path . '/build.phar');
|
||||
$this->assertEquals($content, trim($phar->getStub())); // + trim because PHP adds newline char
|
||||
}
|
||||
|
||||
public function testExecuteUnknownDirectory()
|
||||
{
|
||||
$this->checkReadonly();
|
||||
|
||||
$directory = $this->buildTemp();
|
||||
|
||||
$plugin = $this->getPlugin(array('directory' => $directory));
|
||||
$plugin->getPHPCI()->buildPath = $this->buildSource();
|
||||
|
||||
$this->assertFalse($plugin->execute());
|
||||
}
|
||||
}
|
2
Tests/temp/.gitignore
vendored
Normal file
2
Tests/temp/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
*
|
||||
!.gitignore
|
Loading…
Reference in a new issue