1
0
Fork 0
mirror of https://github.com/Oreolek/kohana-migrations.git synced 2024-05-18 17:08:18 +03:00

Migration IDs are now {location}:{timestamp}

This should force uniqueness of migration ids
This commit is contained in:
Matt Button 2010-12-29 03:03:00 +00:00
parent 181e2d7b67
commit fbe91010ed
5 changed files with 104 additions and 51 deletions

View file

@ -30,10 +30,7 @@ class Minion_Migration_Util {
{
$migration = Minion_Migration_Util::get_migration_from_filename($file);
$migrations[$migration['id']] = array(
'file' => $file,
'location' => $migration['location']
);
$migrations[$migration['location'].':'.$migration['timestamp']] = $migration;
}
}
@ -46,11 +43,10 @@ class Minion_Migration_Util {
* Returns an array like:
*
* array(
* 'location' => 'mylocation',
* 'id' => '1293214439_initial-setup',
* 'file' => 'migrations/mylocation/1293214439_initial-setup.php',
* 'location' => 'mylocation',
* 'timestamp' => '1293214439',
* 'description' => 'initial-setup',
* 'id' => 'mylocation:1293214439'
* );
*
* @param string The migration's filename
@ -64,11 +60,11 @@ class Minion_Migration_Util {
// the filename itself. The "location" is essentially a slash delimited
// path from the migrations folder to the migration file
$migration['location'] = dirname(substr($file, 11, -strlen(EXT)));
$migration['id'] = basename($file, EXT);
$migration['file'] = $file;
list($migration['timestamp'], $migration['description'])
= explode('_', $migration['id'], 2);
= explode('_', basename($file, EXT), 2);
$migration['id'] = $migration['location'].':'.$migration['timestamp'];
return $migration;
}
@ -80,16 +76,34 @@ class Minion_Migration_Util {
* @param string The migration location
* @return string Path to the migration file
*/
public static function get_filename_from_migration($migration, $location)
public static function get_filename_from_migration(array $migration)
{
if(is_array($migration))
{
$location = $migration['location'];
$migration = $migration['id'];
}
$location = $migration['location'];
$migration = $migration['timestamp'].'_'.$migration['description'];
$location = ! empty($location) ? rtrim($location, '/').'/' : '';
return $location.$migration.EXT;
}
/**
* Allows you to work out the class name from either an array of migration
* info, or from a migration id
*
* @param string|array The migration's ID or array of migration data
* @return string The migration class name
*/
public static function get_class_from_migration($migration)
{
if(is_string($migration))
{
$migration = str_replace(array(':', '/'), ' ', $migration);
}
else
{
$migration = str_replace('/', ' ', $migration['location']).'_'.$migration['timestamp'];
}
return 'Migration_'.str_replace(' ', '_', ucwords($migration));
}
}

View file

@ -18,14 +18,16 @@
* is used to specify the target version of an individual location. Version
* specifies the target version, which can be either:
*
* * A migration id (migrates up/down to that version)
* * A migration version (migrates up/down to that version)
* * TRUE (runs all migrations to get to the latest version)
* * FALSE (undoes all appled migrations)
*
* An example of a migration ID is 1293506456_add-index-to-orders
* An example of a migration version is 20101229015800
*
* If you specify TRUE / FALSE without a location then the default migration
* direction for locations without a specified version will be up / down respectively
* direction for locations without a specified version will be up / down respectively.
*
* If you're only specifying a migration version then you *must* specify a location
*
* --locations=location[,location2[,location3...]]
*
@ -176,5 +178,4 @@ class Minion_Task_Db_Migrate extends Minion_Task
throw new Kohana_Exception('Invalid target version :version', array(':version' => $version));
}
}

View file

@ -37,7 +37,7 @@ class Model_Minion_Migration extends Model
*/
protected function _select()
{
return DB::select('*', DB::expr('CONCAT(CAST(`timestamp` AS CHAR), "_", `description`) AS `id`'))->from($this->_table);
return DB::select('*', DB::expr('CONCAT(`location`, ":", CAST(`timestamp` AS CHAR)) AS `id`'))->from($this->_table);
}
/**
@ -167,10 +167,8 @@ class Model_Minion_Migration extends Model
// Else if the user explicitly specified a target version of some kind
else
{
list($timestamp, $description) = explode('_', $target, 2);
$current_timestamp =
isset($migrations[$location])
$timestamp = $target;
$current_timestamp = isset($migrations[$location])
? $migrations[$location]['timestamp']
: NULL;

View file

@ -54,12 +54,12 @@ class Minion_Migration_ModelTest extends Kohana_Unittest_Database_TestCase
public function test_fetch_current_versions()
{
$versions = $this->getModel()
->fetch_current_versions('location', 'id');
->fetch_current_versions('location', 'timestamp');
$this->assertSame(
array (
'app' => '1293543858_remove-password-salt-column',
'dblogger' => '1293544858_remove-unique-index',
'app' => '1293543858',
'dblogger' => '1293544858',
),
$versions
);
@ -80,18 +80,18 @@ class Minion_Migration_ModelTest extends Kohana_Unittest_Database_TestCase
'direction' => true,
'migrations' => array(
array (
'timestamp' => '1293543800',
'timestamp' => '1293543800',
'description' => 'add-name-column-to-members',
'location' => 'app',
'applied' => '0',
'id' => '1293543800_add-name-column-to-members',
'location' => 'app',
'applied' => '0',
'id' => 'app:1293543800'
),
array (
'timestamp' => '1293543828',
'timestamp' => '1293543828',
'description' => 'add-index-on-name',
'location' => 'app',
'applied' => '0',
'id' => '1293543828_add-index-on-name',
'location' => 'app',
'applied' => '0',
'id' => 'app:1293543828'
),
),
),
@ -99,11 +99,11 @@ class Minion_Migration_ModelTest extends Kohana_Unittest_Database_TestCase
'direction' => true,
'migrations' => array(
array (
'timestamp' => '1293544908',
'timestamp' => '1293544908',
'description' => 'add-pk',
'location' => 'dblogger',
'applied' => '0',
'id' => '1293544908_add-pk',
'location' => 'dblogger',
'applied' => '0',
'id' => 'dblogger:1293544908'
),
),
),
@ -122,14 +122,14 @@ class Minion_Migration_ModelTest extends Kohana_Unittest_Database_TestCase
'description' => 'remove-password-salt-column',
'location' => 'app',
'applied' => '1',
'id' => '1293543858_remove-password-salt-column'
'id' => 'app:1293543858'
),
array(
'timestamp' => '1293543728',
'description' => 'create-tables',
'location' => 'app',
'applied' => '1',
'id' => '1293543728_create-tables',
'id' => 'app:1293543728'
),
)
),
@ -141,14 +141,14 @@ class Minion_Migration_ModelTest extends Kohana_Unittest_Database_TestCase
'description' => 'remove-unique-index',
'location' => 'dblogger',
'applied' => '1',
'id' => '1293544858_remove-unique-index',
'id' => 'dblogger:1293544858'
),
array(
'timestamp' => '1293543858',
'description' => 'create-table',
'location' => 'dblogger',
'applied' => '1',
'id' => '1293543858_create-table',
'id' => 'dblogger:1293543858'
),
)
),

View file

@ -17,8 +17,8 @@ class Minion_Migration_UtilTest extends Kohana_Unittest_TestCase {
return array(
array(
array(
'015151051_setup' => array('file' => 'migrations/myapp/015151051_setup.php', 'location' => 'myapp'),
'015161051_add-comments' => array('file' => 'migrations/myapp/015161051_add-comments.php', 'location' => 'myapp'),
'myapp:015151051' => array('location' => 'myapp', 'description' => 'setup', 'timestamp' => '015151051', 'id' => 'myapp:015151051'),
'myapp:015161051' => array('location' => 'myapp', 'description' => 'add-comments', 'timestamp' => '015161051', 'id' => 'myapp:015161051'),
),
array(
'migrations/myapp' => array(
@ -60,9 +60,7 @@ class Minion_Migration_UtilTest extends Kohana_Unittest_TestCase {
return array(
array(
array(
'location' => 'myapp',
'id' => '1293214439_initial-setup',
'file' => 'migrations/myapp/1293214439_initial-setup.php',
'location' => 'myapp',
'description' => 'initial-setup',
'timestamp' => '1293214439',
),
@ -99,7 +97,12 @@ class Minion_Migration_UtilTest extends Kohana_Unittest_TestCase {
return array(
array(
'myapp/1293214439_initial-setup.php',
'1293214439_initial-setup',
array(
'location' => 'myapp',
'timestamp' => '1293214439',
'description' => 'initial-setup',
'id' => 'myapp:1293214439'
),
'myapp',
),
);
@ -111,7 +114,7 @@ class Minion_Migration_UtilTest extends Kohana_Unittest_TestCase {
*
* @test
* @covers Minion_Migration_Util::convert_migration_to_filename
* @dataProvider provider_convert_migration_to_filename
* @dataProvider provider_get_filename_from_migration
* @param string Expected output
* @param mixed Migration id
* @param mixed location
@ -123,4 +126,41 @@ class Minion_Migration_UtilTest extends Kohana_Unittest_TestCase {
Minion_Migration_Util::get_filename_from_migration($migration, $location)
);
}
/**
* Provides test data for test_get_class_from_migration
*
* @return array Test Data
*/
public function provider_get_class_from_migration()
{
return array(
array(
'Migration_Kohana_201012290258',
'kohana:201012290258',
),
array(
'Migration_Kohana_201012290258',
array('location' => 'kohana', 'timestamp' => '201012290258'),
),
);
}
/**
* Tests that Minion_Migration_Util::get_class_from_migration can generate
* a class name from information about a migration
*
* @test
* @covers Minion_Migration_Util::get_class_from_migration
* @dataProvider provider_get_class_from_migration
* @param string Expected output
* @param string|array Migration info
*/
public function test_get_class_from_migration($expected, $migration)
{
$this->assertSame(
$expected,
Minion_Migration_Util::get_class_from_migration($migration)
);
}
}