mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Refactored ManifestBuilder for better testability
Added initial ManifestBuilderTest git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@51682 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
7eea3c091f
commit
df474f0467
@ -61,7 +61,6 @@ class ManifestBuilder {
|
|||||||
'HTML',
|
'HTML',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the manifest file should be regenerated
|
* Returns true if the manifest file should be regenerated
|
||||||
*
|
*
|
||||||
@ -85,11 +84,41 @@ class ManifestBuilder {
|
|||||||
* Generates a new manifest file and saves it to {@link MANIFEST_FILE}
|
* Generates a new manifest file and saves it to {@link MANIFEST_FILE}
|
||||||
*/
|
*/
|
||||||
static function compileManifest() {
|
static function compileManifest() {
|
||||||
|
|
||||||
// Config manifest
|
// Config manifest
|
||||||
$baseDir = dirname($_SERVER['SCRIPT_FILENAME']) . "/..";
|
$baseDir = dirname($_SERVER['SCRIPT_FILENAME']) . "/..";
|
||||||
$baseDir = ereg_replace("/[^/]+/\\.\\.", "", $baseDir);
|
$baseDir = ereg_replace("/[^/]+/\\.\\.", "", $baseDir);
|
||||||
|
|
||||||
|
$manifest = self::generate_php_file(self::get_manifest_info($baseDir));
|
||||||
|
|
||||||
|
if($fh = fopen(MANIFEST_FILE, "w")) {
|
||||||
|
fwrite($fh, $manifest);
|
||||||
|
fclose($fh);
|
||||||
|
} else {
|
||||||
|
die("Cannot write manifest file! Check permissions of " .
|
||||||
|
MANIFEST_FILE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turn an array produced by get_manifest_info() into the content of the manifest PHP include
|
||||||
|
*/
|
||||||
|
static function generate_php_file($manifestInfo) {
|
||||||
|
$output = "<?php\n";
|
||||||
|
|
||||||
|
foreach($manifestInfo['globals'] as $globalName => $globalVal) {
|
||||||
|
$output .= "\$$globalName = " . var_export($globalVal, true) . ";\n\n";
|
||||||
|
}
|
||||||
|
foreach($manifestInfo['require_once'] as $requireItem) {
|
||||||
|
$output .= "require_once(\"$requireItem\");\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an array containing information for the manifest
|
||||||
|
*/
|
||||||
|
static function get_manifest_info($baseDir) {
|
||||||
// locate and include the exclude files
|
// locate and include the exclude files
|
||||||
$topLevel = scandir($baseDir);
|
$topLevel = scandir($baseDir);
|
||||||
foreach($topLevel as $file) {
|
foreach($topLevel as $file) {
|
||||||
@ -125,15 +154,12 @@ class ManifestBuilder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$manifestInfo["globals"]["_CLASS_MANIFEST"] = $classManifest;
|
||||||
$manifest = "\$_CLASS_MANIFEST = " . var_export($classManifest, true) .
|
|
||||||
";\n";
|
|
||||||
|
|
||||||
// Load the manifest in, so that the autoloader works
|
// Load the manifest in, so that the autoloader works
|
||||||
global $_CLASS_MANIFEST;
|
global $_CLASS_MANIFEST;
|
||||||
$_CLASS_MANIFEST = $classManifest;
|
$_CLASS_MANIFEST = $classManifest;
|
||||||
|
|
||||||
|
|
||||||
// _config.php manifest
|
// _config.php manifest
|
||||||
global $databaseConfig;
|
global $databaseConfig;
|
||||||
$topLevel = scandir($baseDir);
|
$topLevel = scandir($baseDir);
|
||||||
@ -142,7 +168,7 @@ class ManifestBuilder {
|
|||||||
if(@is_dir("$baseDir/$filename/") &&
|
if(@is_dir("$baseDir/$filename/") &&
|
||||||
file_exists("$baseDir/$filename/_config.php") &&
|
file_exists("$baseDir/$filename/_config.php") &&
|
||||||
!file_exists("$baseDir/$filename/_manifest_exclude")) {
|
!file_exists("$baseDir/$filename/_manifest_exclude")) {
|
||||||
$manifest .= "require_once(\"$baseDir/$filename/_config.php\");\n";
|
$manifestInfo["require_once"][] = "$baseDir/$filename/_config.php";
|
||||||
// Include this so that we're set up for connecting to the database
|
// Include this so that we're set up for connecting to the database
|
||||||
// in the rest of the manifest builder
|
// in the rest of the manifest builder
|
||||||
require_once("$baseDir/$filename/_config.php");
|
require_once("$baseDir/$filename/_config.php");
|
||||||
@ -179,28 +205,20 @@ class ManifestBuilder {
|
|||||||
// Ensure that any custom templates get favoured
|
// Ensure that any custom templates get favoured
|
||||||
ManifestBuilder::getTemplateManifest($baseDir, project(), $templateManifest, $cssManifest);
|
ManifestBuilder::getTemplateManifest($baseDir, project(), $templateManifest, $cssManifest);
|
||||||
|
|
||||||
$manifest .= "\$_TEMPLATE_MANIFEST = " . var_export($templateManifest, true) . ";\n";
|
$manifestInfo["globals"]["_TEMPLATE_MANIFEST"] = $templateManifest;
|
||||||
$manifest .= "\$_CSS_MANIFEST = " . var_export($cssManifest, true) . ";\n";
|
$manifestInfo["globals"]["_CSS_MANIFEST"] = $cssManifest;
|
||||||
|
|
||||||
DB::connect($databaseConfig);
|
DB::connect($databaseConfig);
|
||||||
|
|
||||||
// Database manifest
|
// Database manifest
|
||||||
$allClasses = ManifestBuilder::allClasses($classManifest);
|
$allClasses = ManifestBuilder::allClasses($classManifest);
|
||||||
|
|
||||||
$manifest .= "\$_ALL_CLASSES = " . var_export($allClasses, true) . ";\n";
|
$manifestInfo["globals"]["_ALL_CLASSES"] = $allClasses;
|
||||||
|
|
||||||
global $_ALL_CLASSES;
|
global $_ALL_CLASSES;
|
||||||
$_ALL_CLASSES = $allClasses;
|
$_ALL_CLASSES = $allClasses;
|
||||||
|
|
||||||
// Write manifest to disk
|
return $manifestInfo;
|
||||||
$manifest = "<?php\n$manifest\n?>";
|
|
||||||
|
|
||||||
if($fh = fopen(MANIFEST_FILE, "w")) {
|
|
||||||
fwrite($fh, $manifest);
|
|
||||||
fclose($fh);
|
|
||||||
} else {
|
|
||||||
die("Cannot write manifest file! Check permissions of " .
|
|
||||||
MANIFEST_FILE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -309,6 +327,9 @@ class ManifestBuilder {
|
|||||||
* information.
|
* information.
|
||||||
*/
|
*/
|
||||||
private static function allClasses($classManifest) {
|
private static function allClasses($classManifest) {
|
||||||
|
self::$classArray = array();
|
||||||
|
self::$extendsArray = array();
|
||||||
|
self::$implementsArray = array();
|
||||||
|
|
||||||
// Include everything, so we actually have *all* classes
|
// Include everything, so we actually have *all* classes
|
||||||
foreach($classManifest as $file) {
|
foreach($classManifest as $file) {
|
||||||
|
124
tests/ManifestBuilderTest.php
Normal file
124
tests/ManifestBuilderTest.php
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class ManifestBuilderTest extends SapphireTest {
|
||||||
|
function testManifest() {
|
||||||
|
$baseFolder = TEMP_FOLDER . '/manifest-test';
|
||||||
|
|
||||||
|
global $_CLASS_MANIFEST, $project;
|
||||||
|
$originalClassManifest = $_CLASS_MANIFEST;
|
||||||
|
$originalProject = $project;
|
||||||
|
|
||||||
|
$manifestInfo = ManifestBuilder::get_manifest_info($baseFolder);
|
||||||
|
Debug::show($manifestInfo);
|
||||||
|
|
||||||
|
$this->assertEquals("$baseFolder/sapphire/MyClass.php", $manifestInfo['globals']['_CLASS_MANIFEST']['MyClass']);
|
||||||
|
$this->assertEquals("$baseFolder/sapphire/subdir/SubDirClass.php", $manifestInfo['globals']['_CLASS_MANIFEST']['SubDirClass']);
|
||||||
|
$this->assertNotContains('OtherFile', array_keys($manifestInfo['globals']['_CLASS_MANIFEST']));
|
||||||
|
|
||||||
|
global $_CLASS_MANIFEST, $project;
|
||||||
|
$project = $originalProject;
|
||||||
|
$_CLASS_MANIFEST = $originalClassManifest;
|
||||||
|
|
||||||
|
|
||||||
|
// Check aspects of PHP file
|
||||||
|
$manifest = ManifestBuilder::generate_php_file($manifestInfo);
|
||||||
|
// Debug::message($manifest);
|
||||||
|
$this->assertEquals(1, preg_match('/^<\?php/', $manifest), "Starts with <?php");
|
||||||
|
$this->assertEquals(1, preg_match('/\$_CLASS_MANIFEST\s*=\s*array/m', $manifest), "\$_CLASS_MANIFEST exists");
|
||||||
|
$this->assertEquals(1, preg_match('/\$_TEMPLATE_MANIFEST\s*=\s*array/m', $manifest), "\$_TEMPLATE_MANIFEST exists");
|
||||||
|
$this->assertEquals(1, preg_match('/\$_CSS_MANIFEST\s*=\s*array/m', $manifest), "\$_CSS_MANIFEST exists");
|
||||||
|
$this->assertEquals(1, preg_match('/\$_ALL_CLASSES\s*=\s*array/m', $manifest), "\$_ALL_CLASSES exists");
|
||||||
|
|
||||||
|
$this->assertEquals(1, preg_match('/require_once\("[^"]+rahbeast\/_config.php"\);/i', $manifest), "rahbeast/_config.php included");
|
||||||
|
$this->assertEquals(1, preg_match('/require_once\("[^"]+sapphire\/_config.php"\);/i', $manifest), "sapphire/_config.php included");
|
||||||
|
}
|
||||||
|
|
||||||
|
function setUp() {
|
||||||
|
$filesystemFixture = array(
|
||||||
|
'rahbeast/',
|
||||||
|
'rahbeast/_config.php' => <<<PHP
|
||||||
|
<?php
|
||||||
|
|
||||||
|
global \$project;
|
||||||
|
\$project = 'rahbeast';
|
||||||
|
|
||||||
|
PHP
|
||||||
|
,
|
||||||
|
'sapphire/',
|
||||||
|
'sapphire/_config.php',
|
||||||
|
'sapphire/MyClass.php' => <<<PHP
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class MyClass extends Object {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class MyClass_Other extends DataObject implements Something {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class MyClass_Final extends DataObject implements Something, Else {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
PHP
|
||||||
|
,
|
||||||
|
'sapphire/subdir/',
|
||||||
|
'sapphire/subdir/SubDirClass.php' => <<<PHP
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class SubDirClass extends Something implements Else, Other {
|
||||||
|
|
||||||
|
}
|
||||||
|
PHP
|
||||||
|
,
|
||||||
|
'sapphire/subdir/SubDirClass.php',
|
||||||
|
'otherdir/',
|
||||||
|
'otherdir/OtherFile.php' => <<<PHP
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class OtherFile extends Object {
|
||||||
|
|
||||||
|
}
|
||||||
|
PHP
|
||||||
|
,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Build the fixture specified above
|
||||||
|
$baseFolder = TEMP_FOLDER . '/manifest-test/';
|
||||||
|
|
||||||
|
if(file_exists($baseFolder)) Filesystem::removeFolder($baseFolder);
|
||||||
|
mkdir($baseFolder);
|
||||||
|
|
||||||
|
foreach($filesystemFixture as $i => $item) {
|
||||||
|
if(is_numeric($i)) {
|
||||||
|
$itemContent = null;
|
||||||
|
} else {
|
||||||
|
$itemContent = $item;
|
||||||
|
$item = $i;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Directory
|
||||||
|
if(substr($item,-1) == '/') {
|
||||||
|
mkdir($baseFolder . $item);
|
||||||
|
} else {
|
||||||
|
touch($baseFolder . $item);
|
||||||
|
if($itemContent) {
|
||||||
|
$fh = fopen($baseFolder . $item, 'w');
|
||||||
|
fwrite($fh, $itemContent);
|
||||||
|
fclose($fh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function tearDown() {
|
||||||
|
// Kill the folder after we're done
|
||||||
|
$baseFolder = TEMP_FOLDER . '/manifest-test/';
|
||||||
|
Filesystem::removeFolder($baseFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
Loading…
Reference in New Issue
Block a user