From 8b9f41d4f444b281aa86402c00e8babd68a035a3 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Wed, 3 May 2017 09:54:14 +1200 Subject: [PATCH 1/2] BUG Fix ApcuCache and MemCache namespace --- src/Core/Cache/ApcuCacheFactory.php | 10 ++- src/Core/Cache/DefaultCacheFactory.php | 3 +- src/Core/Cache/MemcachedCacheFactory.php | 12 ++- tests/php/Core/Cache/CacheTest.php | 88 ++++++++++++++++++++ tests/php/Core/Cache/CacheTest/MockCache.php | 25 ++++++ 5 files changed, 130 insertions(+), 8 deletions(-) create mode 100644 tests/php/Core/Cache/CacheTest.php create mode 100644 tests/php/Core/Cache/CacheTest/MockCache.php diff --git a/src/Core/Cache/ApcuCacheFactory.php b/src/Core/Cache/ApcuCacheFactory.php index f697b67d8..b1f0e9ef5 100644 --- a/src/Core/Cache/ApcuCacheFactory.php +++ b/src/Core/Cache/ApcuCacheFactory.php @@ -27,9 +27,13 @@ class ApcuCacheFactory implements CacheFactory */ public function create($service, array $params = array()) { - return Injector::inst()->create(ApcuCache::class, false, [ - (isset($args['namespace'])) ? $args['namespace'] : '', - (isset($args['defaultLifetime'])) ? $args['defaultLifetime'] : 0, + $namespace = isset($params['namespace']) + ? $params['namespace'] . '_' . md5(BASE_PATH) + : md5(BASE_PATH); + $defaultLifetime = isset($params['defaultLifetime']) ? $params['defaultLifetime'] : 0; + return Injector::inst()->createWithArgs(ApcuCache::class, [ + $namespace, + $defaultLifetime, $this->version ]); } diff --git a/src/Core/Cache/DefaultCacheFactory.php b/src/Core/Cache/DefaultCacheFactory.php index 963fba709..aa2dc80db 100644 --- a/src/Core/Cache/DefaultCacheFactory.php +++ b/src/Core/Cache/DefaultCacheFactory.php @@ -71,7 +71,8 @@ class DefaultCacheFactory implements CacheFactory } // Chain this cache with ApcuCache - $apcu = $this->createCache(ApcuCache::class, [$namespace, (int) $defaultLifetime / 5, $version]); + $apcuNamespace = $namespace . ($namespace ? '_' : '') . md5(BASE_PATH); + $apcu = $this->createCache(ApcuCache::class, [$apcuNamespace, (int) $defaultLifetime / 5, $version]); return $this->createCache(ChainCache::class, [[$apcu, $fs]]); } diff --git a/src/Core/Cache/MemcachedCacheFactory.php b/src/Core/Cache/MemcachedCacheFactory.php index 37269da02..9c161e49b 100644 --- a/src/Core/Cache/MemcachedCacheFactory.php +++ b/src/Core/Cache/MemcachedCacheFactory.php @@ -17,7 +17,7 @@ class MemcachedCacheFactory implements CacheFactory /** * @param Memcached $memcachedClient */ - public function __construct(Memcached $memcachedClient) + public function __construct(Memcached $memcachedClient = null) { $this->memcachedClient = $memcachedClient; } @@ -27,10 +27,14 @@ class MemcachedCacheFactory implements CacheFactory */ public function create($service, array $params = array()) { - return Injector::inst()->create(MemcachedCache::class, false, [ + $namespace = isset($params['namespace']) + ? $params['namespace'] . '_' . md5(BASE_PATH) + : md5(BASE_PATH); + $defaultLifetime = isset($params['defaultLifetime']) ? $params['defaultLifetime'] : 0; + return Injector::inst()->createWithArgs(MemcachedCache::class, [ $this->memcachedClient, - (isset($args['namespace'])) ? $args['namespace'] : '', - (isset($args['defaultLifetime'])) ? $args['defaultLifetime'] : 0 + $namespace, + $defaultLifetime ]); } } diff --git a/tests/php/Core/Cache/CacheTest.php b/tests/php/Core/Cache/CacheTest.php new file mode 100644 index 000000000..393870297 --- /dev/null +++ b/tests/php/Core/Cache/CacheTest.php @@ -0,0 +1,88 @@ +set( + Injector::class, + ApcuCacheFactory::class, + [ + 'constructor' => [ 'version' => 4400 ] + ] + ) + ->set( + Injector::class, + CacheInterface::class . '.TestApcuCache', + [ + 'factory' => ApcuCacheFactory::class, + 'constructor' => [ + 'namespace' => 'TestApcuCache', + 'defaultLifetime' => 2600, + ], + ] + ) + ->set( + Injector::class, + CacheInterface::class . '.TestMemcache', + [ + 'factory' => MemcachedCacheFactory::class, + 'constructor' => [ + 'namespace' => 'TestMemCache', + 'defaultLifetime' => 5600, + ], + ] + ) + ->set(Injector::class, ApcuCache::class, MockCache::class) + ->set(Injector::class, MemcachedCache::class, MockCache::class); + } + + public function testApcuCacheFactory() + { + $cache = Injector::inst()->get(CacheInterface::class .'.TestApcuCache'); + $this->assertInstanceOf( + MockCache::class, + $cache + ); + $this->assertEquals( + [ + 'TestApcuCache_'.md5(BASE_PATH), + 2600, + 4400 + ], + $cache->getArgs() + ); + } + + public function testMemCacheFactory() + { + $cache = Injector::inst()->get(CacheInterface::class .'.TestMemcache'); + $this->assertInstanceOf( + MockCache::class, + $cache + ); + $this->assertEquals( + [ + null, + 'TestMemCache_'.md5(BASE_PATH), + 5600 + ], + $cache->getArgs() + ); + } +} diff --git a/tests/php/Core/Cache/CacheTest/MockCache.php b/tests/php/Core/Cache/CacheTest/MockCache.php new file mode 100644 index 000000000..ce9cd84ae --- /dev/null +++ b/tests/php/Core/Cache/CacheTest/MockCache.php @@ -0,0 +1,25 @@ +args = func_get_args(); + } + + /** + * Get constructor args + * + * @return array + */ + public function getArgs() + { + return $this->args; + } +} From 1f8de20ce755e75b3cd54fe2663e6630f6470f37 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Thu, 4 May 2017 12:52:40 +1200 Subject: [PATCH 2/2] Fix FormSchemaTest.php linting issues --- tests/php/Forms/FormSchemaTest.php | 379 +----------------- .../FormSchemaTest/testGetNestedSchema.json | 181 +++++++++ .../Forms/FormSchemaTest/testGetSchema.json | 37 ++ .../FormSchemaTest/testSchemaValidation.json | 129 ++++++ 4 files changed, 354 insertions(+), 372 deletions(-) create mode 100644 tests/php/Forms/FormSchemaTest/testGetNestedSchema.json create mode 100644 tests/php/Forms/FormSchemaTest/testGetSchema.json create mode 100644 tests/php/Forms/FormSchemaTest/testSchemaValidation.json diff --git a/tests/php/Forms/FormSchemaTest.php b/tests/php/Forms/FormSchemaTest.php index 7bd29161c..c0fb35c72 100644 --- a/tests/php/Forms/FormSchemaTest.php +++ b/tests/php/Forms/FormSchemaTest.php @@ -7,7 +7,6 @@ use SilverStripe\Forms\DateField; use SilverStripe\Forms\NumericField; use SilverStripe\Forms\Schema\FormSchema; use SilverStripe\Dev\SapphireTest; -use SilverStripe\Control\Controller; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\Form; use SilverStripe\Forms\TextField; @@ -22,47 +21,11 @@ class FormSchemaTest extends SapphireTest { $form = new Form(null, 'TestForm', new FieldList(), new FieldList()); $formSchema = new FormSchema(); - $expected = [ - 'name' => 'TestForm', - 'id' => 'Form_TestForm', - 'action' => null, - 'method' => 'POST', - 'attributes' => [ - 'id' => 'Form_TestForm', - 'action' => null, - 'method' => 'POST', - 'enctype' => 'application/x-www-form-urlencoded', - 'target' => null, - 'class' => '' - ], - 'data' => [], - 'fields' => [ - [ - 'id' => 'Form_TestForm_SecurityID', - 'name' => 'SecurityID', - 'type' => "Hidden", - 'component' => null, - 'holderId' => 'Form_TestForm_SecurityID_Holder', - 'title' => 'Security ID', - 'source' => null, - 'extraClass' => 'hidden', - 'description' => null, - 'rightTitle' => null, - 'leftTitle' => null, - 'readOnly' => false, - 'disabled' => false, - 'customValidationMessage' => '', - 'attributes' => [], - 'data' => [], - 'validation' => [], - ], - ], - 'actions' => [] - ]; + $expected = json_decode(file_get_contents(__DIR__.'/FormSchemaTest/testGetSchema.json'), true); $schema = $formSchema->getSchema($form); $this->assertInternalType('array', $schema); - $this->assertJsonStringEqualsJsonString(json_encode($expected), json_encode($schema)); + $this->assertEquals($expected, $schema); } public function testGetState() @@ -85,7 +48,7 @@ class FormSchemaTest extends SapphireTest $state = $formSchema->getState($form); $this->assertInternalType('array', $state); - $this->assertJsonStringEqualsJsonString(json_encode($expected), json_encode($state)); + $this->assertEquals($expected, $state); } public function testGetStateWithFormMessages() @@ -183,192 +146,11 @@ class FormSchemaTest extends SapphireTest ) ); $formSchema = new FormSchema(); - $expected = [ - 'name' => 'TestForm', - 'id' => 'Form_TestForm', - 'action' => null, - 'method' => 'POST', - 'attributes' => [ - 'id' => 'Form_TestForm', - 'action' => null, - 'method' => 'POST', - 'enctype' => 'application/x-www-form-urlencoded', - 'target' => null, - 'class' => '' - ], - 'data' => [], - 'fields' => [ - [ - 'id' => 'Form_TestForm_Name', - 'name' => 'Name', - 'type' => 'Text', - 'component' => null, - 'holderId' => 'Form_TestForm_Name_Holder', - 'title' => 'Name', - 'source' => null, - 'extraClass' => 'text', - 'description' => null, - 'rightTitle' => null, - 'leftTitle' => null, - 'readOnly' => false, - 'disabled' => false, - 'customValidationMessage' => '', - 'attributes' => [], - 'data' => [], - 'validation' => [], - ], - [ - 'id' => 'Form_TestForm_SecurityID', - 'name' => 'SecurityID', - 'type' => "Hidden", - 'component' => null, - 'holderId' => 'Form_TestForm_SecurityID_Holder', - 'title' => 'Security ID', - 'source' => null, - 'extraClass' => 'hidden', - 'description' => null, - 'rightTitle' => null, - 'leftTitle' => null, - 'readOnly' => false, - 'disabled' => false, - 'customValidationMessage' => '', - 'attributes' => [], - 'data' => [], - 'validation' => [], - ], - ], - 'actions' => [ - [ - 'id' => 'Form_TestForm_action_save', - 'title' => 'Save', - 'name' => 'action_save', - 'type' => null, - 'component' => 'FormAction', - 'holderId' => 'Form_TestForm_action_save_Holder', - 'source' => null, - 'extraClass' => 'action', - 'description' => null, - 'rightTitle' => null, - 'leftTitle' => null, - 'readOnly' => false, - 'disabled' => false, - 'customValidationMessage' => '', - 'attributes' => [ - 'type' => 'submit', - ], - 'data' => [ - 'icon' => 'save', - ], - 'validation' => [], - ], - [ - 'id' => 'Form_TestForm_action_cancel', - 'title' => 'Cancel', - 'name' => 'action_cancel', - 'type' => null, - 'component' => 'FormAction', - 'holderId' => 'Form_TestForm_action_cancel_Holder', - 'source' => null, - 'extraClass' => 'action', - 'description' => null, - 'rightTitle' => null, - 'leftTitle' => null, - 'readOnly' => false, - 'disabled' => false, - 'customValidationMessage' => '', - 'attributes' => [ - 'type' => 'button' - ], - 'data' => [ - 'icon' => null - ], - 'validation' => [], - ], - [ - 'id' => 'Form_TestForm_Moreoptions', - 'title' => 'More options', - 'name' => 'Moreoptions', - 'type' => 'Structural', - 'component' => 'PopoverField', - 'holderId' => 'Form_TestForm_Moreoptions_Holder', - 'source' => null, - 'extraClass' => 'field CompositeField popover', - 'description' => null, - 'rightTitle' => null, - 'leftTitle' => null, - 'readOnly' => null, - 'disabled' => false, - 'customValidationMessage' => '', - 'attributes' => [], - 'data' => [ - 'popoverTitle' => null, - 'placement' => 'bottom', - 'tag' => 'div', - 'legend' => null, - 'buttonTooltip' => null, - 'inherited' => [ - 'data' => [ - 'fieldholder' => 'small' - ], - ], - ], - 'validation' => [], - 'children' => [ - [ - 'id' => 'Form_TestForm_action_publish', - 'title' => 'Publish record', - 'name' => 'action_publish', - 'type' => null, - 'component' => 'FormAction', - 'holderId' => 'Form_TestForm_action_publish_Holder', - 'source' => null, - 'extraClass' => 'action', - 'description' => null, - 'rightTitle' => null, - 'leftTitle' => null, - 'readOnly' => false, - 'disabled' => false, - 'customValidationMessage' => '', - 'attributes' => [ - 'type' => 'submit', - ], - 'data' => [ - 'icon' => null, - ], - 'validation' => [], - ], - [ - 'id' => 'Form_TestForm_action_archive', - 'title' => 'Archive', - 'name' => 'action_archive', - 'type' => null, - 'component' => 'FormAction', - 'holderId' => 'Form_TestForm_action_archive_Holder', - 'source' => null, - 'extraClass' => 'action', - 'description' => null, - 'rightTitle' => null, - 'leftTitle' => null, - 'readOnly' => false, - 'disabled' => false, - 'customValidationMessage' => '', - 'attributes' => [ - 'type' => 'submit', - ], - 'data' => [ - 'icon' => null, - ], - 'validation' => [], - ], - ] - ] - ] - ]; - + $expected = json_decode(file_get_contents(__DIR__.'/FormSchemaTest/testGetNestedSchema.json'), true); $schema = $formSchema->getSchema($form); $this->assertInternalType('array', $schema); - $this->assertJsonStringEqualsJsonString(json_encode($expected), json_encode($schema)); + $this->assertEquals($expected, $schema); } /** @@ -406,155 +188,8 @@ class FormSchemaTest extends SapphireTest ); $formSchema = new FormSchema(); $schema = $formSchema->getSchema($form); - $expected = [ - 'name' => 'TestForm', - 'id' => 'Form_TestForm', - 'action' => null, - 'method' => 'POST', - 'attributes' => - [ - 'id' => 'Form_TestForm', - 'action' => null, - 'method' => 'POST', - 'enctype' => 'application/x-www-form-urlencoded', - 'target' => null, - 'class' => '', - ], - 'data' => - [], - 'fields' => - [ - [ - 'name' => 'Name', - 'id' => 'Form_TestForm_Name', - 'type' => 'Text', - 'component' => null, - 'holderId' => 'Form_TestForm_Name_Holder', - 'title' => 'Name', - 'source' => null, - 'extraClass' => 'text', - 'description' => null, - 'rightTitle' => null, - 'leftTitle' => null, - 'readOnly' => false, - 'disabled' => false, - 'customValidationMessage' => '', - 'validation' => - [ - 'required' => true, - 'max' => [ - 'length' => 40, - ], - ], - 'attributes' => - [], - 'data' => - [], - ], - [ - 'name' => 'Date', - 'id' => 'Form_TestForm_Date', - 'type' => 'Date', - 'component' => null, - 'holderId' => 'Form_TestForm_Date_Holder', - 'title' => 'Date', - 'source' => null, - 'extraClass' => 'date text', - 'description' => null, - 'rightTitle' => null, - 'lang' => 'en-US', - 'leftTitle' => null, - 'readOnly' => false, - 'disabled' => false, - 'customValidationMessage' => '', - 'validation' => - [ - 'date' => true, - ], - 'attributes' => - [], - 'data' => [ - 'html5' => true, - 'min' => null, - 'max' => null - ], - ], - [ - 'name' => 'Number', - 'id' => 'Form_TestForm_Number', - 'type' => 'Decimal', - 'component' => null, - 'holderId' => 'Form_TestForm_Number_Holder', - 'title' => 'Number', - 'source' => null, - 'extraClass' => 'numeric text', - 'description' => null, - 'rightTitle' => null, - 'leftTitle' => null, - 'readOnly' => false, - 'disabled' => false, - 'customValidationMessage' => '', - 'validation' => - [ - 'numeric' => true, - ], - 'attributes' => - [], - 'data' => - [], - ], - [ - 'name' => 'Money', - 'id' => 'Form_TestForm_Money', - 'type' => 'Text', - 'component' => null, - 'holderId' => 'Form_TestForm_Money_Holder', - 'title' => 'Money', - 'source' => null, - 'extraClass' => 'currency text', - 'description' => null, - 'rightTitle' => null, - 'leftTitle' => null, - 'readOnly' => false, - 'disabled' => false, - 'customValidationMessage' => '', - 'validation' => - [ - 'currency' => true, - ], - 'attributes' => - [], - 'data' => - [], - ], - [ - 'name' => 'SecurityID', - 'id' => 'Form_TestForm_SecurityID', - 'type' => 'Hidden', - 'component' => null, - 'holderId' => 'Form_TestForm_SecurityID_Holder', - 'title' => 'Security ID', - 'source' => null, - 'extraClass' => 'hidden', - 'description' => null, - 'rightTitle' => null, - 'leftTitle' => null, - 'readOnly' => false, - 'disabled' => false, - 'customValidationMessage' => '', - 'validation' => - [], - 'attributes' => - [], - 'data' => - [], - ], - ], - 'actions' => - [], - ]; - + $expected = json_decode(file_get_contents(__DIR__.'/FormSchemaTest/testSchemaValidation.json'), true); $this->assertInternalType('array', $schema); - $this->assertJsonStringEqualsJsonString(json_encode($expected), json_encode($schema)); + $this->assertEquals($expected, $schema); } } diff --git a/tests/php/Forms/FormSchemaTest/testGetNestedSchema.json b/tests/php/Forms/FormSchemaTest/testGetNestedSchema.json new file mode 100644 index 000000000..e56722526 --- /dev/null +++ b/tests/php/Forms/FormSchemaTest/testGetNestedSchema.json @@ -0,0 +1,181 @@ +{ + "name": "TestForm", + "id": "Form_TestForm", + "action": null, + "method": "POST", + "attributes": { + "id": "Form_TestForm", + "action": null, + "method": "POST", + "enctype": "application\/x-www-form-urlencoded", + "target": null, + "class": "" + }, + "data": [], + "fields": [ + { + "id": "Form_TestForm_Name", + "name": "Name", + "type": "Text", + "component": null, + "holderId": "Form_TestForm_Name_Holder", + "title": "Name", + "source": null, + "extraClass": "text", + "description": null, + "rightTitle": null, + "leftTitle": null, + "readOnly": false, + "disabled": false, + "customValidationMessage": "", + "attributes": [], + "data": [], + "validation": [] + }, + { + "id": "Form_TestForm_SecurityID", + "name": "SecurityID", + "type": "Hidden", + "component": null, + "holderId": "Form_TestForm_SecurityID_Holder", + "title": "Security ID", + "source": null, + "extraClass": "hidden", + "description": null, + "rightTitle": null, + "leftTitle": null, + "readOnly": false, + "disabled": false, + "customValidationMessage": "", + "attributes": [], + "data": [], + "validation": [] + } + ], + "actions": [ + { + "id": "Form_TestForm_action_save", + "title": "Save", + "name": "action_save", + "type": null, + "component": "FormAction", + "holderId": "Form_TestForm_action_save_Holder", + "source": null, + "extraClass": "action", + "description": null, + "rightTitle": null, + "leftTitle": null, + "readOnly": false, + "disabled": false, + "customValidationMessage": "", + "attributes": { + "type": "submit" + }, + "data": { + "icon": "save" + }, + "validation": [] + }, + { + "id": "Form_TestForm_action_cancel", + "title": "Cancel", + "name": "action_cancel", + "type": null, + "component": "FormAction", + "holderId": "Form_TestForm_action_cancel_Holder", + "source": null, + "extraClass": "action", + "description": null, + "rightTitle": null, + "leftTitle": null, + "readOnly": false, + "disabled": false, + "customValidationMessage": "", + "attributes": { + "type": "button" + }, + "data": { + "icon": null + }, + "validation": [] + }, + { + "id": "Form_TestForm_Moreoptions", + "title": "More options", + "name": "Moreoptions", + "type": "Structural", + "component": "PopoverField", + "holderId": "Form_TestForm_Moreoptions_Holder", + "source": null, + "extraClass": "field CompositeField popover", + "description": null, + "rightTitle": null, + "leftTitle": null, + "readOnly": null, + "disabled": false, + "customValidationMessage": "", + "attributes": [], + "data": { + "popoverTitle": null, + "placement": "bottom", + "tag": "div", + "legend": null, + "buttonTooltip": null, + "inherited": { + "data": { + "fieldholder": "small" + } + } + }, + "validation": [], + "children": [ + { + "id": "Form_TestForm_action_publish", + "title": "Publish record", + "name": "action_publish", + "type": null, + "component": "FormAction", + "holderId": "Form_TestForm_action_publish_Holder", + "source": null, + "extraClass": "action", + "description": null, + "rightTitle": null, + "leftTitle": null, + "readOnly": false, + "disabled": false, + "customValidationMessage": "", + "attributes": { + "type": "submit" + }, + "data": { + "icon": null + }, + "validation": [] + }, + { + "id": "Form_TestForm_action_archive", + "title": "Archive", + "name": "action_archive", + "type": null, + "component": "FormAction", + "holderId": "Form_TestForm_action_archive_Holder", + "source": null, + "extraClass": "action", + "description": null, + "rightTitle": null, + "leftTitle": null, + "readOnly": false, + "disabled": false, + "customValidationMessage": "", + "attributes": { + "type": "submit" + }, + "data": { + "icon": null + }, + "validation": [] + } + ] + } + ] +} diff --git a/tests/php/Forms/FormSchemaTest/testGetSchema.json b/tests/php/Forms/FormSchemaTest/testGetSchema.json new file mode 100644 index 000000000..47d31ad56 --- /dev/null +++ b/tests/php/Forms/FormSchemaTest/testGetSchema.json @@ -0,0 +1,37 @@ +{ + "name": "TestForm", + "id": "Form_TestForm", + "action": null, + "method": "POST", + "attributes": { + "id": "Form_TestForm", + "action": null, + "method": "POST", + "enctype": "application\/x-www-form-urlencoded", + "target": null, + "class": "" + }, + "data": [], + "fields": [ + { + "id": "Form_TestForm_SecurityID", + "name": "SecurityID", + "type": "Hidden", + "component": null, + "holderId": "Form_TestForm_SecurityID_Holder", + "title": "Security ID", + "source": null, + "extraClass": "hidden", + "description": null, + "rightTitle": null, + "leftTitle": null, + "readOnly": false, + "disabled": false, + "customValidationMessage": "", + "attributes": [], + "data": [], + "validation": [] + } + ], + "actions": [] +} \ No newline at end of file diff --git a/tests/php/Forms/FormSchemaTest/testSchemaValidation.json b/tests/php/Forms/FormSchemaTest/testSchemaValidation.json new file mode 100644 index 000000000..3720c3342 --- /dev/null +++ b/tests/php/Forms/FormSchemaTest/testSchemaValidation.json @@ -0,0 +1,129 @@ +{ + "name": "TestForm", + "id": "Form_TestForm", + "action": null, + "method": "POST", + "attributes": { + "id": "Form_TestForm", + "action": null, + "method": "POST", + "enctype": "application\/x-www-form-urlencoded", + "target": null, + "class": "" + }, + "data": [], + "fields": [ + { + "name": "Name", + "id": "Form_TestForm_Name", + "type": "Text", + "component": null, + "holderId": "Form_TestForm_Name_Holder", + "title": "Name", + "source": null, + "extraClass": "text", + "description": null, + "rightTitle": null, + "leftTitle": null, + "readOnly": false, + "disabled": false, + "customValidationMessage": "", + "validation": { + "required": true, + "max": { + "length": 40 + } + }, + "attributes": [], + "data": [] + }, + { + "name": "Date", + "id": "Form_TestForm_Date", + "type": "Date", + "component": null, + "holderId": "Form_TestForm_Date_Holder", + "title": "Date", + "source": null, + "extraClass": "date text", + "description": null, + "rightTitle": null, + "lang": "en-US", + "leftTitle": null, + "readOnly": false, + "disabled": false, + "customValidationMessage": "", + "validation": { + "date": true + }, + "attributes": [], + "data": { + "html5": true, + "min": null, + "max": null + } + }, + { + "name": "Number", + "id": "Form_TestForm_Number", + "type": "Decimal", + "component": null, + "holderId": "Form_TestForm_Number_Holder", + "title": "Number", + "source": null, + "extraClass": "numeric text", + "description": null, + "rightTitle": null, + "leftTitle": null, + "readOnly": false, + "disabled": false, + "customValidationMessage": "", + "validation": { + "numeric": true + }, + "attributes": [], + "data": [] + }, + { + "name": "Money", + "id": "Form_TestForm_Money", + "type": "Text", + "component": null, + "holderId": "Form_TestForm_Money_Holder", + "title": "Money", + "source": null, + "extraClass": "currency text", + "description": null, + "rightTitle": null, + "leftTitle": null, + "readOnly": false, + "disabled": false, + "customValidationMessage": "", + "validation": { + "currency": true + }, + "attributes": [], + "data": [] + }, + { + "name": "SecurityID", + "id": "Form_TestForm_SecurityID", + "type": "Hidden", + "component": null, + "holderId": "Form_TestForm_SecurityID_Holder", + "title": "Security ID", + "source": null, + "extraClass": "hidden", + "description": null, + "rightTitle": null, + "leftTitle": null, + "readOnly": false, + "disabled": false, + "customValidationMessage": "", + "validation": [], + "attributes": [], + "data": [] + } + ], + "actions": [] +} \ No newline at end of file