Merge branch '2.5'

* 2.5:
  add missing options
  [Form] Fixed ValidatorExtension to work with the 2.5 Validation API
  revert #11510, moved to 2.6
  [WebProfilerBundle] Fixed double height of canvas
This commit is contained in:
Nicolas Grekas 2014-08-18 11:02:08 +02:00
commit 7f38207967
6 changed files with 72 additions and 163 deletions

View File

@ -193,7 +193,6 @@
x = request.left * ratio + space, // position
canvas = cache.get(elementId) || cache.set(elementId, document.getElementById(elementId)),
ctx = canvas.getContext("2d"),
backingStoreRatio,
scaleRatio,
devicePixelRatio;
@ -206,11 +205,8 @@
// For retina displays so text and boxes will be crisp
devicePixelRatio = window.devicePixelRatio == "undefined" ? 1 : window.devicePixelRatio;
backingStoreRatio = ctx.webkitBackingStorePixelRatio == "undefined" ? 1 : ctx.webkitBackingStorePixelRatio;
scaleRatio = devicePixelRatio / 1;
canvasHeight += gapPerEvent * drawableEvents.length;
canvas.width = width * scaleRatio;
canvas.height = canvasHeight * scaleRatio;
@ -363,7 +359,7 @@
var self = this;
_requests.forEach(function(request) {
self.drawOne(request, maxRequestTime, threshold, width);
self.drawOne(request, _maxRequestTime, threshold, width);
});
};

View File

@ -11,6 +11,7 @@
namespace Symfony\Component\Form\Extension\Validator;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\Extension\Validator\Constraints\Form;
use Symfony\Component\Form\AbstractExtension;
use Symfony\Component\Validator\Constraints\Valid;
@ -29,23 +30,19 @@ class ValidatorExtension extends AbstractExtension
/**
* @param ValidatorInterface|LegacyValidatorInterface $validator
*
* @throws UnexpectedTypeException If $validator is invalid
*/
public function __construct($validator)
{
// since validator apiVersion 2.5
// 2.5 API
if ($validator instanceof ValidatorInterface) {
$this->validator = $validator;
/** @var $metadata ClassMetadata */
$metadata = $this->validator->getMetadataFor('Symfony\Component\Form\Form');
// until validator apiVersion 2.4
$metadata = $validator->getMetadataFor('Symfony\Component\Form\Form');
// 2.4 API
} elseif ($validator instanceof LegacyValidatorInterface) {
$this->validator = $validator;
/** @var $metadata ClassMetadata */
$metadata = $this->validator->getMetadataFactory()->getMetadataFor('Symfony\Component\Form\Form');
$metadata = $validator->getMetadataFactory()->getMetadataFor('Symfony\Component\Form\Form');
} else {
throw new \InvalidArgumentException('Validator must be instance of Symfony\Component\Validator\Validator\ValidatorInterface or Symfony\Component\Validator\ValidatorInterface');
throw new UnexpectedTypeException($validator, 'Symfony\Component\Validator\Validator\ValidatorInterface or Symfony\Component\Validator\ValidatorInterface');
}
// Register the form constraints in the validator programmatically.
@ -53,13 +50,22 @@ class ValidatorExtension extends AbstractExtension
// the DIC, where the XML file is loaded automatically. Thus the following
// code must be kept synchronized with validation.xml
/** @var $metadata ClassMetadata */
$metadata->addConstraint(new Form());
$metadata->addPropertyConstraint('children', new Valid());
$this->validator = $validator;
}
public function loadTypeGuesser()
{
return new ValidatorTypeGuesser($this->validator->getMetadataFactory());
// 2.4 API
if ($this->validator instanceof LegacyValidatorInterface) {
return new ValidatorTypeGuesser($this->validator->getMetadataFactory());
}
// 2.5 API - ValidatorInterface extends MetadataFactoryInterface
return new ValidatorTypeGuesser($this->validator);
}
protected function loadTypeExtensions()

View File

@ -15,79 +15,70 @@ use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
class ValidatorExtensionTest extends \PHPUnit_Framework_TestCase
{
public function testValidatorInterfaceSinceSymfony25()
public function test2Dot5ValidationApi()
{
$classMetaData = $this->createClassMetaDataMock();
// Mock of ValidatorInterface since apiVersion 2.5
$validator = $this->getMock('Symfony\Component\Validator\Validator\ValidatorInterface');
$metadata = $this->getMockBuilder('Symfony\Component\Validator\Mapping\ClassMetadata')
->disableOriginalConstructor()
->getMock();
$validator
->expects($this->once())
$validator->expects($this->once())
->method('getMetadataFor')
->with($this->identicalTo('Symfony\Component\Form\Form'))
->will($this->returnValue($classMetaData))
;
->will($this->returnValue($metadata));
$validatorExtension = new ValidatorExtension($validator);
$this->assertAttributeSame($validator, 'validator', $validatorExtension);
// Verify that the constraints are added
$metadata->expects($this->once())
->method('addConstraint')
->with($this->isInstanceOf('Symfony\Component\Form\Extension\Validator\Constraints\Form'));
$metadata->expects($this->once())
->method('addPropertyConstraint')
->with('children', $this->isInstanceOf('Symfony\Component\Validator\Constraints\Valid'));
$extension = new ValidatorExtension($validator);
$guesser = $extension->loadTypeGuesser();
$this->assertInstanceOf('Symfony\Component\Form\Extension\Validator\ValidatorTypeGuesser', $guesser);
}
public function testValidatorInterfaceUntilSymfony24()
public function test2Dot4ValidationApi()
{
$classMetaData = $this->createClassMetaDataMock();
$factory = $this->getMock('Symfony\Component\Validator\MetadataFactoryInterface');
$validator = $this->getMock('Symfony\Component\Validator\ValidatorInterface');
$metadata = $this->getMockBuilder('Symfony\Component\Validator\Mapping\ClassMetadata')
->disableOriginalConstructor()
->getMock();
$metaDataFactory = $this->getMock('Symfony\Component\Validator\MetadataFactoryInterface');
$validator->expects($this->any())
->method('getMetadataFactory')
->will($this->returnValue($factory));
$metaDataFactory
->expects($this->once())
$factory->expects($this->once())
->method('getMetadataFor')
->with($this->identicalTo('Symfony\Component\Form\Form'))
->will($this->returnValue($classMetaData))
;
->will($this->returnValue($metadata));
// Mock of ValidatorInterface until apiVersion 2.4
$validator = $this->getMock('Symfony\Component\Validator\ValidatorInterface');
// Verify that the constraints are added
$metadata->expects($this->once())
->method('addConstraint')
->with($this->isInstanceOf('Symfony\Component\Form\Extension\Validator\Constraints\Form'));
$validator
->expects($this->once())
->method('getMetadataFactory')
->will($this->returnValue($metaDataFactory))
;
$metadata->expects($this->once())
->method('addPropertyConstraint')
->with('children', $this->isInstanceOf('Symfony\Component\Validator\Constraints\Valid'));
$validatorExtension = new ValidatorExtension($validator);
$this->assertAttributeSame($validator, 'validator', $validatorExtension);
$extension = new ValidatorExtension($validator);
$guesser = $extension->loadTypeGuesser();
$this->assertInstanceOf('Symfony\Component\Form\Extension\Validator\ValidatorTypeGuesser', $guesser);
}
/**
* @expectedException \InvalidArgumentException
* @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
*/
public function testInvalidValidatorInterface()
{
new ValidatorExtension(null);
}
/**
* @return mixed
*/
private function createClassMetaDataMock()
{
$classMetaData = $this->getMockBuilder('Symfony\Component\Validator\Mapping\ClassMetadata')
->disableOriginalConstructor()
->getMock();
$classMetaData
->expects($this->once())
->method('addConstraint')
->with($this->isInstanceOf('Symfony\Component\Form\Extension\Validator\Constraints\Form'));
$classMetaData
->expects($this->once())
->method('addPropertyConstraint')
->with(
$this->identicalTo('children'),
$this->isInstanceOf('Symfony\Component\Validator\Constraints\Valid')
);
return $classMetaData;
}
}

View File

@ -62,10 +62,9 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
$this->mongo = $mongo;
$this->options = array_merge(array(
'id_field' => '_id',
'data_field' => 'data',
'time_field' => 'time',
'expiry_field' => false,
'id_field' => '_id',
'data_field' => 'data',
'time_field' => 'time',
), $options);
}
@ -110,9 +109,6 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
*
* See: http://docs.mongodb.org/manual/tutorial/expire-data/
*/
if (false !== $this->options['expiry_field']) {
return true;
}
$time = new \MongoDate(time() - $maxlifetime);
$this->getCollection()->remove(array(
@ -127,27 +123,12 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
*/
public function write($sessionId, $data)
{
$fields = array(
$this->options['data_field'] => new \MongoBinData($data, \MongoBinData::BYTE_ARRAY),
$this->options['time_field'] => new \MongoDate(),
);
/* Note: As discussed in the gc method of this class. You can utilise
* TTL collections in MongoDB 2.2+
* We are setting the "expiry_field" as part of the write operation here
* You will need to create the index on your collection that expires documents
* at that time
* e.g.
* db.MySessionCollection.ensureIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )
*/
if (false !== $this->options['expiry_field']) {
$expiry = new \MongoDate(time() + (int) ini_get('session.gc_maxlifetime'));
$fields[$this->options['expiry_field']] = $expiry;
}
$this->getCollection()->update(
array($this->options['id_field'] => $sessionId),
array('$set' => $fields),
array('$set' => array(
$this->options['data_field'] => new \MongoBinData($data, \MongoBinData::BYTE_ARRAY),
$this->options['time_field'] => new \MongoDate(),
)),
array('upsert' => true, 'multiple' => false)
);

View File

@ -41,7 +41,7 @@ class MongoDbSessionHandlerTest extends \PHPUnit_Framework_TestCase
'data_field' => 'data',
'time_field' => 'time',
'database' => 'sf2-test',
'collection' => 'session-test',
'collection' => 'session-test'
);
$this->storage = new MongoDbSessionHandler($this->mongo, $this->options);
@ -100,45 +100,6 @@ class MongoDbSessionHandlerTest extends \PHPUnit_Framework_TestCase
$that->assertInstanceOf('MongoDate', $data[$this->options['time_field']]);
}
public function testWriteWhenUsingExpiresField()
{
$this->options = array(
'id_field' => '_id',
'data_field' => 'data',
'time_field' => 'time',
'database' => 'sf2-test',
'collection' => 'session-test',
'expiry_field' => 'expiresAt'
);
$this->storage = new MongoDbSessionHandler($this->mongo, $this->options);
$collection = $this->createMongoCollectionMock();
$this->mongo->expects($this->once())
->method('selectCollection')
->with($this->options['database'], $this->options['collection'])
->will($this->returnValue($collection));
$that = $this;
$data = array();
$collection->expects($this->once())
->method('update')
->will($this->returnCallback(function ($criteria, $updateData, $options) use ($that, &$data) {
$that->assertEquals(array($that->options['id_field'] => 'foo'), $criteria);
$that->assertEquals(array('upsert' => true, 'multiple' => false), $options);
$data = $updateData['$set'];
}));
$this->assertTrue($this->storage->write('foo', 'bar'));
$this->assertEquals('bar', $data[$this->options['data_field']]->bin);
$that->assertInstanceOf('MongoDate', $data[$this->options['time_field']]);
$that->assertInstanceOf('MongoDate', $data[$this->options['expiry_field']]);
}
public function testReplaceSessionData()
{
$collection = $this->createMongoCollectionMock();
@ -193,36 +154,10 @@ class MongoDbSessionHandlerTest extends \PHPUnit_Framework_TestCase
->method('remove')
->will($this->returnCallback(function ($criteria) use ($that) {
$that->assertInstanceOf('MongoDate', $criteria[$that->options['time_field']]['$lt']);
$that->assertGreaterThanOrEqual(time() - 1, $criteria[$that->options['time_field']]['$lt']->sec);
$that->assertGreaterThanOrEqual(time() - -1, $criteria[$that->options['time_field']]['$lt']->sec);
}));
$this->assertTrue($this->storage->gc(1));
}
public function testGcWhenUsingExpiresField()
{
$this->options = array(
'id_field' => '_id',
'data_field' => 'data',
'time_field' => 'time',
'database' => 'sf2-test',
'collection' => 'session-test',
'expiry_field' => 'expiresAt'
);
$this->storage = new MongoDbSessionHandler($this->mongo, $this->options);
$collection = $this->createMongoCollectionMock();
$this->mongo->expects($this->never())
->method('selectCollection');
$that = $this;
$collection->expects($this->never())
->method('remove');
$this->assertTrue($this->storage->gc(1));
$this->assertTrue($this->storage->gc(-1));
}
public function testGetConnection()

View File

@ -180,7 +180,7 @@
</trans-unit>
<trans-unit id="48">
<source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
<target>Deze waarde moet exact {{ limit }} tekens lang zijn.</target>
<target>Deze waarde moet exact {{ limit }} teken lang zijn.|Deze waarde moet exact {{ limit }} tekens lang zijn.</target>
</trans-unit>
<trans-unit id="49">
<source>The file was only partially uploaded.</source>