API Allow empty arraylists to be typed (#8866)

* API Allow empty arraylists to be typed

* PHPCBF fixes
This commit is contained in:
Damian Mooyman 2019-03-20 11:46:35 +13:00 committed by Aaron Carlino
parent 0b524464cd
commit 6b450395ce
5 changed files with 51 additions and 16 deletions

View File

@ -2,13 +2,13 @@
namespace SilverStripe\ORM;
use SilverStripe\Dev\Debug;
use SilverStripe\View\ArrayData;
use SilverStripe\View\ViewableData;
use ArrayIterator;
use InvalidArgumentException;
use LogicException;
use SilverStripe\Dev\Debug;
use SilverStripe\Dev\Deprecation;
use SilverStripe\View\ArrayData;
use SilverStripe\View\ViewableData;
/**
* A list object that wraps around an array of objects or arrays.
@ -44,6 +44,13 @@ class ArrayList extends ViewableData implements SS_List, Filterable, Sortable, L
parent::__construct();
}
/**
* Underlying type class for this list
*
* @var string
*/
protected $dataClass = null;
/**
* Return the class of items in this list, by looking at the first item inside it.
*
@ -51,12 +58,27 @@ class ArrayList extends ViewableData implements SS_List, Filterable, Sortable, L
*/
public function dataClass()
{
if ($this->dataClass) {
return $this->dataClass;
}
if (count($this->items) > 0) {
return get_class($this->items[0]);
}
return null;
}
/**
* Hint this list to a specific type
*
* @param string $class
* @return $this
*/
public function setDataClass($class)
{
$this->dataClass = $class;
return $this;
}
/**
* Return the number of items in this list
*
@ -257,6 +279,7 @@ class ArrayList extends ViewableData implements SS_List, Filterable, Sortable, L
* field. This is especially useful when combining lists.
*
* @param string $field
* @return $this
*/
public function removeDuplicates($field = 'ID')
{

View File

@ -58,9 +58,9 @@ class CmsUiContext implements Context
$timeoutMs = $this->getMainContext()->getAjaxTimeout();
$this->getSession()->wait(
$timeoutMs,
"(".
"document.getElementsByClassName('cms-content-loading-overlay').length +".
"document.getElementsByClassName('cms-loading-container').length".
"(" .
"document.getElementsByClassName('cms-content-loading-overlay').length +" .
"document.getElementsByClassName('cms-loading-container').length" .
") == 0"
);
}

View File

@ -36,7 +36,7 @@ class SimpleResourceURLGeneratorTest extends SapphireTest
__DIR__ . '/SimpleResourceURLGeneratorTest/_fakewebroot/basemodule/client/file.js'
);
$this->assertEquals(
'/'. RESOURCES_DIR . '/basemodule/client/file.js?m=' . $mtime,
'/' . RESOURCES_DIR . '/basemodule/client/file.js?m=' . $mtime,
$generator->urlForResource('basemodule/client/file.js')
);
}
@ -49,7 +49,7 @@ class SimpleResourceURLGeneratorTest extends SapphireTest
__DIR__ . '/SimpleResourceURLGeneratorTest/_fakewebroot/vendor/silverstripe/mymodule/client/style.css'
);
$this->assertEquals(
'/'. RESOURCES_DIR . '/vendor/silverstripe/mymodule/client/style.css?m=' . $mtime,
'/' . RESOURCES_DIR . '/vendor/silverstripe/mymodule/client/style.css?m=' . $mtime,
$generator->urlForResource('vendor/silverstripe/mymodule/client/style.css')
);
}
@ -72,7 +72,7 @@ class SimpleResourceURLGeneratorTest extends SapphireTest
);
$this->assertEquals(
'/'. RESOURCES_DIR . '/basemodule/client/file.js?m=' . $mtime,
'/' . RESOURCES_DIR . '/basemodule/client/file.js?m=' . $mtime,
$generator->urlForResource('basemodule/client/file.js')
);
}
@ -89,7 +89,7 @@ class SimpleResourceURLGeneratorTest extends SapphireTest
__DIR__ . '/SimpleResourceURLGeneratorTest/_fakewebroot/vendor/silverstripe/mymodule/client/style.css'
);
$this->assertEquals(
'/'. RESOURCES_DIR . '/vendor/silverstripe/mymodule/client/style.css?m=' . $mtime,
'/' . RESOURCES_DIR . '/vendor/silverstripe/mymodule/client/style.css?m=' . $mtime,
$generator->urlForResource($module->getResource('client/style.css'))
);
}

View File

@ -42,7 +42,7 @@ class ModuleResourceTest extends SapphireTest
$resource->getPath()
);
$this->assertStringStartsWith(
'/basefolder/'. RESOURCES_DIR . '/module/client/script.js?m=',
'/basefolder/' . RESOURCES_DIR . '/module/client/script.js?m=',
$resource->getURL()
);
}
@ -60,7 +60,7 @@ class ModuleResourceTest extends SapphireTest
$resource->getPath()
);
$this->assertStringStartsWith(
'/basefolder/'. RESOURCES_DIR . '/vendor/silverstripe/modulec/client/script.js?m=',
'/basefolder/' . RESOURCES_DIR . '/vendor/silverstripe/modulec/client/script.js?m=',
$resource->getURL()
);
}
@ -80,7 +80,7 @@ class ModuleResourceTest extends SapphireTest
$resource->getPath()
);
$this->assertStringStartsWith(
'/basefolder/'. RESOURCES_DIR . '/vendor/silverstripe/modulec/client/script.js?m=',
'/basefolder/' . RESOURCES_DIR . '/vendor/silverstripe/modulec/client/script.js?m=',
$resource->getURL()
);
}

View File

@ -2,12 +2,11 @@
namespace SilverStripe\ORM\Tests;
use SilverStripe\Dev\Deprecation;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\Filterable;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\View\ArrayData;
use SilverStripe\Dev\Deprecation;
use stdClass;
class ArrayListTest extends SapphireTest
@ -739,6 +738,7 @@ class ArrayListTest extends SapphireTest
// This call will trigger a fatal error if there are issues with circular dependencies
$items->sort('Sort');
}
/**
* $list->filter('Name', 'bob'); // only bob in the list
*/
@ -1224,4 +1224,16 @@ class ArrayListTest extends SapphireTest
$element = $list->byID(1);
$this->assertNull($element);
}
public function testDataClass()
{
$list = new ArrayList([
new DataObject(['Title' => 'one']),
]);
$this->assertEquals(DataObject::class, $list->dataClass());
$list->pop();
$this->assertNull($list->dataClass());
$list->setDataClass(DataObject::class);
$this->assertEquals(DataObject::class, $list->dataClass());
}
}