mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Merge branch '4.6' into 4
This commit is contained in:
commit
4c3a5441b2
@ -66,6 +66,20 @@ class ModuleManifest
|
|||||||
*/
|
*/
|
||||||
private static $project = null;
|
private static $project = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs and initialises a new configuration object, either loading
|
||||||
|
* from the cache or re-scanning for classes.
|
||||||
|
*
|
||||||
|
* @param string $base The project base path.
|
||||||
|
* @param CacheFactory $cacheFactory Cache factory to use
|
||||||
|
*/
|
||||||
|
public function __construct($base, CacheFactory $cacheFactory = null)
|
||||||
|
{
|
||||||
|
$this->base = $base;
|
||||||
|
$this->cacheKey = sha1($base) . '_modules';
|
||||||
|
$this->cacheFactory = $cacheFactory;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a path as a module
|
* Adds a path as a module
|
||||||
*
|
*
|
||||||
@ -104,20 +118,6 @@ class ModuleManifest
|
|||||||
return !empty($module);
|
return !empty($module);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs and initialises a new configuration object, either loading
|
|
||||||
* from the cache or re-scanning for classes.
|
|
||||||
*
|
|
||||||
* @param string $base The project base path.
|
|
||||||
* @param CacheFactory $cacheFactory Cache factory to use
|
|
||||||
*/
|
|
||||||
public function __construct($base, CacheFactory $cacheFactory = null)
|
|
||||||
{
|
|
||||||
$this->base = $base;
|
|
||||||
$this->cacheKey = sha1($base) . '_modules';
|
|
||||||
$this->cacheFactory = $cacheFactory;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param bool $includeTests
|
* @param bool $includeTests
|
||||||
* @param bool $forceRegen Force the manifest to be regenerated.
|
* @param bool $forceRegen Force the manifest to be regenerated.
|
||||||
@ -175,7 +175,7 @@ class ModuleManifest
|
|||||||
if ($finder->isDirectoryModule($basename, $pathname, $depth)) {
|
if ($finder->isDirectoryModule($basename, $pathname, $depth)) {
|
||||||
$this->addModule($pathname);
|
$this->addModule($pathname);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
]);
|
]);
|
||||||
$finder->find($this->base);
|
$finder->find($this->base);
|
||||||
|
|
||||||
@ -226,20 +226,18 @@ class ModuleManifest
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Sort modules sorted by priority
|
* Sort modules sorted by priority
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
*/
|
||||||
public function sort()
|
public function sort()
|
||||||
{
|
{
|
||||||
$order = static::config()->uninherited('module_priority');
|
$order = static::config()->uninherited('module_priority');
|
||||||
$project = static::config()->get('project');
|
$project = static::config()->get('project');
|
||||||
|
|
||||||
/* @var PrioritySorter $sorter */
|
/** @var PrioritySorter $sorter */
|
||||||
$sorter = Injector::inst()->createWithArgs(
|
$sorter = Injector::inst()->createWithArgs(
|
||||||
PrioritySorter::class . '.modulesorter',
|
PrioritySorter::class . '.modulesorter',
|
||||||
[
|
[
|
||||||
$this->modules,
|
$this->modules,
|
||||||
$order ?: []
|
$order ?: [],
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -269,13 +267,28 @@ class ModuleManifest
|
|||||||
|
|
||||||
// Find based on loaded modules
|
// Find based on loaded modules
|
||||||
$modules = ModuleLoader::inst()->getManifest()->getModules();
|
$modules = ModuleLoader::inst()->getManifest()->getModules();
|
||||||
|
|
||||||
foreach ($modules as $module) {
|
foreach ($modules as $module) {
|
||||||
// Check if path is in module
|
// Check if path is in module
|
||||||
$realPath = realpath($module->getPath());
|
$modulePath = realpath($module->getPath());
|
||||||
if ($realPath && stripos($path, $realPath) !== 0) {
|
// if there is a real path
|
||||||
continue;
|
if ($modulePath) {
|
||||||
|
// we remove separator to ensure that we are comparing fairly
|
||||||
|
$modulePath = rtrim($modulePath, DIRECTORY_SEPARATOR);
|
||||||
|
$path = rtrim($path, DIRECTORY_SEPARATOR);
|
||||||
|
// if the paths are not the same
|
||||||
|
if ($modulePath !== $path) {
|
||||||
|
//add separator to avoid mixing up, for example:
|
||||||
|
//silverstripe/framework and silverstripe/framework-extension
|
||||||
|
$modulePath .= DIRECTORY_SEPARATOR;
|
||||||
|
$path .= DIRECTORY_SEPARATOR;
|
||||||
|
// if the module path is not the same as the start of the module path being tested
|
||||||
|
if (stripos($path, $modulePath) !== 0) {
|
||||||
|
// then we need to test the next module
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this is the root module, keep looking in case there is a more specific module later
|
// If this is the root module, keep looking in case there is a more specific module later
|
||||||
if (empty($module->getRelativePath())) {
|
if (empty($module->getRelativePath())) {
|
||||||
$rootModule = $module;
|
$rootModule = $module;
|
||||||
|
@ -1025,7 +1025,8 @@ class DataList extends ViewableData implements SS_List, Filterable, Sortable, Li
|
|||||||
*/
|
*/
|
||||||
public function column($colName = "ID")
|
public function column($colName = "ID")
|
||||||
{
|
{
|
||||||
return $this->dataQuery->distinct(false)->column($colName);
|
$dataQuery = clone $this->dataQuery;
|
||||||
|
return $dataQuery->distinct(false)->column($colName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,12 +33,18 @@ class ArrayData extends ViewableData
|
|||||||
{
|
{
|
||||||
if (is_object($value)) {
|
if (is_object($value)) {
|
||||||
$this->array = get_object_vars($value);
|
$this->array = get_object_vars($value);
|
||||||
} elseif (ArrayLib::is_associative($value)) {
|
} elseif (is_array($value)) {
|
||||||
$this->array = $value;
|
if (ArrayLib::is_associative($value)) {
|
||||||
} elseif (is_array($value) && count($value) === 0) {
|
$this->array = $value;
|
||||||
$this->array = [];
|
} elseif (count($value) === 0) {
|
||||||
|
$this->array = [];
|
||||||
|
} else {
|
||||||
|
$message = 'ArrayData constructor expects an object or associative array,
|
||||||
|
enumerated array passed instead. Did you mean to use ArrayList?';
|
||||||
|
throw new InvalidArgumentException($message);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$message = 'Parameter to ArrayData constructor needs to be an object or associative array';
|
$message = 'ArrayData constructor expects an object or associative array';
|
||||||
throw new InvalidArgumentException($message);
|
throw new InvalidArgumentException($message);
|
||||||
}
|
}
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
|
@ -76,6 +76,7 @@ class ClassManifestTest extends SapphireTest
|
|||||||
'classd' => "{$this->base}/module/classes/ClassD.php",
|
'classd' => "{$this->base}/module/classes/ClassD.php",
|
||||||
'classe' => "{$this->base}/module/classes/ClassE.php",
|
'classe' => "{$this->base}/module/classes/ClassE.php",
|
||||||
'vendorclassa' => "{$this->base}/vendor/silverstripe/modulec/code/VendorClassA.php",
|
'vendorclassa' => "{$this->base}/vendor/silverstripe/modulec/code/VendorClassA.php",
|
||||||
|
'vendorclassx' => "{$this->base}/vendor/silverstripe/modulecbetter/code/VendorClassX.php",
|
||||||
];
|
];
|
||||||
$this->assertEquals($expect, $this->manifest->getClasses());
|
$this->assertEquals($expect, $this->manifest->getClasses());
|
||||||
}
|
}
|
||||||
@ -90,6 +91,7 @@ class ClassManifestTest extends SapphireTest
|
|||||||
'classd' => 'ClassD',
|
'classd' => 'ClassD',
|
||||||
'classe' => 'ClassE',
|
'classe' => 'ClassE',
|
||||||
'vendorclassa' => 'VendorClassA',
|
'vendorclassa' => 'VendorClassA',
|
||||||
|
'vendorclassx' => 'VendorClassX',
|
||||||
],
|
],
|
||||||
$this->manifest->getClassNames()
|
$this->manifest->getClassNames()
|
||||||
);
|
);
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace SilverStripe\Core\Tests\Manifest;
|
namespace SilverStripe\Core\Tests\Manifest;
|
||||||
|
|
||||||
|
use SilverStripe\Core\Manifest\ModuleLoader;
|
||||||
use SilverStripe\Core\Manifest\ModuleManifest;
|
use SilverStripe\Core\Manifest\ModuleManifest;
|
||||||
use SilverStripe\Dev\SapphireTest;
|
use SilverStripe\Dev\SapphireTest;
|
||||||
|
|
||||||
@ -34,6 +35,7 @@ class ModuleManifestTest extends SapphireTest
|
|||||||
'module',
|
'module',
|
||||||
'silverstripe/awesome-module',
|
'silverstripe/awesome-module',
|
||||||
'silverstripe/modulec',
|
'silverstripe/modulec',
|
||||||
|
'silverstripe/modulecbetter',
|
||||||
'silverstripe/root-module',
|
'silverstripe/root-module',
|
||||||
],
|
],
|
||||||
array_keys($modules)
|
array_keys($modules)
|
||||||
@ -105,4 +107,37 @@ class ModuleManifestTest extends SapphireTest
|
|||||||
$module->getResource('composer.json')->getRelativePath()
|
$module->getResource('composer.json')->getRelativePath()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function providerTestGetModuleByPath()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
['vendor/silverstripe/modulec/code/VendorClassA.php', 'silverstripe/modulec'],
|
||||||
|
['vendor/silverstripe/modulecbetter/code/VendorClassX.php', 'silverstripe/modulecbetter'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerTestGetModuleByPath
|
||||||
|
* @param string $path
|
||||||
|
* @param string $expectedModuleName
|
||||||
|
*/
|
||||||
|
public function testGetModuleByPath($path, $expectedModuleName)
|
||||||
|
{
|
||||||
|
// important - load the manifest that we are working with to the ModuleLoader
|
||||||
|
ModuleLoader::inst()->pushManifest($this->manifest);
|
||||||
|
|
||||||
|
// work out variables
|
||||||
|
$path = $this->base . '/' . $path;
|
||||||
|
$module = $this->manifest->getModuleByPath($path);
|
||||||
|
$actualModuleName = $module->getName();
|
||||||
|
|
||||||
|
// it is testing time!
|
||||||
|
$this->assertEquals($expectedModuleName, $actualModuleName);
|
||||||
|
|
||||||
|
// bye bye bogus manifest
|
||||||
|
ModuleLoader::inst()->popManifest();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
Name: blankconfigmodulecbetter
|
||||||
|
---
|
||||||
|
{}
|
@ -0,0 +1 @@
|
|||||||
|
/* script.js */
|
@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class VendorClassX
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"name": "silverstripe/modulecbetter",
|
||||||
|
"description": "dummy test module",
|
||||||
|
"require": {}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user