From 7d4a346f84536f0a7cbb70a38660fbc439a74070 Mon Sep 17 00:00:00 2001 From: Colin Viebrock Date: Mon, 2 Apr 2012 11:30:53 -0500 Subject: [PATCH 001/260] Adding Schema::rename('oldtable','newtable') support Signed-off-by: Colin Viebrock --- laravel/database/schema/grammars/mysql.php | 12 ++++++++++++ laravel/database/schema/grammars/postgres.php | 14 +++++++++++++- laravel/database/schema/grammars/sqlite.php | 12 ++++++++++++ laravel/database/schema/grammars/sqlserver.php | 14 +++++++++++++- laravel/database/schema/table.php | 11 +++++++++++ 5 files changed, 61 insertions(+), 2 deletions(-) diff --git a/laravel/database/schema/grammars/mysql.php b/laravel/database/schema/grammars/mysql.php index c2ae7455..bcc8e94a 100644 --- a/laravel/database/schema/grammars/mysql.php +++ b/laravel/database/schema/grammars/mysql.php @@ -212,6 +212,18 @@ protected function key(Table $table, Fluent $command, $type) return 'ALTER TABLE '.$this->wrap($table)." ADD {$type} {$name}({$keys})"; } + /** + * Generate the SQL statement for a rename table command. + * + * @param Table $table + * @param Fluent $command + * @return string + */ + public function rename(Table $table, Fluent $command) + { + return 'RENAME TABLE '.$this->wrap($table).' TO '.$this->wrap($command->name); + } + /** * Generate the SQL statement for a drop table command. * diff --git a/laravel/database/schema/grammars/postgres.php b/laravel/database/schema/grammars/postgres.php index 760af1a8..3c1b62e2 100644 --- a/laravel/database/schema/grammars/postgres.php +++ b/laravel/database/schema/grammars/postgres.php @@ -198,6 +198,18 @@ protected function key(Table $table, Fluent $command, $unique = false) return $create." INDEX {$command->name} ON ".$this->wrap($table)." ({$columns})"; } + /** + * Generate the SQL statement for a rename table command. + * + * @param Table $table + * @param Fluent $command + * @return string + */ + public function rename(Table $table, Fluent $command) + { + return 'ALTER TABLE '.$this->wrap($table).' RENAME TO '.$this->wrap($command->name); + } + /** * Generate the SQL statement for a drop table command. * @@ -302,7 +314,7 @@ protected function drop_key(Table $table, Fluent $command) */ public function drop_foreign(Table $table, Fluent $command) { - return $this->drop_constraint($table, $command); + return $this->drop_constraint($table, $command); } /** diff --git a/laravel/database/schema/grammars/sqlite.php b/laravel/database/schema/grammars/sqlite.php index 09102f52..00c69604 100644 --- a/laravel/database/schema/grammars/sqlite.php +++ b/laravel/database/schema/grammars/sqlite.php @@ -201,6 +201,18 @@ protected function key(Table $table, Fluent $command, $unique = false) return $create." INDEX {$command->name} ON ".$this->wrap($table)." ({$columns})"; } + /** + * Generate the SQL statement for a rename table command. + * + * @param Table $table + * @param Fluent $command + * @return string + */ + public function rename(Table $table, Fluent $command) + { + return 'ALTER TABLE '.$this->wrap($table).' RENAME TO '.$this->wrap($command->name); + } + /** * Generate the SQL statement for a drop table command. * diff --git a/laravel/database/schema/grammars/sqlserver.php b/laravel/database/schema/grammars/sqlserver.php index 0fb80f6a..513ed0f4 100644 --- a/laravel/database/schema/grammars/sqlserver.php +++ b/laravel/database/schema/grammars/sqlserver.php @@ -212,6 +212,18 @@ protected function key(Table $table, Fluent $command, $unique = false) return $create." INDEX {$command->name} ON ".$this->wrap($table)." ({$columns})"; } + /** + * Generate the SQL statement for a rename table command. + * + * @param Table $table + * @param Fluent $command + * @return string + */ + public function rename(Table $table, Fluent $command) + { + return 'ALTER TABLE '.$this->wrap($table).' RENAME TO '.$this->wrap($command->name); + } + /** * Generate the SQL statement for a drop table command. * @@ -320,7 +332,7 @@ protected function drop_key(Table $table, Fluent $command) */ public function drop_foreign(Table $table, Fluent $command) { - return $this->drop_constraint($table, $command); + return $this->drop_constraint($table, $command); } /** diff --git a/laravel/database/schema/table.php b/laravel/database/schema/table.php index 9518d6e7..f9561f07 100644 --- a/laravel/database/schema/table.php +++ b/laravel/database/schema/table.php @@ -142,6 +142,17 @@ public function key($type, $columns, $name) return $this->command($type, compact('name', 'columns')); } + /** + * Rename the database table. + * + * @param string $name + * @return Fluent + */ + public function rename($name) + { + return $this->command(__FUNCTION__, compact('name')); + } + /** * Drop the database table. * From 7293c0448d6df8c5ff74e006d1a4352531957369 Mon Sep 17 00:00:00 2001 From: Colin Viebrock Date: Mon, 2 Apr 2012 11:38:12 -0500 Subject: [PATCH 002/260] One more change (comments may need to be altered) Signed-off-by: Colin Viebrock --- laravel/database/schema.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/laravel/database/schema.php b/laravel/database/schema.php index 3787e33b..6290fa4e 100644 --- a/laravel/database/schema.php +++ b/laravel/database/schema.php @@ -40,6 +40,25 @@ public static function create($table, $callback) return static::execute($table); } + /** + * Rename a database table in the schema. + * + * @param string $table + * @param string $name + * @return void + */ + public static function rename($table, $rename) + { + $table = new Schema\Table($table); + + // To indicate that the table needs to be renamed, we will run the + // "rename" command on the table instance and pass the instance to + // the execute method as calling a Closure isn't needed. + $table->rename($name); + + return static::execute($table); + } + /** * Drop a database table from the schema. * From 524375781e1dc687598dc368037a3180791a688e Mon Sep 17 00:00:00 2001 From: Pavel Date: Sun, 6 May 2012 12:19:13 +0400 Subject: [PATCH 003/260] Added Bundle::expand() method. Signed-off-by: Pavel --- laravel/bundle.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/laravel/bundle.php b/laravel/bundle.php index b6f614e9..2519fb88 100644 --- a/laravel/bundle.php +++ b/laravel/bundle.php @@ -451,4 +451,16 @@ public static function names() return array_keys(static::$bundles); } + /** + * Expand given bundle path of form "[bundle::]path/...". + * + * @param string $path + * @return string + */ + public static function expand($path) + { + list($bundle, $element) = static::parse($path); + return static::path($bundle).$element; + } + } \ No newline at end of file From 1b2ab309c4b0ae923147dff2bc533ca2e3af74bf Mon Sep 17 00:00:00 2001 From: Kelly Banman Date: Fri, 11 May 2012 22:32:19 -0700 Subject: [PATCH 004/260] Add support for non-string parameters in controller routes Signed-off-by: Kelly Banman --- laravel/routing/controller.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/laravel/routing/controller.php b/laravel/routing/controller.php index 0a780bbc..e81d6b5f 100644 --- a/laravel/routing/controller.php +++ b/laravel/routing/controller.php @@ -179,6 +179,8 @@ protected static function references(&$destination, &$parameters) // controllers with much less code than would be usual. foreach ($parameters as $key => $value) { + if ( ! is_string($value)) continue; + $search = '(:'.($key + 1).')'; $destination = str_replace($search, $value, $destination, $count); From 056e54785514d2d724445f24f304d429e8a4e696 Mon Sep 17 00:00:00 2001 From: Ben Corlett Date: Thu, 17 May 2012 11:47:10 +1000 Subject: [PATCH 005/260] Adding output buffering to allow redirects to work after content has been outputted. Signed-off-by: Ben Corlett --- laravel/core.php | 14 ++++++++++++++ laravel/redirect.php | 19 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/laravel/core.php b/laravel/core.php index 0dcaaca5..e59e8c0b 100644 --- a/laravel/core.php +++ b/laravel/core.php @@ -17,6 +17,20 @@ define('DEFAULT_BUNDLE', 'application'); define('MB_STRING', (int) function_exists('mb_get_info')); +/* +|-------------------------------------------------------------------------- +| Start Output Buffering +|-------------------------------------------------------------------------- +| +| Output buffering allows us to capture all output at any time, so that we +| can discard it or treat it accordingly. An example of this is if you have +| echoed a string, but want to return a Redirect object. Because Symphony +| only checks if headers have been sent, your redirect just silently fails. +| +*/ + +ob_start(); + /* |-------------------------------------------------------------------------- | Require Core Classes diff --git a/laravel/redirect.php b/laravel/redirect.php index 2678f445..0f47cff8 100644 --- a/laravel/redirect.php +++ b/laravel/redirect.php @@ -165,4 +165,23 @@ public function with_errors($container) return $this->with('errors', $errors); } + /** + * Send the headers and content of the response to the browser. + * + * @return void + */ + public function send() + { + // Dump all output buffering, this ensures + // that symphony will send our redirect headers + // properly if we've outputted any content from + // within Laravel. + while (ob_get_level() > 0) + { + ob_end_clean(); + } + + return parent::send(); + } + } \ No newline at end of file From 33fdcb4ae7dbbeef851b84ff3fe888ef73186645 Mon Sep 17 00:00:00 2001 From: Ben Corlett Date: Thu, 17 May 2012 13:02:57 +1000 Subject: [PATCH 006/260] Fixing type-o with the spelling of "Symfony". Signed-off-by: Ben Corlett --- laravel/core.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/core.php b/laravel/core.php index e59e8c0b..f32e40af 100644 --- a/laravel/core.php +++ b/laravel/core.php @@ -24,7 +24,7 @@ | | Output buffering allows us to capture all output at any time, so that we | can discard it or treat it accordingly. An example of this is if you have -| echoed a string, but want to return a Redirect object. Because Symphony +| echoed a string, but want to return a Redirect object. Because Symfony | only checks if headers have been sent, your redirect just silently fails. | */ From b02fd5232ce1aac73c5c08cf8b5c66ddbe412584 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Thu, 24 May 2012 02:01:24 +0200 Subject: [PATCH 007/260] Fixing a bug that would stop the script execution before the laravel.done event has been fired for php-fastcgi users Signed-off-by: Koen Schmeets --- laravel/laravel.php | 6 +++++- .../vendor/Symfony/Component/HttpFoundation/Response.php | 4 ---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/laravel/laravel.php b/laravel/laravel.php index a1ca2061..c3fef2ee 100644 --- a/laravel/laravel.php +++ b/laravel/laravel.php @@ -178,4 +178,8 @@ | */ -Event::fire('laravel.done', array($response)); \ No newline at end of file +Event::fire('laravel.done', array($response)); + +if (function_exists('fastcgi_finish_request')) { + fastcgi_finish_request(); +} \ No newline at end of file diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Response.php b/laravel/vendor/Symfony/Component/HttpFoundation/Response.php index 3a0a22e4..dacf4722 100755 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Response.php +++ b/laravel/vendor/Symfony/Component/HttpFoundation/Response.php @@ -292,10 +292,6 @@ public function send() $this->sendHeaders(); $this->sendContent(); - if (function_exists('fastcgi_finish_request')) { - fastcgi_finish_request(); - } - return $this; } From 0f3e8eb62ba3f9e849e2ff7b777dd4b3af92a9c1 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Thu, 24 May 2012 11:49:35 +0200 Subject: [PATCH 008/260] Reverting Symfony's Response class to previous version Signed-off-by: Koen Schmeets --- laravel/vendor/Symfony/Component/HttpFoundation/Response.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Response.php b/laravel/vendor/Symfony/Component/HttpFoundation/Response.php index dacf4722..3a0a22e4 100755 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Response.php +++ b/laravel/vendor/Symfony/Component/HttpFoundation/Response.php @@ -292,6 +292,10 @@ public function send() $this->sendHeaders(); $this->sendContent(); + if (function_exists('fastcgi_finish_request')) { + fastcgi_finish_request(); + } + return $this; } From 52fded661d6c1a2faafffe8374f7771f8b351400 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Thu, 24 May 2012 11:50:48 +0200 Subject: [PATCH 009/260] Extending Symfony's Response class and adding & calling the finish method Signed-off-by: Koen Schmeets --- laravel/laravel.php | 4 +- laravel/response.php | 2 +- .../HttpFoundation/LaravelResponse.php | 40 +++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 laravel/vendor/Symfony/Component/HttpFoundation/LaravelResponse.php diff --git a/laravel/laravel.php b/laravel/laravel.php index c3fef2ee..fcdc32c5 100644 --- a/laravel/laravel.php +++ b/laravel/laravel.php @@ -180,6 +180,4 @@ Event::fire('laravel.done', array($response)); -if (function_exists('fastcgi_finish_request')) { - fastcgi_finish_request(); -} \ No newline at end of file +$response->finish(); \ No newline at end of file diff --git a/laravel/response.php b/laravel/response.php index e5472430..539f5649 100644 --- a/laravel/response.php +++ b/laravel/response.php @@ -1,7 +1,7 @@ + * + * @api + */ +class LaravelResponse extends Response +{ + + /** + * Sends HTTP headers and content. + * + * @return Response + * + * @api + */ + public function send() + { + $this->sendHeaders(); + $this->sendContent(); + + return $this; + } + + /** + * Finishes the request for PHP-FastCGI + * + * @return void + */ + public function finish() + { + if (function_exists('fastcgi_finish_request')) { + fastcgi_finish_request(); + } + } + +} From ef5ab30ca29f6a9349d921e1b3b6d6a7dd5d2edf Mon Sep 17 00:00:00 2001 From: Colin Viebrock Date: Sat, 26 May 2012 20:51:35 -0500 Subject: [PATCH 010/260] Fix ... thanks Vespakoen! --- laravel/database/schema.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/laravel/database/schema.php b/laravel/database/schema.php index 6290fa4e..a81d5bc3 100644 --- a/laravel/database/schema.php +++ b/laravel/database/schema.php @@ -47,14 +47,14 @@ public static function create($table, $callback) * @param string $name * @return void */ - public static function rename($table, $rename) + public static function rename($table, $new_name) { $table = new Schema\Table($table); // To indicate that the table needs to be renamed, we will run the // "rename" command on the table instance and pass the instance to // the execute method as calling a Closure isn't needed. - $table->rename($name); + $table->rename($new_name); return static::execute($table); } From 7f0d709b3bcfa48019059708d7530166bff6646b Mon Sep 17 00:00:00 2001 From: Ben Corlett Date: Tue, 29 May 2012 11:26:27 +1000 Subject: [PATCH 011/260] Adding mb_output_handler as the default callback for output buffering, Thanks @syntaqx --- laravel/core.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/core.php b/laravel/core.php index f32e40af..202d81b1 100644 --- a/laravel/core.php +++ b/laravel/core.php @@ -29,7 +29,7 @@ | */ -ob_start(); +ob_start('mb_output_handler'); /* |-------------------------------------------------------------------------- From 161ea09861ef42355a28c96c247b14b025d046f2 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 4 Jun 2012 20:34:04 +0300 Subject: [PATCH 012/260] Documentation: Add link to Controller Routing section to Routing submenu. --- laravel/documentation/contents.md | 1 + 1 file changed, 1 insertion(+) diff --git a/laravel/documentation/contents.md b/laravel/documentation/contents.md index 1d5ce11e..07dc02c3 100644 --- a/laravel/documentation/contents.md +++ b/laravel/documentation/contents.md @@ -18,6 +18,7 @@ ### General - [Named Routes](/docs/routing#named-routes) - [HTTPS Routes](/docs/routing#https-routes) - [Bundle Routing](/docs/routing#bundle-routing) + - [Controller Routing](/docs/routing#controller-routing) - [CLI Route Testing](/docs/routing#cli-route-testing) - [Controllers](/docs/controllers) - [The Basics](/docs/controllers#the-basics) From 3ccc37bd8fd481d9eee38caa665b851d96736136 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 4 Jun 2012 20:36:33 +0300 Subject: [PATCH 013/260] Documentation: Fix typo on routing page's TOC. --- laravel/documentation/routing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/routing.md b/laravel/documentation/routing.md index 18c90671..7d2aa6fd 100644 --- a/laravel/documentation/routing.md +++ b/laravel/documentation/routing.md @@ -4,7 +4,7 @@ ## Contents - [The Basics](#the-basics) - [Wildcards](#wildcards) -- [The 404 Events](#the-404-event) +- [The 404 Event](#the-404-event) - [Filters](#filters) - [Pattern Filters](#pattern-filters) - [Global Filters](#global-filters) From 3d7dc61697ddfe4b64c0309a76a690514f08544a Mon Sep 17 00:00:00 2001 From: Aaron Kuzemchak Date: Mon, 4 Jun 2012 14:48:22 -0400 Subject: [PATCH 014/260] Fixing multiline Blade comments, making closing comment tag required --- laravel/blade.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/laravel/blade.php b/laravel/blade.php index c362d57b..1a895ab8 100644 --- a/laravel/blade.php +++ b/laravel/blade.php @@ -185,9 +185,9 @@ protected static function extract($value, $expression) */ protected static function compile_comments($value) { - $value = preg_replace('/\{\{--(.+?)(--\}\})?\n/', "", $value); - - return preg_replace('/\{\{--((.|\s)*?)--\}\}/', "\n", $value); + $value = preg_replace('/\{\{--(.*?)--\}\}/', "", $value); + + return preg_replace('/\{\{--(.*?)--\}\}/s', "$1", $value); } /** From 75033f6287445d2bc10d779074511812363d96cc Mon Sep 17 00:00:00 2001 From: Aaron Kuzemchak Date: Mon, 4 Jun 2012 14:51:42 -0400 Subject: [PATCH 015/260] Updating docs for Blade comments --- laravel/documentation/views/templating.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/laravel/documentation/views/templating.md b/laravel/documentation/views/templating.md index 8849f0e1..c0d7b2fa 100644 --- a/laravel/documentation/views/templating.md +++ b/laravel/documentation/views/templating.md @@ -129,6 +129,12 @@ #### Blade comments: {{-- This is a comment --}} ... @endif + + {{-- + This is + a multi-line + comment. + --}} > **Note:** Blade comments, unlike HTML comments, are not visible in the HTML source. From db351fedf05776480435ebef635dc43716aa5e56 Mon Sep 17 00:00:00 2001 From: Samuel Fitz Date: Tue, 5 Jun 2012 13:31:21 -0600 Subject: [PATCH 016/260] added dblib option to sqlsrv connector class /sam fitz (abigwonderful) simple conditional added to look for dsn type. if set and is dblib, syntax for PDO connection adjusted slightly to allow for mac connection to mssql server (utilizing freetds) --- laravel/database/connectors/sqlserver.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/laravel/database/connectors/sqlserver.php b/laravel/database/connectors/sqlserver.php index 29c6929b..04d9d770 100644 --- a/laravel/database/connectors/sqlserver.php +++ b/laravel/database/connectors/sqlserver.php @@ -28,8 +28,16 @@ public function connect($config) // also be used to connect to Azure SQL Server databases. The port is defined // directly after the server name, so we'll create that first. $port = (isset($port)) ? ','.$port : ''; - - $dsn = "sqlsrv:Server={$host}{$port};Database={$database}"; + + //check for dblib for mac users connecting to mssql (utilizes freetds) + if (!empty($dsn_type) and $dsn_type == 'dblib') + { + $dsn = "dblib:host={$host}{$port};dbname={$database}"; + } + else + { + $dsn = "sqlsrv:Server={$host}{$port};Database={$database}"; + } return new PDO($dsn, $username, $password, $this->options($config)); } From ea3021f3dd6c22beab5aa460f0319cd7ab8d910d Mon Sep 17 00:00:00 2001 From: Loic Sharma Date: Tue, 5 Jun 2012 22:46:35 -0500 Subject: [PATCH 017/260] Fixed bug where the profiler did not correctly put quotes around bindings --- laravel/profiling/profiler.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/laravel/profiling/profiler.php b/laravel/profiling/profiler.php index 9b6edfef..ec14004f 100644 --- a/laravel/profiling/profiler.php +++ b/laravel/profiling/profiler.php @@ -54,6 +54,8 @@ public static function query($sql, $bindings, $time) { foreach ($bindings as $binding) { + $binding = "'{$binding}'"; + $sql = preg_replace('/\?/', $binding, $sql, 1); } From f2e915f13d930f765bc918208bbefdef7155f695 Mon Sep 17 00:00:00 2001 From: Loic Sharma Date: Tue, 5 Jun 2012 22:57:56 -0500 Subject: [PATCH 018/260] Improved the way the quotes were added to the bindings. --- laravel/profiling/profiler.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/laravel/profiling/profiler.php b/laravel/profiling/profiler.php index ec14004f..73f4d4fd 100644 --- a/laravel/profiling/profiler.php +++ b/laravel/profiling/profiler.php @@ -5,6 +5,7 @@ use Laravel\Event; use Laravel\Config; use Laravel\Request; +use Laravel\Database; class Profiler { @@ -54,7 +55,7 @@ public static function query($sql, $bindings, $time) { foreach ($bindings as $binding) { - $binding = "'{$binding}'"; + $binding = Database::connection()->pdo->quote($binding); $sql = preg_replace('/\?/', $binding, $sql, 1); } From 6881bdaf027fdfd8b90db4fe1bd61c1c606c43f0 Mon Sep 17 00:00:00 2001 From: Jason Walton Date: Mon, 11 Jun 2012 09:18:42 -0700 Subject: [PATCH 019/260] Added required_with validation rule to conditionally require an attribute based on the presence of another attribute Signed-off-by: Jason Walton --- laravel/documentation/validation.md | 3 +++ laravel/validator.php | 23 ++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/laravel/documentation/validation.md b/laravel/documentation/validation.md index 49401439..528cea75 100644 --- a/laravel/documentation/validation.md +++ b/laravel/documentation/validation.md @@ -63,6 +63,9 @@ #### Validate that an attribute is present and is not an empty string: 'name' => 'required' +#### Validate that an attribute is present, when another attribute is present: + 'last_name' => 'required_with:first_name' + ### Alpha, Alpha Numeric, & Alpha Dash diff --git a/laravel/validator.php b/laravel/validator.php index 3290bc17..968e94b7 100644 --- a/laravel/validator.php +++ b/laravel/validator.php @@ -214,7 +214,7 @@ protected function validatable($rule, $attribute, $value) */ protected function implicit($rule) { - return $rule == 'required' or $rule == 'accepted'; + return $rule == 'required' or $rule == 'accepted' or $rule == 'required_with'; } /** @@ -257,6 +257,27 @@ protected function validate_required($attribute, $value) return true; } + /** + * Validate that an attribute exists in the attributes array, if another + * attribute exists in the attributes array. + * + * @param string $attribute + * @param mixed $value + * @param array $parameters + * @return bool + */ + protected function validate_required_with($attribute, $value, $parameters) + { + $other = $parameters[0]; + + if ($this->validate_required($other, $this->attributes[$other])) + { + return $this->validate_required($attribute, $value); + } + + return true; + } + /** * Validate that an attribute has a matching confirmation attribute. * From 06d7abc2d4b1137b2e4a9d40ba8d71cdb571272a Mon Sep 17 00:00:00 2001 From: dlabs88 Date: Tue, 12 Jun 2012 04:00:15 +0300 Subject: [PATCH 020/260] Route::get('admin', array('before' => 'auth', function() {})); forgot the last ) --- laravel/documentation/auth/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/auth/usage.md b/laravel/documentation/auth/usage.md index e02747a0..8a9a0650 100644 --- a/laravel/documentation/auth/usage.md +++ b/laravel/documentation/auth/usage.md @@ -63,7 +63,7 @@ ## Protecting Routes To protect a route, simply attach the **auth** filter: - Route::get('admin', array('before' => 'auth', function() {}); + Route::get('admin', array('before' => 'auth', function() {})); > **Note:** You are free to edit the **auth** filter however you like. A default implementation is located in **application/routes.php**. From fafaf724b0113bee94b9825a7779a672cd4adf82 Mon Sep 17 00:00:00 2001 From: Chris Berthe Date: Wed, 13 Jun 2012 11:19:20 -0400 Subject: [PATCH 021/260] Grammar/Vocabulary fixes Signed-off-by: Chris Berthe --- application/config/application.php | 8 ++++---- application/config/cache.php | 2 +- application/config/database.php | 4 ++-- application/config/error.php | 4 ++-- application/config/session.php | 2 +- application/config/strings.php | 2 +- bundles/docs/routes.php | 4 ++-- laravel/auth/drivers/driver.php | 4 ++-- laravel/auth/drivers/fluent.php | 2 +- laravel/autoloader.php | 6 +++--- laravel/blade.php | 2 +- laravel/bundle.php | 14 +++++++------- laravel/cli/artisan.php | 2 +- laravel/cli/command.php | 2 +- laravel/cli/tasks/bundle/providers/provider.php | 2 +- laravel/cli/tasks/migrate/migrator.php | 6 +++--- laravel/config.php | 4 ++-- laravel/cookie.php | 2 +- laravel/core.php | 6 +++--- laravel/database/connection.php | 6 +++--- laravel/database/eloquent/model.php | 4 ++-- laravel/database/eloquent/query.php | 8 ++++---- .../relationships/has_many_and_belongs_to.php | 4 ++-- laravel/database/grammar.php | 4 ++-- laravel/database/query.php | 16 ++++++++-------- laravel/database/query/grammars/grammar.php | 14 +++++++------- laravel/database/query/grammars/postgres.php | 2 +- laravel/database/query/grammars/sqlserver.php | 2 +- laravel/database/schema.php | 2 +- laravel/database/schema/grammars/mysql.php | 10 +++++----- laravel/database/schema/grammars/postgres.php | 4 ++-- laravel/database/schema/grammars/sqlite.php | 12 ++++++------ laravel/database/schema/grammars/sqlserver.php | 8 ++++---- laravel/error.php | 2 +- laravel/event.php | 2 +- laravel/file.php | 8 ++++---- laravel/helpers.php | 2 +- laravel/ioc.php | 4 ++-- laravel/lang.php | 2 +- laravel/laravel.php | 6 +++--- laravel/log.php | 2 +- laravel/paginator.php | 2 +- laravel/pluralizer.php | 6 +++--- laravel/response.php | 2 +- laravel/routing/filter.php | 2 +- laravel/routing/route.php | 8 ++++---- laravel/routing/router.php | 10 +++++----- laravel/session.php | 2 +- laravel/session/drivers/driver.php | 2 +- laravel/uri.php | 2 +- laravel/url.php | 6 +++--- laravel/validator.php | 10 +++++----- laravel/view.php | 4 ++-- paths.php | 2 +- 54 files changed, 130 insertions(+), 130 deletions(-) diff --git a/application/config/application.php b/application/config/application.php index 9f597954..1bf0137f 100755 --- a/application/config/application.php +++ b/application/config/application.php @@ -8,7 +8,7 @@ |-------------------------------------------------------------------------- | | The URL used to access your application without a trailing slash. The URL - | does not have to be set. If it isn't we'll try our best to guess the URL + | does not have to be set. If it isn't, we'll try our best to guess the URL | of your application. | */ @@ -48,7 +48,7 @@ | | This key is used by the encryption and cookie classes to generate secure | encrypted strings and hashes. It is extremely important that this key - | remain secret and should not be shared with anyone. Make it about 32 + | remains secret and it should not be shared with anyone. Make it about 32 | characters of random gibberish. | */ @@ -63,7 +63,7 @@ | Laravel includes a beautiful profiler toolbar that gives you a heads | up display of the queries and logs performed by your application. | This is wonderful for development, but, of course, you should - | disable the toolbar for production applications.. + | disable the toolbar for production applications. | */ @@ -99,7 +99,7 @@ | SSL Link Generation |-------------------------------------------------------------------------- | - | Many sites use SSL to protect their users data. However, you may not be + | Many sites use SSL to protect their users' data. However, you may not be | able to use SSL on your development machine, meaning all HTTPS will be | broken during development. | diff --git a/application/config/cache.php b/application/config/cache.php index a507ff66..5dc267e6 100644 --- a/application/config/cache.php +++ b/application/config/cache.php @@ -29,7 +29,7 @@ | This key will be prepended to item keys stored using Memcached and APC | to prevent collisions with other applications on the server. Since the | memory based stores could be shared by other applications, we need to - | be polite and use a prefix to uniquely identifier our items. + | be polite and use a prefix to uniquely identify our items. | */ diff --git a/application/config/database.php b/application/config/database.php index d5e6ac1b..94b36f11 100644 --- a/application/config/database.php +++ b/application/config/database.php @@ -35,7 +35,7 @@ | Default Database Connection |-------------------------------------------------------------------------- | - | The name of your default database connection. This connection will used + | The name of your default database connection. This connection will be used | as the default for all database operations unless a different name is | given when performing said operation. This connection name should be | listed in the array of connections below. @@ -54,7 +54,7 @@ | the freedom to specify as many connections as you can handle. | | All database work in Laravel is done through the PHP's PDO facilities, - | so make sure you have the PDO drivers for your particlar database of + | so make sure you have the PDO drivers for your particular database of | choice installed on your machine. | */ diff --git a/application/config/error.php b/application/config/error.php index 1713afce..c4d27fe4 100644 --- a/application/config/error.php +++ b/application/config/error.php @@ -9,7 +9,7 @@ | | Here you simply specify the error levels that should be ignored by the | Laravel error handler. These levels will still be logged; however, no - | information about about them will be displayed. + | information about them will be displayed. | */ @@ -56,7 +56,7 @@ | logging is enabled. | | You may log the error message however you like; however, a simple log - | solution has been setup for you which will log all error messages to + | solution has been set up for you which will log all error messages to | text files within the application storage directory. | */ diff --git a/application/config/session.php b/application/config/session.php index ea686f89..dbfe8b27 100644 --- a/application/config/session.php +++ b/application/config/session.php @@ -23,7 +23,7 @@ | Session Database |-------------------------------------------------------------------------- | - | The database table on which the session should be stored. It probably + | The database table in which the session should be stored. It probably | goes without saying that this option only matters if you are using | the super slick database session driver. | diff --git a/application/config/strings.php b/application/config/strings.php index 5d94f81c..3d8b68f6 100644 --- a/application/config/strings.php +++ b/application/config/strings.php @@ -8,7 +8,7 @@ |-------------------------------------------------------------------------- | | This array contains the singular and plural forms of words. It's used by - | the "singular" and "plural" methods on the Str class to convert a given + | the "singular" and "plural" methods in the Str class to convert a given | word from singular to plural and vice versa. | | Note that the regular expressions are only for inflecting English words. diff --git a/bundles/docs/routes.php b/bundles/docs/routes.php index 334c652d..2a8561ff 100644 --- a/bundles/docs/routes.php +++ b/bundles/docs/routes.php @@ -38,7 +38,7 @@ function document_exists($page) } /** - * Attach the sidebar to the documentatoin template. + * Attach the sidebar to the documentation template. */ View::composer('docs::template', function($view) { @@ -68,7 +68,7 @@ function document_exists($page) // If no page was specified, but a "home" page exists for the section, // we'll set the file to the home page so that the proper page is - // display back out to the client for the requested doc page. + // displayed back out to the client for the requested doc page. if (is_null($page) and document_exists($file.'/home')) { $file .= '/home'; diff --git a/laravel/auth/drivers/driver.php b/laravel/auth/drivers/driver.php index 4a272ba4..db649d24 100644 --- a/laravel/auth/drivers/driver.php +++ b/laravel/auth/drivers/driver.php @@ -80,7 +80,7 @@ public function user() } /** - * Get the a given application user by ID. + * Get the given application user by ID. * * @param int $id * @return mixed @@ -192,7 +192,7 @@ protected function cookie($name, $value, $minutes) } /** - * Get session key name used to store the token. + * Get the session key name used to store the token. * * @return string */ diff --git a/laravel/auth/drivers/fluent.php b/laravel/auth/drivers/fluent.php index 4c23468b..0bac2b01 100644 --- a/laravel/auth/drivers/fluent.php +++ b/laravel/auth/drivers/fluent.php @@ -11,7 +11,7 @@ class Fluent extends Driver { * * If the user is a guest, null should be returned. * - * @param int $id + * @param int $id * @return mixed|null */ public function retrieve($id) diff --git a/laravel/autoloader.php b/laravel/autoloader.php index 296b9dbd..4168e305 100644 --- a/laravel/autoloader.php +++ b/laravel/autoloader.php @@ -40,7 +40,7 @@ class Autoloader { /** * Load the file corresponding to a given class. * - * This method is registerd in the bootstrap file as an SPL auto-loader. + * This method is registered in the bootstrap file as an SPL auto-loader. * * @param string $class * @return void @@ -55,7 +55,7 @@ public static function load($class) return class_alias(static::$aliases[$class], $class); } - // All classes in Laravel are staticly mapped. There is no crazy search + // All classes in Laravel are statically mapped. There is no crazy search // routine that digs through directories. It's just a simple array of // class to file path maps for ultra-fast file loading. elseif (isset(static::$mappings[$class])) @@ -102,7 +102,7 @@ protected static function load_namespaced($class, $namespace, $directory) protected static function load_psr($class, $directory = null) { // The PSR-0 standard indicates that class namespaces and underscores - // shoould be used to indcate the directory tree in which the class + // should be used to indicate the directory tree in which the class // resides, so we'll convert them to slashes. $file = str_replace(array('\\', '_'), '/', $class); diff --git a/laravel/blade.php b/laravel/blade.php index c362d57b..12381482 100644 --- a/laravel/blade.php +++ b/laravel/blade.php @@ -150,7 +150,7 @@ protected static function compile_layouts($value) } // First we'll split out the lines of the template so we can get the - // layout from the top of the template. By convention it must be + // layout from the top of the template. By convention, it must be // located on the first line of the template contents. $lines = preg_split("/(\r?\n)/", $value); diff --git a/laravel/bundle.php b/laravel/bundle.php index 2259228e..ea057475 100644 --- a/laravel/bundle.php +++ b/laravel/bundle.php @@ -46,7 +46,7 @@ public static function register($bundle, $config = array()) // If the given configuration is actually a string, we will assume it is a // location and set the bundle name to match it. This is common for most - // bundles who simply live in the root bundle directory. + // bundles that simply live in the root bundle directory. if (is_string($config)) { $bundle = $config; @@ -55,7 +55,7 @@ public static function register($bundle, $config = array()) } // If no location is set, we will set the location to match the name of - // the bundle. This is for bundles who are installed to the root of + // the bundle. This is for bundles that are installed on the root of // the bundle directory so a location was not set. if ( ! isset($config['location'])) { @@ -66,7 +66,7 @@ public static function register($bundle, $config = array()) // It is possible for the developer to specify auto-loader mappings // directly on the bundle registration. This provides a convenient - // way to register mappings withuot a bootstrap. + // way to register mappings without a bootstrap. if (isset($config['autoloads'])) { static::autoloads($bundle, $config); @@ -74,7 +74,7 @@ public static function register($bundle, $config = array()) } /** - * Load a bundle by running it's start-up script. + * Load a bundle by running its start-up script. * * If the bundle has already been started, no action will be taken. * @@ -124,7 +124,7 @@ public static function routes($bundle) $path = static::path($bundle).'routes'.EXT; - // By setting the bundle property on the router the router knows what + // By setting the bundle property on the router, the router knows what // value to replace the (:bundle) place-holder with when the bundle // routes are added, keeping the routes flexible. Router::$bundle = static::option($bundle, 'handles'); @@ -201,7 +201,7 @@ public static function handles($uri) } /** - * Deteremine if a bundle exists within the bundles directory. + * Determine if a bundle exists within the bundles directory. * * @param string $bundle * @return bool @@ -372,7 +372,7 @@ public static function resolve($bundle) } /** - * Parse a element identifier and return the bundle name and element. + * Parse an element identifier and return the bundle name and element. * * * // Returns array(null, 'admin.user') diff --git a/laravel/cli/artisan.php b/laravel/cli/artisan.php index 46886dc8..e7bd130e 100644 --- a/laravel/cli/artisan.php +++ b/laravel/cli/artisan.php @@ -34,7 +34,7 @@ * We will wrap the command execution in a try / catch block and * simply write out any exception messages we receive to the CLI * for the developer. Note that this only writes out messages - * for the CLI exceptions. All others will be not be caught + * for the CLI exceptions. All others will not be caught * and will be totally dumped out to the CLI. */ try diff --git a/laravel/cli/command.php b/laravel/cli/command.php index 7b4ae3af..de11406e 100644 --- a/laravel/cli/command.php +++ b/laravel/cli/command.php @@ -121,7 +121,7 @@ public static function resolve($bundle, $task) } // If the task file exists, we'll format the bundle and task name - // into a task class name and resolve an instance of the so that + // into a task class name and resolve an instance of the class so that // the requested method may be executed. if (file_exists($path = Bundle::path($bundle).'tasks/'.$task.EXT)) { diff --git a/laravel/cli/tasks/bundle/providers/provider.php b/laravel/cli/tasks/bundle/providers/provider.php index bf6401f7..3a5e880c 100644 --- a/laravel/cli/tasks/bundle/providers/provider.php +++ b/laravel/cli/tasks/bundle/providers/provider.php @@ -27,7 +27,7 @@ protected function zipball($url, $bundle, $path) // When installing a bundle from a Zip archive, we'll first clone // down the bundle zip into the bundles "working" directory so - // we have a spot to do all of our bundle extration work. + // we have a spot to do all of our bundle extraction work. $target = $work.'laravel-bundle.zip'; File::put($target, $this->download($url)); diff --git a/laravel/cli/tasks/migrate/migrator.php b/laravel/cli/tasks/migrate/migrator.php index 5bf7617b..4ab2ef05 100644 --- a/laravel/cli/tasks/migrate/migrator.php +++ b/laravel/cli/tasks/migrate/migrator.php @@ -151,7 +151,7 @@ public function install() $table->create(); // Migrations can be run for a specific bundle, so we'll use - // the bundle name and string migration name as an unique ID + // the bundle name and string migration name as a unique ID // for the migrations, allowing us to easily identify which // migrations have been run for each bundle. $table->string('bundle', 50); @@ -206,7 +206,7 @@ public function make($arguments = array()) // Once the migration has been created, we'll return the // migration file name so it can be used by the task - // consumer if necessary for futher work. + // consumer if necessary for further work. return $file; } @@ -223,7 +223,7 @@ protected function stub($bundle, $migration) $prefix = Bundle::class_prefix($bundle); - // The class name is formatted simialrly to tasks and controllers, + // The class name is formatted similarly to tasks and controllers, // where the bundle name is prefixed to the class if it is not in // the default "application" bundle. $class = $prefix.Str::classify($migration); diff --git a/laravel/config.php b/laravel/config.php index 50bd7dc8..ac46693b 100644 --- a/laravel/config.php +++ b/laravel/config.php @@ -73,7 +73,7 @@ public static function get($key, $default = null) $items = static::$items[$bundle][$file]; // If a specific configuration item was not requested, the key will be null, - // meaning we'll to return the entire array of configuration item from the + // meaning we'll return the entire array of configuration items from the // requested configuration file. Otherwise we can return the item. if (is_null($item)) { @@ -175,7 +175,7 @@ public static function load($bundle, $file) // requested. This allows many types of config "drivers". $config = Event::first(static::loader, func_get_args()); - // If configuration items were actually found for the bundle and file we + // If configuration items were actually found for the bundle and file, we // will add them to the configuration array and return true, otherwise // we will return false indicating the file was not found. if (count($config) > 0) diff --git a/laravel/cookie.php b/laravel/cookie.php index 1f79a69b..8bb508a1 100644 --- a/laravel/cookie.php +++ b/laravel/cookie.php @@ -3,7 +3,7 @@ class Cookie { /** - * How long is forever (in minutes). + * How long is forever (in minutes)? * * @var int */ diff --git a/laravel/core.php b/laravel/core.php index a38bf9dd..b19d924d 100644 --- a/laravel/core.php +++ b/laravel/core.php @@ -147,7 +147,7 @@ | Determine The Application Environment |-------------------------------------------------------------------------- | -| Next we're ready to determine the application environment. This may be +| Next, we're ready to determine the application environment. This may be | set either via the command line options or via the mapping of URIs to | environments that lives in the "paths.php" file for the application | and is parsed. When determining the CLI environment, the "--env" @@ -178,7 +178,7 @@ | | Once we have determined the application environment, we will set it on | the global server array of the HttpFoundation request. This makes it -| available throughout the application, thought it is mainly only +| available throughout the application, though it is mainly only | used to determine which configuration files to merge in. | */ @@ -216,7 +216,7 @@ |-------------------------------------------------------------------------- | | Finally we will register all of the bundles that have been defined for -| the application. None of them will be started yet, but will be setup +| the application. None of them will be started yet, but will be set up | so that they may be started by the developer at any time. | */ diff --git a/laravel/database/connection.php b/laravel/database/connection.php index 66601ef8..b3774fd4 100644 --- a/laravel/database/connection.php +++ b/laravel/database/connection.php @@ -209,7 +209,7 @@ public function query($sql, $bindings = array()) /** * Execute a SQL query against the connection. * - * The PDO statement and boolean result will be return in an array. + * The PDO statement and boolean result will be returned in an array. * * @param string $sql * @param array $bindings @@ -265,7 +265,7 @@ protected function execute($sql, $bindings = array()) throw $exception; } - // Once we have execute the query, we log the SQL, bindings, and + // Once we have executed the query, we log the SQL, bindings, and // execution time in a static array that is accessed by all of // the connections actively being used by the application. if (Config::get('database.profile')) @@ -287,7 +287,7 @@ protected function fetch($statement, $style) { // If the fetch style is "class", we'll hydrate an array of PHP // stdClass objects as generic containers for the query rows, - // otherwise we'll just use the fetch styel value. + // otherwise we'll just use the fetch style value. if ($style === PDO::FETCH_CLASS) { return $statement->fetchAll(PDO::FETCH_CLASS, 'stdClass'); diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index 2c28b8f9..64802cdc 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -736,7 +736,7 @@ public function __call($method, $parameters) { $meta = array('key', 'table', 'connection', 'sequence', 'per_page', 'timestamps'); - // If the method is actually the name of a static property on the model we'll + // If the method is actually the name of a static property on the model, we'll // return the value of the static property. This makes it convenient for // relationships to access these values off of the instances. if (in_array($method, $meta)) @@ -746,7 +746,7 @@ public function __call($method, $parameters) $underscored = array('with', 'find'); - // Some methods need to be accessed both staticly and non-staticly so we'll + // Some methods need to be accessed both statically and non-statically so we'll // keep underscored methods of those methods and intercept calls to them // here so they can be called either way on the model instance. if (in_array($method, $underscored)) diff --git a/laravel/database/eloquent/query.php b/laravel/database/eloquent/query.php index 3aee79c9..f3a54174 100644 --- a/laravel/database/eloquent/query.php +++ b/laravel/database/eloquent/query.php @@ -118,7 +118,7 @@ public function hydrate($model, $results) $new = new $class(array(), true); // We need to set the attributes manually in case the accessible property is - // set on the array which will prevent the mass assignemnt of attributes if + // set on the array which will prevent the mass assignment of attributes if // we were to pass them in using the constructor or fill methods. $new->fill_raw($result); @@ -141,7 +141,7 @@ public function hydrate($model, $results) } } - // The many to many relationships may have pivot table column on them + // The many to many relationships may have pivot table columns on them // so we will call the "clean" method on the relationship to remove // any pivot columns that are on the model. if ($this instanceof Relationships\Has_Many_And_Belongs_To) @@ -199,7 +199,7 @@ protected function nested_includes($relationship) foreach ($this->model_includes() as $include => $constraints) { // To get the nested includes, we want to find any includes that begin - // the relationship and a dot, then we will strip off the leading + // the relationship with a dot, then we will strip off the leading // nesting indicator and set the include in the array. if (starts_with($include, $relationship.'.')) { @@ -222,7 +222,7 @@ protected function model_includes() foreach ($this->model->includes as $relationship => $constraints) { // When eager loading relationships, constraints may be set on the eager - // load definition; however, is none are set, we need to swap the key + // load definition; however, if none are set, we need to swap the key // and the value of the array since there are no constraints. if (is_numeric($relationship)) { diff --git a/laravel/database/eloquent/relationships/has_many_and_belongs_to.php b/laravel/database/eloquent/relationships/has_many_and_belongs_to.php index 587e504c..5b247c9c 100644 --- a/laravel/database/eloquent/relationships/has_many_and_belongs_to.php +++ b/laravel/database/eloquent/relationships/has_many_and_belongs_to.php @@ -44,7 +44,7 @@ public function __construct($model, $associated, $table, $foreign, $other) $this->joining = $table ?: $this->joining($model, $associated); // If the Pivot table is timestamped, we'll set the timestamp columns to be - // fetched when the pivot table models are fetched by the developer else + // fetched when the pivot table models are fetched by the developer, or else // the ID will be the only "extra" column fetched in by default. if (Pivot::$timestamps) { @@ -131,7 +131,7 @@ public function sync($ids) } // Next we will take the difference of the current and given IDs and detach - // all of the entities that exists in the current array but are not in + // all of the entities that exist in the current array but are not in // the array of IDs given to the method, finishing the sync. $detach = array_diff($current, $ids); diff --git a/laravel/database/grammar.php b/laravel/database/grammar.php index 13d92d8e..0ff5bd14 100644 --- a/laravel/database/grammar.php +++ b/laravel/database/grammar.php @@ -35,7 +35,7 @@ public function __construct(Connection $connection) */ public function wrap_table($table) { - // Expressions should be injected into the query as raw strings so + // Expressions should be injected into the query as raw strings // so we do not want to wrap them in any way. We will just return // the string value from the expression to be included. if ($table instanceof Expression) @@ -64,7 +64,7 @@ public function wrap_table($table) */ public function wrap($value) { - // Expressions should be injected into the query as raw strings so + // Expressions should be injected into the query as raw strings // so we do not want to wrap them in any way. We will just return // the string value from the expression to be included. if ($value instanceof Expression) diff --git a/laravel/database/query.php b/laravel/database/query.php index 83c92b83..1fafb1cb 100644 --- a/laravel/database/query.php +++ b/laravel/database/query.php @@ -158,7 +158,7 @@ public function join($table, $column1, $operator = null, $column2 = null, $type { // If the "column" is really an instance of a Closure, the developer is // trying to create a join with a complex "ON" clause. So, we will add - // the join, and then call the Closure with the join/ + // the join, and then call the Closure with the join. if ($column1 instanceof Closure) { $this->joins[] = new Query\Join($type, $table); @@ -167,8 +167,8 @@ public function join($table, $column1, $operator = null, $column2 = null, $type } // If the column is just a string, we can assume that the join just - // has a simple on clause, and we'll create the join instance and - // add the clause automatically for the develoepr. + // has a simple "ON" clause, and we'll create the join instance and + // add the clause automatically for the developer. else { $join = new Query\Join($type, $table); @@ -453,7 +453,7 @@ private function dynamic_where($method, $parameters) foreach ($segments as $segment) { - // If the segment is not a boolean connector, we can assume it it is + // If the segment is not a boolean connector, we can assume it is // a column name, and we'll add it to the query as a new constraint // of the query's where clause and keep iterating the segments. if ($segment != '_and_' and $segment != '_or_') @@ -676,7 +676,7 @@ public function get($columns = array('*')) public function aggregate($aggregator, $columns) { // We'll set the aggregate value so the grammar does not try to compile - // a SELECT clause on the query. If an aggregator is present, it's own + // a SELECT clause on the query. If an aggregator is present, its own // grammar function will be used to build the SQL syntax. $this->aggregate = compact('aggregator', 'columns'); @@ -730,12 +730,12 @@ public function insert($values) { // Force every insert to be treated like a batch insert to make creating // the binding array simpler since we can just spin through the inserted - // rows as if there/ was more than one every time. + // rows as if there was more than one every time. if ( ! is_array(reset($values))) $values = array($values); $bindings = array(); - // We need to merge the the insert values into the array of the query + // We need to merge the insert values into the array of the query // bindings so that they will be bound to the PDO statement when it // is executed by the database connection. foreach ($values as $value) @@ -836,7 +836,7 @@ public function update($values) /** * Execute the query as a DELETE statement. * - * Optionally, an ID may be passed to the method do delete a specific row. + * Optionally, an ID may be passed to the method to delete a specific row. * * @param int $id * @return int diff --git a/laravel/database/query/grammars/grammar.php b/laravel/database/query/grammars/grammar.php index 65c62cf3..5f3c88e7 100644 --- a/laravel/database/query/grammars/grammar.php +++ b/laravel/database/query/grammars/grammar.php @@ -13,7 +13,7 @@ class Grammar extends \Laravel\Database\Grammar { public $datetime = 'Y-m-d H:i:s'; /** - * All of the query componenets in the order they should be built. + * All of the query components in the order they should be built. * * @var array */ @@ -125,7 +125,7 @@ protected function from(Query $query) protected function joins(Query $query) { // We need to iterate through each JOIN clause that is attached to the - // query an translate it into SQL. The table and the columns will be + // query and translate it into SQL. The table and the columns will be // wrapped in identifiers to avoid naming collisions. foreach ($query->joins as $join) { @@ -135,7 +135,7 @@ protected function joins(Query $query) // Each JOIN statement may have multiple clauses, so we will iterate // through each clause creating the conditions then we'll join all - // of the together at the end to build the clause. + // of them together at the end to build the clause. foreach ($join->clauses as $clause) { extract($clause); @@ -149,7 +149,7 @@ protected function joins(Query $query) // The first clause will have a connector on the front, but it is // not needed on the first condition, so we will strip it off of - // the condition before adding it to the arrya of joins. + // the condition before adding it to the array of joins. $search = array('AND ', 'OR '); $clauses[0] = str_replace($search, '', $clauses[0]); @@ -376,7 +376,7 @@ public function insert(Query $query, $values) } /** - * Compile a SQL INSERT and get ID statment from a Query instance. + * Compile a SQL INSERT and get ID statement from a Query instance. * * @param Query $query * @param array $values @@ -389,7 +389,7 @@ public function insert_get_id(Query $query, $values, $column) } /** - * Compile a SQL UPDATE statment from a Query instance. + * Compile a SQL UPDATE statement from a Query instance. * * @param Query $query * @param array $values @@ -416,7 +416,7 @@ public function update(Query $query, $values) } /** - * Compile a SQL DELETE statment from a Query instance. + * Compile a SQL DELETE statement from a Query instance. * * @param Query $query * @return string diff --git a/laravel/database/query/grammars/postgres.php b/laravel/database/query/grammars/postgres.php index 002b4cc7..6041ae82 100644 --- a/laravel/database/query/grammars/postgres.php +++ b/laravel/database/query/grammars/postgres.php @@ -5,7 +5,7 @@ class Postgres extends Grammar { /** - * Compile a SQL INSERT and get ID statment from a Query instance. + * Compile a SQL INSERT and get ID statement from a Query instance. * * @param Query $query * @param array $values diff --git a/laravel/database/query/grammars/sqlserver.php b/laravel/database/query/grammars/sqlserver.php index def519a5..f912f562 100644 --- a/laravel/database/query/grammars/sqlserver.php +++ b/laravel/database/query/grammars/sqlserver.php @@ -95,7 +95,7 @@ protected function ansi_offset(Query $query, $components) // Next we need to calculate the constraint that should be placed on // the row number to get the correct offset and limit on the query. - // If there is not limit, we'll just handle the offset. + // If there is not a limit, we'll just handle the offset. if ($query->limit > 0) { $finish = $query->offset + $query->limit; diff --git a/laravel/database/schema.php b/laravel/database/schema.php index c7e56309..c943e15c 100644 --- a/laravel/database/schema.php +++ b/laravel/database/schema.php @@ -71,7 +71,7 @@ public static function execute($table) { // The implications method is responsible for finding any fluently // defined indexes on the schema table and adding the explicit - // commands that are needed to tbe schema instance. + // commands that are needed for the schema instance. static::implications($table); foreach ($table->commands as $command) diff --git a/laravel/database/schema/grammars/mysql.php b/laravel/database/schema/grammars/mysql.php index c2ae7455..fa725136 100644 --- a/laravel/database/schema/grammars/mysql.php +++ b/laravel/database/schema/grammars/mysql.php @@ -37,7 +37,7 @@ public function create(Table $table, Fluent $command) } /** - * Geenrate the SQL statements for a table modification command. + * Generate the SQL statements for a table modification command. * * @param Table $table * @param Fluent $command @@ -47,7 +47,7 @@ public function add(Table $table, Fluent $command) { $columns = $this->columns($table); - // Once we the array of column definitions, we need to add "add" to the + // Once we have the array of column definitions, we need to add "add" to the // front of each definition, then we'll concatenate the definitions // using commas like normal and generate the SQL. $columns = implode(', ', array_map(function($column) @@ -260,7 +260,7 @@ public function drop_primary(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command @@ -284,7 +284,7 @@ public function drop_fulltext(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command @@ -353,7 +353,7 @@ protected function type_float(Fluent $column) } /** - * Generate the data-type definintion for a decimal. + * Generate the data-type definition for a decimal. * * @param Fluent $column * @return string diff --git a/laravel/database/schema/grammars/postgres.php b/laravel/database/schema/grammars/postgres.php index 930c5160..9853523f 100644 --- a/laravel/database/schema/grammars/postgres.php +++ b/laravel/database/schema/grammars/postgres.php @@ -35,7 +35,7 @@ public function add(Table $table, Fluent $command) { $columns = $this->columns($table); - // Once we the array of column definitions, we need to add "add" to the + // Once we have the array of column definitions, we need to add "add" to the // front of each definition, then we'll concatenate the definitions // using commas like normal and generate the SQL. $columns = implode(', ', array_map(function($column) @@ -246,7 +246,7 @@ public function drop_primary(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command diff --git a/laravel/database/schema/grammars/sqlite.php b/laravel/database/schema/grammars/sqlite.php index 09102f52..31e23624 100644 --- a/laravel/database/schema/grammars/sqlite.php +++ b/laravel/database/schema/grammars/sqlite.php @@ -29,7 +29,7 @@ public function create(Table $table, Fluent $command) return $value->type == 'primary'; }); - // If we found primary key in the array of commands, we'll create the SQL for + // If we found primary keys in the array of commands, we'll create the SQL for // the key addition and append it to the SQL table creation statement for // the schema table so the index is properly generated. if ( ! is_null($primary)) @@ -43,7 +43,7 @@ public function create(Table $table, Fluent $command) } /** - * Geenrate the SQL statements for a table modification command. + * Generate the SQL statements for a table modification command. * * @param Table $table * @param Fluent $command @@ -53,7 +53,7 @@ public function add(Table $table, Fluent $command) { $columns = $this->columns($table); - // Once we the array of column definitions, we need to add "add" to the + // Once we have the array of column definitions, we need to add "add" to the // front of each definition, then we'll concatenate the definitions // using commas like normal and generate the SQL. $columns = array_map(function($column) @@ -87,7 +87,7 @@ protected function columns(Table $table) { // Each of the data type's have their own definition creation method // which is responsible for creating the SQL for the type. This lets - // us to keep the syntax easy and fluent, while translating the + // us keep the syntax easy and fluent, while translating the // types to the types used by the database. $sql = $this->wrap($column).' '.$this->type($column); @@ -214,7 +214,7 @@ public function drop(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command @@ -226,7 +226,7 @@ public function drop_unique(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command diff --git a/laravel/database/schema/grammars/sqlserver.php b/laravel/database/schema/grammars/sqlserver.php index 5f756c2e..0e556abd 100644 --- a/laravel/database/schema/grammars/sqlserver.php +++ b/laravel/database/schema/grammars/sqlserver.php @@ -32,7 +32,7 @@ public function create(Table $table, Fluent $command) } /** - * Geenrate the SQL statements for a table modification command. + * Generate the SQL statements for a table modification command. * * @param Table $table * @param Fluent $command @@ -42,7 +42,7 @@ public function add(Table $table, Fluent $command) { $columns = $this->columns($table); - // Once we the array of column definitions, we need to add "add" to the + // Once we have the array of column definitions, we need to add "add" to the // front of each definition, then we'll concatenate the definitions // using commas like normal and generate the SQL. $columns = implode(', ', array_map(function($column) @@ -235,7 +235,7 @@ public function drop_column(Table $table, Fluent $command) { $columns = array_map(array($this, 'wrap'), $command->columns); - // Once we the array of column names, we need to add "drop" to the front + // Once we have the array of column names, we need to add "drop" to the front // of each column, then we'll concatenate the columns using commas and // generate the alter statement SQL. $columns = implode(', ', array_map(function($column) @@ -260,7 +260,7 @@ public function drop_primary(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqiue key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command diff --git a/laravel/error.php b/laravel/error.php index 729f632a..606ad64a 100644 --- a/laravel/error.php +++ b/laravel/error.php @@ -80,7 +80,7 @@ public static function native($code, $error, $file, $line) */ public static function shutdown() { - // If a fatal error occured that we have not handled yet, we will + // If a fatal error occurred that we have not handled yet, we will // create an ErrorException and feed it to the exception handler, // as it will not yet have been handled. $error = error_get_last(); diff --git a/laravel/event.php b/laravel/event.php index 1f88d99f..ea2eb715 100644 --- a/laravel/event.php +++ b/laravel/event.php @@ -125,7 +125,7 @@ public static function first($event, $parameters = array()) } /** - * Fire an event and return the the first response. + * Fire an event and return the first response. * * Execution will be halted after the first valid response is found. * diff --git a/laravel/file.php b/laravel/file.php index efb46dec..d2022268 100644 --- a/laravel/file.php +++ b/laravel/file.php @@ -161,7 +161,7 @@ public static function mime($extension, $default = 'application/octet-stream') } /** - * Determine if a file is a given type. + * Determine if a file is of a given type. * * The Fileinfo PHP extension is used to determine the file's MIME type. * @@ -184,7 +184,7 @@ public static function is($extensions, $path) $mime = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $path); // The MIME configuration file contains an array of file extensions and - // their associated MIME types. We will spin through each extension the + // their associated MIME types. We will loop through each extension the // developer wants to check and look for the MIME type. foreach ((array) $extensions as $extension) { @@ -296,7 +296,7 @@ public static function rmdir($directory, $preserve = false) { // If the item is a directory, we can just recurse into the // function and delete that sub-directory, otherwise we'll - // just deleete the file and keep going! + // just delete the file and keep going! if ($item->isDir()) { static::rmdir($item->getRealPath()); @@ -335,7 +335,7 @@ public static function latest($directory, $options = fIterator::SKIP_DOTS) $items = new fIterator($directory, $options); - // To get the latest created file, we'll simply spin through the + // To get the latest created file, we'll simply loop through the // directory, setting the latest file if we encounter a file // with a UNIX timestamp greater than the latest one. foreach ($items as $item) diff --git a/laravel/helpers.php b/laravel/helpers.php index 07f9940a..3357c4df 100644 --- a/laravel/helpers.php +++ b/laravel/helpers.php @@ -462,7 +462,7 @@ function root_namespace($class, $separator = '\\') /** * Get the "class basename" of a class or object. * - * The basename is considered the name of the class minus all namespaces. + * The basename is considered to be the name of the class minus all namespaces. * * @param object|string $class * @return string diff --git a/laravel/ioc.php b/laravel/ioc.php index 512cf863..475932c5 100644 --- a/laravel/ioc.php +++ b/laravel/ioc.php @@ -152,7 +152,7 @@ protected static function build($type, $parameters = array()) $reflector = new \ReflectionClass($type); // If the type is not instantiable, the developer is attempting to resolve - // an abstract type such as an Interface of Abstract Class and there is + // an abstract type such as an Interface of an Abstract Class and there is // no binding registered for the abstraction so we need to bail out. if ( ! $reflector->isInstantiable()) { @@ -189,7 +189,7 @@ protected static function dependencies($parameters) $dependency = $parameter->getClass(); // If the class is null, it means the dependency is a string or some other - // primitive type, which we can not esolve since it is not a class and + // primitive type, which we can not resolve since it is not a class and // we'll just bomb out with an error since we have nowhere to go. if (is_null($dependency)) { diff --git a/laravel/lang.php b/laravel/lang.php index 8fd5f7ba..fd3bf177 100644 --- a/laravel/lang.php +++ b/laravel/lang.php @@ -134,7 +134,7 @@ public function get($language = null, $default = null) $line = array_get($lines, $line, $default); // If the line is not a string, it probably means the developer asked for - // the entire langauge file and the value of the requested value will be + // the entire language file and the value of the requested value will be // an array containing all of the lines in the file. if (is_string($line)) { diff --git a/laravel/laravel.php b/laravel/laravel.php index a1ca2061..2772e323 100644 --- a/laravel/laravel.php +++ b/laravel/laravel.php @@ -54,7 +54,7 @@ |-------------------------------------------------------------------------- | | By setting error reporting to -1, we essentially force PHP to report -| every error, and this is guranteed to show every error on future +| every error, and this is guaranteed to show every error on future | releases of PHP. This allows everything to be fixed early! | */ @@ -143,7 +143,7 @@ |-------------------------------------------------------------------------- | | If a session driver has been configured, we will save the session to -| storage so it is avaiable for the next request. This will also set +| storage so it is available for the next request. This will also set | the session cookie in the cookie jar to be sent to the user. | */ @@ -172,7 +172,7 @@ | And We're Done! |-------------------------------------------------------------------------- | -| Raise the "done" event so extra output can be attached to the response +| Raise the "done" event so extra output can be attached to the response. | This allows the adding of debug toolbars, etc. to the view, or may be | used to do some kind of logging by the application. | diff --git a/laravel/log.php b/laravel/log.php index 4cd3a30e..7c565131 100644 --- a/laravel/log.php +++ b/laravel/log.php @@ -51,7 +51,7 @@ public static function write($type, $message) // If there aren't listeners on the log event, we'll just write to the // log files using the default conventions, writing one log file per - // day so they files don't get too crowded. + // day so the files don't get too crowded. else { $message = static::format($type, $message); diff --git a/laravel/paginator.php b/laravel/paginator.php index ceffbe85..3deb5f61 100644 --- a/laravel/paginator.php +++ b/laravel/paginator.php @@ -47,7 +47,7 @@ class Paginator { /** * The compiled appendage that will be appended to the links. * - * This consists of a sprintf format with a page place-holder and query string. + * This consists of a sprintf format with a page place-holder and query string. * * @var string */ diff --git a/laravel/pluralizer.php b/laravel/pluralizer.php index 857a7ff5..ef5b7cb6 100644 --- a/laravel/pluralizer.php +++ b/laravel/pluralizer.php @@ -48,7 +48,7 @@ public function singular($value) } // English words may be automatically inflected using regular expressions. - // If the word is english, we'll just pass off the word to the automatic + // If the word is English, we'll just pass off the word to the automatic // inflection method and return the result, which is cached. $irregular = $this->config['irregular']; @@ -77,7 +77,7 @@ public function plural($value, $count = 2) } // English words may be automatically inflected using regular expressions. - // If the word is english, we'll just pass off the word to the automatic + // If the word is English, we'll just pass off the word to the automatic // inflection method and return the result, which is cached. $irregular = array_flip($this->config['irregular']); @@ -104,7 +104,7 @@ protected function auto($value, $source, $irregular) return $value; } - // Next we will check the "irregular" patterns, which contains words + // Next, we will check the "irregular" patterns, which contain words // like "children" and "teeth" which can not be inflected using the // typically used regular expression matching approach. foreach ($irregular as $irregular => $pattern) diff --git a/laravel/response.php b/laravel/response.php index b6fa4d84..11458fb8 100644 --- a/laravel/response.php +++ b/laravel/response.php @@ -239,7 +239,7 @@ public function send() public function render() { // If the content is a stringable object, we'll go ahead and call - // to toString method so that we can get the string content of + // the toString method so that we can get the string content of // the content object. Otherwise we'll just cast to string. if (str_object($this->content)) { diff --git a/laravel/routing/filter.php b/laravel/routing/filter.php index 14b6e2e3..80beec93 100644 --- a/laravel/routing/filter.php +++ b/laravel/routing/filter.php @@ -14,7 +14,7 @@ class Filter { public static $filters = array(); /** - * The route filters that are based on pattern. + * The route filters that are based on a pattern. * * @var array */ diff --git a/laravel/routing/route.php b/laravel/routing/route.php index 73b79521..c1c38a8e 100644 --- a/laravel/routing/route.php +++ b/laravel/routing/route.php @@ -10,7 +10,7 @@ class Route { /** - * The URI the route response to. + * The URI the route responds to. * * @var string */ @@ -52,7 +52,7 @@ class Route { public $action; /** - * The parameters that will passed to the route callback. + * The parameters that will be passed to the route callback. * * @var array */ @@ -79,7 +79,7 @@ public function __construct($method, $uri, $action, $parameters = array()) // We'll set the parameters based on the number of parameters passed // compared to the parameters that were needed. If more parameters - // are needed, we'll merge in defaults. + // are needed, we'll merge in the defaults. $this->parameters($action, $parameters); } @@ -96,7 +96,7 @@ protected function parameters($action, $parameters) // If there are less parameters than wildcards, we will figure out how // many parameters we need to inject from the array of defaults and - // merge them in into the main array for the route. + // merge them into the main array for the route. if (count($defaults) > count($parameters)) { $defaults = array_slice($defaults, count($parameters)); diff --git a/laravel/routing/router.php b/laravel/routing/router.php index 7c4888a2..dd3e0568 100644 --- a/laravel/routing/router.php +++ b/laravel/routing/router.php @@ -55,7 +55,7 @@ class Router { public static $group; /** - * The "handes" clause for the bundle currently being routed. + * The "handles" clause for the bundle currently being routed. * * @var string */ @@ -303,7 +303,7 @@ public static function controller($controllers, $defaults = 'index', $https = nu { list($bundle, $controller) = Bundle::parse($identifier); - // First we need to replace the dots with slashes in thte controller name + // First we need to replace the dots with slashes in the controller name // so that it is in directory format. The dots allow the developer to use // a cleaner syntax when specifying the controller. We will also grab the // root URI for the controller's bundle. @@ -311,7 +311,7 @@ public static function controller($controllers, $defaults = 'index', $https = nu $root = Bundle::option($bundle, 'handles'); - // If the controller is a "home" controller, we'll need to also build a + // If the controller is a "home" controller, we'll need to also build an // index method route for the controller. We'll remove "home" from the // route root and setup a route to point to the index method. if (ends_with($controller, 'home')) @@ -428,7 +428,7 @@ public static function uses($action) // To find the route, we'll simply spin through the routes looking // for a route with a "uses" key matching the action, and if we - // find one we cache and return it. + // find one, we cache and return it. foreach (static::routes() as $method => $routes) { foreach ($routes as $key => $value) @@ -484,7 +484,7 @@ protected static function match($method, $uri) { foreach (static::method($method) as $route => $action) { - // We only need to check routes with regular expression since all other + // We only need to check routes with regular expression since all others // would have been able to be matched by the search for literal matches // we just did before we started searching. if (str_contains($route, '(')) diff --git a/laravel/session.php b/laravel/session.php index b5b833fa..00b4a356 100644 --- a/laravel/session.php +++ b/laravel/session.php @@ -24,7 +24,7 @@ class Session { const csrf_token = 'csrf_token'; /** - * Create the session payload and the load the session. + * Create the session payload and load the session. * * @return void */ diff --git a/laravel/session/drivers/driver.php b/laravel/session/drivers/driver.php index 8a54ac98..e5cef1ee 100644 --- a/laravel/session/drivers/driver.php +++ b/laravel/session/drivers/driver.php @@ -63,7 +63,7 @@ public function id() return Str::random(40); } - // We'll containue generating random IDs until we find an ID that is + // We'll continue generating random IDs until we find an ID that is // not currently assigned to a session. This is almost definitely // going to happen on the first iteration. do { diff --git a/laravel/uri.php b/laravel/uri.php index 2477fe62..3e89ea4b 100644 --- a/laravel/uri.php +++ b/laravel/uri.php @@ -68,7 +68,7 @@ public static function is($pattern) } /** - * Get a specific segment of the request URI via an one-based index. + * Get a specific segment of the request URI via a one-based index. * * * // Get the first segment of the request URI diff --git a/laravel/url.php b/laravel/url.php index 44b89428..424d0f30 100644 --- a/laravel/url.php +++ b/laravel/url.php @@ -101,7 +101,7 @@ public static function to($url = '', $https = null) return $url; } - // Unless $https is specified (true or false) then maintain the current request + // Unless $https is specified (true or false), we maintain the current request // security for any new links generated. So https for all secure links. if (is_null($https)) $https = Request::secure(); @@ -169,7 +169,7 @@ public static function to_action($action, $parameters = array()) } /** - * Generate a action URL from a route definition + * Generate an action URL from a route definition * * @param array $route * @param string $action @@ -196,7 +196,7 @@ protected static function convention($action, $parameters) $bundle = Bundle::get($bundle); - // If a bundle exists for the action, we will attempt to use it's "handles" + // If a bundle exists for the action, we will attempt to use its "handles" // clause as the root of the generated URL, as the bundle can only handle // URIs that begin with that string and no others. $root = $bundle['handles'] ?: ''; diff --git a/laravel/validator.php b/laravel/validator.php index 3290bc17..2196fdec 100644 --- a/laravel/validator.php +++ b/laravel/validator.php @@ -401,8 +401,8 @@ protected function validate_max($attribute, $value, $parameters) protected function size($attribute, $value) { // This method will determine if the attribute is a number, string, or file and - // return the proper size accordingly. If it is a number, then number itself is - // the size; if it is a file, the size is kilobytes in the size; if it is a + // return the proper size accordingly. If it is a number, the number itself is + // the size; if it is a file, the kilobytes is the size; if it is a // string, the length is the size. if (is_numeric($value) and $this->has_rule($attribute, $this->numeric_rules)) { @@ -743,7 +743,7 @@ protected function size_message($bundle, $attribute, $rule) } // We assume that attributes present in the $_FILES array are files, // which makes sense. If the attribute doesn't have numeric rules - // and isn't as file, it's a string. + // and isn't a file, it's a string. elseif (array_key_exists($attribute, Input::file())) { $line = 'file'; @@ -862,7 +862,7 @@ protected function replace_not_in($message, $attribute, $rule, $parameters) } /** - * Replace all place-holders for the not_in rule. + * Replace all place-holders for the mimes rule. * * @param string $message * @param string $attribute @@ -953,7 +953,7 @@ protected function attribute($attribute) // If no language line has been specified for the attribute, all of // the underscores are removed from the attribute name and that - // will be used as the attribtue name. + // will be used as the attribute name. else { return str_replace('_', ' ', $attribute); diff --git a/laravel/view.php b/laravel/view.php index f97b3dee..2e38000d 100644 --- a/laravel/view.php +++ b/laravel/view.php @@ -163,7 +163,7 @@ public static function file($bundle, $view, $directory) { $directory = str_finish($directory, DS); - // Views may have either the default PHP file extension of the "Blade" + // Views may have either the default PHP file extension or the "Blade" // extension, so we will need to check for both in the view path // and return the first one we find for the given view. if (file_exists($path = $directory.$view.EXT)) @@ -291,7 +291,7 @@ public static function render_each($view, array $data, $iterator, $empty = 'raw| } // If there is no data in the array, we will render the contents of - // the "empty" view. Alternative, the "empty view" can be a raw + // the "empty" view. Alternatively, the "empty view" can be a raw // string that is prefixed with "raw|" for convenience. else { diff --git a/paths.php b/paths.php index 2a38aff0..e3742042 100644 --- a/paths.php +++ b/paths.php @@ -14,7 +14,7 @@ |---------------------------------------------------------------- | | Laravel takes a dead simple approach to environments, and we -| think you'll love it. Just specify which URLs belongs to a +| think you'll love it. Just specify which URLs belong to a | given environment, and when you access your application | from a URL matching that pattern, we'll be sure to | merge in that environment's configuration files. From e9e8a5b32e78bf2f7b589c181030ec7d3ef6a417 Mon Sep 17 00:00:00 2001 From: Jason Walton Date: Wed, 13 Jun 2012 10:22:27 -0700 Subject: [PATCH 022/260] Adds limit_exact method which will limit a string and its custom ending to a specified length Signed-off-by: Jason Walton --- laravel/documentation/strings.md | 1 + laravel/str.php | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/laravel/documentation/strings.md b/laravel/documentation/strings.md index 002d9148..4164e5ec 100644 --- a/laravel/documentation/strings.md +++ b/laravel/documentation/strings.md @@ -25,6 +25,7 @@ ## Word & Character Limiting #### Limiting the number of characters in a string: echo Str::limit($string, 10); + echo Str::limit_exact($string, 10); #### Limiting the number of words in a string: diff --git a/laravel/str.php b/laravel/str.php index 964b5d5b..23f2b731 100644 --- a/laravel/str.php +++ b/laravel/str.php @@ -130,6 +130,31 @@ public static function limit($value, $limit = 100, $end = '...') return substr($value, 0, $limit).$end; } + /** + * Limit the number of chracters in a string including custom ending + * + * + * // Returns "Taylor..." + * echo Str::limit_exact('Taylor Otwell', 9); + * + * // Limit the number of characters and append a custom ending + * echo Str::limit_exact('Taylor Otwell', 9, '---'); + * + * + * @param string $value + * @param int $limit + * @param string $end + * @return string + */ + public static function limit_exact($value, $limit = 100, $end = '...') + { + if (static::length($value) <= $limit) return $value; + + $limit -= static::length($end); + + return static::limit($value, $limit, $end); + } + /** * Limit the number of words in a string. * From ac2e7c6a2d2afa47f420715dca056ec6135403fd Mon Sep 17 00:00:00 2001 From: Stefan Neubig Date: Thu, 14 Jun 2012 01:33:56 +0300 Subject: [PATCH 023/260] Fixed namespace issue when registering a session driver with the extend closure --- laravel/session.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/session.php b/laravel/session.php index b5b833fa..81e4e131 100644 --- a/laravel/session.php +++ b/laravel/session.php @@ -1,4 +1,4 @@ - Date: Wed, 13 Jun 2012 16:23:28 -0700 Subject: [PATCH 024/260] Allow Model instance an id for first argument in Has_Many_And_Belongs_To::attach() and same for ::detach(). Also a typo fix for the docblock on attach(). --- .../relationships/has_many_and_belongs_to.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/laravel/database/eloquent/relationships/has_many_and_belongs_to.php b/laravel/database/eloquent/relationships/has_many_and_belongs_to.php index 587e504c..cc921861 100644 --- a/laravel/database/eloquent/relationships/has_many_and_belongs_to.php +++ b/laravel/database/eloquent/relationships/has_many_and_belongs_to.php @@ -85,12 +85,14 @@ public function results() /** * Insert a new record into the joining table of the association. * - * @param int $id - * @param array $joining + * @param Model|int $id + * @param array $attributes * @return bool */ public function attach($id, $attributes = array()) { + if ($id instanceof Model) $id = $id->get_key(); + $joining = array_merge($this->join_record($id), $attributes); return $this->insert_joining($joining); @@ -99,12 +101,13 @@ public function attach($id, $attributes = array()) /** * Detach a record from the joining table of the association. * - * @param int $ids + * @param array|Model|int $ids * @return bool */ public function detach($ids) { - if ( ! is_array($ids)) $ids = array($ids); + if ($ids instanceof Model) $ids = array($ids->get_key()); + elseif ( ! is_array($ids)) $ids = array($ids); return $this->pivot()->where_in($this->other_key(), $ids)->delete(); } From 189f3813d040dcf33b2eb91b0519afa3624e9fe4 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sat, 16 Jun 2012 13:20:39 +0200 Subject: [PATCH 025/260] Calling the finish method on the right object --- laravel/laravel.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/laravel.php b/laravel/laravel.php index fcdc32c5..990c8cee 100644 --- a/laravel/laravel.php +++ b/laravel/laravel.php @@ -180,4 +180,4 @@ Event::fire('laravel.done', array($response)); -$response->finish(); \ No newline at end of file +$response->foundation->finish(); \ No newline at end of file From 139abb2e230c3c6232ea7a7ba6594174a930309b Mon Sep 17 00:00:00 2001 From: Tobias Orterer Date: Sat, 16 Jun 2012 19:56:36 -0700 Subject: [PATCH 026/260] German Translation Added German translation as good as it gets ;) --- application/language/de/pagination.php | 19 +++++ application/language/de/validation.php | 99 ++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 application/language/de/pagination.php create mode 100644 application/language/de/validation.php diff --git a/application/language/de/pagination.php b/application/language/de/pagination.php new file mode 100644 index 00000000..9fd96322 --- /dev/null +++ b/application/language/de/pagination.php @@ -0,0 +1,19 @@ + '« Zurück', + 'next' => 'Weiter »', + +); \ No newline at end of file diff --git a/application/language/de/validation.php b/application/language/de/validation.php new file mode 100644 index 00000000..adc2b625 --- /dev/null +++ b/application/language/de/validation.php @@ -0,0 +1,99 @@ + ":attribute muss akzeptiert werden.", + "active_url" => ":attribute ist keine korrekte URL.", + "after" => ":attribute muss ein Datum nach :date sein.", + "alpha" => ":attribute darf nur Buchstaben beinhalten.", + "alpha_dash" => ":attribute sollte nur aus Buchstaben, Nummern und Bindestriche bestehen.", + "alpha_num" => ":attribute sollte nur aus Buchstaben und Nummern bestehen.", + "before" => ":attribute muss ein Datum vor :date sein.", + "between" => array( + "numeric" => ":attribute muss zwischen :min und :max sein.", + "file" => ":attribute muss zwischen :min und :max Kilobytes sein.", + "string" => ":attribute muss zwischen :min und :max Zeichen sein.", + ), + "confirmed" => "Die Bestätigung für :attribute stimmt nicht überein.", + "different" => ":attribute und :other müssen verschieden sein.", + "email" => "Das Format fü :attribute ist ungültig.", + "exists" => "Die selektierte :attribute ist ungültig.", + "image" => ":attribute muss ein Bild sein.", + "in" => "Die selektierte :attribute ist ungültig.", + "integer" => ":attribute muss eine Ganzzahl sein.", + "ip" => ":attribute muss eine gültige IP sein.", + "match" => ":attribute hat ein ungültiges format.", + "max" => array( + "numeric" => ":attribute muss kleiner sein als :max.", + "file" => ":attribute muss kleiner sein :max Kilobytes.", + "string" => ":attribute muss kürzer sein als :max Zeichen.", + ), + "mimes" => ":attribute muss eine Datei sein des Formats: :values.", + "min" => array( + "numeric" => ":attribute muss größer sein als :min.", + "file" => ":attribute muss größer sein als :min Kilobytes.", + "string" => ":attribute muss länger sein als :min Zeichen.", + ), + "not_in" => "Die selektierte :attribute ist ungültig.", + "numeric" => ":attribute muss eine Nummer sein.", + "required" => "Das :attribute Feld muss aufgefüllt sein.", + "same" => ":attribute und :other müssen übereinstimmen.", + "size" => array( + "numeric" => ":attribute muss :size sein.", + "file" => ":attribute muss :size Kilobyte sein.", + "string" => ":attribute muss :size Zeichen sein.", + ), + "unique" => ":attribute ist schon vergeben.", + "url" => "Das Format fü :attribute ist ungültig.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file From ddee5b7199cbb291916595078bcb3c44c6efba44 Mon Sep 17 00:00:00 2001 From: Tobias Orterer Date: Sat, 16 Jun 2012 20:02:03 -0700 Subject: [PATCH 027/260] Blade cleanup sanitized most functions and regular expressions. made the bigger functions a bit more solid, flexible in what they ignore and simplified various processes. --- laravel/blade.php | 83 ++++++++++++++++++++++------------------------- 1 file changed, 38 insertions(+), 45 deletions(-) diff --git a/laravel/blade.php b/laravel/blade.php index c362d57b..31273fe1 100644 --- a/laravel/blade.php +++ b/laravel/blade.php @@ -149,19 +149,19 @@ protected static function compile_layouts($value) return $value; } - // First we'll split out the lines of the template so we can get the - // layout from the top of the template. By convention it must be - // located on the first line of the template contents. - $lines = preg_split("/(\r?\n)/", $value); + // First we'll get the layout from the top of the template and remove it. + // Then it is replaced with @include and attached to the end. + // By convention it must be located on the first line of the template contents. + preg_replace_callback( + '/^@layout(\s*?\(.+?\))(\r?\n)?/', + function($matches) use (&$value) + { + $value = substr( $value, strlen( $matches[0] ) ).CRLF.'@include'.$matches[1]; + }, + $value + ); - $pattern = static::matcher('layout'); - - $lines[] = preg_replace($pattern, '$1@include$2', $lines[0]); - - // We will add a "render" statement to the end of the templates and - // then slice off the "@layout" shortcut from the start so the - // sections register before the parent template renders. - return implode(CRLF, array_slice($lines, 1)); + return $value; } /** @@ -172,9 +172,10 @@ protected static function compile_layouts($value) */ protected static function extract($value, $expression) { - preg_match('/@layout(\s*\(.*\))(\s*)/', $value, $matches); - - return str_replace(array("('", "')"), '', $matches[1]); + if ( preg_match("/@layout\s*?\(\s*?'(.+?)'\s*?\)/", $value, $matches)) + { + return trim( $matches[1] ); + } } /** @@ -209,27 +210,21 @@ protected static function compile_echos($value) */ protected static function compile_forelse($value) { - preg_match_all('/(\s*)@forelse(\s*\(.*\))(\s*)/', $value, $matches); + preg_match_all('/@forelse\s*?\(\s*?\$(.+?)\s*?as\s*?\$(.+?)\s*?\)/', $value, $matches, PREG_SET_ORDER ); + + if ( count($matches) < 1 ) return $value; - foreach ($matches[0] as $forelse) + foreach ($matches as $forelse) { - preg_match('/\s*\(\s*(\S*)\s/', $forelse, $variable); - // Once we have extracted the variable being looped against, we can add // an if statement to the start of the loop that checks if the count // of the variable being looped against is greater than zero. - $if = " 0): ?>"; - - $search = '/(\s*)@forelse(\s*\(.*\))/'; - - $replace = '$1'.$if.''; - - $blade = preg_replace($search, $replace, $forelse); + $replace = ' 0): foreach ($'.$forelse[1].' as $'.$forelse[2].'): ?>'; // Finally, once we have the check prepended to the loop we'll replace // all instances of this forelse syntax in the view content of the // view being compiled to Blade syntax with real PHP syntax. - $value = str_replace($forelse, $blade, $value); + $value = str_replace($forelse[0], $replace, $value); } return $value; @@ -243,7 +238,7 @@ protected static function compile_forelse($value) */ protected static function compile_empty($value) { - return str_replace('@empty', '', $value); + return str_replace('@empty', '', $value); } /** @@ -265,9 +260,9 @@ protected static function compile_endforelse($value) */ protected static function compile_structure_openings($value) { - $pattern = '/(\s*)@(if|elseif|foreach|for|while)(\s*\(.*\))/'; + $pattern = '/@(if|elseif|foreach|for|while)\s*?(\(.+?\))/'; - return preg_replace($pattern, '$1', $value); + return preg_replace($pattern, '', $value); } /** @@ -278,9 +273,9 @@ protected static function compile_structure_openings($value) */ protected static function compile_structure_closings($value) { - $pattern = '/(\s*)@(endif|endforeach|endfor|endwhile)(\s*)/'; + $pattern = '/@(endif|endforeach|endfor|endwhile)/'; - return preg_replace($pattern, '$1$3', $value); + return preg_replace($pattern, '', $value); } /** @@ -291,7 +286,7 @@ protected static function compile_structure_closings($value) */ protected static function compile_else($value) { - return preg_replace('/(\s*)@(else)(\s*)/', '$1$3', $value); + return str_replace( '@else', '', $value); } /** @@ -302,9 +297,9 @@ protected static function compile_else($value) */ protected static function compile_unless($value) { - $pattern = '/(\s*)@unless(\s*\(.*\))/'; + $pattern = static::matcher('unless'); - return preg_replace($pattern, '$1', $value); + return preg_replace($pattern, '', $value); } /** @@ -328,7 +323,7 @@ protected static function compile_includes($value) { $pattern = static::matcher('include'); - return preg_replace($pattern, '$1with(get_defined_vars())->render(); ?>', $value); + return preg_replace($pattern, 'with(get_defined_vars())->render(); ?>', $value); } /** @@ -341,7 +336,7 @@ protected static function compile_render($value) { $pattern = static::matcher('render'); - return preg_replace($pattern, '$1', $value); + return preg_replace($pattern, '', $value); } /** @@ -354,7 +349,7 @@ protected static function compile_render_each($value) { $pattern = static::matcher('render_each'); - return preg_replace($pattern, '$1', $value); + return preg_replace($pattern, '', $value); } /** @@ -369,7 +364,7 @@ protected static function compile_yields($value) { $pattern = static::matcher('yield'); - return preg_replace($pattern, '$1', $value); + return preg_replace($pattern, '', $value); } /** @@ -379,9 +374,7 @@ protected static function compile_yields($value) */ protected static function compile_yield_sections($value) { - $replace = ''; - - return str_replace('@yield_section', $replace, $value); + return str_replace('@yield_section', '', $value); } /** @@ -396,7 +389,7 @@ protected static function compile_section_start($value) { $pattern = static::matcher('section'); - return preg_replace($pattern, '$1', $value); + return preg_replace($pattern, '', $value); } /** @@ -409,7 +402,7 @@ protected static function compile_section_start($value) */ protected static function compile_section_end($value) { - return preg_replace('/@endsection/', '', $value); + return str_replace('@endsection', '', $value); } /** @@ -436,7 +429,7 @@ protected static function compile_extensions($value) */ public static function matcher($function) { - return '/(\s*)@'.$function.'(\s*\(.*\))/'; + return '/@'.$function.'\s*?(\(.+?\))/'; } /** From 37321136e47d7d1ff8018d8734f792c13bd6f8a9 Mon Sep 17 00:00:00 2001 From: Tobias Orterer Date: Mon, 18 Jun 2012 02:08:12 -0700 Subject: [PATCH 028/260] fixed missed umlauts --- application/language/de/validation.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/language/de/validation.php b/application/language/de/validation.php index adc2b625..7651b104 100644 --- a/application/language/de/validation.php +++ b/application/language/de/validation.php @@ -46,8 +46,8 @@ ), "mimes" => ":attribute muss eine Datei sein des Formats: :values.", "min" => array( - "numeric" => ":attribute muss größer sein als :min.", - "file" => ":attribute muss größer sein als :min Kilobytes.", + "numeric" => ":attribute muss größer sein als :min.", + "file" => ":attribute muss größer sein als :min Kilobytes.", "string" => ":attribute muss länger sein als :min Zeichen.", ), "not_in" => "Die selektierte :attribute ist ungültig.", From ec4556321d955a4123fc56c1185b26a34bcc6c21 Mon Sep 17 00:00:00 2001 From: SonicHedgehog Date: Wed, 20 Jun 2012 13:01:52 +0300 Subject: [PATCH 029/260] Fixed typo --- laravel/database/connection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/database/connection.php b/laravel/database/connection.php index 66601ef8..26197736 100644 --- a/laravel/database/connection.php +++ b/laravel/database/connection.php @@ -194,7 +194,7 @@ public function query($sql, $bindings = array()) return $statement->rowCount(); } // For insert statements that use the "returning" clause, which is allowed - // by databsae systems such as Postgres, we need to actually return the + // by database systems such as Postgres, we need to actually return the // real query result so the consumer can get the ID. elseif (stripos($sql, 'insert') === 0 and stripos($sql, 'returning') !== false) { From 276f96aec303bb25a714c5ad12d50f2c69aa7ae9 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Wed, 20 Jun 2012 19:27:24 +0200 Subject: [PATCH 030/260] Adding comment to finish call --- laravel/laravel.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/laravel/laravel.php b/laravel/laravel.php index 990c8cee..542c945d 100644 --- a/laravel/laravel.php +++ b/laravel/laravel.php @@ -180,4 +180,16 @@ Event::fire('laravel.done', array($response)); +/* +|-------------------------------------------------------------------------- +| Finish the request for PHP-FastCGI +|-------------------------------------------------------------------------- +| +| Stopping the PHP process for PHP-FastCGI users to speed up some +| PHP queries. Acceleration is possible when there are actions in the +| process of script execution that do not affect server response. +| For example, saving the session in memcached can occur after the page +| has been formed and passed to a web server. +*/ + $response->foundation->finish(); \ No newline at end of file From be264ab181e32478fc6ed6bb989c0a28766038fd Mon Sep 17 00:00:00 2001 From: Tobias Orterer Date: Thu, 21 Jun 2012 00:09:08 -0700 Subject: [PATCH 031/260] added break function to closing structure --- laravel/blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/blade.php b/laravel/blade.php index 31273fe1..7e4e2fdb 100644 --- a/laravel/blade.php +++ b/laravel/blade.php @@ -273,7 +273,7 @@ protected static function compile_structure_openings($value) */ protected static function compile_structure_closings($value) { - $pattern = '/@(endif|endforeach|endfor|endwhile)/'; + $pattern = '/@(endif|endforeach|endfor|endwhile|break)/'; return preg_replace($pattern, '', $value); } From 5c274ed7177977e156b01dd6f7d03a37c5a5dd52 Mon Sep 17 00:00:00 2001 From: Tobsn Date: Fri, 22 Jun 2012 03:03:03 -0700 Subject: [PATCH 032/260] Environments Typo --- paths.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paths.php b/paths.php index 3a6622ff..78d5a02f 100644 --- a/paths.php +++ b/paths.php @@ -10,7 +10,7 @@ /* |---------------------------------------------------------------- -| Application Environemtns +| Application Environments |---------------------------------------------------------------- | | Laravel takes a dead simple approach to environments, and we From 36226b99bcaa469579dd13692b4c172085f0748a Mon Sep 17 00:00:00 2001 From: Tobsn Date: Fri, 22 Jun 2012 03:09:50 -0700 Subject: [PATCH 033/260] fixed link for query builder /query -> /fluent thanks to @NXB --- laravel/documentation/database/eloquent.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/database/eloquent.md b/laravel/documentation/database/eloquent.md index 0706b7d9..c2afc7a2 100644 --- a/laravel/documentation/database/eloquent.md +++ b/laravel/documentation/database/eloquent.md @@ -65,7 +65,7 @@ ## Retrieving Models echo $user->email; } -Of course, retrieving an entire table isn't very helpful. Thankfully, **every method that is available through the fluent query builder is available in Eloquent**. Just begin querying your model with a static call to one of the [query builder](/docs/database/query) methods, and execute the query using the **get** or **first** method. The get method will return an array of models, while the first method will return a single model: +Of course, retrieving an entire table isn't very helpful. Thankfully, **every method that is available through the fluent query builder is available in Eloquent**. Just begin querying your model with a static call to one of the [query builder](/docs/database/fluent) methods, and execute the query using the **get** or **first** method. The get method will return an array of models, while the first method will return a single model: $user = User::where('email', '=', $email)->first(); From 61a61fc285bad4452ddf3d4c5859c4cd613e806b Mon Sep 17 00:00:00 2001 From: Tobsn Date: Fri, 22 Jun 2012 06:06:54 -0700 Subject: [PATCH 034/260] Added explanation about PDO default attributes regarding issue #788 https://github.com/laravel/laravel/issues/788 --- laravel/documentation/database/config.md | 26 +++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/laravel/documentation/database/config.md b/laravel/documentation/database/config.md index a4eddb62..3768f013 100644 --- a/laravel/documentation/database/config.md +++ b/laravel/documentation/database/config.md @@ -5,6 +5,7 @@ ## Contents - [Quick Start Using SQLite](#quick) - [Configuring Other Databases](#server) - [Setting The Default Connection Name](#default) +- [Overwriting The Default PDO Options](#options) Laravel supports the following databases out of the box: @@ -43,4 +44,27 @@ ## Setting The Default Connection Name 'default' => 'sqlite'; -The default connection will always be used by the [fluent query builder](/docs/database/fluent). If you need to change the default connection during a request, use the **Config::set** method. \ No newline at end of file +The default connection will always be used by the [fluent query builder](/docs/database/fluent). If you need to change the default connection during a request, use the **Config::set** method. + + +##Overwriting The Default PDO Options + +The PDO connecter class (**laravel/database/connectors/connector.php**) has a set of default PDO attributes defined which can be overwritten in the options array for each system. For example, one of the default attributes is to force column names to lowercase (**PDO::CASE_LOWER**) even if they are defined in UPPERCASE or CamelCase in the table. Therefor, under the default attributes, query result object variables would only be accessible in lowercase. +An example of the MySQL system settings with added default PDO attributes: + + 'mysql' => array( + 'driver' => 'mysql', + 'host' => 'localhost', + 'database' => 'database', + 'username' => 'root', + 'password' => '', + 'charset' => 'utf8', + 'prefix' => '', + PDO::ATTR_CASE => PDO::CASE_LOWER, + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, + PDO::ATTR_STRINGIFY_FETCHES => false, + PDO::ATTR_EMULATE_PREPARES => false, + ), + +More about the PDO connection attributes can be found [here](http://php.net/manual/en/pdo.setattribute.php). \ No newline at end of file From 8d13bf9c5a8c2b70143f88af7c13818849452c46 Mon Sep 17 00:00:00 2001 From: Dayle Rees Date: Fri, 22 Jun 2012 16:25:50 +0100 Subject: [PATCH 035/260] removing unsigned from mysql grammer due to bug Signed-off-by: Dayle Rees --- laravel/database/schema/grammars/mysql.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/laravel/database/schema/grammars/mysql.php b/laravel/database/schema/grammars/mysql.php index d0ba45ad..2f390f08 100644 --- a/laravel/database/schema/grammars/mysql.php +++ b/laravel/database/schema/grammars/mysql.php @@ -143,7 +143,7 @@ protected function incrementer(Table $table, Fluent $column) { if ($column->type == 'integer' and $column->increment) { - return ' UNSIGNED AUTO_INCREMENT PRIMARY KEY'; + return ' AUTO_INCREMENT PRIMARY KEY'; } } @@ -418,4 +418,4 @@ protected function type_blob(Fluent $column) return 'BLOB'; } -} \ No newline at end of file +} From 0b9b102dc78aec01c8f307583f413e9bcf099eb1 Mon Sep 17 00:00:00 2001 From: Tobsn Date: Fri, 22 Jun 2012 08:50:09 -0700 Subject: [PATCH 036/260] NOT NULL order issue fixed! thanks @crynobone !!! --- laravel/database/schema/grammars/mysql.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/laravel/database/schema/grammars/mysql.php b/laravel/database/schema/grammars/mysql.php index d0ba45ad..31c6b411 100644 --- a/laravel/database/schema/grammars/mysql.php +++ b/laravel/database/schema/grammars/mysql.php @@ -99,7 +99,7 @@ protected function columns(Table $table) */ protected function unsigned(Table $table, Fluent $column) { - if ($column->type == 'integer' && $column->unsigned) + if ($column->type == 'integer' && ($column->unsigned || $column->increment)) { return ' UNSIGNED'; } @@ -143,7 +143,7 @@ protected function incrementer(Table $table, Fluent $column) { if ($column->type == 'integer' and $column->increment) { - return ' UNSIGNED AUTO_INCREMENT PRIMARY KEY'; + return ' AUTO_INCREMENT PRIMARY KEY'; } } From 31abcd599ba7c7f80a4073ec1f785bdfabd21706 Mon Sep 17 00:00:00 2001 From: Tobsn Date: Fri, 22 Jun 2012 08:54:10 -0700 Subject: [PATCH 037/260] unique typo --- laravel/database/schema/grammars/mysql.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/database/schema/grammars/mysql.php b/laravel/database/schema/grammars/mysql.php index 31c6b411..c0c607fe 100644 --- a/laravel/database/schema/grammars/mysql.php +++ b/laravel/database/schema/grammars/mysql.php @@ -260,7 +260,7 @@ public function drop_primary(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command From ed4a6973f8fa733ed0ac6b48c9f4eeaae25f5bf5 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sat, 23 Jun 2012 01:22:58 +0300 Subject: [PATCH 038/260] Fix some bugs and inconsistencies in the German validation translation. --- application/language/de/validation.php | 56 +++++++++++++------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/application/language/de/validation.php b/application/language/de/validation.php index 7651b104..87189410 100644 --- a/application/language/de/validation.php +++ b/application/language/de/validation.php @@ -19,48 +19,48 @@ */ "accepted" => ":attribute muss akzeptiert werden.", - "active_url" => ":attribute ist keine korrekte URL.", - "after" => ":attribute muss ein Datum nach :date sein.", + "active_url" => ":attribute ist keine gültige URL.", + "after" => ":attribute muss ein Datum nach dem :date sein.", "alpha" => ":attribute darf nur Buchstaben beinhalten.", - "alpha_dash" => ":attribute sollte nur aus Buchstaben, Nummern und Bindestriche bestehen.", + "alpha_dash" => ":attribute sollte nur aus Buchstaben, Nummern und Bindestrichen bestehen.", "alpha_num" => ":attribute sollte nur aus Buchstaben und Nummern bestehen.", - "before" => ":attribute muss ein Datum vor :date sein.", + "before" => ":attribute muss ein Datum vor dem :date sein.", "between" => array( - "numeric" => ":attribute muss zwischen :min und :max sein.", - "file" => ":attribute muss zwischen :min und :max Kilobytes sein.", - "string" => ":attribute muss zwischen :min und :max Zeichen sein.", + "numeric" => ":attribute muss zwischen :min und :max liegen.", + "file" => ":attribute muss zwischen :min und :max Kilobytes groß sein.", + "string" => ":attribute muss zwischen :min und :max Zeichen lang sein.", ), - "confirmed" => "Die Bestätigung für :attribute stimmt nicht überein.", + "confirmed" => ":attribute stimmt nicht mit der Bestätigung überein.", "different" => ":attribute und :other müssen verschieden sein.", - "email" => "Das Format fü :attribute ist ungültig.", - "exists" => "Die selektierte :attribute ist ungültig.", + "email" => ":attribute ist keine gültige Email-Adresse.", + "exists" => "Der gewählte Wert für :attribute ist ungültig.", "image" => ":attribute muss ein Bild sein.", - "in" => "Die selektierte :attribute ist ungültig.", - "integer" => ":attribute muss eine Ganzzahl sein.", - "ip" => ":attribute muss eine gültige IP sein.", - "match" => ":attribute hat ein ungültiges format.", + "in" => "Der gewählte Wert für :attribute ist ungültig.", + "integer" => ":attribute muss eine ganze Zahl sein.", + "ip" => ":attribute muss eine gültige IP-Adresse sein.", + "match" => ":attribute hat ein ungültiges Format.", "max" => array( - "numeric" => ":attribute muss kleiner sein als :max.", - "file" => ":attribute muss kleiner sein :max Kilobytes.", - "string" => ":attribute muss kürzer sein als :max Zeichen.", + "numeric" => ":attribute muss kleiner als :max sein.", + "file" => ":attribute muss kleiner als :max Kilobytes groß sein.", + "string" => ":attribute muss kürzer als :max Zeichen sein.", ), - "mimes" => ":attribute muss eine Datei sein des Formats: :values.", + "mimes" => ":attribute muss den Dateityp :values haben.", "min" => array( - "numeric" => ":attribute muss größer sein als :min.", - "file" => ":attribute muss größer sein als :min Kilobytes.", - "string" => ":attribute muss länger sein als :min Zeichen.", + "numeric" => ":attribute muss größer als :min sein.", + "file" => ":attribute muss größer als :min Kilobytes groß sein.", + "string" => ":attribute muss länger als :min Zeichen sein.", ), - "not_in" => "Die selektierte :attribute ist ungültig.", - "numeric" => ":attribute muss eine Nummer sein.", - "required" => "Das :attribute Feld muss aufgefüllt sein.", + "not_in" => "Der gewählte Wert für :attribute ist ungültig.", + "numeric" => ":attribute muss eine Zahl sein.", + "required" => ":attribute muss aufgefüllt sein.", "same" => ":attribute und :other müssen übereinstimmen.", "size" => array( - "numeric" => ":attribute muss :size sein.", - "file" => ":attribute muss :size Kilobyte sein.", - "string" => ":attribute muss :size Zeichen sein.", + "numeric" => ":attribute muss gleich :size sein.", + "file" => ":attribute muss :size Kilobyte groß sein.", + "string" => ":attribute muss :size Zeichen lang sein.", ), "unique" => ":attribute ist schon vergeben.", - "url" => "Das Format fü :attribute ist ungültig.", + "url" => "Das Format von :attribute ist ungültig.", /* |-------------------------------------------------------------------------- From 5a4d622bb71482631d2b142163d6b9601162b289 Mon Sep 17 00:00:00 2001 From: Jeffrey Way Date: Sat, 23 Jun 2012 14:32:27 -0300 Subject: [PATCH 039/260] Fix small typo in validation docs. --- laravel/documentation/validation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/validation.md b/laravel/documentation/validation.md index 49401439..4da4683c 100644 --- a/laravel/documentation/validation.md +++ b/laravel/documentation/validation.md @@ -12,7 +12,7 @@ ## Contents ## The Basics -Almost every interactive web application needs to validate data. For instance, a registration form probably requires the password to be confirmed. Maybe the e-mail address must be unique. Validating data can be a cumbersome process. Thankfully, it isn't in Laravel. The Validator class provides as awesome array of validation helpers to make validating your data a breeze. Let's walk through an example: +Almost every interactive web application needs to validate data. For instance, a registration form probably requires the password to be confirmed. Maybe the e-mail address must be unique. Validating data can be a cumbersome process. Thankfully, it isn't in Laravel. The Validator class provides an awesome array of validation helpers to make validating your data a breeze. Let's walk through an example: #### Get an array of data you want to validate: From ac810f8597d20f7215605afd4c0337c34f8e38ec Mon Sep 17 00:00:00 2001 From: Jason Lewis Date: Sun, 24 Jun 2012 19:28:53 +0930 Subject: [PATCH 040/260] Allow filter patterns to supply a name and callback as an easier alternative. Signed-off-by: Jason Lewis --- laravel/routing/route.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/laravel/routing/route.php b/laravel/routing/route.php index 73b79521..b63bdc32 100644 --- a/laravel/routing/route.php +++ b/laravel/routing/route.php @@ -213,6 +213,15 @@ protected function patterns() { if (Str::is($pattern, $this->uri)) { + // If the filter provided is an array then we need to register + // the filter before we can assign it to the route. + if (is_array($filter)) + { + list($filter, $callback) = array_values($filter); + + Filter::register($filter, $callback); + } + $filters[] = $filter; } } From cea48d4fe5e379c907ccb7cd9b2580e3a227445a Mon Sep 17 00:00:00 2001 From: Jason Lewis Date: Sun, 24 Jun 2012 19:37:08 +0930 Subject: [PATCH 041/260] Updated the documentation. Signed-off-by: Jason Lewis --- laravel/documentation/routing.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/laravel/documentation/routing.md b/laravel/documentation/routing.md index 18c90671..d10be6b1 100644 --- a/laravel/documentation/routing.md +++ b/laravel/documentation/routing.md @@ -152,6 +152,15 @@ #### Defining a URI pattern based filter: Route::filter('pattern: admin/*', 'auth'); +Optionally you can register filters directly when attaching filters to a given URI by supplying an array with the name of the filter and a callback. + +#### Defining a filter and URI pattern based filter in one: + + Route::filter('pattern: admin/*', array('name' => 'auth', function() + { + // + })); + ## Global Filters From 59397eb726840d640873bc3c668ccc5e1912b3c6 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sun, 24 Jun 2012 21:17:32 +0300 Subject: [PATCH 042/260] Calculate the total render time in the profiler. --- laravel/profiling/profiler.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/laravel/profiling/profiler.php b/laravel/profiling/profiler.php index 9b6edfef..0dc837c3 100644 --- a/laravel/profiling/profiler.php +++ b/laravel/profiling/profiler.php @@ -14,6 +14,15 @@ class Profiler { * @var array */ protected static $data = array('queries' => array(), 'logs' => array()); + + /** + * The time when the profiler was setup. + * + * This is used for generating the total page rendering time. + * + * @var float + */ + protected static $start_time; /** * Get the rendered contents of the Profiler. @@ -28,6 +37,10 @@ public static function render($response) // type applications, so we will not send anything in those scenarios. if ( ! Request::ajax()) { + if ($this->start_time) + { + static::$data['time'] = number_format((microtime(true) - $this->start_time) * 1000, 2); + } return render('path: '.__DIR__.'/template'.BLADE_EXT, static::$data); } } @@ -67,6 +80,9 @@ public static function query($sql, $bindings, $time) */ public static function attach() { + // Record when the profiler was setup (as a rough measure for render time) + $this->start_time = microtime(true); + // First we'll attach to the query and log events. These allow us to catch // all of the SQL queries and log messages that come through Laravel, // and we will pass them onto the Profiler for simple storage. From c74123098beb026de713efa139a532f9ba3aa9cd Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sun, 24 Jun 2012 21:27:57 +0300 Subject: [PATCH 043/260] Render page generation time on anbu profiler console. --- laravel/profiling/template.blade.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/laravel/profiling/template.blade.php b/laravel/profiling/template.blade.php index 0b0ffef8..a06f7957 100755 --- a/laravel/profiling/template.blade.php +++ b/laravel/profiling/template.blade.php @@ -61,6 +61,9 @@ @endif + @if (isset($time)) +
  • Time {{ $time }}ms
  • + @endif
  • ×
  • From 52f98b7cf6fff813698a3e7220104bf1f5c81e77 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 25 Jun 2012 01:12:31 +0300 Subject: [PATCH 044/260] Use start_time attribute like a static attribute (as it is). --- laravel/profiling/profiler.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/laravel/profiling/profiler.php b/laravel/profiling/profiler.php index 0dc837c3..d39f8bd9 100644 --- a/laravel/profiling/profiler.php +++ b/laravel/profiling/profiler.php @@ -37,9 +37,9 @@ public static function render($response) // type applications, so we will not send anything in those scenarios. if ( ! Request::ajax()) { - if ($this->start_time) + if (static::$start_time) { - static::$data['time'] = number_format((microtime(true) - $this->start_time) * 1000, 2); + static::$data['time'] = number_format((microtime(true) - static::$start_time) * 1000, 2); } return render('path: '.__DIR__.'/template'.BLADE_EXT, static::$data); } @@ -81,7 +81,7 @@ public static function query($sql, $bindings, $time) public static function attach() { // Record when the profiler was setup (as a rough measure for render time) - $this->start_time = microtime(true); + static::$start_time = microtime(true); // First we'll attach to the query and log events. These allow us to catch // all of the SQL queries and log messages that come through Laravel, From 5d06f92421653de0aea7147c714acd1f781a84d8 Mon Sep 17 00:00:00 2001 From: Noor Alhiraki Date: Mon, 25 Jun 2012 01:50:59 +0300 Subject: [PATCH 045/260] Added Arabic translation. Signed-off-by: Noor Alhiraki --- application/language/ar/pagination.php | 19 +++++ application/language/ar/validation.php | 99 ++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 application/language/ar/pagination.php create mode 100644 application/language/ar/validation.php diff --git a/application/language/ar/pagination.php b/application/language/ar/pagination.php new file mode 100644 index 00000000..37135719 --- /dev/null +++ b/application/language/ar/pagination.php @@ -0,0 +1,19 @@ + '→ السابق', + 'next' => 'التالي ←', + +); \ No newline at end of file diff --git a/application/language/ar/validation.php b/application/language/ar/validation.php new file mode 100644 index 00000000..cb15db34 --- /dev/null +++ b/application/language/ar/validation.php @@ -0,0 +1,99 @@ + "القيمة :attribute يجب أن تكون مقبولة.", + "active_url" => "القيمة :attribute تمثل عنوان موقع إنترنت غير صحيح.", + "after" => "القيمة :attribute يجب أن تكون بعد تاريخ :date.", + "alpha" => "القيمة :attribute يمكنها أن تحتوي على أحرف فقط.", + "alpha_dash" => "القيمة :attribute يمكنها أن تحتوي على أحرف و أرقام و إشارة الناقص فقط.", + "alpha_num" => "القيمة :attribute يمكنها أن تحتوي على أحرف و أرقام فقط.", + "before" => "القيمة :attribute يجب أن تكون قبل تاريخ :date.", + "between" => array( + "numeric" => "القيمة :attribute يجب أن تكون بين :min و :max.", + "file" => "الملف :attribute يجب أن يكون بحجم من :min إلى :max كيلوبايت.", + "string" => "النص :attribute يجب أن يكون بطول من :min إلى :max حرف.", + ), + "confirmed" => "القيمة :attribute التأكيدية غير مطابقة.", + "different" => "القيمتان :attribute و :other يجب أن تختلفان.", + "email" => "القيمة :attribute تمثل بريد إلكتروني غير صحيح.", + "exists" => "القيمة المختارة :attribute غير موجودة.", + "image" => "القيمة :attribute يجب أن تكون صورة.", + "in" => "القيمة المختارة :attribute غير موجودة.", + "integer" => "القيمة :attribute يجب أن تكون رقماً.", + "ip" => "القيمة :attribute يجب أن تمثل عنوان بروتوكول إنترنت صحيح.", + "match" => "القيمة :attribute هي بتنسيق غير صحيح.", + "max" => array( + "numeric" => "القيمة :attribute يجب أن تكون أقل من :max.", + "file" => "الملف :attribute يجب أن يكون بحجم أقل من :max كيلوبايت.", + "string" => "النص :attribute يجب أن يكون بطول أقل من :max حرف.", + ), + "mimes" => "القيمة :attribute يجب أن تكون ملف من نوع: :values.", + "min" => array( + "numeric" => "القيمة :attribute يجب أن تساوي :min على الأقل.", + "file" => "الملف :attribute يجب أن يكون بحجم :min كيلوبايت على الأقل.", + "string" => "النص :attribute يجب أن يكون بطول :min حرف على الأقل.", + ), + "not_in" => "القيمة :attribute المختارة غير صحيحة.", + "numeric" => "القيمة :attribute يجب أن تكون رقماً.", + "required" => "القيمة :attribute مطلوبة.", + "same" => "القيمتان :attribute و :other يجب أن تتطابقان.", + "size" => array( + "numeric" => "القيمة :attribute يجب أن تكون بحجم :size.", + "file" => "الملف :attribute يجب أن يكون بحجم :size كيلوبايت.", + "string" => "النص :attribute يجب أن يكون بطول :size حرف.", + ), + "unique" => "القيمة :attribute تم استخدامها من قبل.", + "url" => "التنسيق :attribute غير صحيح.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file From 9572329c499a2181339769d1d58ec33cc6a35e1c Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 25 Jun 2012 02:36:20 +0300 Subject: [PATCH 046/260] Allow Auth::login() to work with objects for the Eloquent driver. --- laravel/auth/drivers/eloquent.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/laravel/auth/drivers/eloquent.php b/laravel/auth/drivers/eloquent.php index 8c1c6a80..f90066be 100644 --- a/laravel/auth/drivers/eloquent.php +++ b/laravel/auth/drivers/eloquent.php @@ -7,15 +7,21 @@ class Eloquent extends Driver { * * If the user is a guest, null should be returned. * - * @param int $id + * @param int|object $token * @return mixed|null */ - public function retrieve($id) + public function retrieve($token) { + // We return an object here either if the passed token is an integer (ID) + // or if we are passed a model object of the correct type if (filter_var($id, FILTER_VALIDATE_INT) !== false) { return $this->model()->find($id); } + else if (get_class($id) == Config::get('auth.model')) + { + return $id; + } } /** From a8b5231e579830643d681eb9c7d3ece7da17dabd Mon Sep 17 00:00:00 2001 From: Steve Frost Date: Mon, 25 Jun 2012 12:16:14 +0200 Subject: [PATCH 047/260] Updated the dd function to var_dump inside pre tags, makes is a bit more readable --- laravel/helpers.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/laravel/helpers.php b/laravel/helpers.php index 07f9940a..b5bf9848 100644 --- a/laravel/helpers.php +++ b/laravel/helpers.php @@ -34,7 +34,10 @@ function __($key, $replacements = array(), $language = null) */ function dd($value) { - die(var_dump($value)); + echo "
    ";
    +	var_dump($value);
    +	echo "
    "; + die; } /** From d08db5c26bb0a078463370dd1a3af85d086690d0 Mon Sep 17 00:00:00 2001 From: Shawn McCool Date: Mon, 25 Jun 2012 13:45:29 +0200 Subject: [PATCH 048/260] added server configuration to install docs --- laravel/documentation/contents.md | 1 + laravel/documentation/install.md | 27 +++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/laravel/documentation/contents.md b/laravel/documentation/contents.md index 1d5ce11e..5a512ad1 100644 --- a/laravel/documentation/contents.md +++ b/laravel/documentation/contents.md @@ -4,6 +4,7 @@ ### General - [Installation & Setup](/docs/install) - [Requirements](/docs/install#requirements) - [Installation](/docs/install#installation) + - [Server Configuration: Why Public?](/docs/install#server-configuration) - [Basic Configuration](/docs/install#basic-configuration) - [Environments](/docs/install#environments) - [Cleaner URLs](/docs/install#cleaner-urls) diff --git a/laravel/documentation/install.md b/laravel/documentation/install.md index 12f12951..b3312366 100644 --- a/laravel/documentation/install.md +++ b/laravel/documentation/install.md @@ -4,6 +4,7 @@ ## Contents - [Requirements](#requirements) - [Installation](#installation) +- [Server Configuration: Why Public?](#server-configuration) - [Basic Configuration](#basic-configuration) - [Environments](#environments) - [Cleaner URLs](#cleaner-urls) @@ -37,8 +38,30 @@ ### Problems? If you are having problems installing, try the following: -- Make sure the **public** directory is the document root of your web server. +- Make sure the **public** directory is the document root of your web server. (see: Server Configuration below) - If you are using mod_rewrite, set the **index** option in **application/config/application.php** to an empty string. +- Verify that your storage folder and the folders within in are writable by your web server. + + +## Server Configuration: Why Public? + +Like most web-development frameworks, Laravel is designed to protect your application code, bundles, and local storage by placing only files that are necessarily public in the web server's DocumentRoot. This prevents some types of server misconfiguration from making your code (including database passwords and other configuration data) accessible through the web server. It's best to be safe. + +In this example let's imagine that we installed Laravel to the directory **/Users/JonSnow/Sites/MySite**. + +A very basic example of an Apache VirtualHost configuration for MySite might look like this. + + + DocumentRoot /Users/JonSnow/Sites/MySite/public + ServerName mysite.local + + +Notice that while we installed to **/Users/JonSnow/Sites/MySite** our DocumentRoot points to **/Users/JonSnow/Sites/MySite/public**. + +Pointing the DocumentRoot to the public folder is a commonly used best-practice. However, you may need to use Laravel on a host that does not allow you to update your DocumentRoot. This is possible, but before resigning to this option it's best to contact your host and verify that you are unable to change your DocumentRoot to increase the security of your application. + +More information about how to use the public folder can be found on the [Laravel Forums](http://forums.laravel.com/viewtopic.php?pid=10023#p10023). + ## Basic Configuration @@ -70,7 +93,7 @@ ## Environments ); -In this example, the local **URL** option will override the **URL** option in **application/config/application.php**. Notice that you only need to specify the options you wish to override. +In this example, the local **URL** option will override the **URL** option in **application/config/application.php**. Notice that you only need to specify the options you wish to override. Isn't it easy? Of course, you are free to create as many environments as you wish! From 0f5de55d5b4d2fb15049bf2ca208c2d3d7b56730 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 25 Jun 2012 14:53:15 +0300 Subject: [PATCH 049/260] Fix variable name in retrieve() method for Eloquent auth driver. --- laravel/auth/drivers/eloquent.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/laravel/auth/drivers/eloquent.php b/laravel/auth/drivers/eloquent.php index f90066be..e50a3142 100644 --- a/laravel/auth/drivers/eloquent.php +++ b/laravel/auth/drivers/eloquent.php @@ -14,13 +14,13 @@ public function retrieve($token) { // We return an object here either if the passed token is an integer (ID) // or if we are passed a model object of the correct type - if (filter_var($id, FILTER_VALIDATE_INT) !== false) + if (filter_var($token, FILTER_VALIDATE_INT) !== false) { - return $this->model()->find($id); + return $this->model()->find($token); } - else if (get_class($id) == Config::get('auth.model')) + else if (get_class($token) == Config::get('auth.model')) { - return $id; + return $token; } } From 204a64f006992894b57811596e2e66e91c912216 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 25 Jun 2012 14:56:04 +0300 Subject: [PATCH 050/260] Simply use the LARAVEL_START constant for calculation page generation time in profiler. --- laravel/profiling/profiler.php | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/laravel/profiling/profiler.php b/laravel/profiling/profiler.php index d39f8bd9..4fd9c183 100644 --- a/laravel/profiling/profiler.php +++ b/laravel/profiling/profiler.php @@ -15,15 +15,6 @@ class Profiler { */ protected static $data = array('queries' => array(), 'logs' => array()); - /** - * The time when the profiler was setup. - * - * This is used for generating the total page rendering time. - * - * @var float - */ - protected static $start_time; - /** * Get the rendered contents of the Profiler. * @@ -37,10 +28,7 @@ public static function render($response) // type applications, so we will not send anything in those scenarios. if ( ! Request::ajax()) { - if (static::$start_time) - { - static::$data['time'] = number_format((microtime(true) - static::$start_time) * 1000, 2); - } + static::$data['time'] = number_format((microtime(true) - LARAVEL_START) * 1000, 2); return render('path: '.__DIR__.'/template'.BLADE_EXT, static::$data); } } @@ -80,9 +68,6 @@ public static function query($sql, $bindings, $time) */ public static function attach() { - // Record when the profiler was setup (as a rough measure for render time) - static::$start_time = microtime(true); - // First we'll attach to the query and log events. These allow us to catch // all of the SQL queries and log messages that come through Laravel, // and we will pass them onto the Profiler for simple storage. From bcd63ab5affaa29e187baf75452a74ee5a5772c3 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 25 Jun 2012 14:56:42 +0300 Subject: [PATCH 051/260] We can be fairly sure the $time variable is set in the profiler view. --- laravel/profiling/template.blade.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/laravel/profiling/template.blade.php b/laravel/profiling/template.blade.php index a06f7957..d87b19d5 100755 --- a/laravel/profiling/template.blade.php +++ b/laravel/profiling/template.blade.php @@ -61,9 +61,7 @@ @endif - @if (isset($time))
  • Time {{ $time }}ms
  • - @endif
  • ×
  • From 5e2373817d882e9873f3ba21da56c117f890599d Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 25 Jun 2012 21:31:54 +0300 Subject: [PATCH 052/260] Allow for passing variables to views with more expressive method calls. Example: with_foo($bar) instead of with('foo', $bar) Signed-off-by: Franz Liedke --- laravel/view.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/laravel/view.php b/laravel/view.php index 9a375073..2754d495 100644 --- a/laravel/view.php +++ b/laravel/view.php @@ -551,4 +551,20 @@ public function __toString() return $this->render(); } + /** + * Magic Method for handling dynamic functions. + * + * This method handles calls to dynamic with helpers. + */ + public function __call($method, $parameters) + { + if (strpos($method, 'with_') === 0) + { + $key = substr($method, 5); + return $this->with($key, $parameters[0]); + } + + throw new \Exception("Method [$method] is not defined on the View class."); + } + } \ No newline at end of file From a04f38c2625deb7e26a52147c6e8fd45581cffe2 Mon Sep 17 00:00:00 2001 From: Tobsn Date: Wed, 27 Jun 2012 03:46:31 -0700 Subject: [PATCH 053/260] Now with Balanced Parentheses! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit it's not regex, its not posix, but it can fly… finally balanced parentheses to fix all the () issue. it's ugly but it's fast and works with all kinds of combinations. it basically just counts open vs. closed and if they are even again it knows exactly where the condition is and does not cut into html or cut off too much. --- laravel/blade.php | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/laravel/blade.php b/laravel/blade.php index 7e4e2fdb..f224614a 100644 --- a/laravel/blade.php +++ b/laravel/blade.php @@ -260,9 +260,42 @@ protected static function compile_endforelse($value) */ protected static function compile_structure_openings($value) { - $pattern = '/@(if|elseif|foreach|for|while)\s*?(\(.+?\))/'; - - return preg_replace($pattern, '', $value); + preg_replace_callback( + '/@(if|elseif|foreach|for|while)(\s*?)(\([^\n\r\t]+\))/', + function($matches) use (&$value) + { + if(count( $matches ) === 4) + { + $open = 0; + $close = 0; + $cut = 0; + $len = strlen($matches[3]); + for($i = 0; $i < $len; $i++) + { + if($matches[3][$i] === '(' ) + { + $open++; + } + if($matches[3][$i] === ')' ) + { + $close++; + } + if($open !== 0 && ($open === $close)) + { + break; + } + } + $condition = substr($matches[3], 0, ($i + 1)); + $value = str_replace( + '@'.$matches[1].$matches[2].$condition, + '', + $value + ); + } + }, + $value + ); + return $value; } /** From 9858f8aa61705ea87a36ab34ae4774da4b5180bb Mon Sep 17 00:00:00 2001 From: niallobrien Date: Wed, 27 Jun 2012 14:19:21 +0200 Subject: [PATCH 054/260] Added examples for using $errors in views. --- laravel/documentation/validation.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/laravel/documentation/validation.md b/laravel/documentation/validation.md index 4da4683c..690bd54e 100644 --- a/laravel/documentation/validation.md +++ b/laravel/documentation/validation.md @@ -304,7 +304,26 @@ ## Validation Walkthrough Great! So, we have two simple registration routes. One to handle displaying the form, and one to handle the posting of the form. In the POST route, we run some validation over the input. If the validation fails, we redirect back to the registration form and flash the validation errors to the session so they will be available for us to display. -**But, notice we are not explicitly binding the errors to the view in our GET route**. However, an errors variable will still be available in the view. Laravel intelligently determines if errors exist in the session, and if they do, binds them to the view for you. If no errors exist in the session, an empty message container will still be bound to the view. In your views, this allows you to always assume you have a message container available via the errors variable. We love making your life easier. +**But, notice we are not explicitly binding the errors to the view in our GET route**. However, an errors variable ($errors) will still be available in the view. Laravel intelligently determines if errors exist in the session, and if they do, binds them to the view for you. If no errors exist in the session, an empty message container will still be bound to the view. In your views, this allows you to always assume you have a message container available via the errors variable. We love making your life easier. + +For example, if email address validation failed, we can look for 'email' within the $errors session var. + + $errors->has('email') + +Using Blade, we can then conditionally add error messages to our view. + + {{ $errors->has('email') ? 'Invalid Email Address' : 'Condition is false. Can be left blank' }} + +This will also work great when we need to conditionally add classes when using something like Twitter Bootstrap. +For example, if the email address failed validation, we may want to add the "error" class from Bootstrap to our *div class="control-group"* statement. + +
    + +When the validation fails, our rendered view will have the appended *error* class. + +
    + + ## Custom Error Messages From ad2540c979bc20a9a4a52fbea7efd58da5baf7bd Mon Sep 17 00:00:00 2001 From: Luca Degasperi Date: Wed, 27 Jun 2012 15:20:28 +0200 Subject: [PATCH 055/260] Fixed the spaced directory when calling php unit via the command line Signed-off-by: Luca Degasperi --- laravel/cli/tasks/test/runner.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/laravel/cli/tasks/test/runner.php b/laravel/cli/tasks/test/runner.php index 85787896..e13a42d9 100644 --- a/laravel/cli/tasks/test/runner.php +++ b/laravel/cli/tasks/test/runner.php @@ -80,6 +80,9 @@ protected function test() // pointing to our temporary configuration file. This allows // us to flexibly run tests for any setup. $path = path('base').'phpunit.xml'; + + // fix the spaced directories problem when using the command line + $path = str_replace(" ", "\\ ", $path); passthru('phpunit --configuration '.$path); From 79a5dc19313c31ec0e109730a0b20389d3bfcd63 Mon Sep 17 00:00:00 2001 From: Luca Degasperi Date: Wed, 27 Jun 2012 17:31:38 +0200 Subject: [PATCH 056/260] Using escapeshellarg instead of putting backshlashes in front of spaces Signed-off-by: Luca Degasperi --- laravel/cli/tasks/test/runner.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/laravel/cli/tasks/test/runner.php b/laravel/cli/tasks/test/runner.php index e13a42d9..953c9857 100644 --- a/laravel/cli/tasks/test/runner.php +++ b/laravel/cli/tasks/test/runner.php @@ -82,7 +82,8 @@ protected function test() $path = path('base').'phpunit.xml'; // fix the spaced directories problem when using the command line - $path = str_replace(" ", "\\ ", $path); + // strings with spaces inside should be wrapped in quotes. + $path = escapeshellarg($path) passthru('phpunit --configuration '.$path); From f640cd42ad9283db82d7c7339ff1a1e050232dcf Mon Sep 17 00:00:00 2001 From: Daniel Petrie Date: Wed, 27 Jun 2012 11:15:34 -0700 Subject: [PATCH 057/260] adding in '=' to regex for (:any) / (:any?) calls. --- laravel/routing/router.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/laravel/routing/router.php b/laravel/routing/router.php index a6577b3f..91957551 100644 --- a/laravel/routing/router.php +++ b/laravel/routing/router.php @@ -75,7 +75,7 @@ class Router { */ public static $patterns = array( '(:num)' => '([0-9]+)', - '(:any)' => '([a-zA-Z0-9\.\-_%]+)', + '(:any)' => '([a-zA-Z0-9\.\-_%=]+)', '(:all)' => '(.*)', ); @@ -86,7 +86,7 @@ class Router { */ public static $optional = array( '/(:num?)' => '(?:/([0-9]+)', - '/(:any?)' => '(?:/([a-zA-Z0-9\.\-_%]+)', + '/(:any?)' => '(?:/([a-zA-Z0-9\.\-_%=]+)', '/(:all?)' => '(?:/(.*)', ); From 39df69fdc1a4c00fea078d11d2421fbb18661da3 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Thu, 28 Jun 2012 18:33:45 +0300 Subject: [PATCH 058/260] Allow more than just WHERE clauses on eager load constraints. --- laravel/database/query.php | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/laravel/database/query.php b/laravel/database/query.php index 83c92b83..915f7c80 100644 --- a/laravel/database/query.php +++ b/laravel/database/query.php @@ -395,7 +395,7 @@ public function or_where_not_null($column) } /** - * Add a nested where condition to the query. + * Add nested constraints to the query. * * @param Closure $callback * @param string $connector @@ -403,24 +403,7 @@ public function or_where_not_null($column) */ public function where_nested($callback, $connector = 'AND') { - $type = 'where_nested'; - - // To handle a nested where statement, we will actually instantiate a new - // Query instance and run the callback over that instance, which will - // allow the developer to have a fresh query instance - $query = new Query($this->connection, $this->grammar, $this->from); - - call_user_func($callback, $query); - - // Once the callback has been run on the query, we will store the nested - // query instance on the where clause array so that it's passed to the - // query's query grammar instance when building. - if ($query->wheres !== null) - { - $this->wheres[] = compact('type', 'query', 'connector'); - } - - $this->bindings = array_merge($this->bindings, $query->bindings); + call_user_func($callback, $this); return $this; } From 14e9488cf9faac9ac573b4b7dd5bd588baafd9c8 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Thu, 28 Jun 2012 15:19:17 -0500 Subject: [PATCH 059/260] Speed up eager loading of many to many. --- .../relationships/has_many_and_belongs_to.php | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/laravel/database/eloquent/relationships/has_many_and_belongs_to.php b/laravel/database/eloquent/relationships/has_many_and_belongs_to.php index 52276a5f..28e8c19f 100644 --- a/laravel/database/eloquent/relationships/has_many_and_belongs_to.php +++ b/laravel/database/eloquent/relationships/has_many_and_belongs_to.php @@ -325,14 +325,21 @@ public function match($relationship, &$parents, $children) { $foreign = $this->foreign_key(); + $dictionary = array(); + + foreach ($children as $child) + { + $dictionary[$child->pivot->$foreign][] = $child; + } + foreach ($parents as &$parent) { - $matching = array_filter($children, function($v) use (&$parent, $foreign) - { - return $v->pivot->$foreign == $parent->get_key(); - }); + $parent_key = $parent->get_key(); - $parent->relationships[$relationship] = array_values($matching); + if (isset($dictionary[$parent_key])) + { + $parent->relationships[$relationship] = $dictionary[$parent_key]; + } } } From d53ac0e9d128124d294d476c5102666bb330c1a6 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Thu, 28 Jun 2012 15:28:03 -0500 Subject: [PATCH 060/260] update change log --- laravel/documentation/changes.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/laravel/documentation/changes.md b/laravel/documentation/changes.md index d4e12daa..e5c68b89 100644 --- a/laravel/documentation/changes.md +++ b/laravel/documentation/changes.md @@ -2,6 +2,8 @@ # Laravel Change Log ## Contents +- [Laravel 3.2.4](#3.2.4) +- [Upgrading From 3.2.3](#upgrade-3.2.4) - [Laravel 3.2.3](#3.2.3) - [Upgrading From 3.2.2](#upgrade-3.2.3) - [Laravel 3.2.2](#3.2.2) @@ -31,6 +33,16 @@ ## Contents - [Laravel 3.1](#3.1) - [Upgrading From 3.0](#upgrade-3.1) + +## Laravel 3.2.4 + +- Speed up many to many eager loading mapping. + + +## Upgrading From 3.2.3 + +- Replace the **laravel** folder. + ## Laravel 3.2.3 From 750365c74008b5c1715ff2e9731514355f32e810 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Thu, 28 Jun 2012 15:28:26 -0500 Subject: [PATCH 061/260] increment version --- artisan | 2 +- paths.php | 2 +- public/index.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/artisan b/artisan index e5dfd7ef..bd0f3cbb 100644 --- a/artisan +++ b/artisan @@ -4,7 +4,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.3 + * @version 3.2.4 * @author Taylor Otwell * @link http://laravel.com */ diff --git a/paths.php b/paths.php index 78d5a02f..e5a6a055 100644 --- a/paths.php +++ b/paths.php @@ -3,7 +3,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.3 + * @version 3.2.4 * @author Taylor Otwell * @link http://laravel.com */ diff --git a/public/index.php b/public/index.php index 00cb86cd..fb2a1902 100644 --- a/public/index.php +++ b/public/index.php @@ -3,7 +3,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.3 + * @version 3.2.4 * @author Taylor Otwell * @link http://laravel.com */ From 3a504cfa8e8664dbf8ccdc59b4cfc085af7b0d3d Mon Sep 17 00:00:00 2001 From: TommyC81 Date: Fri, 29 Jun 2012 20:34:00 +0300 Subject: [PATCH 062/260] Fixed small typo. --- laravel/documentation/install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/install.md b/laravel/documentation/install.md index b3312366..51a727d4 100644 --- a/laravel/documentation/install.md +++ b/laravel/documentation/install.md @@ -40,7 +40,7 @@ ### Problems? - Make sure the **public** directory is the document root of your web server. (see: Server Configuration below) - If you are using mod_rewrite, set the **index** option in **application/config/application.php** to an empty string. -- Verify that your storage folder and the folders within in are writable by your web server. +- Verify that your storage folder and the folders within are writable by your web server. ## Server Configuration: Why Public? From a87bb869992d6050855b8c4d47f73b98567f4c56 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 29 Jun 2012 20:56:32 +0300 Subject: [PATCH 063/260] Fix a bug with Eloquent model classes and isset() when eager loading a relationship returns an empty result set. --- laravel/database/eloquent/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index 2ad1c72b..7e9b0ba3 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -725,7 +725,7 @@ public function __isset($key) { foreach (array('attributes', 'relationships') as $source) { - if (array_key_exists($key, $this->$source)) return true; + if (array_key_exists($key, $this->$source)) return !is_null($this->$source[$key]); } if (method_exists($this, $key)) return true; From 837f6176272e8599ad689b2c10cbe610d5ecc0a8 Mon Sep 17 00:00:00 2001 From: TommyC81 Date: Fri, 29 Jun 2012 21:42:06 +0300 Subject: [PATCH 064/260] Re-organized and added some more help on the reflash() and keep() functions. --- laravel/documentation/session/usage.md | 27 ++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/laravel/documentation/session/usage.md b/laravel/documentation/session/usage.md index 5f9aad56..b390b75e 100644 --- a/laravel/documentation/session/usage.md +++ b/laravel/documentation/session/usage.md @@ -5,6 +5,7 @@ ## Contents - [Storing Items](#put) - [Retrieving Items](#get) - [Removing Items](#forget) +- [Flashing Items](#flash) - [Regeneration](#regeneration) @@ -16,10 +17,6 @@ ## Storing Items The first parameter is the **key** to the session item. You will use this key to retrieve the item from the session. The second parameter is the **value** of the item. -The **flash** method stores an item in the session that will expire after the next request. It's useful for storing temporary data like status or error messages: - - Session::flash('status', 'Welcome Back!'); - ## Retrieving Items @@ -53,6 +50,28 @@ ## Removing Items Session::flush(); + +## Flashing Items + +The **flash** method stores an item in the session that will expire after the next request. It's useful for storing temporary data like status or error messages: + + Session::flash('status', 'Welcome Back!'); + +Flash items that are expring in subsequent requests can be retained for another request by using one of the following methods: + +Retain all items for another request: + + Session::reflash(); + +Retain an individual item for another request: + + Session::keep('status'); + +Retain several items for another request: + + Session::keep(array('status', 'other_item')); + + ## Regeneration From 97dfaee88fbe33b54fcf197b5232c57517984307 Mon Sep 17 00:00:00 2001 From: Tomasz Tomczyk Date: Fri, 29 Jun 2012 19:43:00 +0100 Subject: [PATCH 065/260] Added Polish translation Signed-off-by: Tomasz Tomczyk --- application/language/pl/pagination.php | 19 +++++ application/language/pl/validation.php | 99 ++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 application/language/pl/pagination.php create mode 100644 application/language/pl/validation.php diff --git a/application/language/pl/pagination.php b/application/language/pl/pagination.php new file mode 100644 index 00000000..90536b95 --- /dev/null +++ b/application/language/pl/pagination.php @@ -0,0 +1,19 @@ + '« Poprzednia', + 'next' => 'Następna »', + +); \ No newline at end of file diff --git a/application/language/pl/validation.php b/application/language/pl/validation.php new file mode 100644 index 00000000..ead856b1 --- /dev/null +++ b/application/language/pl/validation.php @@ -0,0 +1,99 @@ + ":attribute musi zostać zaakceptowane.", + "active_url" => ":attribute nie jest prawidłowym adresem URL.", + "after" => ":attribute musi zawierać datę, która jest po :date.", + "alpha" => ":attribute może zawierać jedynie litery.", + "alpha_dash" => ":attribute może zawierać jedynie litery, cyfry i myślniki.", + "alpha_num" => ":attribute może zawierać jedynie litery i cyfry.", + "before" => ":attribute musi zawierać datę, która jest przed :date.", + "between" => array( + "numeric" => ":ttribute musi mieścić się w granicach :min - :max.", + "file" => ":attribute musi mieć :min - :max kilobajtów.", + "string" => ":attribute musi mieć :min - :max znaków.", + ), + "confirmed" => "Potwierdzenie :attribute się nie zgadza.", + "different" => ":attribute i :other muszą się od siebie różnić.", + "email" => "The :attribute format is invalid.", + "exists" => "Zaznaczona opcja :attribute jest nieprawidłowa.", + "image" => ":attribute musi być obrazkiem.", + "in" => "Zaznaczona opcja :attribute jest nieprawidłowa.", + "integer" => ":attribute musi być liczbą całkowitą.", + "ip" => ":attribute musi być prawidłowym adresem IP.", + "match" => "Format :attribute jest nieprawidłowy.", + "max" => array( + "numeric" => ":attribute musi być poniżej :max.", + "file" => ":attribute musi mieć poniżej :max kilobajtów.", + "string" => ":attribute musi mieć poniżej :max znaków.", + ), + "mimes" => ":attribute musi być plikiem rodzaju :values.", + "min" => array( + "numeric" => ":attribute musi być co najmniej :min.", + "file" => "Plik :attribute musi mieć co najmniej :min kilobajtów.", + "string" => ":attribute musi mieć co najmniej :min znaków.", + ), + "not_in" => "Zaznaczona opcja :attribute jest nieprawidłowa.", + "numeric" => ":attribute musi być numeryczne.", + "required" => "Pole :attribute jest wymagane.", + "same" => ":attribute i :other muszą być takie same.", + "size" => array( + "numeric" => ":attribute musi mieć rozmiary :size.", + "file" => ":attribute musi mieć :size kilobajtów.", + "string" => ":attribute musi mieć :size znaków.", + ), + "unique" => ":attribute zostało już użyte.", + "url" => "Format pola :attribute jest nieprawidłowy.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file From 26623c79ed48df79d2315330899e0a20abebd5e3 Mon Sep 17 00:00:00 2001 From: TommyC81 Date: Fri, 29 Jun 2012 21:45:31 +0300 Subject: [PATCH 066/260] Removed empty row. --- laravel/documentation/session/usage.md | 1 - 1 file changed, 1 deletion(-) diff --git a/laravel/documentation/session/usage.md b/laravel/documentation/session/usage.md index b390b75e..d0f8ec31 100644 --- a/laravel/documentation/session/usage.md +++ b/laravel/documentation/session/usage.md @@ -71,7 +71,6 @@ ## Flashing Items Session::keep(array('status', 'other_item')); - ## Regeneration From 2159596a83ec8ccdf0b8fb220d153b05588d3524 Mon Sep 17 00:00:00 2001 From: TommyC81 Date: Fri, 29 Jun 2012 21:49:54 +0300 Subject: [PATCH 067/260] Bold characters for reflash and keep. --- laravel/documentation/session/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/session/usage.md b/laravel/documentation/session/usage.md index d0f8ec31..9e6984ca 100644 --- a/laravel/documentation/session/usage.md +++ b/laravel/documentation/session/usage.md @@ -57,7 +57,7 @@ ## Flashing Items Session::flash('status', 'Welcome Back!'); -Flash items that are expring in subsequent requests can be retained for another request by using one of the following methods: +Flash items that are expring in subsequent requests can be retained for another request by using one of the **reflash** or **keep** methods: Retain all items for another request: From 110078d2af55053f5c24e0fbb2b4115d1687cc36 Mon Sep 17 00:00:00 2001 From: TommyC81 Date: Fri, 29 Jun 2012 21:55:38 +0300 Subject: [PATCH 068/260] Fixed typo --- laravel/documentation/session/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/session/usage.md b/laravel/documentation/session/usage.md index 9e6984ca..1b5c9d5c 100644 --- a/laravel/documentation/session/usage.md +++ b/laravel/documentation/session/usage.md @@ -57,7 +57,7 @@ ## Flashing Items Session::flash('status', 'Welcome Back!'); -Flash items that are expring in subsequent requests can be retained for another request by using one of the **reflash** or **keep** methods: +Flash items that are expiring in subsequent requests can be retained for another request by using one of the **reflash** or **keep** methods: Retain all items for another request: From f77b22eb45af6fbdd37078feda09776c96b9ca41 Mon Sep 17 00:00:00 2001 From: TommyC81 Date: Sat, 30 Jun 2012 18:11:31 +0300 Subject: [PATCH 069/260] Add documentation on how to attach pivot table fields to attach command. --- laravel/documentation/database/eloquent.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/laravel/documentation/database/eloquent.md b/laravel/documentation/database/eloquent.md index c2afc7a2..5858224b 100644 --- a/laravel/documentation/database/eloquent.md +++ b/laravel/documentation/database/eloquent.md @@ -318,6 +318,10 @@ ### Inserting Related Models (Many-To-Many) $user->roles()->attach($role_id); +It's also possible to attach data for fields in the intermediate table (pivot table), to do this add a second array variable to the attach command containing the data you want to attach: + + $user->roles()->attach($role_id, array('expires' => $expires)); + Alternatively, you can use the `sync` method, which accepts an array of IDs to "sync" with the intermediate table. After this operation is complete, only the IDs in the array will be on the intermediate table. From 34923cff1e3b4ec677adba7be0ef4d6d13b339fc Mon Sep 17 00:00:00 2001 From: Nir Lahad Date: Sun, 1 Jul 2012 00:38:43 +0300 Subject: [PATCH 070/260] Hebrew Translation Hebrew language files. --- application/language/he/pagination.php | 19 +++++ application/language/he/validation.php | 102 +++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 application/language/he/pagination.php create mode 100644 application/language/he/validation.php diff --git a/application/language/he/pagination.php b/application/language/he/pagination.php new file mode 100644 index 00000000..6d2684cd --- /dev/null +++ b/application/language/he/pagination.php @@ -0,0 +1,19 @@ + '→ אחורה', + 'next' => 'קדימה ←', + +); \ No newline at end of file diff --git a/application/language/he/validation.php b/application/language/he/validation.php new file mode 100644 index 00000000..6a108d09 --- /dev/null +++ b/application/language/he/validation.php @@ -0,0 +1,102 @@ + "חובה להסכים ל-:attribute.", + "active_url" => ":attribute אינה כתובת אינטרנט פעילה.", + "after" => ":attribute חייב להיות תאריך אחרי :date.", + "alpha" => ":attribute יכול להכיל רק אותיות.", + "alpha_dash" => ":attribute יכול להיות רק אותיות, מספרים ומקפים.", + "alpha_num" => ":attribute יכול להכיל רק אותיות ומספרים.", + "before" => ":attribute חייב להיות תאריך אחרי :date.", + "between" => array( + "numeric" => ":attribute חייב להיות בין :min ל-:max.", + "file" => ":attribute חייב לשקול בין :min ל-:max ק"ב.", + "string" => ":attribute חייב להכיל בין :min ל-:max תווים.", + ), + "confirmed" => "אישור ה-:attribute אינו תואם למקור.", + "different" => ":attribute ו-:other חייבים להיות שונים.", + "email" => ":attribute אינה כתובת דוא"ל תקינה.", + "exists" => "הערך של :attribute לא קיים.", + "image" => ":attribute חייבת להיות תמונה.", + "in" => ":attribute אינו נמצא ברשימה המאשרת.", + "integer" => ":attribute חייב להיות מספר שלם.", + "ip" => ":attribute חייבת להיות כתובת IP תקינה.", + "match" => "התבנית של :attribute אינה תקינה.", + "max" => array( + "numeric" => ":attribute חייב להיות פחות מ-:max.", + "file" => ":attribute חייב לשקול פחות מ-:max ק"ב.", + "string" => ":attribute חייב להכיל פחות מ-:max תווים.", + ), + "mimes" => ":attribute חייב להיות קובץ מסוג: :values.", + "min" => array( + "numeric" => ":attribute חייב להיות לפחות :min.", + "file" => ":attribute חייב לשקול לפחות :min ק"ב.", + "string" => ":attribute חייב להכיל לפחות :min תווים.", + ), + "not_in" => ":attribute נמצא ברשימה השחורה.", + "numeric" => ":attribute חייב להיות מספר.", + "required" => "חובה למלא :attribute.", + "same" => ":attribute ו-:other חייבים להתאים.", + "size" => array( + "numeric" => ":attribute חייב להיות :size.", + "file" => ":attribute חייב לשקול :size ק"ב.", + "string" => ":attribute חייב להכיל :size תווים.", + ), + "unique" => ":attribute כבר קיים.", + "url" => ":attribute אינה כתובת אינטרנט תקנית.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file From 52f76b9d662c17bb12bf872e964c8881fc41dd80 Mon Sep 17 00:00:00 2001 From: Jason Lewis Date: Sun, 1 Jul 2012 22:51:42 +0930 Subject: [PATCH 071/260] Fixes #818, wraps in an array instead of type casting. Signed-off-by: Jason Lewis --- laravel/database/query.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/database/query.php b/laravel/database/query.php index 83c92b83..3dc7604f 100644 --- a/laravel/database/query.php +++ b/laravel/database/query.php @@ -140,7 +140,7 @@ public function distinct() */ public function select($columns = array('*')) { - $this->selects = (array) $columns; + $this->selects = is_array($columns) ? $columns : array($columns); return $this; } From 98b92185e314d8866ab7dae8d35fa8c8cec5c87f Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 2 Jul 2012 03:38:58 +0300 Subject: [PATCH 072/260] Calculate memory and peak memory usage in profiler, too. --- laravel/profiling/profiler.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/laravel/profiling/profiler.php b/laravel/profiling/profiler.php index 4fd9c183..b2a8635f 100644 --- a/laravel/profiling/profiler.php +++ b/laravel/profiling/profiler.php @@ -28,10 +28,24 @@ public static function render($response) // type applications, so we will not send anything in those scenarios. if ( ! Request::ajax()) { + static::$data['memory'] = static::get_file_size(memory_get_usage(true)); + static::$data['memory_peak'] = static::get_file_size(memory_get_peak_usage(true)); static::$data['time'] = number_format((microtime(true) - LARAVEL_START) * 1000, 2); return render('path: '.__DIR__.'/template'.BLADE_EXT, static::$data); } } + + /** + * Calculate the human-readable file size (with proper units). + * + * @param int $size + * @return string + */ + private static function get_file_size($size) + { + $units = array('Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB'); + return @round($size / pow(1024, ($i = floor(log($size, 1024)))), 2).' '.$units[$i]; + } /** * Add a log entry to the log entries array. From 94e9106b760eb1b50eb81ac83b23f400b6a3e829 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 2 Jul 2012 03:42:43 +0300 Subject: [PATCH 073/260] Display memory usage (and peak usage) in the profiler bar, too. --- laravel/profiling/template.blade.php | 1 + 1 file changed, 1 insertion(+) diff --git a/laravel/profiling/template.blade.php b/laravel/profiling/template.blade.php index d87b19d5..32c430a6 100755 --- a/laravel/profiling/template.blade.php +++ b/laravel/profiling/template.blade.php @@ -62,6 +62,7 @@
  • Time {{ $time }}ms
  • +
  • Memory {{ $memory }} ({{ $memory_peak }})
  • ×
  • From b28c5eb19f2ec7941522b6289f02e543c0ed7d1b Mon Sep 17 00:00:00 2001 From: Steven Lischer Date: Mon, 2 Jul 2012 12:32:14 -0500 Subject: [PATCH 074/260] docs edit: eager loading using $includes in model --- laravel/documentation/database/eloquent.md | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/laravel/documentation/database/eloquent.md b/laravel/documentation/database/eloquent.md index c2afc7a2..93f4896f 100644 --- a/laravel/documentation/database/eloquent.md +++ b/laravel/documentation/database/eloquent.md @@ -406,6 +406,28 @@ ## Eager Loading $books = Book::with(array('author', 'author.contacts'))->get(); +If you find yourself eager loading the same models often, you may want to use **$includes** in the model. + + class Book extends Eloquent { + + public $includes = array('author'); + + public function author() + { + return $this->belongs_to('Author'); + } + + } + +**$includes** takes the same arguments that **with** takes. The following is now eagerly loaded. + + foreach (Book::all() as $book) + { + echo $book->author->name; + } + +> **Note:** Using **with** will override a models **$includes**. + ## Constraining Eager Loads @@ -419,6 +441,7 @@ ## Constraining Eager Loads In this example, we're eager loading the posts for the users, but only if the post's "title" column contains the word "first". + ## Getter & Setter Methods From 72558bda3b4c1b7a5848d43a466d7e3475a408d1 Mon Sep 17 00:00:00 2001 From: Steven Lischer Date: Mon, 2 Jul 2012 12:50:26 -0500 Subject: [PATCH 075/260] removed extra newline --- laravel/documentation/database/eloquent.md | 1 - 1 file changed, 1 deletion(-) diff --git a/laravel/documentation/database/eloquent.md b/laravel/documentation/database/eloquent.md index 93f4896f..17156c36 100644 --- a/laravel/documentation/database/eloquent.md +++ b/laravel/documentation/database/eloquent.md @@ -441,7 +441,6 @@ ## Constraining Eager Loads In this example, we're eager loading the posts for the users, but only if the post's "title" column contains the word "first". - ## Getter & Setter Methods From 7bdddfe2faa6d094441944ff22135d8a43bd743b Mon Sep 17 00:00:00 2001 From: Nir Lahad Date: Wed, 4 Jul 2012 08:19:36 +0300 Subject: [PATCH 076/260] Fixed Hebrew Fixed and unified hebrew translation. --- application/language/he/validation.php | 68 +++++++++++++------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/application/language/he/validation.php b/application/language/he/validation.php index 6a108d09..f0059b6a 100644 --- a/application/language/he/validation.php +++ b/application/language/he/validation.php @@ -22,48 +22,48 @@ */ "accepted" => "חובה להסכים ל-:attribute.", - "active_url" => ":attribute אינה כתובת אינטרנט פעילה.", - "after" => ":attribute חייב להיות תאריך אחרי :date.", - "alpha" => ":attribute יכול להכיל רק אותיות.", - "alpha_dash" => ":attribute יכול להיות רק אותיות, מספרים ומקפים.", - "alpha_num" => ":attribute יכול להכיל רק אותיות ומספרים.", - "before" => ":attribute חייב להיות תאריך אחרי :date.", + "active_url" => "הערך :attribute חייב להכיל כתובת אינטרנט פעילה.", + "after" => "הערך :attribute חייב להכיל תאריך אחרי :date.", + "alpha" => "הערך :attribute יכול להכיל רק אותיות.", + "alpha_dash" => "הערך :attribute יכול להכיל רק אותיות, מספרים ומקפים.", + "alpha_num" => "הערך :attribute יכול להכיל רק אותיות ומספרים.", + "before" => "הערך :attribute חייב להכיל תאריך לפני :date.", "between" => array( - "numeric" => ":attribute חייב להיות בין :min ל-:max.", - "file" => ":attribute חייב לשקול בין :min ל-:max ק"ב.", - "string" => ":attribute חייב להכיל בין :min ל-:max תווים.", + "numeric" => "הערך :attribute חייב להיות בין :min ל-:max.", + "file" => "הערך :attribute חייב לשקול בין :min ל-:max ק"ב.", + "string" => "הערך :attribute חייב להכיל בין :min ל-:max תווים.", ), - "confirmed" => "אישור ה-:attribute אינו תואם למקור.", - "different" => ":attribute ו-:other חייבים להיות שונים.", - "email" => ":attribute אינה כתובת דוא"ל תקינה.", - "exists" => "הערך של :attribute לא קיים.", - "image" => ":attribute חייבת להיות תמונה.", - "in" => ":attribute אינו נמצא ברשימה המאשרת.", - "integer" => ":attribute חייב להיות מספר שלם.", - "ip" => ":attribute חייבת להיות כתובת IP תקינה.", - "match" => "התבנית של :attribute אינה תקינה.", + "confirmed" => "הערכים של :attribute חייבים להיות זהים.", + "different" => "הערכים של :attribute ו-:other חייבים להיות שונים.", + "email" => "הערך :attribute חייב להכיל כתובת אימייל תקינה.", + "exists" => "הערך :attribute לא קיים.", + "image" => "הערך :attribute חייב להיות תמונה.", + "in" => "הערך :attribute חייב להיות ברשימה המאשרת.", + "integer" => "הערך :attribute חייב להיות מספר שלם.", + "ip" => "הערך :attribute חייב להיות כתובת IP תקינה.", + "match" => "התבנית של הערך :attribute אינה תקינה.", "max" => array( - "numeric" => ":attribute חייב להיות פחות מ-:max.", - "file" => ":attribute חייב לשקול פחות מ-:max ק"ב.", - "string" => ":attribute חייב להכיל פחות מ-:max תווים.", + "numeric" => "הערך :attribute חייב להיות פחות מ-:max.", + "file" => "הערך :attribute חייב לשקול פחות מ-:max ק"ב.", + "string" => "הערך :attribute חייב להכיל פחות מ-:max תווים.", ), - "mimes" => ":attribute חייב להיות קובץ מסוג: :values.", + "mimes" => "הערך :attribute חייב להיות קובץ מסוג: :values.", "min" => array( - "numeric" => ":attribute חייב להיות לפחות :min.", - "file" => ":attribute חייב לשקול לפחות :min ק"ב.", - "string" => ":attribute חייב להכיל לפחות :min תווים.", + "numeric" => "הערך :attribute חייב להיות לפחות :min.", + "file" => "הערך :attribute חייב לשקול לפחות :min ק"ב.", + "string" => "הערך :attribute חייב להכיל לפחות :min תווים.", ), - "not_in" => ":attribute נמצא ברשימה השחורה.", - "numeric" => ":attribute חייב להיות מספר.", - "required" => "חובה למלא :attribute.", - "same" => ":attribute ו-:other חייבים להתאים.", + "not_in" => "הערך :attribute נמצא ברשימה השחורה.", + "numeric" => "הערך :attribute חייב להיות מספר.", + "required" => "חובה למלא את הערך :attribute.", + "same" => "הערכים :attribute ו-:other חייבים להיות זהים.", "size" => array( - "numeric" => ":attribute חייב להיות :size.", - "file" => ":attribute חייב לשקול :size ק"ב.", - "string" => ":attribute חייב להכיל :size תווים.", + "numeric" => "הערך :attribute חייב להיות :size.", + "file" => "הערך :attribute חייב לשקול :size ק"ב.", + "string" => "הערך :attribute חייב להכיל :size תווים.", ), - "unique" => ":attribute כבר קיים.", - "url" => ":attribute אינה כתובת אינטרנט תקנית.", + "unique" => "הערך :attribute כבר קיים.", + "url" => "הערך :attribute חייב להכיל כתובת אינטרנט תקינה.", /* |-------------------------------------------------------------------------- From 0440b86bd9764e7e3926b9a4e5de4fdca5e703f1 Mon Sep 17 00:00:00 2001 From: Roumen Damianoff Date: Wed, 4 Jul 2012 13:16:44 +0300 Subject: [PATCH 077/260] Added Bulgarian language files Signed-off-by: Roumen Damianoff --- application/language/bg/pagination.php | 19 +++++ application/language/bg/validation.php | 99 ++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 application/language/bg/pagination.php create mode 100644 application/language/bg/validation.php diff --git a/application/language/bg/pagination.php b/application/language/bg/pagination.php new file mode 100644 index 00000000..2f4b150c --- /dev/null +++ b/application/language/bg/pagination.php @@ -0,0 +1,19 @@ + '« Назад', + 'next' => 'Напред »', + +); \ No newline at end of file diff --git a/application/language/bg/validation.php b/application/language/bg/validation.php new file mode 100644 index 00000000..c76a6e92 --- /dev/null +++ b/application/language/bg/validation.php @@ -0,0 +1,99 @@ + "Трябва да приемете :attribute.", + "active_url" => "Полето :attribute не е валиден URL адрес.", + "after" => "Полето :attribute трябва да бъде дата след :date.", + "alpha" => "Полето :attribute трябва да съдържа само букви.", + "alpha_dash" => "Полето :attribute трябва да съдържа само букви, цифри, долна черта и тире.", + "alpha_num" => "Полето :attribute трябва да съдържа само букви и цифри.", + "before" => "Полето :attribute трябва да бъде дата преди :date.", + "between" => array( + "numeric" => "Полето :attribute трябва да бъде между :min и :max.", + "file" => "Полето :attribute трябва да бъде между :min и :max килобайта.", + "string" => "Полето :attribute трябва да бъде между :min и :max знака.", + ), + "confirmed" => "Полето :attribute не е потвърдено.", + "different" => "Полетата :attribute и :other трябва да са различни.", + "email" => "Полето :attribute е с невалиден формат.", + "exists" => "Избраната стойност на :attribute вече съществува.", + "image" => "Полето :attribute трябва да бъде изображение.", + "in" => "Стойността на :attribute е невалидна.", + "integer" => "Полето :attribute трябва да бъде цяло число.", + "ip" => "Полето :attribute трябва да бъде IP адрес.", + "match" => "Полето :attribute е с невалиден формат.", + "max" => array( + "numeric" => "Полето :attribute трябва да бъде по-малко от :max.", + "file" => "Полето :attribute трябва да бъде по-малко от :max килобайта.", + "string" => "Полето :attribute трябва да бъде по-малко от :max знака.", + ), + "mimes" => "Полето :attribute трябва да бъде файл от тип: :values.", + "min" => array( + "numeric" => "Полето :attribute трябва да бъде минимум :min.", + "file" => "Полето :attribute трябва да бъде минимум :min килобайта.", + "string" => "Полето :attribute трябва да бъде минимум :min знака.", + ), + "not_in" => "Стойността на :attribute е невалидна.", + "numeric" => "Полето :attribute трябва да бъде число.", + "required" => "Полето :attribute е задължително.", + "same" => "Стойностите на :attribute и :other трябва да съвпадат.", + "size" => array( + "numeric" => "Полето :attribute трябва да бъде :size.", + "file" => "Полето :attribute трябва да бъде :size килобайта.", + "string" => "Полето :attribute трябва да бъде :size знака.", + ), + "unique" => "Стойността на :attribute вече съществува.", + "url" => "Полето :attribute е с невалиден формат.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file From f2ccc688fe0623211391d627309458af5d06ab76 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Wed, 4 Jul 2012 21:44:11 +0300 Subject: [PATCH 078/260] Ignore NULL values when determining whether a model object is dirty. --- laravel/database/eloquent/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index 2ad1c72b..9d35b47d 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -536,7 +536,7 @@ public function get_dirty() foreach ($this->attributes as $key => $value) { - if ( ! isset($this->original[$key]) or $value !== $this->original[$key]) + if ( ! array_key_exists($key, $this->original) or $value !== $this->original[$key]) { $dirty[$key] = $value; } From 1be274caa68d8773680834295772e7c409ac80de Mon Sep 17 00:00:00 2001 From: Jesse O'Brien Date: Wed, 4 Jul 2012 15:46:12 -0400 Subject: [PATCH 079/260] Change update function so it uses timestamp like save Calling update() on an eloquent model has no way of overriding the timestamp that should be set if $timestamps is set on the model. This changes that so it uses the timestamp() function which is an easy way to over ride the type of timestamps used. --- laravel/database/eloquent/model.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index 2ad1c72b..0f7b6a91 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -218,9 +218,11 @@ public static function update($id, $attributes) { $model = new static(array(), true); - if (static::$timestamps) $attributes['updated_at'] = new \DateTime; + $model->fill($attributes); - return $model->query()->where($model->key(), '=', $id)->update($attributes); + if (static::$timestamps) $model->timestamp(); + + return $model->query()->where($model->key(), '=', $id)->update($model->attributes); } /** From f05148503e95a77feff5e7ff7f3a1b5e82dfc97f Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 4 Jul 2012 22:56:58 +0300 Subject: [PATCH 080/260] Input::has_file was not working properly. This one should work perfect :) --- laravel/input.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/input.php b/laravel/input.php index 6a28b17f..0de7b759 100644 --- a/laravel/input.php +++ b/laravel/input.php @@ -205,7 +205,7 @@ public static function file($key = null, $default = null) */ public static function has_file($key) { - return ! is_null(static::file("{$key}.tmp_name")); + return strlen(static::file("{$key}.tmp_name", "")) > 0; } /** From d7bbdd97358bc5a2a3b837f366c5fc01e749836b Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Thu, 5 Jul 2012 01:52:30 +0300 Subject: [PATCH 081/260] Fix anchor name for "Retrieving a language line" section on localization page. --- laravel/documentation/localization.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/localization.md b/laravel/documentation/localization.md index e1941633..c928a49c 100644 --- a/laravel/documentation/localization.md +++ b/laravel/documentation/localization.md @@ -33,7 +33,7 @@ #### Creating a language file: Nice! Now you know how to get started setting up your language files and directories. Let's keep localizing! - + ## Retrieving A Language Line #### Retrieving a language line: From db9f220f57f963a33d6f7e4405c2ef971787727a Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sat, 7 Jul 2012 02:17:12 +0300 Subject: [PATCH 082/260] Force UTF-8 charset on JSON responses. --- laravel/response.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/laravel/response.php b/laravel/response.php index b6fa4d84..d86ee93e 100644 --- a/laravel/response.php +++ b/laravel/response.php @@ -93,7 +93,7 @@ public static function view($view, $data = array()) */ public static function json($data, $status = 200, $headers = array()) { - $headers['Content-Type'] = 'application/json'; + $headers['Content-Type'] = 'application/json; charset=utf-8'; return new static(json_encode($data), $status, $headers); } @@ -113,7 +113,7 @@ public static function json($data, $status = 200, $headers = array()) */ public static function eloquent($data, $status = 200, $headers = array()) { - $headers['Content-Type'] = 'application/json'; + $headers['Content-Type'] = 'application/json; charset=utf-8'; return new static(eloquent_to_json($data), $status, $headers); } From 6b5cccc15f015a531099ae27455c02b0f869a043 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sat, 7 Jul 2012 02:13:44 +0200 Subject: [PATCH 083/260] Move get_file_size() helper function to helpers.php. --- laravel/helpers.php | 12 ++++++++++++ laravel/profiling/profiler.php | 16 ++-------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/laravel/helpers.php b/laravel/helpers.php index 07f9940a..b45fd9d2 100644 --- a/laravel/helpers.php +++ b/laravel/helpers.php @@ -580,4 +580,16 @@ function get_cli_option($option, $default = null) } return value($default); +} + +/** + * Calculate the human-readable file size (with proper units). + * + * @param int $size + * @return string + */ +function get_file_size($size) +{ + $units = array('Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB'); + return @round($size / pow(1024, ($i = floor(log($size, 1024)))), 2).' '.$units[$i]; } \ No newline at end of file diff --git a/laravel/profiling/profiler.php b/laravel/profiling/profiler.php index b2a8635f..c8f069ae 100644 --- a/laravel/profiling/profiler.php +++ b/laravel/profiling/profiler.php @@ -28,24 +28,12 @@ public static function render($response) // type applications, so we will not send anything in those scenarios. if ( ! Request::ajax()) { - static::$data['memory'] = static::get_file_size(memory_get_usage(true)); - static::$data['memory_peak'] = static::get_file_size(memory_get_peak_usage(true)); + static::$data['memory'] = get_file_size(memory_get_usage(true)); + static::$data['memory_peak'] = get_file_size(memory_get_peak_usage(true)); static::$data['time'] = number_format((microtime(true) - LARAVEL_START) * 1000, 2); return render('path: '.__DIR__.'/template'.BLADE_EXT, static::$data); } } - - /** - * Calculate the human-readable file size (with proper units). - * - * @param int $size - * @return string - */ - private static function get_file_size($size) - { - $units = array('Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB'); - return @round($size / pow(1024, ($i = floor(log($size, 1024)))), 2).' '.$units[$i]; - } /** * Add a log entry to the log entries array. From 2d2a6bffa50c8057a42ea66ee183b4bbb06946cd Mon Sep 17 00:00:00 2001 From: Hirohisa Kawase Date: Sun, 8 Jul 2012 08:42:13 +0900 Subject: [PATCH 084/260] Add Japanese language resource files. --- application/language/ja/pagination.php | 31 ++++++ application/language/ja/validation.php | 142 +++++++++++++++++++++++++ 2 files changed, 173 insertions(+) create mode 100644 application/language/ja/pagination.php create mode 100644 application/language/ja/validation.php diff --git a/application/language/ja/pagination.php b/application/language/ja/pagination.php new file mode 100644 index 00000000..e5906f60 --- /dev/null +++ b/application/language/ja/pagination.php @@ -0,0 +1,31 @@ + '« 前', + 'next' => '次 »', + +); \ No newline at end of file diff --git a/application/language/ja/validation.php b/application/language/ja/validation.php new file mode 100644 index 00000000..84da816c --- /dev/null +++ b/application/language/ja/validation.php @@ -0,0 +1,142 @@ + ":attributeを承認してください。", + "active_url" => ":attributeが有効なURLではありません。", + "after" => ":attributeには、:date以降の日付を指定してください。", + "alpha" => ":attributeはアルファベッドのみがご利用できます。", + "alpha_dash" => ":attributeは英数字とダッシュ(-)及び下線(_)がご利用できます。", + "alpha_num" => ":attributeは英数字がご利用できます。", + "before" => ":attributeには、:date以前の日付をご利用ください。", + "between" => array( + "numeric" => ":attributeは、:minから、:maxまでの数字をご指定ください。", + "file" => ":attributeには、:min kBから:max kBまでのサイズのファイルをご指定ください。", + "string" => ":attributeは、:min文字から:max文字の間でご指定ください。", + ), + "confirmed" => ":attributeと、確認フィールドとが、一致していません。", + "different" => ":attributeと:otherには、異なった内容を指定してください。", + "email" => ":attributeには正しいメールアドレスの形式をご指定ください。", + "exists" => "選択された:attributeは正しくありません。", + "image" => ":attributeには画像ファイルを指定してください。", + "in" => "選択された:attributeは正しくありません。", + "integer" => ":attributeは整数でご指定ください。", + "ip" => ":attributeには、有効なIPアドレスをご指定ください。", + "match" => ":attributeの入力フォーマットが間違っています。", + "max" => array( + "numeric" => ":attributeには、:max以下の数字をご指定ください。", + "file" => ":attributeには、:max kB以下のファイルをご指定ください。", + "string" => ":attributeは、:max文字以下でご指定ください。", + ), + "mimes" => ":attributeには:valuesタイプのファイルを指定してください。", + "min" => array( + "numeric" => ":attributeには、:min以上の数字をご指定ください。", + "file" => ":attributeには、:min kB以上のファイルをご指定ください。", + "string" => ":attributeは、:min文字以上でご指定ください。", + ), + "not_in" => "選択された:attributeは正しくありません。", + "numeric" => ":attributeには、数字を指定してください。", + "required" => ":attributeは必ず指定してください。", + "same" => ":attributeと:otherには同じ値を指定してください。", + "size" => array( + "numeric" => ":attributeには:sizeを指定してください。", + "file" => ":attributeのファイルは、:sizeキロバイトでなくてはなりません。", + "string" => ":attributeは:size文字で指定してください。", + ), + "unique" => ":attributeに指定された値は既に存在しています。", + "url" => ":attributeのフォーマットが正しくありません。", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + /* + |-------------------------------------------------------------------------- + | カスタムバリデーション言語設定 + |-------------------------------------------------------------------------- + | + | ここでは、"属性_ルール"の記法を使用し、属性に対するカスタムバリデーションメッセージを + | 指定してください。これにより、カスタムバリデーションをきれいに美しく保てます。 + | + | 例えば、"email"属性のuniqueバリデーションで、カスタムバリデーションメッセージを + | 使いたいならば、"email_unique"をカスタムメッセージとともに、配列に追加してください。 + | Validatorクラスが残りの面倒を見ます! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + /* + |-------------------------------------------------------------------------- + | バリデーション属性 + |-------------------------------------------------------------------------- + | + | 以下の言語設定は属性のプレースホルダーを例えば"email"属性を"E-Mailアドレス"という風に + | 読み手に親切になるよう置き換えるために使用されます。 + | あなたのユーザーは、あなたに感謝するでしょう。 + | + | Validatorクラスは、自動的にメッセージに含まれる:attributeプレースホルダーを + | この配列の値に置き換えようと試みます。絶妙ですね。あなたも気に入ってくれるでしょう。 + */ + + 'attributes' => array(), + +); \ No newline at end of file From cbff59b59b922fce13abb2276b35f9eaf271b5f7 Mon Sep 17 00:00:00 2001 From: Hirohisa Kawase Date: Sun, 8 Jul 2012 08:46:44 +0900 Subject: [PATCH 085/260] Add Japanese language resource files. --- application/language/ja/pagination.php | 2 +- application/language/ja/validation.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/application/language/ja/pagination.php b/application/language/ja/pagination.php index e5906f60..47e9d3f2 100644 --- a/application/language/ja/pagination.php +++ b/application/language/ja/pagination.php @@ -28,4 +28,4 @@ 'previous' => '« 前', 'next' => '次 »', -); \ No newline at end of file +); diff --git a/application/language/ja/validation.php b/application/language/ja/validation.php index 84da816c..45e3208b 100644 --- a/application/language/ja/validation.php +++ b/application/language/ja/validation.php @@ -139,4 +139,4 @@ 'attributes' => array(), -); \ No newline at end of file +); From ebcbbbb8430643988a6395ffeeab0f650c206144 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Mon, 9 Jul 2012 09:54:03 -0500 Subject: [PATCH 086/260] WIP. --- application/language/bg/validation.php | 196 ++++++++++++------------- 1 file changed, 98 insertions(+), 98 deletions(-) diff --git a/application/language/bg/validation.php b/application/language/bg/validation.php index c76a6e92..4e46f6ff 100644 --- a/application/language/bg/validation.php +++ b/application/language/bg/validation.php @@ -1,99 +1,99 @@ - "Трябва да приемете :attribute.", - "active_url" => "Полето :attribute не е валиден URL адрес.", - "after" => "Полето :attribute трябва да бъде дата след :date.", - "alpha" => "Полето :attribute трябва да съдържа само букви.", - "alpha_dash" => "Полето :attribute трябва да съдържа само букви, цифри, долна черта и тире.", - "alpha_num" => "Полето :attribute трябва да съдържа само букви и цифри.", - "before" => "Полето :attribute трябва да бъде дата преди :date.", - "between" => array( - "numeric" => "Полето :attribute трябва да бъде между :min и :max.", - "file" => "Полето :attribute трябва да бъде между :min и :max килобайта.", - "string" => "Полето :attribute трябва да бъде между :min и :max знака.", - ), - "confirmed" => "Полето :attribute не е потвърдено.", - "different" => "Полетата :attribute и :other трябва да са различни.", - "email" => "Полето :attribute е с невалиден формат.", - "exists" => "Избраната стойност на :attribute вече съществува.", - "image" => "Полето :attribute трябва да бъде изображение.", - "in" => "Стойността на :attribute е невалидна.", - "integer" => "Полето :attribute трябва да бъде цяло число.", - "ip" => "Полето :attribute трябва да бъде IP адрес.", - "match" => "Полето :attribute е с невалиден формат.", - "max" => array( - "numeric" => "Полето :attribute трябва да бъде по-малко от :max.", - "file" => "Полето :attribute трябва да бъде по-малко от :max килобайта.", - "string" => "Полето :attribute трябва да бъде по-малко от :max знака.", - ), - "mimes" => "Полето :attribute трябва да бъде файл от тип: :values.", - "min" => array( - "numeric" => "Полето :attribute трябва да бъде минимум :min.", - "file" => "Полето :attribute трябва да бъде минимум :min килобайта.", - "string" => "Полето :attribute трябва да бъде минимум :min знака.", - ), - "not_in" => "Стойността на :attribute е невалидна.", - "numeric" => "Полето :attribute трябва да бъде число.", - "required" => "Полето :attribute е задължително.", - "same" => "Стойностите на :attribute и :other трябва да съвпадат.", - "size" => array( - "numeric" => "Полето :attribute трябва да бъде :size.", - "file" => "Полето :attribute трябва да бъде :size килобайта.", - "string" => "Полето :attribute трябва да бъде :size знака.", - ), - "unique" => "Стойността на :attribute вече съществува.", - "url" => "Полето :attribute е с невалиден формат.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - + "Трябва да приемете :attribute.", + "active_url" => "Полето :attribute не е валиден URL адрес.", + "after" => "Полето :attribute трябва да бъде дата след :date.", + "alpha" => "Полето :attribute трябва да съдържа само букви.", + "alpha_dash" => "Полето :attribute трябва да съдържа само букви, цифри, долна черта и тире.", + "alpha_num" => "Полето :attribute трябва да съдържа само букви и цифри.", + "before" => "Полето :attribute трябва да бъде дата преди :date.", + "between" => array( + "numeric" => "Полето :attribute трябва да бъде между :min и :max.", + "file" => "Полето :attribute трябва да бъде между :min и :max килобайта.", + "string" => "Полето :attribute трябва да бъде между :min и :max знака.", + ), + "confirmed" => "Полето :attribute не е потвърдено.", + "different" => "Полетата :attribute и :other трябва да са различни.", + "email" => "Полето :attribute е с невалиден формат.", + "exists" => "Избраната стойност на :attribute вече съществува.", + "image" => "Полето :attribute трябва да бъде изображение.", + "in" => "Стойността на :attribute е невалидна.", + "integer" => "Полето :attribute трябва да бъде цяло число.", + "ip" => "Полето :attribute трябва да бъде IP адрес.", + "match" => "Полето :attribute е с невалиден формат.", + "max" => array( + "numeric" => "Полето :attribute трябва да бъде по-малко от :max.", + "file" => "Полето :attribute трябва да бъде по-малко от :max килобайта.", + "string" => "Полето :attribute трябва да бъде по-малко от :max знака.", + ), + "mimes" => "Полето :attribute трябва да бъде файл от тип: :values.", + "min" => array( + "numeric" => "Полето :attribute трябва да бъде минимум :min.", + "file" => "Полето :attribute трябва да бъде минимум :min килобайта.", + "string" => "Полето :attribute трябва да бъде минимум :min знака.", + ), + "not_in" => "Стойността на :attribute е невалидна.", + "numeric" => "Полето :attribute трябва да бъде число.", + "required" => "Полето :attribute е задължително.", + "same" => "Стойностите на :attribute и :other трябва да съвпадат.", + "size" => array( + "numeric" => "Полето :attribute трябва да бъде :size.", + "file" => "Полето :attribute трябва да бъде :size килобайта.", + "string" => "Полето :attribute трябва да бъде :size знака.", + ), + "unique" => "Стойността на :attribute вече съществува.", + "url" => "Полето :attribute е с невалиден формат.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + ); \ No newline at end of file From 82ababb4cb8e123c6b2e5e767119390364c867cd Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Mon, 9 Jul 2012 09:54:56 -0500 Subject: [PATCH 087/260] Add note about making view directory writable. --- laravel/documentation/install.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/laravel/documentation/install.md b/laravel/documentation/install.md index b3312366..941699ee 100644 --- a/laravel/documentation/install.md +++ b/laravel/documentation/install.md @@ -23,7 +23,8 @@ ## Installation 1. [Download Laravel](http://laravel.com/download) 2. Extract the Laravel archive and upload the contents to your web server. 3. Set the value of the **key** option in the **config/application.php** file to a random, 32 character string. -4. Navigate to your application in a web browser. +4. Verify that the `storage/views` directory is writable. +5. Navigate to your application in a web browser. If all is well, you should see a pretty Laravel splash page. Get ready, there is lots more to learn! From 9dd964c3169f58417c4ecd31e993854c5758dccb Mon Sep 17 00:00:00 2001 From: Jeffrey Way Date: Mon, 9 Jul 2012 21:34:17 -0400 Subject: [PATCH 088/260] Extend Auth::laravel to accept multiple params to verify Signed-off-by: Jeffrey Way --- laravel/auth/drivers/eloquent.php | 30 ++++++++++++++++++------------ laravel/auth/drivers/fluent.php | 22 ++++++++++++++-------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/laravel/auth/drivers/eloquent.php b/laravel/auth/drivers/eloquent.php index 8c1c6a80..26e143b9 100644 --- a/laravel/auth/drivers/eloquent.php +++ b/laravel/auth/drivers/eloquent.php @@ -26,21 +26,27 @@ public function retrieve($id) */ public function attempt($arguments = array()) { - $username = Config::get('auth.username'); + $user = $this->model()->where(function($query) use($arguments) { + $username = Config::get('auth.username'); + + $query->where($username, '=', $arguments['username']); - $user = $this->model()->where($username, '=', $arguments['username'])->first(); + foreach( array_except($arguments, array('username', 'password')) as $column => $val ) + { + $query->where($column, '=', $val); + } + })->first(); - // This driver uses a basic username and password authentication scheme - // so if the credentials match what is in the database we will just - // log the user into the application and remember them if asked. - $password = $arguments['password']; + // If the credentials match what is in the database we will just + // log the user into the application and remember them if asked. + $password = $arguments['password']; - $password_field = Config::get('auth.password', 'password'); + $password_field = Config::get('auth.password', 'password'); - if ( ! is_null($user) and Hash::check($password, $user->get_attribute($password_field))) - { - return $this->login($user->id, array_get($arguments, 'remember')); - } + if ( ! is_null($user) and Hash::check($password, $user->get_attribute($password_field))) + { + return $this->login($user->id, array_get($arguments, 'remember')); + } return false; } @@ -57,4 +63,4 @@ protected function model() return new $model; } -} \ No newline at end of file +} diff --git a/laravel/auth/drivers/fluent.php b/laravel/auth/drivers/fluent.php index 4c23468b..e5aaa506 100644 --- a/laravel/auth/drivers/fluent.php +++ b/laravel/auth/drivers/fluent.php @@ -30,10 +30,9 @@ public function retrieve($id) */ public function attempt($arguments = array()) { - $user = $this->get_user($arguments['username']); + $user = $this->get_user($arguments); - // This driver uses a basic username and password authentication scheme - // so if the credentials match what is in the database we will just + // If the credentials match what is in the database we will just // log the user into the application and remember them if asked. $password = $arguments['password']; @@ -48,18 +47,25 @@ public function attempt($arguments = array()) } /** - * Get the user from the database table by username. + * Get the user from the database table. * - * @param mixed $value + * @param mixed $array * @return mixed */ - protected function get_user($value) + protected function get_user($arguments) { $table = Config::get('auth.table'); - $username = Config::get('auth.username'); + return DB::table($table)->where(function($query) use($arguments) { + $username = Config::get('auth.username'); + + $query->where($username, '=', $arguments['username']); - return DB::table($table)->where($username, '=', $value)->first(); + foreach( array_except($arguments, array('username', 'password')) as $column => $val ) + { + $query->where($column, '=', $val); + } + })->first(); } } From ff525b995b21998aeba4d87ff97a54b0cb6c6df3 Mon Sep 17 00:00:00 2001 From: Jeffrey Way Date: Mon, 9 Jul 2012 22:18:32 -0400 Subject: [PATCH 089/260] Add "remember" to ignore list Signed-off-by: Jeffrey Way --- laravel/auth/drivers/eloquent.php | 23 ++++++++++++----------- laravel/auth/drivers/fluent.php | 5 +++-- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/laravel/auth/drivers/eloquent.php b/laravel/auth/drivers/eloquent.php index 26e143b9..4b365d1e 100644 --- a/laravel/auth/drivers/eloquent.php +++ b/laravel/auth/drivers/eloquent.php @@ -26,27 +26,28 @@ public function retrieve($id) */ public function attempt($arguments = array()) { - $user = $this->model()->where(function($query) use($arguments) { + $user = $this->model()->where(function($query) use($arguments) + { $username = Config::get('auth.username'); $query->where($username, '=', $arguments['username']); - foreach( array_except($arguments, array('username', 'password')) as $column => $val ) + foreach(array_except($arguments, array('username', 'password', 'remember')) as $column => $val) { $query->where($column, '=', $val); } - })->first(); + })->first(); - // If the credentials match what is in the database we will just - // log the user into the application and remember them if asked. - $password = $arguments['password']; + // If the credentials match what is in the database we will just + // log the user into the application and remember them if asked. + $password = $arguments['password']; - $password_field = Config::get('auth.password', 'password'); + $password_field = Config::get('auth.password', 'password'); - if ( ! is_null($user) and Hash::check($password, $user->get_attribute($password_field))) - { - return $this->login($user->id, array_get($arguments, 'remember')); - } + if ( ! is_null($user) and Hash::check($password, $user->get_attribute($password_field))) + { + return $this->login($user->id, array_get($arguments, 'remember')); + } return false; } diff --git a/laravel/auth/drivers/fluent.php b/laravel/auth/drivers/fluent.php index e5aaa506..ed660881 100644 --- a/laravel/auth/drivers/fluent.php +++ b/laravel/auth/drivers/fluent.php @@ -56,12 +56,13 @@ protected function get_user($arguments) { $table = Config::get('auth.table'); - return DB::table($table)->where(function($query) use($arguments) { + return DB::table($table)->where(function($query) use($arguments) + { $username = Config::get('auth.username'); $query->where($username, '=', $arguments['username']); - foreach( array_except($arguments, array('username', 'password')) as $column => $val ) + foreach(array_except($arguments, array('username', 'password', 'remember')) as $column => $val) { $query->where($column, '=', $val); } From 204a6a79803b17b14cf663a11471a625bb0e9eaa Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Tue, 10 Jul 2012 15:29:26 +0300 Subject: [PATCH 090/260] Add a Request::time() function. --- laravel/request.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/laravel/request.php b/laravel/request.php index 84763449..a37360a2 100644 --- a/laravel/request.php +++ b/laravel/request.php @@ -177,6 +177,25 @@ public static function referrer() { return static::foundation()->headers->get('referer'); } + + /** + * Get the timestamp of the time when the request was started. + * + * The value is actually calculated when this function gets first called. + * + * @return int + */ + public static function time() + { + static $time; + + if (!isset($time)) + { + $time = time(); + } + + return $time; + } /** * Determine if the current request is via the command line. From 1879e6575aaad4851a273349b8eede194e2d2ee2 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Tue, 10 Jul 2012 08:02:08 -0500 Subject: [PATCH 091/260] tweak eloquent model change method to not check types. --- laravel/database/eloquent/model.php | 2 +- laravel/documentation/changes.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index 8703f4c4..ccdd42d5 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -502,7 +502,7 @@ final public function sync() */ public function changed($attribute) { - return array_get($this->attributes, $attribute) !== array_get($this->original, $attribute); + return array_get($this->attributes, $attribute) != array_get($this->original, $attribute); } /** diff --git a/laravel/documentation/changes.md b/laravel/documentation/changes.md index e5c68b89..7fb72d41 100644 --- a/laravel/documentation/changes.md +++ b/laravel/documentation/changes.md @@ -37,6 +37,7 @@ ## Contents ## Laravel 3.2.4 - Speed up many to many eager loading mapping. +- Tweak the Eloquent::changed() method. ## Upgrading From 3.2.3 From c659a926034da8e724e2766b90aef48c8fbb3018 Mon Sep 17 00:00:00 2001 From: Jeffrey Way Date: Tue, 10 Jul 2012 11:03:55 -0400 Subject: [PATCH 092/260] Fix typo in comments --- laravel/auth/drivers/eloquent.php | 2 +- laravel/auth/drivers/fluent.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/laravel/auth/drivers/eloquent.php b/laravel/auth/drivers/eloquent.php index 4b365d1e..aaea515b 100644 --- a/laravel/auth/drivers/eloquent.php +++ b/laravel/auth/drivers/eloquent.php @@ -21,7 +21,7 @@ public function retrieve($id) /** * Attempt to log a user into the application. * - * @param array $arguments + * @param array $arguments * @return void */ public function attempt($arguments = array()) diff --git a/laravel/auth/drivers/fluent.php b/laravel/auth/drivers/fluent.php index ed660881..f8654e9a 100644 --- a/laravel/auth/drivers/fluent.php +++ b/laravel/auth/drivers/fluent.php @@ -25,7 +25,7 @@ public function retrieve($id) /** * Attempt to log a user into the application. * - * @param array $arguments + * @param array $arguments * @return void */ public function attempt($arguments = array()) @@ -49,7 +49,7 @@ public function attempt($arguments = array()) /** * Get the user from the database table. * - * @param mixed $array + * @param array $arguments * @return mixed */ protected function get_user($arguments) From 27fb9d06122d46b38d4c4948ab3267779c13b2fe Mon Sep 17 00:00:00 2001 From: Tobsn Date: Wed, 11 Jul 2012 12:27:29 +0200 Subject: [PATCH 093/260] fixed "here" link --- laravel/documentation/database/config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/database/config.md b/laravel/documentation/database/config.md index 3768f013..2a1b0453 100644 --- a/laravel/documentation/database/config.md +++ b/laravel/documentation/database/config.md @@ -67,4 +67,4 @@ ## Setting The Default Connection Name PDO::ATTR_EMULATE_PREPARES => false, ), -More about the PDO connection attributes can be found [here](http://php.net/manual/en/pdo.setattribute.php). \ No newline at end of file +More about the PDO connection attributes can be found [in the PHP manual](http://php.net/manual/en/pdo.setattribute.php). \ No newline at end of file From 8a4aade8f7156bdeb00652520b80e536bfef8b8d Mon Sep 17 00:00:00 2001 From: Anahkiasen Date: Wed, 11 Jul 2012 16:27:11 +0200 Subject: [PATCH 094/260] Quick notes on Pivot tables --- laravel/documentation/database/eloquent.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/laravel/documentation/database/eloquent.md b/laravel/documentation/database/eloquent.md index bc70483b..71e3a402 100644 --- a/laravel/documentation/database/eloquent.md +++ b/laravel/documentation/database/eloquent.md @@ -244,6 +244,7 @@ ### Many-To-Many **Roles_Users:** + id - INTEGER user_id - INTEGER role_id - INTEGER @@ -277,6 +278,17 @@ ### Many-To-Many } +By default only certain fields from the pivot table will be returned (the two **id** fields, and the timestamps). If your pivot table contains additional columns, you can fetch them too by using the **with()** method : + + class User extends Eloquent { + + public function roles() + { + return $this->has_many_and_belongs_to('Role', 'user_roles')->with('column'); + } + + } + ## Inserting Related Models From c8718a32eccee418baec7be18d51f53cd34e91d7 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Wed, 11 Jul 2012 10:18:48 -0500 Subject: [PATCH 095/260] added option for URI languages. --- application/config/application.php | 15 ++++++++++- laravel/laravel.php | 42 ++++++++++++++++++++++++++++-- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/application/config/application.php b/application/config/application.php index 9f597954..abfcf072 100755 --- a/application/config/application.php +++ b/application/config/application.php @@ -84,7 +84,7 @@ /* |-------------------------------------------------------------------------- - | Application Language + | Default Application Language |-------------------------------------------------------------------------- | | The default language of your application. This language will be used by @@ -94,6 +94,19 @@ 'language' => 'en', + /* + |-------------------------------------------------------------------------- + | Supported Languages + |-------------------------------------------------------------------------- + | + | These languages may also be supported by your application. If a request + | enters your application with a URI beginning with one of these values + | the default language will automatically be set to that language. + | + */ + + 'languages' => array('fr', 'sp'), + /* |-------------------------------------------------------------------------- | SSL Link Generation diff --git a/laravel/laravel.php b/laravel/laravel.php index a1ca2061..2544c617 100644 --- a/laravel/laravel.php +++ b/laravel/laravel.php @@ -107,6 +107,46 @@ return Event::first('404'); }); +/* +|-------------------------------------------------------------------------- +| Gather The URI And Locales +|-------------------------------------------------------------------------- +| +| When routing, we'll need to grab the URI and the supported locales for +| the route so we can properly set the language and route the request +| to the proper end-point in the application. +| +*/ + +$uri = URI::current(); + +$locales = Config::get('application.languages', array()); + +$locales[] = Config::get('application.language'); + +/* +|-------------------------------------------------------------------------- +| Set The Locale Based On Route +|-------------------------------------------------------------------------- +| +| If the URI starts with one of the supported languages, we will set +| the default language to match that URI segment and shorten the +| URI we'll pass to the router to not include the lang segment. +| +*/ + +foreach ($locales as $locale) +{ + if (starts_with($uri, $locale)) + { + Config::set('application.language', $locale); + + $uri = trim(substr($uri, strlen($locale)), '/'); break; + } +} + +if ($uri === '') $uri = '/'; + /* |-------------------------------------------------------------------------- | Route The Incoming Request @@ -118,8 +158,6 @@ | */ -$uri = URI::current(); - Request::$route = Routing\Router::route(Request::method(), $uri); $response = Request::$route->call(); From 5f919d76a5f9bb86c2a5c8d74f62ee91eebf8e8c Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Wed, 11 Jul 2012 10:20:12 -0500 Subject: [PATCH 096/260] updated change log. --- laravel/documentation/changes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/laravel/documentation/changes.md b/laravel/documentation/changes.md index 7fb72d41..d969d5a2 100644 --- a/laravel/documentation/changes.md +++ b/laravel/documentation/changes.md @@ -38,6 +38,7 @@ ## Laravel 3.2.4 - Speed up many to many eager loading mapping. - Tweak the Eloquent::changed() method. +- Added support for locales in the URI. ## Upgrading From 3.2.3 From 10e5918e237f354c9f8a650a5be51ec919ff6bb4 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Wed, 11 Jul 2012 10:24:08 -0500 Subject: [PATCH 097/260] clear out langauges option. --- application/config/application.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/config/application.php b/application/config/application.php index abfcf072..07bb2157 100755 --- a/application/config/application.php +++ b/application/config/application.php @@ -105,7 +105,7 @@ | */ - 'languages' => array('fr', 'sp'), + 'languages' => array(), /* |-------------------------------------------------------------------------- From e19e4ebd2490efcc5c5463c1ac11b8a5beca625a Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Wed, 11 Jul 2012 10:30:44 -0500 Subject: [PATCH 098/260] tweak url for languages. --- laravel/url.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/laravel/url.php b/laravel/url.php index 44b89428..443ddb2a 100644 --- a/laravel/url.php +++ b/laravel/url.php @@ -107,6 +107,14 @@ public static function to($url = '', $https = null) $root = static::base().'/'.Config::get('application.index'); + // If multiple languages are being supported via URIs, we will append current + // language to the URI so all redirects and URLs generated include the + // current language so it is not lost on further requests. + if (count(Config::get('application.languages')) > 0) + { + $root .= '/'.Config::get('application.language'); + } + // Since SSL is not often used while developing the application, we allow the // developer to disable SSL on all framework generated links to make it more // convenient to work with the site while developing locally. @@ -242,6 +250,11 @@ public static function to_asset($url, $https = null) $url = str_replace($index.'/', '', $url); } + if (count(Config::get('application.languages')) > 0) + { + $url = str_replace(Config::get('application.language').'/', '', $url); + } + return $url; } From 49928b397ab6447be4103e231fc5e55235f9fbd0 Mon Sep 17 00:00:00 2001 From: Shawn McCool Date: Wed, 11 Jul 2012 22:22:57 +0200 Subject: [PATCH 099/260] added server configuration to the documentation --- laravel/documentation/install.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/laravel/documentation/install.md b/laravel/documentation/install.md index 12f12951..73137df8 100644 --- a/laravel/documentation/install.md +++ b/laravel/documentation/install.md @@ -4,6 +4,7 @@ ## Contents - [Requirements](#requirements) - [Installation](#installation) +- [Server Configuration](#server-configuration) - [Basic Configuration](#basic-configuration) - [Environments](#environments) - [Cleaner URLs](#cleaner-urls) @@ -37,8 +38,27 @@ ### Problems? If you are having problems installing, try the following: -- Make sure the **public** directory is the document root of your web server. +- Make sure the **public** directory is the document root of your web server. (see: Server Configuration below) - If you are using mod_rewrite, set the **index** option in **application/config/application.php** to an empty string. +- Verify that your storage folder and the folders within in are writable by your web server. + + +## Server Configuration + +Like most web-development frameworks, Laravel is designed to protect your application code, bundles, and local storage by placing only files that are necessarily public in the web server's DocumentRoot. This prevents some types of server misconfiguration from making your code (including database passwords and other configuration data) accessible through the web server. It's best to be safe. + +In this example let's imagine that we installed Laravel to the directory **/Users/JonSnow/Sites/MySite**. + +A very basic example of an Apache VirtualHost configuration for MySite might look like this. + + + DocumentRoot /Users/JonSnow/Sites/MySite/public + ServerName mysite.dev + + +Notice that while we installed to **/Users/JonSnow/Sites/MySite** our DocumentRoot points to /Users/JonSnow/Sites/MySite/public**. + +While pointing the DocumentRoot to the public folder is a commonly used best-practice, it's possible that you may need to use Laravel on a host that does not allow you to update your DocumentRoot. A collection of algorithms to circumvent this need can be found [http://forums.laravel.com/viewtopic.php?id=1258](on the Laravel forums.) ## Basic Configuration From a66eb44809c76c3cae3934a81c6c51ff73035e8f Mon Sep 17 00:00:00 2001 From: Shawn McCool Date: Wed, 11 Jul 2012 22:28:44 +0200 Subject: [PATCH 100/260] fixed typo --- laravel/documentation/install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/install.md b/laravel/documentation/install.md index 7a1f68dc..a3e9bd8e 100644 --- a/laravel/documentation/install.md +++ b/laravel/documentation/install.md @@ -45,7 +45,7 @@ ### Problems? - Make sure the **public** directory is the document root of your web server. (see: Server Configuration below) - If you are using mod_rewrite, set the **index** option in **application/config/application.php** to an empty string. -- Verify that your storage folder and the folders within in are writable by your web server. +- Verify that your storage folder and the folders within are writable by your web server. ## Server Configuration From ee6adc26d9e651297833fa9a22a678793105de33 Mon Sep 17 00:00:00 2001 From: Shawn McCool Date: Wed, 11 Jul 2012 22:30:38 +0200 Subject: [PATCH 101/260] fix merge --- laravel/documentation/install.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/laravel/documentation/install.md b/laravel/documentation/install.md index a3e9bd8e..ae3984dd 100644 --- a/laravel/documentation/install.md +++ b/laravel/documentation/install.md @@ -4,11 +4,7 @@ ## Contents - [Requirements](#requirements) - [Installation](#installation) -<<<<<<< HEAD -- [Server Configuration: Why Public?](#server-configuration) -======= - [Server Configuration](#server-configuration) ->>>>>>> feature/docs-install - [Basic Configuration](#basic-configuration) - [Environments](#environments) - [Cleaner URLs](#cleaner-urls) From 85ec19367d034622f74683049db365fcf5d7113f Mon Sep 17 00:00:00 2001 From: Shawn McCool Date: Wed, 11 Jul 2012 22:31:46 +0200 Subject: [PATCH 102/260] fix merge --- laravel/documentation/install.md | 1 - 1 file changed, 1 deletion(-) diff --git a/laravel/documentation/install.md b/laravel/documentation/install.md index ae3984dd..07cfbb4f 100644 --- a/laravel/documentation/install.md +++ b/laravel/documentation/install.md @@ -60,7 +60,6 @@ ## Server Configuration Notice that while we installed to **/Users/JonSnow/Sites/MySite** our DocumentRoot points to /Users/JonSnow/Sites/MySite/public**. While pointing the DocumentRoot to the public folder is a commonly used best-practice, it's possible that you may need to use Laravel on a host that does not allow you to update your DocumentRoot. A collection of algorithms to circumvent this need can be found [http://forums.laravel.com/viewtopic.php?id=1258](on the Laravel forums.) ->>>>>>> feature/docs-install ## Basic Configuration From a6c28050e68f0b824db608aa490c89652032ae15 Mon Sep 17 00:00:00 2001 From: Shawn McCool Date: Wed, 11 Jul 2012 22:34:38 +0200 Subject: [PATCH 103/260] style updates --- laravel/documentation/install.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/laravel/documentation/install.md b/laravel/documentation/install.md index 07cfbb4f..1e051e06 100644 --- a/laravel/documentation/install.md +++ b/laravel/documentation/install.md @@ -57,9 +57,9 @@ ## Server Configuration ServerName mysite.dev -Notice that while we installed to **/Users/JonSnow/Sites/MySite** our DocumentRoot points to /Users/JonSnow/Sites/MySite/public**. +Notice that while we installed to **/Users/JonSnow/Sites/MySite** our DocumentRoot points to **/Users/JonSnow/Sites/MySite/public**. -While pointing the DocumentRoot to the public folder is a commonly used best-practice, it's possible that you may need to use Laravel on a host that does not allow you to update your DocumentRoot. A collection of algorithms to circumvent this need can be found [http://forums.laravel.com/viewtopic.php?id=1258](on the Laravel forums.) +While pointing the DocumentRoot to the public folder is a commonly used best-practice, it's possible that you may need to use Laravel on a host that does not allow you to update your DocumentRoot. A collection of algorithms to circumvent this need can be found [on the Laravel forums.](http://forums.laravel.com/viewtopic.php?id=1258) ## Basic Configuration From 05ada38d8f6d3642a5d52a668c7b895a1e599a66 Mon Sep 17 00:00:00 2001 From: Shawn McCool Date: Wed, 11 Jul 2012 22:36:20 +0200 Subject: [PATCH 104/260] style update --- laravel/documentation/install.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/laravel/documentation/install.md b/laravel/documentation/install.md index cb3f9dc6..1e051e06 100644 --- a/laravel/documentation/install.md +++ b/laravel/documentation/install.md @@ -41,10 +41,6 @@ ### Problems? - Make sure the **public** directory is the document root of your web server. (see: Server Configuration below) - If you are using mod_rewrite, set the **index** option in **application/config/application.php** to an empty string. -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> hotfix/fix_markdown - Verify that your storage folder and the folders within are writable by your web server. From 3acc64051f830097c06a593bebbca36e64fc5cce Mon Sep 17 00:00:00 2001 From: Shawn McCool Date: Wed, 11 Jul 2012 22:42:36 +0200 Subject: [PATCH 105/260] simplify navigation copy --- laravel/documentation/contents.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/contents.md b/laravel/documentation/contents.md index 5a512ad1..63a2b86f 100644 --- a/laravel/documentation/contents.md +++ b/laravel/documentation/contents.md @@ -4,7 +4,7 @@ ### General - [Installation & Setup](/docs/install) - [Requirements](/docs/install#requirements) - [Installation](/docs/install#installation) - - [Server Configuration: Why Public?](/docs/install#server-configuration) + - [Server Configuration](/docs/install#server-configuration) - [Basic Configuration](/docs/install#basic-configuration) - [Environments](/docs/install#environments) - [Cleaner URLs](/docs/install#cleaner-urls) From 29b668b83d5be0be6034e9161e3629e7fad6fdf1 Mon Sep 17 00:00:00 2001 From: Shawn McCool Date: Thu, 12 Jul 2012 00:30:04 +0200 Subject: [PATCH 106/260] added help:commands task to artisan --- laravel/cli/dependencies.php | 12 ++++++ laravel/cli/tasks/help.json | 78 ++++++++++++++++++++++++++++++++++++ laravel/cli/tasks/help.php | 35 ++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 laravel/cli/tasks/help.json create mode 100644 laravel/cli/tasks/help.php diff --git a/laravel/cli/dependencies.php b/laravel/cli/dependencies.php index f0c59e81..2e7f23b6 100644 --- a/laravel/cli/dependencies.php +++ b/laravel/cli/dependencies.php @@ -125,4 +125,16 @@ { return new Tasks\Bundle\Providers\Github; }); +} + +/** + * The "help" task provides information about + * artisan usage. + */ +if(! IoC::registered('task: help')) +{ + IoC::singleton('task: help', function() + { + return new Tasks\Help; + }); } \ No newline at end of file diff --git a/laravel/cli/tasks/help.json b/laravel/cli/tasks/help.json new file mode 100644 index 00000000..69e16fe6 --- /dev/null +++ b/laravel/cli/tasks/help.json @@ -0,0 +1,78 @@ +{ + "Application Configuration": { + "key:generate": { + "description": "Generate a secure application key.", + "command": "php artisan key:generate" + } + }, + "Database Tables": { + "session:table": { + "description": "Generate a migration for the sessions database table.", + "command": "php artisan session:table" + } + }, + "Migrations": { + "migrate:install": { + "description": "Create the Laravel migration table.", + "command": "php artisan migrate:install" + }, + "migrate:make": { + "description": "Create a migration.", + "command": "php artisan migrate:make create_users_table" + }, + "migrate": { + "description": "Run outstanding migrations.", + "command": "php artisan migrate" + }, + "migrate:rollback": { + "description": "Roll back the most recent migration.", + "command": "php artisan migrate:rollback" + }, + "migrate:reset": { + "description": "Roll back all migrations.", + "command": "php artisan migrate:reset" + } + }, + "Bundles": { + "bundle:install": { + "description": "Install a bundle.", + "command": "php artisan bundle:install swiftmailer" + }, + "bundle:upgrade": { + "description": "Upgrade a bundle.", + "command": "php artisan bundle:upgrade swiftmailer" + }, + "bundle:publish": { + "description": "Publish all bundles' assets.", + "command": "php artisan bundle:publish" + } + }, + "Unit Tests": { + "test": { + "description": "Run the application's tests.", + "command": "php artisan test" + } + }, + "Routing": { + "route:call": { + "description": "Call a route.", + "command": "php artisan route:call get api/user/1" + } + }, + "Application Keys": { + "key:generate": { + "description": "Generate an application key.", + "command": "php artisan key:generade" + } + }, + "CLI Options": { + "--env=": { + "description": "Set the Laravel environment.", + "command": "php artisan task --env=local" + }, + "--database=": { + "description": "Set the default database connection.", + "command": "php artisan task --database=mysql" + } + } +} \ No newline at end of file diff --git a/laravel/cli/tasks/help.php b/laravel/cli/tasks/help.php new file mode 100644 index 00000000..5add2e75 --- /dev/null +++ b/laravel/cli/tasks/help.php @@ -0,0 +1,35 @@ + $commands) + { + + if($i++ != 0) echo PHP_EOL; + + echo PHP_EOL . "# $category" . PHP_EOL; + + foreach($commands as $command => $details) + { + echo PHP_EOL . str_pad($command, 20) . str_pad($details->description, 30); + } + } + } + +} \ No newline at end of file From 644ecfcc2586add3143f73a02f7411876a018b7d Mon Sep 17 00:00:00 2001 From: Shawn McCool Date: Thu, 12 Jul 2012 13:00:35 +0200 Subject: [PATCH 107/260] adding basic help functions to artisan --- laravel/cli/tasks/help.php | 1 - 1 file changed, 1 deletion(-) diff --git a/laravel/cli/tasks/help.php b/laravel/cli/tasks/help.php index 5add2e75..e81bc945 100644 --- a/laravel/cli/tasks/help.php +++ b/laravel/cli/tasks/help.php @@ -31,5 +31,4 @@ public function commands() } } } - } \ No newline at end of file From ce3721a7a131bd3a1aac04ac046a3427e9a233e2 Mon Sep 17 00:00:00 2001 From: Baycan Aydin Date: Thu, 12 Jul 2012 16:37:12 +0200 Subject: [PATCH 108/260] Add dutch language Signed-off-by: Baycan Aydin --- application/language/nl/pagination.php | 8 +++ application/language/nl/validation.php | 90 ++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 application/language/nl/pagination.php create mode 100644 application/language/nl/validation.php diff --git a/application/language/nl/pagination.php b/application/language/nl/pagination.php new file mode 100644 index 00000000..003e13de --- /dev/null +++ b/application/language/nl/pagination.php @@ -0,0 +1,8 @@ + '« Vorige', + 'next' => 'Volgende »', + +); \ No newline at end of file diff --git a/application/language/nl/validation.php b/application/language/nl/validation.php new file mode 100644 index 00000000..51e2a0b7 --- /dev/null +++ b/application/language/nl/validation.php @@ -0,0 +1,90 @@ + "Het :attribute moet geaccepteerd zijn.", + "active_url" => "Het :attribute is geen geldig URL.", + "after" => "Het :attribute moet een datum na :date zijn.", + "alpha" => "Het :attribute mag alleen letters bevatten.", + "alpha_dash" => "Het :attribute mag alleen letters, nummers, onderstreep(_) en strepen(-) bevatten.", + "alpha_num" => "Het :attribute mag alleen letters en nummers", + "before" => "Het :attribute moet een datum voor :date zijn.", + "between" => array( + "numeric" => "Het :attribute moet tussen :min en :max zijn.", + "file" => "Het :attribute moet tussen :min en :max kilobytes zijn.", + "string" => "Het :attribute moet tussen :min en :max tekens zijn.", + ), + "confirmed" => "Het :attribute bevestiging komt niet overeen.", + "different" => "Het :attribute en :other moeten verschillend zijn.", + "email" => "Het :attribute formaat is ongeldig.", + "exists" => "Het gekozen :attribute is al ingebruik.", + "image" => "Het :attribute moet een afbeelding zijn.", + "in" => "Het gekozen :attribute is ongeldig.", + "integer" => "Het :attribute moet een getal zijn.", + "ip" => "Het :attribute moet een geldig IP adres bevatten.", + "match" => "Het :attribute formaat is ongeldig.", + "max" => array( + "numeric" => "Het :attribute moet minder dan :max zijn.", + "file" => "Het :attribute moet minder dan :max kilobytes zijn.", + "string" => "Het :attribute moet minder dan :max tekens zijn.", + ), + "mimes" => "Het :attribute moet een bestand zijn van het bestandstype :values.", + "min" => array( + "numeric" => "Het :attribute moet minimaal :min zijn.", + "file" => "Het :attribute moet minimaal :min kilobytes zijn.", + "string" => "Het :attribute moet minimaal :min characters zijn.", + ), + "not_in" => "Het :attribute formaat is ongeldig.", + "numeric" => "Het :attribute moet een nummer zijn.", + "required" => "Het :attribute veld is verplicht.", + "same" => "Het :attribute en :other moeten overeenkomen.", + "size" => array( + "numeric" => "Het :attribute moet :size zijn.", + "file" => "Het :attribute moet :size kilobyte zijn.", + "string" => "Het :attribute moet :size characters zijn.", + ), + "unique" => "Het :attribute is al in gebruik.", + "url" => "Het :attribute formaat is ongeldig.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file From 4d44df4885511e230847942b42794c2cdd6317eb Mon Sep 17 00:00:00 2001 From: Colin Viebrock Date: Thu, 12 Jul 2012 10:40:41 -0500 Subject: [PATCH 109/260] Allow second param of HTML::link* methods to be null, in which case the title of the link is the URL itself, similar to HTML::email() method. Signed-off-by: Colin Viebrock --- laravel/html.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/laravel/html.php b/laravel/html.php index 498ea28c..22025ee1 100644 --- a/laravel/html.php +++ b/laravel/html.php @@ -137,10 +137,12 @@ public static function span($value, $attributes = array()) * @param bool $https * @return string */ - public static function link($url, $title, $attributes = array(), $https = null) + public static function link($url, $title = null, $attributes = array(), $https = null) { $url = URL::to($url, $https); + if (is_null($title)) $title = $url; + return ''.static::entities($title).''; } @@ -152,7 +154,7 @@ public static function link($url, $title, $attributes = array(), $https = null) * @param array $attributes * @return string */ - public static function link_to_secure($url, $title, $attributes = array()) + public static function link_to_secure($url, $title = null, $attributes = array()) { return static::link($url, $title, $attributes, true); } @@ -168,7 +170,7 @@ public static function link_to_secure($url, $title, $attributes = array()) * @param bool $https * @return string */ - public static function link_to_asset($url, $title, $attributes = array(), $https = null) + public static function link_to_asset($url, $title = null, $attributes = array(), $https = null) { $url = URL::to_asset($url, $https); @@ -183,7 +185,7 @@ public static function link_to_asset($url, $title, $attributes = array(), $https * @param array $attributes * @return string */ - public static function link_to_secure_asset($url, $title, $attributes = array()) + public static function link_to_secure_asset($url, $title = null, $attributes = array()) { return static::link_to_asset($url, $title, $attributes, true); } @@ -207,7 +209,7 @@ public static function link_to_secure_asset($url, $title, $attributes = array()) * @param array $attributes * @return string */ - public static function link_to_route($name, $title, $parameters = array(), $attributes = array()) + public static function link_to_route($name, $title = null, $parameters = array(), $attributes = array()) { return static::link(URL::to_route($name, $parameters), $title, $attributes); } @@ -231,7 +233,7 @@ public static function link_to_route($name, $title, $parameters = array(), $attr * @param array $attributes * @return string */ - public static function link_to_action($action, $title, $parameters = array(), $attributes = array()) + public static function link_to_action($action, $title = null, $parameters = array(), $attributes = array()) { return static::link(URL::to_action($action, $parameters), $title, $attributes); } @@ -418,7 +420,7 @@ public static function __callStatic($method, $parameters) { return call_user_func_array(static::$macros[$method], $parameters); } - + throw new \Exception("Method [$method] does not exist."); } From 71f8e4acc09d0c768e4f54dfc09b1e15f09ddfeb Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Thu, 12 Jul 2012 23:16:22 +0300 Subject: [PATCH 110/260] Fix a bug introduced in pull request #799 that caused eager loading constraints to stop working. --- laravel/database/eloquent/model.php | 37 +++++++++++++++++++---------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index ccdd42d5..9a90279f 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -257,25 +257,38 @@ public function _with($includes) { $includes = (array) $includes; - $all_includes = array(); + $given_includes = array(); - foreach($includes as $include) + foreach ($includes as $relationship => $constraints) { - $nested = explode('.', $include); - - $inc = array(); - - foreach($nested as $relation) + // When eager loading relationships, constraints may be set on the eager + // load definition; however, is none are set, we need to swap the key + // and the value of the array since there are no constraints. + if (is_numeric($relationship)) { - $inc[] = $relation; - - $all_includes[] = implode('.', $inc); + list($relationship, $constraints) = array($constraints, null); } + $given_includes[$relationship] = $constraints; } - //remove duplicates and reset the array keys. - $this->includes = array_values(array_unique($all_includes)); + $relationships = array_keys($given_includes); + $implicits = array(); + + foreach ($relationships as $relationship) + { + $parts = explode('.', $relationship); + + $prefix = ''; + foreach ($parts as $part) + { + $implicits[$prefix.$part] = null; + $prefix .= $part.'.'; + } + } + + // Add all implicit includes to the explicit ones + $this->includes = $given_includes + $implicits; return $this; } From 8c2a4fba14015f166451f25f6c9ef3f87c0fe51a Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Thu, 12 Jul 2012 23:20:17 +0300 Subject: [PATCH 111/260] The Eloquent model includes can now be taken directly from the model when assembling the query. --- laravel/database/eloquent/query.php | 29 ++--------------------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/laravel/database/eloquent/query.php b/laravel/database/eloquent/query.php index 3aee79c9..25fa4fbc 100644 --- a/laravel/database/eloquent/query.php +++ b/laravel/database/eloquent/query.php @@ -127,7 +127,7 @@ public function hydrate($model, $results) if (count($results) > 0) { - foreach ($this->model_includes() as $relationship => $constraints) + foreach ($this->model->includes as $relationship => $constraints) { // If the relationship is nested, we will skip loading it here and let // the load method parse and set the nested eager loads on the right @@ -196,7 +196,7 @@ protected function nested_includes($relationship) { $nested = array(); - foreach ($this->model_includes() as $include => $constraints) + foreach ($this->model->includes as $include => $constraints) { // To get the nested includes, we want to find any includes that begin // the relationship and a dot, then we will strip off the leading @@ -210,31 +210,6 @@ protected function nested_includes($relationship) return $nested; } - /** - * Get the eagerly loaded relationships for the model. - * - * @return array - */ - protected function model_includes() - { - $includes = array(); - - foreach ($this->model->includes as $relationship => $constraints) - { - // When eager loading relationships, constraints may be set on the eager - // load definition; however, is none are set, we need to swap the key - // and the value of the array since there are no constraints. - if (is_numeric($relationship)) - { - list($relationship, $constraints) = array($constraints, null); - } - - $includes[$relationship] = $constraints; - } - - return $includes; - } - /** * Get a fluent query builder for the model. * From 78920c5d270f0abcf3eccf557fea88d83d3470ed Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Thu, 12 Jul 2012 22:32:43 +0200 Subject: [PATCH 112/260] Move automatic relationship parsing to Eloquent's query class. --- laravel/database/eloquent/model.php | 22 ++------------------- laravel/database/eloquent/query.php | 30 +++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index 9a90279f..32c504c5 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -257,7 +257,7 @@ public function _with($includes) { $includes = (array) $includes; - $given_includes = array(); + $this->includes = array(); foreach ($includes as $relationship => $constraints) { @@ -269,27 +269,9 @@ public function _with($includes) list($relationship, $constraints) = array($constraints, null); } - $given_includes[$relationship] = $constraints; + $this->includes[$relationship] = $constraints; } - $relationships = array_keys($given_includes); - $implicits = array(); - - foreach ($relationships as $relationship) - { - $parts = explode('.', $relationship); - - $prefix = ''; - foreach ($parts as $part) - { - $implicits[$prefix.$part] = null; - $prefix .= $part.'.'; - } - } - - // Add all implicit includes to the explicit ones - $this->includes = $given_includes + $implicits; - return $this; } diff --git a/laravel/database/eloquent/query.php b/laravel/database/eloquent/query.php index 25fa4fbc..56fd15c7 100644 --- a/laravel/database/eloquent/query.php +++ b/laravel/database/eloquent/query.php @@ -127,7 +127,7 @@ public function hydrate($model, $results) if (count($results) > 0) { - foreach ($this->model->includes as $relationship => $constraints) + foreach ($this->model_includes() as $relationship => $constraints) { // If the relationship is nested, we will skip loading it here and let // the load method parse and set the nested eager loads on the right @@ -196,7 +196,7 @@ protected function nested_includes($relationship) { $nested = array(); - foreach ($this->model->includes as $include => $constraints) + foreach ($this->model_includes() as $include => $constraints) { // To get the nested includes, we want to find any includes that begin // the relationship and a dot, then we will strip off the leading @@ -210,6 +210,32 @@ protected function nested_includes($relationship) return $nested; } + /** + * Get the eagerly loaded relationships for the model. + * + * @return array + */ + protected function model_includes() + { + $relationships = array_keys($this->model->includes); + $implicits = array(); + + foreach ($relationships as $relationship) + { + $parts = explode('.', $relationship); + + $prefix = ''; + foreach ($parts as $part) + { + $implicits[$prefix.$part] = NULL; + $prefix .= $part.'.'; + } + } + + // Add all implicit includes to the explicit ones + return $this->model->includes + $implicits; + } + /** * Get a fluent query builder for the model. * From 6d23c4f5c6db7ef62ba8d3b183e92d43991ab431 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 13 Jul 2012 00:21:18 +0300 Subject: [PATCH 113/260] Fix missing semicolon in laravel/cli/test/runner.php. --- laravel/cli/tasks/test/runner.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/cli/tasks/test/runner.php b/laravel/cli/tasks/test/runner.php index 953c9857..937046d8 100644 --- a/laravel/cli/tasks/test/runner.php +++ b/laravel/cli/tasks/test/runner.php @@ -83,7 +83,7 @@ protected function test() // fix the spaced directories problem when using the command line // strings with spaces inside should be wrapped in quotes. - $path = escapeshellarg($path) + $path = escapeshellarg($path); passthru('phpunit --configuration '.$path); From a7c211339ae895a023d847a1eebedacbb1b36787 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 13 Jul 2012 00:14:03 +0200 Subject: [PATCH 114/260] Import testing bundle to laravel/tests directory. --- laravel/cli/tasks/test/runner.php | 14 +- laravel/tests/application/bundles.php | 36 + .../tests/application/config/application.php | 158 +++++ laravel/tests/application/config/auth.php | 81 +++ laravel/tests/application/config/cache.php | 71 ++ laravel/tests/application/config/database.php | 108 +++ laravel/tests/application/config/error.php | 69 ++ .../application/config/local/database.php | 7 + laravel/tests/application/config/mimes.php | 97 +++ laravel/tests/application/config/session.php | 117 +++ laravel/tests/application/config/strings.php | 187 +++++ .../application/controllers/admin/panel.php | 10 + .../tests/application/controllers/auth.php | 20 + .../tests/application/controllers/filter.php | 65 ++ .../tests/application/controllers/home.php | 42 ++ .../tests/application/controllers/restful.php | 17 + .../controllers/template/basic.php | 12 + .../controllers/template/named.php | 12 + .../controllers/template/override.php | 26 + .../application/dashboard/repository.php | 7 + .../application/language/en/pagination.php | 19 + .../application/language/en/validation.php | 96 +++ .../application/language/sp/validation.php | 7 + .../tests/application/libraries/.gitignore | 0 .../tests/application/migrations/.gitignore | 0 laravel/tests/application/models/.gitignore | 0 .../tests/application/models/autoloader.php | 3 + .../application/models/repositories/user.php | 3 + laravel/tests/application/models/user.php | 3 + laravel/tests/application/routes.php | 93 +++ laravel/tests/application/start.php | 157 ++++ laravel/tests/application/tasks/.gitignore | 0 laravel/tests/application/views/error/404.php | 103 +++ laravel/tests/application/views/error/500.php | 103 +++ .../tests/application/views/home/index.php | 122 ++++ .../tests/application/views/tests/basic.php | 1 + .../tests/application/views/tests/nested.php | 1 + laravel/tests/bundles/.gitignore | 0 .../tests/bundles/dashboard/config/meta.php | 7 + .../bundles/dashboard/controllers/panel.php | 10 + .../bundles/dashboard/models/repository.php | 7 + laravel/tests/bundles/dashboard/routes.php | 8 + laravel/tests/bundles/dummy/routes.php | 6 + laravel/tests/bundles/dummy/start.php | 3 + laravel/tests/cases/asset.test.php | 262 +++++++ laravel/tests/cases/auth.test.php | 259 +++++++ laravel/tests/cases/autoloader.test.php | 102 +++ laravel/tests/cases/blade.test.php | 63 ++ laravel/tests/cases/bundle.test.php | 253 +++++++ laravel/tests/cases/config.test.php | 79 +++ laravel/tests/cases/controller.test.php | 264 +++++++ laravel/tests/cases/cookie.test.php | 94 +++ laravel/tests/cases/database.test.php | 74 ++ laravel/tests/cases/event.test.php | 43 ++ laravel/tests/cases/fluent.test.php | 50 ++ laravel/tests/cases/hash.test.php | 37 + laravel/tests/cases/input.test.php | 174 +++++ laravel/tests/cases/ioc.test.php | 74 ++ laravel/tests/cases/lang.test.php | 68 ++ laravel/tests/cases/messages.test.php | 115 +++ laravel/tests/cases/query.test.php | 48 ++ laravel/tests/cases/redirect.test.php | 143 ++++ laravel/tests/cases/request.test.php | 147 ++++ laravel/tests/cases/response.test.php | 88 +++ laravel/tests/cases/route.test.php | 179 +++++ laravel/tests/cases/routing.test.php | 160 +++++ laravel/tests/cases/session.test.php | 441 ++++++++++++ laravel/tests/cases/str.test.php | 133 ++++ laravel/tests/cases/uri.test.php | 59 ++ laravel/tests/cases/url.test.php | 106 +++ laravel/tests/cases/validator.test.php | 669 ++++++++++++++++++ laravel/tests/cases/view.test.php | 255 +++++++ laravel/tests/storage/cache/.gitignore | 0 .../tests/storage/database/application.sqlite | Bin 0 -> 196608 bytes laravel/tests/storage/files/desert.jpg | Bin 0 -> 845941 bytes laravel/tests/storage/logs/.gitignore | 0 laravel/tests/storage/sessions/.gitignore | 0 laravel/tests/storage/views/.gitignore | 0 78 files changed, 6335 insertions(+), 12 deletions(-) create mode 100644 laravel/tests/application/bundles.php create mode 100644 laravel/tests/application/config/application.php create mode 100644 laravel/tests/application/config/auth.php create mode 100644 laravel/tests/application/config/cache.php create mode 100644 laravel/tests/application/config/database.php create mode 100644 laravel/tests/application/config/error.php create mode 100644 laravel/tests/application/config/local/database.php create mode 100644 laravel/tests/application/config/mimes.php create mode 100644 laravel/tests/application/config/session.php create mode 100644 laravel/tests/application/config/strings.php create mode 100644 laravel/tests/application/controllers/admin/panel.php create mode 100644 laravel/tests/application/controllers/auth.php create mode 100644 laravel/tests/application/controllers/filter.php create mode 100644 laravel/tests/application/controllers/home.php create mode 100644 laravel/tests/application/controllers/restful.php create mode 100644 laravel/tests/application/controllers/template/basic.php create mode 100644 laravel/tests/application/controllers/template/named.php create mode 100644 laravel/tests/application/controllers/template/override.php create mode 100644 laravel/tests/application/dashboard/repository.php create mode 100644 laravel/tests/application/language/en/pagination.php create mode 100644 laravel/tests/application/language/en/validation.php create mode 100644 laravel/tests/application/language/sp/validation.php create mode 100644 laravel/tests/application/libraries/.gitignore create mode 100644 laravel/tests/application/migrations/.gitignore create mode 100644 laravel/tests/application/models/.gitignore create mode 100644 laravel/tests/application/models/autoloader.php create mode 100644 laravel/tests/application/models/repositories/user.php create mode 100644 laravel/tests/application/models/user.php create mode 100644 laravel/tests/application/routes.php create mode 100644 laravel/tests/application/start.php create mode 100644 laravel/tests/application/tasks/.gitignore create mode 100644 laravel/tests/application/views/error/404.php create mode 100644 laravel/tests/application/views/error/500.php create mode 100644 laravel/tests/application/views/home/index.php create mode 100644 laravel/tests/application/views/tests/basic.php create mode 100644 laravel/tests/application/views/tests/nested.php create mode 100644 laravel/tests/bundles/.gitignore create mode 100644 laravel/tests/bundles/dashboard/config/meta.php create mode 100644 laravel/tests/bundles/dashboard/controllers/panel.php create mode 100644 laravel/tests/bundles/dashboard/models/repository.php create mode 100644 laravel/tests/bundles/dashboard/routes.php create mode 100644 laravel/tests/bundles/dummy/routes.php create mode 100644 laravel/tests/bundles/dummy/start.php create mode 100644 laravel/tests/cases/asset.test.php create mode 100644 laravel/tests/cases/auth.test.php create mode 100644 laravel/tests/cases/autoloader.test.php create mode 100644 laravel/tests/cases/blade.test.php create mode 100644 laravel/tests/cases/bundle.test.php create mode 100644 laravel/tests/cases/config.test.php create mode 100644 laravel/tests/cases/controller.test.php create mode 100644 laravel/tests/cases/cookie.test.php create mode 100644 laravel/tests/cases/database.test.php create mode 100644 laravel/tests/cases/event.test.php create mode 100644 laravel/tests/cases/fluent.test.php create mode 100644 laravel/tests/cases/hash.test.php create mode 100644 laravel/tests/cases/input.test.php create mode 100644 laravel/tests/cases/ioc.test.php create mode 100644 laravel/tests/cases/lang.test.php create mode 100644 laravel/tests/cases/messages.test.php create mode 100644 laravel/tests/cases/query.test.php create mode 100644 laravel/tests/cases/redirect.test.php create mode 100644 laravel/tests/cases/request.test.php create mode 100644 laravel/tests/cases/response.test.php create mode 100644 laravel/tests/cases/route.test.php create mode 100644 laravel/tests/cases/routing.test.php create mode 100644 laravel/tests/cases/session.test.php create mode 100644 laravel/tests/cases/str.test.php create mode 100644 laravel/tests/cases/uri.test.php create mode 100644 laravel/tests/cases/url.test.php create mode 100644 laravel/tests/cases/validator.test.php create mode 100644 laravel/tests/cases/view.test.php create mode 100644 laravel/tests/storage/cache/.gitignore create mode 100644 laravel/tests/storage/database/application.sqlite create mode 100644 laravel/tests/storage/files/desert.jpg create mode 100644 laravel/tests/storage/logs/.gitignore create mode 100644 laravel/tests/storage/sessions/.gitignore create mode 100644 laravel/tests/storage/views/.gitignore diff --git a/laravel/cli/tasks/test/runner.php b/laravel/cli/tasks/test/runner.php index 953c9857..853f76b0 100644 --- a/laravel/cli/tasks/test/runner.php +++ b/laravel/cli/tasks/test/runner.php @@ -26,17 +26,7 @@ public function run($bundles = array()) */ public function core() { - if ( ! is_dir(path('bundle').'laravel-tests')) - { - throw new \Exception("The bundle [laravel-tests] has not been installed!"); - } - - // When testing the Laravel core, we will just stub the path directly - // so the test bundle is not required to be registered in the bundle - // configuration, as it is kind of a unique bundle. - $this->stub(path('bundle').'laravel-tests/cases'); - - $path = path('bundle').'laravel-tests/'; + $this->stub(path('sys').'tests/cases'); $this->test(); } @@ -83,7 +73,7 @@ protected function test() // fix the spaced directories problem when using the command line // strings with spaces inside should be wrapped in quotes. - $path = escapeshellarg($path) + $path = escapeshellarg($path); passthru('phpunit --configuration '.$path); diff --git a/laravel/tests/application/bundles.php b/laravel/tests/application/bundles.php new file mode 100644 index 00000000..1013f0cf --- /dev/null +++ b/laravel/tests/application/bundles.php @@ -0,0 +1,36 @@ + array( +| 'location' => 'admin', +| 'handles' => 'admin', +| ), +| +| Note that the "location" is relative to the "bundles" directory. +| Now the bundle will be recognized by Laravel and will be able +| to respond to requests beginning with "admin"! +| +| Have a bundle that lives in the root of the bundle directory +| and doesn't respond to any requests? Just add the bundle +| name to the array and we'll take care of the rest. +| +*/ + +return array('dashboard' => array('handles' => 'dashboard'), 'dummy'); \ No newline at end of file diff --git a/laravel/tests/application/config/application.php b/laravel/tests/application/config/application.php new file mode 100644 index 00000000..596baa24 --- /dev/null +++ b/laravel/tests/application/config/application.php @@ -0,0 +1,158 @@ + '', + + /* + |-------------------------------------------------------------------------- + | Application Index + |-------------------------------------------------------------------------- + | + | If you are including the "index.php" in your URLs, you can ignore this. + | + | However, if you are using mod_rewrite to get cleaner URLs, just set + | this option to an empty string and we'll take care of the rest. + | + */ + + 'index' => 'index.php', + + /* + |-------------------------------------------------------------------------- + | Application Key + |-------------------------------------------------------------------------- + | + | This key is used by the encryption and cookie classes to generate secure + | encrypted strings and hashes. It is extremely important that this key + | remain secret and should not be shared with anyone. Make it about 32 + | characters of random gibberish. + | + */ + + 'key' => '', + + /* + |-------------------------------------------------------------------------- + | Application Character Encoding + |-------------------------------------------------------------------------- + | + | The default character encoding used by your application. This encoding + | will be used by the Str, Text, Form, and any other classes that need + | to know what type of encoding to use for your awesome application. + | + */ + + 'encoding' => 'UTF-8', + + /* + |-------------------------------------------------------------------------- + | Application Language + |-------------------------------------------------------------------------- + | + | The default language of your application. This language will be used by + | Lang library as the default language when doing string localization. + | + */ + + 'language' => 'en', + + /* + |-------------------------------------------------------------------------- + | SSL Link Generation + |-------------------------------------------------------------------------- + | + | Many sites use SSL to protect their users data. However, you may not + | always be able to use SSL on your development machine, meaning all HTTPS + | will be broken during development. + | + | For this reason, you may wish to disable the generation of HTTPS links + | throughout your application. This option does just that. All attempts to + | generate HTTPS links will generate regular HTTP links instead. + | + */ + + 'ssl' => true, + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | The default timezone of your application. This timezone will be used when + | Laravel needs a date, such as when writing to a log file or travelling + | to a distant star at warp speed. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | Here, you can specify any class aliases that you would like registered + | when Laravel loads. Aliases are lazy-loaded, so add as many as you want. + | + | Aliases make it more convenient to use namespaced classes. Instead of + | referring to the class using its full namespace, you may simply use + | the alias defined here. + | + | We have already aliased common Laravel classes to make your life easier. + | + */ + + 'aliases' => array( + 'Auth' => 'Laravel\\Auth', + 'Asset' => 'Laravel\\Asset', + 'Autoloader' => 'Laravel\\Autoloader', + 'Blade' => 'Laravel\\Blade', + 'Bundle' => 'Laravel\\Bundle', + 'Cache' => 'Laravel\\Cache', + 'Config' => 'Laravel\\Config', + 'Controller' => 'Laravel\\Routing\\Controller', + 'Cookie' => 'Laravel\\Cookie', + 'Crypter' => 'Laravel\\Crypter', + 'DB' => 'Laravel\\Database', + 'Event' => 'Laravel\\Event', + 'File' => 'Laravel\\File', + 'Filter' => 'Laravel\\Routing\\Filter', + 'Form' => 'Laravel\\Form', + 'Hash' => 'Laravel\\Hash', + 'HTML' => 'Laravel\\HTML', + 'Input' => 'Laravel\\Input', + 'IoC' => 'Laravel\\IoC', + 'Lang' => 'Laravel\\Lang', + 'Log' => 'Laravel\\Log', + 'Memcached' => 'Laravel\\Memcached', + 'Paginator' => 'Laravel\\Paginator', + 'URL' => 'Laravel\\URL', + 'Redirect' => 'Laravel\\Redirect', + 'Redis' => 'Laravel\\Redis', + 'Request' => 'Laravel\\Request', + 'Response' => 'Laravel\\Response', + 'Route' => 'Laravel\\Routing\\Route', + 'Router' => 'Laravel\\Routing\\Router', + 'Schema' => 'Laravel\\Database\\Schema', + 'Section' => 'Laravel\\Section', + 'Session' => 'Laravel\\Session', + 'Str' => 'Laravel\\Str', + 'Task' => 'Laravel\\CLI\\Tasks\\Task', + 'URI' => 'Laravel\\URI', + 'Validator' => 'Laravel\\Validator', + 'View' => 'Laravel\\View', + ), + +); diff --git a/laravel/tests/application/config/auth.php b/laravel/tests/application/config/auth.php new file mode 100644 index 00000000..d0137583 --- /dev/null +++ b/laravel/tests/application/config/auth.php @@ -0,0 +1,81 @@ + function($id) + { + if (filter_var($id, FILTER_VALIDATE_INT) !== false) + { + return DB::table('users')->find($id); + } + }, + + /* + |-------------------------------------------------------------------------- + | Authenticate User Credentials + |-------------------------------------------------------------------------- + | + | This closure is called by the Auth::attempt() method when attempting to + | authenticate a user that is logging into your application. It's like a + | super buff bouncer to your application. + | + | If the provided credentials are correct, simply return an object that + | represents the user being authenticated. As long as it has a property + | for the "id", any object will work. If the credentials are not valid, + | you don't meed to return anything. + | + */ + + 'attempt' => function($username, $password) + { + $user = DB::table('users')->where_username($username)->first(); + + if ( ! is_null($user) and Hash::check($password, $user->password)) + { + return $user; + } + }, + + /* + |-------------------------------------------------------------------------- + | Logout The Current User + |-------------------------------------------------------------------------- + | + | Here you may do anything that needs to be done when a user logs out of + | your application, such as call the logout method on a third-party API + | you are using for authentication or anything else you desire. + | + */ + + 'logout' => function($user) {}, + + /* + |-------------------------------------------------------------------------- + | "Remember Me" Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may specify the cookie name that will be used for the cookie + | that serves as the "remember me" token. Of course, a sensible default + | has been set for you, so you probably don't need to change it. + | + */ + + 'cookie' => 'laravel_remember', + +); \ No newline at end of file diff --git a/laravel/tests/application/config/cache.php b/laravel/tests/application/config/cache.php new file mode 100644 index 00000000..73fd4c9c --- /dev/null +++ b/laravel/tests/application/config/cache.php @@ -0,0 +1,71 @@ + 'file', + + /* + |-------------------------------------------------------------------------- + | Cache Key + |-------------------------------------------------------------------------- + | + | This key will be prepended to item keys stored using Memcached and APC + | to prevent collisions with other applications on the server. Since the + | memory based stores could be shared by other applications, we need to + | be polite and use a prefix to uniquely identifier our items. + | + */ + + 'key' => 'laravel', + + /* + |-------------------------------------------------------------------------- + | Cache Database + |-------------------------------------------------------------------------- + | + | When using the database cache driver, this database table will be used + | to store the cached item. You may also add a "connection" option to + | the array to specify which database connection should be used. + | + */ + + 'database' => array('table' => 'laravel_cache'), + + /* + |-------------------------------------------------------------------------- + | Memcached Servers + |-------------------------------------------------------------------------- + | + | The Memcached servers used by your application. Memcached is a free and + | open source, high-performance, distributed memory caching system. It is + | generic in nature but intended for use in speeding up web applications + | by alleviating database load. + | + | For more information, check out: http://memcached.org + | + */ + + 'memcached' => array( + + array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100), + + ), + +); \ No newline at end of file diff --git a/laravel/tests/application/config/database.php b/laravel/tests/application/config/database.php new file mode 100644 index 00000000..b7b9fd96 --- /dev/null +++ b/laravel/tests/application/config/database.php @@ -0,0 +1,108 @@ + 'sqlite', + + /* + |-------------------------------------------------------------------------- + | PDO Fetch Style + |-------------------------------------------------------------------------- + | + | By default, database results will be returned as instances of the PHP + | stdClass object; however, you may wish to retrieve records as arrays + | instead of objects. Here you can control the PDO fetch style of the + | database queries run by your application. + | + */ + + 'fetch' => PDO::FETCH_CLASS, + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | All of the database connections used by your application. Many of your + | applications will no doubt only use one connection; however, you have + | the freedom to specify as many connections as you can handle. + | + | All database work in Laravel is done through the PHP's PDO facilities, + | so make sure you have the PDO drivers for your particlar database of + | choice installed on your machine. + | + | Drivers: 'mysql', 'pgsql', 'sqlsrv', 'sqlite'. + | + */ + + 'connections' => array( + + 'sqlite' => array( + 'driver' => 'sqlite', + 'database' => 'application', + 'prefix' => '', + ), + + 'mysql' => array( + 'driver' => 'mysql', + 'host' => 'localhost', + 'database' => 'database', + 'username' => 'root', + 'password' => 'password', + 'charset' => 'utf8', + 'prefix' => '', + ), + + 'pgsql' => array( + 'driver' => 'pgsql', + 'host' => 'localhost', + 'database' => 'database', + 'username' => 'root', + 'password' => 'password', + 'charset' => 'utf8', + 'prefix' => '', + ), + + 'sqlsrv' => array( + 'driver' => 'sqlsrv', + 'host' => 'localhost', + 'database' => 'database', + 'username' => 'root', + 'password' => 'password', + 'prefix' => '', + ), + + ), + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store. However, it + | provides a richer set of commands than a typical key-value store such as + | APC or memcached. All the cool kids are using it. + | + | To get the scoop on Redis, check out: http://redis.io + | + */ + + 'redis' => array( + + 'default' => array('host' => '127.0.0.1', 'port' => 6379), + + ), + +); \ No newline at end of file diff --git a/laravel/tests/application/config/error.php b/laravel/tests/application/config/error.php new file mode 100644 index 00000000..87db9665 --- /dev/null +++ b/laravel/tests/application/config/error.php @@ -0,0 +1,69 @@ + array(E_NOTICE, E_USER_NOTICE, E_DEPRECATED, E_USER_DEPRECATED), + + /* + |-------------------------------------------------------------------------- + | Error Detail + |-------------------------------------------------------------------------- + | + | Detailed error messages contain information about the file in which an + | error occurs, as well as a PHP stack trace containing the call stack. + | You'll want them when you're trying to debug your application. + | + | If your application is in production, you'll want to turn off the error + | details for enhanced security and user experience since the exception + | stack trace could contain sensitive information. + | + */ + + 'detail' => true, + + /* + |-------------------------------------------------------------------------- + | Error Logging + |-------------------------------------------------------------------------- + | + | When error logging is enabled, the "logger" Closure defined below will + | be called for every error in your application. You are free to log the + | errors however you want. Enjoy the flexibility. + | + */ + + 'log' => false, + + /* + |-------------------------------------------------------------------------- + | Error Logger + |-------------------------------------------------------------------------- + | + | Because of the various ways of managing error logging, you get complete + | flexibility to manage error logging as you see fit. This function will + | be called anytime an error occurs within your application and error + | logging is enabled. + | + | You may log the error message however you like; however, a simple log + | solution has been setup for you which will log all error messages to + | text files within the application storage directory. + | + */ + + 'logger' => function($exception) + { + Log::exception($exception); + }, + +); \ No newline at end of file diff --git a/laravel/tests/application/config/local/database.php b/laravel/tests/application/config/local/database.php new file mode 100644 index 00000000..bd94d7ba --- /dev/null +++ b/laravel/tests/application/config/local/database.php @@ -0,0 +1,7 @@ + 'sqlite', + +); \ No newline at end of file diff --git a/laravel/tests/application/config/mimes.php b/laravel/tests/application/config/mimes.php new file mode 100644 index 00000000..e2bd4fbb --- /dev/null +++ b/laravel/tests/application/config/mimes.php @@ -0,0 +1,97 @@ + 'application/mac-binhex40', + 'cpt' => 'application/mac-compactpro', + 'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream'), + 'bin' => 'application/macbinary', + 'dms' => 'application/octet-stream', + 'lha' => 'application/octet-stream', + 'lzh' => 'application/octet-stream', + 'exe' => array('application/octet-stream', 'application/x-msdownload'), + 'class' => 'application/octet-stream', + 'psd' => 'application/x-photoshop', + 'so' => 'application/octet-stream', + 'sea' => 'application/octet-stream', + 'dll' => 'application/octet-stream', + 'oda' => 'application/oda', + 'pdf' => array('application/pdf', 'application/x-download'), + 'ai' => 'application/postscript', + 'eps' => 'application/postscript', + 'ps' => 'application/postscript', + 'smi' => 'application/smil', + 'smil' => 'application/smil', + 'mif' => 'application/vnd.mif', + 'xls' => array('application/excel', 'application/vnd.ms-excel', 'application/msexcel'), + 'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint'), + 'wbxml' => 'application/wbxml', + 'wmlc' => 'application/wmlc', + 'dcr' => 'application/x-director', + 'dir' => 'application/x-director', + 'dxr' => 'application/x-director', + 'dvi' => 'application/x-dvi', + 'gtar' => 'application/x-gtar', + 'gz' => 'application/x-gzip', + 'php' => array('application/x-httpd-php', 'text/x-php'), + 'php4' => 'application/x-httpd-php', + 'php3' => 'application/x-httpd-php', + 'phtml' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'js' => 'application/x-javascript', + 'swf' => 'application/x-shockwave-flash', + 'sit' => 'application/x-stuffit', + 'tar' => 'application/x-tar', + 'tgz' => array('application/x-tar', 'application/x-gzip-compressed'), + 'xhtml' => 'application/xhtml+xml', + 'xht' => 'application/xhtml+xml', + 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed'), + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mpga' => 'audio/mpeg', + 'mp2' => 'audio/mpeg', + 'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'), + 'aif' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'ram' => 'audio/x-pn-realaudio', + 'rm' => 'audio/x-pn-realaudio', + 'rpm' => 'audio/x-pn-realaudio-plugin', + 'ra' => 'audio/x-realaudio', + 'rv' => 'video/vnd.rn-realvideo', + 'wav' => 'audio/x-wav', + 'bmp' => 'image/bmp', + 'gif' => 'image/gif', + 'jpeg' => array('image/jpeg', 'image/pjpeg'), + 'jpg' => array('image/jpeg', 'image/pjpeg'), + 'jpe' => array('image/jpeg', 'image/pjpeg'), + 'png' => 'image/png', + 'tiff' => 'image/tiff', + 'tif' => 'image/tiff', + 'css' => 'text/css', + 'html' => 'text/html', + 'htm' => 'text/html', + 'shtml' => 'text/html', + 'txt' => 'text/plain', + 'text' => 'text/plain', + 'log' => array('text/plain', 'text/x-log'), + 'rtx' => 'text/richtext', + 'rtf' => 'text/rtf', + 'xml' => 'text/xml', + 'xsl' => 'text/xml', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpe' => 'video/mpeg', + 'qt' => 'video/quicktime', + 'mov' => 'video/quicktime', + 'avi' => 'video/x-msvideo', + 'movie' => 'video/x-sgi-movie', + 'doc' => 'application/msword', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'word' => array('application/msword', 'application/octet-stream'), + 'xl' => 'application/excel', + 'eml' => 'message/rfc822', + 'json' => array('application/json', 'text/json'), + +); \ No newline at end of file diff --git a/laravel/tests/application/config/session.php b/laravel/tests/application/config/session.php new file mode 100644 index 00000000..3b6e6a69 --- /dev/null +++ b/laravel/tests/application/config/session.php @@ -0,0 +1,117 @@ + '', + + /* + |-------------------------------------------------------------------------- + | Session Database + |-------------------------------------------------------------------------- + | + | The database table on which the session should be stored. It probably + | goes without saying that this option only matters if you are using + | the super slick database session driver. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Garbage Collection Probability + |-------------------------------------------------------------------------- + | + | Some session drivers require the manual clean-up of expired sessions. + | This option specifies the probability of session garbage collection + | occuring for any given request. + | + | For example, the default value states that garbage collection has a + | 2% chance of occuring for any given request to the application. + | Feel free to tune this to your application's size and speed. + | + */ + + 'sweepage' => array(2, 100), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | The number of minutes a session can be idle before expiring. + | + */ + + 'lifetime' => 60, + + /* + |-------------------------------------------------------------------------- + | Session Expiration On Close + |-------------------------------------------------------------------------- + | + | Determines if the session should expire when the user's web browser closes. + | + */ + + 'expire_on_close' => false, + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | The name that should be given to the session cookie. + | + */ + + 'cookie' => 'laravel_session', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The path for which the session cookie is available. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | The domain for which the session cookie is available. + | + */ + + 'domain' => null, + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Session Cookie + |-------------------------------------------------------------------------- + | + | Determines if the cookie should only be sent over HTTPS. + | + */ + + 'secure' => false, + +); \ No newline at end of file diff --git a/laravel/tests/application/config/strings.php b/laravel/tests/application/config/strings.php new file mode 100644 index 00000000..730f973e --- /dev/null +++ b/laravel/tests/application/config/strings.php @@ -0,0 +1,187 @@ + array( + '/(quiz)$/i' => "$1zes", + '/^(ox)$/i' => "$1en", + '/([m|l])ouse$/i' => "$1ice", + '/(matr|vert|ind)ix|ex$/i' => "$1ices", + '/(x|ch|ss|sh)$/i' => "$1es", + '/([^aeiouy]|qu)y$/i' => "$1ies", + '/(hive)$/i' => "$1s", + '/(?:([^f])fe|([lr])f)$/i' => "$1$2ves", + '/(shea|lea|loa|thie)f$/i' => "$1ves", + '/sis$/i' => "ses", + '/([ti])um$/i' => "$1a", + '/(tomat|potat|ech|her|vet)o$/i' => "$1oes", + '/(bu)s$/i' => "$1ses", + '/(alias)$/i' => "$1es", + '/(octop)us$/i' => "$1i", + '/(ax|test)is$/i' => "$1es", + '/(us)$/i' => "$1es", + '/s$/i' => "s", + '/$/' => "s" + ), + + 'singular' => array( + '/(quiz)zes$/i' => "$1", + '/(matr)ices$/i' => "$1ix", + '/(vert|ind)ices$/i' => "$1ex", + '/^(ox)en$/i' => "$1", + '/(alias)es$/i' => "$1", + '/(octop|vir)i$/i' => "$1us", + '/(cris|ax|test)es$/i' => "$1is", + '/(shoe)s$/i' => "$1", + '/(o)es$/i' => "$1", + '/(bus)es$/i' => "$1", + '/([m|l])ice$/i' => "$1ouse", + '/(x|ch|ss|sh)es$/i' => "$1", + '/(m)ovies$/i' => "$1ovie", + '/(s)eries$/i' => "$1eries", + '/([^aeiouy]|qu)ies$/i' => "$1y", + '/([lr])ves$/i' => "$1f", + '/(tive)s$/i' => "$1", + '/(hive)s$/i' => "$1", + '/(li|wi|kni)ves$/i' => "$1fe", + '/(shea|loa|lea|thie)ves$/i' => "$1f", + '/(^analy)ses$/i' => "$1sis", + '/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i' => "$1$2sis", + '/([ti])a$/i' => "$1um", + '/(n)ews$/i' => "$1ews", + '/(h|bl)ouses$/i' => "$1ouse", + '/(corpse)s$/i' => "$1", + '/(us)es$/i' => "$1", + '/(us|ss)$/i' => "$1", + '/s$/i' => "", + ), + + 'irregular' => array( + 'child' => 'children', + 'foot' => 'feet', + 'goose' => 'geese', + 'man' => 'men', + 'move' => 'moves', + 'person' => 'people', + 'sex' => 'sexes', + 'tooth' => 'teeth', + ), + + 'uncountable' => array( + 'audio', + 'equipment', + 'deer', + 'fish', + 'gold', + 'information', + 'money', + 'rice', + 'police', + 'series', + 'sheep', + 'species', + ), + + /* + |-------------------------------------------------------------------------- + | ASCII Characters + |-------------------------------------------------------------------------- + | + | This array contains foreign characters and their 7-bit ASCII equivalents. + | The array is used by the "ascii" method on the Str class to get strings + | ready for inclusion in a URL slug. + | + | Of course, the "ascii" method may also be used by you for whatever your + | application requires. Feel free to add any characters we missed, and be + | sure to let us know about them! + | + */ + + 'ascii' => array( + + '/æ|ǽ/' => 'ae', + '/œ/' => 'oe', + '/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|А/' => 'A', + '/à|á|â|ã|ä|å|ǻ|ā|ă|ą|ǎ|ª|а/' => 'a', + '/Б/' => 'B', + '/б/' => 'b', + '/Ç|Ć|Ĉ|Ċ|Č|Ц/' => 'C', + '/ç|ć|ĉ|ċ|č|ц/' => 'c', + '/Ð|Ď|Đ|Д/' => 'Dj', + '/ð|ď|đ|д/' => 'dj', + '/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Е|Ё|Э/' => 'E', + '/è|é|ê|ë|ē|ĕ|ė|ę|ě|е|ё|э/' => 'e', + '/Ф/' => 'F', + '/ƒ|ф/' => 'f', + '/Ĝ|Ğ|Ġ|Ģ|Г/' => 'G', + '/ĝ|ğ|ġ|ģ|г/' => 'g', + '/Ĥ|Ħ|Х/' => 'H', + '/ĥ|ħ|х/' => 'h', + '/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|И/' => 'I', + '/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|и/' => 'i', + '/Ĵ|Й/' => 'J', + '/ĵ|й/' => 'j', + '/Ķ|К/' => 'K', + '/ķ|к/' => 'k', + '/Ĺ|Ļ|Ľ|Ŀ|Ł|Л/' => 'L', + '/ĺ|ļ|ľ|ŀ|ł|л/' => 'l', + '/М/' => 'M', + '/м/' => 'm', + '/Ñ|Ń|Ņ|Ň|Н/' => 'N', + '/ñ|ń|ņ|ň|ʼn|н/' => 'n', + '/Ö|Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|О/' => 'O', + '/ö|ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|о/' => 'o', + '/П/' => 'P', + '/п/' => 'p', + '/Ŕ|Ŗ|Ř|Р/' => 'R', + '/ŕ|ŗ|ř|р/' => 'r', + '/Ś|Ŝ|Ş|Ș|Š|С/' => 'S', + '/ś|ŝ|ş|ș|š|ſ|с/' => 's', + '/Ţ|Ț|Ť|Ŧ|Т/' => 'T', + '/ţ|ț|ť|ŧ|т/' => 't', + '/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ü|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|У/' => 'U', + '/ù|ú|û|ũ|ū|ŭ|ů|ü|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|у/' => 'u', + '/В/' => 'V', + '/в/' => 'v', + '/Ý|Ÿ|Ŷ|Ы/' => 'Y', + '/ý|ÿ|ŷ|ы/' => 'y', + '/Ŵ/' => 'W', + '/ŵ/' => 'w', + '/Ź|Ż|Ž|З/' => 'Z', + '/ź|ż|ž|з/' => 'z', + '/Æ|Ǽ/' => 'AE', + '/ß/'=> 'ss', + '/IJ/' => 'IJ', + '/ij/' => 'ij', + '/Œ/' => 'OE', + '/Ч/' => 'Ch', + '/ч/' => 'ch', + '/Ю/' => 'Ju', + '/ю/' => 'ju', + '/Я/' => 'Ja', + '/я/' => 'ja', + '/Ш/' => 'Sh', + '/ш/' => 'sh', + '/Щ/' => 'Shch', + '/щ/' => 'shch', + '/Ж/' => 'Zh', + '/ж/' => 'zh', + + ), + +); \ No newline at end of file diff --git a/laravel/tests/application/controllers/admin/panel.php b/laravel/tests/application/controllers/admin/panel.php new file mode 100644 index 00000000..da3b49d7 --- /dev/null +++ b/laravel/tests/application/controllers/admin/panel.php @@ -0,0 +1,10 @@ +filter('before', 'test-all-before'); + $this->filter('after', 'test-all-after'); + $this->filter('before', 'test-profile-before')->only(array('profile')); + $this->filter('before', 'test-except')->except(array('index', 'profile')); + $this->filter('before', 'test-on-post')->on(array('post')); + $this->filter('before', 'test-on-get-put')->on(array('get', 'put')); + $this->filter('before', 'test-before-filter')->only('login'); + $this->filter('after', 'test-before-filter')->only('logout'); + $this->filter('before', 'test-param:1,2')->only('edit'); + $this->filter('before', 'test-multi-1|test-multi-2')->only('save'); + } + + public function action_index() + { + return __FUNCTION__; + } + + public function action_profile() + { + return __FUNCTION__; + } + + public function action_show() + { + return __FUNCTION__; + } + + public function action_edit() + { + return __FUNCTION__; + } + + public function action_save() + { + return __FUNCTION__; + } + + public function action_login() + { + return __FUNCTION__; + } + + public function action_logout() + { + return __FUNCTION__; + } + +} \ No newline at end of file diff --git a/laravel/tests/application/controllers/home.php b/laravel/tests/application/controllers/home.php new file mode 100644 index 00000000..3f442005 --- /dev/null +++ b/laravel/tests/application/controllers/home.php @@ -0,0 +1,42 @@ + '« Previous', + 'next' => 'Next »', + +); \ No newline at end of file diff --git a/laravel/tests/application/language/en/validation.php b/laravel/tests/application/language/en/validation.php new file mode 100644 index 00000000..5c6354dd --- /dev/null +++ b/laravel/tests/application/language/en/validation.php @@ -0,0 +1,96 @@ + "The :attribute must be accepted.", + "active_url" => "The :attribute is not a valid URL.", + "alpha" => "The :attribute may only contain letters.", + "alpha_dash" => "The :attribute may only contain letters, numbers, and dashes.", + "alpha_num" => "The :attribute may only contain letters and numbers.", + "between" => array( + "numeric" => "The :attribute must be between :min - :max.", + "file" => "The :attribute must be between :min - :max kilobytes.", + "string" => "The :attribute must be between :min - :max characters.", + ), + "confirmed" => "The :attribute confirmation does not match.", + "different" => "The :attribute and :other must be different.", + "email" => "The :attribute format is invalid.", + "exists" => "The selected :attribute is invalid.", + "image" => "The :attribute must be an image.", + "in" => "The selected :attribute is invalid.", + "integer" => "The :attribute must be an integer.", + "ip" => "The :attribute must be a valid IP address.", + "max" => array( + "numeric" => "The :attribute must be less than :max.", + "file" => "The :attribute must be less than :max kilobytes.", + "string" => "The :attribute must be less than :max characters.", + ), + "mimes" => "The :attribute must be a file of type: :values.", + "min" => array( + "numeric" => "The :attribute must be at least :min.", + "file" => "The :attribute must be at least :min kilobytes.", + "string" => "The :attribute must be at least :min characters.", + ), + "not_in" => "The selected :attribute is invalid.", + "numeric" => "The :attribute must be a number.", + "required" => "The :attribute field is required.", + "same" => "The :attribute and :other must match.", + "size" => array( + "numeric" => "The :attribute must be :size.", + "file" => "The :attribute must be :size kilobyte.", + "string" => "The :attribute must be :size characters.", + ), + "unique" => "The :attribute has already been taken.", + "url" => "The :attribute format is invalid.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array('custom_required' => 'This field is required!'), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array('test_attribute' => 'attribute'), + +); \ No newline at end of file diff --git a/laravel/tests/application/language/sp/validation.php b/laravel/tests/application/language/sp/validation.php new file mode 100644 index 00000000..b9bcbe74 --- /dev/null +++ b/laravel/tests/application/language/sp/validation.php @@ -0,0 +1,7 @@ + 'El campo de atributo es necesario.', + +); \ No newline at end of file diff --git a/laravel/tests/application/libraries/.gitignore b/laravel/tests/application/libraries/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/laravel/tests/application/migrations/.gitignore b/laravel/tests/application/migrations/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/laravel/tests/application/models/.gitignore b/laravel/tests/application/models/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/laravel/tests/application/models/autoloader.php b/laravel/tests/application/models/autoloader.php new file mode 100644 index 00000000..0e9027dc --- /dev/null +++ b/laravel/tests/application/models/autoloader.php @@ -0,0 +1,3 @@ + 'home', function() +{ + return View::make('home.index'); +})); + +Route::controller(array( + 'auth', 'filter', 'home', 'restful', + 'template.basic', 'template.name', 'template.override', + 'admin.panel', +)); + +/* +|-------------------------------------------------------------------------- +| Route Filters +|-------------------------------------------------------------------------- +| +| Filters provide a convenient method for attaching functionality to your +| routes. The built-in "before" and "after" filters are called before and +| after every request to your application, and you may even create other +| filters that can be attached to individual routes. +| +| Let's walk through an example... +| +| First, define a filter: +| +| Filter::register('filter', function() +| { +| return 'Filtered!'; +| }); +| +| Next, attach the filter to a route: +| +| Router::register('GET /', array('before' => 'filter', function() +| { +| return 'Hello World!'; +| })); +| +*/ + +Filter::register('before', function() +{ + $_SERVER['before'] = true; +}); + +Filter::register('after', function() +{ + $_SERVER['after'] = true; +}); + +Filter::register('csrf', function() +{ + if (Request::forged()) return Response::error('500'); +}); + +Filter::register('auth', function() +{ + if (Auth::guest()) return Redirect::to('login'); +}); \ No newline at end of file diff --git a/laravel/tests/application/start.php b/laravel/tests/application/start.php new file mode 100644 index 00000000..085dd090 --- /dev/null +++ b/laravel/tests/application/start.php @@ -0,0 +1,157 @@ + path('app').'controllers/base.php', +)); + +/* +|-------------------------------------------------------------------------- +| Auto-Loader Directories +|-------------------------------------------------------------------------- +| +| The Laravel auto-loader can search directories for files using the PSR-0 +| naming convention. This convention basically organizes classes by using +| the class namespace to indicate the directory structure. +| +*/ + +Autoloader::directories(array( + path('app').'models', + path('app').'libraries', +)); + +/* +|-------------------------------------------------------------------------- +| Laravel View Loader +|-------------------------------------------------------------------------- +| +| The Laravel view loader is responsible for returning the full file path +| for the given bundle and view. Of course, a default implementation is +| provided to load views according to typical Laravel conventions but +| you may change this to customize how your views are organized. +| +*/ + +Event::listen(View::loader, function($bundle, $view) +{ + return View::file($bundle, $view, Bundle::path($bundle).'views'); +}); + +/* +|-------------------------------------------------------------------------- +| Laravel Language Loader +|-------------------------------------------------------------------------- +| +| The Laravel language loader is responsible for returning the array of +| language lines for a given bundle, language, and "file". A default +| implementation has been provided which uses the default language +| directories included with Laravel. +| +*/ + +Event::listen(Lang::loader, function($bundle, $language, $file) +{ + return Lang::file($bundle, $language, $file); +}); + +/* +|-------------------------------------------------------------------------- +| Enable The Blade View Engine +|-------------------------------------------------------------------------- +| +| The Blade view engine provides a clean, beautiful templating language +| for your application, including syntax for echoing data and all of +| the typical PHP control structures. We'll simply enable it here. +| +*/ + +Blade::sharpen(); + +/* +|-------------------------------------------------------------------------- +| Set The Default Timezone +|-------------------------------------------------------------------------- +| +| We need to set the default timezone for the application. This controls +| the timezone that will be used by any of the date methods and classes +| utilized by Laravel or your application. The timezone may be set in +| your application configuration file. +| +*/ + +date_default_timezone_set(Config::get('application.timezone')); + +/* +|-------------------------------------------------------------------------- +| Start / Load The User Session +|-------------------------------------------------------------------------- +| +| Sessions allow the web, which is stateless, to simulate state. In other +| words, sessions allow you to store information about the current user +| and state of your application. Here we'll just fire up the session +| if a session driver has been configured. +| +*/ + +if ( ! Request::cli() and Config::get('session.driver') !== '') +{ + Session::load(); +} \ No newline at end of file diff --git a/laravel/tests/application/tasks/.gitignore b/laravel/tests/application/tasks/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/laravel/tests/application/views/error/404.php b/laravel/tests/application/views/error/404.php new file mode 100644 index 00000000..9b9bf55b --- /dev/null +++ b/laravel/tests/application/views/error/404.php @@ -0,0 +1,103 @@ + + + + + + Error 404 - Not Found + + + + +
    + + +

    + +

    Server Error: 404 (Not Found)

    + +

    What does this mean?

    + +

    + We couldn't find the page you requested on our servers. We're really sorry + about that. It's our fault, not yours. We'll work hard to get this page + back online as soon as possible. +

    + +

    + Perhaps you would like to go to our ? +

    +
    + + \ No newline at end of file diff --git a/laravel/tests/application/views/error/500.php b/laravel/tests/application/views/error/500.php new file mode 100644 index 00000000..4dcd92ad --- /dev/null +++ b/laravel/tests/application/views/error/500.php @@ -0,0 +1,103 @@ + + + + + + Error 500 - Internal Server Error + + + + +
    + + +

    + +

    Server Error: 500 (Internal Server Error)

    + +

    What does this mean?

    + +

    + Something went wrong on our servers while we were processing your request. + We're really sorry about this, and will work hard to get this resolved as + soon as possible. +

    + +

    + Perhaps you would like to go to our ? +

    +
    + + \ No newline at end of file diff --git a/laravel/tests/application/views/home/index.php b/laravel/tests/application/views/home/index.php new file mode 100644 index 00000000..39497146 --- /dev/null +++ b/laravel/tests/application/views/home/index.php @@ -0,0 +1,122 @@ + + + + + + Laravel - A Framework For Web Artisans + + + + +
    +

    Welcome To Laravel

    + +

    A Framework For Web Artisans

    + +

    + You have successfully installed the Laravel framework. Laravel is a simple framework + that helps web artisans create beautiful, creative applications using elegant, expressive + syntax. You'll love using it. +

    + +

    Learn the terrain.

    + +

    + You've landed yourself on our default home page. The route that + is generating this page lives at: +

    + +
    APP_PATH/routes.php
    + +

    And the view sitting before you can be found at:

    + +
    APP_PATH/views/home/index.php
    + +

    Create something beautiful.

    + +

    + Now that you're up and running, it's time to start creating! + Here are some links to help you get started: +

    + + + +
    + + \ No newline at end of file diff --git a/laravel/tests/application/views/tests/basic.php b/laravel/tests/application/views/tests/basic.php new file mode 100644 index 00000000..c961dc2f --- /dev/null +++ b/laravel/tests/application/views/tests/basic.php @@ -0,0 +1 @@ + is \ No newline at end of file diff --git a/laravel/tests/application/views/tests/nested.php b/laravel/tests/application/views/tests/nested.php new file mode 100644 index 00000000..9ce498e5 --- /dev/null +++ b/laravel/tests/application/views/tests/nested.php @@ -0,0 +1 @@ +Taylor \ No newline at end of file diff --git a/laravel/tests/bundles/.gitignore b/laravel/tests/bundles/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/laravel/tests/bundles/dashboard/config/meta.php b/laravel/tests/bundles/dashboard/config/meta.php new file mode 100644 index 00000000..a82d1703 --- /dev/null +++ b/laravel/tests/bundles/dashboard/config/meta.php @@ -0,0 +1,7 @@ + 'dashboard', + +); \ No newline at end of file diff --git a/laravel/tests/bundles/dashboard/controllers/panel.php b/laravel/tests/bundles/dashboard/controllers/panel.php new file mode 100644 index 00000000..b532296d --- /dev/null +++ b/laravel/tests/bundles/dashboard/controllers/panel.php @@ -0,0 +1,10 @@ + 'dashboard', function() +{ + // +})); + +Route::controller('dashboard::panel'); \ No newline at end of file diff --git a/laravel/tests/bundles/dummy/routes.php b/laravel/tests/bundles/dummy/routes.php new file mode 100644 index 00000000..2117e2e0 --- /dev/null +++ b/laravel/tests/bundles/dummy/routes.php @@ -0,0 +1,6 @@ +assertTrue($container === Asset::container('foo')); + $this->assertInstanceOf('\\Laravel\\Asset_Container', $container); + } + + /** + * Test the Asset::container method for default container creation. + * + * @group laravel + */ + public function testDefaultContainerCreatedByDefault() + { + $this->assertEquals('default', Asset::container()->name); + } + + /** + * Test the Asset::__callStatic method. + * + * @group laravel + */ + public function testContainerMethodsCanBeDynamicallyCalled() + { + Asset::style('common', 'common.css'); + + $this->assertEquals('common.css', Asset::container()->assets['style']['common']['source']); + } + + /** + * Test the Asset_Container constructor. + * + * @group laravel + */ + public function testNameIsSetOnAssetContainerConstruction() + { + $container = $this->getContainer(); + + $this->assertEquals('foo', $container->name); + } + + /** + * Test the Asset_Container::add method. + * + * @group laravel + */ + public function testAddMethodProperlySniffsAssetType() + { + $container = $this->getContainer(); + + $container->add('jquery', 'jquery.js'); + $container->add('common', 'common.css'); + + $this->assertEquals('jquery.js', $container->assets['script']['jquery']['source']); + $this->assertEquals('common.css', $container->assets['style']['common']['source']); + } + + /** + * Test the Asset_Container::style method. + * + * @group laravel + */ + public function testStyleMethodProperlyRegistersAnAsset() + { + $container = $this->getContainer(); + + $container->style('common', 'common.css'); + + $this->assertEquals('common.css', $container->assets['style']['common']['source']); + } + + /** + * Test the Asset_Container::style method sets media attribute. + * + * @group laravel + */ + public function testStyleMethodProperlySetsMediaAttributeIfNotSet() + { + $container = $this->getContainer(); + + $container->style('common', 'common.css'); + + $this->assertEquals('all', $container->assets['style']['common']['attributes']['media']); + } + + /** + * Test the Asset_Container::style method sets media attribute. + * + * @group laravel + */ + public function testStyleMethodProperlyIgnoresMediaAttributeIfSet() + { + $container = $this->getContainer(); + + $container->style('common', 'common.css', array(), array('media' => 'print')); + + $this->assertEquals('print', $container->assets['style']['common']['attributes']['media']); + } + + /** + * Test the Asset_Container::script method. + * + * @group laravel + */ + public function testScriptMethodProperlyRegistersAnAsset() + { + $container = $this->getContainer(); + + $container->script('jquery', 'jquery.js'); + + $this->assertEquals('jquery.js', $container->assets['script']['jquery']['source']); + } + + /** + * Test the Asset_Container::add method properly sets dependencies. + * + * @group laravel + */ + public function testAddMethodProperlySetsDependencies() + { + $container = $this->getContainer(); + + $container->add('common', 'common.css', 'jquery'); + $container->add('jquery', 'jquery.js', array('jquery-ui')); + + $this->assertEquals(array('jquery'), $container->assets['style']['common']['dependencies']); + $this->assertEquals(array('jquery-ui'), $container->assets['script']['jquery']['dependencies']); + } + + /** + * Test the Asset_Container::add method properly sets attributes. + * + * @group laravel + */ + public function testAddMethodProperlySetsAttributes() + { + $container = $this->getContainer(); + + $container->add('common', 'common.css', array(), array('media' => 'print')); + $container->add('jquery', 'jquery.js', array(), array('defer')); + + $this->assertEquals(array('media' => 'print'), $container->assets['style']['common']['attributes']); + $this->assertEquals(array('defer'), $container->assets['script']['jquery']['attributes']); + } + + /** + * Test the Asset_Container::bundle method. + * + * @group laravel + */ + public function testBundleMethodCorrectlySetsTheAssetBundle() + { + $container = $this->getContainer(); + + $container->bundle('eloquent'); + + $this->assertEquals('eloquent', $container->bundle); + } + + /** + * Test the Asset_Container::path method. + * + * @group laravel + */ + public function testPathMethodReturnsCorrectPathForABundleAsset() + { + Config::set('application.url', 'http://localhost'); + + $container = $this->getContainer(); + + $container->bundle('eloquent'); + + $this->assertEquals('http://localhost/bundles/eloquent/foo.jpg', $container->path('foo.jpg')); + } + + /** + * Test the Asset_Container::path method. + * + * @group laravel + */ + public function testPathMethodReturnsCorrectPathForAnApplicationAsset() + { + Config::set('application.url', 'http://localhost'); + + $container = $this->getContainer(); + + $this->assertEquals('http://localhost/foo.jpg', $container->path('foo.jpg')); + } + + /** + * Test the Asset_Container::scripts method. + * + * @group laravel + */ + public function testScriptsCanBeRetrieved() + { + $container = $this->getContainer(); + + $container->script('dojo', 'dojo.js', array('jquery-ui')); + $container->script('jquery', 'jquery.js', array('jquery-ui', 'dojo')); + $container->script('jquery-ui', 'jquery-ui.js'); + + $scripts = $container->scripts(); + + $this->assertTrue(strpos($scripts, 'jquery.js') > 0); + $this->assertTrue(strpos($scripts, 'jquery.js') > strpos($scripts, 'jquery-ui.js')); + $this->assertTrue(strpos($scripts, 'dojo.js') > strpos($scripts, 'jquery-ui.js')); + } + + /** + * Test the Asset_Container::styles method. + * + * @group laravel + */ + public function testStylesCanBeRetrieved() + { + $container = $this->getContainer(); + + $container->style('dojo', 'dojo.css', array('jquery-ui'), array('media' => 'print')); + $container->style('jquery', 'jquery.css', array('jquery-ui', 'dojo')); + $container->style('jquery-ui', 'jquery-ui.css'); + + $styles = $container->styles(); + + $this->assertTrue(strpos($styles, 'jquery.css') > 0); + $this->assertTrue(strpos($styles, 'media="print"') > 0); + $this->assertTrue(strpos($styles, 'jquery.css') > strpos($styles, 'jquery-ui.css')); + $this->assertTrue(strpos($styles, 'dojo.css') > strpos($styles, 'jquery-ui.css')); + } + + /** + * Get an asset container instance. + * + * @param string $name + * @return Asset_Container + */ + private function getContainer($name = 'foo') + { + return new Laravel\Asset_Container($name); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/auth.test.php b/laravel/tests/cases/auth.test.php new file mode 100644 index 00000000..32f74805 --- /dev/null +++ b/laravel/tests/cases/auth.test.php @@ -0,0 +1,259 @@ +$user = null; + Session::$instance = null; + Config::set('database.default', 'sqlite'); + } + + /** + * Tear down the test environment. + */ + public function tearDown() + { + $_SERVER['auth.login.stub'] = null; + Cookie::$jar = array(); + Config::$items = array(); + Auth::driver()->$user = null; + Session::$instance = null; + Config::set('database.default', 'mysql'); + } + + /** + * Test the Auth::user method. + * + * @group laravel + */ + public function testUserMethodReturnsCurrentUser() + { + Auth::$user = 'Taylor'; + + $this->assertEquals('Taylor', Auth::user()); + } + + /** + * Test the Auth::check method. + * + * @group laravel + */ + public function testCheckMethodReturnsTrueWhenUserIsSet() + { + $this->assertTrue(AuthUserReturnsDummy::check()); + } + + /** + * Test the Auth::check method. + * + * @group laravel + */ + public function testCheckMethodReturnsFalseWhenNoUserIsSet() + { + $this->assertFalse(AuthUserReturnsNull::check()); + } + + /** + * Test the Auth::guest method. + * + * @group laravel + */ + public function testGuestReturnsTrueWhenNoUserIsSet() + { + $this->assertTrue(AuthUserReturnsNull::guest()); + } + + /** + * Test the Auth::guest method. + * + * @group laravel + */ + public function testGuestReturnsFalseWhenUserIsSet() + { + $this->assertFalse(AuthUserReturnsDummy::guest()); + } + + /** + * Test the Auth::user method. + * + * @group laravel + */ + public function testUserMethodReturnsNullWhenNoUserExistsAndNoRecallerExists() + { + Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); + + $this->assertNull(Auth::user()); + } + + /** + * Test the Auth::user method. + * + * @group laravel + */ + public function testUserReturnsUserByID() + { + Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); + Session::$instance->session['data'][Auth::user_key] = 1; + + $this->assertEquals('Taylor Otwell', Auth::user()->name); + } + + /** + * Test the Auth::user method. + * + * @group laravel + */ + public function testNullReturnedWhenUserIDNotValidInteger() + { + Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); + Session::$instance->session['data'][Auth::user_key] = 'asdlkasd'; + + $this->assertNull(Auth::user()); + } + + /** + * Test the Auth::recall method. + * + * @group laravel + */ + public function testUserCanBeRecalledViaCookie() + { + Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); + + $cookie = Crypter::encrypt('1|'.Str::random(40)); + Cookie::forever(Config::get('auth.cookie'), $cookie); + + $this->assertEquals('Taylor Otwell', AuthLoginStub::user()->name); + $this->assertTrue(AuthLoginStub::user() === $_SERVER['auth.login.stub']['user']); + } + + /** + * Test the Auth::attempt method. + * + * @group laravel + */ + public function testAttemptMethodReturnsFalseWhenCredentialsAreInvalid() + { + $this->assertFalse(Auth::attempt('foo', 'foo')); + $this->assertFalse(Auth::attempt('foo', null)); + $this->assertFalse(Auth::attempt(null, null)); + $this->assertFalse(Auth::attempt('taylor', 'password')); + $this->assertFalse(Auth::attempt('taylor', 232)); + } + + /** + * Test the Auth::attempt method. + * + * @group laravel + */ + public function testAttemptReturnsTrueWhenCredentialsAreCorrect() + { + $this->assertTrue(AuthLoginStub::attempt('taylor', 'password1')); + $this->assertEquals('Taylor Otwell', $_SERVER['auth.login.stub']['user']->name); + $this->assertFalse($_SERVER['auth.login.stub']['remember']); + + $this->assertTrue(AuthLoginStub::attempt('taylor', 'password1', true)); + $this->assertEquals('Taylor Otwell', $_SERVER['auth.login.stub']['user']->name); + $this->assertTrue($_SERVER['auth.login.stub']['remember']); + } + + /** + * Test Auth::login method. + * + * @group laravel + */ + public function testLoginMethodStoresUserKeyInSession() + { + Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); + + $user = new StdClass; + $user->id = 10; + Auth::login($user); + $this->assertEquals(10, Session::$instance->session['data'][Auth::user_key]); + + Auth::login(5); + $this->assertEquals(5, Session::$instance->session['data'][Auth::user_key]); + } + + /** + * Test the Auth::login method. + * + * @group laravel + */ + public function testLoginStoresRememberCookieWhenNeeded() + { + Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); + + // Set the session vars to make sure remember cookie uses them + Config::set('session.path', 'foo'); + Config::set('session.domain', 'bar'); + Config::set('session.secure', true); + + Auth::login(10, true); + $this->assertTrue(isset(Cookie::$jar[Config::get('auth.cookie')])); + + $cookie = Cookie::$jar[Config::get('auth.cookie')]['value']; + $cookie = explode('|', Crypter::decrypt($cookie)); + $this->assertEquals(10, $cookie[0]); + $this->assertEquals('foo', Cookie::$jar[Config::get('auth.cookie')]['path']); + $this->assertEquals('bar', Cookie::$jar[Config::get('auth.cookie')]['domain']); + $this->assertTrue(Cookie::$jar[Config::get('auth.cookie')]['secure']); + } + + /** + * Test the Auth::logout method. + * + * @group laravel + */ + public function testLogoutMethodLogsOutUser() + { + Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); + Session::$instance->session['data'][Auth::user_key] = 10; + + Config::set('auth.logout', function($user) { $_SERVER['auth.logout.stub'] = $user; }); + + Auth::$user = 'Taylor'; + Auth::logout(); + + $this->assertEquals('Taylor', $_SERVER['auth.logout.stub']); + $this->assertNull(Auth::$user); + $this->assertFalse(isset(Session::$instance->session['data'][Auth::user_key])); + $this->assertTrue(Cookie::$jar[Config::get('auth.cookie')]['minutes'] < 0); + } + +} + +class AuthUserReturnsNull extends Laravel\Auth { + + public static function user() {} + +} + +class AuthUserReturnsDummy extends Laravel\Auth { + + public static function user() { return 'Taylor'; } + +} + +class AuthLoginStub extends Laravel\Auth { + + public static function login($user, $remember = false) + { + $_SERVER['auth.login.stub'] = compact('user', 'remember'); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/autoloader.test.php b/laravel/tests/cases/autoloader.test.php new file mode 100644 index 00000000..80605447 --- /dev/null +++ b/laravel/tests/cases/autoloader.test.php @@ -0,0 +1,102 @@ + path('app').'models/foo.php', + )); + + $this->assertEquals(path('app').'models/foo.php', Autoloader::$mappings['Foo']); + } + + /** + * Test the Autoloader::alias method. + * + * @group laravel + */ + public function testAliasesCanBeRegistered() + { + Autoloader::alias('Foo\\Bar', 'Foo'); + + $this->assertEquals('Foo\\Bar', Autoloader::$aliases['Foo']); + } + + /** + * Test the Autoloader::directories method. + * + * @group laravel + */ + public function testPsrDirectoriesCanBeRegistered() + { + Autoloader::directories(array( + path('app').'foo'.DS.'bar', + path('app').'foo'.DS.'baz'.DS.DS, + )); + + $this->assertTrue(in_array(path('app').'foo'.DS.'bar'.DS, Autoloader::$directories)); + $this->assertTrue(in_array(path('app').'foo'.DS.'baz'.DS, Autoloader::$directories)); + } + + /** + * Test the Autoloader::namespaces method. + * + * @group laravel + */ + public function testNamespacesCanBeRegistered() + { + Autoloader::namespaces(array( + 'Autoloader_1' => path('bundle').'autoload'.DS.'models', + 'Autoloader_2' => path('bundle').'autoload'.DS.'libraries'.DS.DS, + )); + + $this->assertEquals(path('bundle').'autoload'.DS.'models'.DS, Autoloader::$namespaces['Autoloader_1\\']); + $this->assertEquals(path('bundle').'autoload'.DS.'libraries'.DS, Autoloader::$namespaces['Autoloader_2\\']); + } + + /** + * Test the loading of PSR-0 models and libraries. + * + * @group laravel + */ + public function testPsrLibrariesAndModelsCanBeLoaded() + { + $this->assertInstanceOf('User', new User); + $this->assertInstanceOf('Repositories\\User', new Repositories\User); + } + + /** + * Test the loading of hard-coded classes. + * + * @group laravel + */ + public function testHardcodedClassesCanBeLoaded() + { + Autoloader::map(array( + 'Autoloader_HardCoded' => path('app').'models'.DS.'autoloader.php', + )); + + $this->assertInstanceOf('Autoloader_HardCoded', new Autoloader_HardCoded); + } + + /** + * Test the loading of classes mapped by namespaces. + * + * @group laravel + */ + public function testClassesMappedByNamespaceCanBeLoaded() + { + Autoloader::namespaces(array( + 'Dashboard' => path('bundle').'dashboard'.DS.'models', + )); + + $this->assertInstanceOf('Dashboard\\Repository', new Dashboard\Repository); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/blade.test.php b/laravel/tests/cases/blade.test.php new file mode 100644 index 00000000..70e80b3b --- /dev/null +++ b/laravel/tests/cases/blade.test.php @@ -0,0 +1,63 @@ +assertEquals('', Blade::compile_string($blade1)); + $this->assertEquals('', Blade::compile_string($blade2)); + } + + /** + * Test the compilation of control structures. + * + * @group laravel + */ + public function testControlStructuresAreCreatedCorrectly() + { + $blade1 = "@if (true)\nfoo\n@endif"; + $blade2 = "@if (count(".'$something'.") > 0)\nfoo\n@endif"; + $blade3 = "@if (true)\nfoo\n@elseif (false)\nbar\n@endif"; + $blade4 = "@if (true)\nfoo\n@else\nbar\n@endif"; + + $this->assertEquals("\nfoo\n", Blade::compile_string($blade1)); + $this->assertEquals(" 0): ?>\nfoo\n", Blade::compile_string($blade2)); + $this->assertEquals("\nfoo\n\nbar\n", Blade::compile_string($blade3)); + $this->assertEquals("\nfoo\n\nbar\n", Blade::compile_string($blade4)); + } + + /** + * Test the compilation of yield statements. + * + * @group laravel + */ + public function testYieldsAreCompiledCorrectly() + { + $blade = "@yield('something')"; + + $this->assertEquals("", Blade::compile_string($blade)); + } + + /** + * Test the compilation of section statements. + * + * @group laravel + */ + public function testSectionsAreCompiledCorrectly() + { + $blade = "@section('something')\nfoo\n@endsection"; + + $this->assertEquals("\nfoo\n", Blade::compile_string($blade)); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/bundle.test.php b/laravel/tests/cases/bundle.test.php new file mode 100644 index 00000000..5a107d62 --- /dev/null +++ b/laravel/tests/cases/bundle.test.php @@ -0,0 +1,253 @@ + 'foo-baz')); + $this->assertEquals('foo-baz', Bundle::$bundles['foo-baz']['handles']); + $this->assertFalse(Bundle::$bundles['foo-baz']['auto']); + + Bundle::register('foo-bar', array()); + $this->assertFalse(Bundle::$bundles['foo-baz']['auto']); + $this->assertNull(Bundle::$bundles['foo-bar']['handles']); + + unset(Bundle::$bundles['foo-baz']); + unset(Bundle::$bundles['foo-bar']); + } + + /** + * Test the Bundle::start method. + * + * @group laravel + */ + public function testStartMethodStartsBundle() + { + $_SERVER['bundle.dummy.start'] = 0; + $_SERVER['bundle.dummy.routes'] = 0; + + $_SERVER['started.dummy'] = false; + + Event::listen('laravel.started: dummy', function() + { + $_SERVER['started.dummy'] = true; + }); + + Bundle::register('dummy'); + Bundle::start('dummy'); + + $this->assertTrue($_SERVER['started.dummy']); + $this->assertEquals(1, $_SERVER['bundle.dummy.start']); + $this->assertEquals(1, $_SERVER['bundle.dummy.routes']); + + Bundle::start('dummy'); + + $this->assertEquals(1, $_SERVER['bundle.dummy.start']); + $this->assertEquals(1, $_SERVER['bundle.dummy.routes']); + } + + /** + * Test Bundle::handles method. + * + * @group laravel + */ + public function testHandlesMethodReturnsBundleThatHandlesURI() + { + Bundle::register('foo', array('handles' => 'foo-bar')); + $this->assertEquals('foo', Bundle::handles('foo-bar/admin')); + unset(Bundle::$bundles['foo']); + } + + /** + * Test the Bundle::exist method. + * + * @group laravel + */ + public function testExistMethodIndicatesIfBundleExist() + { + $this->assertTrue(Bundle::exists('dashboard')); + $this->assertFalse(Bundle::exists('foo')); + } + + /** + * Test the Bundle::started method. + * + * @group laravel + */ + public function testStartedMethodIndicatesIfBundleIsStarted() + { + Bundle::register('dummy'); + Bundle::start('dummy'); + $this->assertTrue(Bundle::started('dummy')); + } + + /** + * Test the Bundle::prefix method. + * + * @group laravel + */ + public function testPrefixMethodReturnsCorrectPrefix() + { + $this->assertEquals('dummy::', Bundle::prefix('dummy')); + $this->assertEquals('', Bundle::prefix(DEFAULT_BUNDLE)); + } + + /** + * Test the Bundle::class_prefix method. + * + * @group laravel + */ + public function testClassPrefixMethodReturnsProperClassPrefixForBundle() + { + $this->assertEquals('Dummy_', Bundle::class_prefix('dummy')); + $this->assertEquals('', Bundle::class_prefix(DEFAULT_BUNDLE)); + } + + /** + * Test the Bundle::path method. + * + * @group laravel + */ + public function testPathMethodReturnsCorrectPath() + { + $this->assertEquals(path('app'), Bundle::path(null)); + $this->assertEquals(path('app'), Bundle::path(DEFAULT_BUNDLE)); + $this->assertEquals(path('bundle').'dashboard'.DS, Bundle::path('dashboard')); + } + + /** + * Test the Bundle::asset method. + * + * @group laravel + */ + public function testAssetPathReturnsPathToBundlesAssets() + { + Config::set('application.url', 'http://localhost'); + + $this->assertEquals('http://localhost/bundles/dashboard/', Bundle::assets('dashboard')); + $this->assertEquals('http://localhost/', Bundle::assets(DEFAULT_BUNDLE)); + + Config::set('application.url', ''); + } + + /** + * Test the Bundle::name method. + * + * @group laravel + */ + public function testBundleNameCanBeRetrievedFromIdentifier() + { + $this->assertEquals(DEFAULT_BUNDLE, Bundle::name('something')); + $this->assertEquals(DEFAULT_BUNDLE, Bundle::name('something.else')); + $this->assertEquals('bundle', Bundle::name('bundle::something.else')); + } + + /** + * Test the Bundle::element method. + * + * @group laravel + */ + public function testElementCanBeRetrievedFromIdentifier() + { + $this->assertEquals('something', Bundle::element('something')); + $this->assertEquals('something.else', Bundle::element('something.else')); + $this->assertEquals('something.else', Bundle::element('bundle::something.else')); + } + + /** + * Test the Bundle::identifier method. + * + * @group laravel + */ + public function testIdentifierCanBeConstructed() + { + $this->assertEquals('something.else', Bundle::identifier(DEFAULT_BUNDLE, 'something.else')); + $this->assertEquals('dashboard::something', Bundle::identifier('dashboard', 'something')); + $this->assertEquals('dashboard::something.else', Bundle::identifier('dashboard', 'something.else')); + } + + /** + * Test the Bundle::resolve method. + * + * @group laravel + */ + public function testBundleNamesCanBeResolved() + { + $this->assertEquals(DEFAULT_BUNDLE, Bundle::resolve('foo')); + $this->assertEquals('dashboard', Bundle::resolve('dashboard')); + } + + /** + * Test the Bundle::parse method. + * + * @group laravel + */ + public function testParseMethodReturnsElementAndIdentifier() + { + $this->assertEquals(array('application', 'something'), Bundle::parse('something')); + $this->assertEquals(array('application', 'something.else'), Bundle::parse('something.else')); + $this->assertEquals(array('dashboard', 'something'), Bundle::parse('dashboard::something')); + $this->assertEquals(array('dashboard', 'something.else'), Bundle::parse('dashboard::something.else')); + } + + /** + * Test the Bundle::get method. + * + * @group laravel + */ + public function testOptionMethodReturnsBundleOption() + { + $this->assertFalse(Bundle::option('dashboard', 'auto')); + $this->assertEquals('dashboard', Bundle::option('dashboard', 'location')); + } + + /** + * Test the Bundle::all method. + * + * @group laravel + */ + public function testAllMethodReturnsBundleArray() + { + Bundle::register('foo'); + $this->assertEquals(Bundle::$bundles, Bundle::all()); + unset(Bundle::$bundles['foo']); + } + + /** + * Test the Bundle::names method. + * + * @group laravel + */ + public function testNamesMethodReturnsBundleNames() + { + Bundle::register('foo'); + $this->assertEquals(array('dashboard', 'dummy', 'foo'), Bundle::names()); + unset(Bundle::$bundles['foo']); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/config.test.php b/laravel/tests/cases/config.test.php new file mode 100644 index 00000000..573b8cff --- /dev/null +++ b/laravel/tests/cases/config.test.php @@ -0,0 +1,79 @@ +assertEquals('UTF-8', Config::get('application.encoding')); + $this->assertEquals('mysql', Config::get('database.connections.mysql.driver')); + $this->assertEquals('dashboard', Config::get('dashboard::meta.bundle')); + } + + /** + * Test the Config::has method. + * + * @group laravel + */ + public function testHasMethodIndicatesIfConfigItemExists() + { + $this->assertFalse(Config::has('application.foo')); + $this->assertTrue(Config::has('application.encoding')); + } + + /** + * Test the Config::set method. + * + * @group laravel + */ + public function testConfigItemsCanBeSet() + { + Config::set('application.encoding', 'foo'); + Config::set('dashboard::meta.bundle', 'bar'); + + $this->assertEquals('foo', Config::get('application.encoding')); + $this->assertEquals('bar', Config::get('dashboard::meta.bundle')); + } + + /** + * Test that environment configurations are loaded correctly. + * + * @group laravel + */ + public function testEnvironmentConfigsOverrideNormalConfigurations() + { + $_SERVER['LARAVEL_ENV'] = 'local'; + + $this->assertEquals('sqlite', Config::get('database.default')); + + unset($_SERVER['LARAVEL_ENV']); + } + + /** + * Test that items can be set after the entire file has already been loaded. + * + * @group laravel + */ + public function testItemsCanBeSetAfterEntireFileIsLoaded() + { + Config::get('application'); + Config::set('application.key', 'taylor'); + $application = Config::get('application'); + + $this->assertEquals('taylor', $application['key']); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/controller.test.php b/laravel/tests/cases/controller.test.php new file mode 100644 index 00000000..9147bad9 --- /dev/null +++ b/laravel/tests/cases/controller.test.php @@ -0,0 +1,264 @@ +assertEquals('action_index', Controller::call('auth@index')->content); + $this->assertEquals('Admin_Panel_Index', Controller::call('admin.panel@index')->content); + $this->assertEquals('Taylor', Controller::call('auth@profile', array('Taylor'))->content); + $this->assertEquals('Dashboard_Panel_Index', Controller::call('dashboard::panel@index')->content); + } + + /** + * Test basic controller filters are called. + * + * @group laravel + */ + public function testAssignedBeforeFiltersAreRun() + { + $_SERVER['test-all-after'] = false; + $_SERVER['test-all-before'] = false; + + Controller::call('filter@index'); + + $this->assertTrue($_SERVER['test-all-after']); + $this->assertTrue($_SERVER['test-all-before']); + } + + /** + * Test that "only" filters only apply to their assigned methods. + * + * @group laravel + */ + public function testOnlyFiltersOnlyApplyToTheirAssignedMethods() + { + $_SERVER['test-profile-before'] = false; + + Controller::call('filter@index'); + + $this->assertFalse($_SERVER['test-profile-before']); + + Controller::call('filter@profile'); + + $this->assertTrue($_SERVER['test-profile-before']); + } + + /** + * Test that "except" filters only apply to the excluded methods. + * + * @group laravel + */ + public function testExceptFiltersOnlyApplyToTheExlucdedMethods() + { + $_SERVER['test-except'] = false; + + Controller::call('filter@index'); + Controller::call('filter@profile'); + + $this->assertFalse($_SERVER['test-except']); + + Controller::call('filter@show'); + + $this->assertTrue($_SERVER['test-except']); + } + + /** + * Test that filters can be constrained by the request method. + * + * @group laravel + */ + public function testFiltersCanBeConstrainedByRequestMethod() + { + $_SERVER['test-on-post'] = false; + + $_SERVER['REQUEST_METHOD'] = 'GET'; + Controller::call('filter@index'); + + $this->assertFalse($_SERVER['test-on-post']); + + $_SERVER['REQUEST_METHOD'] = 'POST'; + Controller::call('filter@index'); + + $this->assertTrue($_SERVER['test-on-post']); + + $_SERVER['test-on-get-put'] = false; + + $_SERVER['REQUEST_METHOD'] = 'POST'; + Controller::call('filter@index'); + + $this->assertFalse($_SERVER['test-on-get-put']); + + $_SERVER['REQUEST_METHOD'] = 'PUT'; + Controller::call('filter@index'); + + $this->assertTrue($_SERVER['test-on-get-put']); + } + + public function testGlobalBeforeFilterIsNotCalledByController() + { + $_SERVER['before'] = false; + $_SERVER['after'] = false; + + Controller::call('auth@index'); + + $this->assertFalse($_SERVER['before']); + $this->assertFalse($_SERVER['after']); + } + + /** + * Test that before filters can override the controller response. + * + * @group laravel + */ + public function testBeforeFiltersCanOverrideResponses() + { + $this->assertEquals('Filtered!', Controller::call('filter@login')->content); + } + + /** + * Test that after filters do not affect the response. + * + * @group laravel + */ + public function testAfterFiltersDoNotAffectControllerResponse() + { + $this->assertEquals('action_logout', Controller::call('filter@logout')->content); + } + + /** + * Test that filter parameters are passed to the filter. + * + * @group laravel + */ + public function testFilterParametersArePassedToTheFilter() + { + $this->assertEquals('12', Controller::call('filter@edit')->content); + } + + /** + * Test that multiple filters can be assigned to a single method. + * + * @group laravel + */ + public function testMultipleFiltersCanBeAssignedToAnAction() + { + $_SERVER['test-multi-1'] = false; + $_SERVER['test-multi-2'] = false; + + Controller::call('filter@save'); + + $this->assertTrue($_SERVER['test-multi-1']); + $this->assertTrue($_SERVER['test-multi-2']); + } + + /** + * Test Restful controllers respond by request method. + * + * @group laravel + */ + public function testRestfulControllersRespondWithRestfulMethods() + { + $_SERVER['REQUEST_METHOD'] = 'GET'; + + $this->assertEquals('get_index', Controller::call('restful@index')->content); + + $_SERVER['REQUEST_METHOD'] = 'PUT'; + + $this->assertEquals(404, Controller::call('restful@index')->status); + + $_SERVER['REQUEST_METHOD'] = 'POST'; + + $this->assertEquals('post_index', Controller::call('restful@index')->content); + } + + /** + * Test that the template is returned by template controllers. + * + * @group laravel + */ + public function testTemplateControllersReturnTheTemplate() + { + $response = Controller::call('template.basic@index'); + + $home = file_get_contents(path('app').'views/home/index.php'); + + $this->assertEquals($home, $response->content); + } + + /** + * Test that controller templates can be named views. + * + * @group laravel + */ + public function testControllerTemplatesCanBeNamedViews() + { + View::name('home.index', 'home'); + + $response = Controller::call('template.named@index'); + + $home = file_get_contents(path('app').'views/home/index.php'); + + $this->assertEquals($home, $response->content); + + View::$names = array(); + } + + /** + * Test that the "layout" method is called on the controller. + * + * @group laravel + */ + public function testTheTemplateCanBeOverriden() + { + $this->assertEquals('Layout', Controller::call('template.override@index')->content); + } + + /** + * Test the Controller::resolve method. + * + * @group laravel + */ + public function testResolveMethodChecksTheIoCContainer() + { + IoC::register('controller: home', function() + { + require_once path('app').'controllers/home.php'; + + $controller = new Home_Controller; + + $controller->foo = 'bar'; + + return $controller; + }); + + $controller = Controller::resolve(DEFAULT_BUNDLE, 'home'); + + $this->assertEquals('bar', $controller->foo); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/cookie.test.php b/laravel/tests/cases/cookie.test.php new file mode 100644 index 00000000..fb8faf65 --- /dev/null +++ b/laravel/tests/cases/cookie.test.php @@ -0,0 +1,94 @@ + 'bar'); + $this->assertTrue(Cookie::has('foo')); + $this->assertFalse(Cookie::has('bar')); + + Cookie::put('baz', 'foo'); + $this->assertTrue(Cookie::has('baz')); + } + + /** + * Test the Cookie::get method. + * + * @group laravel + */ + public function testGetMethodCanReturnValueOfCookies() + { + Cookie::$jar['foo'] = array('value' => 'bar'); + $this->assertEquals('bar', Cookie::get('foo')); + + Cookie::put('bar', 'baz'); + $this->assertEquals('baz', Cookie::get('bar')); + } + + /** + * Test Cookie::forever method. + * + * @group laravel + */ + public function testForeverShouldUseATonOfMinutes() + { + Cookie::forever('foo', 'bar'); + $this->assertEquals('bar', Cookie::$jar['foo']['value']); + $this->assertEquals(525600, Cookie::$jar['foo']['minutes']); + + Cookie::forever('bar', 'baz', 'path', 'domain', true); + $this->assertEquals('path', Cookie::$jar['bar']['path']); + $this->assertEquals('domain', Cookie::$jar['bar']['domain']); + $this->assertTrue(Cookie::$jar['bar']['secure']); + } + + /** + * Test the Cookie::forget method. + * + * @group laravel + */ + public function testForgetSetsCookieWithExpiration() + { + Cookie::forget('bar', 'path', 'domain', true); + $this->assertEquals(-2000, Cookie::$jar['bar']['minutes']); + $this->assertEquals('path', Cookie::$jar['bar']['path']); + $this->assertEquals('domain', Cookie::$jar['bar']['domain']); + $this->assertTrue(Cookie::$jar['bar']['secure']); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/database.test.php b/laravel/tests/cases/database.test.php new file mode 100644 index 00000000..84b1faaf --- /dev/null +++ b/laravel/tests/cases/database.test.php @@ -0,0 +1,74 @@ +assertTrue(isset(DB::$connections[Config::get('database.default')])); + + $connection = DatabaseConnectStub::connection('mysql'); + $this->assertTrue(isset(DB::$connections['mysql'])); + $this->assertEquals(DB::$connections['mysql']->pdo->laravel_config, Config::get('database.connections.mysql')); + } + + /** + * Test the DB::profile method. + * + * @group laravel + */ + public function testProfileMethodReturnsQueries() + { + Laravel\Database\Connection::$queries = array('Taylor'); + $this->assertEquals(array('Taylor'), DB::profile()); + Laravel\Database\Connection::$queries = array(); + } + + /** + * Test the __callStatic method. + * + * @group laravel + */ + public function testConnectionMethodsCanBeCalledStaticly() + { + $this->assertEquals('sqlite', DB::driver()); + } + +} + +class DatabaseConnectStub extends Laravel\Database { + + protected static function connect($config) { return new PDOStub($config); } + +} + +class PDOStub extends PDO { + + public $laravel_config; + + public function __construct($config) { $this->laravel_config = $config; } + + public function foo() { return 'foo'; } + +} \ No newline at end of file diff --git a/laravel/tests/cases/event.test.php b/laravel/tests/cases/event.test.php new file mode 100644 index 00000000..52063833 --- /dev/null +++ b/laravel/tests/cases/event.test.php @@ -0,0 +1,43 @@ +assertEquals(1, $responses[0]); + $this->assertEquals(2, $responses[1]); + } + + /** + * Test parameters can be passed to event listeners. + * + * @group laravel + */ + public function testParametersCanBePassedToEvents() + { + Event::listen('test.event', function($var) { return $var; }); + + $responses = Event::fire('test.event', array('Taylor')); + + $this->assertEquals('Taylor', $responses[0]); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/fluent.test.php b/laravel/tests/cases/fluent.test.php new file mode 100644 index 00000000..87c0e0db --- /dev/null +++ b/laravel/tests/cases/fluent.test.php @@ -0,0 +1,50 @@ + 'Taylor', 'age' => 25); + + $fluent = new Fluent($array); + + $this->assertEquals($array, $fluent->attributes); + } + + /** + * Test the Fluent::get method. + * + * @group laravel + */ + public function testGetMethodReturnsAttribute() + { + $fluent = new Fluent(array('name' => 'Taylor')); + + $this->assertEquals('Taylor', $fluent->get('name')); + $this->assertEquals('Default', $fluent->get('foo', 'Default')); + $this->assertEquals('Taylor', $fluent->name); + $this->assertNull($fluent->foo); + } + + public function testMagicMethodsCanBeUsedToSetAttributes() + { + $fluent = new Fluent; + + $fluent->name = 'Taylor'; + $fluent->developer(); + $fluent->age(25); + + $this->assertEquals('Taylor', $fluent->name); + $this->assertTrue($fluent->developer); + $this->assertEquals(25, $fluent->age); + $this->assertInstanceOf('Laravel\\Fluent', $fluent->programmer()); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/hash.test.php b/laravel/tests/cases/hash.test.php new file mode 100644 index 00000000..4dca2713 --- /dev/null +++ b/laravel/tests/cases/hash.test.php @@ -0,0 +1,37 @@ +assertTrue(strlen(Hash::make('taylor')) == 60); + } + + /** + * Test the Hash::check method. + * + * @group laravel + */ + public function testHashCheckFailsWhenNotMatching() + { + $hash = Hash::make('taylor'); + + $this->assertFalse(Hash::check('foo', $hash)); + } + + /** + * Test the Hash::check method. + * + * @group laravel + */ + public function testHashCheckPassesWhenMatches() + { + $this->assertTrue(Hash::check('taylor', Hash::make('taylor'))); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/input.test.php b/laravel/tests/cases/input.test.php new file mode 100644 index 00000000..76172c1e --- /dev/null +++ b/laravel/tests/cases/input.test.php @@ -0,0 +1,174 @@ +request->add(array('name' => 'Taylor')); + + $_FILES = array('age' => 25); + + $this->assertEquals(Input::all(), array('name' => 'Taylor', 'age' => 25)); + } + + /** + * Test the Input::has method. + * + * @group laravel + */ + public function testHasMethodIndicatesTheExistenceOfInput() + { + $this->assertFalse(Input::has('foo')); + + Request::foundation()->request->add(array('name' => 'Taylor')); + + $this->assertTrue(Input::has('name')); + } + + /** + * Test the Input::get method. + * + * @group laravel + */ + public function testGetMethodReturnsInputValue() + { + Request::foundation()->request->add(array('name' => 'Taylor')); + + $this->assertEquals('Taylor', Input::get('name')); + $this->assertEquals('Default', Input::get('foo', 'Default')); + } + + /** + * Test the Input::only method. + * + * @group laravel + */ + public function testOnlyMethodReturnsSubsetOfInput() + { + Request::foundation()->request->add(array('name' => 'Taylor', 'age' => 25)); + + $this->assertEquals(array('name' => 'Taylor'), Input::only(array('name'))); + } + + /** + * Test the Input::except method. + * + * @group laravel + */ + public function testExceptMethodReturnsSubsetOfInput() + { + Request::foundation()->request->add(array('name' => 'Taylor', 'age' => 25)); + + $this->assertEquals(array('age' => 25), Input::except(array('name'))); + } + + /** + * Test the Input::old method. + * + * @group laravel + */ + public function testOldInputCanBeRetrievedFromSession() + { + $this->setSession(); + + Session::$instance->session['data']['laravel_old_input'] = array('name' => 'Taylor'); + + $this->assertNull(Input::old('foo')); + $this->assertTrue(Input::had('name')); + $this->assertFalse(Input::had('foo')); + $this->assertEquals('Taylor', Input::old('name')); + } + + /** + * Test the Input::file method. + * + * @group laravel + */ + public function testFileMethodReturnsFromFileArray() + { + $_FILES['foo'] = array('name' => 'Taylor', 'size' => 100); + + $this->assertEquals('Taylor', Input::file('foo.name')); + $this->assertEquals(array('name' => 'Taylor', 'size' => 100), Input::file('foo')); + } + + /** + * Test the Input::flash method. + * + * @group laravel + */ + public function testFlashMethodFlashesInputToSession() + { + $this->setSession(); + + $input = array('name' => 'Taylor', 'age' => 25); + Request::foundation()->request->add($input); + + Input::flash(); + + $this->assertEquals($input, Session::$instance->session['data'][':new:']['laravel_old_input']); + + Input::flash('only', array('name')); + + $this->assertEquals(array('name' => 'Taylor'), Session::$instance->session['data'][':new:']['laravel_old_input']); + + Input::flash('except', array('name')); + + $this->assertEquals(array('age' => 25), Session::$instance->session['data'][':new:']['laravel_old_input']); + } + + /** + * Test the Input::flush method. + * + * @group laravel + */ + public function testFlushMethodClearsFlashedInput() + { + $this->setSession(); + + $input = array('name' => 'Taylor'); + Request::foundation()->request->add($input); + + Input::flash(); + + $this->assertEquals($input, Session::$instance->session['data'][':new:']['laravel_old_input']); + + Input::flush(); + + $this->assertEquals(array(), Session::$instance->session['data'][':new:']['laravel_old_input']); + } + + /** + * Set the session payload instance. + */ + protected function setSession() + { + $driver = $this->getMock('Laravel\\Session\\Drivers\\Driver'); + + Session::$instance = new Laravel\Session\Payload($driver); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/ioc.test.php b/laravel/tests/cases/ioc.test.php new file mode 100644 index 00000000..56918337 --- /dev/null +++ b/laravel/tests/cases/ioc.test.php @@ -0,0 +1,74 @@ +assertEquals('Taylor', IoC::resolve('foo')); + } + + /** + * Test that singletons are created once. + * + * @group laravel + */ + public function testSingletonsAreCreatedOnce() + { + IoC::singleton('foo', function() + { + return new StdClass; + }); + + $object = IoC::resolve('foo'); + + $this->assertTrue($object === IoC::resolve('foo')); + } + + /** + * Test the IoC::instance method. + * + * @group laravel + */ + public function testInstancesAreReturnedBySingleton() + { + $object = new StdClass; + + IoC::instance('bar', $object); + + $this->assertTrue($object === IoC::resolve('bar')); + } + + /** + * Test the IoC::registered method. + */ + public function testRegisteredMethodIndicatesIfRegistered() + { + IoC::register('foo', function() {}); + + $this->assertTrue(IoC::registered('foo')); + $this->assertFalse(IoC::registered('baz')); + } + + /** + * Test the IoC::controller method. + * + * @group laravel + */ + public function testControllerMethodRegistersAController() + { + IoC::register('controller: ioc.test', function() {}); + + $this->assertTrue(IoC::registered('controller: ioc.test')); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/lang.test.php b/laravel/tests/cases/lang.test.php new file mode 100644 index 00000000..74640ccd --- /dev/null +++ b/laravel/tests/cases/lang.test.php @@ -0,0 +1,68 @@ +assertEquals($validation['required'], Lang::line('validation.required')->get()); + $this->assertEquals('Taylor', Lang::line('validation.foo')->get(null, 'Taylor')); + } + + /** + * Test the Lang::line method. + * + * @group laravel + */ + public function testGetMethodCanGetLinesForAGivenLanguage() + { + $validation = require path('app').'language/sp/validation.php'; + + $this->assertEquals($validation['required'], Lang::line('validation.required')->get('sp')); + } + + /** + * Test the __toString method. + * + * @group laravel + */ + public function testLineCanBeCastAsString() + { + $validation = require path('app').'language/en/validation.php'; + + $this->assertEquals($validation['required'], (string) Lang::line('validation.required')); + } + + /** + * Test that string replacements are made on lines. + * + * @group laravel + */ + public function testReplacementsAreMadeOnLines() + { + $validation = require path('app').'language/en/validation.php'; + + $line = str_replace(':attribute', 'e-mail', $validation['required']); + + $this->assertEquals($line, Lang::line('validation.required', array('attribute' => 'e-mail'))->get()); + } + + /** + * Test the Lang::has method. + * + * @group laravel + */ + public function testHasMethodIndicatesIfLangaugeLineExists() + { + $this->assertTrue(Lang::has('validation')); + $this->assertTrue(Lang::has('validation.required')); + $this->assertFalse(Lang::has('validation.foo')); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/messages.test.php b/laravel/tests/cases/messages.test.php new file mode 100644 index 00000000..f007ecb7 --- /dev/null +++ b/laravel/tests/cases/messages.test.php @@ -0,0 +1,115 @@ +messages = new Laravel\Messages; + } + + /** + * Test the Messages::add method. + * + * @group laravel + */ + public function testAddingMessagesDoesNotCreateDuplicateMessages() + { + $this->messages->add('email', 'test'); + $this->messages->add('email', 'test'); + $this->assertCount(1, $this->messages->messages); + } + + /** + * Test the Messages::add method. + * + * @group laravel + */ + public function testAddMethodPutsMessageInMessagesArray() + { + $this->messages->add('email', 'test'); + $this->assertArrayHasKey('email', $this->messages->messages); + $this->assertEquals('test', $this->messages->messages['email'][0]); + } + + /** + * Test the Messages::has method. + * + * @group laravel + */ + public function testHasMethodReturnsTrue() + { + $this->messages->add('email', 'test'); + $this->assertTrue($this->messages->has('email')); + } + + /** + * Test the Messages::has method. + * + * @group laravel + */ + public function testHasMethodReturnsFalse() + { + $this->assertFalse($this->messages->has('something')); + } + + /** + * Test the Messages::first method. + * + * @group laravel + */ + public function testFirstMethodReturnsSingleString() + { + $this->messages->add('email', 'test'); + $this->assertEquals('test', $this->messages->first('email')); + $this->assertEquals('', $this->messages->first('something')); + } + + /** + * Test the Messages::get method. + * + * @group laravel + */ + public function testGetMethodReturnsAllMessagesForAttribute() + { + $messages = array('email' => array('something', 'else')); + $this->messages->messages = $messages; + $this->assertEquals(array('something', 'else'), $this->messages->get('email')); + } + + /** + * Test the Messages::all method. + * + * @group laravel + */ + public function testAllMethodReturnsAllErrorMessages() + { + $messages = array('email' => array('something', 'else'), 'name' => array('foo')); + $this->messages->messages = $messages; + $this->assertEquals(array('something', 'else', 'foo'), $this->messages->all()); + } + + /** + * Test the Messages::get method. + * + * @group laravel + */ + public function testMessagesRespectFormat() + { + $this->messages->add('email', 'test'); + $this->assertEquals('

    test

    ', $this->messages->first('email', '

    :message

    ')); + $this->assertEquals(array('

    test

    '), $this->messages->get('email', '

    :message

    ')); + $this->assertEquals(array('

    test

    '), $this->messages->all('

    :message

    ')); + } + + +} \ No newline at end of file diff --git a/laravel/tests/cases/query.test.php b/laravel/tests/cases/query.test.php new file mode 100644 index 00000000..17279150 --- /dev/null +++ b/laravel/tests/cases/query.test.php @@ -0,0 +1,48 @@ +assertEquals('taylor@example.com', $this->query()->find(1)->email); + } + + /** + * Test the select method. + * + * @group laravel + */ + public function testSelectMethodLimitsColumns() + { + $result = $this->query()->select(array('email'))->first(); + + $this->assertTrue(isset($result->email)); + $this->assertFalse(isset($result->name)); + } + + /** + * Test the raw_where method. + * + * @group laravel + */ + public function testRawWhereCanBeUsed() + { + + } + + /** + * Get the query instance for the test case. + * + * @return Query + */ + protected function query() + { + return DB::table('query_test'); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/redirect.test.php b/laravel/tests/cases/redirect.test.php new file mode 100644 index 00000000..2e6fb193 --- /dev/null +++ b/laravel/tests/cases/redirect.test.php @@ -0,0 +1,143 @@ +assertEquals(302, $redirect->status); + $this->assertEquals('http://localhost/user/profile', $redirect->headers['location']); + + $redirect = Redirect::to('user/profile', 301, true); + + $this->assertEquals(301, $redirect->status); + $this->assertEquals('https://localhost/user/profile', $redirect->headers['location']); + + $redirect = Redirect::to_secure('user/profile', 301); + + $this->assertEquals(301, $redirect->status); + $this->assertEquals('https://localhost/user/profile', $redirect->headers['location']); + } + + /** + * Test the Redirect::to_route method. + * + * @group laravel + */ + public function testRedirectsCanBeGeneratedForNamedRoutes() + { + Route::get('redirect', array('as' => 'redirect')); + Route::get('redirect/(:any)/(:any)', array('as' => 'redirect-2')); + Route::get('secure/redirect', array('https' => true, 'as' => 'redirect-3')); + + $this->assertEquals(301, Redirect::to_route('redirect', array(), 301, true)->status); + $this->assertEquals('http://localhost/redirect', Redirect::to_route('redirect')->headers['location']); + $this->assertEquals('https://localhost/secure/redirect', Redirect::to_route('redirect-3', array(), 302)->headers['location']); + $this->assertEquals('http://localhost/redirect/1/2', Redirect::to_route('redirect-2', array('1', '2'))->headers['location']); + } + + /** + * Test the Redirect::with method. + * + * @group laravel + */ + public function testWithMethodFlashesItemToSession() + { + $this->setSession(); + + $redirect = Redirect::to('')->with('name', 'Taylor'); + + $this->assertEquals('Taylor', Session::$instance->session['data'][':new:']['name']); + } + + /** + * Test the Redirect::with_input function. + * + * @group laravel + */ + public function testWithInputMethodFlashesInputToTheSession() + { + $this->setSession(); + + $input = array('name' => 'Taylor', 'age' => 25); + Request::foundation()->request->add($input); + + $redirect = Redirect::to('')->with_input(); + + $this->assertEquals($input, Session::$instance->session['data'][':new:']['laravel_old_input']); + + $redirect = Redirect::to('')->with_input('only', array('name')); + + $this->assertEquals(array('name' => 'Taylor'), Session::$instance->session['data'][':new:']['laravel_old_input']); + + $redirect = Redirect::to('')->with_input('except', array('name')); + + $this->assertEquals(array('age' => 25), Session::$instance->session['data'][':new:']['laravel_old_input']); + } + + /** + * Test the Redirect::with_errors method. + * + * @group laravel + */ + public function testWithErrorsFlashesErrorsToTheSession() + { + $this->setSession(); + + Redirect::to('')->with_errors(array('name' => 'Taylor')); + + $this->assertEquals(array('name' => 'Taylor'), Session::$instance->session['data'][':new:']['errors']); + + $validator = Validator::make(array(), array()); + $validator->errors = array('name' => 'Taylor'); + + Redirect::to('')->with_errors($validator); + + $this->assertEquals(array('name' => 'Taylor'), Session::$instance->session['data'][':new:']['errors']); + } + + /** + * Set the session payload instance. + */ + protected function setSession() + { + $driver = $this->getMock('Laravel\\Session\\Drivers\\Driver'); + + Session::$instance = new Laravel\Session\Payload($driver); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/request.test.php b/laravel/tests/cases/request.test.php new file mode 100644 index 00000000..d3e6b479 --- /dev/null +++ b/laravel/tests/cases/request.test.php @@ -0,0 +1,147 @@ +assertEquals('POST', Request::method()); + + $_POST[Request::spoofer] = 'PUT'; + + $this->assertEquals('PUT', Request::method()); + } + + /** + * Test the Request::server method. + * + * @group laravel + */ + public function testServerMethodReturnsFromServerArray() + { + $_SERVER = array('TEST' => 'something', 'USER' => array('NAME' => 'taylor')); + + $this->assertEquals('something', Request::server('test')); + $this->assertEquals('taylor', Request::server('user.name')); + } + + /** + * Test the Request::ip method. + * + * @group laravel + */ + public function testIPMethodReturnsClientIPAddress() + { + $_SERVER['REMOTE_ADDR'] = 'something'; + $this->assertEquals('something', Request::ip()); + + $_SERVER['HTTP_CLIENT_IP'] = 'something'; + $this->assertEquals('something', Request::ip()); + + $_SERVER['HTTP_X_FORWARDED_FOR'] = 'something'; + $this->assertEquals('something', Request::ip()); + + $_SERVER = array(); + $this->assertEquals('0.0.0.0', Request::ip()); + } + + /** + * Test the Request::protocol method. + * + * @group laravel + */ + public function testProtocolMethodReturnsProtocol() + { + $_SERVER['SERVER_PROTOCOL'] = 'taylor'; + $this->assertEquals('taylor', Request::protocol()); + + unset($_SERVER['SERVER_PROTOCOL']); + $this->assertEquals('HTTP/1.1', Request::protocol()); + } + + /** + * Test the Request::secure method. + * + * @group laravel + */ + public function testSecureMethodsIndicatesIfHTTPS() + { + $_SERVER['HTTPS'] = 'on'; + + $this->assertTrue(Request::secure()); + + $_SERVER['HTTPS'] = 'off'; + + $this->assertFalse(Request::secure()); + } + + /** + * Test the Request::ajax method. + * + * @group laravel + */ + public function testAjaxMethodIndicatesWhenAjax() + { + $this->assertFalse(Request::ajax()); + + $_SERVER['HTTP_X_REQUESTED_WITH'] = 'xmlhttprequest'; + + $this->assertTrue(Request::ajax()); + } + + /** + * Test the Request::forged method. + * + * @group laravel + */ + public function testForgedMethodIndicatesIfRequestWasForged() + { + Session::$instance = new SessionPayloadTokenStub; + + $input = array(Session::csrf_token => 'Foo'); + Request::foundation()->request->add($input); + + $this->assertTrue(Request::forged()); + + $input = array(Session::csrf_token => 'Taylor'); + Request::foundation()->request->add($input); + + $this->assertFalse(Request::forged()); + } + + /** + * Test the Request::route method. + * + * @group laravel + */ + public function testRouteMethodReturnsStaticRoute() + { + Request::$route = 'Taylor'; + + $this->assertEquals('Taylor', Request::route()); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/response.test.php b/laravel/tests/cases/response.test.php new file mode 100644 index 00000000..5907eebd --- /dev/null +++ b/laravel/tests/cases/response.test.php @@ -0,0 +1,88 @@ + 'baz')); + + $this->assertEquals('foo', $response->content); + $this->assertEquals(201, $response->status); + $this->assertEquals(array('bar' => 'baz'), $response->headers); + } + + /** + * Test the Response::view method. + * + * @group laravel + */ + public function testViewMethodSetsContentToView() + { + $response = Response::view('home.index', array('name' => 'Taylor')); + + $this->assertEquals('home.index', $response->content->view); + $this->assertEquals('Taylor', $response->content->data['name']); + } + + /** + * Test the Response::error method. + * + * @group laravel + */ + public function testErrorMethodSetsContentToErrorView() + { + $response = Response::error('404', array('name' => 'Taylor')); + + $this->assertEquals(404, $response->status); + $this->assertEquals('error.404', $response->content->view); + $this->assertEquals('Taylor', $response->content->data['name']); + } + + /** + * Test the Response::prepare method. + * + * @group laravel + */ + public function testPrepareMethodCreatesAResponseInstanceFromGivenValue() + { + $response = Response::prepare('Taylor'); + + $this->assertInstanceOf('Laravel\\Response', $response); + $this->assertEquals('Taylor', $response->content); + + $response = Response::prepare(new Response('Taylor')); + + $this->assertInstanceOf('Laravel\\Response', $response); + $this->assertEquals('Taylor', $response->content); + } + + /** + * Test the Response::header method. + * + * @group laravel + */ + public function testHeaderMethodSetsValueInHeaderArray() + { + $response = Response::make('')->header('foo', 'bar'); + + $this->assertEquals('bar', $response->headers['foo']); + } + + /** + * Test the Response::status method. + * + * @group laravel + */ + public function testStatusMethodSetsStatusCode() + { + $response = Response::make('')->status(404); + + $this->assertEquals(404, $response->status); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/route.test.php b/laravel/tests/cases/route.test.php new file mode 100644 index 00000000..48919135 --- /dev/null +++ b/laravel/tests/cases/route.test.php @@ -0,0 +1,179 @@ + 'profile')); + $this->assertTrue($route->is('profile')); + $this->assertFalse($route->is('something')); + } + + /** + * Test the basic execution of a route. + * + * @group laravel + */ + public function testBasicRoutesCanBeExecutedProperly() + { + $route = new Route('GET', '', array(function() { return 'Route!'; })); + + $this->assertEquals('Route!', $route->call()->content); + $this->assertInstanceOf('Laravel\\Response', $route->call()); + } + + /** + * Test that route parameters are passed into the handlers. + * + * @group laravel + */ + public function testRouteParametersArePassedIntoTheHandler() + { + $route = new Route('GET', '', array(function($var) { return $var; }), array('Taylor')); + + $this->assertEquals('Taylor', $route->call()->content); + $this->assertInstanceOf('Laravel\\Response', $route->call()); + } + + /** + * Test that calling a route calls the global before and after filters. + * + * @group laravel + */ + public function testCallingARouteCallsTheBeforeAndAfterFilters() + { + $route = new Route('GET', '', array(function() { return 'Hi!'; })); + + $_SERVER['before'] = false; + $_SERVER['after'] = false; + + $route->call(); + + $this->assertTrue($_SERVER['before']); + $this->assertTrue($_SERVER['after']); + } + + /** + * Test that before filters override the route response. + * + * @group laravel + */ + public function testBeforeFiltersOverrideTheRouteResponse() + { + Filter::register('test-before', function() + { + return 'Filtered!'; + }); + + $route = new Route('GET', '', array('before' => 'test-before', function() { + return 'Route!'; + })); + + $this->assertEquals('Filtered!', $route->call()->content); + } + + /** + * Test that after filters do not affect the route response. + * + * @group laravel + */ + public function testAfterFilterDoesNotAffectTheResponse() + { + $_SERVER['test-after'] = false; + + Filter::register('test-after', function() + { + $_SERVER['test-after'] = true; + return 'Filtered!'; + }); + + $route = new Route('GET', '', array('after' => 'test-after', function() + { + return 'Route!'; + })); + + $this->assertEquals('Route!', $route->call()->content); + $this->assertTrue($_SERVER['test-after']); + } + + /** + * Test that the route calls the appropriate controller method when delegating. + * + * @group laravel + */ + public function testControllerActionCalledWhenDelegating() + { + $_SERVER['REQUEST_METHOD'] = 'GET'; + + $route = new Route('GET', '', array('uses' => 'auth@index')); + + $this->assertEquals('action_index', $route->call()->content); + } + + /** + * Test that filter parameters are passed to the filter. + * + * @group laravel + */ + public function testFilterParametersArePassedToFilter() + { + Filter::register('test-params', function($var1, $var2) + { + return $var1.$var2; + }); + + $route = new Route('GET', '', array('before' => 'test-params:1,2')); + + $this->assertEquals('12', $route->call()->content); + } + + /** + * Test that multiple filters can be assigned to a route. + * + * @group laravel + */ + public function testMultipleFiltersCanBeAssignedToARoute() + { + $_SERVER['test-multi-1'] = false; + $_SERVER['test-multi-2'] = false; + + Filter::register('test-multi-1', function() { $_SERVER['test-multi-1'] = true; }); + Filter::register('test-multi-2', function() { $_SERVER['test-multi-2'] = true; }); + + $route = new Route('GET', '', array('before' => 'test-multi-1|test-multi-2')); + + $route->call(); + + $this->assertTrue($_SERVER['test-multi-1']); + $this->assertTrue($_SERVER['test-multi-2']); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/routing.test.php b/laravel/tests/cases/routing.test.php new file mode 100644 index 00000000..68a112a0 --- /dev/null +++ b/laravel/tests/cases/routing.test.php @@ -0,0 +1,160 @@ + 'home')); + Route::get('dashboard', array('as' => 'dashboard')); + + $home = Router::find('home'); + $dashboard = Router::find('dashboard'); + + $this->assertTrue(isset($home['/'])); + $this->assertTrue(isset($dashboard['dashboard'])); + } + + /** + * Test the basic routing mechanism. + * + * @group laravel + */ + public function testBasicRouteCanBeRouted() + { + Route::get('/', function() {}); + Route::get('home, main', function() {}); + + $this->assertEquals('/', Router::route('GET', '/')->uri); + $this->assertEquals('home', Router::route('GET', 'home')->uri); + $this->assertEquals('main', Router::route('GET', 'main')->uri); + } + + /** + * Test that the router can handle basic wildcards. + * + * @group laravel + */ + public function testWildcardRoutesCanBeRouted() + { + Route::get('user/(:num)', function() {}); + Route::get('profile/(:any)/(:num)', function() {}); + + $this->assertNull(Router::route('GET', 'user/1.5')); + $this->assertNull(Router::route('GET', 'user/taylor')); + $this->assertEquals(array(25), Router::route('GET', 'user/25')->parameters); + $this->assertEquals('user/(:num)', Router::route('GET', 'user/1')->uri); + + $this->assertNull(Router::route('GET', 'profile/1/otwell')); + $this->assertNull(Router::route('POST', 'profile/taylor/1')); + $this->assertNull(Router::route('GET', 'profile/taylor/otwell')); + $this->assertNull(Router::route('GET', 'profile/taylor/1/otwell')); + $this->assertEquals(array('taylor', 25), Router::route('GET', 'profile/taylor/25')->parameters); + $this->assertEquals('profile/(:any)/(:num)', Router::route('GET', 'profile/taylor/1')->uri); + } + + /** + * Test that optional wildcards can be routed. + * + * @group laravel + */ + public function testOptionalWildcardsCanBeRouted() + { + Route::get('user/(:num?)', function() {}); + Route::get('profile/(:any)/(:any?)', function() {}); + + $this->assertNull(Router::route('GET', 'user/taylor')); + $this->assertEquals('user/(:num?)', Router::route('GET', 'user')->uri); + $this->assertEquals(array(25), Router::route('GET', 'user/25')->parameters); + $this->assertEquals('user/(:num?)', Router::route('GET', 'user/1')->uri); + + $this->assertNull(Router::route('GET', 'profile/taylor/otwell/test')); + $this->assertEquals('profile/(:any)/(:any?)', Router::route('GET', 'profile/taylor')->uri); + $this->assertEquals('profile/(:any)/(:any?)', Router::route('GET', 'profile/taylor/25')->uri); + $this->assertEquals('profile/(:any)/(:any?)', Router::route('GET', 'profile/taylor/otwell')->uri); + $this->assertEquals(array('taylor', 'otwell'), Router::route('GET', 'profile/taylor/otwell')->parameters); + } + + /** + * Test that basic controller routing is working. + * + * @group laravel + */ + public function testBasicRouteToControllerIsRouted() + { + $this->assertEquals('auth@(:1)', Router::route('GET', 'auth')->action['uses']); + $this->assertEquals('home@(:1)', Router::route('GET', 'home/index')->action['uses']); + $this->assertEquals('home@(:1)', Router::route('GET', 'home/profile')->action['uses']); + $this->assertEquals('admin.panel@(:1)', Router::route('GET', 'admin/panel')->action['uses']); + $this->assertEquals('admin.panel@(:1)', Router::route('GET', 'admin/panel/show')->action['uses']); + } + + /** + * Test basic bundle route resolution. + * + * @group laravel + */ + public function testRoutesToBundlesCanBeResolved() + { + $this->assertNull(Router::route('GET', 'dashboard/foo')); + $this->assertEquals('dashboard', Router::route('GET', 'dashboard')->uri); + } + + /** + * Test bundle controller route resolution. + * + * @group laravel + */ + public function testBundleControllersCanBeResolved() + { + $this->assertEquals('dashboard::panel@(:1)', Router::route('GET', 'dashboard/panel')->action['uses']); + $this->assertEquals('dashboard::panel@(:1)', Router::route('GET', 'dashboard/panel/show')->action['uses']); + } + + /** + * Test foreign characters can be used in routes. + * + * @group laravel + */ + public function testForeignCharsInRoutes() + { + Route::get(urlencode('مدرس_رياضيات').'/(:any)', function() {}); + Route::get(urlencode('مدرس_رياضيات'), function() {}); + Route::get(urlencode('ÇœŪ'), function() {}); + Route::get(urlencode('私は料理が大好き'), function() {}); + + $this->assertEquals(array(urlencode('مدرس_رياضيات')), Router::route('GET', urlencode('مدرس_رياضيات').'/'.urlencode('مدرس_رياضيات'))->parameters); + $this->assertEquals(urlencode('مدرس_رياضيات'), Router::route('GET', urlencode('مدرس_رياضيات'))->uri); + $this->assertEquals(urlencode('ÇœŪ'), Router::route('GET', urlencode('ÇœŪ'))->uri); + $this->assertEquals(urlencode('私は料理が大好き'), Router::route('GET', urlencode('私は料理が大好き'))->uri); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/session.test.php b/laravel/tests/cases/session.test.php new file mode 100644 index 00000000..2c7ccdc9 --- /dev/null +++ b/laravel/tests/cases/session.test.php @@ -0,0 +1,441 @@ +assertEquals('Foo', Session::test()); + } + + /** + * Test the Session::started method. + * + * @group laravel + */ + public function testStartedMethodIndicatesIfSessionIsStarted() + { + $this->assertFalse(Session::started()); + Session::$instance = 'foo'; + $this->assertTrue(Session::started()); + } + + /** + * Test the Payload::load method. + * + * @group laravel + */ + public function testLoadMethodCreatesNewSessionWithNullIDGiven() + { + $payload = $this->getPayload(); + $payload->load(null); + $this->verifyNewSession($payload); + } + + /** + * Test the Payload::load method. + * + * @group laravel + */ + public function testLoadMethodCreatesNewSessionWhenSessionIsExpired() + { + $payload = $this->getPayload(); + + $session = $this->getSession(); + $session['last_activity'] = time() - 10000; + + $payload->driver->expects($this->any()) + ->method('load') + ->will($this->returnValue($session)); + + $payload->load('foo'); + + $this->verifyNewSession($payload); + $this->assertTrue($payload->session['id'] !== $session['id']); + } + + /** + * Assert that a session is new. + * + * @param Payload $payload + * @return void + */ + protected function verifyNewSession($payload) + { + $this->assertFalse($payload->exists); + $this->assertTrue(isset($payload->session['id'])); + $this->assertEquals(array(), $payload->session['data'][':new:']); + $this->assertEquals(array(), $payload->session['data'][':old:']); + $this->assertTrue(isset($payload->session['data'][Session::csrf_token])); + } + + /** + * Test the Payload::load method. + * + * @group laravel + */ + public function testLoadMethodSetsValidSession() + { + $payload = $this->getPayload(); + + $session = $this->getSession(); + + $payload->driver->expects($this->any()) + ->method('load') + ->will($this->returnValue($session)); + + $payload->load('foo'); + + $this->assertEquals($session, $payload->session); + } + + /** + * Test the Payload::load method. + * + * @group laravel + */ + public function testLoadMethodSetsCSRFTokenIfDoesntExist() + { + $payload = $this->getPayload(); + + $session = $this->getSession(); + + unset($session['data']['csrf_token']); + + $payload->driver->expects($this->any()) + ->method('load') + ->will($this->returnValue($session)); + + $payload->load('foo'); + + $this->assertEquals('foo', $payload->session['id']); + $this->assertTrue(isset($payload->session['data']['csrf_token'])); + } + + /** + * Test the various data retrieval methods. + * + * @group laravel + */ + public function testSessionDataCanBeRetrievedProperly() + { + $payload = $this->getPayload(); + + $payload->session = $this->getSession(); + + $this->assertTrue($payload->has('name')); + $this->assertEquals('Taylor', $payload->get('name')); + $this->assertFalse($payload->has('foo')); + $this->assertEquals('Default', $payload->get('foo', 'Default')); + $this->assertTrue($payload->has('votes')); + $this->assertEquals(10, $payload->get('votes')); + $this->assertTrue($payload->has('state')); + $this->assertEquals('AR', $payload->get('state')); + } + + /** + * Test the various data manipulation methods. + * + * @group laravel + */ + public function testDataCanBeSetProperly() + { + $payload = $this->getPayload(); + + $payload->session = $this->getSession(); + + // Test the "put" and "flash" methods. + $payload->put('name', 'Weldon'); + $this->assertEquals('Weldon', $payload->session['data']['name']); + $payload->flash('language', 'php'); + $this->assertEquals('php', $payload->session['data'][':new:']['language']); + + // Test the "reflash" method. + $payload->session['data'][':new:'] = array('name' => 'Taylor'); + $payload->session['data'][':old:'] = array('age' => 25); + $payload->reflash(); + $this->assertEquals(array('name' => 'Taylor', 'age' => 25), $payload->session['data'][':new:']); + + // Test the "keep" method. + $payload->session['data'][':new:'] = array(); + $payload->keep(array('age')); + $this->assertEquals(25, $payload->session['data'][':new:']['age']); + } + + /** + * Test the Payload::forget method. + * + * @group laravel + */ + public function testSessionDataCanBeForgotten() + { + $payload = $this->getPayload(); + + $payload->session = $this->getSession(); + + $this->assertTrue(isset($payload->session['data']['name'])); + $payload->forget('name'); + $this->assertFalse(isset($payload->session['data']['name'])); + } + + /** + * Test the Payload::flush method. + * + * @group laravel + */ + public function testFlushMaintainsTokenButDeletesEverythingElse() + { + $payload = $this->getPayload(); + + $payload->session = $this->getSession(); + + $this->assertTrue(isset($payload->session['data']['name'])); + $payload->flush(); + $this->assertFalse(isset($payload->session['data']['name'])); + $this->assertEquals('bar', $payload->session['data']['csrf_token']); + $this->assertEquals(array(), $payload->session['data'][':new:']); + $this->assertEquals(array(), $payload->session['data'][':old:']); + } + + /** + * Test the Payload::regenerate method. + * + * @group laravel + */ + public function testRegenerateMethodSetsNewIDAndTurnsOffExistenceIndicator() + { + $payload = $this->getPayload(); + + $payload->sesion = $this->getSession(); + $payload->exists = true; + $payload->regenerate(); + + $this->assertFalse($payload->exists); + $this->assertTrue(strlen($payload->session['id']) == 40); + } + + /** + * Test the Payload::token method. + * + * @group laravel + */ + public function testTokenMethodReturnsCSRFToken() + { + $payload = $this->getPayload(); + $payload->session = $this->getSession(); + + $this->assertEquals('bar', $payload->token()); + } + + /** + * Test the Payload::save method. + * + * @group laravel + */ + public function testSaveMethodCorrectlyCallsDriver() + { + $payload = $this->getPayload(); + $session = $this->getSession(); + $payload->session = $session; + $payload->exists = true; + $config = Laravel\Config::get('session'); + + $expect = $session; + $expect['data'][':old:'] = $session['data'][':new:']; + $expect['data'][':new:'] = array(); + + $payload->driver->expects($this->once()) + ->method('save') + ->with($this->equalTo($expect), $this->equalTo($config), $this->equalTo(true)); + + $payload->save(); + + $this->assertEquals($session['data'][':new:'], $payload->session['data'][':old:']); + } + + /** + * Test the Payload::save method. + * + * @group laravel + */ + public function testSaveMethodSweepsIfSweeperAndOddsHitWithTimeGreaterThanThreshold() + { + Config::set('session.sweepage', array(100, 100)); + + $payload = $this->getPayload(); + $payload->driver = $this->getMock('Laravel\\Session\\Drivers\\File', array('save', 'sweep'), array(null)); + $payload->session = $this->getSession(); + + $expiration = time() - (Config::get('session.lifetime') * 60); + + // Here we set the time to the expected expiration minus 5 seconds, just to + // allow plenty of room for PHP execution. In the next test, we'll do the + // same thing except add 5 seconds to check that the time is between a + // given window. + $payload->driver->expects($this->once()) + ->method('sweep') + ->with($this->greaterThan($expiration - 5)); + + $payload->save(); + + Config::set('session.sweepage', array(2, 100)); + } + + /** + * Test the Payload::save method. + * + * @group laravel + */ + public function testSaveMethodSweepsIfSweeperAndOddsHitWithTimeLessThanThreshold() + { + Config::set('session.sweepage', array(100, 100)); + + $payload = $this->getPayload(); + $payload->driver = $this->getMock('Laravel\\Session\\Drivers\\File', array('save', 'sweep'), array(null)); + $payload->session = $this->getSession(); + + $expiration = time() - (Config::get('session.lifetime') * 60); + + $payload->driver->expects($this->once()) + ->method('sweep') + ->with($this->lessThan($expiration + 5)); + + $payload->save(); + + Config::set('session.sweepage', array(2, 100)); + } + + /** + * Test that the session sweeper is never called if not a sweeper. + * + * @group laravel + */ + public function testSweeperShouldntBeCalledIfDriverIsntSweeper() + { + Config::set('session.sweepage', array(100, 100)); + + $payload = $this->getPayload(); + $payload->driver = $this->getMock('Laravel\\Session\\Drivers\\APC', array('save', 'sweep'), array(), '', false); + $payload->session = $this->getSession(); + + $payload->driver->expects($this->never())->method('sweep'); + + $payload->save(); + + Config::set('session.sweepage', array(2, 100)); + } + + /** + * Test the Payload::save method. + * + * @group laravel + */ + public function testSaveMethodSetsCookieWithCorrectValues() + { + $payload = $this->getPayload(); + $payload->session = $this->getSession(); + $payload->save(); + + $this->assertTrue(isset(Cookie::$jar[Config::get('session.cookie')])); + + $cookie = Cookie::$jar[Config::get('session.cookie')]; + + $this->assertEquals('foo', $cookie['value']); + $this->assertEquals(Config::get('session.lifetime'), $cookie['minutes']); + $this->assertEquals(Config::get('session.domain'), $cookie['domain']); + $this->assertEquals(Config::get('session.path'), $cookie['path']); + $this->assertEquals(Config::get('session.secure'), $cookie['secure']); + } + + /** + * Test the Session::activity method. + * + * @group laravel + */ + public function testActivityMethodReturnsLastActivity() + { + $payload = $this->getPayload(); + $payload->session['last_activity'] = 10; + $this->assertEquals(10, $payload->activity()); + } + + /** + * Get a session payload instance. + * + * @return Payload + */ + protected function getPayload() + { + return new Payload($this->getMockDriver()); + } + + /** + * Get a mock driver instance. + * + * @return Driver + */ + protected function getMockDriver() + { + $mock = $this->getMock('Laravel\\Session\\Drivers\\Driver', array('id', 'load', 'save', 'delete')); + + $mock->expects($this->any())->method('id')->will($this->returnValue(Str::random(40))); + + return $mock; + } + + /** + * Get a dummy session. + * + * @return array + */ + protected function getSession() + { + return array( + 'id' => 'foo', + 'last_activity' => time(), + 'data' => array( + 'name' => 'Taylor', + 'age' => 25, + 'csrf_token' => 'bar', + ':new:' => array( + 'votes' => 10, + ), + ':old:' => array( + 'state' => 'AR', + ), + )); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/str.test.php b/laravel/tests/cases/str.test.php new file mode 100644 index 00000000..7daab540 --- /dev/null +++ b/laravel/tests/cases/str.test.php @@ -0,0 +1,133 @@ +assertEquals('UTF-8', Config::get('application.encoding')); + Config::set('application.encoding', 'foo'); + $this->assertEquals('foo', Config::get('application.encoding')); + Config::set('application.encoding', 'UTF-8'); + } + + /** + * Test the Str::length method. + * + * @group laravel + */ + public function testStringLengthIsCorrect() + { + $this->assertEquals(6, Str::length('Taylor')); + $this->assertEquals(5, Str::length('ラドクリフ')); + } + + /** + * Test the Str::lower method. + * + * @group laravel + */ + public function testStringCanBeConvertedToLowercase() + { + $this->assertEquals('taylor', Str::lower('TAYLOR')); + $this->assertEquals('άχιστη', Str::lower('ΆΧΙΣΤΗ')); + } + + /** + * Test the Str::upper method. + * + * @group laravel + */ + public function testStringCanBeConvertedToUppercase() + { + $this->assertEquals('TAYLOR', Str::upper('taylor')); + $this->assertEquals('ΆΧΙΣΤΗ', Str::upper('άχιστη')); + } + + /** + * Test the Str::title method. + * + * @group laravel + */ + public function testStringCanBeConvertedToTitleCase() + { + $this->assertEquals('Taylor', Str::title('taylor')); + $this->assertEquals('Άχιστη', Str::title('άχιστη')); + } + + /** + * Test the Str::limit method. + * + * @group laravel + */ + public function testStringCanBeLimitedByCharacters() + { + $this->assertEquals('Tay...', Str::limit('Taylor', 3)); + $this->assertEquals('Taylor', Str::limit('Taylor', 6)); + $this->assertEquals('Tay___', Str::limit('Taylor', 3, '___')); + } + + /** + * Test the Str::words method. + * + * @group laravel + */ + public function testStringCanBeLimitedByWords() + { + $this->assertEquals('Taylor...', Str::words('Taylor Otwell', 1)); + $this->assertEquals('Taylor___', Str::words('Taylor Otwell', 1, '___')); + $this->assertEquals('Taylor Otwell', Str::words('Taylor Otwell', 3)); + } + + /** + * Test the Str::plural and Str::singular methods. + * + * @group laravel + */ + public function testStringsCanBeSingularOrPlural() + { + $this->assertEquals('user', Str::singular('users')); + $this->assertEquals('users', Str::plural('user')); + $this->assertEquals('User', Str::singular('Users')); + $this->assertEquals('Users', Str::plural('User')); + $this->assertEquals('user', Str::plural('user', 1)); + $this->assertEquals('users', Str::plural('user', 2)); + } + + /** + * Test the Str::slug method. + * + * @group laravel + */ + public function testStringsCanBeSlugged() + { + $this->assertEquals('my-new-post', Str::slug('My nEw post!!!')); + $this->assertEquals('my_new_post', Str::slug('My nEw post!!!', '_')); + } + + /** + * Test the Str::classify method. + * + * @group laravel + */ + public function testStringsCanBeClassified() + { + $this->assertEquals('Something_Else', Str::classify('something.else')); + $this->assertEquals('Something_Else', Str::classify('something_else')); + } + + /** + * Test the Str::random method. + * + * @group laravel + */ + public function testRandomStringsCanBeGenerated() + { + $this->assertEquals(40, strlen(Str::random(40))); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/uri.test.php b/laravel/tests/cases/uri.test.php new file mode 100644 index 00000000..be779ecf --- /dev/null +++ b/laravel/tests/cases/uri.test.php @@ -0,0 +1,59 @@ +assertEquals($expectation, URI::current()); + } + + /** + * Test the URI::segment method. + * + * @group laravel + */ + public function testSegmentMethodReturnsAURISegment() + { + $_SERVER['REQUEST_URI'] = 'http://localhost/index.php/user/profile'; + + $this->assertEquals('user', URI::segment(1)); + $this->assertEquals('profile', URI::segment(2)); + } + + /** + * Data provider for the URI::current test. + */ + public function requestUriProvider() + { + return array( + array('/index.php', '/'), + array('/index.php/', '/'), + array('http://localhost/user', 'user'), + array('http://localhost/user/', 'user'), + array('http://localhost/index.php', '/'), + array('http://localhost/index.php/', '/'), + array('http://localhost/index.php//', '/'), + array('http://localhost/index.php/user', 'user'), + array('http://localhost/index.php/user/', 'user'), + array('http://localhost/index.php/user/profile', 'user/profile'), + ); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/url.test.php b/laravel/tests/cases/url.test.php new file mode 100644 index 00000000..393211be --- /dev/null +++ b/laravel/tests/cases/url.test.php @@ -0,0 +1,106 @@ +assertEquals('http://localhost/index.php/user/profile', URL::to('user/profile')); + $this->assertEquals('https://localhost/index.php/user/profile', URL::to('user/profile', true)); + + Config::set('application.index', ''); + + $this->assertEquals('http://localhost/user/profile', URL::to('user/profile')); + $this->assertEquals('https://localhost/user/profile', URL::to('user/profile', true)); + + Config::set('application.ssl', false); + + $this->assertEquals('http://localhost/user/profile', URL::to('user/profile', true)); + } + + /** + * Test the URL::to_action method. + * + * @group laravel + */ + public function testToActionMethodGeneratesURLToControllerAction() + { + Route::get('foo/bar/(:any?)', 'foo@baz'); + $this->assertEquals('http://localhost/index.php/x/y', URL::to_action('x@y')); + $this->assertEquals('http://localhost/index.php/x/y/Taylor', URL::to_action('x@y', array('Taylor'))); + $this->assertEquals('http://localhost/index.php/foo/bar', URL::to_action('foo@baz')); + $this->assertEquals('http://localhost/index.php/foo/bar/Taylor', URL::to_action('foo@baz', array('Taylor'))); + } + + /** + * Test the URL::to_asset method. + * + * @group laravel + */ + public function testToAssetGeneratesURLWithoutFrontControllerInURL() + { + $this->assertEquals('http://localhost/image.jpg', URL::to_asset('image.jpg')); + $this->assertEquals('https://localhost/image.jpg', URL::to_asset('image.jpg', true)); + + Config::set('application.index', ''); + + $this->assertEquals('http://localhost/image.jpg', URL::to_asset('image.jpg')); + $this->assertEquals('https://localhost/image.jpg', URL::to_asset('image.jpg', true)); + + Request::foundation()->server->add(array('HTTPS' => 'on')); + + $this->assertEquals('https://localhost/image.jpg', URL::to_asset('image.jpg')); + } + + /** + * Test the URL::to_route method. + * + * @group laravel + */ + public function testToRouteMethodGeneratesURLsToRoutes() + { + Route::get('url/test', array('as' => 'url-test')); + Route::get('url/test/(:any)/(:any?)', array('as' => 'url-test-2')); + Route::get('url/secure/(:any)/(:any?)', array('as' => 'url-test-3', 'https' => true)); + + $this->assertEquals('http://localhost/index.php/url/test', URL::to_route('url-test')); + $this->assertEquals('http://localhost/index.php/url/test/taylor', URL::to_route('url-test-2', array('taylor'))); + $this->assertEquals('https://localhost/index.php/url/secure/taylor', URL::to_route('url-test-3', array('taylor'))); + $this->assertEquals('http://localhost/index.php/url/test/taylor/otwell', URL::to_route('url-test-2', array('taylor', 'otwell'))); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/validator.test.php b/laravel/tests/cases/validator.test.php new file mode 100644 index 00000000..bde1cea1 --- /dev/null +++ b/laravel/tests/cases/validator.test.php @@ -0,0 +1,669 @@ + 'Taylor Otwell'); + $rules = array('name' => 'required'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['name'] = ''; + $this->assertFalse(Validator::make($input, $rules)->valid()); + + unset($input['name']); + $this->assertFalse(Validator::make($input, $rules)->valid()); + + $_FILES['name']['tmp_name'] = 'foo'; + $this->assertTrue(Validator::make($_FILES, $rules)->valid()); + + $_FILES['name']['tmp_name'] = ''; + $this->assertFalse(Validator::make($_FILES, $rules)->valid()); + } + + /** + * Test the confirmed validation rule. + * + * @group laravel + */ + public function testTheConfirmedRule() + { + $input = array('password' => 'foo', 'password_confirmation' => 'foo'); + $rules = array('password' => 'confirmed'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['password_confirmation'] = 'foo_bar'; + $this->assertFalse(Validator::make($input, $rules)->valid()); + + unset($input['password_confirmation']); + $this->assertFalse(Validator::make($input, $rules)->valid()); + } + + /** + * Test the different validation rule. + * + * @group laravel + */ + public function testTheDifferentRule() + { + $input = array('password' => 'foo', 'password_confirmation' => 'bar'); + $rules = array('password' => 'different:password_confirmation'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['password_confirmation'] = 'foo'; + $this->assertFalse(Validator::make($input, $rules)->valid()); + + unset($input['password_confirmation']); + $this->assertFalse(Validator::make($input, $rules)->valid()); + } + + /** + * Test the accepted validation rule. + * + * @group laravel + */ + public function testTheAcceptedRule() + { + $input = array('terms' => '1'); + $rules = array('terms' => 'accepted'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['terms'] = 'yes'; + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['terms'] = '2'; + $this->assertFalse(Validator::make($input, $rules)->valid()); + + // The accepted rule implies required, so should fail if field not present. + unset($input['terms']); + $this->assertFalse(Validator::make($input, $rules)->valid()); + } + + /** + * Test the numeric validation rule. + * + * @group laravel + */ + public function testTheNumericRule() + { + $input = array('amount' => '1.21'); + $rules = array('amount' => 'numeric'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['amount'] = '1'; + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['amount'] = 1.2; + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['amount'] = '1.2a'; + $this->assertFalse(Validator::make($input, $rules)->valid()); + } + + /** + * Test the integer validation rule. + * + * @group laravel + */ + public function testTheIntegerRule() + { + $input = array('amount' => '1'); + $rules = array('amount' => 'integer'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['amount'] = '0'; + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['amount'] = 1.2; + $this->assertFalse(Validator::make($input, $rules)->valid()); + + $input['amount'] = '1.2a'; + $this->assertFalse(Validator::make($input, $rules)->valid()); + } + + /** + * Test the size validation rule. + * + * @group laravel + */ + public function testTheSizeRule() + { + $input = array('amount' => '1.21'); + $rules = array('amount' => 'numeric|size:1.21'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $rules = array('amount' => 'numeric|size:1'); + $this->assertFalse(Validator::make($input, $rules)->valid()); + + // If no numeric rule is on the field, it is treated as a string + $input = array('amount' => '111'); + $rules = array('amount' => 'size:3'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $rules = array('amount' => 'size:4'); + $this->assertFalse(Validator::make($input, $rules)->valid()); + + // The size rules checks kilobytes on files + $_FILES['photo']['tmp_name'] = 'foo'; + $_FILES['photo']['size'] = 10240; + $rules = array('photo' => 'size:10'); + $this->assertTrue(Validator::make($_FILES, $rules)->valid()); + + $_FILES['photo']['size'] = 14000; + $this->assertFalse(Validator::make($_FILES, $rules)->valid()); + } + + /** + * Test the between validation rule. + * + * @group laravel + */ + public function testTheBetweenRule() + { + $input = array('amount' => '1.21'); + $rules = array('amount' => 'numeric|between:1,2'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $rules = array('amount' => 'numeric|between:2,3'); + $this->assertFalse(Validator::make($input, $rules)->valid()); + + // If no numeric rule is on the field, it is treated as a string + $input = array('amount' => '111'); + $rules = array('amount' => 'between:1,3'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $rules = array('amount' => 'between:100,111'); + $this->assertFalse(Validator::make($input, $rules)->valid()); + + // The size rules checks kilobytes on files + $_FILES['photo']['tmp_name'] = 'foo'; + $_FILES['photo']['size'] = 10240; + $rules = array('photo' => 'between:9,11'); + $this->assertTrue(Validator::make($_FILES, $rules)->valid()); + + $_FILES['photo']['size'] = 14000; + $this->assertFalse(Validator::make($_FILES, $rules)->valid()); + } + + /** + * Test the between validation rule. + * + * @group laravel + */ + public function testTheMinRule() + { + $input = array('amount' => '1.21'); + $rules = array('amount' => 'numeric|min:1'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $rules = array('amount' => 'numeric|min:2'); + $this->assertFalse(Validator::make($input, $rules)->valid()); + + // If no numeric rule is on the field, it is treated as a string + $input = array('amount' => '01'); + $rules = array('amount' => 'min:2'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $rules = array('amount' => 'min:3'); + $this->assertFalse(Validator::make($input, $rules)->valid()); + + // The size rules checks kilobytes on files + $_FILES['photo']['tmp_name'] = 'foo'; + $_FILES['photo']['size'] = 10240; + $rules = array('photo' => 'min:9'); + $this->assertTrue(Validator::make($_FILES, $rules)->valid()); + + $_FILES['photo']['size'] = 8000; + $this->assertFalse(Validator::make($_FILES, $rules)->valid()); + } + + /** + * Test the between validation rule. + * + * @group laravel + */ + public function testTheMaxRule() + { + $input = array('amount' => '1.21'); + $rules = array('amount' => 'numeric|max:2'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $rules = array('amount' => 'numeric|max:1'); + $this->assertFalse(Validator::make($input, $rules)->valid()); + + // If no numeric rule is on the field, it is treated as a string + $input = array('amount' => '01'); + $rules = array('amount' => 'max:3'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $rules = array('amount' => 'max:1'); + $this->assertFalse(Validator::make($input, $rules)->valid()); + + // The size rules checks kilobytes on files + $_FILES['photo']['tmp_name'] = 'foo'; + $_FILES['photo']['size'] = 10240; + $rules = array('photo' => 'max:11'); + $this->assertTrue(Validator::make($_FILES, $rules)->valid()); + + $_FILES['photo']['size'] = 140000; + $this->assertFalse(Validator::make($_FILES, $rules)->valid()); + } + + /** + * Test the in validation rule. + * + * @group laravel + */ + public function testTheInRule() + { + $input = array('size' => 'L'); + $rules = array('size' => 'in:S,M,L'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['size'] = 'XL'; + $this->assertFalse(Validator::make($input, $rules)->valid()); + } + + /** + * Test the not-in validation rule. + * + * @group laravel + */ + public function testTheNotInRule() + { + $input = array('size' => 'L'); + $rules = array('size' => 'not_in:S,M,L'); + $this->assertFalse(Validator::make($input, $rules)->valid()); + + $input['size'] = 'XL'; + $this->assertTrue(Validator::make($input, $rules)->valid()); + } + + /** + * Test the IP validation rule. + * + * @group laravel + */ + public function testTheIPRule() + { + $input = array('ip' => '192.168.1.1'); + $rules = array('ip' => 'ip'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['ip'] = '192.111'; + $this->assertFalse(Validator::make($input, $rules)->valid()); + } + + /** + * Test the e-mail validation rule. + * + * @group laravel + */ + public function testTheEmailRule() + { + $input = array('email' => 'example@gmail.com'); + $rules = array('email' => 'email'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['email'] = 'blas-asok'; + $this->assertFalse(Validator::make($input, $rules)->valid()); + } + + /** + * Test the URL validation rule. + * + * @group laravel + */ + public function testTheUrlRule() + { + $input = array('url' => 'http://www.google.com'); + $rules = array('url' => 'url'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['url'] = 'blas-asok'; + $this->assertFalse(Validator::make($input, $rules)->valid()); + } + + /** + * Test the active URL validation rule. + * + * @group laravel + */ + public function testTheActiveUrlRule() + { + $input = array('url' => 'http://google.com'); + $rules = array('url' => 'active_url'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['url'] = 'http://asdlk-aselkaiwels.com'; + $this->assertFalse(Validator::make($input, $rules)->valid()); + } + + /** + * Test the image validation rule. + * + * @group laravel + */ + public function testTheImageRule() + { + $_FILES['photo']['tmp_name'] = path('storage').'files/desert.jpg'; + $rules = array('photo' => 'image'); + $this->assertTrue(Validator::make($_FILES, $rules)->valid()); + + $_FILES['photo']['tmp_name'] = path('app').'routes.php'; + $this->assertFalse(Validator::make($_FILES, $rules)->valid()); + } + + /** + * Test the alpha validation rule. + * + * @group laravel + */ + public function testTheAlphaRule() + { + $input = array('name' => 'TaylorOtwell'); + $rules = array('name' => 'alpha'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['name'] = 'Taylor Otwell'; + $this->assertFalse(Validator::make($input, $rules)->valid()); + } + + /** + * Test the alpha_num validation rule. + * + * @group laravel + */ + public function testTheAlphaNumRule() + { + $input = array('name' => 'TaylorOtwell1'); + $rules = array('name' => 'alpha_num'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['name'] = 'Taylor Otwell'; + $this->assertFalse(Validator::make($input, $rules)->valid()); + } + + /** + * Test the alpha_num validation rule. + * + * @group laravel + */ + public function testTheAlphaDashRule() + { + $input = array('name' => 'Taylor-Otwell_1'); + $rules = array('name' => 'alpha_dash'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['name'] = 'Taylor Otwell'; + $this->assertFalse(Validator::make($input, $rules)->valid()); + } + + /** + * Test the mimes validation rule. + * + * @group laravel + */ + public function testTheMimesRule() + { + $_FILES['file']['tmp_name'] = path('app').'routes.php'; + $rules = array('file' => 'mimes:php,txt'); + $this->assertTrue(Validator::make($_FILES, $rules)->valid()); + + $rules = array('file' => 'mimes:jpg,bmp'); + $this->assertFalse(Validator::make($_FILES, $rules)->valid()); + + $_FILES['file']['tmp_name'] = path('storage').'files/desert.jpg'; + $rules['file'] = 'mimes:jpg,bmp'; + $this->assertTrue(Validator::make($_FILES, $rules)->valid()); + + $rules['file'] = 'mimes:txt,bmp'; + $this->assertFalse(Validator::make($_FILES, $rules)->valid()); + } + + /** + * Test the unique validation rule. + * + * @group laravel + */ + public function testUniqueRule() + { + $input = array('code' => 'ZZ'); + $rules = array('code' => 'unique:validation_unique'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input = array('code' => 'AR'); + $this->assertFalse(Validator::make($input, $rules)->valid()); + + $rules = array('code' => 'unique:validation_unique,code,AR,code'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + } + + /** + * Tests the exists validation rule. + * + * @group laravel + */ + public function testExistsRule() + { + $input = array('code' => 'TX'); + $rules = array('code' => 'exists:validation_unique'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['code'] = array('TX', 'NY'); + $rules = array('code' => 'exists:validation_unique,code'); + $this->assertTrue(Validator::make($input, $rules)->valid()); + + $input['code'] = array('TX', 'XX'); + $this->assertFalse(Validator::make($input, $rules)->valid()); + + $input['code'] = 'XX'; + $this->assertFalse(Validator::make($input, $rules)->valid()); + } + + /** + * Test that the validator sets the correct messages. + * + * @group laravel + */ + public function testCorrectMessagesAreSet() + { + $lang = require path('app').'language/en/validation.php'; + + $input = array('email' => 'example-foo'); + $rules = array('name' => 'required', 'email' => 'required|email'); + $v = Validator::make($input, $rules); + $v->valid(); + $messages = $v->errors; + $this->assertInstanceOf('Laravel\\Messages', $messages); + $this->assertEquals(str_replace(':attribute', 'name', $lang['required']), $messages->first('name')); + $this->assertEquals(str_replace(':attribute', 'email', $lang['email']), $messages->first('email')); + } + + /** + * Test that custom messages are recognized. + * + * @group laravel + */ + public function testCustomMessagesAreRecognize() + { + $messages = array('required' => 'Required!'); + $rules = array('name' => 'required'); + $v = Validator::make(array(), $rules, $messages); + $v->valid(); + $this->assertEquals('Required!', $v->errors->first('name')); + + $messages['email_required'] = 'Email Required!'; + $rules = array('name' => 'required', 'email' => 'required'); + $v = Validator::make(array(), $rules, $messages); + $v->valid(); + $this->assertEquals('Required!', $v->errors->first('name')); + $this->assertEquals('Email Required!', $v->errors->first('email')); + + $rules = array('custom' => 'required'); + $v = Validator::make(array(), $rules); + $v->valid(); + $this->assertEquals('This field is required!', $v->errors->first('custom')); + } + + /** + * Test that size replacements are made on messages. + * + * @group laravel + */ + public function testNumericSizeReplacementsAreMade() + { + $lang = require path('app').'language/en/validation.php'; + + $input = array('amount' => 100); + $rules = array('amount' => 'numeric|size:80'); + $v = Validator::make($input, $rules); + $v->valid(); + $this->assertEquals(str_replace(array(':attribute', ':size'), array('amount', '80'), $lang['size']['numeric']), $v->errors->first('amount')); + + $rules = array('amount' => 'numeric|between:70,80'); + $v = Validator::make($input, $rules); + $v->valid(); + $expect = str_replace(array(':attribute', ':min', ':max'), array('amount', '70', '80'), $lang['between']['numeric']); + $this->assertEquals($expect, $v->errors->first('amount')); + + $rules = array('amount' => 'numeric|min:120'); + $v = Validator::make($input, $rules); + $v->valid(); + $expect = str_replace(array(':attribute', ':min'), array('amount', '120'), $lang['min']['numeric']); + $this->assertEquals($expect, $v->errors->first('amount')); + + $rules = array('amount' => 'numeric|max:20'); + $v = Validator::make($input, $rules); + $v->valid(); + $expect = str_replace(array(':attribute', ':max'), array('amount', '20'), $lang['max']['numeric']); + $this->assertEquals($expect, $v->errors->first('amount')); + } + + /** + * Test that string size replacements are made on messages. + * + * @group laravel + */ + public function testStringSizeReplacementsAreMade() + { + $lang = require path('app').'language/en/validation.php'; + + $input = array('amount' => '100'); + $rules = array('amount' => 'size:80'); + $v = Validator::make($input, $rules); + $v->valid(); + $this->assertEquals(str_replace(array(':attribute', ':size'), array('amount', '80'), $lang['size']['string']), $v->errors->first('amount')); + + $rules = array('amount' => 'between:70,80'); + $v = Validator::make($input, $rules); + $v->valid(); + $expect = str_replace(array(':attribute', ':min', ':max'), array('amount', '70', '80'), $lang['between']['string']); + $this->assertEquals($expect, $v->errors->first('amount')); + + $rules = array('amount' => 'min:120'); + $v = Validator::make($input, $rules); + $v->valid(); + $expect = str_replace(array(':attribute', ':min'), array('amount', '120'), $lang['min']['string']); + $this->assertEquals($expect, $v->errors->first('amount')); + + $rules = array('amount' => 'max:2'); + $v = Validator::make($input, $rules); + $v->valid(); + $expect = str_replace(array(':attribute', ':max'), array('amount', '2'), $lang['max']['string']); + $this->assertEquals($expect, $v->errors->first('amount')); + } + + /** + * Test that string size replacements are made on messages. + * + * @group laravel + */ + public function testFileSizeReplacementsAreMade() + { + $lang = require path('app').'language/en/validation.php'; + + $_FILES['amount']['tmp_name'] = 'foo'; + $_FILES['amount']['size'] = 10000; + $rules = array('amount' => 'size:80'); + $v = Validator::make($_FILES, $rules); + $v->valid(); + $this->assertEquals(str_replace(array(':attribute', ':size'), array('amount', '80'), $lang['size']['file']), $v->errors->first('amount')); + + $rules = array('amount' => 'between:70,80'); + $v = Validator::make($_FILES, $rules); + $v->valid(); + $expect = str_replace(array(':attribute', ':min', ':max'), array('amount', '70', '80'), $lang['between']['file']); + $this->assertEquals($expect, $v->errors->first('amount')); + + $rules = array('amount' => 'min:120'); + $v = Validator::make($_FILES, $rules); + $v->valid(); + $expect = str_replace(array(':attribute', ':min'), array('amount', '120'), $lang['min']['file']); + $this->assertEquals($expect, $v->errors->first('amount')); + + $rules = array('amount' => 'max:2'); + $v = Validator::make($_FILES, $rules); + $v->valid(); + $expect = str_replace(array(':attribute', ':max'), array('amount', '2'), $lang['max']['file']); + $this->assertEquals($expect, $v->errors->first('amount')); + } + + /** + * Test that values get replaced in messages. + * + * @group laravel + */ + public function testValuesGetReplaced() + { + $lang = require path('app').'language/en/validation.php'; + + $_FILES['file']['tmp_name'] = path('storage').'files/desert.jpg'; + $rules = array('file' => 'mimes:php,txt'); + $v = Validator::make($_FILES, $rules); + $v->valid(); + + $expect = str_replace(array(':attribute', ':values'), array('file', 'php, txt'), $lang['mimes']); + $this->assertEquals($expect, $v->errors->first('file')); + } + + /** + * Test custom attribute names are replaced. + * + * @group laravel + */ + public function testCustomAttributesAreReplaced() + { + $lang = require path('app').'language/en/validation.php'; + + $rules = array('test_attribute' => 'required'); + $v = Validator::make(array(), $rules); + $v->valid(); + + $expect = str_replace(':attribute', 'attribute', $lang['required']); + $this->assertEquals($expect, $v->errors->first('test_attribute')); + } + +} \ No newline at end of file diff --git a/laravel/tests/cases/view.test.php b/laravel/tests/cases/view.test.php new file mode 100644 index 00000000..d10cf31c --- /dev/null +++ b/laravel/tests/cases/view.test.php @@ -0,0 +1,255 @@ +assertInstanceOf('Laravel\\View', View::make('home.index')); + } + + /** + * Test the View class constructor. + * + * @group laravel + */ + public function testViewNameIsSetByConstrutor() + { + $view = new View('home.index'); + + $this->assertEquals('home.index', $view->view); + } + + /** + * Test the View class constructor. + * + * @group laravel + */ + public function testViewIsCreatedWithCorrectPath() + { + $view = new View('home.index'); + + $this->assertEquals( + str_replace(DS, '/', path('app')).'views/home/index.php', + str_replace(DS, '/', $view->path) + ); + } + + /** + * Test the View class constructor for bundles. + * + * @group laravel + */ + public function testBundleViewIsCreatedWithCorrectPath() + { + $view = new View('laravel-tests::home.index'); + + $this->assertEquals( + str_replace(DS, '/', Bundle::path('laravel-tests')).'views/home/index.php', + str_replace(DS, '/', $view->path) + ); + } + + /** + * Test the View class constructor. + * + * @group laravel + */ + public function testDataIsSetOnViewByConstructor() + { + $view = new View('home.index', array('name' => 'Taylor')); + + $this->assertEquals('Taylor', $view->data['name']); + } + + /** + * Test the View::name method. + * + * @group laravel + */ + public function testNameMethodRegistersAViewName() + { + View::name('home.index', 'home'); + + $this->assertEquals('home.index', View::$names['home']); + } + + /** + * Test the View::shared method. + * + * @group laravel + */ + public function testSharedMethodAddsDataToSharedArray() + { + View::share('comment', 'Taylor'); + + $this->assertEquals('Taylor', View::$shared['comment']); + } + + /** + * Test the View::with method. + * + * @group laravel + */ + public function testViewDataCanBeSetUsingWithMethod() + { + $view = View::make('home.index')->with('comment', 'Taylor'); + + $this->assertEquals('Taylor', $view->data['comment']); + } + + /** + * Test the View class constructor. + * + * @group laravel + */ + public function testEmptyMessageContainerSetOnViewWhenNoErrorsInSession() + { + $view = new View('home.index'); + + $this->assertInstanceOf('Laravel\\Messages', $view->data['errors']); + } + + /** + * Test the View __set method. + * + * @group laravel + */ + public function testDataCanBeSetOnViewsThroughMagicMethods() + { + $view = new View('home.index'); + + $view->comment = 'Taylor'; + + $this->assertEquals('Taylor', $view->data['comment']); + } + + /** + * Test the View __get method. + * + * @group laravel + */ + public function testDataCanBeRetrievedFromViewsThroughMagicMethods() + { + $view = new View('home.index'); + + $view->comment = 'Taylor'; + + $this->assertEquals('Taylor', $view->comment); + } + + /** + * Test the View's ArrayAccess implementation. + * + * @group laravel + */ + public function testDataCanBeSetOnTheViewThroughArrayAccess() + { + $view = new View('home.index'); + + $view['comment'] = 'Taylor'; + + $this->assertEquals('Taylor', $view->data['comment']); + } + + /** + * Test the View's ArrayAccess implementation. + * + * @group laravel + */ + public function testDataCanBeRetrievedThroughArrayAccess() + { + $view = new View('home.index'); + + $view['comment'] = 'Taylor'; + + $this->assertEquals('Taylor', $view['comment']); + } + + /** + * Test the View::nest method. + * + * @group laravel + */ + public function testNestMethodSetsViewInstanceInData() + { + $view = View::make('home.index')->nest('partial', 'tests.basic'); + + $this->assertEquals('tests.basic', $view->data['partial']->view); + + $this->assertInstanceOf('Laravel\\View', $view->data['partial']); + } + + /** + * Test that the registered data is passed to the view correctly. + * + * @group laravel + */ + public function testDataIsPassedToViewCorrectly() + { + View::share('name', 'Taylor'); + + $view = View::make('tests.basic')->with('age', 25)->render(); + + $this->assertEquals('Taylor is 25', $view); + } + + /** + * Test that the View class renders nested views. + * + * @group laravel + */ + public function testNestedViewsAreRendered() + { + $view = View::make('tests.basic') + ->with('age', 25) + ->nest('name', 'tests.nested'); + + $this->assertEquals('Taylor is 25', $view->render()); + } + + /** + * Test that the View class renders nested responses. + * + * @group laravel + */ + public function testNestedResponsesAreRendered() + { + $view = View::make('tests.basic') + ->with('age', 25) + ->with('name', Response::view('tests.nested')); + + $this->assertEquals('Taylor is 25', $view->render()); + } + + /** + * Test the View class raises a composer event. + * + * @group laravel + */ + public function testComposerEventIsCalledWhenViewIsRendering() + { + View::composer('tests.basic', function($view) + { + $view->data = array('name' => 'Taylor', 'age' => 25); + }); + + $view = View::make('tests.basic')->render(); + + $this->assertEquals('Taylor is 25', $view); + } + +} \ No newline at end of file diff --git a/laravel/tests/storage/cache/.gitignore b/laravel/tests/storage/cache/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/laravel/tests/storage/database/application.sqlite b/laravel/tests/storage/database/application.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..fbfc2ae0a1033135b719bf2c5e4f0c869fad1131 GIT binary patch literal 196608 zcmeI*O>YxN7y#g1I|%|2Bu*BWvPr2R0?J3!iXJNAPy;E64aOl2muQnLuw-o$+W|sV zwjlLa^w4YjWBLQQRx0YLr*i438!HF`>ZM3+g`Sai_I+n|X6Jp@cVE9YmkyHXR=3xV z2hnu!Z4idR`6vp4V1IFq71zsFE`so7@<#mH@UC!waPpVKdQYE@_EYSHAYiOJ~LWV$vP&DLABOSNWnwK+RqZ7xMu zYD-a6U1&9C>&4RfTD=uT^+qeIFU-wFC!)!u9jDo3bfen5aJkwn20C#&c|DJB7wOKf zQ&&gED#wq9OT+W^H?rb?=$HH32kopTZ=|EUPWr~=vF*2om&SsLC!^EtbUn#ddTHnOk+boU)8~%V zv#d4WnptQp4DQB@cdo9T&CawM?M8O)%zC3by>@@4wVo`s=N~mM-a5V7JlnfFmn_bw zt9Rlgi!R6g{?2v_;aG6!$>`BRyp?r(JDVq$28%Z@*00~VIJ0&Ai#w-p)|#`6jb>W? za_0Ugi#I-A+_?4VR=YEOwt1?zc{eE*ZhV@whC4)!!Gk2r_7!!P^5;SRJb&?y1eOyZ zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB=F2xxj()MA%N(lWe7zc5avU zl@Eo3cq{An!tvtdrTo_*e^GQA0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&Uc%KChl*$v~#%9vnS{@|*L3wXju7sQYq}MNv7j>8O?}GeU{$p{|2oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+z<(z&Q63FWei$abboG4lFmB(=l8;xr z?OKsXGjXqz^glRN8Vx?14%_K^lCAX8&h6J9oKIKp#7P!ij{E(c>B>jpXmI9eIEc5h TZtwMnTf>p4F?f(<*`dDx)*?n< literal 0 HcmV?d00001 diff --git a/laravel/tests/storage/files/desert.jpg b/laravel/tests/storage/files/desert.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b88c91336ff8073f34d21ccd683a01f0e0995da GIT binary patch literal 845941 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 X-jngnnduiasMn4hsxOk<+%GD zNDwn-yIqMIe>7gn$`Ap)>Iy-gMv7&KBTiNKsxc@$po(m!d{?Hw$Ya>Cq!W9y7Tu~i z=`yKAweKQDgfG12zE&#GT1dIvPRDZ2DSk0;m$Q0%3!1=Lj7%l4N~MkZ@?``5H~iJ+ zdh&`+fXE-N_|FJDImT!O|KSm|+bUCSTFh-RynR01+S$AL_?TA{<{9-1{xx&)tIyM8 zCmKMkr*-U2<_wQSMY3F?yfu`m6a8jMNlp#%Qu-+lTkYx&BF8@*l@D}pII9)-VdYnR zAT@d$+^Q6L@6LH*=TAOD?{aC597_S#?3oHcfCQZA<{9R7tt{qcYseIlz6NiR_NWVb`)7a3X1 zMv1_KNbC=woi*cgvgu3y0n7?q7cfyl#>g|-OHOCAa+`@3r9clq!)T+Omq!B*J|oFL z=nU(~DoZc6;5Eh`LYWc+ZX4ur8fsV_>OvmYW)lW^LN~iVQKyr?{Resxf0H>+eI$re zlPHp7W?QJdMeaG5biF?iA+YGAkp@=S=TFCeg<(Y?8@WegERW#iudkSZzlDJ-MzI{* z%HD2?e3At%LB-=;)@=}0z;{7e5}yu=w{T5t`tFeW4>!7({i#T(q5r~tp_F|0>0o?u zaq0GxD=BtATyJa$w)!CMqfU~)1XZ_!0>F$UAcCdvxm@DJofGP63Wt44wdCkoH6cod z_?#YOq!+;cr@WuQr%*C|@QJ2`&H&fvSker%`1TaOG-iiSA~{IJZ859eJ1_n<{O-fb ziJ_9yuPu47wnS1E zzE$3Ap!#~|3l0l{{9EPm2J_*Po}<^u$z|F)kU$*6nO}_tw!v0&_Cja@02e)$1lswz z%u6y}L)nVthSd0B`in5k1@Yfait;>N0*kRQ()-(ZHQ>?!{8K}X!Qg2EfEvMwZWCVI z5})TWVt_h^u4;LvYJ673^gK~OeVktonoI7_O+#MDspX{iT{s{EO_CyBN{M5B)eH8q zzkTYLnAu93<-MyYf2SEVa6@awGH_K_v@6yTq9a1O&g~}HE=a@Ed>JJRpI6eK5JVF~XleKB`g64-D$Jr+%yAblCSR`WE9 zEjZldWE#r^W0}Vt;Sorw1G5C+_Zu__q);uZvkBGQ8M6275Wte6yoYY(2@FZwJ{L0V zP9ju)Pw^SZ@JH^gi8w~VBmDTsZK*h`lTkhlxq6e3(=lCGq63I@8xIiC&^o8>r&JgW z&6$PN3hk764G9ypPQl@$_izUw-7PAur{P1`%oM=r4vjok&sm($IsLOMKnMZj1iGD&T7GBLAhqVTdOCu-3IBAbNIMCdR zczOl0WH;5=(l^=wHy>N+Q!3|2ijgryJlAWmF=<*Y$hV1Nw=$PsUb31YLqG0-GzWGA z-8|ayv-4O}tC%kH14r{N_{Ewa`(>?R>pIk#fJXPi3vxxVdrFxSwxcqW;|=1U9x(pY z5Ldp3xT7wiTKlhrX=3wSLfAOkf}1ydw7mn7dXzl9>9vjsPhu{hDo8o%6*Y~;Vyvpr z^bzV2IV685Q)v@xB0^Y7(jPV;M>1JQ?wOeutO1|zg{Y6tlCazcNF8TTnvgERLN^8v zUjd>JpdS2ONTZ~R`35f!<`ZX9UdS5-6te;!IO^_}A=KMO!!XUf z?b1!A)|+YzHUU}9xkDGx z5ZbRGt2sRo%&T`q2<;oQ_<)Atnl?4-=>{xGTYoBNP3>_8ke8Wq_EL6QqVnj?=PBQA zEgE8{9ie`CvsX>A^jnsTUN|?^X$tLxzt!XjKi&*ueqDY9`RtytrmJvL8Z3m`xk4E> za1cQV9wF5B!^44ce~FXLP?yA+f&tk5!V6J#v{SKQ(F+pCx?KJPVT}qf`?OMV+Mq$nX{J`9UM8Ld?m+haTO*Oj4nAzL=jO z!n}0fh>5;MYNhMXPyT+RcF!sU#~ zRZ^(PkK`BkRMWD!2fA8x1e3s85)fi=Ub`Z~UYnh{HEwZkBjAeLxx0bhzt8TfpaFDv zlT#pFG{TR(T;>$^p7->9e`C(2^GyOnQsL97OJOh2aIG;}3SZv1|C z!Cg|nMB0)8cjHbqoIE#xRH4w7p3AYi>ok=Q0&_BQQzfAFj9dM(yQ_o8OpSspErlLt zE2IM3L4|>fPGpbc-nX_@By7u8>BsiA9e(ubS68`Ts+mcDI1ZDy%kz#cj4(IZV@I5$ z`Hxo@2KIq$r0op4`Nqw_0-f|%I#WO2Wv{h* zCLe;E@C3KXmWG5IJ*qDdScg0A$5Un_6?FpBi)Wu)5)E3axMYS+n2x`(s3uT4x*rgA zGmH+J+u##e;^EF}&9q-nIMMEOBD_3nyF{RzGLQ zC-69VQ`P4d->qB9s9n0xf}#J)(y|S|h3Hl%G=@`dBwfF0(0MaQv#3E-^G%`CVHbPN z7l!)&d=gmLWz~s|xn%`Ah}=mQ0Se;eL&k^28+Qi5OVw}r@P?##853Cl6Xg~Q4G$2~ zc!Z{(v>`ygHr<}TuhL1wY z?cKmXohJmb4!l3hb_o1Gmz*4J1f0iqkSZvTDtTk{ehy}No4tQa$*6+S3IOCjKbS_T z4w0WY+IK<90x19z;`~E3pjaqYHmh)J?_GN*IZb?pknOH z!MV|c-;qkeU!_xPs>gLW&0QdM1iJCekcaQ2^F1{k9cn+- z<=cIl<|nrFkYmxiy^s^jt?@iE1pt8n{C*QCOv&QPgZHhB z<~nf={SNxLG8!u&EmMeTQikzf*~D|bjbzt5&ZKLO7smcI5mZJBjtvMv9hSF5G+LIX ziq53ovv)WZ7wC5JBAn_gH3`{&o1_Q&xjY11{LjUGnA*!d4i70!_#w&W4dnoMOB<2Z zGLGQNxV}~n5H(YUlRIjC4=(q?iMF?IeJVWE0p5YWBlIs1(V^nOzsni{xzktc*&3|7 z24wZ{v~P(HXKmo@Q~NRBehID1(8tBzxLT>e2|6L0`Z24tn^(;L!=QjZFq!V-rR$O* zepC5B5K~c0&JhbIo&M@b=-ysdh-!e^gOAi+JZk?S46kh#N>ClEeczhOkvEK zp3!_q*Vb)n__QFTn(-_{nG5#LkI!R_y40S?MaoH~l|k#_@k z@%Y^<{Y8ET>Dri(KOdL%J4M-J5ZqT|b?-98J#O3${*{$!I&{k1Xe%JmLapFGP>s^5 zSDa#ozCj)Oth<*=)=;}7<*4(TN%mxu2jG_mc3V}qU)81B9KR!Fqy4`Wp8&Iao81)U z>-&&b(celMR~BD3FJ#8|y0Www{8pE1wU7hhHYqy20YhFDrc87s$GPso_6QJj+Wi}D-Sx2t8smRNvzOC1VR5vIWpGM0Vlv zfgJqt63otu2^~N}Q?qo7=BZ;(D9prXTOGGAno=X@%)77&F}!`scE%ko;-vk)EqfN* z@=~Gtk|#+g6Suv+vGa4P0wRHt%_$URMVw~+r&J}w+BeCnYu&L74twAS{Yi$ z9?L?pgyp-1=8pEmN7N{MTYHzE%p0?^hMbO8fs0A@^8JpAn9-f~*HO$f21dc=nrR2& z?!tsCYQ^6N!oxr@h}CiTK#nSQ#Fu*1`+bwBQDWfTxnT9h1UT{r1aFERRFYX#ZqZGl zLfVbG<@>S6wpa5BGmAM$I8v`}`*XQUhUamc)2hET0wO1Fv1{0?i%x~eJLS?heci`1 zVahr_XDq>goYh?2UWwkpC=m^M1-pm!9d4gd2P3t_^w3w1EdglL!6pcwe=5-is&>(x z&IKPq%wl>xK78<2zJ=KN|5M}l6R|N?ijVB7?KnIVOSC8jG&hYb=D*jS1mn22NSo{O zQV#3v!snnTvT0K=lRxwllFOou-PlLYYiViB&94A?Rz$(-uQ{G3s+FDHuRA&3W>urn zHzE{VXjLO<&q@&#G$n5(J|XXJD6O+0BP|yn%&_2EEP17K6^0`3vP!1XzaoLQoWH-z zkB#kcRP&8wNFA`#(pkYKfrps>ip7$g0Tm0 zlL$eKOfIWeARJ?JQe|YfWYlcJ+j>Tpl5*kOJn1$L$1myzSM_>4mjw?a2~iZ1^h5aY8wpNVVh%(DU(&|~wmP$| zGOCg=ERlyNEGYnjF(iZo=w^(VN>TR=2ZZ(BJbRY5eh@e9q1X`-c_AcuUn_xedN2lD zYA~wF5_-Zz`*;2D>yz`CcoO(71qUKM{{X2OXmnHpd1YcmiY--zUzF$=d4uiFq}y2{ zui}EyA5}&a?#Lp;4X)xoG z(_mMqD)z_RWb%+%-!nW7p%rksE_0m(*x}ZozTljfshy`e`E#1+OIsxx8PnF7NaYMB zzn9OulHE0Kzw?ZurOhveNy7`197BX!c>!sYRcCWY84iv`&UIIb_F4uMlUPbXzKx9- zFAVeef{SgjLLt7KCXnveYU|-P_esQ((?V)o!BoqofqhdtLo-~RgZ^PF1oxgN2Yoob zy<&IpKJvRQ@x3yA+}KS5VW_ETnOJ{7d>VW4!n*<^lyc0W&K%9vDRA6g83di_^@v^a zmP$>=Y7HfXKR?>9n>Pz-(C3znG%SsdIybH|bsQF*bI-EBrw>;=VH22Ne$r-m5?=-! zLS0tZSy#Z%gF1;#okA~^dQJ% zC6k4Uga>yygor^oJQ+Mia2rW+uL+8s$x(Y$VXW;i<0Sg^3bZ9J5!CuA-sn?OG?hMj z(#`-8=clhNr&<9`+J}e7w$Ku3G8DKkQf6>e#xYj;({u*T;>x9L@eFNVz^^?}*rBqX z@rk0EYE#>@AzrE<^0iqd++9vbMH%F7F80fMj~W=TZd)v-r|F5r%Du`jezhGXKYy6~ zJ6>y68~ojs^#OrxC)BV>jpG%;wPx~xLFv}f4K6jsknI6*sNRHf{sRPUoZbAh`Orfco}8N8b02>a}SAHTiAaa zf=ro2zb&hO72+NnkZZLsCIQEjX41^eK?1bAf!q?be`B~HAtL#HU3CWbJXCm4>~k#a z#O1vIKri=_oM;h~X$1$iXP)KqHd!RCjsHOE1msEK2*bP!b`SN={awrqMzovp;Z|x7 zy`?T1thciyDlY}vzfLZ>E?FpY=fYoYM0*}mJ5GS+BuyHql(3hT4}9&yv3&QJR@@wE zCaY=0wc-QpQTM<)r{$ZCnK_}Y>S0h6T0*T|@ZJ)kQ#&m|OJ4HNm;gB&koww+$sPgd zsDX87X0q%kl8+x24PHup5vh#}b^g?e)t+-Fn}mdr?mJxUzbcOJ`(xN9y;fNgur}=; z+J_nm2_qnFHQj7`4+6^D#Y{M;Z|2kEx@Wvh&rKHwKlxko5Arj{a-o{$#p8dOK1YNH zLetc09J%s6o1`kz6+a5r2&P-DRY329n<`+>8az3ij17!F*h&SNMH5FH7P3^;y}UdN zD>c)DMgNj1yZ#?2nmRL3gBvL2dQ1I&o}P2>VL?OU09C=;y#K*E5MYoOwrKBJrSS3Z z6@WVncSqN?-5wN|(7ddxyg{_^jV*LOhH71OnX#62k5eBX zopqA>52O(IuI{KcK3z2xeiMSg@mtMwf^J)pAHH|?Vg~>CDje|aC?3;!igdeo1o$K7 zJ6U%wWF1B1D(M(yr6grm*5DSx-+dnKPU4AApl>(gx6~IY(ORhp+4gphUKGoE}cc z3ks4Gk|2$~3iXa)3FyNmVCTo@0jV65gXBiJA0o5v`TnZlT54*>5HaqN)ibmY)S<<_M5>_46_JoX)ve@jWZ-#bW~Zazo>#@lOvL4#7C za_IXohPg?gIAZ#=zQ$U?y+aVZB+F1{*4J9>*p97?d_G@JV?TOxp ztr#4Fy{3dK%kC|dJ`)>K?=I2{pHA_SnoHO8#T-3I>WkU%=odr#k5qY&4n}s4`u7O4 ztD$N#ws&JTGOc*2AH3U9XA2gM1)U$#vIFHpD38uBR>|7A`%&0=g>_rQA*eKY)Yn|{B(~W zLGNrvXddMIx1{%n#UDxe)yjjyZSFe1c}r0ETMiZq{_)o zqV6ik={dYPL}F}vsnRrxvo}-!%$9Bi0v(uCQ-NC#`b%PtZ>;4-Zvgq~kP3xCd{gWX zI~UPh&%D6k>~FuY;i-vl1(R$?Z^XY0#m(v$+IYl^igoYLymiYvzN#3zw?S}1?h*Lw zW~W{ru_TtAH)whs*#R&Z75<1$+Y3H5p|*=#AviwN8>;P0Pu+Kcpk5ZRbkWO<`fW`*O*lBK@*^ID8IR67UP6PB0jNR0$D(2JclI4!S z!@l?uawGODws{)ekf7m0w)d5x{?7;5UeozNUQNNag4?NYZYo>-ZJBPqW}}xdJ&gin zvsTR6BT^N5p|R+QOwl?r{J7SHFqwA?$lHupf{MX#YaL??ZBHa|tbX5KMVkUk<4N0? zgMxbrt6ZA`i-BSVfKAGo1t0~8YpP;mYLqH5Ax12GKP#N0UZEv0+yS!7dJB!@exj0`Kk^GN}PaKIct`tV(|%<*&ejVTcMuH>{PBi^kge|H8OeqBNI ztLT8KFpl=D_;{kJZ7N;B71W;?)iyJDj(yQd$Glm{{K*Tc6nbZVr#z8)czfEOU(}9y zmHhr-n|X80Rj=yA(FWU0=u5#Cx_TQiv520)Z!6>72=$nTe8cwS*gtie%*yL@G5zZ! z8DIT2K5Z$1I@M@%T(%F{v@{4RhvqKz3GSWg36HSE1NCk(Ep@JWl#_?w_v0W#w@|lc-t2t zF1eadpStGM20sdGiC(fXnM>L37cq8}pLMshT5zDmVGy3}&;)uk9bN@MCDV(os0jI* zU^<~%Yv$4&Ct@{tS7czM$t-8l{wC*~a(Ml{YZ;$Ky4}#od-h1hlFWlr zR_9w>2q-r>?Z`)1__Q8}{rh>^1lc64EL6Rt=!W1wmY@w3zAug(s?)rmsWgsIO8H4U zw{1>-bFEl0?kJN3V@zUf)Vl8T3;O>FITmF# zxf}4W&M!2QGs;LQu}T4Y2WG98LB6S1ar3u4oe)|AhbTKqpSm&-9={)RC^Oj>xwD*8 zErD3%NPD^TB{#xOjg7XNPp!wL&QU0I+i-HiP3EAN#0#xHDWBrvSbg_R^9nct_0PAO zovtJj!27VTC+J|T>x@aGNNwKxBCieGS0&w~8?b!yb|apk6@Y-qd?KcH2e+0Yl`;6; zrE}!;IQeQ@Sa9a*J?BKG`cfqI%bM|dn-3VlL1>6ggTX-NQJ*Chs0IG~d>UPr%A|l2 zy9l?ETi*jo22~Mb1$WLrV69rfbA+0T7$H;v@Zz#|T#(&Yy#~8s4QxzZXABV%B}tue zG$Abv-xL-FL)3sNnoWsB@NU544obT zZ)*|)f=qKTO5JK8V-Lf|7NNm9XG5pz`*(;TrYuX1u3*ukH~Wlz4bod?gsgC_TR#=_`0Gs z|H`lcY$~FcyWyoSMtHXv9z#avHgu64e#&CGnr=VqH9s6L`X#S_+x2FL&GbXUxfuPbUjN)mUlW+Wu zPoF+^w1DTcw&M+JT$9@7Gfz|({E}O7#71ZEUn^})*21=ZP>8Ido#n`jHh1~0#23MC zvmW*s%>Mg?!=XV)-KaZ^u(_dG1}Z2qRZ=-u)E5%Vh?7oq8h@pzt^_vO5ONbW$mFK5 zwl~;?k5l^-jv`d3Nu;o9tI_cK45`PjgU|gY&7>+6-Bd~O-8;97Z^fZo%9k&hYY->T zq_8m1{e+~6n=3YvbL2eApQG`~Mca#pZG~!sA#jCQ&X10OxiCVT5!xl6;Mi)fu7~dv z^MP&3??cv=B@A z%{vjZvAxAs6ZjZC-YXo7kb{;buPq2Am5;_ijJN_q0e+fR!rksOp5*2YYn7~UDavjS z8~Doqbwl_CWBuRM)k?ey8|Cd_mpq2A;M;YX*+beKA;+&)D^+rm)W9qJYS3UENkVt2 z-M&5IS6j02>ffCVo#sV+Nfs!`ADGIl8i6rJ`0DND+tQcM6DM4wmW5tgaEHxCQiRL9_^e36b0r&L=(3y#BFC9!$=I#b$3NuNd3ZQ(dvJJG}4wW?X z7O$Si{wS!B#QlQ7T$EiK>X+y654QckOqEL5*F97ST$B{jisVRV3Ai1hxd1ZWE$)ze zQ>`KH*nW*{3Wp}EG(cL%msDSDc;F@GDGx4$tlt;1dksQzgi$ec_$ zVY!siukSM@r_KodG){ zfhM`x{(7zFIZeVx1|@F?0Rh6EsJH8eY($>7K?u0NZJvB}RgRBctJzuKX^5n*&DaMD_~}$Z0L#7(Y{E}5M&&d)TAhq$CV-kzIKqqMzQgx$mu6=E<*40h5`Yi(=uu+R5i2G@_QLh2 zBSt7#Tsg8cF5u~T`^^ncg3GrC_zI!SOf;`cl&Rf#(mzJQ^fE%&U0(hW)w?{|%70}1 z#M^zQwEm*I+%8Oz`RQz9RzbjY3Lzk6d`&)!i1$zaEzogxP?YI#yZP5fp!D;)$ ztms;w%ABA9jowxmF_!^49wbowMfvC^;13z76nZun%^DERylN+|nDq`L!G|2RKcUHtrmGuILZs!}qn@e81f|1~JWb*E2|Imfp|EG1 zw3I@#(+;(2SR}x@rWw!l=#{sw)QN%i+TGG-D7Vl}hsEy=UFb#!x+>>VZIJbQQ3z~R z{uv5qb(cT&B7{R|0m&RbUc{84Ii;j)Twffssgi#~%!D%#E2=qkHMBsa( zqi(?t7c4i!hUcE^>(g{X5gH}5Ekw2QN`u6-XY~*IK|M;C*Om4-T&~?{6{$ra2!tTB zdt`CY$Vugpv@|MT^&th#}8a9f?DZ|a@s<@w4=(fDGfiD%HRV8en zYPUtM^I!XjxL-wwBJBoaqGr?}KM9d~68!sM)J1)?GupZCfEaBLQn`I4nKYk{Db$zB zf!w7jW3;9&8~ywyXpT>7Yjo6m{wJ9w<)mmkl6&WPA};RXVV{CV+FSX%d5G{DU<)6* zM);S|R!V=9sOAQdenIsNh(fmcDLS|`X_xkf_4T`_LdpOErb_8zZhEHi+{u#9^rX78(A9Y-15{jPP8^l)7CfY5Sp->Z%3$X9<_}Qpk>_ ztCebM`=T@?W-Thp>HBC+uO4HovE>j!-MFVFDVW@5YI|N5l#hwIK6Tk$eK39xj5EVO zGS{*@SZ|ND*shnEciQOu>yl+tujT+fa4-HaOP<^Qp!4#a3RC?w?2rHT#XeJ|w0x^H z-}FVXRx#Y-w>lfjS7nE7Lemx2S*n|2Ia<0L4u`tD7lznIJ(6_D9ffK2j@;LB&JBE0 ztaafLLeR{T5jL{Z4d%a>6beBE$afnCp3`f{e zS3VE*B4qy+9r&JevvIDi0We^?1#B;2YQsCFET zWQFN8Rk*~pdIr5--QgjFmnYH&3zbm__W(P`GlxT2QXS6u8#AJ2)IeV^s zFr#hYNCn<8#CiqfieAol8iY;X_+lW-`gD_#0*ak}3b`G?7hPpECi4%HA0ZSnu0|fU zdTg0`7vW;=iSU4m?es^c?eN7GL8kpmOX41PtVI$Jf8hKO?p=Tu0}oarqd(3iIocR6 zTn7aP-I15C7`V?}pv89C=HPV_MB3XSEm6r8hece38TR&&AuXj+n-|?t>)-B4P_@0z ze`Xhy{0){wVpS|Dj0n+H)g3F+2EL?tD;O$gY=XyIiisledK|%^8?<{OvBc~j7NU?< z@sbzChk%{R;>n1#U|lg?e)#3T#OCx?LT_)48g}(d6zK|Y`;n#Y0HV_RrhxzE-gL@0 zdZLRR7_-J?LLnPTSYzWF19hpdo}uc)+Py5OYIo;+m6q-1#IsEGZFM$8o_B-t#d#Pg zCm2xA>f6cO|21d5H2B`?5>JrM3GXNL&!1N@pe^Hih zix|{coq+p2xB^&!(3ewBRo2!XVC}Dh5xTU0(N)PGipeQcmG;@;%qmP@8C`aNf5wLV zO3xIsOl6I{K0K8diZnu-8rcRff#88axEA3NV7l3$pOT@*F-waF5m@qzKGuQOM$>(I zs!Imi8Sg8j?AMk+zHa~o_3Fee-VK!^VuzRWq0Uin(p?MGYkXZ|;>oneSf+iZPF?U~-~nT(?)rJF*OfD*r{ zHcW+dbNlx8Q*F=rG-xqXBCX%Xh(xf4eP4G6m(+02^!+Gc603yRo6EKOdDNT0`bKMP zl%1XH8TDhpo?8Q_bWgS z+K}ffYSS$gzdKNi_9f$6xrTz`I8LD+0`^ZLG58qqdlx(h@_H>PL4pNoSaQB%`jMEV zU+=PS0bI{QEeniNE+2?ap#G<);7)9So&ga4_f3r?cUc(&|AFj!Cz3m&2Ol65Mpjuo z0fmrZ`*oJBQ>y?)+9ZvE;seJ-M_SDl9|>IU&`EPyRG;>2O#K*ofl&(%QmHs?6fW z&-d}-ICmFie|zgb)kcCuAccSR?toiH%y=$Z>tJYb-dFO!5K}mZ!p~)+KLW{Q-L=SV zOxxM9YK1_dfZr-qvFY}{aFEvy!5`R!u9c}iE}BlUx2^F!AT~DXJrNK>O=y`}K)AF< zyAUdmEK$lhwGe*e~BC@M(X%|_HRctVcJG8 zAFvh!5gUtof%mRtjc(gt75rx}0h?=C25!qcz56R>_1hjG?maX!Mp7~~uoD+`#XXE) zZ|wySjp$&fW6*wmzz~74EpBKnjI|dNymJ_mFPvjj7L)B~%nX7k<^x%@Oap;=uZoV${ zF3!=EIAz@+HZ4rdYD)aybF|cAP%GsQkAlRB#y-`+0;~6^ucmKP52}?98ARP} zQoYw8a>wOdMs)jEv}$67k=v{Qh!J1##diF6ym(*~D{G87Cyq_Copnf=Punft51ecp zc|2;@s3QO@%9wTO8D?aB+hu-rs}kQN`4K4cCk}f%zkrKe&mTL5V1LsNhyjpz+o4KF$Jg$iO~V7BDBtc@{wrC)_L;2y&dR8Etx)F z9={q`w2;}WZDb>Kg-@`^kW&=M!SSOfN*W{l?n>1?tY2gCoX(jEC$;WnI@*vfgGX<~ zO`EG{N?(>l<}DwX6b#Ea!TwOO*vKb1g-ZX9vVe&y^GlNi)JOS1iA3G76052OHM|*E z-m%0?7ylM))CJ#9jT}u;r@?g$zK%Tu^m`R_z{fq%hOdx~MZ%5=;$K^Fyrbo~)z2Bao}a!wb1%+0VSVDJ*0)k9wfyuHL2#@Y8p7-t#R>*12i=1r?i} z&7##V8rr>dKK{2hAIILqh)HDuDeHZ+=k$b_ZQc#Ep7uF(uR(HMrq%8=s+k-Yzkj9~ zM6@{)jPrK`7O>U6C&sv{sV^JE9$yCX&fxsv2SLUc6WE2$8R)j#64QCx?ZP&Y#*tbv z;~ws`Z3)u4aJ0iP-k}Ba03C>+7JiUG{qd86V28)Y?hPF9=xV*$2R16Ek+5vTP4q^G zKTUzXckpQP#U&fX4}|$1vk#BnD38sg=&E+wpM0{80!Uc7DhijZL?Tr8nVLM3=nDKW z>5n<7JRCiz%Crt$0#wJZkhi4wNgbvsAcmlb2h{{A@m=fB8Fd|@(NQ!ZRI$7Ai;tnp zJl!g+7Xkz=%DBv4KU}D5gVh;*^&`pf0wIr+WYg6By@AALcIeLoV;SWmKC@Onf+VwC!NNeTQ%FoIo%z&{c#YAH=|$+%o>$_Yw*haLFz<}O}b zjY(5&ho>_3{98Kn;p5!V!V8GOxz-?kLG06W^?f6!L%l68D1P@8s>?i-g(~h!TW()Y z5ymlYG{AbbMs0mUKrH2PR4>A;i;`;kKb7Yt>uwVZ1V75+uwi7UXFlnHnQA<#`Yjyr z8(GI4&vB23to)OoAXS1^)?b92d%;vtuKk!Esiges5nerq^|DqpC24C-FtNG#pQ#n0 z;K3B`py@xZvheHTDo%w*G*JUcxof|UiYXNRPJ=760C7eFA9Y*RGBeU#J zDOCPRyWT_ z2i}EAZDb#ED8X%jZ96}&uH?4dA3uL-`UB!)=?$+u+t-B$ws}G^fq*iH;0xqg-)wen zOP^72P;gt_Y#(k&`1AW3+VJE=9a(_S(sDZcgchUdJ@Hc9>;i3!x8BG}aI^sFan_hU zX4$yKv!l+Ohx*7YU1#Easa9#eos;$IK{H@0P#7l29i?)+^mD0An}1Cwu&%|C109|uOz%ihm;+RZfvx2HuHVWshjG7 z{4pKL4ceqXu1l>i;Or>VJLmG9mbbYc8CpbXkBT9byZi`y%2yNJN)bR^ItVy?)MXAC z!L(TlHW~DSo}ER0^>!aAR#N!*j+$sSeNQ-&4k-)W1dgP>8daf1^o_!k4+N;eD7nO< z01i|?g>L(s^?I|L|L8>NyUZs?tVa73PMKgM=GCtkd=4q80XL zCmtkCL{5vbgNRt$uiu}Ui9i5sW)WVlv$;5NJsMcT`{Pxf*|BT?1Fe%H#>-AI2a%be zu6sJu3e!PZ{U_AN-o}AM0gJELy|}bY)iMf|wBB*smm_>zi~cdu3tikM!VOFc4+D z&=X_}v$u9Z_=Flw&%z0_2sB@}htMXESRH!c`9M%nsoJ@m$Vz`w4l~yw){)X-@gSl} z47Xeb=?K$2S%2HLNTi{RYA=+=umcW(CO012SlB3!vynp&|Gjem4)(D-?W5fp{QHS! zb@ip>>IOX%g>li710Rj`6eA`;}iqTkxokt*w>YFLHLP_|6$<_JELYdCqZj>IgK>+^c!0!<8fE$+9}N8){E0N<`NJ( zfY?rEEmfN-)6<;wS;HNa)aq<@MhrzH=z{;VGK^^C6auuz26BRarO_678_aCf@%s33 zQ&~V~OgptmWPLCx{*eVLX^8gM{BlobO>HEJV3CSjV{CLO8s4~Q#l;Ns- z9YM!g`J@bc)Q9rl@s@p2xXXZ>ID00;niL~x2L?C)1SV4e7~{S2RYM3;#(FeccRn@u z=}bPWX$2$?B=O$vE~dXQCYnjR%bdp}+|LXx=!lse)Zp8i3V7ScUqUw!hT~GqLzSS5 z+ySOO3udk6! zVi#BmclJ)02olnZf4u*YRk0N1rw*b&QwopjNPUZsoI8ej1s{Z=&uyPLw>7KBx}%8e z%><1dIO@*9V}6!YHza^`{{y9sLktIImoVOJtR8BfL{I*(g%KJM}^b8U?ckTM?J-!J_=2%ISv zptCX@VkXnT4l zKBM`45#sCbrc82&GYz_DUePYpM|Na_Am0}Wr19U7@rqM%$aM?pcUbs^zeX1If%7MU zdHCb52~0B=b03E6fLSeBT<_ci2~djZ9}3vWU~9?<9%s98`*Dq$z_-Ib^tU8q{7Z3Q z!I-8hEaV(`v*GaC+*#=)r&=BWr)Il=dL`-}S@={^mCVe8)xp}C5Y(Mwwz`oS4^;#F zSBYty6}S(Rv|dw@7KxrVwPS*Xc;sUv%Lm4Wfgkk-#A&WWTP$60VE*xq@EOHXnp?(C zD&N?9t1mD`UL!sZYlK9OscI7_rEq542snS_FE&~Hg!QR?Ev!9 zc=zOMWKqLGMw4J;6b2fdA5A&jSf;+N;IEuMZ((e=#cXK)cK>>xqiqc+3B+XEZ-Jl^ z2rDphYcJ5~DlX#1{9msLYnYKrFXWYC#Tx;mR_+@eTt{at<=C#EnMq8~T0B^Jmbi)0 z8WP89pD#E(^&be}q|GIn8K0`bdDuD(wN5{^M$Es<;qjTIDj?2)6krzR<%FrbaEb+L zji7q+(NiBxl7HXg8jqSTrw(@tN2CXwhlR0FCF_j;Bk5iIng0L(|IIKo=2)9%qbY@I z$m=zS*^pyG4y9gli1JFkYYs_{n>p6n93pwGA#zF%ols#zM#>bu=%r#t%qcX7#`JxD ze!oAU%Vk!1JRbM^?RLGcOD)}-ub5Ztc%U2&Te|rvTEAfhJ2(>|2?b1qcaPPgk--m7 zx$kQRE43K>q7?6u5h{;1ix(Iy80S1q1YI==XF=@$WPaVkEUP*#=wxL67*N!F4(7|m z)gCx#7ey@T*aIt81^HqwB|7sf2gKhW$R8aBHKzOxs>G(4I{@7IVh;`A#xKlaXFA8C zmMXN(<#4o<$=JEM8P4<;83X{k-Ht4`oV!GOeEl?v+4|4ZNi{m~*%W&L7+i*@jgNpK zdge~Dq)w3cS=0ZBq6;n1C5b9Ftq}=NxcSP z3wU-qJoolOGj3?jNbnbWA}5<*wI;S$_?Rv`sA7He@owr*uB;Q+E|E$$naX2xSlJQm zyN7~U3Yus3$}oVWYU$4$`}0)UNg8uNGW}54nXaI0;0?MYNo+RlG&=lMy#_O4b-h0^ zYPD^RO0CXZTp0nGt)(NWXIa&68tAGr5w4e zaCib*<)7%2^&TgYH(MO?b$A>h2R_9g2I}i5jqAb(xS~i`&ij&7NQfK{G>cA1w_XGa!X=M|R zu~tp@@LZxdg?RO9g?t=?ehlR9q;vA}Bc1}{q@9cBdpe-PNH=xza`r))c3wDm<(SV@ zD&V`Xled0y>V>U%KGLbuwbcJ)p<^cXVdOf@gx#J4`)k8}R}YLa<`yGuuXN0<`6Oq$ zHgROxq|96q1-IU-Ws&g@)aFXk1nyX3JRL-^jPBDRl_F*yvt%Ye{Bt|D7@#w1fN;)w z88t#(7SL(4|F|kder!JZq7dXWYy*nmGFs8jTPJ*}=y9Y4N0yc+Vo>-GUCdWHwrbuw zIbV$6!5>tQ2fp#ye;FrfTv!dsnHxG)>{)h7{XwSD>M^y6T|c<(@0_+uXP3LM z|6YCFyu1Q^Pg%uyJWCdjReJCAttu5{%Bh5=81cjviZJwOL-uB6@6n5Uaz=iGdPo7| ziSPmOT(gB<>iJtPy zU?q9&)}z4%G2kcG)=xC!FqKz-&ZItcCk-nQZMxs-d#8MKr0CcJj4bJpP@G<}yt_HWPuk0lVi1i5HS46L_{-g082<-HADh}YKy z$Orc#CY@#J=&>1`Rg6>`IkWE(PwqkN`@Po3$!`OR`#M7pfJ}Jxzru#3ai(Ac<3B!y z8DycB-V37O*&I)gTnernbw26~c$?t-Z%x$0h~1S~hsT#nf>}!f=YyZ`1ZA6zE#k%9 z5g*^|d3v6Q;yrLO$EsbGd7-1?7ltI-=1mD#k+Yt`#p&3?(~TeUn4i*P)FzdD#(xPY z2yr(w3kqraK~QJ=okm<#k5Ib!qthGPJEfl1k5h48Syb#5Z#r#Sk{?jdjE|UAljO*h zI{tUf>SceHMs9pi9E2fNw%a-_NcHeVz+RKD)$i$cx|?aC53<5k|DerS+P(FFS%Wt; zMS>t#;$%I?M<{}1`dpe0-2M6*#VsR=0084kP6<{sGmxTWS`cJ3!Cv+ zdO@%}9{z=_=N5GF2sDF@dYo`WpYys)(p~`_)Qy3ZnwD%hchnfTY_(3@^@ z;6mZHRu56Ck|QqI_n^?%Gy$~p@*%@~aEZM6^FC`zf^hmcS zoBa)+0F*O%SJ&gjv@{EtW-albz+0J!llwo7?wD|vpoAg`vx=Y>jdE8vKNQ)~z0=FD zN`dGh5ECma{q^lR7Cz3%HI+DvhmuzXVo$LoW?qNHec7*Xa z(gD(uSP~Qi-I84Q+7N_f<#gum$6cr31Ak@B6TQH|f(yJlgUrt;A6621dv{dIohi?m z%9bbfJL|^CUe|d#c!nw9il7t1jB`(zDqksFG50s7}(|o$36;9UOVSK+h)-t zErF}CuDyHLoqu_YERF!XI#O0Dl;`z+-tF7iZRkjTKXVE@AbdFFP71b+Q2SJM#3DWc zhvtt?CZ4A9zPOuEN0A~((wd*rA9QZD`DQf@f%p~d@n(L+N193a zbw=W*nh{D2w~!uS;0sK4*JR>SEU$%agQ}WsXAD zg@f6kx4*8-Zd0b$#I`&w{^#_S>;FrD!mTm?$<`N`u-3Xg&RGSqrR1E~3LSU+vyi9c z!)tLIIQnaUeAqx7nE79vdugT8;OC6fr=5dTSPFIAjL}ha@w0U?#{Od#Kz>3UD&;e@ zoOiuX;4Ise84SvPR^T_$DrBzG7RrYcq$3^cnP{r0~}WWp(3U<8xVqngzE@_RP;L}6#Bc%+)!O5p%A zYoHT9mev18Y_f8zL?fw zWc2G%XdRSUO{`~D#Hsn}3WoB}%c?oyjk>3NNs%Q?t;=g1Uj5uyWk^KLW7`6?atvI6 zFpkJc#iEa96I?jFAt6);Mt}LpzdHT?^Ak==f=2dJ~^H(Jy*i`__F8a8N{8)I|>eL~;DX9(veaSS=l~;+NtL4oNgd5S6 za;vX)TL|_Gpgr=)6^qqP=B&-P{MLZdPJmH;pugGbltH7s8!EPbS>-b?A*6BU8rAiD z#?fooz^brpArM$h9S;Vs$(UC!nE~{tYHkgmnJ)ZHuC+Du=Guubww}bmcDW3Fe2&Le*`vBU8+et&?OR`83hDsWZtZ zNTXO{<2fN4#dz?t`Qnidn~xi*`xCj@AYMcsJ){vxnXpV%oIa8}x{vs5g-|+*>C;AA zaN4+4kR&hH)GE5a{S8mvbD&bjaTlY}cO|E4Sya@GnbCO;By(y!)!(O2{1IdP zhTH=4yAjG9fS1ltcO17S%bFE6!BB%vo3x|0VhgMkXDKv;-M&P@m6~e;M{c)IaNv4l z4?;@1QZ$P{a&>UAlY6b&u!4=>SwoP$cR6gs7B9y4cAI_3f@_~o7sFA1^Oj7eu?SUE+%)(nKE@J{=`04FN4m~*2V4)XyMN^2wbr+62 zHcAy`h+p_GF`w|}yGaY|ufR9Pd_X=fGZ0_jt!leKkR*9QF{++|Sw+K*LHe;GKy zPf;N!rC~L8yrRYdozS-UEudwdY&I$?9xk2DjSbd5l6K8U9nXS&B6LoTy-Su!?wgxq zO=H?0oZf$tQSir|Ipm+lH|DAxI?fNBzsIZ}pwdPy=AK8^`NbVQYd$d^(fM~-!k@X| z0*(QuBR=UHhe6MO%SJGf`XAk%^4MBVh6M1!1P;E4kjANXRLXM>!)XNyIZfF;9Gh}U z$lB@~iWcvnxzZA^NbBUewxhz9MIYe|@v1Y5#juAs3^{iks&Wi<69VdX_J%|_`~b=k zAj@oPY)_5f3WPvF|==|$$y1I`2xWdz$3R#2Udjh3X-r@qW!>JL{G5W zneMXAbY;Of?z4kbk#{#@Gir>0yJnWhhwmwTkN9vgWuI1}ExIu0)bj@IL>^I%gRvjNHZz<1X;-WbgmsnqOEX)%(}*D$YFb>5tz?NHVAy!jY+JqvN& zP9v>P7?V);io-5X-`gti`AuUu zgB%GYyK%OQR@0@``WiH~LUxG{%z{f>P>^9=Uxt7Z<|06}Gj9v9Rvp2|r`v|Q* ziM+vKVCus!)7D(>Jij{ihD^VmYwhk-nYjpjC(NtvIZrKuTaS`AoW7=O7&`BMtDf)# zY(sS#mfdaz%XzT1Bk8=VN)HD1Tg~gg5uh?X0B*m4UjaV5N$AJ#tQ*0V=@v4yB?d9L zGq6kllzuEv{ngGD$O{r=XdT;TnQ;6ca&_l9ol83#Nh!sTl&3E4xkx@cz+&!$x#+5N zVcdYHL{uP15$jBU8RB)(hv#bgb?ZJ#^AHwb4=K zS;gQf@gl);AH6pxq#*WikuxPx6BfO>A>iKG1Hr-?*C;JCrrEQ>g&`!PeisJ7m&r*&X^hB z|7S*X!hHmU3cW5(cE8{A$(uRb>59_2QB=0N+!OqaGT|;n0tmtlUA67xxersdv4ad% zpMx%9+L_qkYP)gBcg;F$3R>?~&fM5w89;7R&2<^~Ds(WP?cAHM(Nv$U7oY0_l3IQ* zNTnE(RY%!{G2xI@WxrfU8@*xZD0XqhKnw`Tc2?-ZZ1$Ah)y*d+?RNf#QMAS{?5}WP0Z@kY80%o6R6J_xnF zg~A=z@f&1nbdLQ7!3>{&_3P=W?1`NW)eF=ek-LLA^v}hbmr-?^Wf`+LG3$vyxQT1H z)x$bqqnj_;pnhTVAPqB?sY)!ec9y0EtYKn*!rdQse<9ye>0!w3sE^NT9#qO{BcWCI z6SnZ1QjP#Zqlu)E5wm0@)qpdrj!sx*cit-_O! zmS`C0-EBhq-2@?YS2pkVM&%Qz2ni}WElWE8T7kPa1YJ^sdgG|6D!1okDAzx`bj6DL zC8WvSm?ki6`D&@r7n}lL$j$`iUeR@O{6FTC##~EW=oJNA<1fbyKZ- z$6~x}#uX(r=2waM;XlWX*hr=O?(%Fz^nhLtq@0>y6*9wN|C*PfM}N#MnZ6&PC*BF7 zReFrkZqDuVjhZx>{PkAdG(uE>pSh*>59+nWc(hTRQuyntrY+!K1=#6!=4_;ld0#1PE%3>Nx8|`7EuPRGA*2IJur~iQpmnD*TAT zZZ%MfdB}RGnYztAB+$;UzuH1i5(OTDP7=QH%Yh z$$fPf4-_H==PXAnl3<3HYBnn8@wy?rrfLH7SM+_7oCnNuDoLwUKZ28_=b-15eHoPt zIG$c4DiFwpX0gH9DXK?r4D*!Y_0u+SzOH%O`hcFdb^o>Rj_8vx`PZ49`E@ciLgR7a zAfexE4tNv|_KXjyRVtB&wElMKIMO)6lX>cRt@Ni;N@DjSi7S58|rLtGW3@pEg2{2>CqdQlOS+Wz(XxS&VH;%2s>R;DISIoCMd& z9))k|V}^2x994I-VJMagg*XrRd>`@En zcu%PfV}2=n;chAdQoIeKALr`rU9x?8&Me{^eg@-9wb=0*j8x=lTMO5 z1yK2L(eC{{Ts+K{BfGuGE17H5e8>7@{2FNAP4ZLQNhlRv!dmlkbWDVVGK$onhdZL~ zq@t?A!f5jaIrG?xgm9Cm>V21f4YBQ+6&_6>*>Sas> z@-h^J#r7WPe+s`raJ?MS$E?3ErGC(oc~SGzIvtL(Rs4CoQ1#S~6nMm}3j%Z1|Kou( z)umjlq1h$b>LuV2&i&M z`_?FYm~9DGUTr@w7c)%Qa^cFtSd!>;$H%rjHE(+!dW%$BKS|jy`2|}iJf(?-!}Twk z>kH!SUXwP-r?K#nQmng#~~4d<;grR^K#bR?%zOygcdr;7$Y~b zt?SP^*dFlDd>f}eq5}xz2#^2)Rg3@AhmHy|C>f`XAQ;x>YzDJ*v4$g6=(a>Zbg(Ax z^=Z%M(vMQ}p>5EcY#zFN98CRKjkTnvRB1j8C;L3!quNDjJKOEOw*9Oma#4&Fb~+xL;e^%cl2QX#T3w!JU#^F#XKB^=PYxfF!(U$DM8~2 zHM^rK_^e$^P)Y-=-+9GgK{iGVX%BKr9&EDzS96EG+uq%rVU?X`YjvjYOs&b_#YE`f zV96m1h}*T@SqQg7yOdfPCOPZyuS|DVy%|lpyy#@%VcLyfAx%uCXv{*gHdk|GkgqI! zXWGIq{V_MXCS2v6?SpP4ZiMPx@H_=lHOb4_b|MC_4}mL?AIZ6nIE6kCz#pq1y0fo) z7s!F_{hw^&uF7;S&{~S7Pf8I-~L)xQ&WGp7&8?D_xwC++* za1%Y};S;FbT8KZ0H`taKwYdq|CMXzxes082$OHx0L!Eb$MjYn}#2dV7{36`(W6o5X z+N>4|ce1W8rFQ}nV?%*q{G*Nbh31`bi^!bnfut6g`sKD6O)B()a)h&15z+`y0$3ikhe-J|zmqbapoK8Bhnj7yF$ihnc1e zOLUssOphBETSs=>fgNG#8Xa+~O>FC0`!OmSTadQKG<*(ARq&ympoYS}!P+V}?!Ym| zJ9!Czmdxebea8>VBu6tn80xVK=Y0e9ueP)*@FP|ME16!apObg)K_%9*D8$feKNmvu zY~8$pis??eH{;_Ic193ttW45e3ufi)BA0#0>W|l0Md}8z809+=yY_x7%V2B7O_5}; zuXIQ#j(|!|Ozr8=!ZMT^_w%zCRS51tbgekx)`>l@m;NrPwqA-rbb?xlZfc_#;Yf7R z>sWz(nx?fQGS&DLwhKMo6BL3(LMn?$ZLxow;a7bi!Zg_c3;i3arX`{2gjXo)_Su*c z68?t#oxM+wOr_rT8dp{5?L`n?gS)hyC0l93@ zTdnH*WQUW_f=qsNs$=$Mg6ZRb25;+de+;&g@WoAX9~q?6;Pv3c9TEF{Nsu;=AV-2t zORw~+UXI7k&OLve#(TnnwfvPydT0vC-~|~6EnOIf(wFfG-9GovkSw1pvudVM?vd&eq?JuNosj8xJ7VBsmyhmdr}@N8<%LS zkNFBrYNKzmq=nJ)){o|;@+!}NgS?#PB{`!dvo{AI{<_MwpaXZU@qQYFPvrZpipC`L zz47i_>YiLBVV5OtP%g{Z9m%jTg<^0i1B(rA9 zX={v(T}zaYGe6e>kiku$gQE4|;%5&F&nG<1SMrFNPb3qZHpIS11nF^lEQ(|OD}_F! zv3=D^h%8J9Ou;dO?Pt5rQww(KSC?4hJi>`P?P}jNc!Db1lRd}g=bqLIjFAHJrx&h_9@IOlTiuD*Yaj#pZ!m-A{?~Yjp%~~;S7v9lR@L-ag5HUtL~p? z{&g{`Vwv{Tz%ILlNX}<|F3H-me(jVgO&Yi5Z~0vfT%HZeNjn}pp??!m)2w&OxZ&UM zDw~z0A^n=LX2fy_ZKAS8>g4b#d^1+?!t-yyF07ZXZgLxU8hQE^IQQEVZ6l{+Q6(R|{i$YBi&Mwt=ii(z&rtMQ7Mi+%CXKrP# za4xHZbTUeS$Zm%7a|hJ&plp$s^2yg1`JYqeTJnzuQFoGU7q|7-bjMZ3+AEKwT#MqA ze@qDpS72h#`Yi=@(Xy>loVO2s=140ap6_EQ>YS!nKvD|7Uo}H|grZQtLN&x3eqEgU zDcz{chq4g&Gpjq-^X%_h~PcB)ZUVM5nrJdxdWqR>=Tr~7%|$us1tDw74crSz9aRN z{7pK0e38AEWZ|EGSpqN@uJD?i`w#eA$$B~MHCMu1k)0jpj~X6Jblph%vAT^CZpEoI zJS5LF)!qST88CdLeyyFzHToqif`4Hh_ZMibH&7KwAX%}iru5B|ckXp0XhSqG#enJX z8p%*G#+w3OT1MKGgxL7$fFl7*wZ3*rqorbHftH`zd0mwaqp^l=cNL$w>AFW+!hG`c z+lOEw#?>@?&o|g?cj$RBRyMTQePixcf##8paxjYGp_b8plg@dit~uRw89+0Z*#Hi% zY7mtVe`Xk^KM-_0wr$nuPQaLdwzF6gwq;3j7Nl3*OMiDmU;_U~@ZlfDH57^hk0@R? zXmY4!AcHGbpQC)_`aZK!PG|3HxdrJVpgPNWtbzr0_KSq5jtAB?no0*v*McJy30nZ8 zt_j<-Jr9IW%YSlHiSJNQ?eUJXct%eP8nURvu*Fmn8YODOyL3HKhh1Kl*IlYy6WIH& zo%_6lI-#)eh53^!iPruV#eIUh$MAUw*hALL3LGTtv89Umprp1|Rr86cj>68kvWFgr zVFqCJTI!q@rZfh{ssT9p&nYZ8Y=a)UzIt#BI}>Nk)L^UiCcKYJ z3b4VSHe%Ijt|2XcgZ{zTQrD;-ca@Yp#5pK67ubcduQAzlg~L_Fs$V)!lE|qmYl2*?I#Jt_e#P_FP?Qm z>Aim*x*N)9_WJt7Rglm)q2lOqW&1w)PR_{+i}2mX?=6;iWmS``7s&yDS`-jz%+aSQ zTqjssk3P&u$G2}PYlVMddD#uHG51>rG**>pJF4#mGd*+RU(<++u6fx2j_43jpufj+ z4V!cXG%xjMEe_(x&!zZnmm5JQ-a?Z-O+6NLcJ$m97RZ~&GQTrDjEy!b2WXRtR{5Ao zoTUa%o^msB!~9?M^rBzEC)8j%cYEY^tYg8{Q33_X z#3iP>b(94C3tD&Bp;W*yaeVJvh4;d1=GH!Rs*9pG4Zu>Y82`*(G(Urq&yOh!W&3$q z`T^RLu$Kk?8nclRIiqW0$DmW63RH}O5Jl6|X|2T(6g6hEv`wG7YGJW5Zzh&ng66t% z$#agmf7}6S2s%M~f;P@`bbzTd{5QzA*gc1xQbT?(V-gU1x&(?gR7r&Y+Afrc_4wA; ztG2Mj&wS9pxbz{!;4&!E)HFWZmLS=C=Rlb^(K=#J>F_=TG4mXbt|&g&(oMV)7hZ8^ zD(zil$1Mf>NoYdQ+PtF)3!LI{6h&{S`Y+HIx3A_#%nFiUN8~kdW?oh*^i({)?+!C^ z{I=)h!dwoEI<~38y zt^H~H+$aI`zkSU*MuCn1p-M(~2UW7JKRzyrfy`JslDjJkcOeB1b!YF;6HCTvX_7eL zMPCOs){MA^Q0tRDBZ#256TR9capE~wzc9DR{kG*{Ol!TyNpP>!G0|j13O_Di+B2Pc z9`#EQ3<0$%-hs3^Iul7a6GnFa^cjJxk23b79K1<>>s%1w8U514EQhmTc}WX8jHj(0_&0N9ykoSH_`arUyEyD_DuW0ulg`B9jNE- z`Tvkdz@-;#Aqa6(c{d(2FP}){t%>*6L{{;lDgBk=^YO7N3pqeeN{&E)2Cjzia zW9OC4rGxpqa=7oKw6Qe>>k1bT;7HQE%(~5ea!@$jSeNwRLHRIfxh1U8t^lOs;vTY6RmE2aOF5dRkRo zKyGX8$WChAO3rw2%D|9HIS`;b%SBi1SM0$foph5c2*j@+vJ}EY6P7BE6YMhN80}xG zWX7-aFBf~$$AOJs*QbX6K%K>7Y3g!@Q#%9qZQ3TQVlDb3TV!MAo}@vLn54a;mH6@BZjgXc{%k^@fNUoh?D;ZYUe3HQK_ULc7(T2-TI|HzhzzjXgRzhg3 zb0W#Gk6Qdd+D2Owr`23KK{=4)?f)C(0YmuYG_)8HoAial1Mq;nGd~3k)n|8ZU-UPA zu9oPs((Q+y!9~#zsYDV-2WG7sBwd<+zk4|iM0;<3HqiYQ8aqj`idlqj!;d{q-|fuG zy#!2;FMw;b7Hi4zXkO2CsXVmOUmLiS?#*zeub|wm4S6YQsi|?QCNu8jN~})IgV-hR zv$&d)TpWh}7xCgeT(pf&&12m4L*d7FezPr_THu~31%(j0J?0mkl0NHXxb6!Uq@B;l zPoMDD4_WrYnL78Oqy(H3P#r9IC#2|y@l+fxD2<>I{24_k6fz_whS@&au`=kGdfy^U znEF1_c4cMW6r`KC4IOSe`{*;pZt_0BG3KI`<`sGuW+LMOfvS2Dz+Ue!TiUMw*&*kL z+jNFJ4Mjl!a%G~GI66>+`q4w(mScL?Lg{U?0}Q;tkhWTSPP0{xn`+;LOr;>cd)aiD zMidyEY&s^pXPUAN(h=7TjrP}J2`h`V!^2&^5`ZKQFkeM*>m7;=O6$rxk z)*cvWD;g}~npF_s{@hzCq(EEdeR7J?=+vL$B_w6!8?FpX*V)pucmGEN_*>i5RVvWjUCxba+*| z)YZa#UH`l#XPESZhilnW#h{^ef z3U6s?$ojKSB~IMzMJlBpc}Rk#oj(B z8WC^H$r1d^s$(lXdku<=`%O|*>i z+mnG!?E;UOEj@$uzQHz7_ZgkEjUHK@kN6x9VU7*l z+j%b}7uz-djr;eOMw>f;&jQUSZ+>9Esx4#q-3YlLr!kt^uJe{UHLAlb?T%u4*t74} zu;%SkQ&5huycS3h2UBW8mNUKvaj;(C1L{wW`VSn(>?uGUsT7`x7#?&*bYqpkysEBVB@(07WR zt$LO0IzPnoC*WC6Ak}AOlN>exOjaxX2bov2^zvLj_+pY@sSqpMa6Jo>ofvOP2*jXt z?iU3&~pfWv%CPOMACEt_Y=`zxr_gDSZ81QRV5?V|mdJzLybNdBp zhAu{hfog8CUNQVkPp!svRYd?v*31>b<|MFa@>3n(@yO~5!rn+~MDDjbO(t5}O6rdo ztJ64O-V^j6uI-_DQb>V@GoP|zb4YRCG1AoPkl8HUsY>SJlCUfj+$G2_%y9{sRah96 zWsR?kiBp5ixjrgBoY&#nWqVYREzSekq-2wcsCA&Xi&&sb#M9OrL5R$u*2JTN!(^3h zLuZ}O=`O_YK;Jx1Zs?3JBi3b`x8h~%oeH%0vK1x8fhD5Y2w~<&bIh4#6fV!A-;deM znij7bh$PYMFSvex2}3o1B7vF@cK-|1%+-%&VV?a4wLgRbA}0w7^qTZA>5JoC&&>Wu zx=KpfHWQ{EUz)LvvnK$JwYth4BQ4U$3xs={zmgf)P`ht_u|2jqyVa2lM>23V9{ePj zh|r|Y207+y@w2*;g?9^`OP&3LBNJZ(dOJA=G1u4X$=9t^rbfU4d3qu7Z=3d8L&QIL?fQ`haSFyd=0mBbavPmvg_&uWN5mlxZXqF zcOUCOW!{}F zTl(d&)g5xxs*NfNU1OJ0oCkFpKJ&wfCv`IUb012*qVxRKK#qHDyTbf+_XS~%pX^%Z zA{J)j6XSsm$UevSj`wZ8sP8&bP=bL4Ui!4`<(fGn=_cT;AO#0MY354Oq7eC-K@r-2 zamby|>NDJgDha3BOP7t^p_eI^I+wbF2V`(n$RhX^!p5!1V^tS^>Y7O4Cqy(#yx8@V z7D`1f=a^2oN^+(3{+w|+iHy?~;cUd0T&JW|*3tu-py!*fBEdS%BInmwEIzql{s9)eJqt!8|A) zWi|3iA8SI%>HG3b@^Mj^7tP$2kXe(wFGED33Y50}r%_e6Av3|~eLp4nV_X0p@E1*=SD4uXUYgzLVi z_Gxw2{Fi&1t+{sdk=`cQXk0jqdDRvN!S1Yy>HwE*oXT0@^kMGQl)(42wtH+a7YVQn zDb0?nI8?vN9(2;!<&Ehzxck?(G5`lzGeke2AYT+Fq-`qi`T`Um8CKcwMI&}gsB%8; zPVB~(L4l?#o8H-8zhJRwl`bV%MWI>kLUmt@l}FobGDHA2eznD`OsQl^U)0ej)3C{1f7AJu z>UTd-jfpzszqSYlxWWO=O%=5_#7jYWhFZQ0N5tiJRqGij%CyD1nW=ceji#6$qq$~)bk}xBc1R%hf9Lr< zgAbTl44FHTmnXOR0pHqMF~(69`2)W}TI6y7H5befN{Rfr!7I)dL8ZQ+qA-e<^UD5` zWZ>vGp~PJ-MnOm~vq0W511>2^V`>tuAHW716F~1#v1e$OdH$Ok-(bS2eT&FP{s!He zB?J8NN|)*erJMro6@*V$W`F$4Y2J&ZVGhw_Ao^ZYll;+emyNtM+%+2hG|m};bZeR= zn6U3Sg8&w#)x&5*ku236?|;f-Gv7`cAzl!RXW}w)@X8U9NP)uK)1J4jjZ>=&BRQ)` zV1fJ_6rYZKtPF)&r!;`Fw2oc3kb>uJXbsqkuT&d0!mgCB#M*BZ>)fxv%R27~;&ORO zzd`O&)yQ3kQTS4Umj9DFMIEyV?rU3Ja9-Z%?0djpWr|Y5?q3a~nIGY7`e8mL1EQL+ z_If*=^pG8#I0~_nA#3L&XJ?Bv030SdZTI>u?Iw#@JD(2fg5;AQ?MQrBw&L4CfoQG% z0CuA@&KA>DCs$t8dEj2|G02824?ViEACFv&VzI_mzzh+0${?@Qg@WHDF;EWiwe$3*o7EGmoz3p9CbiuSIXuG&_ zG>y3HJqa=&=)1ra_r>sCY7f8RDV;NoOD84ebBnN)Qq>xvPEWT9vviJj${hcvGAXm9 zeu4Y1jLTlt>^47(`9w1@pLEu?)I#{oOvi&X^s_U)HbE= zMp@u9b}XPK>8y~UxELu-Jd@w44QRAhINJyAOx733K7rWr#(x;=UBbJb`iNiVo-tou+yxoZl3IneMGS{uMa7i7 zJ#`QYHQDb;hR!+#k2RG@Et6>S|DCv|mfaz5>QuT&hHgre`D@Xs6r6VQE@Rd1T|;qb zA@KPR520J!Yr8c_=(0}mhM;YnraU(M8x;8YLy8k@Us~S3?TSmheBicAn;r9n4vR*_ zquNRWM}OQukOi}(+Y@kr!nC>Fx(fw+qD9Y3*)!#N_>qi9NpCNIUUH3h2!9dkg$og; zJohi~GIc>G(R#*{nE-CbbL;}>4b~=q<1Y4lvVF?NVdhPi3wlQbKe@8hroFum6&@R` z;CX}ssSDi@oIIMNsks79j}oy|f%Ff6$$^PkW{3n(kFrtcYOp-L0Q<6PK`6%mD6W>W zTUCiykcsvbh`ej>WPfA6vHebHgU$V?Q*`REy1Q?mqPl#xg!DgqIko*>H$j+XnA$XZ zBP2Is^QGNi43);Fsh{Y;TA(4O7jIbA3xUjSZnegp1$-@s=JY%x1(F73u&*vP7oyis zPBb+uc1x~wsXBEC5#9A+pyB6w(DsKYRqXXwvV}s%RRHEvV*9DE|wHx3}NHR9fM!tpL_SdVvc=T2f)YW|FUDT zJL=8c_6$W#etpvVGuJG|gw08evw7r|f21>*Xi{T?QayR0-#Q*P-4inWBAHh=?5;n4 z^HHc#YQQTa5czZ?r5#9@6S~cY!>u2={SjiWxk0}5NwzJ-pt%>6Z9*TPu9U5n_s2cd zWCvdT74q@a-r@NjQ>;9oMRET(C?M6!drt%(mG)G#!%m??$V~tk65RyFRle&JizE7i z*Xc*&($#Zoni8}+gbNT%;7@{eofCW4@u&(_Eph_G+DGGaWKt{tatHzIdcbXtx}&rP zc)hNkH*{XohYOIHr$bdb?a2;56(TvnuJoJ%G%t^4~!#qazarfvs0<4 z$_gw=t=u zVPgA>q(V`8;%OC#`b4Hd?UaARl@CvTsk&x^ImliEv1GbVrbU3#%=cMFL`{TtwYI%u zQGoDYt5tG)NmX4=r@9yk_1Q)(z0P538Ejwu4cZ|)p7btSiz|{dOh~?<`uC?^SgLRk zx+>-x43`BUE>ZwzW%bJV} zYdZQw{XmxhWf(UU`WbF)Vi=hmSU;20{;JH&g|Ft9|2~$rC!+ZOr*_{ZppoxbCb_2$ zr`g~U2a5yi+!IwSvon=wt}G2_t>`+B^#5VwYSIGjNDIvRI%wxHPr1twoxt{dSTeZbX#OVv@pw300z4cs z?UnC&y2q^>xX;213UHXdjCO0SS$AJ*meWnTVT^cwcOw!{P{>zYRZnd8-VGL=ki;*g z*oM5!WTnJ!NF=an3rN`~RX$kTA4HO8`vtsssGq=BTt4_6qK+defJ*6JvRdd?&6uRiow>K(eq#OWj z9@3P+nl6DJwzk-BndSq6Vu%~TuZGog-;XNcfcOSrk6g?OJwFb}P%a++?y?*!Xs+{V zxv-ACI<$7B^OYPg0tgh-`?8Jlf}dv&WvNtUZIb_sD}T4`nZAT}EoZGk@fH}Mkd6N$ ztBdNFci!Q4#`)7TdILpePv0(GX`3=ri;HGwV09!u*npx)&c3!hlXEvbS5WPI#Uxz8 zo=3%G^{?#{?q9QhNaCW`Do)l5xT&+9gZ95(Uz{+}F~4{d$55@ud@cSiqZxy3;3Xtl z>N?gm_Dq;L7}?pCr~peDp7v1_Ch%iD0arkWp{$*p;2sd2rrp&4ND= z(mqIhv%N@F_WPG+e9U31_3#8aSV7W&M6=KGlRuAEn!{0lmRG-%SmOmgz=J}Nbc>Y- z1Y-Fvp5zRUl8XI~Be3e}31CXNZo&CKYA$d)tcrZ>jut%&@^I@{X}D1V{VxK5w{3?q zy$3yvj6CTFPUs#ytIuqLy0$DEe_rlch74~lS)yAeF+a{~!oEK!DglQ@dQ+jVQBK%e4n4WPMn zn01!Wb7NPuWztzoP3el*K4Uvp+&CS+gq$H6=wd_sDzRiuni%!*W(0mVzbyD| z*Bk2*4dDoTtQ|79Dl$L#cdTIW7wrTP2$feA>L*qRu(3t6H zXPiE5?Shbn4{sYMdbrfm{2PQvhkCTf-~0VaU*6Wz;a#RPzWxSH5vPZZDL2uGef0FI zap+ju&OftrXrs+KjiNDhvxSbDZYcStwp()*ul4zl{9dRsD-<)z_-Z;{P=~d&GSemt zr92wnWWaXKSZ)*E1eCP82d#tNYIUjD32>kb_s2;5+5>xMechP$vP z0RoH3yb?kBy_;-guy0n!Gh4Ii8LPyxpUH)D&sA&?5w<2;kbNCFq{>->Go;x9^J*Ad zw=cum*ziGmiy&E3dEy(bfxr`e)Gp3|@5-DM<4@{)x_DFR>drtR(Jf3&P^>peVLG^Y zWUP%BGveD5CdXkKw7C>q^5}jR zPlZ5n?#NEGUEyy+?Y)5+_oD-kN#+9T8vk3q%#ujrNB zy4Ecln|WBGb9bT{U=<8L<87=T{s8xBZ_BUvrJ9pDwqjua3^XQt7T6=wI6D`Kr_*jWc^EOX8RwrQ#oBB1X1$(Q}YAHk%=M8FCvR^ayl0SKdWJ&HF!usL+{a)(L)i zsqduh@XEW(xSIG7X$fQ)sZJSI_}~aIzPl+QT=3-(u19?VNe6hG2Q>FQ46mr%ae_0R ztV5aygkT^Pl^Fowx}hidhd)sj4xDhk5gZI1%?1)TEFnZcE^M&L&aZJbqT@;9D!4$F z@u;GtXpkD@D&XZru+ zn_-UGoV96;C^@R3`pz+PWGJ~sedUPK_5B(ua&2z#z2Kuuvv`4b>7>LybuK<4e+WXEjf($_;%V{uFLMmz{_p(x)L>x<4k#C%NN zCjT`LPbL7BG=fv}mfe{jSJFfNgsuV^_sxs0?Cr==yh!CZpC)MknkEiO1U;TY{sN5@ zPE?ugLzsj*KCd!nfU7}qc5RC(%U_g%#Df2i_PjJ%?*e(7ICjd^%hqG3=;&)8o@k}w zXxQfelbx_68`0*{L}OPym3|7uQ+)Uk^P~+q03Q>Pd(5fQLE4e(gto9&=cbA@tS4LU zj$b4`6%&+fDJG289UeYes+xYPjxe5a_qhUc8NkD5$QMMy4#(~2%`l~Ww*1eeUz-7o7K20o`Zc;AP+*lNDviveR3u$>ubU*b;ZvvyRBZWcHmUMyHlLrc?_B zhY!*ewSO~|!G(6W7^=$SE!@77qpf7{@_hZ)C&wDdzd1;e?&r`{*=*7bQ=U*4nSp76)YG{hZXL6;tMQ z5V+680fofrk#9HHF*<|WYu;AVcHNZop67dVehz{kX0mgv`gHnm(1qb#w?mg;D5{Lo z7H@Ax;mmmV#$fbVLO9e)Vy(Y>r4jVz)M311Xf5n(>K?N1aWB9MIa7QC-*HL7xn!Q8~Wtl59h1C)iBTi=KDv98GM2L_zKmY`6hmMh%Qt1tRc zKBZSdU+m(4IFuN$?Jm#N{Uo`uQz+`#{Jfrvhp+c-rxeX*4S6NR^#K5)*ha?sDj`d* zDr}Fui`=0Z|F`sz&w!r*Cc5_7^E|HC{$V=hr;8GDwrvQAV(5jsjSR`}KBIqYAIZYs zIVtfNZ**Itv1&$c48sl-%V+p;Uz;^5 zt`#mV(d#~!`_h|^7s8q!js$#UE8mbgdTaW%o=i3X9TF|aW*hHYu-^Qo%`lSHK&zp= zQf?~t6P`Q=%!BudyUgmc{uodY7wj-RR~p&3Pbi9*wOSq)Ak{22YGi;0EEJX!-d6(s zj)_Z>kq0e}Mh3mY{;@k#$*-hQ>BHBX$?sbMaIrfX-0PX&2jH3q{BcK;|F};qJ94jP z)yrtjWZcLK0_5oB03I=_Zvc!~YUN)IqZvGYe#W*`7ifKqv|1#RLxLH%PG>WzmZX6O za>AW5i#w>d@eTU+m?x-yiL}F-3L1j7JvQcLE$`Z4l)>HHH-4H$Gr9 z0`+rJ^K8=7?2+q2<|5&Tz^(CEZ1)4H{wgFRc<*)hnXuS25Kd)bVL|*t-#Y|-_2$|? z^O_aiQEKKJx=xUmAnItl8raDAHq6!RXrx^>{4ix(Bq8WY@ktigJ!W_ce`J z4~np#rKgzPI53q6p(IfZ6GYsN1!{VUi|oM8p6yOR=ysP!ny2+JxLbwgjjmQG$bGmK zM}^|jU~ty6T;Q%8kn5m_HJDc(H4n#u+FN88`%QP8zf)szn2;6 z7tFKhPqT$`vYD;5+Q+<*{%pW zS~I_v;!wqtd(?QpCYoFQovD{U!I4-`UtD4u?sXVBFQlp;dyftLhiMt!M;=J0KaEJw z7mUi=+IJmt$jSI=BwKLT*q_>>ywQ};&c`_GWS^-o8&s)Kax~`M76cIoPLvSWP6jc? zjMK0-bRXb|2NPXXYo4c6N2I)G95VT+eGpdb5Q4QVf7u4?n48!9&E5it*gvV(r*3Ma zv$QT%Y+ma!8j*pHZV3B}DQ`=U*nfKrv50c>uI9U)ehM2%N0{pSo z!*W!=Pi5o*MX|n8g=`uC7~7jK2yp`UyZ?IXXYG48QVA+E3+>XQ{{rojSU~INu2D6J zZ!e~cgUvd_#1bS>kY>aG4(N>T(jr0wFX&;fNQzh)5BSSUwjGWIiXwy)pjxhfw$@YZ zrn&C&rZ1L>bW$hT{@A>}+M8GwuDl>zc$S`3?t6Yp%@+H>Aq|n+YnMK{F%yZKJC(b2 z0vlahxJ}_Gi&IVrrZ)Hn!hXYKsJ$zS$J@8RCOz%$7g-priA3(9ssWs$YD)aYQ4g2$ ztR1QcEWCazgvt>16*7`ItnJWGC<+!*-?lrLvVC zg-;A1{2^_I>NYdddwVX$bP0SIjW{7GwG1{p2R1FF`%b2o*Bv{7RXQ~Kj_d4HFb4YV z>}!{G2_o#nrIjv)x%B}DKy%#ffK;3$3)>cx6K654HT#bNmI?educ~aQs$}b^U1^kA zSzIuG>&d9!DsJ|uI;fWFtU?af{CT$H70IrSZA6e9Y}~n_n^(3lB-^rk24So8k!(Kk z=6C5{KohT*{&nL1h!wY9GqQmDt#uOL?C%m~S(w@NJvzUPU-`+{mw_xmK73#~*WK@l z@86%lX%0e2H#tT?8uT4bex7D$Sx7#9-0Yw=YL7)t2ojzFJWa;Ju|c$z}~h zId;eAk`dpRI4?dGqp^GQ)ih*I;AqI-$6(MfIuB|Dz|TJ;Yvyl+4V|z=p1M?V>$ctw zqdCBOtNU4WuJ(_hm@d!@h1ITG*ZYwmx^G#k^yqA(`tV2r5qD{Cscp1cS$!CA#Mlqo zNZ&=?FR^EWz2dp=Z>d1h9i`Y*za2VaE?=qvFdp9t9u!x$LD0{YacAH9NGZ;u+clWg zCIL7wn6%uZ@b?4$fYr&e9JYTEbX>~^Q4iq|>d3(vcW(x)a|cGsGU2d%gC_{}>XAt3 zM)<-95|`9c8EY?haR|JK!1{YY&qhm^Jy(}UcaTir^2N!TTCDQWaBu)_ovQ z9v+a|@&kE%9Eu7-Cj(QRh~g0|enIw!suGds>h~5!nfO9Cs@Gr@X^2r^Kt5PMC;z}p z(6vLms6vm1(>MeDVV>tn!js)Gb!Q&#-&@?MQq^E_(^qM$K$&QR_|Nur$LmtIoA+sL z-eIg3Ev=|wR+L4m$21MD&wd`wfL8~%F7UIxxUq44m)M4B1oMY*1XewIaaxwp`u z=DI24XqY-S#@68-24=bhs%yc&a^z))#vuOuyt^gbn}uE#7$QisbU9sEjjCr|SSoD{ zFRh3Zd_I-Vqxj=3YE(~Hg|7BIa1h_=jD`^SQoO}Gk88;5*oHguuixp68Xmy<%}B_7 z*WS8m8JU?apEl~0Gq1`!w#hW;ZN=$uV^jYIUxy=tzY+gk#wz4=7rJVVP!ekJQL3JoFRv6c%{KV3#!JtBL~+TA^@ zAZa_;nmX=M0z7T@pPyfM7&X2Qj`yvJsRo`4`+zMy$7rKfoZ!gSMx%0Tzz##VTkPZYiOu-E+zY!{x(Z(Ba{6)Wx}`$^RP)4`&%iy(PsqfQ{9xP}j5k%? zWzk^s>iD~_EQHxZ&j2*oXDYsrPyy&fqv@Q5_okG6(eLg`qRR$%iEs1)MW3UsDF998 zF>U1|M^e^RzAg%1NK@2#GBsLb6Wrb;&3|B^v07TCgvUwlFa!Ei}E1+4`8>c915SP zOL#gB$ioEaW)%e=yT{ZtfLuQyNGn2R!THp#X+r*z*pomr=B@#T|Q39Q~KzjJj+iL zU*-n3#*BFpek{@2OGghN!4*lwQn_2v1;~w|vxKO5C~!{O1%^0qJ(PJAs2F9%^iwIF`oF0rCX>Si-lw7vs=|=RRK3mhaLwFZW{2xhx6SnWFWNhkyuv ziVC<n#t_MK*4s8Yh>pr0NAgYkS4nYTzn)Ot8b zB)caq4{D?x>Hh8G>ASIA5xL<$uR#S#^iUT8RV0EJpC%60!7U%uQsj5#KrlND57x7* zW~7r+pit}SfA;9#Rra0ST5$jEr*kAy$#W}JAhw@-SEE#*(4Et*YI?gw?NWqgayLQM zrm(Dx-r8)WBkfQh@Gd6p+3EeszRq@~|2-s3oIgRR7bU>&$?ILA?Ge#HF85L-!o!^zKGLCTV-R)kIG4}vxJu|=%4hDKxq}>Sy`Ua4SCNNv+@IftE3V4~S z+f&9@vdOdN>GK(nTrXUB@c<;jw>gc`Uz-ay^6WaBV)Nf$j_Qfs;A+a40_KN*-DP(6 zfT?9^U=Y9#Is9gRn)fLu>%F)4271p{OUtTKJ5;AjbbV1_`F-x>55o0bY9*wsv^tu4 zLZ5{U1-fWDg|R2%5ywB0zeobV(cMf>a}-mISIyM2@SYsZD~%89A)C#2PbkaPBaZ>2 zl9rpqCar^=!V(%(%^x;>NPsD)uFz86?OgR8ez^VHTw>N>VnT$PNLYJ)){`@pZQv!R zfJ5|9v($IM;PS*6kj~#N%LNHeHZc(4CeP;(=*~Xf_ApE@y|3Ob8^bg&uoNXH9C(?^ z3=sZcomOo>EnfXrsh#FS45zm)fn@MNeus!~=PWMlTPnz`rghviWtWok9hdUe-;!n_ zkWmmuD3E&tHuN<+jNVhW$2jN+qlI`i3JdO9?X~=Wid^%${@##5xV#lhkSG?zmlg2f-%NXhAD%Y zW%`vXtalxLdUv%)(AegD8n4FAKsG-wdcDsOe#@(z|?H5 zz7Tu}cWoNz&+&0FQze!fF}GoWkv$pF0H_|U4|=~-CGK)v`=lt#3kiQ~VV*t#<>1*X zSpa@K(0L5l1CQwS2F`#sdCs+OYv{xvjrH#iOZ4E3w!P^}`Saxpf1 zwjQ@-F%e)@o9$WThI}*tQzmx%P zJtV#hg7KzJy{xKdR-6Ylv1ZwyGn4GYGhwcP<}zBG1#NO0u%unmmoGlt{e>CRSql=! zz>^cx8C!G5O=jYG^9u$hFw?CAptFe9dFbsadINhQAK2rqB!M=-mHeo-F;t|5QfS>vFS} zxwZZD)6=7fN9W`pNVaf|3RjH9e)$WNvjENajr;}oJ-?u~PCqSCt~p78;IEsF8pL}N z4VCsqzm3=@^Wl}GEn4e_=7ZEs)3SUzBA8_a0@iK!+vpoqT&`hw>INrEaZfN%a9hyQ z8x5oehq$Xzg_lWWE#r*5othxO9{|#qB$FlEZtx5A*lLMF+(qDh$UTm3a5u=ic^DFe zdN{M;o|@NgG%Rgf^gOy}z|L;cR6Rzf;Tvf#zz30Mu&zuo7rzyye6LrMj<4Ivv`;hxmJuSk!m4^S!Ek(nQ~&YfQcKN+iEB!u|534rQV!)c%V-FLrIw2ClW zFUvodkC7w)%z4YsL1WXjWGH25`|5rL2q6xj>POoMo*P&1ox~luE5~`;rbW?Ov{CoG z5(>mr#CdIpS}RYJ>Yo1InuC(CBo5F@m_q~WzLQcYz973Bv{xnNO@2kTOeE-R{x!*(+6we@3K%Uwz@Kd z@L&y#;CavBptMVtmF&CCiqkjWDm&>qn>=dBXv28KJ0_o|3}wMIP|4EQj&0=6@~gdp7}I1)?m<3^yl8kE=B zBeMYU9M zVX$p_@pYaYv{in^cdi}a1|*4B^_p29gAlFxsk(%C2%)ocv@zV9EpwqeUADk%OHz~E zh6590$icI%M`@~FvpH+}jZPp{5EyWk;5(;2lo*a^xZ7skl#{m&H$fIL@j$7)kh#CacXOW#ioAtS-I+`^u^F$JMH*6byU56eEWN!QdO(%SddF*L+W${ibEMn%mIG{IDZ@LZk<05enoOnGXniat|fccH4)F9KF3xmGT`>b!;~G_uaW$% zmt@3(U>K!hS*vke?O0@**a<{$e;L_s0BkxCppPKxyp6p|y+(TJN6Oo+az{Lw^_tAN zKf+?D40f9BHIP;JR={|{qs4=(gxZdRrw0lbs%Yx$t=Ij4CY!0_D$zkp=_iTA-Fu?50o$Z!6n!oU&X5U z{EQ$8qCw|%DWNXtU7*)W*MZ_0#UD(hZNJ!(ULQo2PQs{>KSeT*-;zt=jJgpVM`{1z zm7!cHaK(GpaZq!xo1P^)fnY#&q|CBEu~Gb1L?7*m!#|~>(gFYx1PjU9h1DOl*V~7}4@LbP@_^jGJe$!sz(^^d$ol8a zOtQK7w$Z4h!v>vIdiLr=6@%OQS+`I=u|Ew!i9bn%>LG7Lrs1&^nVLx5j#OEGYa`;=lYlI_4%1U| z*ztK|sEG{~ttOIw$vtoQp;`uiO50a)zv0?4jn#4;Bpp^`uaulP@d*i4H_K{cLIH&8X8Y;SODujHO#Z)XjI|x|4^JFMW7;PX0TZ4AD z8f*G>-a+SY9g3B3S^Q!tVrvwgH_XYI@zDIan~1M?yf9^8I%h7J1jy#fZ$z|eD;6xq zV$#~>if!V+w+T;-765#imET=A-E|9Dn%uWbkSTUsmWCq%!OyMee>MF%o=<41B^Y%- zVuc#r5qgFEvhm|>hH53^zB88dA2ODg6$G4Hj;=bnxJAVA`ZVJqnVmi@R#+|Z%HRdX zw;THs3#NK@5j;M3VV*2-`nLVbR=RvoSY5O#h!=N^(c)z~X`bQJvD5@mTldU4dI|%E zie+8a-uYhl>MCzDGHdTsTFN)OD?M^dFPDWpi^O&Pnlo0BSvz)IH1$ER)dpVrc+9o( z?beNgFF0o3`qKMHbti7*XT3gEod>P(iDg~ft@O^kSo|vGj+c$@7)n zGYj_yIV-xsJ9Tybe&W|tF(Bl!NHS)ZegF9LU|h^`SC+ib1>&w>Ah#&2D$n)1o2bBL zKIIedOWpXz(xun_%JC?oX-R%|i9E_+fktsd$JmAktO^EIZ%&R_kss^40?g!D)aR5g`vR_*V?if`vr^0g7;LZm3U4np!iXaE?JY19a zHLSlEEGn9uAX4n7LURE`6829BO^{bd$e(WhiwW!>&4Oinrh3e ze6RTMH@N_YsCOL@@fXWO+0g*8s{aDAn{>9vM7^pAXYjrilY{M?a|Ag^&EVUBd2MJ{1JvRMPwCh# zXAlCxu{FFLpBJP$F3ulm#HVxyzYO+6V_~_EEYJ7MrUqtz=2Lz*O)Yn#kLtY8n=Y~? zadgZaBd`S8z~pXv)5vo~tpiS=?HqoOG;@I|Q$3X#;nL?Ww>A`(hBcoX2L@T0bZqQK z=*&gM_s3w!t{iE$k?b!}qXl$PlHk3M8y^NcUgJwsIBN)sP9002ulFW+n>0b(A$wx1 z=uz81FV3-aF=2dS9pms}-6fNB7UX=1D92^4d2ghPnHawK1^46W*jo7u!du5nG}TP^ zf*`WVowY8p`bw5WpyyJbm^w<-9LvJ0HjmY&@?7uMW=Jf04I1+X3|@|2f6tqO`eqO6c$Z)hx6}i zS4NQfLAiCZY{M}<`t*_FiygxV&RLWE*+{QBIp=NiX-?)WO3*~JI5=HwND zebwG0KM3iauKn5oH-47O++Ah+lzIi^XStLhqABK5 z=>6`w@bou3e`um3jrt;+kwC|)Qq?0cFAdpwM^M&CW&`KJ)z0iG%4{ljM|b9T&!$H6 z^+6IKN4d?(&U}Hqy8wvI8C(;+Qco1MNuKk=cC_%wa_GG|8b`xvt6A) z`wd?j)pX`lZJ-0XsP9~QPS7t96JS*cb!Q%(e9FEmX)_4Wle~3_aV#I9Hw@KUpDgG^ zprfgnzhq2z%2Mp1823nwd%6%G(_iDozZsyuuVl>AwK#BgHNqvoNs< zz_u@)Kb>AD z913Nb8UJ-MT%Vq(m&^uXq_=g;+g}P{(=}eB3gMZS`A@nt75kObrh;anqd@Jlj#>q3 zjn&ECI$hKS^LUWBA+hxwp^vQhG0WO`M7gt3X!skNXD!J_ZE865+8`Hm@_gx)`YqrF z-5;}OMN~ez!GBGRo~W?^ncl+aw@>)hmeIDch3`iZ4SGzXY1t zNbDCq7YbbJmgdg&$E zs4!-y>MXmFcY#K>%3P-D*NGvWRcgxAnt)NY%D!5rq?DR=cZrJFA)(|;2_7#WypETr zrrt~54waP+$H^vy7N$y3x*e({mI+6xz6XG7PVfdI$}rosM0&;gTu)_u*r~vosk+Zu zUu7h=u3f!0(y3Z&Ec?!YO!zq<%@*keJ6MWb!wt=oJP5&`^+U(QnD#mOtMPz!^oq^H zgp`i#D_~k`)(x0#_ONO8$1k#{5Fb7NOX(16K{=!KA1>{mXT8T&R=mSJf&T*4@8-sZ zt^di|4ChFoCxp3Hqlm}7Wq;cqE)Sa-3;z71OeBGW7C}G@*+^Cyao5H4!xytu4BjTH z6JzNIzSNDb<3+I^W#B)8aAES9D@pdcrT@pxnw*1vuq;f~<__VU^9%Q6sUq5_*D;L< za?>#dBiR%3)yy#Hpt59O#(s6t?%ojjz-QZx-zwHv7Ur7Q8gGQwSEP>*k)@@-KwA~? z_I_XIzEIxzbB9;E_adUluCqr6tV94y^&V(C$$<^-+-RYYNYzNY(m?=v zsvS_hV8N=w`d!vK)O}vdu>5DXG0>bzaWu(4BqVkI@dD zd#IG>p=jo^Ou7PE5|I~16&=48lhm1O+E(>lnR|MXkcIL}$cSoE z4jvkm9<-27lf|e$3`4LSj}`f5EyBr;#Kc*ofN!H=f3akjE9zkgT636sBT`QbPycDu zw$>Y)PkZ@r503i*QvdjpF>6Rgy~0302grSuEkNW#p1X+?P8Je0a#oLuXg5Yx&Ob6> z!L<5?Lrq&!X_1Y^g8w3)C~PMDy01|H;n?B-x~j~rH_PG?)hum7j7G!gA&XG z9Z3uSoXgQQ-vpsIao?e%oT>oWe{Or*!YWBG=yE?;ab+#yi8ipy1mjCvpN^dx6r441 zJL+Ay7dE}mrr40Ho~R}eF24uKE2u(iwxsWl-1w0fOR-5vvmkkLs+5BkvXtAuk-i-F zVE0SEiWuWdVtaPe@fx3W**#~O?S^6UxAlr3MphX2lqrvGfqfl%7cQw9>djwd{Z>|g z{u-uJXv9Ghp46!Uoq)%bu)?jauxjJ@0rkO~4j|p_p!@;?+2fYpa5O6{p#^2)emRSC z@bCIymLV14=r9ns{NAs=fk!DSiOzZqfkO0VxYCMb&)S6Gis%}WZlKIv*AZvMACfl5 zW8WOV+{<;gTH-B?i8hU@0!*GlOn6UZ`X7`d59z*Bz3jWFk|B08oP~^bl1C669pm=U z-t6+H$!#Hd#>mxL@+zBnSaGegYBAe*H@`=;!9JUu(s5R{|CsTRHu3p>C(i*?dgck@ zM)y|hb=|;q=E>d|1qdGD{YnnYqY8zLNYGQUR;Wv^ICfeQDl36rnXOXKA5fX|&ToW2 z9YI)pF-Zja_&|~bC;dj;eYqQ9{*Q6K1;VHqqzjty1q$m|sDPUZ2nZdC%|K%p`bYGF$U6ej=%&xo;Ct6KN5VM) z8GQ49u8Y$)4QDoc6$IXW^?kFMd3&9S`R<1gze?QNY7p+vmzD|!D_MJt?{G=xgmhy& z$_#?@-0lv5&{bX1s(8mE659gX3cS2sy}1s5j{o^t%((l(FS11WuXDK$jILrgd~a+S znbKy#MIWmiN4C?R_g7WX6uQ zAk4F%WdB}2>FOB2A~Z1KVy65Zfyxr=I_*hb@FT^I&3)L;S1FV0torH?m&|qE7A|-p zN;I@Z7KJ>_Uzn}j^`R?>5RaS_CP2WN8VsJio6hHFc+_Heh%!myjg%ozclf>e=L-Mn zV^qZ}|0O3@f|7wb1`VH`$2u%zWHV3~6ofRS+R;amlexvYKvbb>K=b-K)ZqR+!`@dR z{KLL@9)hixr$r(2P*#MmqVmt9*OHob?1Bbu^UHarnd?`|gBce4Ra88nZnK#sAh(T? zS)HL6b1Av$#ATyAq~23rDpoDc0hZE6=tc-ep#v7!`!{|tb8^||p~61FwSzPpyCl+! zkI>}^Df&9J9Z1eZGzCRe^a0&i^45RfHp7h3w=%9ga#_VPO{ZEbml@ghldEqu@+!MN z$+0T|5k)pfq8T@Lyf9NqUh^~yr5o%b_<#S$i(6@&Y>T5^=)5s@3cnRFmD#JPkghy- zbRCe(42;NJqQaz;K(MjKkwzQ{>(}%x*62TIlv4pdnV1Lxwx1p)n4ZitT+HPLyE8vM zTJOU1M9V(bAOirqLQhIBt(@ zS=Nq?pMeKS>^7a3d@E77;DevftLD1B!zpH{hkD`~J&lEeaR5|LoM`+sxuYgD(CZsq z^QV6#47{dWJ(oh6)u90i6Y30f^NC%Mhbz2u8BHaABDG&2>NRFM3vSfyX%hMu^lmdd zN`InlIdzKgq{=Gnna?EF+uLCkOanSWq#Rmy;5Sl+$vqt5$uH0cpnLWgXdQrlXqxA* z(hQVb6b!eGbzWkEFy46y>eCDc&ZlY1nWPf(?(0hlG|EAQaKHNC7pQ{`srf|R$ClA& z0*>oukWkLq^FEan3xR!gJSMb27bx{_S?B2>@qdaC8`N9Z(W1! zhbZx!bK1mfN(InSy||&#ipa_V#gj&W$PThImYN4#ue{wq0J-3eRi+pzmig+|#Y*|H zP5?6DlSs}eFeV$KLq@jf>21$!vN;d|@H-FYbRWIh=cldBbEY8L9Sk=HVAS@)J;o zE-D?4?#es|0>KHQNf>NzGVy1OXlP}i-b zJb9N9Al^{o25F!3|2H`ZyC-lJ1zV}4)PvAegu__MAiMfgo3FFXt6mLk0Xd_50{AeO zp8=l2-7JmMgTRizeLZN?0D#Dc?vK184Ifp>(_*>Y^kc7$Jyb>1Ch{>s3BrnpB-`eZ z7wLdUV&Dv=UxZdw5W5L|%bNh^*8~^KDys4eRk?=44=obv2@8Tzzfh;U=hCGI?0siI z%Y~DG05PQL`02<@m|Lxr!ZV*ou3|O^+O|A}3BK*`YzbBQ$NyQO4=xm+g;|*;#I45Z zRzr=1I@d_k7rlK~(SraZZWpXG(azFkd z%j=Fm-Y%r=Q>c_@OrpZpg3NX3|F!iCB`zbIb56dg-SKFD=54O_&2(Wv!OF$tZW6>Wj=^8*zUTMgXwUXuL!EI*ZplwS4 zOD6cR9U5>vnn$_xMGuHMbJfERlHJkL!8X@;V`k1fvcO2@l9d%ARk%o4rBU(Dv35VB z=hF*8`108_TQdurhw!QEa0D>dz$vP+U$aYR{Irj#U8u2ZDnjaks)d+f$&dH`N!Vex zU90KeyYMxGNuJU3$;qB|b;r=uhb0>B;kd0)g010MSgBs4?`EEZ5fnh6=_!BJv$Ep% zQcoaNN;I$_xH6C|#uhB3S^F1`m>vtixkD4sUYv!3%A2ArfR8E&WF=U-6pw~y{$;D# z?Epkk>Rk^iAARj6xo6~UOA0h~4h!?E{{=G0r&wR#*LyyGqrkpt4x)`MPsS}x3~%aosD-{FT|LxfrqMsLVStyG z_5tkEFVOH@^8Qk*@YKT82I&Y4G2(6#R4ckdPQhU^vJDAjSi?IoyjGXWw0=(igiOp@vqDnq}y`op$Yuv5dTb z>hH(0O*j<20QvZpL_ls|p~DoFU9Bgoq*mBA6Eorqc0o`khU`|FoB_Q( zzz9VDnWNJ}%PeiK?5+Zr;x^L`o;ypJUY2&&2^bl7dH(i~t;&!E_8?Z>kXEi>TM5CSL+oQa>{>_T&pgDP?ujUq#U@vL)j-sHsGo;!V#TOqoI_z-BvBBqH0t zX(+e1eXe@OU$adOLSgWMbx5;r2UxKO-EzQK84;ozJcR!3#xQytEV}TI7q41T_rR{rR~g;RYCL>yWT>q}u)3yD&?|;+qwrZ3B@8&#{UI8~M^? zT!jB@x)O#bD_+U1+ZUo%;BpSr=w@KYsH<53GhhbwCSYF1e;HpLWi-`hm}PQZxRZdm zxz5$d>zX$A^p`kq4Q*r8%77wXQ7cBPG})4hS;u&Ds{Ff4PngKZUm2MUH-YGW{`-4x zj6B&xvbQ-24*5Efi{cL1AF?mLGajf8mnZmpGq~ZS^9ddmD(+c<$=s6;-aZPfiw_i5 z9M7d>zMO4cn9?!nn`H$5gtZJO!~|I$J|+D=4%Ls%3SUP_5H4OS*eNHke>;MauFSPGu5&Ny8^=t)Nl;%2!2O0{ZiytyHEpi4f={Nz`nr3dX{lL!P?cgoLPyiun-ME$` z3-M*`tZ&pjsF5y?4OOj?*fu-hJ8Tf+?{ocDx{3;K5rC5bo!Hf3=!j^VL@Z2yABT0IeT(we2(nNk$Q_0bcoN;SVI{FgDkYvOjoY+9!g@H3fj;S1INBo3{D7jly##w>AE_U^v+k|3_{xJv@(yN} zR5Tfp#IKx3z)T&ve!g%5{OsE~#Sn~o#~K`w1Rn!nN{=cU?t~f3OBRlq&E1pAGS##T z?DJ6sDiXQLE)Ea<9m`q_;VM0;*(y8RI{$6trnJvW^GRm1d&$^~`ukW3HQ$223N9<=6Si1D!r7Y^D@IS7Y5YaS%q zu5k3i9$zju+uJ-?X9RW`wz86JLx7ylokJkl&1<+zu${dpV|v0oLy_m6h|1C_=Cs?V zxw6#L?Yz+MrO6x(R1 zGeX5UMhhkXC!7x>)Uve>&z5MpCgy=4c6QnAOY6%34X@7C4g;-Uc>Aoo*05J*!|oov zo=~@hmw(Qxc02Te2!EE}5kROnEI@pR>fVdK&URC+t20A1|CP@L(xeLpXACrtAeac2)iFcylKjLsj3nKLK{7cmb`t)#iuc#d2d&?H&FM&@Qc<5IdTJwbNdPMv zusw9)-})6o-4msppD~@R>BI!-PwD&jyxB`is;*rPha(gR{um*%{g+FUDXJ}ra7>4Txr>m5Y zwgFMy9zfxMVP=d=k9}8${S4!a={n4k&RLh-yZ$1&awE*CyvOhBfb7apsJ9ESpLzh4 zUfh{Sp~&n|?l2uQ%$+{)xkWsp3%qGg%}5ea`jYOq@ ztJg0LctFMnN#2Q}$+3b3J}`5@Z=XVw^zg}=O(tCTE9O6q1RFDm)kVvRpD(`GWuuWm zZ9)D+nc=V}6S$#JPcjDznh_puj8s_n^<^k)7f$IRb|=+dM%QsI{a$&OzYu7IXV50z_-w4NJLKJQ@5{$- zkZJI@Y7RkV=@YGaga&--x+wDg$;P0S$(sQqCpSBHLXmLn&|y})R2OG;D{v+a zPxk!0kiWpW=iHr;{Ua7BQ=|I@Crb8Q8aiw3$S=XQaoZ2R)Lqpr?FZCVK+@5dd;6l@ zt!Y}Iu8d2cI{*oiFw4Qcjd%2JcAWu5ZTkk0zo#JQiuw+>$rs|`&u3ZSQ)tzTbc^`V zWY;yTpiM(jM8fsCbd7h3D=?*DZ4FOYVh`WWO=>C-OTYYO`7U`&x<*9=4FJj8SR z>Jda!tqmP82YnRYjm2H$H%5p^m7a!7=#n1q_IJI|>-}t}N9nvEWTkygIz!Do`I{GF zB2~1HiRq~Z#;`vVmi{G;#0k# z{$)Vt6|-LX(aIkecNgVH&^HMBchRI*b9-^>b9JoHI7n?T{@t zTp?t~y7(m|Eg3Oqec|n*afw2&YMO_}1#t^Fks;|@9!vRNWVPjq31!Qw_#kZewHSlA zkrkIdLvZkw*xrq3ZcK3!jRA1z&)5ltZsAjEoEn5ODbX&vYOMFlQ#m*8=1(`Pn#X^W~>?mJ}& zOqp#F!n5{7r~@j@*h}NBu>P?ztJJx2k6+_XUl+cX%RVl%v}by~%YfNH)~k;66kdR<0_h zZTEVR9D=y~;j0yS7C1k{dxwM^n)-#c`g*wL?EZza!U@!pG+Dhv(TJhh=%-cDl}yL9 zsm3l)9CTVH(Qs;C&30JDW9^&KMvLqW7rS7)jt=1aKO((n&}Q&~v<7=fm;LS(3EEg+ zL^NHYZ3(K}`00bM1BDM7wftS3Lv&|u{5I*4h-vaLqxe+tkRu={Z1=#tX8f!a1H43f z?0dx>|KsRf{F(0mH$H};F~=IsMpJUAh7NO>k(^4-mAaLQQtHkelfyP=YHbb?zA_?| za_C40=8zG$$rRlxgqSnUp|SOQ-@kug_L$G%^}b%$^}JqilyjAEuWBlOPi}S)Fz(xp z_D>50ef9cGsPt*(>^w0t)}dyee*hAv>j^F6mts!bAU)A!t$Rmyc5)UvxJQvZhC&+j zgaR)0RSH{cX$bqOVooGN*T5muL0!kmd$tAFD;Eu4#`rD)rBSs_R8M{a>I-CL6DAEz zvr{&}gOoJ&s1bj4Z$fMjv=yrn%XB?#!76tJT2$01yCu)-@L4ugLvNiyNnI-%?EoX2g9@7b197#)gGuBTp2fz@h5T#K{iJ`15pQp< zGmG7a37ie9CYQ8>MM#-X*y$j|1*=V+^=^hkB)metqR}-&;u(GH!L%W~(sVN6MAY}B zlf`{`$1fW9}E<%`t73su7WLf za{TE2uQowe{Mchu!^rsIr!pvM9Q;vJP!^Y|9RsnTISLuyWMvxq^1_A35h^CFCqc5k zF8vs0hp4}%=4#+eYM{e(wHMF%K;K>i$biqxhJMOZ>n#{*wiGFP3?d2Y&flqI=QiSP zW#O^LJmp6<0q32F)}gMm8(t{ITAlR$?>B=a%GJXE*QUC;lcvG8@)ns2raGZ8ZEXd! zf)RJqqzgOKmVaRlAi{vLdZNo6(Bc2XO!)=jfzjv>Io4O&!u`y zo*9tra!@Oe=Lo71BTs%*)S}CxGc1Hfcg795GMC)6Ari@iq$Re8*J>wL8(g3kjAZX@ zXBnDdg4ks5QS)RN@t=0rCB;GLOJZP+i`OFi7R4x~=<5#W-S1Q4y2lJ+GnDCfIs}}v zz;y7>3GXaxN|aN24oyC0^_P2soCsD?%x8}m^5ggZll5zLJzU2L2C1DXd;2_y=)#lT5-rr0Hc8pJO{@Hc;oiV%b}eKgUi$4_ zy%mTEGzz#gTC3S36O7n=_je}1<-uHcBt($U+soANGT9D+$9;R}!0R6$gH?|)F7{Vw z>lZ1j)RX0_a%N-W=S^JXJP77z&Rad*4l~7Oz;|!MZy`lv;n!M=iegx_HI)a%=n<{n%LV|KOS$Y%urN1iSajVU_}L=hZS4 zbO)q^ZYQo9W9$tR1+&(8&XJwaB~tgbx2DMDPZ82dH`qXrrHH>*tgf^lo%Gp%g$q$g*yh{qSKwSuiyJgKrF#c+Wn{eRD!T3ZoKP%IbF46BJws*Y zM*q~Uc_T014KaFL-`NA6Wbc@BApc3LA8)TWRelf#&cz&g&RN%Mtzcb7WUt~066d2v zJDht0l$S!#2OQ#>t5|CAx5iT6tj_@{IZTniZi_z}EV;;jkWF&~9OO1Fl|5 zn%ybwogmLx7qHP4FNx>U%zHg$)o-cpycCPm-zvA{5sC|iRa_Ox5UEE4VCgM<_r+7+ zuOz;O%VW@DZ6z;C*%(%ek$7f(B!7Q~t0u`=`ptT!-qdyoWwhv<5;w&>`L=b-m9q?4 ztvk%UBPy~hZXt{}XA<4WgC1Whi&q1akNf>Noe10#YZ`Nf;_o>R`t=hGE>9!%Xu6S5 zD2M2L9oU`ED!y1^PpMa{85^p&vZ%dOR(158Kgy%L-os#KOy_D$>eD*T&7wiVl7M@( zE#5tualp7X_+~!od#eN!0>s3vVXQC1EBtqXu;S#=c<&a~pQZI!@Sj={i4QFcj~ZB2tWJ1|k46UP)cbjVDjBs9Rd< zkqM!L;C2Abd`yR9wBJmAqwZ&X^Tu5mX4!u;CVb}%2dWzoV6Bc?ZuxtQ#5W6Nnk$J4 z&aj6MKQHbep|{E-qe$>LaWApi3$qFZpKk7VRDDG?W3f5u$YfV76x$J~XO;M>+I+qu z8TaVKZBwhS$it5C%mhjWWKDFB#y3w@Oq*eohLa7|uI^qI1|o$@Y{hT;ynd68zfJ1* z$a5XkGqQAGC|bmCw8yzblb=dtK3pYjJxKNLbQnq`#naLY$1@9AzCNoQO2IVBJm}<2 z=~(jNC)jTQOgc!q=|~-+)SbP7hkM(-HUZA#T?)7g)5mzu*3^s z3c#IE0-W5u2c{S0*GbOTOaKBb2m-@noT+ak`BL2qmvFld?zqz>C!6*MlEfU!9Kw{F zAI$SKI3-a`|FwamLg`V=?_}z~A-uCEn?bA1;)S#f3U8yIGCz2ZQ)Xh^Q;)k{{&t48 z8oI4bvhDhY?e)(8tSzOdmi&`?-`ku61?quP^u$6`-1nkX@Yya^q{Etv>^)=`%dp|v zP6Hz7I`RRz3I9DyZV1aQHe(rTiXt{}+WZ=7I`%oJ-*3NqC$N1I-bTYIjSa-60fJm+ zXSKR}Jr6>X&dVI)^Jj|MM#7^7KQ${Pm8)9k*+!&5!(pvAl5%=8f+_gp<58rW83yF+ zHm5ywgfoN%Xd ztf2>fysLDKt8c~e8A!isqIZ}4q)U|Eb47nBA5;=Gc>;~!JmRcN1Xm%$k(aO^iPlwu zosaRiY62tY#~B}qqa=By5^Em`{t#?!Z7TYfha57@N#0DJL{G{f%UBghuY%zl1LO|} zG)&%lN5zkpP@N0yHp_EU4ZbyZuc8O}wogL4B*WA!#k1HsB?!KSuDarv6~?R%<2@Qv z$k`7GWy^kreBiVRp^0L2#j9(X1@$N3Zx>|_?k&~%uiuPGwVk3y@lV{fflMZ2KW_;j zcA+l~28{ltOaB8AR5XTKHE1bZZh6rnOnskp2N23D^>Wv);NS0XwK{FeL4QY!lq zDE&FTYBg!LLD)|UjYhq0`*_)mbdz>DN!o9Xw9DJSKL9?trEf)UtaXb|T5&f?xBC0; zMgukca`OTmmAMi2Q3e{{B02sjK8MWuvDY?~rlgKU8>e`|BwXxl^ClGVk z29bz!wjb{!`o6hi<&%6JM4y|v0wMWpy>p?0%Aaf-j-<6r4*pv2^CBB1wa!))JRUqD zzM|7IWTMV^a^y6#ibnPlENa2ZV}0e{fiC%Nt+H>;+O8F=zF)cCzU#Dj3Nb^+XCH48JZ8@spJ-TXv;`Z?R`hy&}RJ;9#fq>UCq$bedh zyv=!(P%1|_oLR(Ke_MMRQ0r%53&4ZHrk%LtU=`)JBa(Ox(SLnmgL;mR$6D^cat`A6 zdcfocRI`@2q%;X#WA-y$(q1zHW!04IB&y-hxfxQ`u$uUuuoV~4P}A{z7rcXQuC0uE ztanDfkJ1)HRRO1D=5<*}Yy6GAQgrl%)C_t+ZEI7n6AE3-l=_XwX7PuQp0njjiSs{Xg)n{l!|$C!cOUfoWDjo1lFASE zPR-gV;#Ux}qpk{$VU5dGD~hBaDlSjF^@_?_)*y6tusJ1s_S|v&_2S|cIWu{`hju29 zAcwOD5%p^wozQwh#Bsxv}%oBUm$==}j36 z00&`@9j;P~b=;&}GsaPip{u(lHDVtJ3x1_5h_jzO>i43;EkUzhC7p@EjG7@yj?LT( z3P(%YW|X6tbJ4PCG|5M|?|!mzhP71*IWBD6KF)mPeUPiXKl7)fTEFrt$r=0AxKfv9 zwXhzRotdR5s|Bf7dsvLz<=(Gc9q_A#l~Ov;VAZI5<2nbVUYXb4{FLjKaMrM{aC%^G zu2Khq{Jv<`dR;eKWP+%eol(vkFNqS(@B}%3uBDY1eg#B& zkP|)+VHlA+xUffF9YLfZOLzC#doSL+D(#+R_TjhUZ*D&=`s~r;jt^Us%`X|2{T@}) zyY;MHZq}yV6}V~f3q`Ds-*n^CrRZ9@mY!uGzxhJEQ2uSGLSdb@fAM~2cJqpXz%U1w z@8kpd5Nj>gp+ih_(5x}wQ}%~y53rRQ@%r%t_*>X1?*QfL&{6@{#VEZekNz=pu@cMK zVt3Ata}$*~MWA+>>1oM@xOkIwd?%PEcb>1&v6)00PbtPZJS4isQR?}*8OqL%r8!#8 zj)#+Qu(nBEl)e?q2O7__q6U;bJ#6=PR`9meE_my z8gygBzj#`;EhDz>n;u3Q86{4Xj^4|bNjTsUw#xV|YRm&$tyAU&BWGZSN2R$6WuNvc z$}J-yaL6`j11N8g4!O3Q;DeJHr@hGuwi zo(aZ5nnA}yu;=pV@d-7IiKiCuXn6S7Y_Gtv)X_BNQO!fFsSragzs&K_`krm*osIeU z4m>}5pAJXGLr?EuHHv}?UaeY(uR$g^Wt;g@bo?k!zOGM!c&bU^Ocwn&By0%U507Rp ziS8-qF;n4!-9+5aCH9!dOvW;HQiXO+8~&&2nC1zI7Jo{-n1*eye|n_F}2OMVz}!7A$5U& zWF|#u6v|tpt6e!A>TnmxH7Ec*=3Yy4v2;=U>-A5fpQs-5{we~aGmP{FD-GqT7Xzk6 z_$m}zWc3xZ^w&$vXUv9Li|fQDQEG|FZcg|RSFkp6uG)HU%w9#xhyzbM3+5+WX|Z9G z&X^u|IS#w~dlY-N$%Qjr(SUx}2{#@HLPuSr+d(Rqs^NY+EbDs|E&rzhedRZ(n5Ov? z7fwog5phcH{=T#hskH^>ztLnA!%;Yg39g8owyv!;=R)G3!! z0s-Xu!hi~dD|w2OBIRW>LjxJ~;U98*37C9k8EN8ZkVk3x^c^HP(U)n_@=YJ z8Tsj%C3%OEF|FyE^~zkYhV_0f#3j2-!X|-m#NhD#6yf#YfeIP9(&J_jMMXnt_XJx- zPNN0T-K}H7lX$sGb~ZUzCUPO45FjM!>Ol>jGS?!7bj^aTsm{%}L2>I&LCU*umZpO$ zVPY{|^XACbeWz>WNBa(Yk#0n4iRW8+tKmkMUZBX6$7%PofOs~Mm^b_qNk16%Y zhfnM%U$@ww2t6f1b#pPHx(*eUrlUYG-1dn~d3k0+l353EumXr?4Jk}axbFVYB}!ef zy?7!q${6%>{8yb&XBqO3YTXaAeKlsC5i==O#Mv|txp+d&l3bu!;Iz?>m_vLK0|ary zVrzownQV93rR-XR?RpTUIC9J?5tw`)^1I~rCQBAyBug4es*wVDL?2-PiJy7R97|yb zfIa`>NgAtOMP9gel`1fI$0|m!JLso8vgFwN(E;1sS=APZhs|@WnzQ{^--ov3edGSr zB&NU(AFav5=83=+KHN5X1ddl-9f`{#x`kQANmXLLEgm>)Z@RKJA*IE=^9jJz-q)+?+mO; zoptE+&T3VqjaykG()bhDO{%+4a9rE=uwf$PC3LZKVZ3Puob9kB(>3M;T4f`4SRr!} zJmx|A?BVDcaZ%LRc3dC6(7>SGLj7=DSguy%yQUjc@Fa9N$H>M6Y&R@-Qu=kgMlwtj zZ2n_H-A3Q9fMTZv%grYbxlG?;{Z73K%w@;i!4lGv_6hclsrlYv(}?rZ2HVsdP3dXy z_4Jf3Kce#&E(j+Fzv*Jt&8(oLr$H^lg6OAA<1c9q-oW9}k7e1I$=(?^Tw1$Bd3f{f z;6D&=*aAi?ACe>{JS z^cYv6SLsTtgj&cmlN>3DuW_d1iqwGzPcAc(u%~pAHsJzY(08a+Le8 zJEy=jeu^A6WQO4nmq{^@r#xh0akq9%;(KDifwPEp`+u(JCvNUFrDgiZM>8}CE=Cv$_zt6u;+jgEps!&Larrz9NwUU$^8^J*tlujy*hx|D#5 zdp<&zGSx(5emLjV89tA`4@kTr5z^N*chSo+;#Wi!Zq!+9HF0bE&a8l#}mJ*4$ll} zZA7$?Tzo7+_fZj~aF?yW{tu#0;u=N-v-^B5P~qwH0SH{F3M49~9fDo^Rm|rCekyuL zoKEPgzuNJa1~;A1EM$nDB5JPPJ87_jsvXkCa<@D-*ap>>$N&s6k%{Zf!2aS1j!fkf z%%ftu-iS*`A~?ZW1Vm~B&RxgbD#mRS^E)9Tvr)Z-1FcW#wM!a3mT%TpFz0Rue4vfc z><)y?w^05SsZ-f6sjY;4=Ui;>$dz7w3p&V&iy{IcF8a7_9#=wH^O zFBk2+EU#eFasgQg-S{P*4L@&_5)iacd3AJG^}EeGs`PR6*rrAJJDa5R6Ym`-Q>L?I zA{_f2ivIbkN{<`tL<*^?E?&y+N&HuCd<{}%(UAbDh1F{N?W>4^x|zBUP-4|SqrG00 zg8y_yp&$v$K@{HMwJNk$ig(Cy{Z@z->wzl*{{EU2%~OI;>3e)qRIea)Q3)X73f%Tf z{Ez6>5wp%cn~IKivc!FG!k#aE6)Q1JjFg)LND(*3(X@#>HzkTx zz@ljP=ILVrzcDD~DHwH>=pzUcpdarZXpVVNM zLDf;p`wkc}81(B7d#(u4^)6j4_2l<(77T?DtSdqv$`h>mh)XjAv8{+ysgIcV013Dz z_?OzI{*0e75ktw-!<>8b^T7k+MJ0QQO39{+N`LJXhAaq;fZy?p4w3Jb9K1sC_H1oGWN_BrGE|~H2Go&h zel_+l3U5)T=YOLvq=vv(7qxy3 z>qZ9%3j<#r@AzI=yL?oxT+7Iy`3|lt76An>83?KWIHc;p3$D!C`B;G>R2vO=vDUwr!ad1E(622%URuPk9{V_&%7?|Q7&UNNXp0` zzTtODZx!cl4OSqwKju=zAh- zU|}O42<(VYjM+&bH;u8tI2P#i37VpC2?R0$A5ZE!c+QHAKgtD}k(^T+Jo0e#Ita$M z_c{=-d;+w=vTa4Sd$IWsMC%#zja4HpQuG^JY-$)X`KAi4sXvDAEIMh_NL4bMq&eK;q; zzKRW))NchV5Ld%rW{qy;MF|PJ9q0WQp%;{bD{8`j>oe z8^?XgSn`{0E~@Qu#Gm^;Z;fv!Zzl+CbVhB`O?MOXbLoq6z?gkSPpbO?qhm8 zfh-}I4J(v19gvf4&62i0p*9(7XaG2#zOW9b7Egl3_3(6~gk`kCPyQURpG zv4MI~)2kAd-+t?#s!n#v1eI9FDiKp_VGW!)u1|pOgtOFm2`sJUV&zgszy!mdAj_Er z0o$FUJ_jAjQXm+`8%rCwh^n7Z)wM$xF%@8O|4q-mej@3V^z+JU2|g)OngKGVO~J8( zM-#Vk!6($Q3!L0K==@HXI1BVQtTD{!5HR~V>&?%TjTx;VHmN1Pr}%6v;WIAVOTtO3 zLjX>s^HWLrBhWxlSGcp9V|D_MS<;{TdL4aQLrXcUuxFdcK?mrpzLYdFGEm>V)VUzo?K}*{Hdk!7{rLO;NuS(Q{R9_Y51;^qz8|a z{21h6_mu@O86U2hjfR(~^LKtk6>I|UUoelet({kx=8@}CW!ds)+ZkzeALB<_? z`Hl}eFK^jx?gY&Jwa|{=$s*TcA?4ma?{&m0L{PKtBSnoZ=E55Y*8u_7XQy7q2ATek zYnM7+sYGlGZr{K{PBAGsMdPCk=x z^QE_wp($E?&Z=yk!H%Qe0=c3Z`AOO-qo@msgkbd#D*pgLhco8eaP{Z6J!a`6piAgS zK+$`uA4DVpA~@C4@r#A;>aS+|o-kYxvzIKrnOQZQlv@`{`RvKm{tJS!p(#=-9*pM7o?!TY8jC;E+Iaf^qgsQ1 zAT!ZNGh0*S98s_@NxF||Ss$M%4&TrpCi)(x+#~B2gtZ*N=d>L6$@K>|xSARM5LlMV z$&@lQ)F(JnQ5v{rSIUW%;0(eAYo0o}ivElsRu69pXLgt&d??d6m&`FWa(-uld@ z{u`8{)U`1!u!X+=C~EY3$uc`i#nS8djmUY2;C~4?viY2KbUZsK2x3XLtC}ntA8Sh2 zo~)Nr9PDvD`x%zLzj^ocJ>AKqA|nI}-6m=f1L1C8IoOR~_b62KhDCb1s5KLE+$4TU zA^H)^Gq1mYC0{h_2Zp~S(1SM%BhGT{FDUT4Eb$kDF53Nn=tin!He}o)yXdzWy2*XG zWR#ZqzvHosw~mzRqQ&)6BFGAW3Vmv|N$Xy$R@v=yy@S}q6FIo1KqOL=iVNgbli-AA z?9R|Hy3rsYXjkRpQ~OQYzz&zs)Bv$A#9(N&7AOEZbz(hgl&EAvToU>}kU}Gmgq1zi zK<&@8T8v@(_KJI09?vT*u{f7qiLx(o)K&nKd;OMyo<77-k(Ic(=MMzIYY>u1B*6={ zR=;QX9a#_JcjlxKfa6JV_)T?9GP!a>u0np)b=MyVElFewy4{)y5%!2jH$3t#?|+Fh zjVWPUu{_?TsENh(vZ>NKwONkK!p?5LZH37&7+#~t!~(O7nH;_kDNM0=^lx~)&%w*% z1kO78TT^e~1KwCBM-CMVg%?~8=3$y%2?ak25WG#?uE6mZzpB+#3v0f8dnW@zLtU?Y zCi_D1=bnV37AxMieoC7Id~5faak34Q#*WFK4}eg<2F?gprv7ptZB?wQJo7?E_EzrR zCqxeEkfq z%(x{j)8Xs7Dt+=y#fN43?~w4a#~Evx|V*Q9nRiX8E$8H!_V%reQYe*C6w|V)Elhu_wO;~ zM3m`1J()DxACO^5gW>(Nhu5P00YF{t%%~uzL-Q&AoH0#}r1Bjgldh7$bz`lDzA@7F zAlXK(nVv45MtUVQzR;$Vja?7q#=9rrkD~wL8?+oy0)qCb4F&gMZ}4Px7v% z%UOZ5&9=EnxsjL*d*cm@_3R-6(#?{L2tAruCJ~Q5jjj;;57Nc6`rKo=+h=NYQl)hx z+#YE$W1%U?j(KCDK;4alc>emnTT%I|VtjU}JR!<^7h-l`$Hk#o0^$Qvjhayn4ioY$prg!csiS}MhVv4%i5 z`usPAZEGpY(5I3G0+uCyDKkatS`YP>qJ?O zpaK#cLZ+w#WtVl_Pwpu44v8LCS^5Rgofcz|3Mw|ZhGT0gxba>dC@+&3;E%8u>eFRf+OcJ;x_qptFRe#O?${- zk)osPEZ34*SQszfM!kBwNk)HVx#ESp9Q0Qz`41%BrbiB-HRkhn6_3#Wwa;p`{MCHo z4Wzd?H1xE~DXm|$kpE2S_dbra6a~sYg)U{f8p%KYo8BG+SOsI7PeXb$9JY3SN&3u5 zHXieVez6GbPh<}8W@h?gw##0Ga$%0%k-&&1nMyM7%jn@C@XqjAn-g?kvBhwi zYb|*{I7=R^id^W@UwGx;6rj1id#4ypb}XZ)7{BjaKUp8VQ{Sc|ok^_-6W}|Af{{!7 z`~w?J=ggn9CEz6AregeAUn@kdbyI44!ghd%$08fX#py3JgJJ#M(Hx{O!N#gM5?#-4 zsbeMq-u|8|&Pr_WF%Djs$z1NSO02#QPiwvKgNQ*z9T`bp0zP40EqKB+p^p%V`cXe6 zT|~W@JAioxv>AxXrEoyhmTLH^pOBYlEN>BK3O4=u{64IEJ`%fw5eW0{z=S4*4T&tG z87U7xuqaX=Zuq%g0=mutFr4_V3asdQCu)PQG)M*b6I*a`R!w7lV&4=C??vQtv*3h0 zrEGjvG^ST(ZmB5SSq1PLQJftwx3I`GA3)v@fmq|3R8xk8Dt zEJYUwK2Yr^XL=!qEVyi_!tu*YB)IG4z$Nzw0+>$n4&^VJH4GOM6fLowO}))6h)tma zI&i+_O0ZGPzn-9Lm|7!_L(0lTRLkNgIS@B$mpBkBdIymTyNWyOSWdmZ?zgM@37t+F zkBbp^7kwj3olKgf8Pv>aj3|VLY!XsrWQe~O20Xh*@>fF2eTYX%1h7!|u&S65L%XVZ zKf%wa%1g|%7FfITnc`HZ2MvX_H%}aQK;7^+6C)JA7yEA#T#r?BkA81hLjG#&hNYuV z3xa(Rm9vzJYDi+{M9PE640+|u#pWYKSHv$cI0bH={q^y-HY5yh^0BV}!0$nGqjf3 zr%p^7Ek^w49yR?-Hj>as?G@u_(t|}LTnL<}EW0GO5rl%O5n%*3j zNUy|VDzUEyG^UgwaYqVO!h18m-1L)>Lm$xwU(aT^cHZipko**lcl;OYHpU{tq3z$z z^jTl{;6d=Jm+`u8R4*u=H)6Pfi?6mV_h0JJEtFu4_;;v;hV*?-&B4icA6Kwm>e?jV z$sA2%r3u_(-*HfFiH<>uuV$QJ)s{<3MnJ*GRk&)_qYe*_vp)e|Y z<4uMKt2tXU#Q_CwM`A3uiiV9^)YOLJ}hnck5z9(Fi%?+Sb7 zmWsZQmdm37OXbn!mOIi8l;L&mK#5E~1ONB<#o}sj3e60ajU{5&9}9A)hAlVtbhj<;8%vEu1`7VbnSblP@2K61DcVP z9jYn4brlcnZ^DT%K7S)daOP7oUO7R9|M#(^fa+sg*ANV+S=ilJC`(7Ec*{e&BQV)4 z>yu2q{TU9Y^REt4vPKupf+UiOcAIf-kFu{EwM~MDZbdt9>lg`~VS30)MT0(!*U&Q; zXu3~(dsT2!H<-b2+4EmEVq*}hMWRlw%l=zSiZH1fU)z&~p)CklZzR~@s7}WO_JUN! z(Wej9_gCX9cjcIqzuhrZYJTfbQywN%rms!CNHDZ^fn0W&tdPyiD?J#quTscboTa?m z=e@P}N|E#}HQm6Z!-0gQ_{?dOIODHHH`Cdk3Y>cpGze<(Yw`J*qHoL!-Wr4PIDd~m zdwy{$Doqg_v#MD_xDFtgZ_=$&Snh*T})lmaw{r2{HMlwn0$7M$3Z6zY*VQ^ zMErFte{fJDZ!&%wKkA<18B@REMM5P4F@cVgJZV&0I*NlX8NpRJF@6H9yej$4Fyuu)*HOPU|uX~+;1 za^PEd3~SV@H0-N%?ri5QIn>;Jr%5@!Mb|CDqcKYQ3Ai^Us9!^h#$X^88u{Q!ShWgX zc%D|^=Vh<441#9!oEcVyQ>BDWvVr=GUk`Bp^1xp=#HG5u`%e`(3GuYlKH`_xtYA&0 zWl$%GwnBf1;GLTp{ouzPVIS%}7xS(!UK@Un5x`1RAMUSYchGdSHAlYll9BW{8RNmo zl^&3crM=G1=b}z09lfMLe#CZ-z21XJLuxgB2Xs%LN4O{QjR8uRySCiq=`Y{XVb3}? zV@6D8`XWkqJq~THQcV7&5W!Q7%a`c1st;h?oh-{GM; zAy7JB{J`~9?UsLhn0aw4n5ohXO(?gA>gHAqqCNOMc_s(sy$0lEXWxfs|}-v&+yqjv-M#1W?mmVnEN)8bm^5LOl1nlq2t+{zM@z@9dSsAE50$ zA8@i7$dwhV#&;6Ye*JWO)ly6PxyHkHF1Qy812Dbt=Z1rv(ig=cMsz)@k@X~;X1I%<{Oah5A7=fqk8)`%#2T`u8)rftU7#Vval~<4md-`Y8=9oud8G`Q zkPT3!I>$#+R=1Zp=!A&~gXa$Ap;QYCg}|`ly2RGfmdt?};mZ$SK8oOR5t-xAdCoPq zpX1z0yX;I=`VI$4+Qd9t+S>ByUW>_B)Kzg0z`(^fzk4)q9RP`(8>Buj5`_f%^cRdJ zv{UoXklJsb!pd3$4QX~tDr;Yx6aMF`1n1B7&b?`vSKSgBu&goBsaG!P$4$*P$RA&& zAJP4+%fEO1&w=}U!3#nk=dHe%&*pSy(`k9>$>~f+AB{|4wp(|G0s2+0-{Xy^ucY%=#`XiqB<2CRxF`y7mGV*SJ3qs?SRrc%AOS^R+&8UQo`C<6|9j+St$ImwtR<5awz34a zKsrTf7W>RM$os9LFn>Rl_=VvEbG;+C%Jk?6ttU_48U0(A()1gsAC7WMEw3J=ftExp zV|rK=#9UeA!%)oOln=aAl9~$5DaFmPA)jQn2xQzGUL4--pW`60R35{pUcn zG=%#5?0&`V%5D=rz|vbzY>Q~)v4#?ivpJI31y-eC79sZkuTen83-6MFsNjy&%MC+)koN=$&-#aI|{{s1jIXUC(|?*FMH)4<*R|=p^r%M2$8cXG$lTh@2oMp zFodYX%^v&x#danq_|jiMUz6o%dm-T zKyY<&;2{Z3!8LYI93-ta;b|JjZ;)8bAFwnnHa9CVaYbYie*OZgU0LbT?fqO1#6UEj zi}#zdv|bQK&hdE{`m=&eSLsT2QgwRni_LNL1Vw5$b@HR+i5C}7Np0Kb`z5K(2>FQh z9MQ{iEw`XFzEgFqFk-i8>Gm}!dPAXG(GD-IZjG(Xtq@*M+%Xuxk}RF*?f^{J%}*^U z!~L185)HvT72E+6mD#?LX6;X5Ba^J@mc!Cql8xvc=C3dD7Zo2kso|YQv^ti#u@Bn` zL=u;B_Yp#M)$fTsOewBuBB@*NrRo&0h{vw!=~XLM^7h(J%PDUc%Coe_$MC8sX0C?~|o$Hid2H(=fXb*H%X)>Zk0PYSf? z3f??)CYw1l!*qF5HP^EFHc*=*SR>t*Sdv$FrTWlCagM_9V|x_BM!8zL(f;y@=40*u zgDW%LGhBlQHlsc9sLQSLf2Wl`RR7hiSz>i8!F2$+1Q4JA=`+JP&?Ue6>44FdiB`FS z26XCXow$);9(eS^nbF4dCFHe5QihD9PzAAG)NlcIu){AG{j>;q^}Ju!sTrCK1YkG? zQ<;}D+3^(|!73?15BhXm^$S@JGfFcqdh-a^6g)^y+=YDT6MzEEH7i1Rcs(NNL~4y} zUP@R3V)I-PYn^kpk{+5B3Ev0@L<1!oruI;Qn_+a;$+{eRPb^bOD~WjQU-rjIC)^IagBV&bsEpLJ~r<>SqZu zvV7ax$@of38R$~%K$nE$ti5rzSSNjD>T{qEBWmQ9GYx4ojnkVCuJ9XUx>gMJY4{Wj zY$=1+k7&x4!oLtwC<}_iu3j4Gce0Vq(&-XAUbLtrUpNVymm*1qtZ)`M_Kdd4(PX$h z@W1OBSjM|K>57MWS^y+;@8MEwoP#c39T_mzktq~esEY5sCcAvlw@K>>FmmywC}ret z*MrN=%d)W=qOc)MjpHuTZb7ZJvC_fcsTq%DTBIZ`dfnpQyNgE&StIHjvY`gK> zYktjh!m(Ea0)BrO2l4ba=6y=%YL&kH;9M5LHLQqJztDG=Yw9fD^&tGC>yQ|~)#3Kt zeT*+sjA3`ysD{?ACMV0Kt|{`B$wWivzn+&(irpNpeG|n9K1NU2q}n=pvdY2Xze_sH z%=@~D=|M_8I*x2I5B| zms10J4?NhtKp!lUD8lAHaY(UMp3{bOG-xZ+#S4|_djy-ayI!o0NTn%#pk;q}YusD4 z#s67!bmW}4wCQw<#ORqH*2dNTjBTsTG(x;UcTLZXTW-yVRJ=dq*VkE$jxsldc(I=U zfwWmr*P3doiQMuB`>hIPvyB=NnC0eA+ptgrkV>KUMvLzqc=DF~C8FBCR53v`wj$tA zZDxk6`+wxLw%gP&yxn^ph^QotP47ppgl(#$yv(z^MQU3T2*!o1ijXOSDSzP7Ri%)Q(OERUqdhbx zUMS7kh(5lrHCI-(&CeIl46dDAz0PNzD%w8tOz1$wCK|k_OT+`f2dk#$+TBk{Rd9n$ zHZ?u(IP_5yT+7CHDkRK}lSCw=C2k|?WqD-^4n z1?vZ@<-5JLp(rx?QCLe!s00M_MM%w@x)i&Z6KtvF7Uu=s;LHkDqR*l1%^Tb%nd)vx zAx4!BHnt_x=03m4Y|~_qD7gHNahWZ{{UebgqDw}uWcl;f$~ga1t*J{V=W;I?PC-%r z_>DLIs{)?WIaradY~j*@qZ2-6n^AWgyn?GiG&9X?p?Bsget&Tv8*>2{vHI+Xa)?O1@Uz469#2t5?$E8?%V(UacIEArx^uSi=782a*XFGJjP*dpSSUiTw2X$t52LM7g#2! zrr|nj&>rq@c_^hupPU5~$9d?}05MI4I`r|%Rl{8Q&~n-HzJDP0T^k`|;xfUR|0&@2b@u{Mr+Ek+p8PWr(bqv?B|xw%0ciw|1IVuI&=#7#}rD$*ZHsgob^(!w`a%5J-)4ao)=rV#y< zdO~FRQp?SHov0CiI>N{?2Jl;J+3h$4uiD5(LaSHl%Ve@8Y}$3M^AChqQf$V9_2W(ny!j63w0jG;>BXD<9+7@kmVI<2p(3q$8I05Qt9<7%hPRzG5c$zxcVBs5`1BF8 zm-e=g+Fp|XSJ6FzFZB#b@rjdu9`!xYtA zNNa~jDf5-|rekdz%6|p8k%-R)DegY&qerX*F0YLqNXn9EhE17@=WqRW!>>4CS8{FX zCk-8*Aocf6>~X`O<1QwwzUw$Q1YjZ;Jb?R%{=S|w6V?{@$}im-aS?IYSl*54_!HXcQ*)n*te# z2deKUVEeHv913gCd-jiUwhaZYg^OsvHUfU{2&+RRF`o93UC8>sf;|RNG3*8jFJpShTvYby z-C3~nx!`$6dY7i5-uR|tC)A6=Q`ny`p%zQjMvM=<;+rk(3qnY3ux;Yey#KQ51+5-W z{y4Sg@ND-bVONxW(yo$Gy)Rfr95e^wx>b<|%bUkI#{mn0JJ@0gOd&hkj7~9)%hF=_ z-aHqWk3f!jcYeIlKA@Gqp8l(J;?HL|x)I=h#xl<+u>|F(UCCcnSm~t}Fdzfl7od_B zT{pO8g_J$PZBaWCuA|1sFQQ>a2`1hH(*2twG@LGwQ|pU%qpBJU1(Rogq*QyO!DQI* z`ww9_I2_{8Ph_ryHIlyE6H4p2u{dV@NXG$yDi^ip%il^q67(u3ED4 zAu-E>EwI<>Q$b|+Jzvs45aB#Rseom|kYa@YI0|7}IDJU^(h>7Bu9WVr`>}I(7Q?3M z_VsVtkB!gP0lnNiu^|EZ;q7kKqQD+{QQ^$FLrVpof_qUp&eccg!Mzbg{>jNKoZg*kCm zN87_S*xc*8Nx-e#RW@m)0$)bypcz;+121$CeLzi@BG0I$Js&HRaQc=`j{EUiQY5N| z_7JlPu*-&wdCA}5VrP^_(9_L@53~4$O_=%r7JpZG#krJckgL=SO9K>6pbmJ^$VU@? zV|na?)$%;&by_KPN8i>3fu8rZ-vv?9C1ZrXn(u+=2kPT4M`HkT+2u?Aw3Sf5M66rU zxth*PyW*r$!k`8Fv#rI%{G1eVC7iC7S4c4KyK~s4MHKtJmPJeP<4O`Va9m4Q{gk37 zZP1lDg#J(*_w1DofA`7G;soz1;@(?C&SV(GA61SYpZ6KBz_(tX-zT4`JHS6>wBi%}Z5Pq-9fOIh$ud+?4w$P$X{y2zVVXYb6}f)aYu7c-e@@NQ2 z9k^imr!Ypr$U-VrCG9CV3YRPpazFjd-u2!%{s_24`Cr#Wx2d)F(4>02=Dng+DtV~M=_!lz(F;&WL1iKJ0o0za3*P~bi#A(KX z*Y5fDXlb8CxRgwyRp=zb;+{qE!!)TGKp#PZB;{k`q0q935>kchiD^c!jKpwkH;tpQ z0d6h1JV5yn7ZzLe{S0T2Rx)u3KDqiTiHc>u&qbgZ`V$Pyr~}s2V`ZCSM^l#)&fidf zA|(T?doiZSL!y+J%_&Y^PnPk-`SbHT@1y7cCQ(ylo-@~K)jR`|;CR3H-Q*{bxx6g_ zysDVa0l_2^rDhZjRg%=j6mq-2g9_I&*%&G4yALsYi+;<9%+LXVyM4!pA94A}7nsYG zL(A!4eHG*mNfx8~fc{eV*O5^qdbDt!I2df>o-1-a1FhXFRfRoJAP6Idf!NwFN*aok z)qRWcJc~kwoKh(%L#l76xFHiRbr|Q-Eo@#-`g^zg&{HW(Alnsr60})IrK(`)paKs% zk4eBn1C=t>;8g>GeJK;)qGA@O3nErQs;F9n&0l$a?=*zQ`snlG*_dRHdSD%V&-Z4_ zCTmrATJkGMVN%a{-DGHc_TrUEk?WeOT9ibqA8-QRTERg=BO+8L6&b=7}$)!<%8{MyiHcsKl$)7N_nmRqPW5i_Ebps_G zcB&iN|3Lb{(glJoy4}6X2yJ_GTSgdr`J;3aVQ4q{embekH-f2h73OfI$&*dD_a!); zJ{AK#0Co55O}Q68xszFR4zJPScIq6@1<#xZd>UllQ=lr-8aFkKWjLy43|LPbfZHj8 z(n(lh=4t%cb3-Ygi6@c{3J01|NhWbe3XUiIv5Ys1kX@9Q6U=0emqz2R{R342AuEWr zbdtC-D=>THFC%a%^;|8vbO7yEZ4)S0b}3Iw|4i2#Upnd`GJ|+>MQ6M{E|D)CDtj)w zwOGbxEfd&7Ld7r$rt#uJfXOjpez9x|#hz$OW#4(hJ6IGB0*P=d{_pB~^pN+Oj!sW> zY0Nr)b_cj+OaQ)0W}i}XWF7x^MDah6yuj{Odse{Gb}unJjdW@~b9o~+bX)yML=hkH z5d)MgrfObfg@;t4yV9A!(}@^VN&mEp@O-2AD>A2(fheTox#sHV}7C z>TFRNm@jWSQ>B43hnyEQ?QEZd?xL$atKrRy<#vvR>JngNvGpQ`{&8luSd0B*r(y8x z{iR5Eg(Dz|cX?-sG_`hXkujzRDIWsn*BA$C88anAzcnDnfj)<`8r%rBNutp*K6A$& z18y$6z`lsM5!u~tT8_eQ_lqtd6@kWPM=SuiqBZ;KFKM4fkWuDi`#qxcLFrtU*LSv# zfTJ*Zck4sKZV!k#_2Xk1TWGo8V-$+bbZ1U z_H^>A)oGMR0{z)GQ0N=Q0to%@pZEQ3fcy?BQu6!T@K5}l-H{;v(?cSVWH@7F1dvyx z(msqFIrXaC!3un4uEmc9dt@pusoDCU*YQu2x;pA$Tfe*%9K*ZMeW4U07qG=KSvCdS z!*`dgN^xWW!gGNbZ`G(k0y$s?TlQCHV67K`s5q2&-1Tp*BouFkK45YT6qDK*rC{+Zci{;sX@#{~ymwiJ1kZ4~UV$8AKQG1y3N%i-m6 zwkrK2isS)UJ+~1AK*a9-MMOf>avd}M?7OhQ668W{>kC+B8b=2al<8F+N0A5rfi|_z z+r@6du7o-L5!G;X?)hDRZj*qj0FmFFM@I&6j)pC5Oh}C&6Q$Q{qCQ8_-G+l>fZkfz z6{LzDjgFAMaY>&E0k1r#3FE%{yQ296eE4|}pt@5?zkd~!p=;7FdugONphCyd42;$Z z@}&Qvb^S9l)kq(x%1*GfK%&_OckZ)-5`ZzcD*U8!=`Rq#mVd8&bYmcl)zox{b9m7} zj7D;wCz9z3`JFPwPWM3;9E_~>yS>=TN0)m^F4T07D?>2LmUbfB!2-P3TaVvsp)KD+ z8Lt(R2wUgpL6ZL7vTUN12|G*2r%O}YPn<4mofS0HzLo&wSEZjWw7|w#v8(+~Cw_MX zC=wNaN@+nOXxdvH2S0oC`~TfP8K)09PxS;Mujj?I0@zxfq=nA{kb8(4T zu%ir^-kwc*XU3gikC%>S|2SzR)h5!BY|M$bApM`L`09n-RCI@^#)UJWO6(zE9@e!y z{xLD|XWT&Q2E!+J1E8>Ejb;Z8+(^l&Mv3rU7%|0^Oz?&XyQX(%Amp`v?dOjoRj8&- z*mxuz`@5Y{hsv?YIu?-RPKlCJ7NFG#%Z_E9IL04+wxwrz>M@)SDND;@yq_#a473er zwM9CwBsF+e-{fN{00H;BU_;@GaM*emTFaF(7OT$#7ddhpEbwQt5US$Sr{@!lpH4;U z9KnA!eS5Q%^Fdg5SO2<%dTMgGizd_68w_dWsbB^fGy`1^clQRvajHDGi>aBIjy;C; z&B_|)ooK?9lbRk#y7lAYSj#6>nI^rjz7?D@(L5VxoJMB#I|zwqF0tmq{J)xX3#)%# z{HnSX8}(X3h5`z)pZ@UCPwu)FH{~WBnupTUV{KT4ejwu8Bj>ydP7!@quxzfz_fhtY z5jvI0U)+TQVPmWp*hrT552jRI!?`UvAPHG&K%4vPVy&I1Il2l9H?pYR3v=J@dm{dQ zsz-q*$NgH`l%;z}_B_(fYW6LPI=;RK{SqyL}U)oWTfB;yx3+W4gt7#$6lMtm3 z7-~+ny);DfdHW?Rnx3Fgfcvl!XpFnn3#6QeCDCz+Xzb&ZC$#6naA8;KB zGo3*@?&u-a-}Fk0ELHMr)A9T?iem5D?1OFN4dUCps|^jkc6w~D{)BcdD903*v}#wY z7+ozxPk<`^_C68e>et3%Tm24zloj;lv*aZAStJ(WU3~EKyQkkJ*YFthfj{#(?%XwhoD>Z8NK5D*{TA}r4jY8l(WAwPfF5q0<4+1#Y z=24s#JJr&3od9Mm7wPoC;o02yb>rFOD|Ae*#OOAit=>ktH<&1j%}CsOtCR7gzjxG2XeBpR zPoGG^k}39fRNfpZQg!2^+aN%REYF}cy^0NA&k)Dn%W{GXrf)Ipg^L7Iqq*%tq`2AEU<3<%J|#I9Yw$7^584C zH*e+~a{qt5?#nfrW)&%!peCZ4{V5RQ#HS+mU5(&`Q0sOIf!1d(R*J&VzZw0R3~yB0 zB6;t6zKE@im7co|S4I*3-^1MZw_SfGC8}-&%u~={LHCJRBXBufn;d=TQIzzz;yh;F zds&s#=RPQM9`mXHB7~Zu@Rhqp<}jbII%8CnRBY*X)I}`D7e^$Lz&jgh_32@p$u<=L z1ftp$3-F3g^IZ7fHO>jtZsRrU$J6;X@SJ|FbWM;?!S)p+DX`*0fl6?Vr0K>ooJY(s ztOj&0LWQAr;$0bKU_NW-3%Ko<*UR>KAAWr>YKRZxEnrM;%1$5#z0>CQ=#NutW_-}g z_Ay*hFgwj1R<{aht2Il>>~X=M$y8F?g92w{h6~c*1XdTyr)>I6CYEjzmAoO%C-KRT z*QtQ$B2v%SJp@hGlZ=;nGN8ehE(E$$T|b7QoTx0Nq2K_eSaaoyFQ#d(S%pByW8r2$8x zX#N|wSc{;?8_C**mE(4))2!K2aU8o^$mny_) z9OguMspxGONV+3|M-cqh7&mh|pX~YOoqW z1R@$z?rP5X(N*3f@tF-tndpQ-q4DF+BNF5}sNqB2x~g7dI4uzYm_^#nZ*j}3Ua(cA z!=m9uFR1v=nGF!HcSjygh)C->(|Z1|H>Kk`govEf0Q@%9cQ+dp*Y*HstsrG#?F)M9 zZt7^G|IsIFSZ)%AIIkOxQdiVjE#Kd7Dpuq<;qz#&g zlynU6m%B%FE5g!l3A!iHjvfxJ1S1g_2Ut1PP_6p7GXePPM%gy2fxYxh zBJ`4o56nV~0KyXpuTxq+d!oxfgNrjhE#SS5BKO0FVcX7Fst?lXRbdRY*8I;Ci3~tH z7KU$G8D{!eL~p*=8+$j}1=ffq$tZ=CFx{;aH$A~kiA8fc7Q2;ba~0TZfo ztXWE~<(=O-0~b#N6Ywh;F>iL2gG#=qF;(3zBiUF61m*yw3K?R|Tx+eq>33X4M`}C` zhZV+;hKpF>a&+`l$xtnyfl67l?1BIKrJNdRR3#Abll@DyxJEJUnOX97Ppk;l2?g1) z_4x1=RXXDh=?k@Ss^x%a8kiZy$a(u_LLZGlg{LYnp9VAgG82t5D-h;PlEu2D<`Z=; zC#(UNguoK;s9g!3y5v3~&rrW~5&`@N0ifkw3qmvL=Aak;OBbqVk%mf^-qy?KxjC0dBNcs#o^9kD`HMt-*j2Z0s*AK7eD_Ti0cEc ztTv|qF96{QM!Vz;1r|Ovenv7CX}zrKG>uy}08>n)@8u=Hx~&Jp`~#JY zDbu^9XAVGxt=gn?)%KPniNIjF7(XU%;hq#HY*i)Ye+}m*d)`Ha67NR=uZiCZWP)mF zGx+$1>T<#nSTH*BFd{jf=jB&#m*B*W=ZTik}K`ab@ zw6l1$p-;7sqoY5nD3f|$4s6Q4bhr|MU6Wx`eAjxciD;e~96T~UpiYtk^i;&aimu|m z{F1ddm|R8s70d-7)43=)!Yh3svZh;&2qg}P8W#)HdZRAdY4WUJO07JAJORPbP0p6@ zm9IV-nE>ekPXec)Uv0(Znvqh=-7|q@@FkD#qOf>?yts8vitzfl{v1$AaN2-6KZGpA3z<_3Yzm?VEstJ`VCF*RW@nGg{fFe61hIHILK*25eU|6a^i+;d z*>4pwZ-XD)SvMcYxju#|xRH0sO>@4XX14lH9riUl)P7HDeic1t<#`}t2ZCD4fp6QK zH^6ox@%>loFu{Bm*%Guj#+7fl(o?-Mqj@!H8594>#E|KG)==PD=%7R&(F@h(kEKnPZ1hz4H+d{<;hvU zv0E*Fd46*)qeIr(+X)^LzfFdwXtUD37Nj?|pcYyu244E?emoDbdl%$h-91Fv-%vUM zqIjn`3NpIIeB3&H^`4CUOEQ5&uM}V8GWh1o{h0AIATI@R;P&_4?FET;=ACm5{bw;2 z?X5A!!$rRWZ0>SmElGOMUfjhH?K_k%$K1~p9=P+_Qz)bIU=xQ314dS3fs*sN0|$R@ zid|3N`H&&q(o$ezoyz0(M~D6&Xa?hE=d<{>&Cd~9YF4ba9C$cr2peGs@L}MyP|JFh z{?`iNAX0I0rs0(YKNLzh8;#M_4f6EveTXQ>Y3B z!(0D>uKxo``|Hvq8Hp2eI%bralxg-{?ssnf;2GU+VRq<0tejfq5aZI0qkEzy8f!P} zB;`4N{)^ZwU;5k6r{M-h%PQTOBQ9f5A@6&G)+COi;wM_gMx9i3e5w2Dyw9X$e$$I; zuA2qVHLdtnb88fT11A3KhzRq$2++Y5xOzSp| zJVSo1TWahT;Pyxm`6j>2m~F7k;?9-FVe||`T>$bKuzTq62x=ZEr#YaJ|g(sY-zv>HA@T<$H_EY4l?T^#odJwJT< zg(0Kt%jbxcP5NODF}C`KKR*qlV;{S9{X&)5d0*d^%v#VF$;?$;%hivaF^X5K(XBMn zOxp}!j#>P9PL|ih-dS}NjC#xSK>v|v(fmbTt7ho39`RFAtK4H$sZaz|ku$un( zQ>y$EYSUSgGjTF_w6$&*I`Q*HNkYI6gOL?Cp5(ai=0dr`$TFC5jPqp3TW+SbL)&J? zD7p$c4xCXGVc;KV-toi_Mv0sGX^jd0GrT65%(%w0K~^(Fim%#6tM;v&RSmf3_%@C2 zl=ztWHO~b44(8LXz1&<#X5%>dY8^8Cld#9Q;M3X>`tG;I7cJ@Mw{I`Bios^825;0F zBLCi>Oz!81^?x$o>^ysX{lsHtN0O3gB_DqSs>mh&oR`t4TR=yVH50qQ7W_^|zsdpVCjB;;o)#7&s{c38TmsgsV zPwKF2O5IwqV=eVryLmUmH^cY5UAiSTLe81u#(fFjitkIYa5)|mlSWE^dcLY%xsH~W z=a;^wutYo?{oVXEU|dbhaMJ%4{6%g}`5x8u_VESHW!|eRRS}MvKHdrgh3e*k zr7M52XCaKJ!}jL5Or{bVUyr zF{le_a)~P99eMQ|W@}6HI+v4TVw2TwtL6N9Q(EMpEwUfN6M)eI`bUBJn#SdH|C-f; z?A6e9NB;Shs3iTbzzyZsqWoOG?rTNpxDU9M`mTd$`O_~Olfn;#=M^)H*Nw4r} zZ6hCxMyp)8zZQ9!ySHUD5=nA9UAyA=P`D3#_a3%uY|quiVPQva_%d5x`I`Ko!;6}f zZMh6DWV~|nxi4{`&R5dir&V>`%~l)Q2>JLv_O(SoRu%nN&5Jiw*T9#_ctnd|R_o+x z*QK+)6H<+P;yg z3V9VZda?dYQ#@~5>k^nYMm95(ot2mf**b?uXx!q)?)C!J{Il^{vJLxvE2^__;tDqe zzoAQt(2(LCIB(6TPRoko^K!!0e$u_99j#dXdl@)r5%^j+C;(8qk3;hutEO zy4?VeLrKg1q_|bDiv>}U5s&>Pu|5K9A2CA zQ}M=L2**d&X;6lq_nvSIuLyjOINpeOX=_fsKRVHZK<6?vJHz^II)O;-96|RMCb~iC zUvIX$*S8fS6maFQ*8#_n-iERul*FXkn_I{y=N*y!2JzT&| zJf%{y@k;k#qzfKkk(_MaFQQ_#-Ok2S7KVAc=dABR(`k2z$f;;0_|tMHEM>!22#>tf z+hK9$8s#h80!HgpNycc7z|G_V2kITLKkcx-+Ce)h)2U9Z7V5U(PbGJp$S7Wt5mA*z7ZJ zgO~v7<0AvGeZhzL$OgbbnF&A@MY%1UJHIdmLB20RMj z?qYnm8aS7s?c1HGK#D<~1s%K}S90cAqQ_U%T)l;W@W6tMNT4+VZjpo#Tj#6V{2!%}rl=!o=JAr-bd+xjq^`kC50@ZxstO2+N|Dn# ztlqg3hdv-_Rmi`_)pFo7A<3LvEV=+~Rsd24IQX7Ugj)j5{mBbf)F8kplW zs$8|p;iW^7YhZWYfiSCjJQ;!#v|(t0+TpVc7fM>y+#RW&(b`zBVrcU}GSPv%E-)n7 zbD~lEUoh{Gg~igns*m4l7a`mtI}ZOq=8Iduo~v_mS(pTf&_TmqrKS}ytny>(4gn#Q zMxv{wTm?o81L{7Hq*@#vZ-FZfbyyJO`-gfd@CtS_;Cf(`M}@pd)~HNIPLspL3V79# zfIK5^2SrZSyw)$!NPh{Au44|sz#LXc^EXR|1RCl3E?=kEpb*(axElht_j{HM763Ya z9YRmB9Z3TCqWJ}Y5sC&?Cgu0k2_&PobF_1~gH#{OUUF=t4d{8MpH2XH5C2Ph8Ybkb zRkwqUI9Mr}v{V!LMs~K94_z}9NqKs>UU`1tpzeWOC?8Vl1)lHUN7LUDJ|?rsz`^Kq zqWO*R@x^D49#lL9UR{#Rmjk%5ci}ua`8epkeWhtKH?15;IdvQoC$I$URDpfii@lz_ zWpwG}mo|m80ye2Hb&)Q|I12JYX2JMNIDM1i{>hTDUp*#sWP+6p2o6iFDn^*7HQvYp zk4Tw8DUkWm(a7FNjr7<=*itz)k0k9e!?jt+rWDNM2!EN$9=@A*##6v;k+4XOSQ#Jh z(#v8AccR_rJV#*Y!`#ViFv7VKMDS*Lo+Z6@RVpy{zs2GdfdrnNp@y$V#LO>0Sj+2u zBaCRmMUcO*7ypLyT&3j5L^%=w(a4ZX86aHA5d+>sA*aPRT*VP_tuvuT4cfl^=aX~q z5r+f+cdiH7iE6NJBw<$_qsbenh?~^PBvXNe9?u_8K=(N!5YO@Qso_gyFDWVjg$Baw z5Ma{~598HGXf|lSvu~HvLi`KAMgG4<94>hnyA;dAE+){1ixME4lD%OEc!pQB4X{A=L-z4 z%_dsRrN>T~0yPSP!Z4*1pYzP8lcqCxf5!C09qa7vAjwTkuhJi~J393x6Qk zT3f5)hydyr^fPQNsaeO+TIH6r>69!RkXwsrERz)E1oJ&aN`&2~-Cg{QSb?$)tD^+Q zN9e|DycwfQz&722xPPE*X7mnTJ|W{~7rIb@8Y`U$ty@TFBcV@Xx?0O5jYM`ZQZ*_r z1fmlP3qFpvI}VbU>`uFDroPW=z@?E{0H^~_NzA%fI=rxjOP8Fhnu7HVRaY|lA4q3~ zWQ^AP2?DyKcf(*M8cm%Ug1I+4W%;pB>`t3_sM?@*EELoGkoPdG00kSY$M5u-uxtS}LZ*+f7vF&2XYYJ{Pc;@kbd+cxj) zIWc(s0|}07BL3oci+IV~cQNMHNg(aTc2UwINx-O0uTz9xxAz6hp_uijpD-tZ&q0!+ zwdf?er&>?)?yX=7fMB4voB4kNk5?+1SBTMhA*fX4n0tr`)HIQS*(fgIt|erqIatBTrdN^ z_v~h5A3uVaO(ti(Jjd)}=!E_}2QJri+68QFGZ%~`779=p4kO;iDX%EnXQF5B=WAa`-+mk*hS>INk;jhL3Dx|YWwvt> zCnBFn%9aCOo{E?5&|r<4Bt7|IzCT*u&b=B?ydDC|**dt|8Ons)bJ$C6>-gB`7u|+o z@RTf}eZiKivrLh1=Bi$4tL3CCSN_U2rtKKvzP)JN0^T9d7oM+fyFZR-*kY7x3U?KJ zDHq~nK^fm!P`9H07bV_mmx7pOf8cI6a#}hzJ@)JLpz)=j#A^a0kKNM{Rx8e}?TWLo zPKKB;x9%M*(8a6A@dSp9X|`Y`8Q|*4rmreU~%si`_cDxH4nq+n*H9sbryf4+$pjiBtwK?v+$)O(v zqU7xVcE#MpgYS|?q^GFqbJm%PR*7#DR5xYrAyWX?Zn}hS{h7J1YqoL6cpw1quq}L5 zwyZ>kI?UMQbIkslnr^l-43IZv_0*CSMYGCp{Y>sqVA!7wXunk0DUSYt)P^A zad~!TpE+Z>fWgRhojItlXVfjmC_>@aZ!rcF;|}_a3v^{2P<*ZBRFAQKsJXAwYY$zc z)!e)0DOI}t(W9alsH**bW_-afG{7t58mT;WlIQqP1+-H>y8XW5$H$rSj=LVSA8bmV zmtMDYRW{P(*V44-n>QU>JJx~w6 zInprDUcUHb|I>|EL7TAe-+xz8lrghiQds7w>*Em>DOdj>U<$IH%os`1;Ii8M>$AFg zaT3`vy(Ra$v_u3$v{iCDxwBBw0XeYh%X|?*ugm!5kuyEB`%g{H3wX*;;Vo^>hUx1* zGxWY5*FH9UEtjXx5V9y~Y0ikSV6V`z7}tSNjBeRqn^otYP5GwnqjY`w`?vn2sEYU; z`R}}z!TwRvU4;S}r-*xNQI8Qh&UPv>g(pEFD#is?AE>R|W~^3}Z@fHh>0MSaT)!V& zD_lCPqFy?zGgmq%1RJaMUM_pVVn0xB!P80eIOv<=rkkH>Q4z>_bGv3O z`iA24M9@W(n~*}ptEci7vEt8-g1@(EGmlPw>6kruF6Pf@wH3{@xTJ4yZS9p~iXHXJ z-YTz-NW-!dT2$%HJR6Li8Omko7=GOqR}6*r&-P}t&wc$RAU%<3T4}OSHdZAwB6TUu zdA^t1M}nU?&mihu?)b9o_H#m2sjGlBj&tSMd2!JG{p;^MrPJQ0(hV;L_pDp*2{p~$ zNPUzDP7bb_GH%P|3+c0Y4w=jP%){+9ZP zwE3H*rDU_;hTpy$->&CPEvhIQo3jZ^iWyT50yFiPulxI8pXj>B-|}p=gI5 zg^~34<%8EEhL5)a^!8^s;IgIm`BVR6`HGa|yi@KCq}_nTVtfh(MS`+r+dFTY!eHT4 z6JDMAS)Y;+9nS(?Q#JG}opSe)bfvM8Z*#~jyh7I?r_)N%rvD3L>y*Ba9T9`WF4mb- z9f1h>*&kkR4ztCX&n$mACvmw1xe5!}6T)x2Ccf-e>U~^$Rk~I-6bjPS@B(z9; ze6*TaJ}Lb{S{^bC$m6fnHmnW*O&%@~&nEo%va2{4WDm~q@_AT{S;KCgzT7gy-*ebG zT}_>M{rZhpq5m~agTfQH9>s-HllhRs#V_KIhm?d{!&e@xd~URD{khtPXcO` z=-iS&?S(vti2DjP=U-JstN+%7cYT5AmFAJfDpaJKHt_+`j#OuCyYu}&anc72lBaQC#HOo9*DwBQ3EHq|(qo*ogDfhM8 z&aa3)pTdZ>_m@WgPJhmLP8V!8Hl`z#Zuh1%GxbWYsKo~lVWI|QZ!Du`A&5zY@zB>T z<)R;QFlX_x;-mHlvGL>zw?3g<2=-z9m(Hw#U6JZZFVD@Z&gPl^`nI$8yfvQKzDl&? zc%PIz`zYkz(~x9a{@lmn9xonY?i~DV+YFakH&bLdO(>M`S$cOfjA(ZG zE^_&Hga0z!I9_f=&rNS-PXq|#aJ(1j@SyqZ@`}-egLTNdif=L>`fFHA_A1@pj-u*^ zu-W`qE%lx)=Nr~uE*dm79Bh^k-D_=)Y0Ns8_@dvDszXNtcOw^;rb#_PZY}x`+FH_e zo9AS~qN?h-5{;l9CpD{Ej(YmF22tK8tAlm$WoyIc_2^B1vsTPjo5H zLlF=`(nWsMCMXiAa)qN22GJ3YPpGOzZbBAgZyQ(oEuOfS)v#9z{ej0lQ5a@VBNnW~ zYO&b&zu{@yy~#0B15r>PdrN80g8}jzFK@L-ZL*pN)Ia$BDE?VoL$M&&u zq60aBi@0(Gz5ViGmM46(^I?JD4-xpZILZvfNQQLP>RYVoEh(iw5PxRSP}yw)^EEz; zC`@7fj-{nf2lmd+*T)1L@BEJu_Ep-^7-rP_X}s2aNy?smarYnS#zy}$dU|t4kH9zI zm#+NfM+=g`enx#g!bcRsfBQi`R4)b{8gpIS(a$QQ+*URD3M-CeI`;2`TaJqRXCzc4Qk!TkXQ2A1E%h z7s$on3fTOQdUnXdfb7+1i@zsnN@ztxr0`lp`YLnLA>UsB?G%R%1{YFmdGsTN`WUWt zvq;fGJ}Lf;L{2c3(q!;%#a{Ya!eTw2G$u$Ty)IIJ1g$5EieTSYicB!s$UfkYRo#}( zx=Z?mK`e7~AMT~UV~}Qg06O5(5d!wzgUSH$Na>LVQ$K68ZDV&1cONfvEnv>4{PTv& zaeRcDJBpSB%@fz=67bj~!-&COg=7EFD7Jgw(mh$aY7l*yd4dFU+QX0cnj7HlWrR{( zZAep^#R@mHz<@UP?`SSHmWhh~rBd>g)SF8bT#&AGe}KiOgnQs+ACPFO7Y|QY(RI=l z!3rT3e{E64ox_D#q`l)5C@HjrGt`H+VeV)(`|NLdfxnhjdy;-66k<+r?r5vW@838# z@@oDrp{z;{I?suflr%>1K04YimwzB&z5F-AszAE3@4g(PnWu`>+rG8A53UjH zE3>2s)?46rQf6Xb-{yBc2dIZPon4LqBzOl@={9Gezz0x$Tt5)Kann+KRToyfi@}16 z!gDnoxPm+!!ZZi_8;-e0qDVUYC;((0Tg2o-TVhovdjoyBhZyDKz_bzc!+HV0_$C?0KV$7I_UhM5a_zhG1Ozu3HG&F#=15wlnuLuv=O zj|m(a_Fqm7&ej_!rI(fOpz$XR>DjiYxQ7YS-i??CrHsqqaaim4MVCWEwV>*p5i2K$ z2|#bD!=3ES0v?Q#@}taW_^!C#VOr;c%)_mA^kEGxo%M~1-uE0JN*RPhcIEc@KCwvL zivJ_uW3G|cerSZ_eEN%zQFXuWcQ*D%!rf9rzlvNKqfdk9?+0MSWqGI!B${J)nV9zg ze3(+s(2{|7SU#yuD%M>h05$^c3e}z9r=lBEbp#afdxif%z@#%RNa<^D5c2h6LJGyv zPuNod07Ut@?*7d+<1Ts$TEIz+7#=^`YCdz0Fj8Pmhy-vh>qk4Nf60?jEevy zC{TaTB`aA+YX;s2i=Aqu72r|yOq!eFsv*4M0Tl?*RddJS=VjgNFLF8ehxqmZdPlU9 zH-Kbd1yk&_ZjncTK)(0GeU$1d9)MOIJS#u|$oS-?Utp>fE<>vBXw-T_qz8Zn-}+!b zsKHkpMME`XY*Hk!fEb6~$}xLJwb$De-F7$oCIq z8mn#Z#)$)WT`GV7$(sMTF5qg{RvcLsUAD!f9y13v`qWIDf2&JRkwS(!P6`QhU?*6yVY;?N+Q_>6{CuU8Vuu;(r6sr)8~Es3YNMRge=I zgoG>#)YkfqUl5msE)G0Y?(28d_r&N zDixQC%HNE&ajIDW_pJ+_7_^j8F}ajHy9D7s?y_e+XNu5lyZw}|kLOx0uY`A>m@+Vs zfed+VR;q6MnzU z_mKa;KN7leas|wFi-1aI<^S9>W)&g5m4#u%iU5$l_+mYM6#jslfO%{ri&`Y_rsdP) znpoe#Yg_uL>lA=+x9%lc5lV9b6WPU4)HJ}Mx~+SNrDrJsxBLTX%$^{+z%^B5p+bd9 zZfnqExa>N4Aw}Wlo0V5OPHb?bf zA|AI78E+%~Z^!_0+Sop=^-)W^Z_NQ8RyFXzq$>J7bsLq}!(aea1{6_`KBmhn;EMc5 z=;{Cpk}7~}3*+^-MHy*aBA91I8`suE?6!yFf&?U(B8(bN1v)N|tJ>i9$i^W8w>`T~ z$>hxt0ot*Pg=pr1*;@~bTVv8ktov?HRU5A|X%{tDfBD$zh!|8TIQGM4KH;CL8CelQ zCb&f|{Mk{qI{T=-PRmt*KXXx}Ew0vdPWd}{f{%&}CF6E9f-*~5?&)#HQq!fIc+nIM zOo~oY3mCyf1!j*_?dr%2t*zI`ElP&(M1|Ha+Yj8c^Y^#?V&hcS31nRiRNqbILvy3W z8pT4MUtE~aQPqB9+KlAtXwqhA=={a^D~nOC81SIr7$1n6dA&3AC;n|62=%YGV;oa> z-03DDRX}`^iCxy^X;{^gRIaL2eYi?XbWC>4?V2TR#OhjTTvK=$TQvDWrEz~?W%m0+U&$xx zPhx3`P6L+Sg_)u0@L~aEZg<0$=ATs;@v}z@bIN>otB>pybH9AJD>kvp(kj~C=VtYp zPzI~h78dw+AK>HpUX6UReD zz(J?*_}ol0@Sqh}co}Cq87(4a!ecTTAaaIcDdMV2x)z>P5pR`)Q*i5(NG`k;F-&xT z4(;ufCOvw@LkF>Y{cv#49y=H+X=OXB_4}vSB+ro5#}oqg&BapY^!wYfjSY6tzM_nX zExrB2xbCr6{83S7&J3)BP%)5;2C%QH3n;XgfaPR*?~E7bVE=s48^~-dy+!Nh1LY1r zr{|!{jhArEL4?l>fjc9%l;LV=b!?(Ht|X{jcMo)FCy8iYJ zU)xFMS-Do|I9U5Mj31lhx#j<~`P=cm7WrdIg5k}9mWUq{@?tx!CU;gluBl3LyR$Tg z2UqX>=v8KVH+g9F*Jo@FLv_^bIkx+L^`%792IfQFdMe+{kKL90ncnc_Ijg(HX@eX_ z7Aeb;*K@`{rea^Kat*iL{JZ+{^?(5H%m=2uq^RVt$E+TG2Qh8|W4>VCf1n)_H^O`@ITGS+FfBa6sYniO5Qz^Hk@_-IEn9E zzduo>bclAfP3^dzxwb6$GDPHRvr!VLs+&N+(z}eTY~|%D4+HrgRxWXR1?;8E&%C>L zbvd|g?&{fOwbqJlaPV!fKd;@j3|rFomZ$&D4n#gqAHAPs#&Sh8%jmk#g0A=Odd{5v zwdd4Ooh^uvn)rlyo`c&zP~TPdo!|T4*;sk~)!Jv|O>^7xZ;|H6Giia~AzOz>R>#?1 zZmLFx_Fb}=`r0nsakE8;itK~h7xpt`+3yOagvbt5dT6M`T+%@AAEoy?mxUC9=e+}M zzPuY~2ef+OgA<(Zb8AF$(UrpNsZZMyJ<8e5g@)h*{J2(073yohSi0Eg9@8s%g4fh# zJfJqhK2EQAO2*9$gPBrJI}-h?EyzI2jbGk0b;hPKEl$& zem<9D3ol<*i(Mab{}_UgZd>SkVyE%yr8;ZkXex>hXQOc5WV#nM4_51GRjQz?V zjVe*_E#&@0{-Y|pasuPK^!t#%G?P3>ckc!J*hW8cdCcwnrJ0=7@X%Uqba>fBChc%- z{%-=iZOoHwQ-|9#I$|ocwyhnPSYoxtu2}kASzjZP+I}ClSNkxD20Z#pc;tRl>UvFw zx*^S!#S}Il3jG>>Z6a&s5o_e_9kzbzv~PhY?5NM~S%C+5aa-1GUA=k{8CsBufN=+H zEvvlTaXLRC{i*bZ>lr57zED!w)VobvV9c?(VKr282Y10(xPu4W=oS%;T0X{-m^z%! z2Oce2Uy>*Bwf;;l0c~v&8aR~skte4!HnBO?di-^w$|=_DM`#~}QDg13dEg_apRx3# z9#5Xoy!ya%fC=}k^zX>YZ|QK;DzAa6eyP~FWc>+bCPHp@^a(IINWJn~>-jYQ-Q$91 z477uMHMbvE>CsA1)G84w_fO2HpKC3eztrOsf1~>FoRGhB6lKKs*Y4NCazVI{rMm2w zd{I6d_eyR7y+%S5M+0l^Yv!d<$wxKw3JNkcDZsgu!MuX3QOi8 zZ+;-WMBV%_fI`9l_+4lEiKbHZ ztmd%3eel$Hir&7Uj!hAnd!B8(vH$s(gPfq!zC39o$*fMF)@N{b{qg%7O9aUr zW4E$sax%^KMXC~8ygt@V#x(@p0fqylaT#j$l=D(hPt082IZ*JezS)cvdUAFKNXy@V zCN10%K#a8vwH7tgQ+m?Dwui(;7(Ni2<*xE79W;>Ff+PknfbHJZ=D3yM^0Hc+@fASpnVA@!g=DCL30WutK43h>TQM{fMfeYn5u-BTBrfb0_D08W+~! zx{PL^Nz&mLW34W1LoKlJ%l&5Gp39p8Sl#@|W-;^q42-4Eq14W|OzRJOOy&Ed6#z9E zyHPxEInu-?M<6H%aPNUjPbyT~Cyzd6W7n5r9t*}0pFE0VntGC)I*seF*N=IiRgAR5 z6S8`7J&ZfsCDVEhL|1OOso_Xu%C>m8AKctr57jv_)k69U^Ti(N8Wlg(ua43;uwyO{ zSl>WOC5$Z7|ETH4OJ^!5A>ufK0yfa==*%kxg|hOwK)0i}m8D<%9^n&^+gOxM5!#T2 ztt7A43J+;S2De%llWZaC$z?&mNAu>Rm1r2kOo-F$FgHOYE{vbq3$Sox{A341?fO9h zP}Bs({;0jy6PMRr>DoTO_KA1=*TmZYIR15aUg59Hw00AOxF|5CSdQzC(9?j$%fYk< z2~!6Vorf6H56hP^`;u`XfG{@mC>yd`D_N*WE;GhDl_R9J?-rPRfRGHE#*dbb(233l zDF^)!pl7unK9MOx3)GdFJg3}?83B?hLpP~vAtvY^r6GA3{n2SD9jE;{{}ZIk{RvPL zwxCcfxj};A+?R}-iL}43t@GAl-b2w(i;(6%c#Z=YplzgvlMia~0DCZKf_DIJPImR){e7Obk)*&Ch#IxS3 zqb>`}Sv(wQ4(k-l1Tols65$CW2-^rb#{XpEpbhH#(6T=UvBU)Q0vUhhHb_>ZAHV}4 z{o%B65c5kmR4!+$nZL!a21`xHlU^d>qGJx3vTpaIeRaG8q8Y*j%9>SqEB3A@l=N}b z_3k$f9Bc;(1IcJ$*XvGMDrTfo{x;u13MqpO1WaPNi6PpG2=^Jfu)SML@)fQM<_#hR zNLkr(s0SG7J`*%UELzL7|LKKA~`PcIYSf#URf_#BLVYoU(Gv00i}D?op7lVLgB@FS0E%o;`MeW zwH6J%V-z7XvsG~Tv6r-OOj%UxsJ?(Vrdh z2$ou(_G)~()(iCiOknPiy0vDC2bpvOSG$3V{nyy0?+ zMP;5uFh$w{kciMe#0BHOmT;k(RJY5M5{)kjm`mosXWYYdy5By&c?*F`7Maf?>pill z`yiqJ0iiK6Zrt_*mE_#oi;Kk0&is{h6oX5O3imJG`< zH0X-&WurDvf*@2DwE*50Kmul0_gA^HV(6cw%~ZX_$6Pd~mmWz+-(%HYrmT7KBJT78m&RbIe&lWp| zX`J;^8vqZEfY*%rtOu3J9C8w>Qj<0Mm^G6`IUiVGWrY8M#=xV})al%Ip*uBu+xj0*fnD8cs3?j7|suj=Zd;5c3fM zxnauqqgSYb^a|kk`2pbuEv;os9FdSnp3Pz1&17m z)22cAuj=)w_(y_UXGh0ZHsvf6GV|P;e#B{bvJ3T@%YN|Iokz5P!qoHUbMPlLFm`Uq zxcnxGSCW0EVE$H1D&-@+4L-FUr+BM&Q5f^~HWPp|L)J6~vR%VD?w*Dshl&@1GA_)8 zw^!^k>{~yeOaJkv@3wa{+4PC<#DGYXz4}()rl# zIUF0uakPH;7@lc9=3R$%IdyEe-UMa_no*Yq`sNaT zbh)C8>g!~`q7ul~4!yU&G(Be;%O-wxKE%Jhe$!1^FdVOzUTWGYXAMk@`pb?^2*IXl zN^D7Pbtn zd{NnvuiTJ~we8dAuI%a0J2h}l+z#Tx`#*k^CAzeY`Uf%8R)F@X(l*aHw;y3F>j z$A@|;_^(O-GBLA)5_wap)C$LK{8QxhtOsV}xy)n?z9-nuuuqqRK8ooRRtF&_UMX>=+}~Fz+SlbiuM7A(rK~H*w$#AoFByCR3jSPxMY_VB~=p`>4#km0whdjuHE{Hg!}> z=+Ta0i(HN(k>{Qf{xuyniMo$Y9FPAt)cjalxNaZOCsMLX{$-Cdax)EGEtB1!h{8_= z`Ge#|jBQ6IW)x=}1F~OfiWSDIWrL&e0B3whlNp7`XH z2e`~V zgtS!(^m1m_Yf_G%jkAE7&N#q}mVUy}&noLTd!k{>D^c(aJ9yStzw~oSE{d;?@yFTt zvk$P}?4I+T+A8}g@197zZx!8#$S|uMEVl2bG={ydT*u}nax`O$MKcT5FPk%KIy8w3 zQ8Kk;B>0V1x|3yco2Hx9HZ&YbQW+JFT35`STq)>|g7@d{Mt>nAUkNkV&Q{ z^g(x0FT%T7Kq@W!U`9|>S&msXib;Z&7P~;4k@}zjI&;wJ-fnOUvz zeOQdn=KQPoRDYd-T2~MTobWd#MYX(d7Eh-}BdJ6_dd~&0`M}LWSW1 z!(ooffsWfRg>P#cckL&B22}47>gsj^e;tI0zUWalGenl1QP_iAX1UvNNKQJ^;_qBchT{08CH><3hP&gLtf1kJwCnq zEW0!g@^^H?R2cyYYi?vpMjkiXKil+U4*L{;sM-qCa85|QV4MWsSxG|P_%_Z$6sx_Y z)Q#G6qq6DX!SI^#d7D|2>=nwFI&_prrXAl~f~8!9n||};C%mQ-(WHVMIExy3SI3Pi zBDv?a*C;{fTMCTmPZdn>hIeMSO2h;2tsMd0;j*vbJ)MSK@&WqI)Dh1(V=YbLvd4po z?GDtSd~t0^-e<*Uv5AsvN2V`bfo3Sx7aya=JLet!*)Iw${ycph!MN9Xqa#tWY*3zC zWq5N{Y+)L^51Zx`KIYl^t@Z0v1ntteXx3fKun8o|bbh|}rkexmR?*Cj0K{XtA|L|@;K6VHj`8}d4%IIc4&4}C6*JWI-DcjVH!Xh_UEz>;Wz|sj5N$!e91!ty=jG1YZO^HM(AaVHkk`{ zq@$p4yu-%^wq0hbt2DCW*19?C+JFHeMpc^jfLiMsOT2H@nynIrG&m`la2OaZ!qklnmO@Sz|4V7Ja3d|L=cx~D_k&)po} z`v6I;GKx>Rw>!|He)HA-0+g#Ira@aZ!PQk}za-th=q?tziocEPKZcZ;8#O~J1|2c5 z(!cGHd8?{>SG~p4OJ;Z-m-Y1{b90cI(D~Cpr|@OJhgS^H!wme^n_oNO)FpV9DKv)f zzWB2U54V3VdI|7_q{4=L8?+%eXNp$Bqv0f_LJQZ&b4Jq@=I3M9dz!j~#VR#Qw-Ik{ z$k5dMic_5bK;#hEu-6aOm%UXfvsiX9`(fR^VPJC;YuJq!h5>C(Gy@MQ~47ZZa-06a_}RP)l{^p`?N}e7?J2mq(xZK@1fXXF?b?!(j~%hFY+Mo zNu>F}-c$}#t+4wtL+pNJq~8Xu)FlUAlB5qqw8jcV2LV?9VhltnFklX#T6s86^H^ny zfu3z^0AnIiY`LQeYaa{HlqZJ(`{6p%iWsEeh7nR6F+tZ}D%=@*{TnD0vK|<}3hjj@ z)2WGXRwv(E++(C&4Z5%2q9=05r*x!5NW)%#49;YeyXKV)cGEaM2D`rd!-$JJBLnuK zQzph^iS`T)3QQR4hKr+CIllrw1y_x22=AvKmiX`M6Otf|)MbVT{xSf4x~k14e9i*T z$q4}*S|>S*5B)9mh+a1#>fcb2BuxYd-dw@2dc^me;y|BYbK@AO6^dUBc|KToKjf8} zR$E7EGhz}I#}6OlImJCvgs5-$hvag8C2R{6ym;1EF;k`%RKN1JziqNCqz9d60?j!h z#>9AHpHepa5CR?J;3cOr*KR%OA9@UNAr6pZeVpRi3vHyIug`1lLDi%p5|7r~;M2S# zemjE9FNBO}!^{j^;qR^q0h&C?TU(~+ul?cp8dw}a@Y}fm$ju~BnR2p2y7P|`c}1pG zh&UA&qfZT*jit|olGoYl0gJq6=bPdCsv3O*i2B3^j=AmsvJu{t90~CHj!uXb^iWgB z(Wf3I$#i9+0Bgo{$=$u3$PH+JfW_V|+)UDCTF!k-0_=zCB#Un+_1>YW;$rHe* zY}J*J5l6= z5M@;HphGZ~Itr*Fq@FHW1=?L*vvuDy!SaPmfC_-nSMDCwV*#d430Zt`-9rtC`x~Hf z>Y+Nk)J?6dl|<6(fFYy2^ppCB9TcR$G@xQL;@*(WX%ONf^@ec`pwc9o&L`#_^@r0C zzizs*z!FYBE`HQm@44PRM}HOl9w`>UW1MRf7Yz;ZQ~i^fa31b?YlnGjV^{Emo3@Vr z@si0*B)MWEokwM;Bntny|8^S{P<)t222cxzHF!C#F&WFcq~#tU-6e;4^i)x}5`Zlx z0U>K#Xs}Et3alD35!uGE)%!ywluVlhV0ypiqG4v5ZDl4|T-B&kVRvvx$&9gtrcR#r z&SB%SfO{JsLMCFgP{%$|y>mEX$C7s9Kxf#y<#{ay^A1lGNEg0~2=oQAvI7oN&$YYO zFZ(ikx4P?ahM8m`F79Y+hIaV-jRl1`&Kf}*=6ZzwO&;4aNOEf zBsoN9Uno&MsgaS8q=nv!vVzV}s94r4|IDQnjxpffqZ+c{p+iWfta z=jI(aK(r*#-3LD7{fDA{VlUar*&9f@6zCxj&~nVyk`r4K%+xV}?d~mlF?|`qsM~aa zaNwSVW~6p5EXW5T>ScgYqy>;XuA~+EK3*W|>)F8OSAguITY+95cS?6my9-IjgCIE; zXS(;QzM`SEjtsaEx9dhlzz@4{ywq>?pZp}P|o-7|| zj7Q)w<%4S>i|e(-Jr_e1DmE{AZWv?0jlhWUm7jBw4Zd?y2#Ps49{QOG(3b#!>1P*G zKX=f+xxkkH|X z7K<33+LRAj4|$OXM8N?*xSL#m1>1G{LB`!qK=U3MKz^*|md%FZiNHNwr~Z%m05LHg zE`38#B85X(qG5?Z$v`8zPmaphVvW})=^7_13ag^UGg zvF!C@7rq=02HZKqhJW`1?5DaD%mWyW(uQCsmQ)YI4Lb~EcXR~g-6R;eC~e;<(&~T= z0KftAFa?G&02q)7W9Fb2lkeTe`MnUEI1tG4Bcyk_iZocE^$@e4xaS{e5Xg7^KHw(O zpN~04$Uehq)rp`F`3Jh*4;v{W1O(|`6cY9I*@cuPYEvrgVZVsN$r3$y_y`_02`&t#plssy`EqCeBz z-qmT|`f_b4MLS^M`XZ!z@4saxft;)7{?!qXW5iGsnha*QP{rfke!>7q5**F&(p>7ughk6FwiHCR zo3M`Z@w`5mIrgX}^y)1a16w{|Al#?sa>#7NpF}Pb$_@`5vjMlm|Mi6cA<6FcuX%Nu zll8`e7xf~O3`$71B<37UbPQ^hxM45sAo-iy?e=P-6S{lf9U<{76|ANpRvnapTmO&< zbXBfOK5d81{EY3ffsBF2yfT^DO6{aDNn^T{u7<@i8-SILvDB$*AnYdF(u8%#<8lZG z612XiH;d4zICuFHbIyRvbC0`QQ^sOSeyLWvtT^Bupw2>E(E{ULo&A%(idt;yDx;@( z+vG_%`a*?Dfa*N4x?A@oB<;8v5tWuPzOpJZLhypu{YtZ8zBrn9kDXrZkc}I$H)UQZ zh_YG{uwL=S=Y6@%Y3W18{o~@gQP5CrDJ}-njW6XlENSzC2m|vmNrO zbzV&s!Q%@&8mfg1SN_4sE|HCzfDqHF)oRh}ms7*vL7`bBSqRZHsqZEey<0O5s^f z{Mmo#FSZzcw9Ze?7iX}}IO?81`nKSD;)^ItSbJkiK&v1pQN?cLC5AQaeaIq9`+aa? z9RYcewsm%IUh=t4YG~7>GuJJB{Z#HieatqLvWhY`Y@Su+Jw}}MUyZNbtr|JCx?lc6 z()aG4#!qFBwXca2&T+c)=~k7qe(@8b9r13ugjWq`mYW)}f9g)BC_hYXN0;70f(DCP z1zb+TUzRA-5UQ+k(PEig&WzE_3Rb_NcSi6Wm|F%*UEi3^J6gI;do9V*DldT%R-4O4 zWeI7IUSrr&|NSH*QuG5k{tWdz{W?%s7ipw5L~%Bs(vS8Uuc`0Stm~#1`?ehaOyPK7 zuX=~Ba8V5U5+g%ciSp)2`9si8`}j0?T*i;50u>aR?h!v%lXA(9E>rZr04@I#z)8Y$G7a_grvxbgED2R0SYQ4yp)|Iutvqo&LBv3Z1=w`^BVui8mv zft8XyJx4*R^UW)Ne|JX`?cGdaauEB6;GwItzNTuqfKYppk*+a&CY~UzcQLiQS2scF zp3g?9!~vIJn?E7knP4W%$_4$>YQx~)PJU(0R^0ebVNYFFvFDQWF{|>YDlp1}l=UhR z*p3=f`pW{^I4Q65D@L+BOT?^s@4-pE=OhAmqnG|vdB#KH5Wc0eT-1p)Jx_g8+tN8- z^ie{8ZMuHfmcojCag9m?BUOrKn?*4`sssOouM7E`zHp0xMFJ++@G1GjoR%#1+wwW) z2W|%i=9A0bmQia4S;wq3TA|W5o2YC`%2Mx7t#_Y2`+hR%zcKHK$vW{0RNVdM;N2ow z!E3e>%j>ih=+mNCJg>9hP+l_ZIBN8Gu>C24356Jfz&Q8#`|BI38jPmM15Il^5qgEn zaQprxG21V(FZTy<^>Vd2=U?O1Cik3eo1DLDFVgt>BjALia{KEu`aL7(A)KFylGz=i zj?NA-^*7J5#jENQrY^j{oDi*8m#4RwbFne}qOrW!4T=t__qzK)B&xIe>B!O8J3*W# zjW#mdZZh^)YBCJkJ!*7mrQ+TXNJM_UFJP?F7d7yIUON^T*z9~19M#O?EHNO9Z5c^J zqw(obx@o$7ks;q<<;iPV@k7fuNi`q}8EVJEuz>2O{4%JC*mgqe+~hD?sk^Jg=+dFI z1Je#g?<#|ozuW#snQPutfeY;cM-BLbo)!Kih@QyEC5}SSG{R?bHX1haB zPPd8`ui(#&54*p(lIT6QfvH_Gqm79c8X#fhZl1UjowcYseki3g=aoz+;{pe%b2wBevpX_YBaFob@={c_mc zVs@p5UHHg{wb)+7+o(z0@t)nIyAyxZuaz19iNWvZ%dP>tD+fh7%u>TvL_BaAgZL-7 z?H}(sN0;N7)Ks7oV^hDHr=Ne*#iH7I`{$RYUX#_BmhgmS{ZqRqKZ@uY!DJSIoe*^8aZy=Tgnft}Z37tKWFf%mPb1ZpjLRlqPVzPXU*<7#7o z2>u7@ILY?`FW#LnG1E+u3avBiQlD(c?+SH%qUxqGqMem^A9$`7Xu;2JsD#CNdv{i9 zO`hYZ>}ougYVeJSu}^J4=SV)Wr^=>6Q2vMc!P+aef{+@YuLas{%t;Et7G^7%&9}+= zax!^ZbB^0)z&1Sk*(8N8)e);rGDA=&TXY`n<&d1asacV{gxniN;`Uq`$JrKh^J=w# zDumojzwFvW@x=lWeO=D)Ee~mlU*FnxWIv=R7vp?30Le-13t!Yg%ve_Xs<|IW#CB&M z{#iR06L~BB#LlOoT5rp*ED4W+YR6&tamqWDXK?By)BrKc1g;}mT^tu{lzbOkeva~U zSrUYa&`i5u66_GXthnT!`H{>=E9HIkK3!?4nC{!Vt`z8>anS}^yUyzJ zjK9SX3V)I{K3p(cO>$Wcg>$MLI^8j_+nU_XK2@r&lgr#t6q+a-&4_o$wF-bW#Z`EK z=|qn|SFx)mXW86t5m0yl-g)D!enU=W@QHv7e7|SU<*Rr|v89N3PPe2gV#Z|4M`9=s zeYsZ)Odpxq`_S%hrfpTQQrYvoAq$w``Arg*!D$#v2HhJ7Ueyrr#H#G!6de*U5 z=lReH4h}oWa-2@48?62V)eD?}^-C6mq2%h%k;U>;a}T58mUJa$0^TVehsbPN`~qP`b8;aB?u9)3FS~rt zXL;9Wemx@+LgFc}aJhldjtFSCTFQGH!aR&eP+7tZv>7#0FW##hQ!xLT#*=&u^F=eS zTDtq~dXAR;KuAl`At6^>s!<$9GHzYQ$#0I?E5I|5zTQ?ZN4bx8v-2^kO^lMc4BcWk$MJ`XakqY6;$=mlnr4p*wrP*a7SMH zPFEht@@bV#!+Zu=gCH5dn4ep&kD#W*pPDfJsDpI@gw_qO_Cz)lPJ?AWW=kCJ$vN~2 zq)`kGb8w~il#Pit8)F^oc1J0I9&UzC;j>|DIqI}RoFY{^K<69#a$Oo-#vBYD_PQPO zi*r}`jFI=l^0`xZ$ZTr3Ft`VOvPz&<9^e4haG@jpJ(A}_K3R^C1*-xT!({&9t5c>% zJd33BvL!*C91Bt~Vskd!4I7VryIlYYcD>)!(;!u{0v=)Qm&cGvID0&4xz-q+KzB z#5;8ybq`4|b73iB(q+4Y66w2lczX1ufP#;plvDs%y;<*jE+?vupn zN#u-Q-u-N~B#k5u(rH1<58r;|`ZO=IFhEue8nXHRJo*LI)4ArXA zxW>V0pF#_SIUiDX@3l8ZEZ=pE7XwzJ?YvXVzc?Pv@x6khEw1|@3~z8RCf2D(v5>a7 zKv<0&3eX(E82N53{wxVfzX5Y^l(yS-C&HOd;MWH-7Je7`?Wx-~v zz9zuI=m#t`6D(5A?{a+z3xy9yznQJQ58GPzp;(?hi=*g?xN}cjhN7Xl-L9sWn7_J? zIplE%INiR$%(r^_eX;CHp3+y^$4GF4Sj(^lnXj}pX6sMUS@4;lp@({yY{)+1EKA;G zR}gGA01$Y7Uavx~nf!*lKA%z4K0)Z;y$|VDPc5I!6ao6_M57wlQA-I(IU6*=s#iNf@{rmj4Hh3-1rJ zI0FC;r^CFDz&wWxSt~fA+>2X^7K*`qu^aU>s39T&g?R7**9N=8o-#r{Q1C|XjSfA& z^T7mS?g8n+G7J|pxtHPtMfvD*1gH2=Y|lePV%;gK)2Bfl@_{s?j*y>B?h2s)ka5*| z^_OxyY6AOE=)Ml*Wau`(^&aQLkws-X@kZpjK`;~^Qu~%7V-5k52E*$;5IJtaZy?K6-QeU~ zNZxrb688YTj(iYy;DQnqA^|wTa>0TV6$m8L$0dZ9cw!;Wq@SOabw7^O#sJ_Q#*WJE zeuk;!Mk5_uJfVFJcrW;PpMcy!jid#KIsHGaisJ*MrMBW6?84+|K~WTvCu%0Apbl4L}6&w0tki@}J8Tn6-1G>!okNcw;V2WO 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

    @0k<$Nh~r- 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�}hj>JAIT4`1= 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�GYGC-F|$D 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 z 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

    jHmbm=sv zTq)0vDR#LH{enw9%QN{)G_1>J#NjY&2&2)$bk-Ui+$m(j?#x#&vX<~Tst!fXEuMfW!hkChXb!0*v z0`TAkDNiv@IEj|zvoLpJNK&H!CTj+<*_CshGsc#QPace{n8#@_YXRQ>RvX$P6krk=`un3Zw2?K_pQz1pCT2mQ@#b$JTp zIPk4Gic8noZ7Ib&$7SL&ytCS3JU=d2+W+?ZvA@ z@tW?ViR@dHLgUINkJw2<$r8Vmt0bWKARlk*_3Dpu?uM~qv8XOQYoCy(k34O*52qHp ztP68@Je@b-7fnS+;;G;`@yufPqWIU3@yXszgmt(354qr{aV@QPr9FRgy{gc}BWqIk zAmoVG!H#>xrI^Ih41Y~_Ru2}#ERLtj(O|ja$O4EkhX&9|_G-~IEGRIfAe%wl0P9;}aKlE)L zhg&oM0Q+430MY|kmL_nJ$y(iy%)3@+KEB+DGyD3B6Yo-71-qW&NRI)lAVy}YCjX(DO1`+Ep30_rc(LR*e`l1H<{mNN*sKCX#ah{iB(qwi%%1Hnl{;1< zvh^d&GBQS{DF_Q9jO1&M*L85EmqV7|6zOIIim((1$1_ox1mn(T?p>pAoSMrM3TiST zkypWzM)fa&AaTg^#qz&7<2$It6|8G&UXb8br!9pRErs?Wu}%kD{{WS0X(RG^BaJ41 zbHYfaK%h~!!@63y5+tSoMs%)OR5!yx;0YjRRD+F8w|REu>_3rl3AzJ?NMe8abUKR< z;RpDU)}YkmKJ<;sV9lFyl###})V_8aev`L1)wHRb7QB-*K zZzkI%>`t(^R_-+fF{LR&3e=BL6v&#AIi5JlHva%`wOlJ*TgMjHaK%{zA5$I@I2vfj zAXF?1QCbR-i!HtW$BsM|t(ouY=v%o{HTSd);E8MAWji`BM?p#xn#D|t2inb_TG)2` zUC5au0y~n5-^*KH8xb+t0uw9{%fi(X36+p%VO zeBLQN*$IWGXuxMa)=0-(ZE@}>X4B9tv@8OE%aI@fokt@BeyEW+59oT2y{ zM|M~7CFr!E%poI~%+nJ!IYsM+JDWIVcqC>+6JKKuW@z>OW*df*MovK0Z|Ei(A^U zVzX7HzS^xpJhsJH>a+zO@rfoaVx73{OJ2lK`7C8s8He!WBvPFbxMzYcsLHkQ8Bj9P zqnWN%#@5`*_F59=<|v8H0@q_P z&?F)}I+ARa=6ZWtww}%9ju2%;M6Q)9Pdp2k zV>g?+{iOCCdRE5KSlM*rcM%XZD+&spH6*bB@}&Sd9}^Z*L(%cC``AvKNvt zq>b~6Ry7Nqx)~B{+i4yM z!S$l)(uTDRLCrznK&Uwy4mfVpeY>{0wb}0DOO~ZlM%K+I5Ks_QGiOn#tp`3>kh91p z(pZmUsiPfw3i4IGqn@>;zpa)NYKG1r17gQ`O9t^Bj78g$EKNi5sPg_Wr>4zBWfQ^ie1swhb>hZA1qJtu4Bh(NhFJ* z)&3oSGZi1qwO>`LGtOE60H;JO0~|ukxfqPE-PjNd8lB%}+^#CUc?_+^^o?>*WLkoi z11ygL#<^on+TF{s+A^zJ+pIxN5VLgRsi|1O%}|r5kKQJjux~jx#XAbJ%gn3IYhcA* zj9Pgfy-LgoS(eLMiq!iHDkH#>DHbPFg&mJo_B(HNTTH98dSL>LWTvM3G6TrwF?YJ} z-%jssOr6k;HNYpM95N9UW59z${{W;gHODw?HoP!cdAQXb&Z@H#k+``Hi&1-Q95g3B zL1UbkS7c(KmCtkjVZ38Xs<6@37;+_YKptq?rEzLbkYqA;GFOu6$H# zr--TKP91AGZAh%FG8wd0Rz

    @@ -28,7 +28,7 @@

    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 literal 0 HcmV?d00001 diff --git a/laravel/tests/storage/logs/.gitignore b/laravel/tests/storage/logs/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/laravel/tests/storage/sessions/.gitignore b/laravel/tests/storage/sessions/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/laravel/tests/storage/views/.gitignore b/laravel/tests/storage/views/.gitignore new file mode 100644 index 00000000..e69de29b From 9bd875516712122d90efc7ba2712207fbdefa4d5 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 13 Jul 2012 00:14:30 +0200 Subject: [PATCH 115/260] Fix wrong API usage in Auth unit test. --- laravel/tests/cases/auth.test.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/laravel/tests/cases/auth.test.php b/laravel/tests/cases/auth.test.php index 32f74805..682b2cd9 100644 --- a/laravel/tests/cases/auth.test.php +++ b/laravel/tests/cases/auth.test.php @@ -17,7 +17,7 @@ public function setUp() $_SERVER['auth.login.stub'] = null; Cookie::$jar = array(); Config::$items = array(); - Auth::driver()->$user = null; + Auth::driver()->user = null; Session::$instance = null; Config::set('database.default', 'sqlite'); } @@ -30,7 +30,7 @@ public function tearDown() $_SERVER['auth.login.stub'] = null; Cookie::$jar = array(); Config::$items = array(); - Auth::driver()->$user = null; + Auth::driver()->user = null; Session::$instance = null; Config::set('database.default', 'mysql'); } @@ -42,7 +42,7 @@ public function tearDown() */ public function testUserMethodReturnsCurrentUser() { - Auth::$user = 'Taylor'; + Auth::driver()->user = 'Taylor'; $this->assertEquals('Taylor', Auth::user()); } From eb76c34cd3974426b8bd33e5fe702a878a8a475c Mon Sep 17 00:00:00 2001 From: Loic Sharma Date: Thu, 12 Jul 2012 17:46:17 -0500 Subject: [PATCH 116/260] Added a missing parenthesis and semicolon. --- laravel/documentation/validation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/validation.md b/laravel/documentation/validation.md index 6490d418..367569a5 100644 --- a/laravel/documentation/validation.md +++ b/laravel/documentation/validation.md @@ -417,7 +417,7 @@ #### Registering a custom validation rule: Validator::register('awesome', function($attribute, $value, $parameters) { return $value == $parameters[0]; - } + }); In this case, the parameters argument of your validation rule would receive an array containing one element: "yes". From 41ff7af2135f819bdf4fbc339b009668a2b6ae32 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 13 Jul 2012 03:02:30 +0200 Subject: [PATCH 117/260] Change inner workings of test runner to use different bootstrap file when testing the core. --- laravel/cli/tasks/test/phpunit.php | 24 ---------------------- laravel/cli/tasks/test/runner.php | 28 +++++++++++++++++--------- laravel/tests/phpunit.php | 32 ++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 33 deletions(-) create mode 100644 laravel/tests/phpunit.php diff --git a/laravel/cli/tasks/test/phpunit.php b/laravel/cli/tasks/test/phpunit.php index 67644838..32eadd58 100644 --- a/laravel/cli/tasks/test/phpunit.php +++ b/laravel/cli/tasks/test/phpunit.php @@ -1,12 +1,4 @@ - * @link http://laravel.com - */ // -------------------------------------------------------------- // Define the directory separator for the environment. @@ -18,22 +10,6 @@ // -------------------------------------------------------------- require 'paths.php'; -// -------------------------------------------------------------- -// Override the application paths when testing the core. -// -------------------------------------------------------------- -$config = file_get_contents('phpunit.xml'); - -if (strpos($config, 'laravel-tests') !== false) -{ - $path = path('bundle').'laravel-tests'.DS; - - set_path('app', $path.'application'.DS); - - set_path('bundle', $path.'bundles'.DS); - - set_path('storage', $path.'storage'.DS); -} - // -------------------------------------------------------------- // Bootstrap the Laravel core. // -------------------------------------------------------------- diff --git a/laravel/cli/tasks/test/runner.php b/laravel/cli/tasks/test/runner.php index 853f76b0..32c8774f 100644 --- a/laravel/cli/tasks/test/runner.php +++ b/laravel/cli/tasks/test/runner.php @@ -7,6 +7,15 @@ class Runner extends Task { + /** + * The base directory where the tests will be executed. + * + * A phpunit.xml should also be stored in that directory. + * + * @var string + */ + protected $base_path; + /** * Run all of the unit tests for the application. * @@ -26,7 +35,8 @@ public function run($bundles = array()) */ public function core() { - $this->stub(path('sys').'tests/cases'); + $this->base_path = path('sys').'tests'.DS; + $this->stub(path('sys').'tests'.DS.'cases'); $this->test(); } @@ -44,6 +54,8 @@ public function bundle($bundles = array()) $bundles = Bundle::names(); } + $this->base_path = path('sys').'cli'.DS.'tasks'.DS.'test'.DS; + foreach ($bundles as $bundle) { // To run PHPUnit for the application, bundles, and the framework @@ -67,9 +79,9 @@ public function bundle($bundles = array()) protected function test() { // We'll simply fire off PHPUnit with the configuration switch - // pointing to our temporary configuration file. This allows + // pointing to our requested configuration file. This allows // us to flexibly run tests for any setup. - $path = path('base').'phpunit.xml'; + $path = 'phpunit.xml'; // fix the spaced directories problem when using the command line // strings with spaces inside should be wrapped in quotes. @@ -97,7 +109,7 @@ protected function stub($directory) // locations depending on what the developer wants to test. foreach (array('bootstrap', 'directory') as $item) { - $stub = $this->{"swap_{$item}"}($stub, $path, $directory); + $stub = $this->{"swap_{$item}"}($stub, $directory); } File::put(path('base').'phpunit.xml', $stub); @@ -107,24 +119,22 @@ protected function stub($directory) * Swap the bootstrap file in the stub. * * @param string $stub - * @param string $path * @param string $directory * @return string */ - protected function swap_bootstrap($stub, $path, $directory) + protected function swap_bootstrap($stub, $directory) { - return str_replace('{{bootstrap}}', $path.'phpunit.php', $stub); + return str_replace('{{bootstrap}}', $this->base_path.'phpunit.php', $stub); } /** * Swap the directory in the stub. * * @param string $stub - * @param string $path * @param string $directory * @return string */ - protected function swap_directory($stub, $path, $directory) + protected function swap_directory($stub, $directory) { return str_replace('{{directory}}', $directory, $stub); } diff --git a/laravel/tests/phpunit.php b/laravel/tests/phpunit.php new file mode 100644 index 00000000..8e5ba204 --- /dev/null +++ b/laravel/tests/phpunit.php @@ -0,0 +1,32 @@ + Date: Fri, 13 Jul 2012 03:04:13 +0200 Subject: [PATCH 118/260] Update authentication config file in testing application. --- laravel/tests/application/config/auth.php | 80 ++++++++++------------- 1 file changed, 36 insertions(+), 44 deletions(-) diff --git a/laravel/tests/application/config/auth.php b/laravel/tests/application/config/auth.php index d0137583..d715f063 100644 --- a/laravel/tests/application/config/auth.php +++ b/laravel/tests/application/config/auth.php @@ -4,78 +4,70 @@ /* |-------------------------------------------------------------------------- - | Retrieve The Current User + | Default Authentication Driver |-------------------------------------------------------------------------- | - | This closure is called by the Auth class' "user" method when trying to - | retrieve a user by the ID that is stored in their session. If you find - | the user, just return the user object, but make sure it has an "id" - | property. If you can't find the user, just return null. + | Laravel uses a flexible driver-based system to handle authentication. + | You are free to register your own drivers using the Auth::extend + | method. Of course, a few great drivers are provided out of + | box to handle basic authentication simply and easily. | - | Of course, a simple and elegant authentication solution has already - | been provided for you using the query builder and hashing engine. - | We love making your life as easy as possible. + | Drivers: 'fluent', 'eloquent'. | */ - 'user' => function($id) - { - if (filter_var($id, FILTER_VALIDATE_INT) !== false) - { - return DB::table('users')->find($id); - } - }, + 'driver' => 'fluent', /* |-------------------------------------------------------------------------- - | Authenticate User Credentials + | Authentication Username |-------------------------------------------------------------------------- | - | This closure is called by the Auth::attempt() method when attempting to - | authenticate a user that is logging into your application. It's like a - | super buff bouncer to your application. - | - | If the provided credentials are correct, simply return an object that - | represents the user being authenticated. As long as it has a property - | for the "id", any object will work. If the credentials are not valid, - | you don't meed to return anything. + | Here you may specify the database column that should be considered the + | "username" for your users. Typically, this will either be "username" + | or "email". Of course, you're free to change the value to anything. | */ - 'attempt' => function($username, $password) - { - $user = DB::table('users')->where_username($username)->first(); - - if ( ! is_null($user) and Hash::check($password, $user->password)) - { - return $user; - } - }, + 'username' => 'username', /* |-------------------------------------------------------------------------- - | Logout The Current User + | Authentication Password |-------------------------------------------------------------------------- | - | Here you may do anything that needs to be done when a user logs out of - | your application, such as call the logout method on a third-party API - | you are using for authentication or anything else you desire. + | Here you may specify the database column that should be considered the + | "password" for your users. Typically, this will be "password" but, + | again, you're free to change the value to anything you see fit. | */ - 'logout' => function($user) {}, + 'password' => 'password', /* |-------------------------------------------------------------------------- - | "Remember Me" Cookie Name + | Authentication Model |-------------------------------------------------------------------------- | - | Here you may specify the cookie name that will be used for the cookie - | that serves as the "remember me" token. Of course, a sensible default - | has been set for you, so you probably don't need to change it. + | When using the "eloquent" authentication driver, you may specify the + | model that should be considered the "User" model. This model will + | be used to authenticate and load the users of your application. | */ - 'cookie' => 'laravel_remember', + 'model' => 'User', -); \ No newline at end of file + /* + |-------------------------------------------------------------------------- + | Authentication Table + |-------------------------------------------------------------------------- + | + | When using the "fluent" authentication driver, the database table used + | to load users may be specified here. This table will be used in by + | the fluent query builder to authenticate and load your users. + | + */ + + 'table' => 'users', + +); From 86013f1b849045f845a2e9115553401b99f67879 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 13 Jul 2012 03:04:36 +0200 Subject: [PATCH 119/260] Fix old code in Auth test cases. --- laravel/tests/cases/auth.test.php | 32 +++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/laravel/tests/cases/auth.test.php b/laravel/tests/cases/auth.test.php index 682b2cd9..9f6b3928 100644 --- a/laravel/tests/cases/auth.test.php +++ b/laravel/tests/cases/auth.test.php @@ -107,7 +107,8 @@ public function testUserMethodReturnsNullWhenNoUserExistsAndNoRecallerExists() public function testUserReturnsUserByID() { Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - Session::$instance->session['data'][Auth::user_key] = 1; + // FIXME: Not sure whether hard-coding the key is a good idea. + Session::$instance->session['data']['laravel_auth_drivers_fluent_login'] = 1; $this->assertEquals('Taylor Otwell', Auth::user()->name); } @@ -120,7 +121,8 @@ public function testUserReturnsUserByID() public function testNullReturnedWhenUserIDNotValidInteger() { Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - Session::$instance->session['data'][Auth::user_key] = 'asdlkasd'; + // FIXME: Not sure whether hard-coding the key is a good idea. + Session::$instance->session['data']['laravel_auth_drivers_fluent_login'] = 'asdlkasd'; $this->assertNull(Auth::user()); } @@ -183,10 +185,13 @@ public function testLoginMethodStoresUserKeyInSession() $user = new StdClass; $user->id = 10; Auth::login($user); - $this->assertEquals(10, Session::$instance->session['data'][Auth::user_key]); + // FIXME: Not sure whether hard-coding the key is a good idea. + $user = Session::$instance->session['data']['laravel_auth_drivers_fluent_login']; + $this->assertEquals(10, $user->id); Auth::login(5); - $this->assertEquals(5, Session::$instance->session['data'][Auth::user_key]); + $user = Session::$instance->session['data']['laravel_auth_drivers_fluent_login']; + $this->assertEquals(5, $user); } /** @@ -203,7 +208,7 @@ public function testLoginStoresRememberCookieWhenNeeded() Config::set('session.domain', 'bar'); Config::set('session.secure', true); - Auth::login(10, true); + Auth::login(10); $this->assertTrue(isset(Cookie::$jar[Config::get('auth.cookie')])); $cookie = Cookie::$jar[Config::get('auth.cookie')]['value']; @@ -222,17 +227,20 @@ public function testLoginStoresRememberCookieWhenNeeded() public function testLogoutMethodLogsOutUser() { Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - Session::$instance->session['data'][Auth::user_key] = 10; + + //$data = Session::$instance->session['data']['laravel_auth_drivers_fluent_login'] = 10; - Config::set('auth.logout', function($user) { $_SERVER['auth.logout.stub'] = $user; }); + // FIXME: Restore some of these! + //Config::set('auth.logout', function($user) { $_SERVER['auth.logout.stub'] = $user; }); - Auth::$user = 'Taylor'; + //Auth::$user = 'Taylor'; Auth::logout(); - $this->assertEquals('Taylor', $_SERVER['auth.logout.stub']); - $this->assertNull(Auth::$user); - $this->assertFalse(isset(Session::$instance->session['data'][Auth::user_key])); - $this->assertTrue(Cookie::$jar[Config::get('auth.cookie')]['minutes'] < 0); + //$this->assertEquals('Taylor', $_SERVER['auth.logout.stub']); + $this->assertNull(Auth::user()); + // FIXME: Not sure whether hard-coding the key is a good idea. + $this->assertFalse(isset(Session::$instance->session['data']['laravel_auth_drivers_fluent_login'])); + $this->assertTrue(Cookie::$jar['laravel_auth_drivers_fluent_remember']['expiration'] < time()); } } From feefa8d9c441086a42306179855cbc060bda46bc Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 13 Jul 2012 03:05:55 +0200 Subject: [PATCH 120/260] Fix PHP errors in test cases related to now using Symfony's HttpFoundation component. --- laravel/tests/cases/controller.test.php | 2 +- laravel/tests/cases/redirect.test.php | 20 +++---- laravel/tests/cases/request.test.php | 78 +++++++++++++++++-------- laravel/tests/cases/response.test.php | 11 ++-- laravel/tests/cases/uri.test.php | 22 ++++++- 5 files changed, 91 insertions(+), 42 deletions(-) diff --git a/laravel/tests/cases/controller.test.php b/laravel/tests/cases/controller.test.php index 9147bad9..1577ece3 100644 --- a/laravel/tests/cases/controller.test.php +++ b/laravel/tests/cases/controller.test.php @@ -189,7 +189,7 @@ public function testRestfulControllersRespondWithRestfulMethods() $_SERVER['REQUEST_METHOD'] = 'PUT'; - $this->assertEquals(404, Controller::call('restful@index')->status); + $this->assertEquals(404, Controller::call('restful@index')->status()); $_SERVER['REQUEST_METHOD'] = 'POST'; diff --git a/laravel/tests/cases/redirect.test.php b/laravel/tests/cases/redirect.test.php index 2e6fb193..4f0897d7 100644 --- a/laravel/tests/cases/redirect.test.php +++ b/laravel/tests/cases/redirect.test.php @@ -39,18 +39,18 @@ public function testSimpleRedirectSetsCorrectHeaders() { $redirect = Redirect::to('user/profile'); - $this->assertEquals(302, $redirect->status); - $this->assertEquals('http://localhost/user/profile', $redirect->headers['location']); + $this->assertEquals(302, $redirect->status()); + $this->assertEquals('http://localhost/user/profile', $redirect->headers()->get('location')); $redirect = Redirect::to('user/profile', 301, true); - $this->assertEquals(301, $redirect->status); - $this->assertEquals('https://localhost/user/profile', $redirect->headers['location']); + $this->assertEquals(301, $redirect->status()); + $this->assertEquals('https://localhost/user/profile', $redirect->headers()->get('location')); $redirect = Redirect::to_secure('user/profile', 301); - $this->assertEquals(301, $redirect->status); - $this->assertEquals('https://localhost/user/profile', $redirect->headers['location']); + $this->assertEquals(301, $redirect->status()); + $this->assertEquals('https://localhost/user/profile', $redirect->headers()->get('location')); } /** @@ -64,10 +64,10 @@ public function testRedirectsCanBeGeneratedForNamedRoutes() Route::get('redirect/(:any)/(:any)', array('as' => 'redirect-2')); Route::get('secure/redirect', array('https' => true, 'as' => 'redirect-3')); - $this->assertEquals(301, Redirect::to_route('redirect', array(), 301, true)->status); - $this->assertEquals('http://localhost/redirect', Redirect::to_route('redirect')->headers['location']); - $this->assertEquals('https://localhost/secure/redirect', Redirect::to_route('redirect-3', array(), 302)->headers['location']); - $this->assertEquals('http://localhost/redirect/1/2', Redirect::to_route('redirect-2', array('1', '2'))->headers['location']); + $this->assertEquals(301, Redirect::to_route('redirect', array(), 301, true)->status()); + $this->assertEquals('http://localhost/redirect', Redirect::to_route('redirect')->headers()->get('location')); + $this->assertEquals('https://localhost/secure/redirect', Redirect::to_route('redirect-3', array(), 302)->headers()->get('location')); + $this->assertEquals('http://localhost/redirect/1/2', Redirect::to_route('redirect-2', array('1', '2'))->headers()->get('location')); } /** diff --git a/laravel/tests/cases/request.test.php b/laravel/tests/cases/request.test.php index d3e6b479..4641a532 100644 --- a/laravel/tests/cases/request.test.php +++ b/laravel/tests/cases/request.test.php @@ -1,5 +1,7 @@ restartRequest(); + } + + /** + * Set one of the $_POST variables. + * + * @param string $key + * @param string $value + */ + protected function setPostVar($key, $value) + { + $_POST[$key] = $value; + + $this->restartRequest(); + } + + /** + * Reinitialize the global request. + * + * @return void + */ + protected function restartRequest() + { + // FIXME: Ugly hack, but old contents from previous requests seem to + // trip up the Foundation class. + $_FILES = array(); + + Request::$foundation = RequestFoundation::createFromGlobals(); + } + /** * Test the Request::method method. * @@ -26,11 +68,11 @@ public function tearDown() */ public function testMethodReturnsTheHTTPRequestMethod() { - $_SERVER['REQUEST_METHOD'] = 'POST'; + $this->setServerVar('REQUEST_METHOD', 'POST'); $this->assertEquals('POST', Request::method()); - $_POST[Request::spoofer] = 'PUT'; + $this->setPostVar(Request::spoofer, 'PUT'); $this->assertEquals('PUT', Request::method()); } @@ -42,7 +84,8 @@ public function testMethodReturnsTheHTTPRequestMethod() */ public function testServerMethodReturnsFromServerArray() { - $_SERVER = array('TEST' => 'something', 'USER' => array('NAME' => 'taylor')); + $this->setServerVar('TEST', 'something'); + $this->setServerVar('USER', array('NAME' => 'taylor')); $this->assertEquals('something', Request::server('test')); $this->assertEquals('taylor', Request::server('user.name')); @@ -55,33 +98,20 @@ public function testServerMethodReturnsFromServerArray() */ public function testIPMethodReturnsClientIPAddress() { - $_SERVER['REMOTE_ADDR'] = 'something'; + $this->setServerVar('REMOTE_ADDR', 'something'); $this->assertEquals('something', Request::ip()); - $_SERVER['HTTP_CLIENT_IP'] = 'something'; + $this->setServerVar('HTTP_CLIENT_IP', 'something'); $this->assertEquals('something', Request::ip()); - $_SERVER['HTTP_X_FORWARDED_FOR'] = 'something'; + $this->setServerVar('HTTP_CLIENT_IP', 'something'); $this->assertEquals('something', Request::ip()); $_SERVER = array(); + $this->restartRequest(); $this->assertEquals('0.0.0.0', Request::ip()); } - /** - * Test the Request::protocol method. - * - * @group laravel - */ - public function testProtocolMethodReturnsProtocol() - { - $_SERVER['SERVER_PROTOCOL'] = 'taylor'; - $this->assertEquals('taylor', Request::protocol()); - - unset($_SERVER['SERVER_PROTOCOL']); - $this->assertEquals('HTTP/1.1', Request::protocol()); - } - /** * Test the Request::secure method. * @@ -89,11 +119,11 @@ public function testProtocolMethodReturnsProtocol() */ public function testSecureMethodsIndicatesIfHTTPS() { - $_SERVER['HTTPS'] = 'on'; - + $this->setServerVar('HTTPS', 'on'); + $this->assertTrue(Request::secure()); - $_SERVER['HTTPS'] = 'off'; + $this->setServerVar('HTTPS', 'off'); $this->assertFalse(Request::secure()); } @@ -107,7 +137,7 @@ public function testAjaxMethodIndicatesWhenAjax() { $this->assertFalse(Request::ajax()); - $_SERVER['HTTP_X_REQUESTED_WITH'] = 'xmlhttprequest'; + $this->setServerVar('HTTP_X_REQUESTED_WITH', 'XMLHttpRequest'); $this->assertTrue(Request::ajax()); } diff --git a/laravel/tests/cases/response.test.php b/laravel/tests/cases/response.test.php index 5907eebd..11e48e74 100644 --- a/laravel/tests/cases/response.test.php +++ b/laravel/tests/cases/response.test.php @@ -12,8 +12,9 @@ public function testMakeMethodProperlySetsContent() $response = Response::make('foo', 201, array('bar' => 'baz')); $this->assertEquals('foo', $response->content); - $this->assertEquals(201, $response->status); - $this->assertEquals(array('bar' => 'baz'), $response->headers); + $this->assertEquals(201, $response->status()); + $this->assertArrayHasKey('bar', $response->headers()->all()); + $this->assertEquals('baz', $response->headers()->get('bar')); } /** @@ -38,7 +39,7 @@ public function testErrorMethodSetsContentToErrorView() { $response = Response::error('404', array('name' => 'Taylor')); - $this->assertEquals(404, $response->status); + $this->assertEquals(404, $response->status()); $this->assertEquals('error.404', $response->content->view); $this->assertEquals('Taylor', $response->content->data['name']); } @@ -70,7 +71,7 @@ public function testHeaderMethodSetsValueInHeaderArray() { $response = Response::make('')->header('foo', 'bar'); - $this->assertEquals('bar', $response->headers['foo']); + $this->assertEquals('bar', $response->headers()->get('foo')); } /** @@ -82,7 +83,7 @@ public function testStatusMethodSetsStatusCode() { $response = Response::make('')->status(404); - $this->assertEquals(404, $response->status); + $this->assertEquals(404, $response->status()); } } \ No newline at end of file diff --git a/laravel/tests/cases/uri.test.php b/laravel/tests/cases/uri.test.php index be779ecf..fc64b3fb 100644 --- a/laravel/tests/cases/uri.test.php +++ b/laravel/tests/cases/uri.test.php @@ -1,5 +1,7 @@ setRequestUri($uri); + $this->assertEquals($expectation, URI::current()); } @@ -31,7 +49,7 @@ public function testCorrectURIIsReturnedByCurrentMethod($uri, $expectation) */ public function testSegmentMethodReturnsAURISegment() { - $_SERVER['REQUEST_URI'] = 'http://localhost/index.php/user/profile'; + $this->setRequestUri('http://localhost/index.php/user/profile'); $this->assertEquals('user', URI::segment(1)); $this->assertEquals('profile', URI::segment(2)); From 7351845ec3a7de818391d218b4a2f9faa26985ad Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 13 Jul 2012 03:06:31 +0200 Subject: [PATCH 121/260] Fix PHP errors in test cases related to changed cookie data storage. --- laravel/tests/cases/cookie.test.php | 8 ++++---- laravel/tests/cases/session.test.php | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/laravel/tests/cases/cookie.test.php b/laravel/tests/cases/cookie.test.php index fb8faf65..dcfaf5d8 100644 --- a/laravel/tests/cases/cookie.test.php +++ b/laravel/tests/cases/cookie.test.php @@ -69,7 +69,7 @@ public function testForeverShouldUseATonOfMinutes() { Cookie::forever('foo', 'bar'); $this->assertEquals('bar', Cookie::$jar['foo']['value']); - $this->assertEquals(525600, Cookie::$jar['foo']['minutes']); + $this->assertEquals(525600, Cookie::$jar['foo']['expiration']); Cookie::forever('bar', 'baz', 'path', 'domain', true); $this->assertEquals('path', Cookie::$jar['bar']['path']); @@ -84,11 +84,11 @@ public function testForeverShouldUseATonOfMinutes() */ public function testForgetSetsCookieWithExpiration() { - Cookie::forget('bar', 'path', 'domain', true); - $this->assertEquals(-2000, Cookie::$jar['bar']['minutes']); + Cookie::forget('bar', 'path', 'domain'); + $this->assertEquals(-2000, Cookie::$jar['bar']['expiration']); $this->assertEquals('path', Cookie::$jar['bar']['path']); $this->assertEquals('domain', Cookie::$jar['bar']['domain']); - $this->assertTrue(Cookie::$jar['bar']['secure']); + $this->assertFalse(Cookie::$jar['bar']['secure']); } } \ No newline at end of file diff --git a/laravel/tests/cases/session.test.php b/laravel/tests/cases/session.test.php index 2c7ccdc9..05b0299d 100644 --- a/laravel/tests/cases/session.test.php +++ b/laravel/tests/cases/session.test.php @@ -373,7 +373,7 @@ public function testSaveMethodSetsCookieWithCorrectValues() $cookie = Cookie::$jar[Config::get('session.cookie')]; $this->assertEquals('foo', $cookie['value']); - $this->assertEquals(Config::get('session.lifetime'), $cookie['minutes']); + $this->assertEquals(Config::get('session.lifetime'), $cookie['expiration']); $this->assertEquals(Config::get('session.domain'), $cookie['domain']); $this->assertEquals(Config::get('session.path'), $cookie['path']); $this->assertEquals(Config::get('session.secure'), $cookie['secure']); From 37241db646bf57a120b655d818964cbc3f3fb9a0 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 13 Jul 2012 03:07:14 +0200 Subject: [PATCH 122/260] Fix View test case still referring to the old bundle setup for tests. --- laravel/tests/cases/view.test.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/laravel/tests/cases/view.test.php b/laravel/tests/cases/view.test.php index d10cf31c..9716724a 100644 --- a/laravel/tests/cases/view.test.php +++ b/laravel/tests/cases/view.test.php @@ -55,10 +55,10 @@ public function testViewIsCreatedWithCorrectPath() */ public function testBundleViewIsCreatedWithCorrectPath() { - $view = new View('laravel-tests::home.index'); + $view = new View('home.index'); $this->assertEquals( - str_replace(DS, '/', Bundle::path('laravel-tests')).'views/home/index.php', + str_replace(DS, '/', Bundle::path(DEFAULT_BUNDLE)).'views/home/index.php', str_replace(DS, '/', $view->path) ); } From 4fd1a4fe394021b8f1d5d94aa66d238382658f63 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 13 Jul 2012 23:33:12 +0200 Subject: [PATCH 123/260] Add .travis.yml file for continuous integration with Travis CI. --- .travis.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..c7e2b983 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,14 @@ +branches: + only: + - core-tests + +language: php + +php: + - 5.3 + +script: php artisan test:core + +notifications: + irc: + - "irc.freenode.org#laravel" \ No newline at end of file From 9460e691d4fac5c14f40bc1b96665313eba01830 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sat, 14 Jul 2012 00:55:47 +0300 Subject: [PATCH 124/260] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c7e2b983..917e9b25 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ language: php php: - 5.3 -script: php artisan test:core +script: "php artisan test:core" notifications: irc: From e7f665b55d1c83f23e0ff3691f0ad76f0e0059ea Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sat, 14 Jul 2012 01:01:23 +0300 Subject: [PATCH 125/260] Don't restrict Travis CI testing to one branch. --- .travis.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 917e9b25..a1bcd71c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,3 @@ -branches: - only: - - core-tests - language: php php: From 08fce4fbf812b6d065cbcc21d6a9f7f03cafe2ff Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sat, 14 Jul 2012 11:46:58 +0200 Subject: [PATCH 126/260] After running tests, exit with PHPUnit's exit status. --- laravel/cli/tasks/test/runner.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/laravel/cli/tasks/test/runner.php b/laravel/cli/tasks/test/runner.php index 32c8774f..151815bf 100644 --- a/laravel/cli/tasks/test/runner.php +++ b/laravel/cli/tasks/test/runner.php @@ -87,9 +87,12 @@ protected function test() // strings with spaces inside should be wrapped in quotes. $path = escapeshellarg($path); - passthru('phpunit --configuration '.$path); + passthru('phpunit --configuration '.$path, $status); @unlink($path); + + // Pass through the exit status + exit($status); } /** From dc6bcf079380359227f569825e55ad8c143a350a Mon Sep 17 00:00:00 2001 From: Shawn McCool Date: Mon, 16 Jul 2012 10:05:07 +0200 Subject: [PATCH 127/260] use global paginator alias in the query class --- laravel/database/query.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/database/query.php b/laravel/database/query.php index 55e9606a..c2516188 100644 --- a/laravel/database/query.php +++ b/laravel/database/query.php @@ -2,7 +2,7 @@ use Closure; use Laravel\Database; -use Laravel\Paginator; +use Paginator; use Laravel\Database\Query\Grammars\Postgres; use Laravel\Database\Query\Grammars\SQLServer; From 7dcbf33a80017276b034ce93b9f002a2f7ce18a2 Mon Sep 17 00:00:00 2001 From: Shawn McCool Date: Mon, 16 Jul 2012 10:28:40 +0200 Subject: [PATCH 128/260] cleaned up help task --- laravel/cli/tasks/help.json | 2 +- laravel/cli/tasks/help.php | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/laravel/cli/tasks/help.json b/laravel/cli/tasks/help.json index 69e16fe6..3f614ad1 100644 --- a/laravel/cli/tasks/help.json +++ b/laravel/cli/tasks/help.json @@ -47,7 +47,7 @@ "command": "php artisan bundle:publish" } }, - "Unit Tests": { + "Unit Testing": { "test": { "description": "Run the application's tests.", "command": "php artisan test" diff --git a/laravel/cli/tasks/help.php b/laravel/cli/tasks/help.php index e81bc945..8cfcd768 100644 --- a/laravel/cli/tasks/help.php +++ b/laravel/cli/tasks/help.php @@ -6,21 +6,22 @@ class Help extends Task { /** - * List + * List available artisan commands. * * @param array $arguments * @return void */ public function commands() { + // read help contents - $command_data = json_decode(file_get_contents(__DIR__.'/help.json')); + $command_data = json_decode(File::get(__DIR__.'/help.json')); + + // format and display help contents $i=0; - foreach($command_data as $category => $commands) { - if($i++ != 0) echo PHP_EOL; echo PHP_EOL . "# $category" . PHP_EOL; From 25b8bd889b9f38c665b227672257063fd0feb590 Mon Sep 17 00:00:00 2001 From: Shawn McCool Date: Mon, 16 Jul 2012 11:37:05 +0300 Subject: [PATCH 129/260] add help:commands artisan task to documentation --- laravel/documentation/artisan/commands.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/laravel/documentation/artisan/commands.md b/laravel/documentation/artisan/commands.md index 997e86ce..0a2dd5ff 100644 --- a/laravel/documentation/artisan/commands.md +++ b/laravel/documentation/artisan/commands.md @@ -2,6 +2,7 @@ # Artisan Commands ## Contents +- [Help](#help) - [Application Configuration](#application-configuration) - [Sessions](#sessions) - [Migrations](#migrations) @@ -12,6 +13,13 @@ ## Contents - [Application Keys](#keys) - [CLI Options](#cli-options) + +## Help + +Description | Command +------------- | ------------- +View a list of available artisan commands. | `php artisan help:commands` + ## Application Configuration [(More Information)](/docs/install#basic-configuration) From b973c259059b92b633388c5c067cd4de37712e53 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 16 Jul 2012 14:57:35 +0300 Subject: [PATCH 130/260] Add documentation about deleting files. --- laravel/documentation/files.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/laravel/documentation/files.md b/laravel/documentation/files.md index d0ed3f85..711dd963 100644 --- a/laravel/documentation/files.md +++ b/laravel/documentation/files.md @@ -4,6 +4,7 @@ ## Contents - [Reading Files](#get) - [Writing Files](#put) +- [Removing files](#delete) - [File Uploads](#upload) - [File Extensions](#ext) - [Checking File Types](#is) @@ -29,6 +30,13 @@ #### Appending to a file: File::append('path/to/file', 'appended file content'); + +## Removing Files + +#### Deleting a single file: + + File::delete('path/to/file'); + ## File Uploads From 096f9c2b7871af431638329d9c4e4170b9a23bf5 Mon Sep 17 00:00:00 2001 From: Rack Lin Date: Tue, 17 Jul 2012 17:42:01 +0800 Subject: [PATCH 131/260] Fixed IoC::resolve forces singleton issue. Signed-off-by: Rack Lin --- laravel/ioc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/ioc.php b/laravel/ioc.php index 11292925..60313de9 100644 --- a/laravel/ioc.php +++ b/laravel/ioc.php @@ -124,7 +124,7 @@ public static function resolve($type, $parameters = array()) // If the requested type is registered as a singleton, we want to cache off // the instance in memory so we can return it later without creating an // entirely new instances of the object on each subsequent request. - if (isset(static::$registry[$type]['singleton'])) + if (isset(static::$registry[$type]['singleton']) && static::$registry[$type]['singleton'] === true) { static::$singletons[$type] = $object; } From a03bcb521ba8099f9f935d4a8fac13058460e926 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Tue, 17 Jul 2012 23:51:00 +0300 Subject: [PATCH 132/260] Mention default value helper function in database schema documentation. --- laravel/documentation/database/schema.md | 1 + 1 file changed, 1 insertion(+) diff --git a/laravel/documentation/database/schema.md b/laravel/documentation/database/schema.md index 16ed318c..65c4e6ca 100644 --- a/laravel/documentation/database/schema.md +++ b/laravel/documentation/database/schema.md @@ -69,6 +69,7 @@ ## Adding Columns `$table->text('description');` | TEXT equivalent to the table `$table->blob('data');` | BLOB equivalent to the table `->nullable()` | Designate that the column allows NULL values +`->default($value)` | Declare a default value for a column > **Note:** Laravel's "boolean" type maps to a small integer column on all database systems. From 02e84eb5eb69322e1cf941c6c65a426a915b61cc Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Tue, 17 Jul 2012 23:56:43 +0300 Subject: [PATCH 133/260] Documentation: fix menu link to "Bundle Routes" section. --- laravel/documentation/contents.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/contents.md b/laravel/documentation/contents.md index 63a2b86f..14b819a4 100644 --- a/laravel/documentation/contents.md +++ b/laravel/documentation/contents.md @@ -18,7 +18,7 @@ ### General - [Route Groups](/docs/routing#groups) - [Named Routes](/docs/routing#named-routes) - [HTTPS Routes](/docs/routing#https-routes) - - [Bundle Routing](/docs/routing#bundle-routing) + - [Bundle Routes](/docs/routing#bundle-routes) - [CLI Route Testing](/docs/routing#cli-route-testing) - [Controllers](/docs/controllers) - [The Basics](/docs/controllers#the-basics) From 61364c553ddbd1e809a39c20c14bca20e019d4ef Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Tue, 17 Jul 2012 23:47:05 +0200 Subject: [PATCH 134/260] Make sure default values in schema columns are always non-empty (especially booleans). --- laravel/database/schema/grammars/grammar.php | 15 +++++++++++++++ laravel/database/schema/grammars/mysql.php | 2 +- laravel/database/schema/grammars/postgres.php | 2 +- laravel/database/schema/grammars/sqlite.php | 2 +- laravel/database/schema/grammars/sqlserver.php | 2 +- 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/laravel/database/schema/grammars/grammar.php b/laravel/database/schema/grammars/grammar.php index da93aa64..62a55719 100644 --- a/laravel/database/schema/grammars/grammar.php +++ b/laravel/database/schema/grammars/grammar.php @@ -96,4 +96,19 @@ protected function type(Fluent $column) return $this->{'type_'.$column->type}($column); } + /** + * Format a value so that it can be used in SQL DEFAULT clauses. + * @param mixed $value + * @return string + */ + protected function default_value($value) + { + if (is_bool($value)) + { + return intval($value); + } + + return strval($value); + } + } \ No newline at end of file diff --git a/laravel/database/schema/grammars/mysql.php b/laravel/database/schema/grammars/mysql.php index fc9107d0..85fe4b31 100644 --- a/laravel/database/schema/grammars/mysql.php +++ b/laravel/database/schema/grammars/mysql.php @@ -128,7 +128,7 @@ protected function defaults(Table $table, Fluent $column) { if ( ! is_null($column->default)) { - return " DEFAULT '".$column->default."'"; + return " DEFAULT '".$this->default_value($column->default)."'"; } } diff --git a/laravel/database/schema/grammars/postgres.php b/laravel/database/schema/grammars/postgres.php index 930c5160..d694b2b3 100644 --- a/laravel/database/schema/grammars/postgres.php +++ b/laravel/database/schema/grammars/postgres.php @@ -101,7 +101,7 @@ protected function defaults(Table $table, Fluent $column) { if ( ! is_null($column->default)) { - return " DEFAULT '".$column->default."'"; + return " DEFAULT '".$this->default_value($column->default)."'"; } } diff --git a/laravel/database/schema/grammars/sqlite.php b/laravel/database/schema/grammars/sqlite.php index 09102f52..a1f2399a 100644 --- a/laravel/database/schema/grammars/sqlite.php +++ b/laravel/database/schema/grammars/sqlite.php @@ -127,7 +127,7 @@ protected function defaults(Table $table, Fluent $column) { if ( ! is_null($column->default)) { - return ' DEFAULT '.$this->wrap($column->default); + return ' DEFAULT '.$this->wrap($this->default_value($column->default)); } } diff --git a/laravel/database/schema/grammars/sqlserver.php b/laravel/database/schema/grammars/sqlserver.php index 5f756c2e..4c3fa99c 100644 --- a/laravel/database/schema/grammars/sqlserver.php +++ b/laravel/database/schema/grammars/sqlserver.php @@ -108,7 +108,7 @@ protected function defaults(Table $table, Fluent $column) { if ( ! is_null($column->default)) { - return " DEFAULT '".$column->default."'"; + return " DEFAULT '".$this->default_value($column->default)."'"; } } From d46b98199c7979b029ab8e53639990a0de0280fe Mon Sep 17 00:00:00 2001 From: Jakobud Date: Wed, 18 Jul 2012 15:59:19 -0600 Subject: [PATCH 135/260] Fixed some bugs with the docs bundle Signed-off-by: Jakobud --- bundles/docs/views/template.blade.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) mode change 100644 => 100755 bundles/docs/views/template.blade.php diff --git a/bundles/docs/views/template.blade.php b/bundles/docs/views/template.blade.php old mode 100644 new mode 100755 index 20bf601f..658895e4 --- a/bundles/docs/views/template.blade.php +++ b/bundles/docs/views/template.blade.php @@ -6,8 +6,8 @@ Laravel: A Framework For Web Artisans - {{ HTML::style('laravel/css/style.css') }} - {{ HTML::style('laravel/js/modernizr-2.5.3.min.js') }} + {{ HTML::style(URL::$base.'/laravel/css/style.css') }} + {{ HTML::script(URL::$base.'/laravel/js/modernizr-2.5.3.min.js') }}

    {{ HTML::script('http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js') }} - {{ HTML::script('laravel/js/prettify.js') }} - {{ HTML::script('laravel/js/scroll.js') }} + {{ HTML::script(URL::$base.'/laravel/js/prettify.js') }} + {{ HTML::script(URL::$base.'/laravel/js/scroll.js') }} - \ No newline at end of file + From 54f4cb2644e0ffe59d3fe936220282940dc31087 Mon Sep 17 00:00:00 2001 From: Rack Lin Date: Thu, 19 Jul 2012 12:55:23 +0800 Subject: [PATCH 136/260] Added support PostgreSQL schema setting, if schema has been specified. Signed-off-by: Rack Lin --- application/config/database.php | 1 + laravel/database/connectors/postgres.php | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/application/config/database.php b/application/config/database.php index d5e6ac1b..021bcce9 100644 --- a/application/config/database.php +++ b/application/config/database.php @@ -85,6 +85,7 @@ 'password' => '', 'charset' => 'utf8', 'prefix' => '', + 'schema' => 'public', ), 'sqlsrv' => array( diff --git a/laravel/database/connectors/postgres.php b/laravel/database/connectors/postgres.php index 3721f368..d4a54344 100644 --- a/laravel/database/connectors/postgres.php +++ b/laravel/database/connectors/postgres.php @@ -44,6 +44,13 @@ public function connect($config) $connection->prepare("SET NAMES '{$config['charset']}'")->execute(); } + // If a schema has been specified, we'll execute a query against + // the database to set the search path. + if (isset($config['schema'])) + { + $connection->prepare("SET search_path TO '{$config['schema']}'")->execute(); + } + return $connection; } From 19c64f1ea7d3eaab98f77dc9ea3be30236b5eddd Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Thu, 19 Jul 2012 15:39:18 -0500 Subject: [PATCH 137/260] return false on empty string for active url. --- laravel/validator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/validator.php b/laravel/validator.php index 968e94b7..3bc4d703 100644 --- a/laravel/validator.php +++ b/laravel/validator.php @@ -581,7 +581,7 @@ protected function validate_active_url($attribute, $value) { $url = str_replace(array('http://', 'https://', 'ftp://'), '', Str::lower($value)); - return checkdnsrr($url); + return (trim($url) !== '') ? checkdnsrr($url) : false; } /** From 9944192af9ef971332d7cf08af2aca1a67ad1edd Mon Sep 17 00:00:00 2001 From: Rack Lin Date: Fri, 20 Jul 2012 22:20:37 +0800 Subject: [PATCH 138/260] Fixed Memcached get connection instance typo in __callStatic method. Signed-off-by: Rack Lin --- laravel/memcached.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/memcached.php b/laravel/memcached.php index 91e7270e..d66710bb 100644 --- a/laravel/memcached.php +++ b/laravel/memcached.php @@ -68,7 +68,7 @@ protected static function connect($servers) */ public static function __callStatic($method, $parameters) { - return call_user_func_array(array(static::instance(), $method), $parameters); + return call_user_func_array(array(static::connection(), $method), $parameters); } } \ No newline at end of file From 84fcb60f8b98293c8d5bf89e4cbc26913318cae1 Mon Sep 17 00:00:00 2001 From: Rob Meijer Date: Sat, 21 Jul 2012 20:16:57 +0100 Subject: [PATCH 139/260] Fix pivot table name in Many-to-Many section in Eloquent documentation. --- laravel/documentation/database/eloquent.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/database/eloquent.md b/laravel/documentation/database/eloquent.md index 71e3a402..b2caf7e8 100644 --- a/laravel/documentation/database/eloquent.md +++ b/laravel/documentation/database/eloquent.md @@ -242,7 +242,7 @@ ### Many-To-Many id - INTEGER name - VARCHAR -**Roles_Users:** +**Role_User:** id - INTEGER user_id - INTEGER From 0ea30993d4c11ee80d48a5bfc48685bc7ed82ea3 Mon Sep 17 00:00:00 2001 From: Josh Miller Date: Sat, 21 Jul 2012 20:18:55 -0400 Subject: [PATCH 140/260] Fixed various typos throughout laravel folder. Signed-off-by: Josh Miller --- application/language/bg/validation.php | 196 +++++++++--------- laravel/autoloader.php | 6 +- laravel/bundle.php | 4 +- laravel/cli/tasks/bundle/bundler.php | 4 +- .../cli/tasks/bundle/providers/provider.php | 4 +- laravel/cli/tasks/migrate/database.php | 2 +- laravel/cli/tasks/migrate/migrator.php | 4 +- laravel/cookie.php | 2 +- laravel/database/connection.php | 2 +- laravel/database/eloquent/model.php | 2 +- laravel/database/eloquent/query.php | 4 +- laravel/database/query.php | 6 +- laravel/database/query/grammars/grammar.php | 16 +- laravel/database/query/grammars/postgres.php | 2 +- laravel/database/schema.php | 2 +- laravel/database/schema/grammars/mysql.php | 6 +- laravel/database/schema/grammars/postgres.php | 6 +- laravel/database/schema/grammars/sqlite.php | 8 +- .../database/schema/grammars/sqlserver.php | 4 +- laravel/error.php | 2 +- laravel/file.php | 2 +- laravel/html.php | 2 +- laravel/ioc.php | 2 +- laravel/lang.php | 2 +- laravel/laravel.php | 4 +- laravel/log.php | 2 +- laravel/pluralizer.php | 4 +- laravel/redis.php | 2 +- laravel/routing/router.php | 2 +- laravel/session/drivers/database.php | 2 +- laravel/session/drivers/driver.php | 2 +- laravel/session/drivers/file.php | 2 +- laravel/session/drivers/sweeper.php | 2 +- laravel/session/payload.php | 2 +- laravel/url.php | 2 +- laravel/validator.php | 2 +- 36 files changed, 159 insertions(+), 159 deletions(-) diff --git a/application/language/bg/validation.php b/application/language/bg/validation.php index c76a6e92..4e46f6ff 100644 --- a/application/language/bg/validation.php +++ b/application/language/bg/validation.php @@ -1,99 +1,99 @@ - "Трябва да приемете :attribute.", - "active_url" => "Полето :attribute не е валиден URL адрес.", - "after" => "Полето :attribute трябва да бъде дата след :date.", - "alpha" => "Полето :attribute трябва да съдържа само букви.", - "alpha_dash" => "Полето :attribute трябва да съдържа само букви, цифри, долна черта и тире.", - "alpha_num" => "Полето :attribute трябва да съдържа само букви и цифри.", - "before" => "Полето :attribute трябва да бъде дата преди :date.", - "between" => array( - "numeric" => "Полето :attribute трябва да бъде между :min и :max.", - "file" => "Полето :attribute трябва да бъде между :min и :max килобайта.", - "string" => "Полето :attribute трябва да бъде между :min и :max знака.", - ), - "confirmed" => "Полето :attribute не е потвърдено.", - "different" => "Полетата :attribute и :other трябва да са различни.", - "email" => "Полето :attribute е с невалиден формат.", - "exists" => "Избраната стойност на :attribute вече съществува.", - "image" => "Полето :attribute трябва да бъде изображение.", - "in" => "Стойността на :attribute е невалидна.", - "integer" => "Полето :attribute трябва да бъде цяло число.", - "ip" => "Полето :attribute трябва да бъде IP адрес.", - "match" => "Полето :attribute е с невалиден формат.", - "max" => array( - "numeric" => "Полето :attribute трябва да бъде по-малко от :max.", - "file" => "Полето :attribute трябва да бъде по-малко от :max килобайта.", - "string" => "Полето :attribute трябва да бъде по-малко от :max знака.", - ), - "mimes" => "Полето :attribute трябва да бъде файл от тип: :values.", - "min" => array( - "numeric" => "Полето :attribute трябва да бъде минимум :min.", - "file" => "Полето :attribute трябва да бъде минимум :min килобайта.", - "string" => "Полето :attribute трябва да бъде минимум :min знака.", - ), - "not_in" => "Стойността на :attribute е невалидна.", - "numeric" => "Полето :attribute трябва да бъде число.", - "required" => "Полето :attribute е задължително.", - "same" => "Стойностите на :attribute и :other трябва да съвпадат.", - "size" => array( - "numeric" => "Полето :attribute трябва да бъде :size.", - "file" => "Полето :attribute трябва да бъде :size килобайта.", - "string" => "Полето :attribute трябва да бъде :size знака.", - ), - "unique" => "Стойността на :attribute вече съществува.", - "url" => "Полето :attribute е с невалиден формат.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - + "Трябва да приемете :attribute.", + "active_url" => "Полето :attribute не е валиден URL адрес.", + "after" => "Полето :attribute трябва да бъде дата след :date.", + "alpha" => "Полето :attribute трябва да съдържа само букви.", + "alpha_dash" => "Полето :attribute трябва да съдържа само букви, цифри, долна черта и тире.", + "alpha_num" => "Полето :attribute трябва да съдържа само букви и цифри.", + "before" => "Полето :attribute трябва да бъде дата преди :date.", + "between" => array( + "numeric" => "Полето :attribute трябва да бъде между :min и :max.", + "file" => "Полето :attribute трябва да бъде между :min и :max килобайта.", + "string" => "Полето :attribute трябва да бъде между :min и :max знака.", + ), + "confirmed" => "Полето :attribute не е потвърдено.", + "different" => "Полетата :attribute и :other трябва да са различни.", + "email" => "Полето :attribute е с невалиден формат.", + "exists" => "Избраната стойност на :attribute вече съществува.", + "image" => "Полето :attribute трябва да бъде изображение.", + "in" => "Стойността на :attribute е невалидна.", + "integer" => "Полето :attribute трябва да бъде цяло число.", + "ip" => "Полето :attribute трябва да бъде IP адрес.", + "match" => "Полето :attribute е с невалиден формат.", + "max" => array( + "numeric" => "Полето :attribute трябва да бъде по-малко от :max.", + "file" => "Полето :attribute трябва да бъде по-малко от :max килобайта.", + "string" => "Полето :attribute трябва да бъде по-малко от :max знака.", + ), + "mimes" => "Полето :attribute трябва да бъде файл от тип: :values.", + "min" => array( + "numeric" => "Полето :attribute трябва да бъде минимум :min.", + "file" => "Полето :attribute трябва да бъде минимум :min килобайта.", + "string" => "Полето :attribute трябва да бъде минимум :min знака.", + ), + "not_in" => "Стойността на :attribute е невалидна.", + "numeric" => "Полето :attribute трябва да бъде число.", + "required" => "Полето :attribute е задължително.", + "same" => "Стойностите на :attribute и :other трябва да съвпадат.", + "size" => array( + "numeric" => "Полето :attribute трябва да бъде :size.", + "file" => "Полето :attribute трябва да бъде :size килобайта.", + "string" => "Полето :attribute трябва да бъде :size знака.", + ), + "unique" => "Стойността на :attribute вече съществува.", + "url" => "Полето :attribute е с невалиден формат.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + ); \ No newline at end of file diff --git a/laravel/autoloader.php b/laravel/autoloader.php index 68e423d2..4168e305 100644 --- a/laravel/autoloader.php +++ b/laravel/autoloader.php @@ -40,7 +40,7 @@ class Autoloader { /** * Load the file corresponding to a given class. * - * This method is registerd in the bootstrap file as an SPL auto-loader. + * This method is registered in the bootstrap file as an SPL auto-loader. * * @param string $class * @return void @@ -55,7 +55,7 @@ public static function load($class) return class_alias(static::$aliases[$class], $class); } - // All classes in Laravel are staticly mapped. There is no crazy search + // All classes in Laravel are statically mapped. There is no crazy search // routine that digs through directories. It's just a simple array of // class to file path maps for ultra-fast file loading. elseif (isset(static::$mappings[$class])) @@ -102,7 +102,7 @@ protected static function load_namespaced($class, $namespace, $directory) protected static function load_psr($class, $directory = null) { // The PSR-0 standard indicates that class namespaces and underscores - // should be used to indcate the directory tree in which the class + // should be used to indicate the directory tree in which the class // resides, so we'll convert them to slashes. $file = str_replace(array('\\', '_'), '/', $class); diff --git a/laravel/bundle.php b/laravel/bundle.php index 2259228e..4f44268b 100644 --- a/laravel/bundle.php +++ b/laravel/bundle.php @@ -66,7 +66,7 @@ public static function register($bundle, $config = array()) // It is possible for the developer to specify auto-loader mappings // directly on the bundle registration. This provides a convenient - // way to register mappings withuot a bootstrap. + // way to register mappings without a bootstrap. if (isset($config['autoloads'])) { static::autoloads($bundle, $config); @@ -201,7 +201,7 @@ public static function handles($uri) } /** - * Deteremine if a bundle exists within the bundles directory. + * Determine if a bundle exists within the bundles directory. * * @param string $bundle * @return bool diff --git a/laravel/cli/tasks/bundle/bundler.php b/laravel/cli/tasks/bundle/bundler.php index 9d369c21..7af60e07 100644 --- a/laravel/cli/tasks/bundle/bundler.php +++ b/laravel/cli/tasks/bundle/bundler.php @@ -49,7 +49,7 @@ public function install($bundles) // all of its registered dependencies as well. // // Each bundle provider implements the Provider interface and - // is repsonsible for retrieving the bundle source from its + // is responsible for retrieving the bundle source from its // hosting party and installing it into the application. $path = path('bundle').$this->path($bundle); @@ -135,7 +135,7 @@ protected function get($bundles) $responses[] = $bundle; - // We'll also get the bundle's declared dependenceis so they + // We'll also get the bundle's declared dependencies so they // can be installed along with the bundle, making it easy // to install a group of bundles. $dependencies = $this->get($bundle['dependencies']); diff --git a/laravel/cli/tasks/bundle/providers/provider.php b/laravel/cli/tasks/bundle/providers/provider.php index bf6401f7..258500c2 100644 --- a/laravel/cli/tasks/bundle/providers/provider.php +++ b/laravel/cli/tasks/bundle/providers/provider.php @@ -27,7 +27,7 @@ protected function zipball($url, $bundle, $path) // When installing a bundle from a Zip archive, we'll first clone // down the bundle zip into the bundles "working" directory so - // we have a spot to do all of our bundle extration work. + // we have a spot to do all of our bundle extraction work. $target = $work.'laravel-bundle.zip'; File::put($target, $this->download($url)); @@ -49,7 +49,7 @@ protected function zipball($url, $bundle, $path) // Once we have the latest modified directory, we should be // able to move its contents over into the bundles folder - // so the bundle will be usable by the develoepr. + // so the bundle will be usable by the developer. File::mvdir($latest, $path); File::rmdir($work.'zip'); diff --git a/laravel/cli/tasks/migrate/database.php b/laravel/cli/tasks/migrate/database.php index a6aae9d5..31fcf110 100644 --- a/laravel/cli/tasks/migrate/database.php +++ b/laravel/cli/tasks/migrate/database.php @@ -40,7 +40,7 @@ public function last() $table = $this->table(); // First we need to grab the last batch ID from the migration table, - // as this will allow us to grab the lastest batch of migrations + // as this will allow us to grab the latest batch of migrations // that need to be run for a rollback command. $id = $this->batch(); diff --git a/laravel/cli/tasks/migrate/migrator.php b/laravel/cli/tasks/migrate/migrator.php index 5bf7617b..68235abe 100644 --- a/laravel/cli/tasks/migrate/migrator.php +++ b/laravel/cli/tasks/migrate/migrator.php @@ -206,7 +206,7 @@ public function make($arguments = array()) // Once the migration has been created, we'll return the // migration file name so it can be used by the task - // consumer if necessary for futher work. + // consumer if necessary for further work. return $file; } @@ -223,7 +223,7 @@ protected function stub($bundle, $migration) $prefix = Bundle::class_prefix($bundle); - // The class name is formatted simialrly to tasks and controllers, + // The class name is formatted similarly to tasks and controllers, // where the bundle name is prefixed to the class if it is not in // the default "application" bundle. $class = $prefix.Str::classify($migration); diff --git a/laravel/cookie.php b/laravel/cookie.php index 1f79a69b..cedb0a07 100644 --- a/laravel/cookie.php +++ b/laravel/cookie.php @@ -77,7 +77,7 @@ public static function put($name, $value, $expiration = 0, $path = '/', $domain // If the secure option is set to true, yet the request is not over HTTPS // we'll throw an exception to let the developer know that they are - // attempting to send a secure cookie over the unsecure HTTP. + // attempting to send a secure cookie over the unsecured HTTP. if ($secure and ! Request::secure()) { throw new \Exception("Attempting to set secure cookie over HTTP."); diff --git a/laravel/database/connection.php b/laravel/database/connection.php index 26197736..bb6a5d1d 100644 --- a/laravel/database/connection.php +++ b/laravel/database/connection.php @@ -287,7 +287,7 @@ protected function fetch($statement, $style) { // If the fetch style is "class", we'll hydrate an array of PHP // stdClass objects as generic containers for the query rows, - // otherwise we'll just use the fetch styel value. + // otherwise we'll just use the fetch style value. if ($style === PDO::FETCH_CLASS) { return $statement->fetchAll(PDO::FETCH_CLASS, 'stdClass'); diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index 8703f4c4..0782db14 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -768,7 +768,7 @@ public function __call($method, $parameters) $underscored = array('with', 'find'); - // Some methods need to be accessed both staticly and non-staticly so we'll + // Some methods need to be accessed both statically and non-statically so we'll // keep underscored methods of those methods and intercept calls to them // here so they can be called either way on the model instance. if (in_array($method, $underscored)) diff --git a/laravel/database/eloquent/query.php b/laravel/database/eloquent/query.php index 3aee79c9..f2158a9c 100644 --- a/laravel/database/eloquent/query.php +++ b/laravel/database/eloquent/query.php @@ -38,7 +38,7 @@ class Query { ); /** - * Creat a new query instance for a model. + * Create a new query instance for a model. * * @param Model $model * @return void @@ -118,7 +118,7 @@ public function hydrate($model, $results) $new = new $class(array(), true); // We need to set the attributes manually in case the accessible property is - // set on the array which will prevent the mass assignemnt of attributes if + // set on the array which will prevent the mass assignment of attributes if // we were to pass them in using the constructor or fill methods. $new->fill_raw($result); diff --git a/laravel/database/query.php b/laravel/database/query.php index 55e9606a..b60ca68a 100644 --- a/laravel/database/query.php +++ b/laravel/database/query.php @@ -168,7 +168,7 @@ public function join($table, $column1, $operator = null, $column2 = null, $type // If the column is just a string, we can assume that the join just // has a simple on clause, and we'll create the join instance and - // add the clause automatically for the develoepr. + // add the clause automatically for the developer. else { $join = new Query\Join($type, $table); @@ -686,7 +686,7 @@ public function paginate($per_page = 20, $columns = array('*')) { // Because some database engines may throw errors if we leave orderings // on the query when retrieving the total number of records, we'll drop - // all of the ordreings and put them back on the query. + // all of the orderings and put them back on the query. list($orderings, $this->orderings) = array($this->orderings, null); $total = $this->count(reset($columns)); @@ -852,7 +852,7 @@ public function __call($method, $parameters) } // All of the aggregate methods are handled by a single method, so we'll - // catch them all here and then pass them off to the agregate method + // catch them all here and then pass them off to the aggregate method // instead of creating methods for each one of them. if (in_array($method, array('count', 'min', 'max', 'avg', 'sum'))) { diff --git a/laravel/database/query/grammars/grammar.php b/laravel/database/query/grammars/grammar.php index 65c62cf3..c998aeb2 100644 --- a/laravel/database/query/grammars/grammar.php +++ b/laravel/database/query/grammars/grammar.php @@ -13,7 +13,7 @@ class Grammar extends \Laravel\Database\Grammar { public $datetime = 'Y-m-d H:i:s'; /** - * All of the query componenets in the order they should be built. + * All of the query components in the order they should be built. * * @var array */ @@ -149,7 +149,7 @@ protected function joins(Query $query) // The first clause will have a connector on the front, but it is // not needed on the first condition, so we will strip it off of - // the condition before adding it to the arrya of joins. + // the condition before adding it to the array of joins. $search = array('AND ', 'OR '); $clauses[0] = str_replace($search, '', $clauses[0]); @@ -343,7 +343,7 @@ protected function offset(Query $query) } /** - * Compile a SQL INSERT statment from a Query instance. + * Compile a SQL INSERT statement from a Query instance. * * This method handles the compilation of single row inserts and batch inserts. * @@ -366,7 +366,7 @@ public function insert(Query $query, $values) $columns = $this->columnize(array_keys(reset($values))); // Build the list of parameter place-holders of values bound to the query. - // Each insert should have the same number of bound paramters, so we can + // Each insert should have the same number of bound parameters, so we can // just use the first array of values. $parameters = $this->parameterize(reset($values)); @@ -376,7 +376,7 @@ public function insert(Query $query, $values) } /** - * Compile a SQL INSERT and get ID statment from a Query instance. + * Compile a SQL INSERT and get ID statement from a Query instance. * * @param Query $query * @param array $values @@ -389,7 +389,7 @@ public function insert_get_id(Query $query, $values, $column) } /** - * Compile a SQL UPDATE statment from a Query instance. + * Compile a SQL UPDATE statement from a Query instance. * * @param Query $query * @param array $values @@ -410,13 +410,13 @@ public function update(Query $query, $values) $columns = implode(', ', $columns); // UPDATE statements may be constrained by a WHERE clause, so we'll run - // the entire where compilation process for those contraints. This is + // the entire where compilation process for those constraints. This is // easily achieved by passing it to the "wheres" method. return trim("UPDATE {$table} SET {$columns} ".$this->wheres($query)); } /** - * Compile a SQL DELETE statment from a Query instance. + * Compile a SQL DELETE statement from a Query instance. * * @param Query $query * @return string diff --git a/laravel/database/query/grammars/postgres.php b/laravel/database/query/grammars/postgres.php index 002b4cc7..6041ae82 100644 --- a/laravel/database/query/grammars/postgres.php +++ b/laravel/database/query/grammars/postgres.php @@ -5,7 +5,7 @@ class Postgres extends Grammar { /** - * Compile a SQL INSERT and get ID statment from a Query instance. + * Compile a SQL INSERT and get ID statement from a Query instance. * * @param Query $query * @param array $values diff --git a/laravel/database/schema.php b/laravel/database/schema.php index c7e56309..757c4058 100644 --- a/laravel/database/schema.php +++ b/laravel/database/schema.php @@ -71,7 +71,7 @@ public static function execute($table) { // The implications method is responsible for finding any fluently // defined indexes on the schema table and adding the explicit - // commands that are needed to tbe schema instance. + // commands that are needed to the schema instance. static::implications($table); foreach ($table->commands as $command) diff --git a/laravel/database/schema/grammars/mysql.php b/laravel/database/schema/grammars/mysql.php index fc9107d0..d146933d 100644 --- a/laravel/database/schema/grammars/mysql.php +++ b/laravel/database/schema/grammars/mysql.php @@ -37,7 +37,7 @@ public function create(Table $table, Fluent $command) } /** - * Geenrate the SQL statements for a table modification command. + * Generate the SQL statements for a table modification command. * * @param Table $table * @param Fluent $command @@ -284,7 +284,7 @@ public function drop_fulltext(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command @@ -353,7 +353,7 @@ protected function type_float(Fluent $column) } /** - * Generate the data-type definintion for a decimal. + * Generate the data-type definition for a decimal. * * @param Fluent $column * @return string diff --git a/laravel/database/schema/grammars/postgres.php b/laravel/database/schema/grammars/postgres.php index 930c5160..f3417f29 100644 --- a/laravel/database/schema/grammars/postgres.php +++ b/laravel/database/schema/grammars/postgres.php @@ -25,7 +25,7 @@ public function create(Table $table, Fluent $command) } /** - * Geenrate the SQL statements for a table modification command. + * Generate the SQL statements for a table modification command. * * @param Table $table * @param Fluent $command @@ -246,7 +246,7 @@ public function drop_primary(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command @@ -339,7 +339,7 @@ protected function type_float(Fluent $column) } /** - * Generate the data-type definintion for a decimal. + * Generate the data-type definition for a decimal. * * @param Fluent $column * @return string diff --git a/laravel/database/schema/grammars/sqlite.php b/laravel/database/schema/grammars/sqlite.php index 09102f52..3d21ced1 100644 --- a/laravel/database/schema/grammars/sqlite.php +++ b/laravel/database/schema/grammars/sqlite.php @@ -43,7 +43,7 @@ public function create(Table $table, Fluent $command) } /** - * Geenrate the SQL statements for a table modification command. + * Generate the SQL statements for a table modification command. * * @param Table $table * @param Fluent $command @@ -214,7 +214,7 @@ public function drop(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command @@ -226,7 +226,7 @@ public function drop_unique(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command @@ -283,7 +283,7 @@ protected function type_float(Fluent $column) } /** - * Generate the data-type definintion for a decimal. + * Generate the data-type definition for a decimal. * * @param Fluent $column * @return string diff --git a/laravel/database/schema/grammars/sqlserver.php b/laravel/database/schema/grammars/sqlserver.php index 5f756c2e..7c081499 100644 --- a/laravel/database/schema/grammars/sqlserver.php +++ b/laravel/database/schema/grammars/sqlserver.php @@ -260,7 +260,7 @@ public function drop_primary(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqiue key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command @@ -357,7 +357,7 @@ protected function type_float(Fluent $column) } /** - * Generate the data-type definintion for a decimal. + * Generate the data-type definition for a decimal. * * @param Fluent $column * @return string diff --git a/laravel/error.php b/laravel/error.php index 729f632a..606ad64a 100644 --- a/laravel/error.php +++ b/laravel/error.php @@ -80,7 +80,7 @@ public static function native($code, $error, $file, $line) */ public static function shutdown() { - // If a fatal error occured that we have not handled yet, we will + // If a fatal error occurred that we have not handled yet, we will // create an ErrorException and feed it to the exception handler, // as it will not yet have been handled. $error = error_get_last(); diff --git a/laravel/file.php b/laravel/file.php index efb46dec..f7f71805 100644 --- a/laravel/file.php +++ b/laravel/file.php @@ -296,7 +296,7 @@ public static function rmdir($directory, $preserve = false) { // If the item is a directory, we can just recurse into the // function and delete that sub-directory, otherwise we'll - // just deleete the file and keep going! + // just delete the file and keep going! if ($item->isDir()) { static::rmdir($item->getRealPath()); diff --git a/laravel/html.php b/laravel/html.php index 498ea28c..801aa2ae 100644 --- a/laravel/html.php +++ b/laravel/html.php @@ -359,7 +359,7 @@ public static function attributes($attributes) foreach ((array) $attributes as $key => $value) { // For numeric keys, we will assume that the key and the value are the - // same, as this will conver HTML attributes such as "required" that + // same, as this will convert HTML attributes such as "required" that // may be specified as required="required", etc. if (is_numeric($key)) $key = $value; diff --git a/laravel/ioc.php b/laravel/ioc.php index 11292925..14f22bf0 100644 --- a/laravel/ioc.php +++ b/laravel/ioc.php @@ -191,7 +191,7 @@ protected static function dependencies($parameters) $dependency = $parameter->getClass(); // If the class is null, it means the dependency is a string or some other - // primitive type, which we can not esolve since it is not a class and + // primitive type, which we can not resolve since it is not a class and // we'll just bomb out with an error since we have nowhere to go. if (is_null($dependency)) { diff --git a/laravel/lang.php b/laravel/lang.php index 8fd5f7ba..fd3bf177 100644 --- a/laravel/lang.php +++ b/laravel/lang.php @@ -134,7 +134,7 @@ public function get($language = null, $default = null) $line = array_get($lines, $line, $default); // If the line is not a string, it probably means the developer asked for - // the entire langauge file and the value of the requested value will be + // the entire language file and the value of the requested value will be // an array containing all of the lines in the file. if (is_string($line)) { diff --git a/laravel/laravel.php b/laravel/laravel.php index a1ca2061..e00ed40e 100644 --- a/laravel/laravel.php +++ b/laravel/laravel.php @@ -54,7 +54,7 @@ |-------------------------------------------------------------------------- | | By setting error reporting to -1, we essentially force PHP to report -| every error, and this is guranteed to show every error on future +| every error, and this is guaranteed to show every error on future | releases of PHP. This allows everything to be fixed early! | */ @@ -143,7 +143,7 @@ |-------------------------------------------------------------------------- | | If a session driver has been configured, we will save the session to -| storage so it is avaiable for the next request. This will also set +| storage so it is available for the next request. This will also set | the session cookie in the cookie jar to be sent to the user. | */ diff --git a/laravel/log.php b/laravel/log.php index 4cd3a30e..870dcd0f 100644 --- a/laravel/log.php +++ b/laravel/log.php @@ -28,7 +28,7 @@ protected static function exception_line($e) * Write a message to the log file. * * - * // Write an "error" messge to the log file + * // Write an "error" message to the log file * Log::write('error', 'Something went horribly wrong!'); * * // Write an "error" message using the class' magic method diff --git a/laravel/pluralizer.php b/laravel/pluralizer.php index 857a7ff5..95c08bd3 100644 --- a/laravel/pluralizer.php +++ b/laravel/pluralizer.php @@ -48,7 +48,7 @@ public function singular($value) } // English words may be automatically inflected using regular expressions. - // If the word is english, we'll just pass off the word to the automatic + // If the word is English, we'll just pass off the word to the automatic // inflection method and return the result, which is cached. $irregular = $this->config['irregular']; @@ -77,7 +77,7 @@ public function plural($value, $count = 2) } // English words may be automatically inflected using regular expressions. - // If the word is english, we'll just pass off the word to the automatic + // If the word is English, we'll just pass off the word to the automatic // inflection method and return the result, which is cached. $irregular = array_flip($this->config['irregular']); diff --git a/laravel/redis.php b/laravel/redis.php index d00b2f52..02267d32 100644 --- a/laravel/redis.php +++ b/laravel/redis.php @@ -17,7 +17,7 @@ class Redis { protected $port; /** - * The databse number the connection selects on load. + * The database number the connection selects on load. * * @var int */ diff --git a/laravel/routing/router.php b/laravel/routing/router.php index 00659a22..ec6b60ee 100644 --- a/laravel/routing/router.php +++ b/laravel/routing/router.php @@ -303,7 +303,7 @@ public static function controller($controllers, $defaults = 'index', $https = nu { list($bundle, $controller) = Bundle::parse($identifier); - // First we need to replace the dots with slashes in thte controller name + // First we need to replace the dots with slashes in the controller name // so that it is in directory format. The dots allow the developer to use // a cleaner syntax when specifying the controller. We will also grab the // root URI for the controller's bundle. diff --git a/laravel/session/drivers/database.php b/laravel/session/drivers/database.php index c094a91f..d151ee53 100644 --- a/laravel/session/drivers/database.php +++ b/laravel/session/drivers/database.php @@ -84,7 +84,7 @@ public function delete($id) } /** - * Delete all expired sessions from persistant storage. + * Delete all expired sessions from persistent storage. * * @param int $expiration * @return void diff --git a/laravel/session/drivers/driver.php b/laravel/session/drivers/driver.php index 8a54ac98..e5cef1ee 100644 --- a/laravel/session/drivers/driver.php +++ b/laravel/session/drivers/driver.php @@ -63,7 +63,7 @@ public function id() return Str::random(40); } - // We'll containue generating random IDs until we find an ID that is + // We'll continue generating random IDs until we find an ID that is // not currently assigned to a session. This is almost definitely // going to happen on the first iteration. do { diff --git a/laravel/session/drivers/file.php b/laravel/session/drivers/file.php index d7e3b98f..744f3737 100644 --- a/laravel/session/drivers/file.php +++ b/laravel/session/drivers/file.php @@ -64,7 +64,7 @@ public function delete($id) } /** - * Delete all expired sessions from persistant storage. + * Delete all expired sessions from persistent storage. * * @param int $expiration * @return void diff --git a/laravel/session/drivers/sweeper.php b/laravel/session/drivers/sweeper.php index a62ff622..45ecd17b 100644 --- a/laravel/session/drivers/sweeper.php +++ b/laravel/session/drivers/sweeper.php @@ -3,7 +3,7 @@ interface Sweeper { /** - * Delete all expired sessions from persistant storage. + * Delete all expired sessions from persistent storage. * * @param int $expiration * @return void diff --git a/laravel/session/payload.php b/laravel/session/payload.php index 5b45a533..1149951f 100644 --- a/laravel/session/payload.php +++ b/laravel/session/payload.php @@ -71,7 +71,7 @@ public function load($id) } /** - * Deteremine if the session payload instance is valid. + * Determine if the session payload instance is valid. * * The session is considered valid if it exists and has not expired. * diff --git a/laravel/url.php b/laravel/url.php index 44b89428..c421e560 100644 --- a/laravel/url.php +++ b/laravel/url.php @@ -102,7 +102,7 @@ public static function to($url = '', $https = null) } // Unless $https is specified (true or false) then maintain the current request - // security for any new links generated. So https for all secure links. + // security for any new links generated. So https for all secure links. if (is_null($https)) $https = Request::secure(); $root = static::base().'/'.Config::get('application.index'); diff --git a/laravel/validator.php b/laravel/validator.php index 968e94b7..8fd3a6c1 100644 --- a/laravel/validator.php +++ b/laravel/validator.php @@ -974,7 +974,7 @@ protected function attribute($attribute) // If no language line has been specified for the attribute, all of // the underscores are removed from the attribute name and that - // will be used as the attribtue name. + // will be used as the attribute name. else { return str_replace('_', ' ', $attribute); From 0a85a54c2fc022b5ed63389fa282d26220c551ac Mon Sep 17 00:00:00 2001 From: resurtm Date: Sun, 22 Jul 2012 21:48:11 +0600 Subject: [PATCH 141/260] Indentation fixes in html.php. --- laravel/html.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/laravel/html.php b/laravel/html.php index 498ea28c..da55012a 100644 --- a/laravel/html.php +++ b/laravel/html.php @@ -9,13 +9,13 @@ class HTML { */ public static $macros = array(); - /** - * Registers a custom macro. - * - * @param string $name - * @param Closure $input - * @return void - */ + /** + * Registers a custom macro. + * + * @param string $name + * @param Closure $input + * @return void + */ public static function macro($name, $macro) { static::$macros[$name] = $macro; From c60a58ff261a91d005a7a20d18660d72ab4e3980 Mon Sep 17 00:00:00 2001 From: Colin Viebrock Date: Mon, 23 Jul 2012 14:29:29 -0500 Subject: [PATCH 142/260] Someone else can re-word this, but a easy-to-find paragraph on deleteing Eloquent models seemed missing. Signed-off-by: Colin Viebrock --- laravel/documentation/database/eloquent.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/laravel/documentation/database/eloquent.md b/laravel/documentation/database/eloquent.md index 71e3a402..7a7e1b9c 100644 --- a/laravel/documentation/database/eloquent.md +++ b/laravel/documentation/database/eloquent.md @@ -15,6 +15,7 @@ ## Contents - [Setter & Getter Methods](#getter-and-setter-methods) - [Mass-Assignment](#mass-assignment) - [Converting Models To Arrays](#to-array) +- [Deleting Models](#delete) ## The Basics @@ -331,7 +332,7 @@ ### Inserting Related Models (Many-To-Many) $user->roles()->attach($role_id); It's also possible to attach data for fields in the intermediate table (pivot table), to do this add a second array variable to the attach command containing the data you want to attach: - + $user->roles()->attach($role_id, array('expires' => $expires)); @@ -427,14 +428,14 @@ ## Eager Loading class Book extends Eloquent { public $includes = array('author'); - + public function author() { return $this->belongs_to('Author'); } } - + **$includes** takes the same arguments that **with** takes. The following is now eagerly loaded. foreach (Book::all() as $book) @@ -536,4 +537,13 @@ #### Excluding attributes from the array: public static $hidden = array('password'); - } \ No newline at end of file + } + + +## Deleting Models + +Because Eloquent inherits all the features and methods of Fluent queries, deleting models is a snap: + + $author->delete(); + +Note, however, than this won't delete any related models (e.g. all the author's Book models will still exist), unless you have set up [foreign keys](/docs/database/schema#foreign-keys) and cascading deletes. \ No newline at end of file From 289c02ab47737d263df9d13fc1db317188dac115 Mon Sep 17 00:00:00 2001 From: Jakobud Date: Mon, 23 Jul 2012 15:50:04 -0600 Subject: [PATCH 143/260] Added documentation for paginate's second optional argument. Signed-off-by: Jakobud --- laravel/documentation/views/pagination.md | 36 +++++++++++++---------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/laravel/documentation/views/pagination.md b/laravel/documentation/views/pagination.md index 602b09ba..95b5479b 100644 --- a/laravel/documentation/views/pagination.md +++ b/laravel/documentation/views/pagination.md @@ -22,6 +22,10 @@ #### Pull the paginated results from the query: $orders = DB::table('orders')->paginate($per_page); +You can also pass an optional array of table columns to select in the query: + + $orders = DB::table('orders')->paginate($per_page, array('id', 'name', 'created_at')); + #### Display the results in a view: results as $order): ?> @@ -75,30 +79,30 @@ ## Pagination Styling All pagination link elements can be style using CSS classes. Here is an example of the HTML elements generated by the links method: - When you are on the first page of results, the "Previous" link will be disabled. Likewise, the "Next" link will be disabled when you are on the last page of results. The generated HTML will look like this: - Previous \ No newline at end of file + Previous From 1c92b907d5f87198edd5f28152127d9d70c29a0a Mon Sep 17 00:00:00 2001 From: Tobsn Date: Tue, 24 Jul 2012 20:42:38 +0200 Subject: [PATCH 144/260] fixed two typos connecter class => connector class Therefor => Therefore --- laravel/documentation/database/config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/database/config.md b/laravel/documentation/database/config.md index 2a1b0453..b593dbc6 100644 --- a/laravel/documentation/database/config.md +++ b/laravel/documentation/database/config.md @@ -49,7 +49,7 @@ ## Setting The Default Connection Name ##Overwriting The Default PDO Options -The PDO connecter class (**laravel/database/connectors/connector.php**) has a set of default PDO attributes defined which can be overwritten in the options array for each system. For example, one of the default attributes is to force column names to lowercase (**PDO::CASE_LOWER**) even if they are defined in UPPERCASE or CamelCase in the table. Therefor, under the default attributes, query result object variables would only be accessible in lowercase. +The PDO connector class (**laravel/database/connectors/connector.php**) has a set of default PDO attributes defined which can be overwritten in the options array for each system. For example, one of the default attributes is to force column names to lowercase (**PDO::CASE_LOWER**) even if they are defined in UPPERCASE or CamelCase in the table. Therefore, under the default attributes, query result object variables would only be accessible in lowercase. An example of the MySQL system settings with added default PDO attributes: 'mysql' => array( From 6cb2ddad641d39f97d1834245b8630ac46698c08 Mon Sep 17 00:00:00 2001 From: Tobsn Date: Wed, 25 Jul 2012 00:21:32 +0200 Subject: [PATCH 145/260] multiline echo and comments for issue #647 --- laravel/blade.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/laravel/blade.php b/laravel/blade.php index f224614a..efc88aa5 100644 --- a/laravel/blade.php +++ b/laravel/blade.php @@ -186,9 +186,9 @@ protected static function extract($value, $expression) */ protected static function compile_comments($value) { - $value = preg_replace('/\{\{--(.+?)(--\}\})?\n/', "", $value); + $value = preg_replace('/\{\{--(.+?)(--\}\})?\n/s', "", $value); - return preg_replace('/\{\{--((.|\s)*?)--\}\}/', "\n", $value); + return preg_replace('/\{\{--((.|\s)*?)--\}\}/s', "\n", $value); } /** @@ -199,7 +199,7 @@ protected static function compile_comments($value) */ protected static function compile_echos($value) { - return preg_replace('/\{\{(.+?)\}\}/', '', $value); + return preg_replace('/\{\{(.+?)\}\}/s', '', $value); } /** From 34c746b4f8901a6b7ac61077d3074f1ff9d33798 Mon Sep 17 00:00:00 2001 From: Tobsn Date: Wed, 25 Jul 2012 00:23:31 +0200 Subject: [PATCH 146/260] added @continue like @break - as of request issue #1001 --- laravel/blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/blade.php b/laravel/blade.php index efc88aa5..b95bf6c2 100644 --- a/laravel/blade.php +++ b/laravel/blade.php @@ -306,7 +306,7 @@ function($matches) use (&$value) */ protected static function compile_structure_closings($value) { - $pattern = '/@(endif|endforeach|endfor|endwhile|break)/'; + $pattern = '/@(endif|endforeach|endfor|endwhile|break|continue)/'; return preg_replace($pattern, '', $value); } From a1914d65f027594abf5761d1af788f3d0a81a2ed Mon Sep 17 00:00:00 2001 From: stupoh Date: Wed, 25 Jul 2012 12:49:56 +0700 Subject: [PATCH 147/260] Added Indonesian language files Signed-off-by: stupoh --- application/language/id/pagination.php | 19 +++++ application/language/id/validation.php | 99 ++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 application/language/id/pagination.php create mode 100644 application/language/id/validation.php diff --git a/application/language/id/pagination.php b/application/language/id/pagination.php new file mode 100644 index 00000000..7cdad20b --- /dev/null +++ b/application/language/id/pagination.php @@ -0,0 +1,19 @@ + '« Sebelumnya', + 'next' => 'Selanjutnya »', + +); \ No newline at end of file diff --git a/application/language/id/validation.php b/application/language/id/validation.php new file mode 100644 index 00000000..3eafa4cc --- /dev/null +++ b/application/language/id/validation.php @@ -0,0 +1,99 @@ + "Isian :attribute harus diterima.", + "active_url" => "Isian :attribute bukan URL yang valid.", + "after" => "Isian :attribute harus tanggal setelah :date.", + "alpha" => "Isian :attribute hanya boleh berisi huruf.", + "alpha_dash" => "Isian :attribute hanya boleh berisi huruf, angka, dan strip.", + "alpha_num" => "Isian :attribute hanya boleh berisi huruf dan angka.", + "before" => "Isian :attribute harus tanggal sebelum :date.", + "between" => array( + "numeric" => "Isian :attribute harus antara :min - :max.", + "file" => "Isian :attribute harus antara :min - :max kilobytes.", + "string" => "Isian :attribute harus antara :min - :max karakter.", + ), + "confirmed" => "Konfirmasi :attribute tidak cocok.", + "different" => "Isian :attribute dan :other harus berbeda.", + "email" => "Format isian :attribute tidak valid.", + "exists" => "Isian :attribute yang dipilih tidak valid.", + "image" => ":attribute harus berupa gambar.", + "in" => "Isian :attribute yang dipilih tidak valid.", + "integer" => "Isian :attribute harus merupakan bilangan.", + "ip" => "Isian :attribute harus alamat IP yang valid.", + "match" => "Format isian :attribute tidak valid.", + "max" => array( + "numeric" => "Isian :attribute harus kurang dari :max.", + "file" => "Isian :attribute harus kurang dari :max kilobytes.", + "string" => "Isian :attribute harus kurang dari :max karakter.", + ), + "mimes" => "Isian :attribute harus dokumen berjenis : :values.", + "min" => array( + "numeric" => "Isian :attribute harus minimal :min.", + "file" => "Isian :attribute harus minimal :min kilobytes.", + "string" => "Isian :attribute harus minimal :min karakter.", + ), + "not_in" => "Isian :attribute yang dipilih tidak valid.", + "numeric" => "Isian :attribute harus berupa angka.", + "required" => "Isian :attribute wajib diisi.", + "same" => "Isian :attribute dan :other harus sama.", + "size" => array( + "numeric" => "Isian :attribute harus berukuran :size.", + "file" => "Isian :attribute harus berukuran :size kilobyte.", + "string" => "Isian :attribute harus berukuran :size karakter.", + ), + "unique" => "Isian :attribute sudah ada sebelumnya.", + "url" => "Format isian :attribute tidak valid.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file From 2f48bbba12283c1dc3c76acf8ab70d583b4079c5 Mon Sep 17 00:00:00 2001 From: Tao Wu Date: Wed, 25 Jul 2012 17:28:02 +0300 Subject: [PATCH 148/260] Update laravel/documentation/views/home.md Response::view() does not take a status code as the second parameter. --- laravel/documentation/views/home.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/views/home.md b/laravel/documentation/views/home.md index be646393..e74a0c43 100644 --- a/laravel/documentation/views/home.md +++ b/laravel/documentation/views/home.md @@ -56,7 +56,7 @@ #### Returning a custom response: #### Returning a custom response containing a view: - return Response::view('home', 200, $headers); + return Response::view('home', $headers); #### Returning a JSON response: From 7475bcd3480aaa5a6897437c7e903b040fd96010 Mon Sep 17 00:00:00 2001 From: Jakobud Date: Wed, 25 Jul 2012 10:08:54 -0600 Subject: [PATCH 149/260] Added documentation for the @render() Blade method Signed-off-by: Jakobud --- laravel/documentation/views/templating.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/laravel/documentation/views/templating.md b/laravel/documentation/views/templating.md index a2273c19..d9756e26 100644 --- a/laravel/documentation/views/templating.md +++ b/laravel/documentation/views/templating.md @@ -64,18 +64,21 @@ ## Blade Template Engine #### Echoing a variable using Blade: Hello, {{$name}}. - + #### Echoing function results using Blade: {{ Asset::styles() }} -#### Rendering a view: +#### Render a view: + +You can use **@include** to render a view into another view. The rendered view will automatically inherit all of the data from the current view.

    Profile - @include('user.profile') -> **Note:** When using the **@include** Blade expression, the view will automatically inherit all of the current view data. +Similarly, you can use **@render**, which behaves the same as **@include** except the rendered view will **not** inherit the data from the current view. + + @render('admin.list') #### Creating loops using Blade: @@ -124,7 +127,7 @@ #### The "unless" control structure: #### Blade comments: - + @if ($check) {{-- This is a comment --}} ... @@ -179,4 +182,4 @@ ## Blade Layouts Welcome to the profile page! @endsection -Notice the **@parent** Blade construct? It will be replaced with the contents of the layout's navigation section, providing you with a beautiful and powerful method of performing layout extension and inheritance. \ No newline at end of file +Notice the **@parent** Blade construct? It will be replaced with the contents of the layout's navigation section, providing you with a beautiful and powerful method of performing layout extension and inheritance. From 433318181b92a493b4012f54b9b1f2c027e9062f Mon Sep 17 00:00:00 2001 From: Jakobud Date: Thu, 26 Jul 2012 16:00:46 -0600 Subject: [PATCH 150/260] In the call() method, the exception wasn't being thrown if only 1 or more than 2 arguments were passed to the method. Fixed conditional statement to only accept exactly 2 arguments. In the route() method, URI::current() was evaluating as '/' in all situations. It was never evaluating as the route that you specified when executing the command. This could be part of a larger underlying bug with Symfony's HttpFoundation\Request class. It might be a band-aid fix, but replacing URI::current() with $_SERVER['REQUEST_URI'] allows the method to run the correct route. These fixes uncovered what I believe is potentially another bug. When var_dump($route->response()) is run, "NULL" and a newline is appended to the output. It's something to do with var_dump(), as echo $route->response() echo's the correct output without the extra "NULL". Signed-off-by: Jakobud --- laravel/cli/tasks/route.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/laravel/cli/tasks/route.php b/laravel/cli/tasks/route.php index 494d5ba0..b30d467c 100644 --- a/laravel/cli/tasks/route.php +++ b/laravel/cli/tasks/route.php @@ -14,7 +14,7 @@ class Route extends Task { */ public function call($arguments = array()) { - if ( ! count($arguments) == 2) + if ( count($arguments) != 2) { throw new \Exception("Please specify a request method and URI."); } @@ -41,7 +41,7 @@ protected function route() // We'll call the router using the method and URI specified by // the developer on the CLI. If a route is found, we will not // run the filters, but simply dump the result. - $route = Router::route(Request::method(), URI::current()); + $route = Router::route(Request::method(), $_SERVER['REQUEST_URI']); if ( ! is_null($route)) { @@ -53,4 +53,4 @@ protected function route() } } -} \ No newline at end of file +} From f408fcc26b20e31308bf9f90617ade33c1596102 Mon Sep 17 00:00:00 2001 From: Jason Lewis Date: Fri, 27 Jul 2012 12:30:41 +0930 Subject: [PATCH 151/260] Allow bundles to respond to root requests. Signed-off-by: Jason Lewis --- laravel/bundle.php | 2 +- laravel/routing/router.php | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/laravel/bundle.php b/laravel/bundle.php index 2259228e..2220322b 100644 --- a/laravel/bundle.php +++ b/laravel/bundle.php @@ -191,7 +191,7 @@ public static function handles($uri) foreach (static::$bundles as $key => $value) { - if (isset($value['handles']) and starts_with($uri, $value['handles'].'/')) + if (isset($value['handles']) and starts_with($uri, $value['handles'].'/') or $value['handles'] == '/') { return $key; } diff --git a/laravel/routing/router.php b/laravel/routing/router.php index 00659a22..cae6ff30 100644 --- a/laravel/routing/router.php +++ b/laravel/routing/router.php @@ -206,7 +206,12 @@ public static function register($method, $route, $action) continue; } - $uri = str_replace('(:bundle)', static::$bundle, $uri); + $uri = ltrim(str_replace('(:bundle)', static::$bundle, $uri), '/'); + + if($uri == '') + { + $uri = '/'; + } // If the URI begins with a wildcard, we want to add this route to the // array of "fallback" routes. Fallback routes are always processed From 8a34aa50774106de838500c6e63f80c7664bdb0c Mon Sep 17 00:00:00 2001 From: Pascal Borreli Date: Tue, 24 Jul 2012 09:31:27 +0000 Subject: [PATCH 152/260] Fixed typos --- bundles/docs/routes.php | 2 +- laravel/autoloader.php | 6 +++--- laravel/bundle.php | 4 ++-- laravel/cli/command.php | 2 +- laravel/cli/tasks/bundle/bundler.php | 2 +- laravel/cli/tasks/bundle/providers/provider.php | 2 +- laravel/cli/tasks/migrate/database.php | 2 +- laravel/cli/tasks/migrate/migrator.php | 4 ++-- laravel/cookie.php | 2 +- laravel/database/eloquent/model.php | 2 +- laravel/database/eloquent/query.php | 2 +- laravel/database/query.php | 4 ++-- laravel/database/query/grammars/grammar.php | 16 ++++++++-------- laravel/database/query/grammars/postgres.php | 2 +- laravel/database/schema/grammars/mysql.php | 8 ++++---- laravel/database/schema/grammars/postgres.php | 4 ++-- laravel/database/schema/grammars/sqlite.php | 4 ++-- laravel/database/schema/grammars/sqlserver.php | 6 +++--- laravel/documentation/bundles.md | 2 +- laravel/documentation/database/eloquent.md | 2 +- laravel/documentation/database/fluent.md | 2 +- laravel/documentation/database/schema.md | 2 +- laravel/documentation/ioc.md | 2 +- laravel/documentation/localization.md | 2 +- laravel/documentation/logging.md | 2 +- laravel/documentation/requests.md | 2 +- laravel/documentation/routing.md | 4 ++-- laravel/documentation/validation.md | 2 +- laravel/documentation/views/html.md | 2 +- laravel/documentation/views/templating.md | 2 +- laravel/error.php | 4 ++-- laravel/file.php | 2 +- laravel/html.php | 2 +- laravel/ioc.php | 2 +- laravel/lang.php | 2 +- laravel/laravel.php | 4 ++-- laravel/redis.php | 2 +- laravel/response.php | 2 +- laravel/routing/router.php | 2 +- laravel/session/drivers/database.php | 2 +- laravel/session/drivers/driver.php | 2 +- laravel/validator.php | 2 +- paths.php | 2 +- 43 files changed, 65 insertions(+), 65 deletions(-) diff --git a/bundles/docs/routes.php b/bundles/docs/routes.php index 334c652d..0193ed51 100644 --- a/bundles/docs/routes.php +++ b/bundles/docs/routes.php @@ -38,7 +38,7 @@ function document_exists($page) } /** - * Attach the sidebar to the documentatoin template. + * Attach the sidebar to the documentation template. */ View::composer('docs::template', function($view) { diff --git a/laravel/autoloader.php b/laravel/autoloader.php index 68e423d2..4168e305 100644 --- a/laravel/autoloader.php +++ b/laravel/autoloader.php @@ -40,7 +40,7 @@ class Autoloader { /** * Load the file corresponding to a given class. * - * This method is registerd in the bootstrap file as an SPL auto-loader. + * This method is registered in the bootstrap file as an SPL auto-loader. * * @param string $class * @return void @@ -55,7 +55,7 @@ public static function load($class) return class_alias(static::$aliases[$class], $class); } - // All classes in Laravel are staticly mapped. There is no crazy search + // All classes in Laravel are statically mapped. There is no crazy search // routine that digs through directories. It's just a simple array of // class to file path maps for ultra-fast file loading. elseif (isset(static::$mappings[$class])) @@ -102,7 +102,7 @@ protected static function load_namespaced($class, $namespace, $directory) protected static function load_psr($class, $directory = null) { // The PSR-0 standard indicates that class namespaces and underscores - // should be used to indcate the directory tree in which the class + // should be used to indicate the directory tree in which the class // resides, so we'll convert them to slashes. $file = str_replace(array('\\', '_'), '/', $class); diff --git a/laravel/bundle.php b/laravel/bundle.php index 2259228e..4f44268b 100644 --- a/laravel/bundle.php +++ b/laravel/bundle.php @@ -66,7 +66,7 @@ public static function register($bundle, $config = array()) // It is possible for the developer to specify auto-loader mappings // directly on the bundle registration. This provides a convenient - // way to register mappings withuot a bootstrap. + // way to register mappings without a bootstrap. if (isset($config['autoloads'])) { static::autoloads($bundle, $config); @@ -201,7 +201,7 @@ public static function handles($uri) } /** - * Deteremine if a bundle exists within the bundles directory. + * Determine if a bundle exists within the bundles directory. * * @param string $bundle * @return bool diff --git a/laravel/cli/command.php b/laravel/cli/command.php index 7b4ae3af..f1144738 100644 --- a/laravel/cli/command.php +++ b/laravel/cli/command.php @@ -100,7 +100,7 @@ protected static function parse($task) * // Resolve an instance of a task * $task = Command::resolve('application', 'migrate'); * - * // Resolve an instance of a task wtihin a bundle + * // Resolve an instance of a task within a bundle * $task = Command::resolve('bundle', 'foo'); * * diff --git a/laravel/cli/tasks/bundle/bundler.php b/laravel/cli/tasks/bundle/bundler.php index 9d369c21..6fcb93a6 100644 --- a/laravel/cli/tasks/bundle/bundler.php +++ b/laravel/cli/tasks/bundle/bundler.php @@ -135,7 +135,7 @@ protected function get($bundles) $responses[] = $bundle; - // We'll also get the bundle's declared dependenceis so they + // We'll also get the bundle's declared dependencies so they // can be installed along with the bundle, making it easy // to install a group of bundles. $dependencies = $this->get($bundle['dependencies']); diff --git a/laravel/cli/tasks/bundle/providers/provider.php b/laravel/cli/tasks/bundle/providers/provider.php index bf6401f7..c94bde3f 100644 --- a/laravel/cli/tasks/bundle/providers/provider.php +++ b/laravel/cli/tasks/bundle/providers/provider.php @@ -49,7 +49,7 @@ protected function zipball($url, $bundle, $path) // Once we have the latest modified directory, we should be // able to move its contents over into the bundles folder - // so the bundle will be usable by the develoepr. + // so the bundle will be usable by the developer. File::mvdir($latest, $path); File::rmdir($work.'zip'); diff --git a/laravel/cli/tasks/migrate/database.php b/laravel/cli/tasks/migrate/database.php index a6aae9d5..31fcf110 100644 --- a/laravel/cli/tasks/migrate/database.php +++ b/laravel/cli/tasks/migrate/database.php @@ -40,7 +40,7 @@ public function last() $table = $this->table(); // First we need to grab the last batch ID from the migration table, - // as this will allow us to grab the lastest batch of migrations + // as this will allow us to grab the latest batch of migrations // that need to be run for a rollback command. $id = $this->batch(); diff --git a/laravel/cli/tasks/migrate/migrator.php b/laravel/cli/tasks/migrate/migrator.php index 5bf7617b..68235abe 100644 --- a/laravel/cli/tasks/migrate/migrator.php +++ b/laravel/cli/tasks/migrate/migrator.php @@ -206,7 +206,7 @@ public function make($arguments = array()) // Once the migration has been created, we'll return the // migration file name so it can be used by the task - // consumer if necessary for futher work. + // consumer if necessary for further work. return $file; } @@ -223,7 +223,7 @@ protected function stub($bundle, $migration) $prefix = Bundle::class_prefix($bundle); - // The class name is formatted simialrly to tasks and controllers, + // The class name is formatted similarly to tasks and controllers, // where the bundle name is prefixed to the class if it is not in // the default "application" bundle. $class = $prefix.Str::classify($migration); diff --git a/laravel/cookie.php b/laravel/cookie.php index 1f79a69b..52192b67 100644 --- a/laravel/cookie.php +++ b/laravel/cookie.php @@ -77,7 +77,7 @@ public static function put($name, $value, $expiration = 0, $path = '/', $domain // If the secure option is set to true, yet the request is not over HTTPS // we'll throw an exception to let the developer know that they are - // attempting to send a secure cookie over the unsecure HTTP. + // attempting to send a secure cookie over the insecure HTTP. if ($secure and ! Request::secure()) { throw new \Exception("Attempting to set secure cookie over HTTP."); diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index 2c28b8f9..82c92bd0 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -746,7 +746,7 @@ public function __call($method, $parameters) $underscored = array('with', 'find'); - // Some methods need to be accessed both staticly and non-staticly so we'll + // Some methods need to be accessed both statically and non-statically so we'll // keep underscored methods of those methods and intercept calls to them // here so they can be called either way on the model instance. if (in_array($method, $underscored)) diff --git a/laravel/database/eloquent/query.php b/laravel/database/eloquent/query.php index 3aee79c9..92caa49c 100644 --- a/laravel/database/eloquent/query.php +++ b/laravel/database/eloquent/query.php @@ -118,7 +118,7 @@ public function hydrate($model, $results) $new = new $class(array(), true); // We need to set the attributes manually in case the accessible property is - // set on the array which will prevent the mass assignemnt of attributes if + // set on the array which will prevent the mass assignment of attributes if // we were to pass them in using the constructor or fill methods. $new->fill_raw($result); diff --git a/laravel/database/query.php b/laravel/database/query.php index 83c92b83..16ff1ecc 100644 --- a/laravel/database/query.php +++ b/laravel/database/query.php @@ -168,7 +168,7 @@ public function join($table, $column1, $operator = null, $column2 = null, $type // If the column is just a string, we can assume that the join just // has a simple on clause, and we'll create the join instance and - // add the clause automatically for the develoepr. + // add the clause automatically for the developer. else { $join = new Query\Join($type, $table); @@ -869,7 +869,7 @@ public function __call($method, $parameters) } // All of the aggregate methods are handled by a single method, so we'll - // catch them all here and then pass them off to the agregate method + // catch them all here and then pass them off to the aggregate method // instead of creating methods for each one of them. if (in_array($method, array('count', 'min', 'max', 'avg', 'sum'))) { diff --git a/laravel/database/query/grammars/grammar.php b/laravel/database/query/grammars/grammar.php index 65c62cf3..c998aeb2 100644 --- a/laravel/database/query/grammars/grammar.php +++ b/laravel/database/query/grammars/grammar.php @@ -13,7 +13,7 @@ class Grammar extends \Laravel\Database\Grammar { public $datetime = 'Y-m-d H:i:s'; /** - * All of the query componenets in the order they should be built. + * All of the query components in the order they should be built. * * @var array */ @@ -149,7 +149,7 @@ protected function joins(Query $query) // The first clause will have a connector on the front, but it is // not needed on the first condition, so we will strip it off of - // the condition before adding it to the arrya of joins. + // the condition before adding it to the array of joins. $search = array('AND ', 'OR '); $clauses[0] = str_replace($search, '', $clauses[0]); @@ -343,7 +343,7 @@ protected function offset(Query $query) } /** - * Compile a SQL INSERT statment from a Query instance. + * Compile a SQL INSERT statement from a Query instance. * * This method handles the compilation of single row inserts and batch inserts. * @@ -366,7 +366,7 @@ public function insert(Query $query, $values) $columns = $this->columnize(array_keys(reset($values))); // Build the list of parameter place-holders of values bound to the query. - // Each insert should have the same number of bound paramters, so we can + // Each insert should have the same number of bound parameters, so we can // just use the first array of values. $parameters = $this->parameterize(reset($values)); @@ -376,7 +376,7 @@ public function insert(Query $query, $values) } /** - * Compile a SQL INSERT and get ID statment from a Query instance. + * Compile a SQL INSERT and get ID statement from a Query instance. * * @param Query $query * @param array $values @@ -389,7 +389,7 @@ public function insert_get_id(Query $query, $values, $column) } /** - * Compile a SQL UPDATE statment from a Query instance. + * Compile a SQL UPDATE statement from a Query instance. * * @param Query $query * @param array $values @@ -410,13 +410,13 @@ public function update(Query $query, $values) $columns = implode(', ', $columns); // UPDATE statements may be constrained by a WHERE clause, so we'll run - // the entire where compilation process for those contraints. This is + // the entire where compilation process for those constraints. This is // easily achieved by passing it to the "wheres" method. return trim("UPDATE {$table} SET {$columns} ".$this->wheres($query)); } /** - * Compile a SQL DELETE statment from a Query instance. + * Compile a SQL DELETE statement from a Query instance. * * @param Query $query * @return string diff --git a/laravel/database/query/grammars/postgres.php b/laravel/database/query/grammars/postgres.php index 002b4cc7..6041ae82 100644 --- a/laravel/database/query/grammars/postgres.php +++ b/laravel/database/query/grammars/postgres.php @@ -5,7 +5,7 @@ class Postgres extends Grammar { /** - * Compile a SQL INSERT and get ID statment from a Query instance. + * Compile a SQL INSERT and get ID statement from a Query instance. * * @param Query $query * @param array $values diff --git a/laravel/database/schema/grammars/mysql.php b/laravel/database/schema/grammars/mysql.php index c2ae7455..1ea34a80 100644 --- a/laravel/database/schema/grammars/mysql.php +++ b/laravel/database/schema/grammars/mysql.php @@ -37,7 +37,7 @@ public function create(Table $table, Fluent $command) } /** - * Geenrate the SQL statements for a table modification command. + * Generate the SQL statements for a table modification command. * * @param Table $table * @param Fluent $command @@ -260,7 +260,7 @@ public function drop_primary(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command @@ -284,7 +284,7 @@ public function drop_fulltext(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command @@ -353,7 +353,7 @@ protected function type_float(Fluent $column) } /** - * Generate the data-type definintion for a decimal. + * Generate the data-type definition for a decimal. * * @param Fluent $column * @return string diff --git a/laravel/database/schema/grammars/postgres.php b/laravel/database/schema/grammars/postgres.php index 930c5160..123bc152 100644 --- a/laravel/database/schema/grammars/postgres.php +++ b/laravel/database/schema/grammars/postgres.php @@ -246,7 +246,7 @@ public function drop_primary(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command @@ -339,7 +339,7 @@ protected function type_float(Fluent $column) } /** - * Generate the data-type definintion for a decimal. + * Generate the data-type definition for a decimal. * * @param Fluent $column * @return string diff --git a/laravel/database/schema/grammars/sqlite.php b/laravel/database/schema/grammars/sqlite.php index 09102f52..f84f758d 100644 --- a/laravel/database/schema/grammars/sqlite.php +++ b/laravel/database/schema/grammars/sqlite.php @@ -214,7 +214,7 @@ public function drop(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command @@ -226,7 +226,7 @@ public function drop_unique(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqique key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command diff --git a/laravel/database/schema/grammars/sqlserver.php b/laravel/database/schema/grammars/sqlserver.php index 5f756c2e..49cb7db7 100644 --- a/laravel/database/schema/grammars/sqlserver.php +++ b/laravel/database/schema/grammars/sqlserver.php @@ -32,7 +32,7 @@ public function create(Table $table, Fluent $command) } /** - * Geenrate the SQL statements for a table modification command. + * Generate the SQL statements for a table modification command. * * @param Table $table * @param Fluent $command @@ -260,7 +260,7 @@ public function drop_primary(Table $table, Fluent $command) } /** - * Generate the SQL statement for a drop unqiue key command. + * Generate the SQL statement for a drop unique key command. * * @param Table $table * @param Fluent $command @@ -357,7 +357,7 @@ protected function type_float(Fluent $column) } /** - * Generate the data-type definintion for a decimal. + * Generate the data-type definition for a decimal. * * @param Fluent $column * @return string diff --git a/laravel/documentation/bundles.md b/laravel/documentation/bundles.md index 2f72dbb5..674deb25 100644 --- a/laravel/documentation/bundles.md +++ b/laravel/documentation/bundles.md @@ -21,7 +21,7 @@ ## The Basics ## Creating Bundles -The first step in creating a bundle is to create a folder for the bundle within your **bundles** directory. For this example, let's create an "admin" bundle, which could house the administrator back-end to our application. The **application/start.php** file provides some basic configuration that helps to define how our application will run. Likewise we'll create a **start.php** file within our new bundle folder for the same purpose. It is run everytime the bundle is loaded. Let's create it: +The first step in creating a bundle is to create a folder for the bundle within your **bundles** directory. For this example, let's create an "admin" bundle, which could house the administrator back-end to our application. The **application/start.php** file provides some basic configuration that helps to define how our application will run. Likewise we'll create a **start.php** file within our new bundle folder for the same purpose. It is run every time the bundle is loaded. Let's create it: #### Creating a bundle start.php file: diff --git a/laravel/documentation/database/eloquent.md b/laravel/documentation/database/eloquent.md index 0706b7d9..989570e6 100644 --- a/laravel/documentation/database/eloquent.md +++ b/laravel/documentation/database/eloquent.md @@ -223,7 +223,7 @@ ### One-To-Many return $this->has_many('Comment', 'my_foreign_key'); -You may be wondering: _If the dynamic properties return the relationship and require less keystokes, why would I ever use the relationship methods?_ Actually, relationship methods are very powerful. They allow you to continue to chain query methods before retrieving the relationship. Check this out: +You may be wondering: _If the dynamic properties return the relationship and require less keystrokes, why would I ever use the relationship methods?_ Actually, relationship methods are very powerful. They allow you to continue to chain query methods before retrieving the relationship. Check this out: echo Post::find(1)->comments()->order_by('votes', 'desc')->take(10)->get(); diff --git a/laravel/documentation/database/fluent.md b/laravel/documentation/database/fluent.md index 6ab34476..1f726540 100644 --- a/laravel/documentation/database/fluent.md +++ b/laravel/documentation/database/fluent.md @@ -169,7 +169,7 @@ ## Table Joins $join->on('users.id', '=', 'phone.user_id'); $join->or_on('users.id', '=', 'phone.contact_id'); }) - ->get(array('users.email', 'phone.numer')); + ->get(array('users.email', 'phone.number')); ## Ordering Results diff --git a/laravel/documentation/database/schema.md b/laravel/documentation/database/schema.md index 16ed318c..189dcf42 100644 --- a/laravel/documentation/database/schema.md +++ b/laravel/documentation/database/schema.md @@ -13,7 +13,7 @@ ## Contents ## The Basics -The Schema Bulder provides methods for creating and modifying your database tables. Using a fluent syntax, you can work with your tables without using any vendor specific SQL. +The Schema Builder provides methods for creating and modifying your database tables. Using a fluent syntax, you can work with your tables without using any vendor specific SQL. *Further Reading:* diff --git a/laravel/documentation/ioc.md b/laravel/documentation/ioc.md index bd393178..7df9572b 100644 --- a/laravel/documentation/ioc.md +++ b/laravel/documentation/ioc.md @@ -24,7 +24,7 @@ #### Registering a resolver in the IoC container: }); -Great! Now we have registered a resolver for SwiftMailer in our container. But, what if we don't want the container to create a new mailer instance every time we need one? Maybe we just want the container to return the same instance after the intial instance is created. Just tell the container the object should be a singleton: +Great! Now we have registered a resolver for SwiftMailer in our container. But, what if we don't want the container to create a new mailer instance every time we need one? Maybe we just want the container to return the same instance after the initial instance is created. Just tell the container the object should be a singleton: #### Registering a singleton in the container: diff --git a/laravel/documentation/localization.md b/laravel/documentation/localization.md index c928a49c..cbf4a463 100644 --- a/laravel/documentation/localization.md +++ b/laravel/documentation/localization.md @@ -55,7 +55,7 @@ #### Getting a language line in a given language: ## Place Holders & Replacements -Now, let's work on our welcome message. "Welcome to our website!" is a pretty generic message. It would be helpful to be able to specify the name of the person we are welcoming. But, creating a language line for each user of our application would be time-consuming and ridiculous. Thankfully, you don't have to. You can specify "place-holders" within your language lines. Place-holders are preceeded by a colon: +Now, let's work on our welcome message. "Welcome to our website!" is a pretty generic message. It would be helpful to be able to specify the name of the person we are welcoming. But, creating a language line for each user of our application would be time-consuming and ridiculous. Thankfully, you don't have to. You can specify "place-holders" within your language lines. Place-holders are preceded by a colon: #### Creating a language line with place-holders: diff --git a/laravel/documentation/logging.md b/laravel/documentation/logging.md index c1533387..74678c65 100644 --- a/laravel/documentation/logging.md +++ b/laravel/documentation/logging.md @@ -24,7 +24,7 @@ ## Logging To enable logging, set the **log** option in the error configuration to "true". When enabled, the Closure defined by the **logger** configuration item will be executed when an error occurs. This gives you total flexibility in how the error should be logged. You can even e-mail the errors to your development team! -By default, logs are stored in the **storage/logs** direcetory, and a new log file is created for each day. This keeps your log files from getting crowded with too many messages. +By default, logs are stored in the **storage/logs** directory, and a new log file is created for each day. This keeps your log files from getting crowded with too many messages. ## The Logger Class diff --git a/laravel/documentation/requests.md b/laravel/documentation/requests.md index 8498b3ed..5a7426e2 100644 --- a/laravel/documentation/requests.md +++ b/laravel/documentation/requests.md @@ -62,7 +62,7 @@ #### Determining if the current request is using HTTPS: // This request is over HTTPS! } -#### Determing if the current request is an AJAX request: +#### Determining if the current request is an AJAX request: if (Request::ajax()) { diff --git a/laravel/documentation/routing.md b/laravel/documentation/routing.md index 18c90671..ba741690 100644 --- a/laravel/documentation/routing.md +++ b/laravel/documentation/routing.md @@ -99,14 +99,14 @@ #### The default 404 event handler: You are free to change this to fit the needs of your application! -*Futher Reading:* +*Further Reading:* - *[Events](/docs/events)* ## Filters -Route filters may be run before or after a route is executed. If a "before" filter returns a value, that value is considered the response to the request and the route is not executed, which is conveniont when implementing authentication filters, etc. Filters are typically defined in **application/routes.php**. +Route filters may be run before or after a route is executed. If a "before" filter returns a value, that value is considered the response to the request and the route is not executed, which is convenient when implementing authentication filters, etc. Filters are typically defined in **application/routes.php**. #### Registering a filter: diff --git a/laravel/documentation/validation.md b/laravel/documentation/validation.md index 4da4683c..e8164109 100644 --- a/laravel/documentation/validation.md +++ b/laravel/documentation/validation.md @@ -344,7 +344,7 @@ #### Specifying a custom error message for a given attribute: However, if you are using many custom error messages, specifying inline may become cumbersome and messy. For that reason, you can specify your custom messages in the **custom** array within the validation language file: -#### Adding custom error messages to the validation langauge file: +#### Adding custom error messages to the validation language file: 'custom' => array( 'email_required' => 'We need to know your e-mail address!', diff --git a/laravel/documentation/views/html.md b/laravel/documentation/views/html.md index d1fcae9b..2dc0c152 100644 --- a/laravel/documentation/views/html.md +++ b/laravel/documentation/views/html.md @@ -15,7 +15,7 @@ ## Content ## Entities -When displaying user input in your Views, it is important to convert all characters which have signifance in HTML to their "entity" representation. +When displaying user input in your Views, it is important to convert all characters which have significance in HTML to their "entity" representation. For example, the < symbol should be converted to its entity representation. Converting HTML characters to their entity representation helps protect your application from cross-site scripting: diff --git a/laravel/documentation/views/templating.md b/laravel/documentation/views/templating.md index 8849f0e1..3887848d 100644 --- a/laravel/documentation/views/templating.md +++ b/laravel/documentation/views/templating.md @@ -10,7 +10,7 @@ ## Contents ## The Basics -Your application probably uses a common layout across most of its pages. Manually creating this layout within every controller action can be a pain. Specifying a controller layout will make your develompent much more enjoyable. Here's how to get started: +Your application probably uses a common layout across most of its pages. Manually creating this layout within every controller action can be a pain. Specifying a controller layout will make your development much more enjoyable. Here's how to get started: #### Specify a "layout" property on your controller: diff --git a/laravel/error.php b/laravel/error.php index 729f632a..ac2e4d15 100644 --- a/laravel/error.php +++ b/laravel/error.php @@ -60,7 +60,7 @@ public static function native($code, $error, $file, $line) { if (error_reporting() === 0) return; - // For a PHP error, we'll create an ErrorExcepetion and then feed that + // For a PHP error, we'll create an ErrorException and then feed that // exception to the exception method, which will create a simple view // of the exception details for the developer. $exception = new \ErrorException($error, $code, 0, $file, $line); @@ -80,7 +80,7 @@ public static function native($code, $error, $file, $line) */ public static function shutdown() { - // If a fatal error occured that we have not handled yet, we will + // If a fatal error occurred that we have not handled yet, we will // create an ErrorException and feed it to the exception handler, // as it will not yet have been handled. $error = error_get_last(); diff --git a/laravel/file.php b/laravel/file.php index efb46dec..f7f71805 100644 --- a/laravel/file.php +++ b/laravel/file.php @@ -296,7 +296,7 @@ public static function rmdir($directory, $preserve = false) { // If the item is a directory, we can just recurse into the // function and delete that sub-directory, otherwise we'll - // just deleete the file and keep going! + // just delete the file and keep going! if ($item->isDir()) { static::rmdir($item->getRealPath()); diff --git a/laravel/html.php b/laravel/html.php index da55012a..c8956b1c 100644 --- a/laravel/html.php +++ b/laravel/html.php @@ -359,7 +359,7 @@ public static function attributes($attributes) foreach ((array) $attributes as $key => $value) { // For numeric keys, we will assume that the key and the value are the - // same, as this will conver HTML attributes such as "required" that + // same, as this will convert HTML attributes such as "required" that // may be specified as required="required", etc. if (is_numeric($key)) $key = $value; diff --git a/laravel/ioc.php b/laravel/ioc.php index 11292925..b5301e32 100644 --- a/laravel/ioc.php +++ b/laravel/ioc.php @@ -179,7 +179,7 @@ protected static function build($type, $parameters = array()) /** * Resolve all of the dependencies from the ReflectionParameters. * - * @param array $parameterrs + * @param array $parameters * @return array */ protected static function dependencies($parameters) diff --git a/laravel/lang.php b/laravel/lang.php index 8fd5f7ba..fd3bf177 100644 --- a/laravel/lang.php +++ b/laravel/lang.php @@ -134,7 +134,7 @@ public function get($language = null, $default = null) $line = array_get($lines, $line, $default); // If the line is not a string, it probably means the developer asked for - // the entire langauge file and the value of the requested value will be + // the entire language file and the value of the requested value will be // an array containing all of the lines in the file. if (is_string($line)) { diff --git a/laravel/laravel.php b/laravel/laravel.php index a1ca2061..e00ed40e 100644 --- a/laravel/laravel.php +++ b/laravel/laravel.php @@ -54,7 +54,7 @@ |-------------------------------------------------------------------------- | | By setting error reporting to -1, we essentially force PHP to report -| every error, and this is guranteed to show every error on future +| every error, and this is guaranteed to show every error on future | releases of PHP. This allows everything to be fixed early! | */ @@ -143,7 +143,7 @@ |-------------------------------------------------------------------------- | | If a session driver has been configured, we will save the session to -| storage so it is avaiable for the next request. This will also set +| storage so it is available for the next request. This will also set | the session cookie in the cookie jar to be sent to the user. | */ diff --git a/laravel/redis.php b/laravel/redis.php index d00b2f52..02267d32 100644 --- a/laravel/redis.php +++ b/laravel/redis.php @@ -17,7 +17,7 @@ class Redis { protected $port; /** - * The databse number the connection selects on load. + * The database number the connection selects on load. * * @var int */ diff --git a/laravel/response.php b/laravel/response.php index b6fa4d84..338aa0e3 100644 --- a/laravel/response.php +++ b/laravel/response.php @@ -106,7 +106,7 @@ public static function json($data, $status = 200, $headers = array()) * return Response::eloquent($data, 200, array('header' => 'value')); * * - * @param Eloquenet|array $data + * @param Eloquent|array $data * @param int $status * @param array $headers * @return Response diff --git a/laravel/routing/router.php b/laravel/routing/router.php index 7c4888a2..5a93752e 100644 --- a/laravel/routing/router.php +++ b/laravel/routing/router.php @@ -303,7 +303,7 @@ public static function controller($controllers, $defaults = 'index', $https = nu { list($bundle, $controller) = Bundle::parse($identifier); - // First we need to replace the dots with slashes in thte controller name + // First we need to replace the dots with slashes in the controller name // so that it is in directory format. The dots allow the developer to use // a cleaner syntax when specifying the controller. We will also grab the // root URI for the controller's bundle. diff --git a/laravel/session/drivers/database.php b/laravel/session/drivers/database.php index c094a91f..d151ee53 100644 --- a/laravel/session/drivers/database.php +++ b/laravel/session/drivers/database.php @@ -84,7 +84,7 @@ public function delete($id) } /** - * Delete all expired sessions from persistant storage. + * Delete all expired sessions from persistent storage. * * @param int $expiration * @return void diff --git a/laravel/session/drivers/driver.php b/laravel/session/drivers/driver.php index 8a54ac98..e5cef1ee 100644 --- a/laravel/session/drivers/driver.php +++ b/laravel/session/drivers/driver.php @@ -63,7 +63,7 @@ public function id() return Str::random(40); } - // We'll containue generating random IDs until we find an ID that is + // We'll continue generating random IDs until we find an ID that is // not currently assigned to a session. This is almost definitely // going to happen on the first iteration. do { diff --git a/laravel/validator.php b/laravel/validator.php index 3290bc17..09eb6f29 100644 --- a/laravel/validator.php +++ b/laravel/validator.php @@ -953,7 +953,7 @@ protected function attribute($attribute) // If no language line has been specified for the attribute, all of // the underscores are removed from the attribute name and that - // will be used as the attribtue name. + // will be used as the attribute name. else { return str_replace('_', ' ', $attribute); diff --git a/paths.php b/paths.php index 3a6622ff..78d5a02f 100644 --- a/paths.php +++ b/paths.php @@ -10,7 +10,7 @@ /* |---------------------------------------------------------------- -| Application Environemtns +| Application Environments |---------------------------------------------------------------- | | Laravel takes a dead simple approach to environments, and we From c667788be7d7f13b74afcc96994526c3d748054b Mon Sep 17 00:00:00 2001 From: Purwandi Date: Fri, 27 Jul 2012 22:34:41 +0700 Subject: [PATCH 153/260] Add decimal schema on docs Signed-off-by: Purwandi --- laravel/documentation/database/schema.md | 1 + 1 file changed, 1 insertion(+) diff --git a/laravel/documentation/database/schema.md b/laravel/documentation/database/schema.md index 65c4e6ca..584a9139 100644 --- a/laravel/documentation/database/schema.md +++ b/laravel/documentation/database/schema.md @@ -62,6 +62,7 @@ ## Adding Columns `$table->string('name', 100);` | VARCHAR equivalent with a length `$table->integer('votes');` | INTEGER equivalent to the table `$table->float('amount');` | FLOAT equivalent to the table +`$table->decimal('amount', 5, 2);` | DECIMAL equivalent with a precision and scale `$table->boolean('confirmed');` | BOOLEAN equivalent to the table `$table->date('created_at');` | DATE equivalent to the table `$table->timestamp('added_on');` | TIMESTAMP equivalent to the table From 3e699a19788854cb103c4e59cfce9cfbc01de30c Mon Sep 17 00:00:00 2001 From: Spir Date: Fri, 27 Jul 2012 18:18:04 +0200 Subject: [PATCH 154/260] Added french translation. Signed-off-by: Spir --- application/language/fr/pagination.php | 19 +++++ application/language/fr/validation.php | 99 ++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 application/language/fr/pagination.php create mode 100644 application/language/fr/validation.php diff --git a/application/language/fr/pagination.php b/application/language/fr/pagination.php new file mode 100644 index 00000000..30b85534 --- /dev/null +++ b/application/language/fr/pagination.php @@ -0,0 +1,19 @@ + '« Précédent', + 'next' => 'Suivant »', + +); diff --git a/application/language/fr/validation.php b/application/language/fr/validation.php new file mode 100644 index 00000000..f5810be8 --- /dev/null +++ b/application/language/fr/validation.php @@ -0,0 +1,99 @@ + "Le champ :attribute doit être accepté.", + "active_url" => "Le champ :attribute n'est pas une URL valide.", + "after" => "Le champ :attribute doit être une date après :date.", + "alpha" => "Le champ :attribute ne doit contenir que des lettres.", + "alpha_dash" => "Le champ :attribute ne doit contenir que des lettres, nombres et des tirets.", + "alpha_num" => "Le champ :attribute ne doit contenir que des lettres et nombres.", + "before" => "Le champ :attribute doit être une date avant :date.", + "between" => array( + "numeric" => "Le champ :attribute doit être entre :min - :max.", + "file" => "Le champ :attribute doit être entre :min - :max kilo-octets.", + "string" => "Le champ :attribute doit être entre :min - :max caractères.", + ), + "confirmed" => "Le champ :attribute confirmation est différent.", + "different" => "Les champ :attribute et :other doivent être différents.", + "email" => "Le format du champ :attribute est invalide.", + "exists" => "Le champ sélectionné :attribute est invalide.", + "image" => "Le champ :attribute doit être une image.", + "in" => "Le champ sélectionné :attribute est invalide.", + "integer" => "Le champ :attribute doit être un entier.", + "ip" => "Le champ :attribute doit être une adresse IP valide.", + "match" => "Le format du champ :attribute est invalide.", + "max" => array( + "numeric" => "Le :attribute doit être plus petit que :max.", + "file" => "Le :attribute doit être plus petit que :max kilo-octets.", + "string" => "Le :attribute doit être plus petit que :max caractères.", + ), + "mimes" => "Le champ :attribute doit être un fichier de type: :values.", + "min" => array( + "numeric" => "Le champ :attribute doit être au moins :min.", + "file" => "Le champ :attribute doit être au moins :min kilo-octets.", + "string" => "Le champ :attribute doit être au moins :min caractères.", + ), + "not_in" => "Le champ sélectionné :attribute est invalide.", + "numeric" => "Le champ :attribute doit être un nombre.", + "required" => "Le champ :attribute est requis", + "same" => "Le champ :attribute et :other doivent être identique.", + "size" => array( + "numeric" => "Le champ :attribute doit être :size.", + "file" => "Le champ :attribute doit être de :size kilo-octets.", + "string" => "Le champ :attribute doit être de :size caractères.", + ), + "unique" => "Le champ :attribute est déjà utilisé.", + "url" => "Le champ :attribute à un format invalide.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); From 5622f6e35ced71674f85d8c366168bf4711eeaa7 Mon Sep 17 00:00:00 2001 From: Jakobud Date: Fri, 27 Jul 2012 11:28:40 -0600 Subject: [PATCH 155/260] Added basic GitHub contribution docs. --- laravel/documentation/contents.md | 10 ++++++++- laravel/documentation/contrib/github.md | 30 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 laravel/documentation/contrib/github.md diff --git a/laravel/documentation/contents.md b/laravel/documentation/contents.md index 14b819a4..7b67f188 100644 --- a/laravel/documentation/contents.md +++ b/laravel/documentation/contents.md @@ -108,4 +108,12 @@ ### Artisan CLI - [Creating & Running Tasks](/docs/artisan/tasks#creating-tasks) - [Bundle Tasks](/docs/artisan/tasks#bundle-tasks) - [CLI Options](/docs/artisan/tasks#cli-options) -- [Commands](/docs/artisan/commands) \ No newline at end of file +- [Commands](/docs/artisan/commands) + +### Contributing + +- [Coding Standards](docs/contrib/coding) +- [Laravel on GitHub](docs/contrib/github) +- [Command Line](docs/contrib/command-line) +- [TortoiseGit](docs/contrib/tortoisegit) + diff --git a/laravel/documentation/contrib/github.md b/laravel/documentation/contrib/github.md new file mode 100644 index 00000000..3ffa734f --- /dev/null +++ b/laravel/documentation/contrib/github.md @@ -0,0 +1,30 @@ +# Laravel on GitHub + +## Contents + +- [The Basics](#the-basics) +- [Repositories](#repositoriess) +- [Branches](#branches) + + +## The Basics + +Because Laravel's development and source control is done through GitHub, anyone is able to make contributions to it. Anyone can fix bugs, add features or improve the documentation. + +After submitting proposed changes to the project, the Laravel project managers will review the changes and make the decision to commit them to Laravel's core. + + +## Repositories + +Laravel's home on GitHub is at [github.com/laravel](https://github.com/laravel). Laravel has several repositories. For basic contributions, the only repository you need to pay attention to is the **laravel** repository, located at [github.com/laravel/laravel](https://github.com/laravel/laravel). + + +## Branches + +The **laravel** repository has multiple branches, each serving a specific purpose: + +- **master** - This is the Laravel release branch. Active development does not happen on this branch. This branch is only for the most recent, stable Laravel core code. When you download Laravel from [laravel.com](http://laravel.com/), you are downloading directly from this master branch. *Do not make pull requests to this branch.* +- **staging** - I'm not sure what this is for... Last minute testing before pushing develop to master? +- **develop** - This is the working development branch. All proposed code changes and contributions by the community are pulled into this branch. *When you make a pull request to the Laravel project, this is the branch you want to pull-request into.* + +Once certain milestones have been reached and Taylor Otwell and other Laravel project managers are happy with the stability and additional features of the current development branch, the changes in the **develop** branch are pulled into the **master** branch, thus creating and releasing the newest stable version of Laravel for the world to use. From ce7de95a1b9b87dd848cfe3212b1ba8dd599e73b Mon Sep 17 00:00:00 2001 From: Norbert Csaba Herczeg Date: Sat, 28 Jul 2012 11:09:29 +0200 Subject: [PATCH 156/260] Added Hungarian language pack Signed-off-by: Norbert Csaba Herczeg --- application/language/hu/pagination.php | 19 +++++ application/language/hu/validation.php | 99 ++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 application/language/hu/pagination.php create mode 100644 application/language/hu/validation.php diff --git a/application/language/hu/pagination.php b/application/language/hu/pagination.php new file mode 100644 index 00000000..00104344 --- /dev/null +++ b/application/language/hu/pagination.php @@ -0,0 +1,19 @@ + '« Előző', + 'next' => 'Következő »', + +); \ No newline at end of file diff --git a/application/language/hu/validation.php b/application/language/hu/validation.php new file mode 100644 index 00000000..30b2a0ca --- /dev/null +++ b/application/language/hu/validation.php @@ -0,0 +1,99 @@ + "A(z) :attribute el kell legyen fogadva.", + "active_url" => "A :attribute nem valós URL.", + "after" => "A :attribute :date utáni dátum kell legyen.", + "alpha" => "A(z) :attribute csak betűket tartalmazhat.", + "alpha_dash" => "A(z) :attribute betűket, számokat és kötőjeleket tartalmazhat.", + "alpha_num" => "A(z) :attribute csak betűket és számokat tartalmazhat.", + "before" => "A :attribute :date előtti dátum kell legyen.", + "between" => array( + "numeric" => "A(z) :attribute :min - :max közötti érték kell legyen.", + "file" => "A(z) :attribute :min - :max kilobyte között kell legyen.", + "string" => "A(z) :attribute :min - :max karakterhossz között kell legyen", + ), + "confirmed" => "A(z) :attribute megerősítése nem egyezett meg.", + "different" => "A(z) :attribute és :other különböző kell legyen.", + "email" => "A(z) :attribute formátuma nem megfelelő.", + "exists" => "A(z) választott :attribute nem megfelelő.", + "image" => "A(z) :attribute kép kell legyen.", + "in" => "A(z) választott :attribute nem megfelelő.", + "integer" => "A :attribute szám kell legyen.", + "ip" => "A :attribute valós IP cím kell legyen.", + "match" => "A(z) :attribute formátuma nem megfelelő.", + "max" => array( + "numeric" => "A :attribute kevesebb kell legyen, mint :max.", + "file" => "A :attribute kevesebb kell legyen :max kilobytenál.", + "string" => "A :attribute kevesebb karakterből kell álljon, mint :max.", + ), + "mimes" => "A :attribute az alábbi tipusokból való kell legyen :values.", + "min" => array( + "numeric" => "A :attribute legalább :min kell legyen.", + "file" => "A :attribute legalább :min kilobyte kell legyen.", + "string" => "A :attribute legalább :min karakter hosszú kell legyen.", + ), + "not_in" => "A választott :attribute nem megfelelő.", + "numeric" => "A :attribute szám kell legyen.", + "required" => "A(z) :attribute megadása kötelező.", + "same" => "A :attribute és a :other muszáj hogy megegyezzen.", + "size" => array( + "numeric" => "A(z) :attribute :size kell legyen.", + "file" => "A(z) :attribute :size kilobyteos kell legyen.", + "string" => "A(z) :attribute :size karakteres kell legyen.", + ), + "unique" => "A(z) :attribute már foglalt.", + "url" => "A(z) :attribute formátuma nem megfelelő.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file From a497a3efcb95d1b8761c94475f1d2419cffaf814 Mon Sep 17 00:00:00 2001 From: Tao Wu Date: Sat, 28 Jul 2012 13:58:11 +0200 Subject: [PATCH 157/260] changed header to data --- laravel/documentation/views/home.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/laravel/documentation/views/home.md b/laravel/documentation/views/home.md index e74a0c43..fa74b0c2 100644 --- a/laravel/documentation/views/home.md +++ b/laravel/documentation/views/home.md @@ -54,9 +54,10 @@ #### Returning a custom response: return Response::make('Hello World!', 200, $headers); }); -#### Returning a custom response containing a view: +#### Returning a custom response containing a view, with binding data: - return Response::view('home', $headers); + $data = array('foo' => 'bar'); + return Response::view('home', $data); #### Returning a JSON response: @@ -257,4 +258,4 @@ #### Generating a 404 error response: #### Generating a 500 error response: - return Response::error('500'); \ No newline at end of file + return Response::error('500'); From 65ccdef48d9e6338596e826ccb7ce102ce845786 Mon Sep 17 00:00:00 2001 From: BeQuery Date: Sat, 28 Jul 2012 15:18:46 +0200 Subject: [PATCH 158/260] Dutch language pack Added dutch translation --- application/language/nl/pagination.php | 19 +++++ application/language/nl/validation.php | 99 ++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 application/language/nl/pagination.php create mode 100644 application/language/nl/validation.php diff --git a/application/language/nl/pagination.php b/application/language/nl/pagination.php new file mode 100644 index 00000000..69487a4a --- /dev/null +++ b/application/language/nl/pagination.php @@ -0,0 +1,19 @@ + '« Vorige', + 'next' => 'Volgende »', + +); \ No newline at end of file diff --git a/application/language/nl/validation.php b/application/language/nl/validation.php new file mode 100644 index 00000000..33c702c2 --- /dev/null +++ b/application/language/nl/validation.php @@ -0,0 +1,99 @@ + "De :attribute moet worden geaccepteerd.", + "active_url" => "De :attribute is geen geldige URL.", + "after" => "De :attribute moet een datum zijn na :date.", + "alpha" => "De :attribute mag alleen letters bevatten.", + "alpha_dash" => "De :attribute mag alleen letters, nummers, en strepen bevatten.", + "alpha_num" => "De :attribute mag alleen letters en nummers bevatten", + "before" => "De :attribute moet een datim zijn voor :date.", + "between" => array( + "numeric" => "De :attribute moet tussen :min - :max zijn.", + "file" => "De :attribute moet tussen :min - :max kilobytes zijn.", + "string" => "De :attribute moet tussen :min - :max karakters zijn.", + ), + "confirmed" => "De :attribute bevestiging komt niet overeen.", + "different" => "De :attribute en :other moeten verschillen van elkaar.", + "email" => "De :attribute is ongeldig.", + "exists" => "De geselecteerde :attribute is ongeldig.", + "image" => "De :attribute moet een plaatje zijn.", + "in" => "De geselecteerde :attribute is ongeldig.", + "integer" => "De :attribute moet een heel getal zijn.", + "ip" => "De :attribute moet een geldig IP-adres zijn.", + "match" => "De :attribute formaat is ongeldig.", + "max" => array( + "numeric" => "De :attribute moet minder zijn als :max.", + "file" => "De :attribute moet kleiner zijn als :max kilobytes.", + "string" => "De :attribute moet korter zijn dan :max karakters.", + ), + "mimes" => "De :attribute moet een van de volgende bestandsformaten :values bevatten", + "min" => array( + "numeric" => "De :attribute moet meer zijn als :min.", + "file" => "De :attribute moet groter zijn als :min kilobytes.", + "string" => "De :attribute moet langer zijn dan :min karakters.", + ), + "not_in" => "De geselecteerde :attribute is ongeldig.", + "numeric" => "De :attribute moet een nummer zijn.", + "required" => "De :attribute veld is vereist.", + "same" => "De :attribute en :other moeten overeen komen.", + "size" => array( + "numeric" => "De :attribute moet :size groot zijn.", + "file" => "De :attribute moet :size kilobytes groot zijn.", + "string" => "De :attribute moet :size karakters bevatten.", + ), + "unique" => "De :attribute bestaat al.", + "url" => "De :attribute formaat is ongeldig.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file From 0dd1af665fc7f7b96235abc3e8041e872f2a963e Mon Sep 17 00:00:00 2001 From: Tao Wu Date: Sun, 29 Jul 2012 12:44:58 +0200 Subject: [PATCH 159/260] changes binding data variable to an array --- laravel/documentation/views/home.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/laravel/documentation/views/home.md b/laravel/documentation/views/home.md index fa74b0c2..27383562 100644 --- a/laravel/documentation/views/home.md +++ b/laravel/documentation/views/home.md @@ -56,8 +56,7 @@ #### Returning a custom response: #### Returning a custom response containing a view, with binding data: - $data = array('foo' => 'bar'); - return Response::view('home', $data); + return Response::view('home', array('foo' => 'bar')); #### Returning a JSON response: From 5eef0023742f32fb408e8203a3d985bb8e532538 Mon Sep 17 00:00:00 2001 From: apathetic012 Date: Sun, 29 Jul 2012 19:12:44 +0800 Subject: [PATCH 160/260] add output of File::mime() example Signed-off-by: apathetic012 --- laravel/documentation/files.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/files.md b/laravel/documentation/files.md index a27d10e5..2a3d055d 100644 --- a/laravel/documentation/files.md +++ b/laravel/documentation/files.md @@ -65,7 +65,7 @@ ## Getting MIME Types #### Getting the MIME type associated with an extension: - echo File::mime('gif'); + echo File::mime('gif'); // outputs 'image/gif' > **Note:** This method simply returns the MIME type defined for the extension in the **application/config/mimes.php** file. From c7890bcdc3fb8febd0664ec98d2e61b68c0b3724 Mon Sep 17 00:00:00 2001 From: J Bruni Date: Sun, 29 Jul 2012 09:01:16 -0300 Subject: [PATCH 161/260] Update laravel/documentation/controllers.md Included missing verb in "Bundles can easily configured" sentence. --- laravel/documentation/controllers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/controllers.md b/laravel/documentation/controllers.md index 220c10af..0f8555f2 100644 --- a/laravel/documentation/controllers.md +++ b/laravel/documentation/controllers.md @@ -49,7 +49,7 @@ ## Controller Routing ## Bundle Controllers -Bundles are Laravel's modular package system. Bundles can easily configured to handle requests to your application. We'll be going over [bundles in more detail](/docs/bundles) in another document. +Bundles are Laravel's modular package system. Bundles can be easily configured to handle requests to your application. We'll be going over [bundles in more detail](/docs/bundles) in another document. Creating controllers that belong to bundles is almost identical to creating your application controllers. Just prefix the controller class name with the name of the bundle, so if your bundle is named "admin", your controller classes would look like this: From 37dbeef2bb15b068ae6bb6bba463848883770a19 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 30 Jul 2012 13:48:55 +0300 Subject: [PATCH 162/260] Use LARAVEL_START constant to calculate request time. Suggested by @Kindari. --- laravel/request.php | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/laravel/request.php b/laravel/request.php index a37360a2..306a94c1 100644 --- a/laravel/request.php +++ b/laravel/request.php @@ -181,20 +181,11 @@ public static function referrer() /** * Get the timestamp of the time when the request was started. * - * The value is actually calculated when this function gets first called. - * * @return int */ public static function time() { - static $time; - - if (!isset($time)) - { - $time = time(); - } - - return $time; + return (int) LARAVEL_START; } /** From 72d091ee5471c08e1649e5561771c9b81eb1c71c Mon Sep 17 00:00:00 2001 From: Jakobud Date: Mon, 30 Jul 2012 10:19:42 -0600 Subject: [PATCH 163/260] Added first draft of command-line contributing docs. Added empty files for coding standards and tortoisegit docs. Adjusted Contributions in the Table of Contents sidebar. Signed-off-by: Jakobud --- laravel/documentation/contents.md | 2 +- laravel/documentation/contrib/coding.md | 0 laravel/documentation/contrib/command-line.md | 123 ++++++++++++++++++ laravel/documentation/contrib/github.md | 4 +- laravel/documentation/contrib/tortoisegit.md | 0 5 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 laravel/documentation/contrib/coding.md create mode 100644 laravel/documentation/contrib/command-line.md create mode 100644 laravel/documentation/contrib/tortoisegit.md diff --git a/laravel/documentation/contents.md b/laravel/documentation/contents.md index 7b67f188..288b0b68 100644 --- a/laravel/documentation/contents.md +++ b/laravel/documentation/contents.md @@ -112,8 +112,8 @@ ### Artisan CLI ### Contributing -- [Coding Standards](docs/contrib/coding) - [Laravel on GitHub](docs/contrib/github) - [Command Line](docs/contrib/command-line) - [TortoiseGit](docs/contrib/tortoisegit) +- [Coding Standards](docs/contrib/coding) diff --git a/laravel/documentation/contrib/coding.md b/laravel/documentation/contrib/coding.md new file mode 100644 index 00000000..e69de29b diff --git a/laravel/documentation/contrib/command-line.md b/laravel/documentation/contrib/command-line.md new file mode 100644 index 00000000..e50e1758 --- /dev/null +++ b/laravel/documentation/contrib/command-line.md @@ -0,0 +1,123 @@ +# Command Line + +## Contents + - [Getting Started](#getting-started) + - [Forking Laravel](#forking-laravel) + - [Cloning Laravel](#cloning-laravel) + - [Creating Branches](#creating-branches) + - [Committing](#committing) + - [Submitting a Pull Request](#submitting-a-pull-request) + - [What's Next?](#whats-next) + + +## Getting Started + +This tutorial explains the basics of contributing to a project on [GitHub](https://github.com/). The workflow can apply to most projects on GitHub, but in this case, we will be focused on the [Laravel](https://github.com/laravel/laravel) project. + +This tutorial assumes that you have installed [Git](http://git-scm.com/) and that you have created a [GitHub account](https://github.com/signup/free). If you haven't already, look at the documentation for [Laravel on GitHub](/docs/contrib/github) in order to familiarize yourself with Laravel's repositories and branches. + +*[Jason Lewis](http://jasonlewis.me/)'s blog post on [Contributing to a GitHub Project](http://jasonlewis.me/blog/2012/06/how-to-contributing-to-a-github-project) was the inspiration for this tutorial.* + + +## Forking Laravel + +Login to GitHub and visit the [Laravel Repository](https://github.com/laravel/laravel). Click on the **Fork** button. This will create your own fork of Laravel in your own GitHub account. Your Laravel fork will be located at **https://github.com/username/laravel** (your GitHub username will be used in place of *username*). + + +## Cloning Laravel + +Open up the command-line or terminal and make a new directory where you can make development changes to Laravel: + + # mkdir laravel-develop + # cd laravel-develop + +Next, clone the Laravel repository (not your fork you made): + + # git clone https://github.com/laravel/laravel.git . + +The reason you are cloning the original Laravel repository (and not the fork you made) is so you can use it to always have the latest Laravel development code. If you simply clone the fork you made, you would have to re-fork the Laravel repository again every time you want the latest changes to Laravel development code. + +Next, it's time to add the fork you made as a **remote repository**: + + # git remote add fork git@github.com:username/laravel.git + +Remember to replace **username** with your GitHub username. *This is case-sensitive*. You can verify that your fork was added by typing: + + # git remote + +Now you have a pristine clone of the Laravel repository along with your fork as a remote repository. You are ready to begin branching for new features or fixing bugs. + + +## Creating Branches + +First, make sure you are working in the **develop** branch. If you submit changes to the **master** branch, it is unlikely they will be pulled in anytime in the near future. For more information on this, read the documentation for [Laravel on GitHub](/docs/contrib/github). To switch to the develop branch: + + # git checkout develop + +Next, you want to make sure you are up-to-date with the latest Laravel repository. If any new features or bug fixes have been added to the Laravel project since you cloned it, this will ensure that your local repository has all of those changes. This important step is the reason we originally cloned the Laravel repository instead of your own fork. + + # git pull origin develop + +Now you are ready to create a new branch. + +> **Create a new branch for every new feature or bug-fix.** Why? Let's say you make a new branch and add 5 different new features and fix 12 bugs. If one or more of your new features or bug-fixes are rejected by the Laravel team (for whatever reason) your entire pull request will be ignored, even if most of your new features or bug-fixes are perfect. On top of this, separate branches will encourage organization and limit interdependency between new features and bug-fixes that you add. + +When you create a new branch, use a self-descriptive naming convention. For example, if there is a bug in Eloquent that you want to fix, name your branch accordingly: + + # git branch bug/eloquent + # git checkout bug/eloquent + Switched to branch 'bug/eloquent' + +Or if there is a new feature or change to the documentation that you want to make, for example, the localization documentation: + + # git branch feature/localization-docs + # git checkout feature/localization-docs + Switched to branch 'feature/localization-docs' + +Now that you have created your own branch and have switched to it, it's time to make your changes to the code. Add your new feature or fix that bug. + + +## Committing + +Now that you have finished coding and testing your changes, it's time to commit them to your local repository. First, add the files that you changed/added: + + # git add laravel/documentation/localization.md + +Next, commit the changes to the repository: + + # git commit -s -m "I added some more stuff to the Localization documentation." + + - **-s** means that you are signing-off on your commit with your name. This tells the Laravel team know that you personally agree to your code being added to the Laravel core. + - **-m** is the message that goes with your commit. Provide a brief explanation of what you added or changed. + + +## Pushing to your Fork + +Now that your local repository has your committed changes, it's time to push (or sync) your new branch to your fork that is hosted in GitHub: + + # git push fork feature/localization-docs + + +## Submitting a Pull Request + +The final step is to submit a pull request to the Laravel repository. This means that you are requesting that the Laravel team pull and merge your changes to the Laravel core. In your browser, visit your Laravel fork at [https://github.com/username/laravel](https://github.com/username/laravel). Click on **Pull Request**. Next, make sure you choose the proper base and head repositories and branches: + + - **base repo:** laravel/laravel + - **base branch:** develop + - **head repo:** username/laravel + - **head branch:** feature/localization-docs + +Use the form to write a more detailed description of the changes you made and why you made them. Finally, click **Send pull request**. That's it! The changes you made have been submitted to the Laravel team. + + +## What's Next? + +Do you have another feature you want to add or another bug you need to fix? First, make sure you always base your new branch off of the develop branch: + + # git checkout develop + +Then, pull down the latest changes from Laravel's repository: + + # git pull origin develop + +Now you are ready to create a new branch and start coding again! diff --git a/laravel/documentation/contrib/github.md b/laravel/documentation/contrib/github.md index 3ffa734f..5d0003ad 100644 --- a/laravel/documentation/contrib/github.md +++ b/laravel/documentation/contrib/github.md @@ -11,7 +11,7 @@ ## The Basics Because Laravel's development and source control is done through GitHub, anyone is able to make contributions to it. Anyone can fix bugs, add features or improve the documentation. -After submitting proposed changes to the project, the Laravel project managers will review the changes and make the decision to commit them to Laravel's core. +After submitting proposed changes to the project, the Laravel team will review the changes and make the decision to commit them to Laravel's core. ## Repositories @@ -27,4 +27,4 @@ ## Branches - **staging** - I'm not sure what this is for... Last minute testing before pushing develop to master? - **develop** - This is the working development branch. All proposed code changes and contributions by the community are pulled into this branch. *When you make a pull request to the Laravel project, this is the branch you want to pull-request into.* -Once certain milestones have been reached and Taylor Otwell and other Laravel project managers are happy with the stability and additional features of the current development branch, the changes in the **develop** branch are pulled into the **master** branch, thus creating and releasing the newest stable version of Laravel for the world to use. +Once certain milestones have been reached and/or Taylor Otwell and the Laravel team is happy with the stability and additional features of the current development branch, the changes in the **develop** branch are pulled into the **master** branch, thus creating and releasing the newest stable version of Laravel for the world to use. diff --git a/laravel/documentation/contrib/tortoisegit.md b/laravel/documentation/contrib/tortoisegit.md new file mode 100644 index 00000000..e69de29b From fd6e73aaa726e273c8f6f52d0d9f1e836c0bedee Mon Sep 17 00:00:00 2001 From: Jakobud Date: Mon, 30 Jul 2012 12:12:07 -0600 Subject: [PATCH 164/260] Added TortoiseGit contribution docs. Revised Command-Line contribution docs. Signed-off-by: Jakobud --- laravel/documentation/contrib/command-line.md | 30 +++-- laravel/documentation/contrib/github.md | 5 + laravel/documentation/contrib/tortoisegit.md | 113 ++++++++++++++++++ 3 files changed, 135 insertions(+), 13 deletions(-) diff --git a/laravel/documentation/contrib/command-line.md b/laravel/documentation/contrib/command-line.md index e50e1758..d662e806 100644 --- a/laravel/documentation/contrib/command-line.md +++ b/laravel/documentation/contrib/command-line.md @@ -1,9 +1,10 @@ -# Command Line +# Contributing to Laravel via Command-Line ## Contents - [Getting Started](#getting-started) - [Forking Laravel](#forking-laravel) - [Cloning Laravel](#cloning-laravel) + - [Adding your Fork](#adding-your-fork) - [Creating Branches](#creating-branches) - [Committing](#committing) - [Submitting a Pull Request](#submitting-a-pull-request) @@ -12,11 +13,9 @@ ## Contents ## Getting Started -This tutorial explains the basics of contributing to a project on [GitHub](https://github.com/). The workflow can apply to most projects on GitHub, but in this case, we will be focused on the [Laravel](https://github.com/laravel/laravel) project. +This tutorial explains the basics of contributing to a project on [GitHub](https://github.com/) via the command-line. The workflow can apply to most projects on GitHub, but in this case, we will be focused on the [Laravel](https://github.com/laravel/laravel) project. This tutorial is applicable to OSX, Linux and Windows. -This tutorial assumes that you have installed [Git](http://git-scm.com/) and that you have created a [GitHub account](https://github.com/signup/free). If you haven't already, look at the documentation for [Laravel on GitHub](/docs/contrib/github) in order to familiarize yourself with Laravel's repositories and branches. - -*[Jason Lewis](http://jasonlewis.me/)'s blog post on [Contributing to a GitHub Project](http://jasonlewis.me/blog/2012/06/how-to-contributing-to-a-github-project) was the inspiration for this tutorial.* +This tutorial assumes you have installed [Git](http://git-scm.com/) and you have created a [GitHub account](https://github.com/signup/free). If you haven't already, look at the [Laravel on GitHub](/docs/contrib/github) documentation in order to familiarize yourself with Laravel's repositories and branches. ## Forking Laravel @@ -35,13 +34,16 @@ ## Cloning Laravel # git clone https://github.com/laravel/laravel.git . -The reason you are cloning the original Laravel repository (and not the fork you made) is so you can use it to always have the latest Laravel development code. If you simply clone the fork you made, you would have to re-fork the Laravel repository again every time you want the latest changes to Laravel development code. +> **Note**: The reason you are cloning the original Laravel repository (and not the fork you made) is so you can always pull down the most recent changes from the Laravel repository to your local repository. + + +## Adding your Fork Next, it's time to add the fork you made as a **remote repository**: # git remote add fork git@github.com:username/laravel.git -Remember to replace **username** with your GitHub username. *This is case-sensitive*. You can verify that your fork was added by typing: +Remember to replace *username** with your GitHub username. *This is case-sensitive*. You can verify that your fork was added by typing: # git remote @@ -58,22 +60,20 @@ ## Creating Branches # git pull origin develop -Now you are ready to create a new branch. - -> **Create a new branch for every new feature or bug-fix.** Why? Let's say you make a new branch and add 5 different new features and fix 12 bugs. If one or more of your new features or bug-fixes are rejected by the Laravel team (for whatever reason) your entire pull request will be ignored, even if most of your new features or bug-fixes are perfect. On top of this, separate branches will encourage organization and limit interdependency between new features and bug-fixes that you add. - -When you create a new branch, use a self-descriptive naming convention. For example, if there is a bug in Eloquent that you want to fix, name your branch accordingly: +Now you are ready to create a new branch for your new feature or bug-fix. When you create a new branch, use a self-descriptive naming convention. For example, if you are going to fix a bug in Eloquent, name your branch *bug/eloquent*: # git branch bug/eloquent # git checkout bug/eloquent Switched to branch 'bug/eloquent' -Or if there is a new feature or change to the documentation that you want to make, for example, the localization documentation: +Or if there is a new feature to add or change to the documentation that you want to make, for example, the localization documentation: # git branch feature/localization-docs # git checkout feature/localization-docs Switched to branch 'feature/localization-docs' +> **Note:** Create one new branch for every new feature or bug-fix. This will encourage organization, limit interdependency between new features/fixes and will make it easy for the Laravel team to merge your changes into the Laravel core. + Now that you have created your own branch and have switched to it, it's time to make your changes to the code. Add your new feature or fix that bug. @@ -97,6 +97,8 @@ ## Pushing to your Fork # git push fork feature/localization-docs +Your branch has been successfully pushed to your fork on GitHub. + ## Submitting a Pull Request @@ -121,3 +123,5 @@ ## What's Next? # git pull origin develop Now you are ready to create a new branch and start coding again! + +> [Jason Lewis](http://jasonlewis.me/)'s blog post [Contributing to a GitHub Project](http://jasonlewis.me/blog/2012/06/how-to-contributing-to-a-github-project) was the primary inspiration for this tutorial. diff --git a/laravel/documentation/contrib/github.md b/laravel/documentation/contrib/github.md index 5d0003ad..5d9f43e9 100644 --- a/laravel/documentation/contrib/github.md +++ b/laravel/documentation/contrib/github.md @@ -28,3 +28,8 @@ ## Branches - **develop** - This is the working development branch. All proposed code changes and contributions by the community are pulled into this branch. *When you make a pull request to the Laravel project, this is the branch you want to pull-request into.* Once certain milestones have been reached and/or Taylor Otwell and the Laravel team is happy with the stability and additional features of the current development branch, the changes in the **develop** branch are pulled into the **master** branch, thus creating and releasing the newest stable version of Laravel for the world to use. + +*Further Reading* + + - [Contributing to Laravel via Command-Line](docs/contrib/command-line) + - [Contributing to Laravel using TortoiseGit](docs/contrib/tortoisegit) diff --git a/laravel/documentation/contrib/tortoisegit.md b/laravel/documentation/contrib/tortoisegit.md index e69de29b..aa79e8cb 100644 --- a/laravel/documentation/contrib/tortoisegit.md +++ b/laravel/documentation/contrib/tortoisegit.md @@ -0,0 +1,113 @@ +# Contributing to Laravel using TortoiseGit + +## Contents + - [Getting Started](#getting-started) + - [Forking Laravel](#forking-laravel) + - [Cloning Laravel](#cloning-laravel) + - [Adding your Fork](#adding-your-fork) + - [Creating Branches](#creating-branches) + - [Committing](#committing) + - [Submitting a Pull Request](#submitting-a-pull-request) + - [What's Next?](#whats-next) + + +## Getting Started + +This tutorial explains the basics of contributing to a project on [GitHub](https://github.com/) using [TortoiseGit](http://code.google.com/p/tortoisegit/) for Windows. The workflow can apply to most projects on GitHub, but in this case, we will be focused on the [Laravel](https://github.com/laravel/laravel) project. + +This tutorial assumes you have installed TortoiseGit for Windows and you have created a GitHub account. If you haven't already, look at the [Laravel on GitHub](/docs/contrib/github) documentation in order to familiarize yourself with Laravel's repositories and branches. + + +## Forking Laravel + +Login to GitHub and visit the [Laravel Repository](https://github.com/laravel/laravel). Click on the **Fork** button. This will create your own fork of Laravel in your own GitHub account. Your Laravel fork will be located at **https://github.com/username/laravel** (your GitHub username will be used in place of *username*). + + +## Cloning Laravel + +Open up Windows Explorer and create a new directory where you can make development changes to Laravel. + + - Right-click the Laravel directory to bring up the context menu. Click on **Git Clone...** + - Git clone + - **Url:** https://github.com/laravel/laravel.git + - **Directory:** the directory that you just created in the previous step + - Click **OK** + +> **Note**: The reason you are cloning the original Laravel repository (and not the fork you made) is so you can always pull down the most recent changes from the Laravel repository to your local repository. + + +## Adding your Fork + +After the cloning process is complete, it's time to add the fork you made as a **remote repository**. + + - Right-click the Laravel directory and goto **TortoiseGit > Settings** + - Goto the **Git/Remote** section. Add a new remote: + - **Remote**: fork + - **URL**: https://github.com/username/laravel.git + - Click **Add New/Save** + - Click **OK** + +Remember to replace *username* with your GitHub username. *This is case-sensitive*. + + +## Creating Branches + +Now you are ready to create a new branch for your new feature or bug-fix. When you create a new branch, use a self-descriptive naming convention. For example, if you are going to fix a bug in Eloquent, name your branch *bug/eloquent*. Or if you were going to make changes to the localization documentation, name your branch *feature/localization-docs*. A good naming convention will encourage organization and help others understand the purpose of your branch. + + - Right-click the Laravel directory and goto **TortoiseGit > Create Branch** + - **Branch:** feature/localization-docs + - **Base On Branch:** remotes/origin/develop + - **Check** *Track* + - **Check** *Switch to new branch* + - Click **OK** + +This will create your new *feature/localization-docs* branch and switch you to it. + +> **Note:** Create one new branch for every new feature or bug-fix. This will encourage organization, limit interdependency between new features/fixes and will make it easy for the Laravel team to merge your changes into the Laravel core. + +Now that you have created your own branch and have switched to it, it's time to make your changes to the code. Add your new feature or fix that bug. + + +##Committing + +Now that you have finished coding and testing your changes, it's time to commit them to your local repository: + + - Right-click the Laravel directory and goto **Git Commit -> "feature/localization-docs"...** + - Commit + - **Message:** Provide a brief explaination of what you added or changed + - Click **Sign** - This tells the Laravel team know that you personally agree to your code being added to the Laravel core + - **Changes made:** Check all changed/added files + - Click **OK** + + +## Pushing to your Fork + +Now that your local repository has your committed changes, it's time to push (or sync) your new branch to your fork that is hosted in GitHub: + +- Right-click the Laravel directory and goto **Git Sync...** +- Git Syncronization + - **Local Branch:** feature/localization-docs + - **Remote Branch:** leave this blank + - **Remote URL:** fork + - Click **Push** + - When asked for "username:" enter your GitHub *case-sensitive* username + - When asked for "password:" enter your GitHub *case-sensitive* account + +Your branch has been successfully pushed to your fork on GitHub. + + +## Submitting a Pull Request + +The final step is to submit a pull request to the Laravel repository. This means that you are requesting that the Laravel team pull and merge your changes to the Laravel core. In your browser, visit your Laravel fork at [https://github.com/username/laravel](https://github.com/username/laravel). Click on **Pull Request**. Next, make sure you choose the proper base and head repositories and branches: + + - **base repo:** laravel/laravel + - **base branch:** develop + - **head repo:** username/laravel + - **head branch:** feature/localization-docs + +Use the form to write a more detailed description of the changes you made and why you made them. Finally, click **Send pull request**. That's it! The changes you made have been submitted to the Laravel team. + + +## What's Next? + +Do you have another feature you want to add or another bug you need to fix? Just follow the same instructions as before in the [Creating Branches](#creating-branches) section. Just remember to always create a new branch for every new feature/fix and don't forget to always base your new branches off of the *remotes/origin/develop* branch. From 2c7bf657edc2a329c1e284dee5b4fd28d5791bd7 Mon Sep 17 00:00:00 2001 From: Jakobud Date: Mon, 30 Jul 2012 13:32:53 -0600 Subject: [PATCH 165/260] Removed empty Coding Standards doc. Removed Coding Standards from Table of Contents Sidebar. Signed-off-by: Jakobud --- laravel/documentation/contents.md | 2 -- laravel/documentation/contrib/coding.md | 0 2 files changed, 2 deletions(-) delete mode 100644 laravel/documentation/contrib/coding.md diff --git a/laravel/documentation/contents.md b/laravel/documentation/contents.md index 288b0b68..2d004260 100644 --- a/laravel/documentation/contents.md +++ b/laravel/documentation/contents.md @@ -115,5 +115,3 @@ ### Contributing - [Laravel on GitHub](docs/contrib/github) - [Command Line](docs/contrib/command-line) - [TortoiseGit](docs/contrib/tortoisegit) -- [Coding Standards](docs/contrib/coding) - diff --git a/laravel/documentation/contrib/coding.md b/laravel/documentation/contrib/coding.md deleted file mode 100644 index e69de29b..00000000 From 244ecd49fd494d1e0a132c3a6085ca49cd9b8804 Mon Sep 17 00:00:00 2001 From: Tobsn Date: Tue, 31 Jul 2012 09:55:45 +0200 Subject: [PATCH 166/260] Added use Closure to database.php function extend($name, Closure $connector extend uses closure - causes exception on call without use. --- laravel/database.php | 1 + 1 file changed, 1 insertion(+) diff --git a/laravel/database.php b/laravel/database.php index 57f8d2c1..c5e28ac2 100644 --- a/laravel/database.php +++ b/laravel/database.php @@ -1,5 +1,6 @@ Date: Tue, 31 Jul 2012 10:04:53 +0200 Subject: [PATCH 167/260] Returning results with SHOW queries reference to #991 --- laravel/database/connection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/database/connection.php b/laravel/database/connection.php index 189d2ca2..0849224d 100644 --- a/laravel/database/connection.php +++ b/laravel/database/connection.php @@ -185,7 +185,7 @@ public function query($sql, $bindings = array()) // The result we return depends on the type of query executed against the // database. On SELECT clauses, we will return the result set, for update // and deletes we will return the affected row count. - if (stripos($sql, 'select') === 0) + if (stripos($sql, 'select') === 0 || stripos($sql, 'show') === 0) { return $this->fetch($statement, Config::get('database.fetch')); } From 761186a67641ee047d33107760481703095f48c6 Mon Sep 17 00:00:00 2001 From: Jakobud Date: Tue, 31 Jul 2012 12:00:47 -0600 Subject: [PATCH 168/260] Reorganized Control Structure section. Added Control Structure to TOC. Added in missing @elseif example. Move the Blade Comments to more appropriate section. Simplified Blade Comments examples. Minor changes to @parent example. Signed-off-by: Jakobud --- laravel/documentation/views/templating.md | 89 ++++++++++++++--------- 1 file changed, 54 insertions(+), 35 deletions(-) diff --git a/laravel/documentation/views/templating.md b/laravel/documentation/views/templating.md index f4098c63..9aabac87 100644 --- a/laravel/documentation/views/templating.md +++ b/laravel/documentation/views/templating.md @@ -5,6 +5,7 @@ ## Contents - [The Basics](#the-basics) - [Sections](#sections) - [Blade Template Engine](#blade-template-engine) +- [Blade Control Structures](#blade-control-structures) - [Blade Layouts](#blade-layouts) @@ -63,7 +64,7 @@ ## Blade Template Engine #### Echoing a variable using Blade: - Hello, {{$name}}. + Hello, {{ $name }}. #### Echoing function results using Blade: @@ -80,15 +81,46 @@ #### Render a view: @render('admin.list') -#### Creating loops using Blade: +#### Blade comments: -

    Comments

    + {{-- This is a comment --}} + + {{-- + This is a + multi-line + comment. + --}} + +> **Note:** Unlike HTML comments, Blade comments are not visible in the HTML source. + + +## Blade Control Structures + +#### For Loop: + + @for ($i = 0; $i <= count($comments); $i++) + The comment body is {{ $comments[$i] }} + @endfor + +#### Foreach Loop: @foreach ($comments as $comment) - The comment body is {{$comment->body}}. + The comment body is {{ $comment->body }}. @endforeach -#### Other Blade control structures: +#### While Loop: + + @while ($something) + I am still looping! + @endwhile + +#### If Statement: + + @if ( $message == true ) + I'm displaying the message! + @endif + +#### If Else Statement: @if (count($comments) > 0) I have comments! @@ -96,15 +128,17 @@ #### Other Blade control structures: I have no comments! @endif - @for ($i =0; $i < count($comments) - 1; $i++) - The comment body is {{$comments[$i]}} - @endfor +#### Else If Statement: - @while ($something) - I am still looping! - @endwhile + @if ( $message == 'success' ) + It was a success! + @elseif ( $message == 'error' ) + An error occurred. + @else + Did it work? + @endif -#### The "for-else" control structure: +#### For Else Statement: @forelse ($posts as $post) {{ $post->body }} @@ -112,35 +146,18 @@ #### The "for-else" control structure: There are not posts in the array! @endforelse - -#### The "unless" control structure: +#### Unless Statement: @unless(Auth::check()) - {{ HTML::link_to_route('login', 'Login'); }} + Login @endunless - // Equivalent... + // Equivalent to... - ... + Login - -#### Blade comments: - - @if ($check) - {{-- This is a comment --}} - ... - @endif - - {{-- - This is - a multi-line - comment. - --}} - -> **Note:** Blade comments, unlike HTML comments, are not visible in the HTML source. - ## Blade Layouts @@ -173,7 +190,9 @@ ## Blade Layouts The profile view will automatically use the "master" template thanks to Blade's **@layout** expression. -**Important:** The **@layout** call must always be on the very first line of the file, with no leading whitespaces or newline breaks. +> **Important:** The **@layout** call must always be on the very first line of the file, with no leading whitespaces or newline breaks. + +#### Appending with @parent Sometimes you may want to only append to a section of a layout rather than overwrite it. For example, consider the navigation list in our "master" layout. Let's assume we just want to append a new list item. Here's how to do it: @@ -188,4 +207,4 @@ ## Blade Layouts Welcome to the profile page! @endsection -Notice the **@parent** Blade construct? It will be replaced with the contents of the layout's navigation section, providing you with a beautiful and powerful method of performing layout extension and inheritance. +**@parent** will be replaced with the contents of the layout's *navigation* section, providing you with a beautiful and powerful method of performing layout extension and inheritance. From d816eb9ef31d3690f57b96e1571b60aaea85fe81 Mon Sep 17 00:00:00 2001 From: crynobone Date: Wed, 1 Aug 2012 06:34:44 +0800 Subject: [PATCH 169/260] Refix unit testing for Laravel Signed-off-by: crynobone --- laravel/tests/cases/asset.test.php | 8 +- laravel/tests/cases/auth.test.php | 176 ++++++++++++++++++------ laravel/tests/cases/blade.test.php | 8 +- laravel/tests/cases/bundle.test.php | 6 +- laravel/tests/cases/controller.test.php | 17 ++- laravel/tests/cases/cookie.test.php | 44 +++++- laravel/tests/cases/input.test.php | 2 +- laravel/tests/cases/redirect.test.php | 4 +- laravel/tests/cases/session.test.php | 4 +- laravel/tests/cases/uri.test.php | 20 ++- 10 files changed, 209 insertions(+), 80 deletions(-) diff --git a/laravel/tests/cases/asset.test.php b/laravel/tests/cases/asset.test.php index d62945de..d4214f12 100644 --- a/laravel/tests/cases/asset.test.php +++ b/laravel/tests/cases/asset.test.php @@ -184,13 +184,11 @@ public function testBundleMethodCorrectlySetsTheAssetBundle() */ public function testPathMethodReturnsCorrectPathForABundleAsset() { - Config::set('application.url', 'http://localhost'); - $container = $this->getContainer(); $container->bundle('eloquent'); - $this->assertEquals('http://localhost/bundles/eloquent/foo.jpg', $container->path('foo.jpg')); + $this->assertEquals('/bundles/eloquent/foo.jpg', $container->path('foo.jpg')); } /** @@ -200,11 +198,9 @@ public function testPathMethodReturnsCorrectPathForABundleAsset() */ public function testPathMethodReturnsCorrectPathForAnApplicationAsset() { - Config::set('application.url', 'http://localhost'); - $container = $this->getContainer(); - $this->assertEquals('http://localhost/foo.jpg', $container->path('foo.jpg')); + $this->assertEquals('/foo.jpg', $container->path('foo.jpg')); } /** diff --git a/laravel/tests/cases/auth.test.php b/laravel/tests/cases/auth.test.php index 9f6b3928..16ba428a 100644 --- a/laravel/tests/cases/auth.test.php +++ b/laravel/tests/cases/auth.test.php @@ -1,5 +1,7 @@ restartRequest(); + } + + /** + * Reinitialize the global request. + * + * @return void + */ + protected function restartRequest() + { + // FIXME: Ugly hack, but old contents from previous requests seem to + // trip up the Foundation class. + $_FILES = array(); + + Request::$foundation = RequestFoundation::createFromGlobals(); + } + /** * Test the Auth::user method. * @@ -54,7 +83,9 @@ public function testUserMethodReturnsCurrentUser() */ public function testCheckMethodReturnsTrueWhenUserIsSet() { - $this->assertTrue(AuthUserReturnsDummy::check()); + $auth = new AuthUserReturnsDummy; + + $this->assertTrue($auth->check()); } /** @@ -64,7 +95,9 @@ public function testCheckMethodReturnsTrueWhenUserIsSet() */ public function testCheckMethodReturnsFalseWhenNoUserIsSet() { - $this->assertFalse(AuthUserReturnsNull::check()); + $auth = new AuthUserReturnsNull; + + $this->assertFalse($auth->check()); } /** @@ -74,7 +107,9 @@ public function testCheckMethodReturnsFalseWhenNoUserIsSet() */ public function testGuestReturnsTrueWhenNoUserIsSet() { - $this->assertTrue(AuthUserReturnsNull::guest()); + $auth = new AuthUserReturnsNull; + + $this->assertTrue($auth->guest()); } /** @@ -84,7 +119,9 @@ public function testGuestReturnsTrueWhenNoUserIsSet() */ public function testGuestReturnsFalseWhenUserIsSet() { - $this->assertFalse(AuthUserReturnsDummy::guest()); + $auth = new AuthUserReturnsDummy; + + $this->assertFalse($auth->guest()); } /** @@ -107,10 +144,12 @@ public function testUserMethodReturnsNullWhenNoUserExistsAndNoRecallerExists() public function testUserReturnsUserByID() { Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - // FIXME: Not sure whether hard-coding the key is a good idea. - Session::$instance->session['data']['laravel_auth_drivers_fluent_login'] = 1; + + Auth::login(1); $this->assertEquals('Taylor Otwell', Auth::user()->name); + + Auth::logout(); } /** @@ -121,8 +160,8 @@ public function testUserReturnsUserByID() public function testNullReturnedWhenUserIDNotValidInteger() { Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - // FIXME: Not sure whether hard-coding the key is a good idea. - Session::$instance->session['data']['laravel_auth_drivers_fluent_login'] = 'asdlkasd'; + + Auth::login('asdlkasd'); $this->assertNull(Auth::user()); } @@ -137,10 +176,13 @@ public function testUserCanBeRecalledViaCookie() Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); $cookie = Crypter::encrypt('1|'.Str::random(40)); - Cookie::forever(Config::get('auth.cookie'), $cookie); + Cookie::forever('authloginstub_remember', $cookie); - $this->assertEquals('Taylor Otwell', AuthLoginStub::user()->name); - $this->assertTrue(AuthLoginStub::user() === $_SERVER['auth.login.stub']['user']); + $auth = new AuthLoginStub; + + $this->assertEquals('Taylor Otwell', $auth->user()->name); + + $this->assertTrue($auth->user()->id === $_SERVER['auth.login.stub']['user']); } /** @@ -150,11 +192,11 @@ public function testUserCanBeRecalledViaCookie() */ public function testAttemptMethodReturnsFalseWhenCredentialsAreInvalid() { - $this->assertFalse(Auth::attempt('foo', 'foo')); - $this->assertFalse(Auth::attempt('foo', null)); - $this->assertFalse(Auth::attempt(null, null)); - $this->assertFalse(Auth::attempt('taylor', 'password')); - $this->assertFalse(Auth::attempt('taylor', 232)); + $this->assertFalse(Auth::attempt(array('username' => 'foo', 'password' => 'foo'))); + $this->assertFalse(Auth::attempt(array('username' => 'foo', 'password' => null))); + $this->assertFalse(Auth::attempt(array('username' => null, 'password' => null))); + $this->assertFalse(Auth::attempt(array('username' => 'taylor', 'password' => 'password'))); + $this->assertFalse(Auth::attempt(array('username' => 'taylor', 'password' => 232))); } /** @@ -164,13 +206,22 @@ public function testAttemptMethodReturnsFalseWhenCredentialsAreInvalid() */ public function testAttemptReturnsTrueWhenCredentialsAreCorrect() { - $this->assertTrue(AuthLoginStub::attempt('taylor', 'password1')); - $this->assertEquals('Taylor Otwell', $_SERVER['auth.login.stub']['user']->name); + Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); + + $auth = new AuthLoginStub; + + $this->assertTrue($auth->attempt(array('username' => 'taylor', 'password' => 'password1'))); + $this->assertEquals('1', $_SERVER['auth.login.stub']['user']); $this->assertFalse($_SERVER['auth.login.stub']['remember']); - $this->assertTrue(AuthLoginStub::attempt('taylor', 'password1', true)); - $this->assertEquals('Taylor Otwell', $_SERVER['auth.login.stub']['user']->name); + $auth_secure = new AuthLoginStub; + + $this->assertTrue($auth_secure->attempt(array('username' => 'taylor', 'password' => 'password1', 'remember' => true))); + $this->assertEquals('1', $_SERVER['auth.login.stub']['user']); $this->assertTrue($_SERVER['auth.login.stub']['remember']); + + $auth_secure->logout(); + $auth->logout(); } /** @@ -189,9 +240,13 @@ public function testLoginMethodStoresUserKeyInSession() $user = Session::$instance->session['data']['laravel_auth_drivers_fluent_login']; $this->assertEquals(10, $user->id); + + Auth::logout(); + Auth::login(5); $user = Session::$instance->session['data']['laravel_auth_drivers_fluent_login']; $this->assertEquals(5, $user); + Auth::logout(5); } /** @@ -203,20 +258,27 @@ public function testLoginStoresRememberCookieWhenNeeded() { Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); + $this->setServerVar('HTTPS', 'on'); + // Set the session vars to make sure remember cookie uses them Config::set('session.path', 'foo'); Config::set('session.domain', 'bar'); Config::set('session.secure', true); - Auth::login(10); - $this->assertTrue(isset(Cookie::$jar[Config::get('auth.cookie')])); + Auth::login(1, true); - $cookie = Cookie::$jar[Config::get('auth.cookie')]['value']; + $this->assertTrue(isset(Cookie::$jar['laravel_auth_drivers_fluent_remember'])); + + $cookie = Cookie::$jar['laravel_auth_drivers_fluent_remember']['value']; $cookie = explode('|', Crypter::decrypt($cookie)); - $this->assertEquals(10, $cookie[0]); - $this->assertEquals('foo', Cookie::$jar[Config::get('auth.cookie')]['path']); - $this->assertEquals('bar', Cookie::$jar[Config::get('auth.cookie')]['domain']); - $this->assertTrue(Cookie::$jar[Config::get('auth.cookie')]['secure']); + $this->assertEquals(1, $cookie[0]); + $this->assertEquals('foo', Cookie::$jar['laravel_auth_drivers_fluent_remember']['path']); + $this->assertEquals('bar', Cookie::$jar['laravel_auth_drivers_fluent_remember']['domain']); + $this->assertTrue(Cookie::$jar['laravel_auth_drivers_fluent_remember']['secure']); + + Auth::logout(); + + $this->setServerVar('HTTPS', 'off'); } /** @@ -228,40 +290,70 @@ public function testLogoutMethodLogsOutUser() { Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - //$data = Session::$instance->session['data']['laravel_auth_drivers_fluent_login'] = 10; + $data = Session::$instance->session['data']['laravel_auth_drivers_fluent_login'] = 1; - // FIXME: Restore some of these! - //Config::set('auth.logout', function($user) { $_SERVER['auth.logout.stub'] = $user; }); - - //Auth::$user = 'Taylor'; Auth::logout(); - //$this->assertEquals('Taylor', $_SERVER['auth.logout.stub']); + // A workaround since Cookie will is only stored in memory, until Response class is called. + Auth::driver()->token = null; + $this->assertNull(Auth::user()); - // FIXME: Not sure whether hard-coding the key is a good idea. + $this->assertFalse(isset(Session::$instance->session['data']['laravel_auth_drivers_fluent_login'])); $this->assertTrue(Cookie::$jar['laravel_auth_drivers_fluent_remember']['expiration'] < time()); } } -class AuthUserReturnsNull extends Laravel\Auth { +class AuthUserReturnsNull extends Laravel\Auth\Drivers\Driver { - public static function user() {} + public function user() { return null; } + + public function retrieve($id) { return null; } + + public function attempt($arguments = array()) { return null; } } -class AuthUserReturnsDummy extends Laravel\Auth { +class AuthUserReturnsDummy extends Laravel\Auth\Drivers\Driver { - public static function user() { return 'Taylor'; } + public function user() { return 'Taylor'; } -} + public function retrieve($id) { return null; } -class AuthLoginStub extends Laravel\Auth { - - public static function login($user, $remember = false) + public function attempt($arguments = array()) { + return $this->login($arguments['username']); + } + +} + +class AuthLoginStub extends Laravel\Auth\Drivers\Fluent { + + public function login($user, $remember = false) + { + if (is_null($remember)) $remember = false; + $_SERVER['auth.login.stub'] = compact('user', 'remember'); + + return parent::login($user, $remember); + } + + public function logout() + { + parent::logout(); + } + + public function retrieve($id) + { + $user = parent::retrieve($id); + + $_SERVER['auth.login.stub'] = array( + 'user' => $user->id, + 'remember' => false, + ); + + return $user; } } \ No newline at end of file diff --git a/laravel/tests/cases/blade.test.php b/laravel/tests/cases/blade.test.php index 70e80b3b..343be2ea 100644 --- a/laravel/tests/cases/blade.test.php +++ b/laravel/tests/cases/blade.test.php @@ -30,10 +30,10 @@ public function testControlStructuresAreCreatedCorrectly() $blade3 = "@if (true)\nfoo\n@elseif (false)\nbar\n@endif"; $blade4 = "@if (true)\nfoo\n@else\nbar\n@endif"; - $this->assertEquals("\nfoo\n", Blade::compile_string($blade1)); - $this->assertEquals(" 0): ?>\nfoo\n", Blade::compile_string($blade2)); - $this->assertEquals("\nfoo\n\nbar\n", Blade::compile_string($blade3)); - $this->assertEquals("\nfoo\n\nbar\n", Blade::compile_string($blade4)); + $this->assertEquals("\nfoo\n", Blade::compile_string($blade1)); + $this->assertEquals(" 0): ?>\nfoo\n", Blade::compile_string($blade2)); + $this->assertEquals("\nfoo\n\nbar\n", Blade::compile_string($blade3)); + $this->assertEquals("\nfoo\n\nbar\n", Blade::compile_string($blade4)); } /** diff --git a/laravel/tests/cases/bundle.test.php b/laravel/tests/cases/bundle.test.php index 5a107d62..9826a50f 100644 --- a/laravel/tests/cases/bundle.test.php +++ b/laravel/tests/cases/bundle.test.php @@ -147,10 +147,8 @@ public function testPathMethodReturnsCorrectPath() */ public function testAssetPathReturnsPathToBundlesAssets() { - Config::set('application.url', 'http://localhost'); - - $this->assertEquals('http://localhost/bundles/dashboard/', Bundle::assets('dashboard')); - $this->assertEquals('http://localhost/', Bundle::assets(DEFAULT_BUNDLE)); + $this->assertEquals('/bundles/dashboard/', Bundle::assets('dashboard')); + $this->assertEquals('/', Bundle::assets(DEFAULT_BUNDLE)); Config::set('application.url', ''); } diff --git a/laravel/tests/cases/controller.test.php b/laravel/tests/cases/controller.test.php index 1577ece3..9eb192b9 100644 --- a/laravel/tests/cases/controller.test.php +++ b/laravel/tests/cases/controller.test.php @@ -96,24 +96,24 @@ public function testFiltersCanBeConstrainedByRequestMethod() { $_SERVER['test-on-post'] = false; - $_SERVER['REQUEST_METHOD'] = 'GET'; + Request::$foundation->setMethod('GET'); Controller::call('filter@index'); $this->assertFalse($_SERVER['test-on-post']); - $_SERVER['REQUEST_METHOD'] = 'POST'; + Request::$foundation->setMethod('POST'); Controller::call('filter@index'); $this->assertTrue($_SERVER['test-on-post']); $_SERVER['test-on-get-put'] = false; - $_SERVER['REQUEST_METHOD'] = 'POST'; + Request::$foundation->setMethod('POST'); Controller::call('filter@index'); $this->assertFalse($_SERVER['test-on-get-put']); - $_SERVER['REQUEST_METHOD'] = 'PUT'; + Request::$foundation->setMethod('PUT'); Controller::call('filter@index'); $this->assertTrue($_SERVER['test-on-get-put']); @@ -183,15 +183,18 @@ public function testMultipleFiltersCanBeAssignedToAnAction() */ public function testRestfulControllersRespondWithRestfulMethods() { - $_SERVER['REQUEST_METHOD'] = 'GET'; + Request::$foundation->setMethod('GET'); + //$_SERVER['REQUEST_METHOD'] = 'GET'; $this->assertEquals('get_index', Controller::call('restful@index')->content); - $_SERVER['REQUEST_METHOD'] = 'PUT'; + //$_SERVER['REQUEST_METHOD'] = 'PUT'; + Request::$foundation->setMethod('PUT'); $this->assertEquals(404, Controller::call('restful@index')->status()); - $_SERVER['REQUEST_METHOD'] = 'POST'; + //$_SERVER['REQUEST_METHOD'] = 'POST'; + Request::$foundation->setMethod('POST'); $this->assertEquals('post_index', Controller::call('restful@index')->content); } diff --git a/laravel/tests/cases/cookie.test.php b/laravel/tests/cases/cookie.test.php index dcfaf5d8..f62f7857 100644 --- a/laravel/tests/cases/cookie.test.php +++ b/laravel/tests/cases/cookie.test.php @@ -1,5 +1,7 @@ restartRequest(); + } + + /** + * Reinitialize the global request. + * + * @return void + */ + protected function restartRequest() + { + // FIXME: Ugly hack, but old contents from previous requests seem to + // trip up the Foundation class. + $_FILES = array(); + + Request::$foundation = RequestFoundation::createFromGlobals(); + } + /** * Test Cookie::has method. * @@ -69,12 +98,19 @@ public function testForeverShouldUseATonOfMinutes() { Cookie::forever('foo', 'bar'); $this->assertEquals('bar', Cookie::$jar['foo']['value']); - $this->assertEquals(525600, Cookie::$jar['foo']['expiration']); + + // Shouldn't be able to test this cause while we indicate -2000 seconds + // cookie expiration store timestamp. + // $this->assertEquals(525600, Cookie::$jar['foo']['expiration']); + + $this->setServerVar('HTTPS', 'on'); Cookie::forever('bar', 'baz', 'path', 'domain', true); $this->assertEquals('path', Cookie::$jar['bar']['path']); $this->assertEquals('domain', Cookie::$jar['bar']['domain']); $this->assertTrue(Cookie::$jar['bar']['secure']); + + $this->setServerVar('HTTPS', 'off'); } /** @@ -85,7 +121,11 @@ public function testForeverShouldUseATonOfMinutes() public function testForgetSetsCookieWithExpiration() { Cookie::forget('bar', 'path', 'domain'); - $this->assertEquals(-2000, Cookie::$jar['bar']['expiration']); + + // Shouldn't be able to test this cause while we indicate -2000 seconds + // cookie expiration store timestamp. + //$this->assertEquals(-2000, Cookie::$jar['bar']['expiration']); + $this->assertEquals('path', Cookie::$jar['bar']['path']); $this->assertEquals('domain', Cookie::$jar['bar']['domain']); $this->assertFalse(Cookie::$jar['bar']['secure']); diff --git a/laravel/tests/cases/input.test.php b/laravel/tests/cases/input.test.php index 76172c1e..5a1890f0 100644 --- a/laravel/tests/cases/input.test.php +++ b/laravel/tests/cases/input.test.php @@ -149,7 +149,7 @@ public function testFlushMethodClearsFlashedInput() { $this->setSession(); - $input = array('name' => 'Taylor'); + $input = array('name' => 'Taylor', 'age' => 30); Request::foundation()->request->add($input); Input::flash(); diff --git a/laravel/tests/cases/redirect.test.php b/laravel/tests/cases/redirect.test.php index 4f0897d7..cce63a81 100644 --- a/laravel/tests/cases/redirect.test.php +++ b/laravel/tests/cases/redirect.test.php @@ -12,7 +12,7 @@ public function setUp() Config::set('session.driver', 'foo'); Router::$routes = array(); Router::$names = array(); - Config::set('application.url', 'http://localhost'); + URL::$base = 'http://localhost/'; Config::set('application.index', ''); } @@ -25,7 +25,7 @@ public function tearDown() Config::set('session.driver', ''); Router::$routes = array(); Router::$names = array(); - Config::set('application.url', ''); + URL::$base = ''; Config::set('application.index', 'index.php'); Session::$instance = null; } diff --git a/laravel/tests/cases/session.test.php b/laravel/tests/cases/session.test.php index 05b0299d..cf6946a7 100644 --- a/laravel/tests/cases/session.test.php +++ b/laravel/tests/cases/session.test.php @@ -373,7 +373,9 @@ public function testSaveMethodSetsCookieWithCorrectValues() $cookie = Cookie::$jar[Config::get('session.cookie')]; $this->assertEquals('foo', $cookie['value']); - $this->assertEquals(Config::get('session.lifetime'), $cookie['expiration']); + // Shouldn't be able to test this cause session.lifetime store number of minutes + // while cookie expiration store timestamp when it going to expired. + // $this->assertEquals(Config::get('session.lifetime'), $cookie['expiration']); $this->assertEquals(Config::get('session.domain'), $cookie['domain']); $this->assertEquals(Config::get('session.path'), $cookie['path']); $this->assertEquals(Config::get('session.secure'), $cookie['secure']); diff --git a/laravel/tests/cases/uri.test.php b/laravel/tests/cases/uri.test.php index fc64b3fb..8f2b85ff 100644 --- a/laravel/tests/cases/uri.test.php +++ b/laravel/tests/cases/uri.test.php @@ -49,7 +49,7 @@ public function testCorrectURIIsReturnedByCurrentMethod($uri, $expectation) */ public function testSegmentMethodReturnsAURISegment() { - $this->setRequestUri('http://localhost/index.php/user/profile'); + $this->setRequestUri('/user/profile'); $this->assertEquals('user', URI::segment(1)); $this->assertEquals('profile', URI::segment(2)); @@ -61,16 +61,14 @@ public function testSegmentMethodReturnsAURISegment() public function requestUriProvider() { return array( - array('/index.php', '/'), - array('/index.php/', '/'), - array('http://localhost/user', 'user'), - array('http://localhost/user/', 'user'), - array('http://localhost/index.php', '/'), - array('http://localhost/index.php/', '/'), - array('http://localhost/index.php//', '/'), - array('http://localhost/index.php/user', 'user'), - array('http://localhost/index.php/user/', 'user'), - array('http://localhost/index.php/user/profile', 'user/profile'), + array('/user', 'user'), + array('/user/', 'user'), + array('', '/'), + array('/', '/'), + array('//', '/'), + array('/user', 'user'), + array('/user/', 'user'), + array('/user/profile', 'user/profile'), ); } From 5716b4da407be93288c342b771f8121f5e032496 Mon Sep 17 00:00:00 2001 From: Tobsn Date: Thu, 2 Aug 2012 00:54:30 +0200 Subject: [PATCH 170/260] type boolean is tinyint(1) switched from default "tinyint" which creates a tinyint(4) to the standard mysql boolean type "tinyint(1)" --- laravel/database/schema/grammars/mysql.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/database/schema/grammars/mysql.php b/laravel/database/schema/grammars/mysql.php index e8c926fe..da990bc8 100644 --- a/laravel/database/schema/grammars/mysql.php +++ b/laravel/database/schema/grammars/mysql.php @@ -383,7 +383,7 @@ protected function type_decimal(Fluent $column) */ protected function type_boolean(Fluent $column) { - return 'TINYINT'; + return 'TINYINT(1)'; } /** From e86cd79b11a302928a8b89ee6f4403c3d45835af Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Thu, 2 Aug 2012 18:50:44 +0300 Subject: [PATCH 171/260] Make database connection protected in session driver. --- laravel/session/drivers/database.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/session/drivers/database.php b/laravel/session/drivers/database.php index d151ee53..e905bbe6 100644 --- a/laravel/session/drivers/database.php +++ b/laravel/session/drivers/database.php @@ -10,7 +10,7 @@ class Database extends Driver implements Sweeper { * * @var Connection */ - private $connection; + protected $connection; /** * Create a new database session driver. From 727afc1bfa4f4eb0033a5705895bc39309e2f63d Mon Sep 17 00:00:00 2001 From: apathetic012 Date: Fri, 3 Aug 2012 10:01:16 +0800 Subject: [PATCH 172/260] fix namespace issue on exception Signed-off-by: apathetic012 --- laravel/ioc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/laravel/ioc.php b/laravel/ioc.php index b2597d32..5b448dca 100644 --- a/laravel/ioc.php +++ b/laravel/ioc.php @@ -158,7 +158,7 @@ protected static function build($type, $parameters = array()) // no binding registered for the abstraction so we need to bail out. if ( ! $reflector->isInstantiable()) { - throw new Exception("Resolution target [$type] is not instantiable."); + throw new \Exception("Resolution target [$type] is not instantiable."); } $constructor = $reflector->getConstructor(); @@ -195,7 +195,7 @@ protected static function dependencies($parameters) // we'll just bomb out with an error since we have nowhere to go. if (is_null($dependency)) { - throw new Exception("Unresolvable dependency resolving [$parameter]."); + throw new \Exception("Unresolvable dependency resolving [$parameter]."); } $dependencies[] = static::resolve($dependency->name); From 228f57226b5b6533ae0424e5c9bc60591855a997 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 3 Aug 2012 18:09:37 +0300 Subject: [PATCH 173/260] Extract sweep method in Session payload class. This allows for manually triggering garbage collection in session drivers. --- laravel/session/payload.php | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/laravel/session/payload.php b/laravel/session/payload.php index 1149951f..48aedd94 100644 --- a/laravel/session/payload.php +++ b/laravel/session/payload.php @@ -298,13 +298,29 @@ public function save() $this->cookie($config); // Some session drivers implement the Sweeper interface meaning that - // they must clean up expired sessions manually. If the driver is a - // sweeper, we'll calculate if we need to run garbage collection. + // they must clean up expired sessions manually. Here we'll calculate + // if we need to run garbage collection. $sweepage = $config['sweepage']; - if ($this->driver instanceof Sweeper and (mt_rand(1, $sweepage[1]) <= $sweepage[0])) + if (mt_rand(1, $sweepage[1]) <= $sweepage[0]) { - $this->driver->sweep(time() - ($config['lifetime'] * 60)); + $this->sweep(); + } + } + + /** + * Clean up expired sessions. + * + * If the session driver is a sweeper, it must clean up expired sessions + * from time to time. This method triggers garbage collection. + * + * @return void + */ + public function sweep() + { + if ($this->driver instanceof Sweeper) + { + $this->driver->sweep(time() - (Config::get('session.lifetime') * 60)); } } From 690e8572aa40edf6a813984b79fe11e9a9857d09 Mon Sep 17 00:00:00 2001 From: Sergii Grebeniuk Date: Fri, 3 Aug 2012 18:17:48 +0300 Subject: [PATCH 174/260] phpdoc fixes --- laravel/blade.php | 7 ++++--- laravel/cache/drivers/driver.php | 1 + laravel/cache/drivers/memcached.php | 1 + laravel/cache/drivers/sectionable.php | 1 + laravel/cli/tasks/help.php | 1 - laravel/cli/tasks/test/runner.php | 1 + laravel/database/eloquent/model.php | 1 + .../database/eloquent/relationships/belongs_to.php | 5 +++-- laravel/database/eloquent/relationships/has_many.php | 5 +++-- .../relationships/has_many_and_belongs_to.php | 11 +++++++---- laravel/database/eloquent/relationships/has_one.php | 5 +++-- laravel/database/query.php | 1 + laravel/database/schema.php | 2 +- laravel/database/schema/grammars/grammar.php | 4 ++-- laravel/database/schema/grammars/mysql.php | 2 +- laravel/database/schema/grammars/postgres.php | 2 +- laravel/database/schema/grammars/sqlserver.php | 2 +- laravel/database/schema/table.php | 1 + laravel/event.php | 2 +- laravel/form.php | 2 +- laravel/helpers.php | 2 +- laravel/html.php | 2 +- laravel/ioc.php | 1 + laravel/log.php | 3 ++- laravel/pluralizer.php | 1 + laravel/profiling/profiler.php | 2 ++ laravel/redirect.php | 2 +- laravel/request.php | 1 + laravel/routing/router.php | 2 +- laravel/validator.php | 1 + laravel/view.php | 2 +- 31 files changed, 48 insertions(+), 28 deletions(-) diff --git a/laravel/blade.php b/laravel/blade.php index 69d94128..15c8efde 100644 --- a/laravel/blade.php +++ b/laravel/blade.php @@ -95,7 +95,6 @@ public static function extend(Closure $compiler) * * @param string $view * @param string $path - * @param string $compiled * @return bool */ public static function expired($view, $path) @@ -106,7 +105,7 @@ public static function expired($view, $path) /** * Compiles the specified file containing Blade pseudo-code into valid PHP. * - * @param string $path + * @param string $view * @return string */ public static function compile($view) @@ -168,6 +167,7 @@ function($matches) use (&$value) * Extract a variable value out of a Blade expression. * * @param string $value + * @param string $expression * @return string */ protected static function extract($value, $expression) @@ -403,6 +403,7 @@ protected static function compile_yields($value) /** * Rewrites Blade yield section statements into valid PHP. * + * @param string $value * @return string */ protected static function compile_yield_sections($value) @@ -468,7 +469,7 @@ public static function matcher($function) /** * Get the fully qualified path for a compiled view. * - * @param string $view + * @param string $path * @return string */ public static function compiled($path) diff --git a/laravel/cache/drivers/driver.php b/laravel/cache/drivers/driver.php index c6abcb2e..5df317be 100644 --- a/laravel/cache/drivers/driver.php +++ b/laravel/cache/drivers/driver.php @@ -67,6 +67,7 @@ abstract public function put($key, $value, $minutes); * @param string $key * @param mixed $default * @param int $minutes + * @param string $function * @return mixed */ public function remember($key, $default, $minutes, $function = 'put') diff --git a/laravel/cache/drivers/memcached.php b/laravel/cache/drivers/memcached.php index 3e6a454d..5a324bf5 100644 --- a/laravel/cache/drivers/memcached.php +++ b/laravel/cache/drivers/memcached.php @@ -20,6 +20,7 @@ class Memcached extends Sectionable { * Create a new Memcached cache driver instance. * * @param Memcached $memcache + * @param string $key * @return void */ public function __construct(\Memcached $memcache, $key) diff --git a/laravel/cache/drivers/sectionable.php b/laravel/cache/drivers/sectionable.php index 4ec78246..93566989 100644 --- a/laravel/cache/drivers/sectionable.php +++ b/laravel/cache/drivers/sectionable.php @@ -63,6 +63,7 @@ public function forever_in_section($section, $key, $value) * @param string $key * @param mixed $default * @param int $minutes + * @param string $function * @return mixed */ public function remember_in_section($section, $key, $default, $minutes, $function = 'put') diff --git a/laravel/cli/tasks/help.php b/laravel/cli/tasks/help.php index 8cfcd768..929c4ff8 100644 --- a/laravel/cli/tasks/help.php +++ b/laravel/cli/tasks/help.php @@ -8,7 +8,6 @@ class Help extends Task { /** * List available artisan commands. * - * @param array $arguments * @return void */ public function commands() diff --git a/laravel/cli/tasks/test/runner.php b/laravel/cli/tasks/test/runner.php index 937046d8..250450d1 100644 --- a/laravel/cli/tasks/test/runner.php +++ b/laravel/cli/tasks/test/runner.php @@ -10,6 +10,7 @@ class Runner extends Task { /** * Run all of the unit tests for the application. * + * @param array $bundles * @return void */ public function run($bundles = array()) diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index 1890c798..a5baf82e 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -567,6 +567,7 @@ public function set_key($value) * Get a given attribute from the model. * * @param string $key + * @return mixed */ public function get_attribute($key) { diff --git a/laravel/database/eloquent/relationships/belongs_to.php b/laravel/database/eloquent/relationships/belongs_to.php index ef257836..e000ca40 100644 --- a/laravel/database/eloquent/relationships/belongs_to.php +++ b/laravel/database/eloquent/relationships/belongs_to.php @@ -79,8 +79,9 @@ public function eagerly_constrain($results) /** * Match eagerly loaded child models to their parent models. * - * @param array $children - * @param array $parents + * @param string $relationship + * @param array $children + * @param array $parents * @return void */ public function match($relationship, &$children, $parents) diff --git a/laravel/database/eloquent/relationships/has_many.php b/laravel/database/eloquent/relationships/has_many.php index 726bef20..92a1bcde 100644 --- a/laravel/database/eloquent/relationships/has_many.php +++ b/laravel/database/eloquent/relationships/has_many.php @@ -83,8 +83,9 @@ public function initialize(&$parents, $relationship) /** * Match eagerly loaded child models to their parent models. * - * @param array $parents - * @param array $children + * @param string $relationship + * @param array $parents + * @param array $children * @return void */ public function match($relationship, &$parents, $children) diff --git a/laravel/database/eloquent/relationships/has_many_and_belongs_to.php b/laravel/database/eloquent/relationships/has_many_and_belongs_to.php index 9887d7d9..dad17522 100644 --- a/laravel/database/eloquent/relationships/has_many_and_belongs_to.php +++ b/laravel/database/eloquent/relationships/has_many_and_belongs_to.php @@ -61,6 +61,8 @@ public function __construct($model, $associated, $table, $foreign, $other) * * By default, the name is the models sorted and joined with underscores. * + * @param Model $model + * @param string $associated * @return string */ protected function joining($model, $associated) @@ -86,7 +88,7 @@ public function results() * Insert a new record into the joining table of the association. * * @param int $id - * @param array $joining + * @param array $attributes * @return bool */ public function attach($id, $attributes = array()) @@ -317,8 +319,9 @@ public function eagerly_constrain($results) /** * Match eagerly loaded child models to their parent models. * - * @param array $parents - * @param array $children + * @param string $relationship + * @param array $parents + * @param array $children * @return void */ public function match($relationship, &$parents, $children) @@ -383,7 +386,7 @@ protected function hydrate_pivot(&$results) /** * Set the columns on the joining table that should be fetched. * - * @param array $column + * @param array $columns * @return Relationship */ public function with($columns) diff --git a/laravel/database/eloquent/relationships/has_one.php b/laravel/database/eloquent/relationships/has_one.php index 8d1e4ff9..ee97358b 100644 --- a/laravel/database/eloquent/relationships/has_one.php +++ b/laravel/database/eloquent/relationships/has_one.php @@ -30,8 +30,9 @@ public function initialize(&$parents, $relationship) /** * Match eagerly loaded child models to their parent models. * - * @param array $parents - * @param array $children + * @param string $relationship + * @param array $parents + * @param array $children * @return void */ public function match($relationship, &$parents, $children) diff --git a/laravel/database/query.php b/laravel/database/query.php index 3c823c3f..c77ad65b 100644 --- a/laravel/database/query.php +++ b/laravel/database/query.php @@ -475,6 +475,7 @@ public function group_by($column) * @param string $column * @param string $operator * @param mixed $value + * @return Query */ public function having($column, $operator, $value) { diff --git a/laravel/database/schema.php b/laravel/database/schema.php index 2655ff27..e09b8b16 100644 --- a/laravel/database/schema.php +++ b/laravel/database/schema.php @@ -44,7 +44,7 @@ public static function create($table, $callback) * Rename a database table in the schema. * * @param string $table - * @param string $name + * @param string $new_name * @return void */ public static function rename($table, $new_name) diff --git a/laravel/database/schema/grammars/grammar.php b/laravel/database/schema/grammars/grammar.php index 62a55719..26b9fe12 100644 --- a/laravel/database/schema/grammars/grammar.php +++ b/laravel/database/schema/grammars/grammar.php @@ -9,7 +9,7 @@ abstract class Grammar extends \Laravel\Database\Grammar { * Generate the SQL statement for creating a foreign key. * * @param Table $table - * @param Command $command + * @param Fluent $command * @return string */ public function foreign(Table $table, Fluent $command) @@ -54,7 +54,7 @@ public function foreign(Table $table, Fluent $command) * Drop a constraint from the table. * * @param Table $table - * @param Fluent $fluent + * @param Fluent $command * @return string */ protected function drop_constraint(Table $table, Fluent $command) diff --git a/laravel/database/schema/grammars/mysql.php b/laravel/database/schema/grammars/mysql.php index e8c926fe..efecc675 100644 --- a/laravel/database/schema/grammars/mysql.php +++ b/laravel/database/schema/grammars/mysql.php @@ -323,7 +323,7 @@ protected function drop_key(Table $table, Fluent $command) * Drop a foreign key constraint from the table. * * @param Table $table - * @param Fluent $fluent + * @param Fluent $command * @return string */ public function drop_foreign(Table $table, Fluent $command) diff --git a/laravel/database/schema/grammars/postgres.php b/laravel/database/schema/grammars/postgres.php index 4d014b1c..36d47fd9 100644 --- a/laravel/database/schema/grammars/postgres.php +++ b/laravel/database/schema/grammars/postgres.php @@ -309,7 +309,7 @@ protected function drop_key(Table $table, Fluent $command) * Drop a foreign key constraint from the table. * * @param Table $table - * @param Fluent $fluent + * @param Fluent $command * @return string */ public function drop_foreign(Table $table, Fluent $command) diff --git a/laravel/database/schema/grammars/sqlserver.php b/laravel/database/schema/grammars/sqlserver.php index 1a556367..20a6527d 100644 --- a/laravel/database/schema/grammars/sqlserver.php +++ b/laravel/database/schema/grammars/sqlserver.php @@ -327,7 +327,7 @@ protected function drop_key(Table $table, Fluent $command) * Drop a foreign key constraint from the table. * * @param Table $table - * @param Fluent $fluent + * @param Fluent $command * @return string */ public function drop_foreign(Table $table, Fluent $command) diff --git a/laravel/database/schema/table.php b/laravel/database/schema/table.php index a513d794..c728260c 100644 --- a/laravel/database/schema/table.php +++ b/laravel/database/schema/table.php @@ -113,6 +113,7 @@ public function index($columns, $name = null) * * @param string|array $columns * @param string $name + * @return Fluent */ public function foreign($columns, $name = null) { diff --git a/laravel/event.php b/laravel/event.php index ea2eb715..ccc3bf1c 100644 --- a/laravel/event.php +++ b/laravel/event.php @@ -176,7 +176,7 @@ public static function flush($queue) * $responses = Event::fire(array('start', 'loading'), $parameters); *
    * - * @param string|array $event + * @param string|array $events * @param array $parameters * @param bool $halt * @return array diff --git a/laravel/form.php b/laravel/form.php index 5fa6d129..5662f77d 100644 --- a/laravel/form.php +++ b/laravel/form.php @@ -20,7 +20,7 @@ class Form { * Registers a custom macro. * * @param string $name - * @param Closure $input + * @param Closure $macro * @return void */ public static function macro($name, $macro) diff --git a/laravel/helpers.php b/laravel/helpers.php index 5b329437..589669ce 100644 --- a/laravel/helpers.php +++ b/laravel/helpers.php @@ -543,7 +543,7 @@ function render($view, $data = array()) /** * Get the rendered contents of a partial from a loop. * - * @param string $view + * @param string $partial * @param array $data * @param string $iterator * @param string $empty diff --git a/laravel/html.php b/laravel/html.php index 1f4ea6dc..fd5bf82e 100644 --- a/laravel/html.php +++ b/laravel/html.php @@ -13,7 +13,7 @@ class HTML { * Registers a custom macro. * * @param string $name - * @param Closure $input + * @param Closure $macro * @return void */ public static function macro($name, $macro) diff --git a/laravel/ioc.php b/laravel/ioc.php index b2597d32..aa90f804 100644 --- a/laravel/ioc.php +++ b/laravel/ioc.php @@ -85,6 +85,7 @@ public static function instance($name, $instance) * * * @param string $type + * @param array $parameters * @return mixed */ public static function resolve($type, $parameters = array()) diff --git a/laravel/log.php b/laravel/log.php index 74df63c9..6de027df 100644 --- a/laravel/log.php +++ b/laravel/log.php @@ -64,7 +64,8 @@ public static function write($type, $message) * Format a log message for logging. * * @param string $type - * @param + * @param string $message + * @return string */ protected static function format($type, $message) { diff --git a/laravel/pluralizer.php b/laravel/pluralizer.php index ef5b7cb6..2ce72f0b 100644 --- a/laravel/pluralizer.php +++ b/laravel/pluralizer.php @@ -24,6 +24,7 @@ class Pluralizer { /** * Create a new pluralizer instance. * + * @param array $config * @return void */ public function __construct($config) diff --git a/laravel/profiling/profiler.php b/laravel/profiling/profiler.php index 36a83e7e..eda884c5 100644 --- a/laravel/profiling/profiler.php +++ b/laravel/profiling/profiler.php @@ -39,6 +39,8 @@ public static function render($response) /** * Add a log entry to the log entries array. * + * @param string $type + * @param string $message * @return void */ public static function log($type, $message) diff --git a/laravel/redirect.php b/laravel/redirect.php index 2f75db53..1042f7ec 100644 --- a/laravel/redirect.php +++ b/laravel/redirect.php @@ -6,7 +6,7 @@ class Redirect extends Response { * Create a redirect response to application root. * * @param int $status - * @param bool $secure + * @param bool $https * @return Redirect */ public static function home($status = 302, $https = null) diff --git a/laravel/request.php b/laravel/request.php index 306a94c1..e78c943d 100644 --- a/laravel/request.php +++ b/laravel/request.php @@ -119,6 +119,7 @@ public static function accept() /** * Determine if the request accepts a given content type. * + * @param string $type * @return bool */ public static function accepts($type) diff --git a/laravel/routing/router.php b/laravel/routing/router.php index 3f265323..0f162305 100644 --- a/laravel/routing/router.php +++ b/laravel/routing/router.php @@ -292,7 +292,7 @@ public static function secure_controller($controllers, $defaults = 'index') /** * Register a controller with the router. * - * @param string|array $controller + * @param string|array $controllers * @param string|array $defaults * @param bool $https * @return void diff --git a/laravel/validator.php b/laravel/validator.php index e32c4ccc..5fb93bb6 100644 --- a/laravel/validator.php +++ b/laravel/validator.php @@ -637,6 +637,7 @@ protected function validate_alpha_dash($attribute, $value) * * @param string $attribute * @param mixed $value + * @param array $parameters * @return bool */ protected function validate_match($attribute, $value, $parameters) diff --git a/laravel/view.php b/laravel/view.php index 7ade58fb..d8275c6e 100644 --- a/laravel/view.php +++ b/laravel/view.php @@ -255,7 +255,7 @@ public static function name($view, $name) * }); * * - * @param string|array $view + * @param string|array $views * @param Closure $composer * @return void */ From bf07de7d5e858f401e156bcaa60a159c4052d8e0 Mon Sep 17 00:00:00 2001 From: Tobsn Date: Fri, 3 Aug 2012 17:27:29 +0200 Subject: [PATCH 175/260] added array and array count validation added validate_array/count/countmin/countmax/countbetween - corresponding replace_count/countmin/countmax/countbetween message functions - corresponding validator error messages into all language files (please have maintainers update their language files) - also converted spaces to tabs in the polish language file to fit all the others. --- application/language/ar/validation.php | 5 + application/language/bg/validation.php | 5 + application/language/de/validation.php | 5 + application/language/en/validation.php | 5 + application/language/fr/validation.php | 5 + application/language/he/validation.php | 5 + application/language/hu/validation.php | 5 + application/language/id/validation.php | 5 + application/language/ja/validation.php | 5 + application/language/nl/validation.php | 5 + application/language/pl/validation.php | 181 +++++++++++++------------ application/language/ru/validation.php | 5 + laravel/validator.php | 120 ++++++++++++++++ 13 files changed, 268 insertions(+), 88 deletions(-) diff --git a/application/language/ar/validation.php b/application/language/ar/validation.php index cb15db34..fb88f6d8 100644 --- a/application/language/ar/validation.php +++ b/application/language/ar/validation.php @@ -24,6 +24,7 @@ "alpha" => "القيمة :attribute يمكنها أن تحتوي على أحرف فقط.", "alpha_dash" => "القيمة :attribute يمكنها أن تحتوي على أحرف و أرقام و إشارة الناقص فقط.", "alpha_num" => "القيمة :attribute يمكنها أن تحتوي على أحرف و أرقام فقط.", + "array" => "The :attribute must have selected elements.", "before" => "القيمة :attribute يجب أن تكون قبل تاريخ :date.", "between" => array( "numeric" => "القيمة :attribute يجب أن تكون بين :min و :max.", @@ -31,6 +32,10 @@ "string" => "النص :attribute يجب أن يكون بطول من :min إلى :max حرف.", ), "confirmed" => "القيمة :attribute التأكيدية غير مطابقة.", + "count" => "The :attribute must have exactly :count selected elements.", + "countbetween" => "The :attribute must have between :min and :max selected elements.", + "countmax" => "The :attribute must have less than :max selected elements.", + "countmin" => "The :attribute must have at least :min selected elements.", "different" => "القيمتان :attribute و :other يجب أن تختلفان.", "email" => "القيمة :attribute تمثل بريد إلكتروني غير صحيح.", "exists" => "القيمة المختارة :attribute غير موجودة.", diff --git a/application/language/bg/validation.php b/application/language/bg/validation.php index 4e46f6ff..fe01d9be 100644 --- a/application/language/bg/validation.php +++ b/application/language/bg/validation.php @@ -24,6 +24,7 @@ "alpha" => "Полето :attribute трябва да съдържа само букви.", "alpha_dash" => "Полето :attribute трябва да съдържа само букви, цифри, долна черта и тире.", "alpha_num" => "Полето :attribute трябва да съдържа само букви и цифри.", + "array" => "The :attribute must have selected elements.", "before" => "Полето :attribute трябва да бъде дата преди :date.", "between" => array( "numeric" => "Полето :attribute трябва да бъде между :min и :max.", @@ -31,6 +32,10 @@ "string" => "Полето :attribute трябва да бъде между :min и :max знака.", ), "confirmed" => "Полето :attribute не е потвърдено.", + "count" => "The :attribute must have exactly :count selected elements.", + "countbetween" => "The :attribute must have between :min and :max selected elements.", + "countmax" => "The :attribute must have less than :max selected elements.", + "countmin" => "The :attribute must have at least :min selected elements.", "different" => "Полетата :attribute и :other трябва да са различни.", "email" => "Полето :attribute е с невалиден формат.", "exists" => "Избраната стойност на :attribute вече съществува.", diff --git a/application/language/de/validation.php b/application/language/de/validation.php index 87189410..80c3874e 100644 --- a/application/language/de/validation.php +++ b/application/language/de/validation.php @@ -24,6 +24,7 @@ "alpha" => ":attribute darf nur Buchstaben beinhalten.", "alpha_dash" => ":attribute sollte nur aus Buchstaben, Nummern und Bindestrichen bestehen.", "alpha_num" => ":attribute sollte nur aus Buchstaben und Nummern bestehen.", + "array" => "The :attribute must have selected elements.", "before" => ":attribute muss ein Datum vor dem :date sein.", "between" => array( "numeric" => ":attribute muss zwischen :min und :max liegen.", @@ -31,6 +32,10 @@ "string" => ":attribute muss zwischen :min und :max Zeichen lang sein.", ), "confirmed" => ":attribute stimmt nicht mit der Bestätigung überein.", + "count" => "The :attribute must have exactly :count selected elements.", + "countbetween" => "The :attribute must have between :min and :max selected elements.", + "countmax" => "The :attribute must have less than :max selected elements.", + "countmin" => "The :attribute must have at least :min selected elements.", "different" => ":attribute und :other müssen verschieden sein.", "email" => ":attribute ist keine gültige Email-Adresse.", "exists" => "Der gewählte Wert für :attribute ist ungültig.", diff --git a/application/language/en/validation.php b/application/language/en/validation.php index aade5eda..e5116996 100644 --- a/application/language/en/validation.php +++ b/application/language/en/validation.php @@ -24,6 +24,7 @@ "alpha" => "The :attribute may only contain letters.", "alpha_dash" => "The :attribute may only contain letters, numbers, and dashes.", "alpha_num" => "The :attribute may only contain letters and numbers.", + "array" => "The :attribute must have selected elements.", "before" => "The :attribute must be a date before :date.", "between" => array( "numeric" => "The :attribute must be between :min - :max.", @@ -31,6 +32,10 @@ "string" => "The :attribute must be between :min - :max characters.", ), "confirmed" => "The :attribute confirmation does not match.", + "count" => "The :attribute must have exactly :count selected elements.", + "countbetween" => "The :attribute must have between :min and :max selected elements.", + "countmax" => "The :attribute must have less than :max selected elements.", + "countmin" => "The :attribute must have at least :min selected elements.", "different" => "The :attribute and :other must be different.", "email" => "The :attribute format is invalid.", "exists" => "The selected :attribute is invalid.", diff --git a/application/language/fr/validation.php b/application/language/fr/validation.php index f5810be8..bbc0408f 100644 --- a/application/language/fr/validation.php +++ b/application/language/fr/validation.php @@ -24,6 +24,7 @@ "alpha" => "Le champ :attribute ne doit contenir que des lettres.", "alpha_dash" => "Le champ :attribute ne doit contenir que des lettres, nombres et des tirets.", "alpha_num" => "Le champ :attribute ne doit contenir que des lettres et nombres.", + "array" => "The :attribute must have selected elements.", "before" => "Le champ :attribute doit être une date avant :date.", "between" => array( "numeric" => "Le champ :attribute doit être entre :min - :max.", @@ -31,6 +32,10 @@ "string" => "Le champ :attribute doit être entre :min - :max caractères.", ), "confirmed" => "Le champ :attribute confirmation est différent.", + "count" => "The :attribute must have exactly :count selected elements.", + "countbetween" => "The :attribute must have between :min and :max selected elements.", + "countmax" => "The :attribute must have less than :max selected elements.", + "countmin" => "The :attribute must have at least :min selected elements.", "different" => "Les champ :attribute et :other doivent être différents.", "email" => "Le format du champ :attribute est invalide.", "exists" => "Le champ sélectionné :attribute est invalide.", diff --git a/application/language/he/validation.php b/application/language/he/validation.php index f0059b6a..f714dd8d 100644 --- a/application/language/he/validation.php +++ b/application/language/he/validation.php @@ -27,6 +27,7 @@ "alpha" => "הערך :attribute יכול להכיל רק אותיות.", "alpha_dash" => "הערך :attribute יכול להכיל רק אותיות, מספרים ומקפים.", "alpha_num" => "הערך :attribute יכול להכיל רק אותיות ומספרים.", + "array" => "The :attribute must have selected elements.", "before" => "הערך :attribute חייב להכיל תאריך לפני :date.", "between" => array( "numeric" => "הערך :attribute חייב להיות בין :min ל-:max.", @@ -34,6 +35,10 @@ "string" => "הערך :attribute חייב להכיל בין :min ל-:max תווים.", ), "confirmed" => "הערכים של :attribute חייבים להיות זהים.", + "count" => "The :attribute must have exactly :count selected elements.", + "countbetween" => "The :attribute must have between :min and :max selected elements.", + "countmax" => "The :attribute must have less than :max selected elements.", + "countmin" => "The :attribute must have at least :min selected elements.", "different" => "הערכים של :attribute ו-:other חייבים להיות שונים.", "email" => "הערך :attribute חייב להכיל כתובת אימייל תקינה.", "exists" => "הערך :attribute לא קיים.", diff --git a/application/language/hu/validation.php b/application/language/hu/validation.php index 30b2a0ca..ee0e7145 100644 --- a/application/language/hu/validation.php +++ b/application/language/hu/validation.php @@ -24,6 +24,7 @@ "alpha" => "A(z) :attribute csak betűket tartalmazhat.", "alpha_dash" => "A(z) :attribute betűket, számokat és kötőjeleket tartalmazhat.", "alpha_num" => "A(z) :attribute csak betűket és számokat tartalmazhat.", + "array" => "The :attribute must have selected elements.", "before" => "A :attribute :date előtti dátum kell legyen.", "between" => array( "numeric" => "A(z) :attribute :min - :max közötti érték kell legyen.", @@ -31,6 +32,10 @@ "string" => "A(z) :attribute :min - :max karakterhossz között kell legyen", ), "confirmed" => "A(z) :attribute megerősítése nem egyezett meg.", + "count" => "The :attribute must have exactly :count selected elements.", + "countbetween" => "The :attribute must have between :min and :max selected elements.", + "countmax" => "The :attribute must have less than :max selected elements.", + "countmin" => "The :attribute must have at least :min selected elements.", "different" => "A(z) :attribute és :other különböző kell legyen.", "email" => "A(z) :attribute formátuma nem megfelelő.", "exists" => "A(z) választott :attribute nem megfelelő.", diff --git a/application/language/id/validation.php b/application/language/id/validation.php index 3eafa4cc..51d0178e 100644 --- a/application/language/id/validation.php +++ b/application/language/id/validation.php @@ -24,6 +24,7 @@ "alpha" => "Isian :attribute hanya boleh berisi huruf.", "alpha_dash" => "Isian :attribute hanya boleh berisi huruf, angka, dan strip.", "alpha_num" => "Isian :attribute hanya boleh berisi huruf dan angka.", + "array" => "The :attribute must have selected elements.", "before" => "Isian :attribute harus tanggal sebelum :date.", "between" => array( "numeric" => "Isian :attribute harus antara :min - :max.", @@ -31,6 +32,10 @@ "string" => "Isian :attribute harus antara :min - :max karakter.", ), "confirmed" => "Konfirmasi :attribute tidak cocok.", + "count" => "The :attribute must have exactly :count selected elements.", + "countbetween" => "The :attribute must have between :min and :max selected elements.", + "countmax" => "The :attribute must have less than :max selected elements.", + "countmin" => "The :attribute must have at least :min selected elements.", "different" => "Isian :attribute dan :other harus berbeda.", "email" => "Format isian :attribute tidak valid.", "exists" => "Isian :attribute yang dipilih tidak valid.", diff --git a/application/language/ja/validation.php b/application/language/ja/validation.php index 45e3208b..19d5a1b3 100644 --- a/application/language/ja/validation.php +++ b/application/language/ja/validation.php @@ -40,6 +40,7 @@ "alpha" => ":attributeはアルファベッドのみがご利用できます。", "alpha_dash" => ":attributeは英数字とダッシュ(-)及び下線(_)がご利用できます。", "alpha_num" => ":attributeは英数字がご利用できます。", + "array" => "The :attribute must have selected elements.", "before" => ":attributeには、:date以前の日付をご利用ください。", "between" => array( "numeric" => ":attributeは、:minから、:maxまでの数字をご指定ください。", @@ -47,6 +48,10 @@ "string" => ":attributeは、:min文字から:max文字の間でご指定ください。", ), "confirmed" => ":attributeと、確認フィールドとが、一致していません。", + "count" => "The :attribute must have exactly :count selected elements.", + "countbetween" => "The :attribute must have between :min and :max selected elements.", + "countmax" => "The :attribute must have less than :max selected elements.", + "countmin" => "The :attribute must have at least :min selected elements.", "different" => ":attributeと:otherには、異なった内容を指定してください。", "email" => ":attributeには正しいメールアドレスの形式をご指定ください。", "exists" => "選択された:attributeは正しくありません。", diff --git a/application/language/nl/validation.php b/application/language/nl/validation.php index a604e034..ac0c8416 100644 --- a/application/language/nl/validation.php +++ b/application/language/nl/validation.php @@ -15,6 +15,7 @@ "alpha" => "Het :attribute mag alleen letters bevatten.", "alpha_dash" => "Het :attribute mag alleen letters, nummers, onderstreep(_) en strepen(-) bevatten.", "alpha_num" => "Het :attribute mag alleen letters en nummers", + "array" => "The :attribute must have selected elements.", "before" => "Het :attribute moet een datum voor :date zijn.", "between" => array( "numeric" => "Het :attribute moet tussen :min en :max zijn.", @@ -22,6 +23,10 @@ "string" => "Het :attribute moet tussen :min en :max tekens zijn.", ), "confirmed" => "Het :attribute bevestiging komt niet overeen.", + "count" => "The :attribute must have exactly :count selected elements.", + "countbetween" => "The :attribute must have between :min and :max selected elements.", + "countmax" => "The :attribute must have less than :max selected elements.", + "countmin" => "The :attribute must have at least :min selected elements.", "different" => "Het :attribute en :other moeten verschillend zijn.", "email" => "Het :attribute formaat is ongeldig.", "exists" => "Het gekozen :attribute is al ingebruik.", diff --git a/application/language/pl/validation.php b/application/language/pl/validation.php index ead856b1..65d8553a 100644 --- a/application/language/pl/validation.php +++ b/application/language/pl/validation.php @@ -2,98 +2,103 @@ return array( - /* - |-------------------------------------------------------------------------- - | Validation Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines contain the default error messages used - | by the validator class. Some of the rules contain multiple versions, - | such as the size (max, min, between) rules. These versions are used - | for different input types such as strings and files. - | - | These language lines may be easily changed to provide custom error - | messages in your application. Error messages for custom validation - | rules may also be added to this file. - | - */ + /* + |-------------------------------------------------------------------------- + | Validation Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines contain the default error messages used + | by the validator class. Some of the rules contain multiple versions, + | such as the size (max, min, between) rules. These versions are used + | for different input types such as strings and files. + | + | These language lines may be easily changed to provide custom error + | messages in your application. Error messages for custom validation + | rules may also be added to this file. + | + */ - "accepted" => ":attribute musi zostać zaakceptowane.", - "active_url" => ":attribute nie jest prawidłowym adresem URL.", - "after" => ":attribute musi zawierać datę, która jest po :date.", - "alpha" => ":attribute może zawierać jedynie litery.", - "alpha_dash" => ":attribute może zawierać jedynie litery, cyfry i myślniki.", - "alpha_num" => ":attribute może zawierać jedynie litery i cyfry.", - "before" => ":attribute musi zawierać datę, która jest przed :date.", - "between" => array( - "numeric" => ":ttribute musi mieścić się w granicach :min - :max.", - "file" => ":attribute musi mieć :min - :max kilobajtów.", - "string" => ":attribute musi mieć :min - :max znaków.", - ), - "confirmed" => "Potwierdzenie :attribute się nie zgadza.", - "different" => ":attribute i :other muszą się od siebie różnić.", - "email" => "The :attribute format is invalid.", - "exists" => "Zaznaczona opcja :attribute jest nieprawidłowa.", - "image" => ":attribute musi być obrazkiem.", - "in" => "Zaznaczona opcja :attribute jest nieprawidłowa.", - "integer" => ":attribute musi być liczbą całkowitą.", - "ip" => ":attribute musi być prawidłowym adresem IP.", - "match" => "Format :attribute jest nieprawidłowy.", - "max" => array( - "numeric" => ":attribute musi być poniżej :max.", - "file" => ":attribute musi mieć poniżej :max kilobajtów.", - "string" => ":attribute musi mieć poniżej :max znaków.", - ), - "mimes" => ":attribute musi być plikiem rodzaju :values.", - "min" => array( - "numeric" => ":attribute musi być co najmniej :min.", - "file" => "Plik :attribute musi mieć co najmniej :min kilobajtów.", - "string" => ":attribute musi mieć co najmniej :min znaków.", - ), - "not_in" => "Zaznaczona opcja :attribute jest nieprawidłowa.", - "numeric" => ":attribute musi być numeryczne.", - "required" => "Pole :attribute jest wymagane.", - "same" => ":attribute i :other muszą być takie same.", - "size" => array( - "numeric" => ":attribute musi mieć rozmiary :size.", - "file" => ":attribute musi mieć :size kilobajtów.", - "string" => ":attribute musi mieć :size znaków.", - ), - "unique" => ":attribute zostało już użyte.", - "url" => "Format pola :attribute jest nieprawidłowy.", + "accepted" => ":attribute musi zostać zaakceptowane.", + "active_url" => ":attribute nie jest prawidłowym adresem URL.", + "after" => ":attribute musi zawierać datę, która jest po :date.", + "alpha" => ":attribute może zawierać jedynie litery.", + "alpha_dash" => ":attribute może zawierać jedynie litery, cyfry i myślniki.", + "alpha_num" => ":attribute może zawierać jedynie litery i cyfry.", + "array" => "The :attribute must have selected elements.", + "before" => ":attribute musi zawierać datę, która jest przed :date.", + "between" => array( + "numeric" => ":ttribute musi mieścić się w granicach :min - :max.", + "file" => ":attribute musi mieć :min - :max kilobajtów.", + "string" => ":attribute musi mieć :min - :max znaków.", + ), + "confirmed" => "Potwierdzenie :attribute się nie zgadza.", + "count" => "The :attribute must have exactly :count selected elements.", + "countbetween" => "The :attribute must have between :min and :max selected elements.", + "countmax" => "The :attribute must have less than :max selected elements.", + "countmin" => "The :attribute must have at least :min selected elements.", + "different" => ":attribute i :other muszą się od siebie różnić.", + "email" => "The :attribute format is invalid.", + "exists" => "Zaznaczona opcja :attribute jest nieprawidłowa.", + "image" => ":attribute musi być obrazkiem.", + "in" => "Zaznaczona opcja :attribute jest nieprawidłowa.", + "integer" => ":attribute musi być liczbą całkowitą.", + "ip" => ":attribute musi być prawidłowym adresem IP.", + "match" => "Format :attribute jest nieprawidłowy.", + "max" => array( + "numeric" => ":attribute musi być poniżej :max.", + "file" => ":attribute musi mieć poniżej :max kilobajtów.", + "string" => ":attribute musi mieć poniżej :max znaków.", + ), + "mimes" => ":attribute musi być plikiem rodzaju :values.", + "min" => array( + "numeric" => ":attribute musi być co najmniej :min.", + "file" => "Plik :attribute musi mieć co najmniej :min kilobajtów.", + "string" => ":attribute musi mieć co najmniej :min znaków.", + ), + "not_in" => "Zaznaczona opcja :attribute jest nieprawidłowa.", + "numeric" => ":attribute musi być numeryczne.", + "required" => "Pole :attribute jest wymagane.", + "same" => ":attribute i :other muszą być takie same.", + "size" => array( + "numeric" => ":attribute musi mieć rozmiary :size.", + "file" => ":attribute musi mieć :size kilobajtów.", + "string" => ":attribute musi mieć :size znaków.", + ), + "unique" => ":attribute zostało już użyte.", + "url" => "Format pola :attribute jest nieprawidłowy.", - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ - 'custom' => array(), + 'custom' => array(), - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ - 'attributes' => array(), + 'attributes' => array(), ); \ No newline at end of file diff --git a/application/language/ru/validation.php b/application/language/ru/validation.php index e8ee3a13..8fd15f5c 100644 --- a/application/language/ru/validation.php +++ b/application/language/ru/validation.php @@ -24,6 +24,7 @@ "alpha" => "Поле :attribute может содержать только буквы.", "alpha_dash" => "Поле :attribute может содержать только буквы, цифры и тире.", "alpha_num" => "Поле :attribute может содержать только буквы и цифры.", + "array" => "The :attribute must have selected elements.", "before" => "Поле :attribute должно быть датой перед :date.", "between" => array( "numeric" => "Поле :attribute должно быть между :min и :max.", @@ -31,6 +32,10 @@ "string" => "Поле :attribute должно быть от :min до :max символов.", ), "confirmed" => "Поле :attribute не совпадает с подтверждением.", + "count" => "The :attribute must have exactly :count selected elements.", + "countbetween" => "The :attribute must have between :min and :max selected elements.", + "countmax" => "The :attribute must have less than :max selected elements.", + "countmin" => "The :attribute must have at least :min selected elements.", "different" => "Поля :attribute и :other должны различаться.", "email" => "Поле :attribute имеет неверный формат.", "exists" => "Выбранное значение для :attribute уже существует.", diff --git a/laravel/validator.php b/laravel/validator.php index e32c4ccc..556b116e 100644 --- a/laravel/validator.php +++ b/laravel/validator.php @@ -667,6 +667,70 @@ protected function validate_mimes($attribute, $value, $parameters) return false; } + /** + * Validate that an attribute is an array + * + * @param string $attribute + * @param mixed $value + * @return bool + */ + protected function validate_array($attribute, $value) + { + return is_array($value); + } + + /** + * Validate that an attribute of type array has a specific count + * + * @param string $attribute + * @param mixed $value + * @param array $parameters + * @return bool + */ + protected function validate_count($attribute, $value, $parameters) + { + return (is_array($value) && count($value) == $parameters); + } + + /** + * Validate that an attribute of type array has a minimum of elements. + * + * @param string $attribute + * @param mixed $value + * @param array $parameters + * @return bool + */ + protected function validate_countmin($attribute, $value, $parameters) + { + return (is_array($value) && count($value) >= $parameters); + } + + /** + * Validate that an attribute of type array has a maximum of elements. + * + * @param string $attribute + * @param mixed $value + * @param array $parameters + * @return bool + */ + protected function validate_countmax($attribute, $value, $parameters) + { + return (is_array($value) && count($value) <= $parameters); + } + + /** + * Validate that an attribute of type array has elements between max and min. + * + * @param string $attribute + * @param mixed $value + * @param array $parameters + * @return bool + */ + protected function validate_countbetween($attribute, $value, $parameters) + { + return (is_array($value) && count($value) >= $parameters[0] && count($value) <= $parameters[1] ); + } + /** * Validate the date is before a given date. * @@ -952,6 +1016,62 @@ protected function replace_after($message, $attribute, $rule, $parameters) return str_replace(':date', $parameters[0], $message); } + /** + * Replace all place-holders for the count rule. + * + * @param string $message + * @param string $attribute + * @param string $rule + * @param array $parameters + * @return string + */ + protected function replace_count($message, $attribute, $rule, $parameters) + { + return str_replace(':count', $parameters, $message); + } + + /** + * Replace all place-holders for the countmin rule. + * + * @param string $message + * @param string $attribute + * @param string $rule + * @param array $parameters + * @return string + */ + protected function replace_countmin($message, $attribute, $rule, $parameters) + { + return str_replace(':min', $parameters, $message); + } + + /** + * Replace all place-holders for the countmax rule. + * + * @param string $message + * @param string $attribute + * @param string $rule + * @param array $parameters + * @return string + */ + protected function replace_countmax($message, $attribute, $rule, $parameters) + { + return str_replace(':max', $parameters, $message); + } + + /** + * Replace all place-holders for the between rule. + * + * @param string $message + * @param string $attribute + * @param string $rule + * @param array $parameters + * @return string + */ + protected function replace_countbetween($message, $attribute, $rule, $parameters) + { + return str_replace(array(':min', ':max'), $parameters, $message); + } + /** * Get the displayable name for a given attribute. * From 31c730c9138fc4ead3b1644dbafc416e9ea77d9a Mon Sep 17 00:00:00 2001 From: Jakobud Date: Fri, 3 Aug 2012 10:47:34 -0600 Subject: [PATCH 176/260] Passing a null $value to Form::submit(), Form::reset() or Form::button() was throwing an Exception. I made the default $value = null for those methods. They result in the following respective valid HTML: Signed-off-by: Jakobud --- laravel/form.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/laravel/form.php b/laravel/form.php index 5fa6d129..e7855a1d 100644 --- a/laravel/form.php +++ b/laravel/form.php @@ -526,7 +526,7 @@ protected static function checkable($type, $name, $value, $checked, $attributes) * @param array $attributes * @return string */ - public static function submit($value, $attributes = array()) + public static function submit($value = null, $attributes = array()) { return static::input('submit', null, $value, $attributes); } @@ -538,7 +538,7 @@ public static function submit($value, $attributes = array()) * @param array $attributes * @return string */ - public static function reset($value, $attributes = array()) + public static function reset($value = null, $attributes = array()) { return static::input('reset', null, $value, $attributes); } @@ -570,7 +570,7 @@ public static function image($url, $name = null, $attributes = array()) * @param array $attributes * @return string */ - public static function button($value, $attributes = array()) + public static function button($value = null, $attributes = array()) { return ''.HTML::entities($value).''; } From f0e261c87fbe8f9832de16a4b5af199c2b20e1f1 Mon Sep 17 00:00:00 2001 From: Alex Bouma Date: Sun, 5 Aug 2012 00:34:54 +0300 Subject: [PATCH 177/260] Changed jQuery '$' to 'jQuery' in the Profiler Changed the '$' to 'jQuery' in profiler.js because it conflicts with libs like 'prototype.js'. I did not use '.noConflict()' because of the people that do use the '$'. Signed-off-by: Alex Bouma --- laravel/profiling/profiler.js | 38 +++++++++++++++++------------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/laravel/profiling/profiler.js b/laravel/profiling/profiler.js index ab73ad8e..8fc9fe3e 100755 --- a/laravel/profiling/profiler.js +++ b/laravel/profiling/profiler.js @@ -6,20 +6,20 @@ var anbu = { // the DOM every time they are used. el: { - main: $('.anbu'), - close: $('#anbu-close'), - zoom: $('#anbu-zoom'), - hide: $('#anbu-hide'), - show: $('#anbu-show'), - tab_pane: $('.anbu-tab-pane'), - hidden_tab_pane: $('.anbu-tab-pane:visible'), - tab: $('.anbu-tab'), - tabs: $('.anbu-tabs'), - tab_links: $('.anbu-tabs a'), - window: $('.anbu-window'), - closed_tabs: $('#anbu-closed-tabs'), - open_tabs: $('#anbu-open-tabs'), - content_area: $('.anbu-content-area') + main: jQuery('.anbu'), + close: jQuery('#anbu-close'), + zoom: jQuery('#anbu-zoom'), + hide: jQuery('#anbu-hide'), + show: jQuery('#anbu-show'), + tab_pane: jQuery('.anbu-tab-pane'), + hidden_tab_pane: jQuery('.anbu-tab-pane:visible'), + tab: jQuery('.anbu-tab'), + tabs: jQuery('.anbu-tabs'), + tab_links: jQuery('.anbu-tabs a'), + window: jQuery('.anbu-window'), + closed_tabs: jQuery('#anbu-closed-tabs'), + open_tabs: jQuery('#anbu-open-tabs'), + content_area: jQuery('.anbu-content-area') }, // CLASS ATTRIBUTES @@ -30,7 +30,7 @@ var anbu = { is_zoomed: false, // initial height of content area - small_height: $('.anbu-content-area').height(), + small_height: jQuery('.anbu-content-area').height(), // the name of the active tab css active_tab: 'anbu-active-tab', @@ -76,7 +76,7 @@ var anbu = { event.preventDefault(); }); anbu.el.tab.click(function(event) { - anbu.clicked_tab($(this)); + anbu.clicked_tab(jQuery(this)); event.preventDefault(); }); @@ -104,8 +104,8 @@ var anbu = { open_window: function(tab) { // can't directly assign this line, but it works - $('.anbu-tab-pane:visible').fadeOut(200); - $('.' + tab.attr(anbu.tab_data)).delay(220).fadeIn(300); + jQuery('.anbu-tab-pane:visible').fadeOut(200); + jQuery('.' + tab.attr(anbu.tab_data)).delay(220).fadeIn(300); anbu.el.tab_links.removeClass(anbu.active_tab); tab.addClass(anbu.active_tab); anbu.el.window.slideDown(300); @@ -178,7 +178,7 @@ var anbu = { anbu.is_zoomed = false; } else { // the 6px is padding on the top of the window - height = ($(window).height() - anbu.el.tabs.height() - 6) + 'px'; + height = (jQuery(window).height() - anbu.el.tabs.height() - 6) + 'px'; anbu.is_zoomed = true; } From 93f5785911158bbeb43da590c062239034aded53 Mon Sep 17 00:00:00 2001 From: Johnson Page Date: Sun, 5 Aug 2012 07:51:09 +1000 Subject: [PATCH 178/260] Update path to index view file. Signed-off-by: Johnson Page --- application/views/home/index.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/views/home/index.blade.php b/application/views/home/index.blade.php index ec7973d7..d3c9bf17 100644 --- a/application/views/home/index.blade.php +++ b/application/views/home/index.blade.php @@ -29,7 +29,7 @@

    And the view sitting before you can be found at:

    -
    {{ path('app') }}views/home/index.php
    +
    {{ path('app') }}views/home/index.blade.php

    Grow in knowledge.

    From 43c3c2de6840d4face81c97ec142c9121e13c283 Mon Sep 17 00:00:00 2001 From: Tobsn Date: Mon, 6 Aug 2012 03:10:39 +0200 Subject: [PATCH 179/260] fixes from testing - all tested now - ready for merge into staging :P --- laravel/validator.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/laravel/validator.php b/laravel/validator.php index 556b116e..d6b97033 100644 --- a/laravel/validator.php +++ b/laravel/validator.php @@ -689,7 +689,7 @@ protected function validate_array($attribute, $value) */ protected function validate_count($attribute, $value, $parameters) { - return (is_array($value) && count($value) == $parameters); + return (is_array($value) && count($value) == $parameters[0]); } /** @@ -702,7 +702,7 @@ protected function validate_count($attribute, $value, $parameters) */ protected function validate_countmin($attribute, $value, $parameters) { - return (is_array($value) && count($value) >= $parameters); + return (is_array($value) && count($value) >= $parameters[0]); } /** @@ -715,7 +715,7 @@ protected function validate_countmin($attribute, $value, $parameters) */ protected function validate_countmax($attribute, $value, $parameters) { - return (is_array($value) && count($value) <= $parameters); + return (is_array($value) && count($value) <= $parameters[0]); } /** @@ -1027,7 +1027,7 @@ protected function replace_after($message, $attribute, $rule, $parameters) */ protected function replace_count($message, $attribute, $rule, $parameters) { - return str_replace(':count', $parameters, $message); + return str_replace(':count', $parameters[0], $message); } /** @@ -1041,7 +1041,7 @@ protected function replace_count($message, $attribute, $rule, $parameters) */ protected function replace_countmin($message, $attribute, $rule, $parameters) { - return str_replace(':min', $parameters, $message); + return str_replace(':min', $parameters[0], $message); } /** @@ -1055,7 +1055,7 @@ protected function replace_countmin($message, $attribute, $rule, $parameters) */ protected function replace_countmax($message, $attribute, $rule, $parameters) { - return str_replace(':max', $parameters, $message); + return str_replace(':max', $parameters[0], $message); } /** From 8227784e114df03c92a5708bdafe8f7e0fb4904b Mon Sep 17 00:00:00 2001 From: Simon Aebersold Date: Tue, 7 Aug 2012 17:24:02 +0200 Subject: [PATCH 180/260] Documentation Error, see /laravel/html.php line 225 for reference --- laravel/documentation/views/html.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/views/html.md b/laravel/documentation/views/html.md index d1fcae9b..4465b772 100644 --- a/laravel/documentation/views/html.md +++ b/laravel/documentation/views/html.md @@ -85,7 +85,7 @@ #### Generating a link to a controller action: ### Generating a link to a controller action with wildcard values: - echo HTML::link_to_action('user@profile', array($username)); + echo HTML::link_to_action('user@profile', 'User Profile', array($username)); ## Mail-To Links From 0d718bbf30fd96c92163883d06552eed97180f44 Mon Sep 17 00:00:00 2001 From: Sinan Eldem Date: Wed, 8 Aug 2012 11:36:28 +0300 Subject: [PATCH 181/260] Added Turkish language files. Signed-off-by: Sinan Eldem --- application/language/tr/pagination.php | 28 +++++++ application/language/tr/validation.php | 108 +++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 application/language/tr/pagination.php create mode 100644 application/language/tr/validation.php diff --git a/application/language/tr/pagination.php b/application/language/tr/pagination.php new file mode 100644 index 00000000..fce594d6 --- /dev/null +++ b/application/language/tr/pagination.php @@ -0,0 +1,28 @@ + + * @link http://sinaneldem.com.tr + */ + +return array( + + /* + |-------------------------------------------------------------------------- + | Pagination Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used by the paginator library to build + | the pagination links. You're free to change them to anything you want. + | If you come up with something more exciting, let us know. + | + */ + + 'previous' => '« Önceki', + 'next' => 'Sonraki »', + +); \ No newline at end of file diff --git a/application/language/tr/validation.php b/application/language/tr/validation.php new file mode 100644 index 00000000..18cb0458 --- /dev/null +++ b/application/language/tr/validation.php @@ -0,0 +1,108 @@ + + * @link http://sinaneldem.com.tr + */ + +return array( + + /* + |-------------------------------------------------------------------------- + | Validation Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines contain the default error messages used + | by the validator class. Some of the rules contain multiple versions, + | such as the size (max, min, between) rules. These versions are used + | for different input types such as strings and files. + | + | These language lines may be easily changed to provide custom error + | messages in your application. Error messages for custom validation + | rules may also be added to this file. + | + */ + + "accepted" => ":attribute kabul edilmelidir.", + "active_url" => ":attribute geçerli bir URL olmalıdır.", + "after" => ":attribute şundan daha eski bir tarih olmalıdır :date.", + "alpha" => ":attribute sadece harflerden oluşmalıdır.", + "alpha_dash" => ":attribute sadece harfler, rakamlar ve tirelerden oluşmalıdır.", + "alpha_num" => ":attribute sadece harfler ve rakamlar içermelidir.", + "before" => ":attribute şundan daha önceki bir tarih olmalıdır :date.", + "between" => array( + "numeric" => ":attribute :min - :max arasında olmalıdır.", + "file" => ":attribute :min - :max arasındaki kilobyte değeri olmalıdır.", + "string" => ":attribute :min - :max arasında karakterden oluşmalıdır.", + ), + "confirmed" => ":attribute onayı eşleşmiyor.", + "different" => ":attribute ile :other birbirinden farklı olmalıdır.", + "email" => ":attribute biçimi geçersiz.", + "exists" => "Seçili :attribute geçersiz.", + "image" => ":attribute resim dosyası olmalıdır.", + "in" => "selected :attribute geçersiz.", + "integer" => ":attribute rakam olmalıdır.", + "ip" => ":attribute geçerli bir IP adresi olmalıdır.", + "match" => ":attribute biçimi geçersiz.", + "max" => array( + "numeric" => ":attribute şundan küçük olmalıdır :max.", + "file" => ":attribute şundan küçük olmalıdır :max kilobyte.", + "string" => ":attribute şundan küçük olmalıdır :max karakter.", + ), + "mimes" => ":attribute dosya biçimi :values olmalıdır.", + "min" => array( + "numeric" => ":attribute en az :min olmalıdır.", + "file" => ":attribute en az :min kilobyte olmalıdır.", + "string" => ":attribute en az :min karakter olmalıdır.", + ), + "not_in" => "Seçili :attribute geçersiz.", + "numeric" => ":attribute rakam olmalıdır.", + "required" => ":attribute alanı gereklidir.", + "same" => ":attribute ile :other eşleşmelidir.", + "size" => array( + "numeric" => ":attribute :size olmalıdır.", + "file" => ":attribute :size kilobyte olmalıdır.", + "string" => ":attribute :size karakter olmalıdır.", + ), + "unique" => ":attribute daha önceden kayıt edilmiş.", + "url" => ":attribute biçimi geçersiz.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file From e5dc10840ad0a05d4b6bc9ce73737d00c2052bc0 Mon Sep 17 00:00:00 2001 From: Spencer Deinum Date: Thu, 9 Aug 2012 15:44:34 -0400 Subject: [PATCH 182/260] Fix documentation error in input.md Documentation says "Replacing the entire input" but calls Input::merge() instead of Input::replace(). Signed-off-by: Spencer Deinum --- laravel/documentation/input.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/input.md b/laravel/documentation/input.md index 14221ecd..c9272a8b 100644 --- a/laravel/documentation/input.md +++ b/laravel/documentation/input.md @@ -145,4 +145,4 @@ #### Merging new data into the current input: #### Replacing the entire input array with new data: - Input::merge(array('doctor' => 'Bones', 'captain' => 'Kirk')); \ No newline at end of file + Input::replace(array('doctor' => 'Bones', 'captain' => 'Kirk')); From d31f89d42f716b08b3fd3369d7b5d53aefcaca2d Mon Sep 17 00:00:00 2001 From: Joe Wallace Date: Thu, 9 Aug 2012 22:10:49 -0500 Subject: [PATCH 183/260] Fixing a bug with saving data to pivot table --- laravel/database/eloquent/pivot.php | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/laravel/database/eloquent/pivot.php b/laravel/database/eloquent/pivot.php index d2878bb5..a90d7e7d 100644 --- a/laravel/database/eloquent/pivot.php +++ b/laravel/database/eloquent/pivot.php @@ -26,7 +26,7 @@ class Pivot extends Model { public function __construct($table, $connection = null) { $this->pivot_table = $table; - $this->connection = $connection; + static::$connection = $connection; parent::__construct(array(), true); } @@ -41,14 +41,4 @@ public function table() return $this->pivot_table; } - /** - * Get the connection used by the pivot table. - * - * @return string - */ - public function connection() - { - return $this->connection; - } - } \ No newline at end of file From 79f92e57dfa6b0c49b92c310432080ad5ca51c2c Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Thu, 9 Aug 2012 22:42:03 -0500 Subject: [PATCH 184/260] defer language support in URIs to version 4. --- application/config/application.php | 13 --------- laravel/laravel.php | 42 ++---------------------------- laravel/url.php | 8 ------ 3 files changed, 2 insertions(+), 61 deletions(-) diff --git a/application/config/application.php b/application/config/application.php index 60735a60..525227c2 100755 --- a/application/config/application.php +++ b/application/config/application.php @@ -94,19 +94,6 @@ 'language' => 'en', - /* - |-------------------------------------------------------------------------- - | Supported Languages - |-------------------------------------------------------------------------- - | - | These languages may also be supported by your application. If a request - | enters your application with a URI beginning with one of these values - | the default language will automatically be set to that language. - | - */ - - 'languages' => array(), - /* |-------------------------------------------------------------------------- | SSL Link Generation diff --git a/laravel/laravel.php b/laravel/laravel.php index 1f908eed..2772e323 100644 --- a/laravel/laravel.php +++ b/laravel/laravel.php @@ -107,46 +107,6 @@ return Event::first('404'); }); -/* -|-------------------------------------------------------------------------- -| Gather The URI And Locales -|-------------------------------------------------------------------------- -| -| When routing, we'll need to grab the URI and the supported locales for -| the route so we can properly set the language and route the request -| to the proper end-point in the application. -| -*/ - -$uri = URI::current(); - -$locales = Config::get('application.languages', array()); - -$locales[] = Config::get('application.language'); - -/* -|-------------------------------------------------------------------------- -| Set The Locale Based On Route -|-------------------------------------------------------------------------- -| -| If the URI starts with one of the supported languages, we will set -| the default language to match that URI segment and shorten the -| URI we'll pass to the router to not include the lang segment. -| -*/ - -foreach ($locales as $locale) -{ - if (starts_with($uri, $locale)) - { - Config::set('application.language', $locale); - - $uri = trim(substr($uri, strlen($locale)), '/'); break; - } -} - -if ($uri === '') $uri = '/'; - /* |-------------------------------------------------------------------------- | Route The Incoming Request @@ -158,6 +118,8 @@ | */ +$uri = URI::current(); + Request::$route = Routing\Router::route(Request::method(), $uri); $response = Request::$route->call(); diff --git a/laravel/url.php b/laravel/url.php index 3ad6a3e2..2b97128c 100644 --- a/laravel/url.php +++ b/laravel/url.php @@ -107,14 +107,6 @@ public static function to($url = '', $https = null) $root = static::base().'/'.Config::get('application.index'); - // If multiple languages are being supported via URIs, we will append current - // language to the URI so all redirects and URLs generated include the - // current language so it is not lost on further requests. - if (count(Config::get('application.languages')) > 0) - { - $root .= '/'.Config::get('application.language'); - } - // Since SSL is not often used while developing the application, we allow the // developer to disable SSL on all framework generated links to make it more // convenient to work with the site while developing locally. From 343d1327374b35c5a6e122c4ebc0f777eabdcd43 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Thu, 9 Aug 2012 22:42:35 -0500 Subject: [PATCH 185/260] tweak change log. --- laravel/documentation/changes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/changes.md b/laravel/documentation/changes.md index d969d5a2..85608740 100644 --- a/laravel/documentation/changes.md +++ b/laravel/documentation/changes.md @@ -38,7 +38,7 @@ ## Laravel 3.2.4 - Speed up many to many eager loading mapping. - Tweak the Eloquent::changed() method. -- Added support for locales in the URI. +- Various bug fixes and improvements. ## Upgrading From 3.2.3 From a95b5eb4b9a6a3f6f6bcee28f20979f663963ef6 Mon Sep 17 00:00:00 2001 From: Jason Lewis Date: Sun, 12 Aug 2012 02:15:52 +0930 Subject: [PATCH 186/260] Defer URI language support to L4. Signed-off-by: Jason Lewis --- laravel/url.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/laravel/url.php b/laravel/url.php index 2b97128c..4ff0f474 100644 --- a/laravel/url.php +++ b/laravel/url.php @@ -242,11 +242,6 @@ public static function to_asset($url, $https = null) $url = str_replace($index.'/', '', $url); } - if (count(Config::get('application.languages')) > 0) - { - $url = str_replace(Config::get('application.language').'/', '', $url); - } - return $url; } From f68559718044ab52d798860f9c845196834ee998 Mon Sep 17 00:00:00 2001 From: Jason Lewis Date: Sun, 12 Aug 2012 02:16:11 +0930 Subject: [PATCH 187/260] Defer URI language support to L4. Signed-off-by: Jason Lewis --- laravel/url.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/laravel/url.php b/laravel/url.php index 2b97128c..4ff0f474 100644 --- a/laravel/url.php +++ b/laravel/url.php @@ -242,11 +242,6 @@ public static function to_asset($url, $https = null) $url = str_replace($index.'/', '', $url); } - if (count(Config::get('application.languages')) > 0) - { - $url = str_replace(Config::get('application.language').'/', '', $url); - } - return $url; } From 1bd157d0a6916b75b8da9d1106ef31b356f41204 Mon Sep 17 00:00:00 2001 From: Jason Lewis Date: Sun, 12 Aug 2012 02:48:55 +0930 Subject: [PATCH 188/260] Added in develop changes. Signed-off-by: Jason Lewis --- laravel/documentation/changes.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/laravel/documentation/changes.md b/laravel/documentation/changes.md index 85608740..7f70c817 100644 --- a/laravel/documentation/changes.md +++ b/laravel/documentation/changes.md @@ -2,6 +2,7 @@ # Laravel Change Log ## Contents +- [Develop](#develop) - [Laravel 3.2.4](#3.2.4) - [Upgrading From 3.2.3](#upgrade-3.2.4) - [Laravel 3.2.3](#3.2.3) @@ -33,6 +34,12 @@ ## Contents - [Laravel 3.1](#3.1) - [Upgrading From 3.0](#upgrade-3.1) + +## Develop + +- Added Turkish language files. +- Changed jQuery '$' to 'jQuery' in the Profiler. + ## Laravel 3.2.4 From e3a000af4100a0f8614dc75cd08e7de06c041b0f Mon Sep 17 00:00:00 2001 From: Kelly Banman Date: Sat, 11 Aug 2012 15:52:58 -0700 Subject: [PATCH 189/260] Fix Query::lists() for empty resultsets --- laravel/database/query.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/database/query.php b/laravel/database/query.php index c77ad65b..82a827e3 100644 --- a/laravel/database/query.php +++ b/laravel/database/query.php @@ -605,7 +605,7 @@ public function lists($column, $key = null) // set the keys on the array of values using the array_combine // function provided by PHP, which should give us the proper // array form to return from the method. - if ( ! is_null($key)) + if ( ! is_null($key) && count($results)) { return array_combine(array_map(function($row) use ($key) { From 41e3c95ed6d190a709184779eeb16b2246e0ddd1 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 13 Aug 2012 19:03:59 +0300 Subject: [PATCH 190/260] Add German translations for new array validator. --- application/language/de/validation.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/application/language/de/validation.php b/application/language/de/validation.php index 80c3874e..170cc261 100644 --- a/application/language/de/validation.php +++ b/application/language/de/validation.php @@ -24,7 +24,7 @@ "alpha" => ":attribute darf nur Buchstaben beinhalten.", "alpha_dash" => ":attribute sollte nur aus Buchstaben, Nummern und Bindestrichen bestehen.", "alpha_num" => ":attribute sollte nur aus Buchstaben und Nummern bestehen.", - "array" => "The :attribute must have selected elements.", + "array" => ":attribute muss ausgewählte Elemente haben.", "before" => ":attribute muss ein Datum vor dem :date sein.", "between" => array( "numeric" => ":attribute muss zwischen :min und :max liegen.", @@ -32,10 +32,10 @@ "string" => ":attribute muss zwischen :min und :max Zeichen lang sein.", ), "confirmed" => ":attribute stimmt nicht mit der Bestätigung überein.", - "count" => "The :attribute must have exactly :count selected elements.", - "countbetween" => "The :attribute must have between :min and :max selected elements.", - "countmax" => "The :attribute must have less than :max selected elements.", - "countmin" => "The :attribute must have at least :min selected elements.", + "count" => ":attribute muss genau :count ausgewählte Elemente haben.", + "countbetween" => ":attribute muss zwischen :min und :max ausgewählte Elemente haben.", + "countmax" => ":attribute muss weniger als :max ausgewählte Elemente haben.", + "countmin" => ":attribute muss mindestens :min ausgewählte Elemente haben.", "different" => ":attribute und :other müssen verschieden sein.", "email" => ":attribute ist keine gültige Email-Adresse.", "exists" => "Der gewählte Wert für :attribute ist ungültig.", From 97761f08f16b469fe4af7c2efdaef7542e3fc32a Mon Sep 17 00:00:00 2001 From: Dayle Rees Date: Tue, 14 Aug 2012 12:04:49 +0200 Subject: [PATCH 191/260] missing a from attribute --- application/language/pl/validation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/language/pl/validation.php b/application/language/pl/validation.php index 65d8553a..0ec36d57 100644 --- a/application/language/pl/validation.php +++ b/application/language/pl/validation.php @@ -27,7 +27,7 @@ "array" => "The :attribute must have selected elements.", "before" => ":attribute musi zawierać datę, która jest przed :date.", "between" => array( - "numeric" => ":ttribute musi mieścić się w granicach :min - :max.", + "numeric" => ":attribute musi mieścić się w granicach :min - :max.", "file" => ":attribute musi mieć :min - :max kilobajtów.", "string" => ":attribute musi mieć :min - :max znaków.", ), From abd30eb3388fc566feea97e3ec8052049f6e7c3e Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Wed, 15 Aug 2012 17:26:33 +0300 Subject: [PATCH 192/260] Fix contribution page links in documentation. --- laravel/documentation/contents.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/laravel/documentation/contents.md b/laravel/documentation/contents.md index 88a7ac24..d29b3908 100644 --- a/laravel/documentation/contents.md +++ b/laravel/documentation/contents.md @@ -113,6 +113,6 @@ ### Artisan CLI ### Contributing -- [Laravel on GitHub](docs/contrib/github) -- [Command Line](docs/contrib/command-line) -- [TortoiseGit](docs/contrib/tortoisegit) +- [Laravel on GitHub](/docs/contrib/github) +- [Command Line](/docs/contrib/command-line) +- [TortoiseGit](/docs/contrib/tortoisegit) From 5359085eda700e106d8e076cbb7b819c912ee372 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Wed, 15 Aug 2012 17:27:50 +0300 Subject: [PATCH 193/260] Fix contribution page links in documentation. --- laravel/documentation/contents.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/laravel/documentation/contents.md b/laravel/documentation/contents.md index 88a7ac24..d29b3908 100644 --- a/laravel/documentation/contents.md +++ b/laravel/documentation/contents.md @@ -113,6 +113,6 @@ ### Artisan CLI ### Contributing -- [Laravel on GitHub](docs/contrib/github) -- [Command Line](docs/contrib/command-line) -- [TortoiseGit](docs/contrib/tortoisegit) +- [Laravel on GitHub](/docs/contrib/github) +- [Command Line](/docs/contrib/command-line) +- [TortoiseGit](/docs/contrib/tortoisegit) From 1c7297dc028a6f8d75c109a2321b1879e6bfb367 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Wed, 15 Aug 2012 17:33:22 +0300 Subject: [PATCH 194/260] Contrib docs: Remove pointless staging branch info. --- laravel/documentation/contrib/github.md | 1 - 1 file changed, 1 deletion(-) diff --git a/laravel/documentation/contrib/github.md b/laravel/documentation/contrib/github.md index 5d9f43e9..df4980b7 100644 --- a/laravel/documentation/contrib/github.md +++ b/laravel/documentation/contrib/github.md @@ -24,7 +24,6 @@ ## Branches The **laravel** repository has multiple branches, each serving a specific purpose: - **master** - This is the Laravel release branch. Active development does not happen on this branch. This branch is only for the most recent, stable Laravel core code. When you download Laravel from [laravel.com](http://laravel.com/), you are downloading directly from this master branch. *Do not make pull requests to this branch.* -- **staging** - I'm not sure what this is for... Last minute testing before pushing develop to master? - **develop** - This is the working development branch. All proposed code changes and contributions by the community are pulled into this branch. *When you make a pull request to the Laravel project, this is the branch you want to pull-request into.* Once certain milestones have been reached and/or Taylor Otwell and the Laravel team is happy with the stability and additional features of the current development branch, the changes in the **develop** branch are pulled into the **master** branch, thus creating and releasing the newest stable version of Laravel for the world to use. From 67464cb0f80d73fb29e47a05f7f14baa39cb1df8 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Wed, 15 Aug 2012 10:45:37 -0400 Subject: [PATCH 195/260] Fix typo in Github page table of contents. --- laravel/documentation/contrib/github.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/contrib/github.md b/laravel/documentation/contrib/github.md index df4980b7..4a0f69f4 100644 --- a/laravel/documentation/contrib/github.md +++ b/laravel/documentation/contrib/github.md @@ -3,7 +3,7 @@ # Laravel on GitHub ## Contents - [The Basics](#the-basics) -- [Repositories](#repositoriess) +- [Repositories](#repositories) - [Branches](#branches) From f80d694a9500821ad9b1f5ee2f70ba7865a230bb Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Wed, 15 Aug 2012 10:47:51 -0400 Subject: [PATCH 196/260] Contrib docs: add section stub about pull requests. --- laravel/documentation/contrib/github.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/laravel/documentation/contrib/github.md b/laravel/documentation/contrib/github.md index 4a0f69f4..c8c30daa 100644 --- a/laravel/documentation/contrib/github.md +++ b/laravel/documentation/contrib/github.md @@ -5,20 +5,21 @@ ## Contents - [The Basics](#the-basics) - [Repositories](#repositories) - [Branches](#branches) +- [Pull Requests](#pull-requests) - + ## The Basics Because Laravel's development and source control is done through GitHub, anyone is able to make contributions to it. Anyone can fix bugs, add features or improve the documentation. After submitting proposed changes to the project, the Laravel team will review the changes and make the decision to commit them to Laravel's core. - + ## Repositories Laravel's home on GitHub is at [github.com/laravel](https://github.com/laravel). Laravel has several repositories. For basic contributions, the only repository you need to pay attention to is the **laravel** repository, located at [github.com/laravel/laravel](https://github.com/laravel/laravel). - + ## Branches The **laravel** repository has multiple branches, each serving a specific purpose: @@ -28,6 +29,11 @@ ## Branches Once certain milestones have been reached and/or Taylor Otwell and the Laravel team is happy with the stability and additional features of the current development branch, the changes in the **develop** branch are pulled into the **master** branch, thus creating and releasing the newest stable version of Laravel for the world to use. + +## Pull Requests + +Contributing with pull requests. + *Further Reading* - [Contributing to Laravel via Command-Line](docs/contrib/command-line) From 385b776ba812c991678c85d6931833885b62c1d4 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Wed, 15 Aug 2012 11:47:27 -0400 Subject: [PATCH 197/260] Docs: Finish section on pull request guidelines. --- laravel/documentation/contrib/github.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/laravel/documentation/contrib/github.md b/laravel/documentation/contrib/github.md index c8c30daa..ceeac76e 100644 --- a/laravel/documentation/contrib/github.md +++ b/laravel/documentation/contrib/github.md @@ -32,7 +32,13 @@ ## Branches ## Pull Requests -Contributing with pull requests. +[GitHub pull requests](https://help.github.com/articles/using-pull-requests) are a great way for everyone in the community to contribute to the Laravel codebase. Found a bug? Just fix it in your fork and submit a pull request. This will then be reviewed, and, if found as good, merged into the main repository. + +In order to keep the codebase clean, stable and at high quality, even with so many people contributing, some guidelines are necessary for high-quality pull requests: + +- **Branch:** Unless they are immediate documentation fixes relevant for old versions, pull requests should be sent to the `develop` branch only. Make sure to select that branch as target when creating the pull request (GitHub will not automatically select it.) +- **Documentation:** If you are adding a new feature or changing the API in any relevant way, this should be documented. The documentation files can be found directly in the core repository. +- **Unit tests:** To keep old bugs from re-appearing and generally hold quality at a high level, the Laravel core is thoroughly unit-tested. Thus, when you create a pull request, it is expected that you unit test any new code you add. For any bug you fix, you should also add regression tests to make sure the bug will never appear again. If you are unsure about how to write tests, the core team or other contributors will gladly help. *Further Reading* From 6c9d903e584f9b3a09c01d8c96bcc33015286efb Mon Sep 17 00:00:00 2001 From: Spencer Deinum Date: Thu, 16 Aug 2012 17:18:50 -0400 Subject: [PATCH 198/260] Added Command::run() to the documentation for artisan tasks. Signed-off-by: Spencer Deinum --- laravel/documentation/artisan/tasks.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/laravel/documentation/artisan/tasks.md b/laravel/documentation/artisan/tasks.md index 08e6606c..a5ab78b6 100644 --- a/laravel/documentation/artisan/tasks.md +++ b/laravel/documentation/artisan/tasks.md @@ -38,6 +38,14 @@ #### Calling a task and passing arguments: php artisan notify taylor +#### Calling a task from your application: + + Command::run(array('notify')); + +#### Calling a task from your application with arguements: + + Command::run(array('notify', 'taylor')); + Remember, you can call specific methods on your task, so, let's add an "urgent" method to the notify task: #### Adding a method to the task: @@ -97,4 +105,4 @@ #### Setting the Laravel environment: #### Setting the default database connection: - php artisan foo --database=sqlite \ No newline at end of file + php artisan foo --database=sqlite From 9718d5cd0de681c75a667efaa4076cbaab035380 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 17 Aug 2012 09:02:32 -0500 Subject: [PATCH 199/260] fix nested queries. --- laravel/database/eloquent/query.php | 31 +++++++++---------- laravel/database/query.php | 48 +++++++++++++++++++---------- laravel/documentation/changes.md | 14 ++++++--- 3 files changed, 56 insertions(+), 37 deletions(-) diff --git a/laravel/database/eloquent/query.php b/laravel/database/eloquent/query.php index fa739d55..3aee79c9 100644 --- a/laravel/database/eloquent/query.php +++ b/laravel/database/eloquent/query.php @@ -38,7 +38,7 @@ class Query { ); /** - * Create a new query instance for a model. + * Creat a new query instance for a model. * * @param Model $model * @return void @@ -118,7 +118,7 @@ public function hydrate($model, $results) $new = new $class(array(), true); // We need to set the attributes manually in case the accessible property is - // set on the array which will prevent the mass assignment of attributes if + // set on the array which will prevent the mass assignemnt of attributes if // we were to pass them in using the constructor or fill methods. $new->fill_raw($result); @@ -141,7 +141,7 @@ public function hydrate($model, $results) } } - // The many to many relationships may have pivot table columns on them + // The many to many relationships may have pivot table column on them // so we will call the "clean" method on the relationship to remove // any pivot columns that are on the model. if ($this instanceof Relationships\Has_Many_And_Belongs_To) @@ -199,7 +199,7 @@ protected function nested_includes($relationship) foreach ($this->model_includes() as $include => $constraints) { // To get the nested includes, we want to find any includes that begin - // the relationship with a dot, then we will strip off the leading + // the relationship and a dot, then we will strip off the leading // nesting indicator and set the include in the array. if (starts_with($include, $relationship.'.')) { @@ -217,23 +217,22 @@ protected function nested_includes($relationship) */ protected function model_includes() { - $relationships = array_keys($this->model->includes); - $implicits = array(); + $includes = array(); - foreach ($relationships as $relationship) + foreach ($this->model->includes as $relationship => $constraints) { - $parts = explode('.', $relationship); - - $prefix = ''; - foreach ($parts as $part) + // When eager loading relationships, constraints may be set on the eager + // load definition; however, is none are set, we need to swap the key + // and the value of the array since there are no constraints. + if (is_numeric($relationship)) { - $implicits[$prefix.$part] = NULL; - $prefix .= $part.'.'; + list($relationship, $constraints) = array($constraints, null); } + + $includes[$relationship] = $constraints; } - // Add all implicit includes to the explicit ones - return $this->model->includes + $implicits; + return $includes; } /** @@ -278,4 +277,4 @@ public function __call($method, $parameters) return $this; } -} +} \ No newline at end of file diff --git a/laravel/database/query.php b/laravel/database/query.php index c77ad65b..83c92b83 100644 --- a/laravel/database/query.php +++ b/laravel/database/query.php @@ -2,7 +2,7 @@ use Closure; use Laravel\Database; -use Paginator; +use Laravel\Paginator; use Laravel\Database\Query\Grammars\Postgres; use Laravel\Database\Query\Grammars\SQLServer; @@ -140,7 +140,7 @@ public function distinct() */ public function select($columns = array('*')) { - $this->selects = is_array($columns) ? $columns : array($columns); + $this->selects = (array) $columns; return $this; } @@ -158,7 +158,7 @@ public function join($table, $column1, $operator = null, $column2 = null, $type { // If the "column" is really an instance of a Closure, the developer is // trying to create a join with a complex "ON" clause. So, we will add - // the join, and then call the Closure with the join. + // the join, and then call the Closure with the join/ if ($column1 instanceof Closure) { $this->joins[] = new Query\Join($type, $table); @@ -168,7 +168,7 @@ public function join($table, $column1, $operator = null, $column2 = null, $type // If the column is just a string, we can assume that the join just // has a simple on clause, and we'll create the join instance and - // add the clause automatically for the developer. + // add the clause automatically for the develoepr. else { $join = new Query\Join($type, $table); @@ -283,7 +283,7 @@ public function or_where($column, $operator = null, $value = null) */ public function or_where_id($value) { - return $this->or_where('id', '=', $value); + return $this->or_where('id', '=', $value); } /** @@ -395,7 +395,7 @@ public function or_where_not_null($column) } /** - * Add nested constraints to the query. + * Add a nested where condition to the query. * * @param Closure $callback * @param string $connector @@ -403,7 +403,24 @@ public function or_where_not_null($column) */ public function where_nested($callback, $connector = 'AND') { - call_user_func($callback, $this); + $type = 'where_nested'; + + // To handle a nested where statement, we will actually instantiate a new + // Query instance and run the callback over that instance, which will + // allow the developer to have a fresh query instance + $query = new Query($this->connection, $this->grammar, $this->from); + + call_user_func($callback, $query); + + // Once the callback has been run on the query, we will store the nested + // query instance on the where clause array so that it's passed to the + // query's query grammar instance when building. + if ($query->wheres !== null) + { + $this->wheres[] = compact('type', 'query', 'connector'); + } + + $this->bindings = array_merge($this->bindings, $query->bindings); return $this; } @@ -436,7 +453,7 @@ private function dynamic_where($method, $parameters) foreach ($segments as $segment) { - // If the segment is not a boolean connector, we can assume it is + // If the segment is not a boolean connector, we can assume it it is // a column name, and we'll add it to the query as a new constraint // of the query's where clause and keep iterating the segments. if ($segment != '_and_' and $segment != '_or_') @@ -475,7 +492,6 @@ public function group_by($column) * @param string $column * @param string $operator * @param mixed $value - * @return Query */ public function having($column, $operator, $value) { @@ -660,7 +676,7 @@ public function get($columns = array('*')) public function aggregate($aggregator, $columns) { // We'll set the aggregate value so the grammar does not try to compile - // a SELECT clause on the query. If an aggregator is present, its own + // a SELECT clause on the query. If an aggregator is present, it's own // grammar function will be used to build the SQL syntax. $this->aggregate = compact('aggregator', 'columns'); @@ -687,7 +703,7 @@ public function paginate($per_page = 20, $columns = array('*')) { // Because some database engines may throw errors if we leave orderings // on the query when retrieving the total number of records, we'll drop - // all of the orderings and put them back on the query. + // all of the ordreings and put them back on the query. list($orderings, $this->orderings) = array($this->orderings, null); $total = $this->count(reset($columns)); @@ -714,12 +730,12 @@ public function insert($values) { // Force every insert to be treated like a batch insert to make creating // the binding array simpler since we can just spin through the inserted - // rows as if there was more than one every time. + // rows as if there/ was more than one every time. if ( ! is_array(reset($values))) $values = array($values); $bindings = array(); - // We need to merge the insert values into the array of the query + // We need to merge the the insert values into the array of the query // bindings so that they will be bound to the PDO statement when it // is executed by the database connection. foreach ($values as $value) @@ -820,7 +836,7 @@ public function update($values) /** * Execute the query as a DELETE statement. * - * Optionally, an ID may be passed to the method to delete a specific row. + * Optionally, an ID may be passed to the method do delete a specific row. * * @param int $id * @return int @@ -837,7 +853,7 @@ public function delete($id = null) $sql = $this->grammar->delete($this); - return $this->connection->query($sql, $this->bindings); + return $this->connection->query($sql, $this->bindings); } /** @@ -853,7 +869,7 @@ public function __call($method, $parameters) } // All of the aggregate methods are handled by a single method, so we'll - // catch them all here and then pass them off to the aggregate method + // catch them all here and then pass them off to the agregate method // instead of creating methods for each one of them. if (in_array($method, array('count', 'min', 'max', 'avg', 'sum'))) { diff --git a/laravel/documentation/changes.md b/laravel/documentation/changes.md index 7f70c817..5ff87c38 100644 --- a/laravel/documentation/changes.md +++ b/laravel/documentation/changes.md @@ -2,7 +2,8 @@ # Laravel Change Log ## Contents -- [Develop](#develop) +- [Laravel 3.2.5](#3.2.5) +- [Upgrading From 3.2.4](#upgrade-3.2.5) - [Laravel 3.2.4](#3.2.4) - [Upgrading From 3.2.3](#upgrade-3.2.4) - [Laravel 3.2.3](#3.2.3) @@ -34,11 +35,14 @@ ## Contents - [Laravel 3.1](#3.1) - [Upgrading From 3.0](#upgrade-3.1) - -## Develop + -- Added Turkish language files. -- Changed jQuery '$' to 'jQuery' in the Profiler. +- Revert nested where code back to 3.2.3 tag. + + +## Upgrading From 3.2.4 + +- Replace the **laravel** folder. ## Laravel 3.2.4 From e8119f810981b47fddfa7717e68018f9b530967d Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 17 Aug 2012 09:04:17 -0500 Subject: [PATCH 200/260] increment version. --- artisan | 2 +- paths.php | 2 +- public/index.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/artisan b/artisan index bd0f3cbb..5127755f 100644 --- a/artisan +++ b/artisan @@ -4,7 +4,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.4 + * @version 3.2.5 * @author Taylor Otwell * @link http://laravel.com */ diff --git a/paths.php b/paths.php index bf56f2eb..824f8ea0 100644 --- a/paths.php +++ b/paths.php @@ -3,7 +3,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.4 + * @version 3.2.5 * @author Taylor Otwell * @link http://laravel.com */ diff --git a/public/index.php b/public/index.php index fb2a1902..4c5604ba 100644 --- a/public/index.php +++ b/public/index.php @@ -3,7 +3,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.4 + * @version 3.2.5 * @author Taylor Otwell * @link http://laravel.com */ From 1203473469b1fad5e803182bfb3350c28649963f Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 17 Aug 2012 09:18:16 -0500 Subject: [PATCH 201/260] revert eloquent back to 3.2.3 --- laravel/database/eloquent/model.php | 26 +++------------ .../eloquent/relationships/belongs_to.php | 5 ++- .../eloquent/relationships/has_many.php | 5 ++- .../relationships/has_many_and_belongs_to.php | 32 +++++++------------ .../eloquent/relationships/has_one.php | 5 ++- 5 files changed, 22 insertions(+), 51 deletions(-) diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index a5baf82e..61a7769c 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -255,22 +255,7 @@ public static function all() */ public function _with($includes) { - $includes = (array) $includes; - - $this->includes = array(); - - foreach ($includes as $relationship => $constraints) - { - // When eager loading relationships, constraints may be set on the eager - // load definition; however, is none are set, we need to swap the key - // and the value of the array since there are no constraints. - if (is_numeric($relationship)) - { - list($relationship, $constraints) = array($constraints, null); - } - - $this->includes[$relationship] = $constraints; - } + $this->includes = (array) $includes; return $this; } @@ -533,7 +518,7 @@ public function get_dirty() foreach ($this->attributes as $key => $value) { - if ( ! array_key_exists($key, $this->original) or $value !== $this->original[$key]) + if ( ! isset($this->original[$key]) or $value !== $this->original[$key]) { $dirty[$key] = $value; } @@ -567,7 +552,6 @@ public function set_key($value) * Get a given attribute from the model. * * @param string $key - * @return mixed */ public function get_attribute($key) { @@ -723,7 +707,7 @@ public function __isset($key) { foreach (array('attributes', 'relationships') as $source) { - if (array_key_exists($key, $this->$source)) return !is_null($this->$source[$key]); + if (array_key_exists($key, $this->$source)) return true; } if (method_exists($this, $key)) return true; @@ -754,7 +738,7 @@ public function __call($method, $parameters) { $meta = array('key', 'table', 'connection', 'sequence', 'per_page', 'timestamps'); - // If the method is actually the name of a static property on the model, we'll + // If the method is actually the name of a static property on the model we'll // return the value of the static property. This makes it convenient for // relationships to access these values off of the instances. if (in_array($method, $meta)) @@ -764,7 +748,7 @@ public function __call($method, $parameters) $underscored = array('with', 'find'); - // Some methods need to be accessed both statically and non-statically so we'll + // Some methods need to be accessed both staticly and non-staticly so we'll // keep underscored methods of those methods and intercept calls to them // here so they can be called either way on the model instance. if (in_array($method, $underscored)) diff --git a/laravel/database/eloquent/relationships/belongs_to.php b/laravel/database/eloquent/relationships/belongs_to.php index e000ca40..ef257836 100644 --- a/laravel/database/eloquent/relationships/belongs_to.php +++ b/laravel/database/eloquent/relationships/belongs_to.php @@ -79,9 +79,8 @@ public function eagerly_constrain($results) /** * Match eagerly loaded child models to their parent models. * - * @param string $relationship - * @param array $children - * @param array $parents + * @param array $children + * @param array $parents * @return void */ public function match($relationship, &$children, $parents) diff --git a/laravel/database/eloquent/relationships/has_many.php b/laravel/database/eloquent/relationships/has_many.php index 92a1bcde..726bef20 100644 --- a/laravel/database/eloquent/relationships/has_many.php +++ b/laravel/database/eloquent/relationships/has_many.php @@ -83,9 +83,8 @@ public function initialize(&$parents, $relationship) /** * Match eagerly loaded child models to their parent models. * - * @param string $relationship - * @param array $parents - * @param array $children + * @param array $parents + * @param array $children * @return void */ public function match($relationship, &$parents, $children) diff --git a/laravel/database/eloquent/relationships/has_many_and_belongs_to.php b/laravel/database/eloquent/relationships/has_many_and_belongs_to.php index dad17522..52276a5f 100644 --- a/laravel/database/eloquent/relationships/has_many_and_belongs_to.php +++ b/laravel/database/eloquent/relationships/has_many_and_belongs_to.php @@ -44,7 +44,7 @@ public function __construct($model, $associated, $table, $foreign, $other) $this->joining = $table ?: $this->joining($model, $associated); // If the Pivot table is timestamped, we'll set the timestamp columns to be - // fetched when the pivot table models are fetched by the developer, or else + // fetched when the pivot table models are fetched by the developer else // the ID will be the only "extra" column fetched in by default. if (Pivot::$timestamps) { @@ -61,8 +61,6 @@ public function __construct($model, $associated, $table, $foreign, $other) * * By default, the name is the models sorted and joined with underscores. * - * @param Model $model - * @param string $associated * @return string */ protected function joining($model, $associated) @@ -88,7 +86,7 @@ public function results() * Insert a new record into the joining table of the association. * * @param int $id - * @param array $attributes + * @param array $joining * @return bool */ public function attach($id, $attributes = array()) @@ -133,7 +131,7 @@ public function sync($ids) } // Next we will take the difference of the current and given IDs and detach - // all of the entities that exist in the current array but are not in + // all of the entities that exists in the current array but are not in // the array of IDs given to the method, finishing the sync. $detach = array_diff($current, $ids); @@ -319,30 +317,22 @@ public function eagerly_constrain($results) /** * Match eagerly loaded child models to their parent models. * - * @param string $relationship - * @param array $parents - * @param array $children + * @param array $parents + * @param array $children * @return void */ public function match($relationship, &$parents, $children) { $foreign = $this->foreign_key(); - $dictionary = array(); - - foreach ($children as $child) - { - $dictionary[$child->pivot->$foreign][] = $child; - } - foreach ($parents as &$parent) { - $parent_key = $parent->get_key(); - - if (isset($dictionary[$parent_key])) + $matching = array_filter($children, function($v) use (&$parent, $foreign) { - $parent->relationships[$relationship] = $dictionary[$parent_key]; - } + return $v->pivot->$foreign == $parent->get_key(); + }); + + $parent->relationships[$relationship] = array_values($matching); } } @@ -386,7 +376,7 @@ protected function hydrate_pivot(&$results) /** * Set the columns on the joining table that should be fetched. * - * @param array $columns + * @param array $column * @return Relationship */ public function with($columns) diff --git a/laravel/database/eloquent/relationships/has_one.php b/laravel/database/eloquent/relationships/has_one.php index ee97358b..8d1e4ff9 100644 --- a/laravel/database/eloquent/relationships/has_one.php +++ b/laravel/database/eloquent/relationships/has_one.php @@ -30,9 +30,8 @@ public function initialize(&$parents, $relationship) /** * Match eagerly loaded child models to their parent models. * - * @param string $relationship - * @param array $parents - * @param array $children + * @param array $parents + * @param array $children * @return void */ public function match($relationship, &$parents, $children) From 7193f292406b95301750a93f9773eb6eb86338ac Mon Sep 17 00:00:00 2001 From: Jesse O'Brien Date: Fri, 17 Aug 2012 16:22:12 -0400 Subject: [PATCH 202/260] Added profile timers Track the running time of a function Profiler::time(function(){}); Profiler::time(function(){}, 'name'); Track a stopwatch style timer throughout your app Profiler::tick('name'); Profiler::tick('name', function($timer){}); --- laravel/profiling/profiler.php | 87 +++++++++++++++++++++++++++- laravel/profiling/template.blade.php | 50 +++++++++++++++- 2 files changed, 134 insertions(+), 3 deletions(-) diff --git a/laravel/profiling/profiler.php b/laravel/profiling/profiler.php index eda884c5..01469ab8 100644 --- a/laravel/profiling/profiler.php +++ b/laravel/profiling/profiler.php @@ -14,7 +14,7 @@ class Profiler { * * @var array */ - protected static $data = array('queries' => array(), 'logs' => array()); + protected static $data = array('queries' => array(), 'logs' => array(), 'timers' => array()); /** * Get the rendered contents of the Profiler. @@ -32,10 +32,95 @@ public static function render($response) static::$data['memory'] = get_file_size(memory_get_usage(true)); static::$data['memory_peak'] = get_file_size(memory_get_peak_usage(true)); static::$data['time'] = number_format((microtime(true) - LARAVEL_START) * 1000, 2); + foreach ( static::$data['timers'] as &$timer) + { + $timer['running_time'] = number_format((microtime(true) - $timer['start'] ) * 1000, 2); + } + return render('path: '.__DIR__.'/template'.BLADE_EXT, static::$data); } } + /** + * Allow a callback to be timed. + * + * @param closure $func + * @param string $name + * @return void + */ + public static function time( $func, $name = 'default_func_timer' ) + { + // First measure the runtime of the func + $start = microtime(true); + $func(); + $end = microtime(true); + + // Check to see if a timer by that name exists + if (isset(static::$data['timers'][$name])) + { + $name = $name.uniqid(); + } + + // Push the time into the timers array for display + static::$data['timers'][$name]['start'] = $start; + static::$data['timers'][$name]['end'] = $end; + static::$data['timers'][$name]['time'] = number_format(($end - $start) * 1000, 2); + } + + /** + * Start, or add a tick to a timer. + * + * @param string $name + * @return void + */ + public static function tick($name = 'default_timer', $callback = null) + { + $name = trim($name); + if (empty($name)) $name = 'default_timer'; + + // Is this a brand new tick? + if (isset(static::$data['timers'][$name])) + { + $current_timer = static::$data['timers'][$name]; + $ticks = count($current_timer['ticks']); + + // Initialize the new time for the tick + $new_tick = array(); + $mt = microtime(true); + $new_tick['raw_time'] = $mt - $current_timer['start']; + $new_tick['time'] = number_format(($mt - $current_timer['start']) * 1000, 2); + + // Use either the start time or the last tick for the diff + if ($ticks > 0) + { + $last_tick = $current_timer['ticks'][$ticks- 1]['raw_time']; + $new_tick['diff'] = number_format(($new_tick['raw_time'] - $last_tick) * 1000, 2); + } + else + { + $new_tick['diff'] = $new_tick['time']; + } + + // Add the new tick to the stack of them + static::$data['timers'][$name]['ticks'][] = $new_tick; + } + else + { + // Initialize a start time on the first tick + static::$data['timers'][$name]['start'] = microtime(true); + static::$data['timers'][$name]['ticks'] = array(); + } + + // Run the callback for this tick if it's specified + if ( ! is_null($callback) and is_callable($callback)) + { + // After we've ticked, call the callback function + call_user_func_array($callback, array( + static::$data['timers'][$name] + )); + } + } + /** * Add a log entry to the log entries array. * diff --git a/laravel/profiling/template.blade.php b/laravel/profiling/template.blade.php index 32c430a6..9c855b43 100755 --- a/laravel/profiling/template.blade.php +++ b/laravel/profiling/template.blade.php @@ -48,6 +48,52 @@ There have been no SQL queries executed. @endif

    + +
    + @if (count($timers) > 0) + + + + + + + @foreach ($timers as $name => $timer) + + + + + + + @if (isset($timer['ticks'])) + @foreach( $timer['ticks'] as $tick) + + + + + + @endforeach + @else + + + + + + @endif + + @endforeach +
    NameRunning Time (ms)Difference
    + {{ $name }} +
    {{ $timer['running_time'] }}ms (time from start to render)
     
    +
    Tick
    +
    +
    {{ $tick['time'] }}ms
    +
    +
    + {{ $tick['diff'] }}ms
    +
    Running Time
    {{ $timer['time'] }}ms
     
    + @else + There have been no checkpoints set. + @endif +
    @@ -61,7 +107,7 @@ @endif -
  • Time {{ $time }}ms
  • +
  • Time {{ $time }}ms
  • Memory {{ $memory }} ({{ $memory_peak }})
  • ×
  • @@ -75,4 +121,4 @@ - \ No newline at end of file + From 973551cd8d65b16ea88e09150b18885294ff44fa Mon Sep 17 00:00:00 2001 From: Hirohisa Kawase Date: Sat, 18 Aug 2012 19:46:23 +0900 Subject: [PATCH 203/260] Change some Markdown to fit other md files' format. Signed-off-by: Hirohisa Kawase --- laravel/documentation/contrib/command-line.md | 47 ++++++------- laravel/documentation/contrib/github.md | 6 +- laravel/documentation/contrib/tortoisegit.md | 69 ++++++++++--------- 3 files changed, 62 insertions(+), 60 deletions(-) diff --git a/laravel/documentation/contrib/command-line.md b/laravel/documentation/contrib/command-line.md index d662e806..5dea4cb6 100644 --- a/laravel/documentation/contrib/command-line.md +++ b/laravel/documentation/contrib/command-line.md @@ -1,28 +1,29 @@ # Contributing to Laravel via Command-Line ## Contents - - [Getting Started](#getting-started) - - [Forking Laravel](#forking-laravel) - - [Cloning Laravel](#cloning-laravel) - - [Adding your Fork](#adding-your-fork) - - [Creating Branches](#creating-branches) - - [Committing](#committing) - - [Submitting a Pull Request](#submitting-a-pull-request) - - [What's Next?](#whats-next) - +- [Getting Started](#getting-started) +- [Forking Laravel](#forking-laravel) +- [Cloning Laravel](#cloning-laravel) +- [Adding your Fork](#adding-your-fork) +- [Creating Branches](#creating-branches) +- [Committing](#committing) +- [Submitting a Pull Request](#submitting-a-pull-request) +- [What's Next?](#whats-next) + + ## Getting Started This tutorial explains the basics of contributing to a project on [GitHub](https://github.com/) via the command-line. The workflow can apply to most projects on GitHub, but in this case, we will be focused on the [Laravel](https://github.com/laravel/laravel) project. This tutorial is applicable to OSX, Linux and Windows. This tutorial assumes you have installed [Git](http://git-scm.com/) and you have created a [GitHub account](https://github.com/signup/free). If you haven't already, look at the [Laravel on GitHub](/docs/contrib/github) documentation in order to familiarize yourself with Laravel's repositories and branches. - + ## Forking Laravel Login to GitHub and visit the [Laravel Repository](https://github.com/laravel/laravel). Click on the **Fork** button. This will create your own fork of Laravel in your own GitHub account. Your Laravel fork will be located at **https://github.com/username/laravel** (your GitHub username will be used in place of *username*). - + ## Cloning Laravel Open up the command-line or terminal and make a new directory where you can make development changes to Laravel: @@ -36,7 +37,7 @@ ## Cloning Laravel > **Note**: The reason you are cloning the original Laravel repository (and not the fork you made) is so you can always pull down the most recent changes from the Laravel repository to your local repository. - + ## Adding your Fork Next, it's time to add the fork you made as a **remote repository**: @@ -49,7 +50,7 @@ ## Adding your Fork Now you have a pristine clone of the Laravel repository along with your fork as a remote repository. You are ready to begin branching for new features or fixing bugs. - + ## Creating Branches First, make sure you are working in the **develop** branch. If you submit changes to the **master** branch, it is unlikely they will be pulled in anytime in the near future. For more information on this, read the documentation for [Laravel on GitHub](/docs/contrib/github). To switch to the develop branch: @@ -76,7 +77,7 @@ ## Creating Branches Now that you have created your own branch and have switched to it, it's time to make your changes to the code. Add your new feature or fix that bug. - + ## Committing Now that you have finished coding and testing your changes, it's time to commit them to your local repository. First, add the files that you changed/added: @@ -87,10 +88,10 @@ ## Committing # git commit -s -m "I added some more stuff to the Localization documentation." - - **-s** means that you are signing-off on your commit with your name. This tells the Laravel team know that you personally agree to your code being added to the Laravel core. - - **-m** is the message that goes with your commit. Provide a brief explanation of what you added or changed. +"- **-s** means that you are signing-off on your commit with your name. This tells the Laravel team know that you personally agree to your code being added to the Laravel core. +"- **-m** is the message that goes with your commit. Provide a brief explanation of what you added or changed. - + ## Pushing to your Fork Now that your local repository has your committed changes, it's time to push (or sync) your new branch to your fork that is hosted in GitHub: @@ -99,19 +100,19 @@ ## Pushing to your Fork Your branch has been successfully pushed to your fork on GitHub. - + ## Submitting a Pull Request The final step is to submit a pull request to the Laravel repository. This means that you are requesting that the Laravel team pull and merge your changes to the Laravel core. In your browser, visit your Laravel fork at [https://github.com/username/laravel](https://github.com/username/laravel). Click on **Pull Request**. Next, make sure you choose the proper base and head repositories and branches: - - **base repo:** laravel/laravel - - **base branch:** develop - - **head repo:** username/laravel - - **head branch:** feature/localization-docs +- **base repo:** laravel/laravel +- **base branch:** develop +- **head repo:** username/laravel +- **head branch:** feature/localization-docs Use the form to write a more detailed description of the changes you made and why you made them. Finally, click **Send pull request**. That's it! The changes you made have been submitted to the Laravel team. - + ## What's Next? Do you have another feature you want to add or another bug you need to fix? First, make sure you always base your new branch off of the develop branch: diff --git a/laravel/documentation/contrib/github.md b/laravel/documentation/contrib/github.md index 5d9f43e9..5a136d72 100644 --- a/laravel/documentation/contrib/github.md +++ b/laravel/documentation/contrib/github.md @@ -6,19 +6,19 @@ ## Contents - [Repositories](#repositoriess) - [Branches](#branches) - + ## The Basics Because Laravel's development and source control is done through GitHub, anyone is able to make contributions to it. Anyone can fix bugs, add features or improve the documentation. After submitting proposed changes to the project, the Laravel team will review the changes and make the decision to commit them to Laravel's core. - + ## Repositories Laravel's home on GitHub is at [github.com/laravel](https://github.com/laravel). Laravel has several repositories. For basic contributions, the only repository you need to pay attention to is the **laravel** repository, located at [github.com/laravel/laravel](https://github.com/laravel/laravel). - + ## Branches The **laravel** repository has multiple branches, each serving a specific purpose: diff --git a/laravel/documentation/contrib/tortoisegit.md b/laravel/documentation/contrib/tortoisegit.md index aa79e8cb..74049ead 100644 --- a/laravel/documentation/contrib/tortoisegit.md +++ b/laravel/documentation/contrib/tortoisegit.md @@ -1,47 +1,48 @@ # Contributing to Laravel using TortoiseGit ## Contents - - [Getting Started](#getting-started) - - [Forking Laravel](#forking-laravel) - - [Cloning Laravel](#cloning-laravel) - - [Adding your Fork](#adding-your-fork) - - [Creating Branches](#creating-branches) - - [Committing](#committing) - - [Submitting a Pull Request](#submitting-a-pull-request) - - [What's Next?](#whats-next) - +- [Getting Started](#getting-started) +- [Forking Laravel](#forking-laravel) +- [Cloning Laravel](#cloning-laravel) +- [Adding your Fork](#adding-your-fork) +- [Creating Branches](#creating-branches) +- [Committing](#committing) +- [Submitting a Pull Request](#submitting-a-pull-request) +- [What's Next?](#whats-next) + + ## Getting Started This tutorial explains the basics of contributing to a project on [GitHub](https://github.com/) using [TortoiseGit](http://code.google.com/p/tortoisegit/) for Windows. The workflow can apply to most projects on GitHub, but in this case, we will be focused on the [Laravel](https://github.com/laravel/laravel) project. This tutorial assumes you have installed TortoiseGit for Windows and you have created a GitHub account. If you haven't already, look at the [Laravel on GitHub](/docs/contrib/github) documentation in order to familiarize yourself with Laravel's repositories and branches. - + ## Forking Laravel Login to GitHub and visit the [Laravel Repository](https://github.com/laravel/laravel). Click on the **Fork** button. This will create your own fork of Laravel in your own GitHub account. Your Laravel fork will be located at **https://github.com/username/laravel** (your GitHub username will be used in place of *username*). - + ## Cloning Laravel Open up Windows Explorer and create a new directory where you can make development changes to Laravel. - - Right-click the Laravel directory to bring up the context menu. Click on **Git Clone...** - - Git clone +- Right-click the Laravel directory to bring up the context menu. Click on **Git Clone...** +- Git clone - **Url:** https://github.com/laravel/laravel.git - **Directory:** the directory that you just created in the previous step - Click **OK** > **Note**: The reason you are cloning the original Laravel repository (and not the fork you made) is so you can always pull down the most recent changes from the Laravel repository to your local repository. - + ## Adding your Fork After the cloning process is complete, it's time to add the fork you made as a **remote repository**. - - Right-click the Laravel directory and goto **TortoiseGit > Settings** - - Goto the **Git/Remote** section. Add a new remote: +- Right-click the Laravel directory and goto **TortoiseGit > Settings** +- Goto the **Git/Remote** section. Add a new remote: - **Remote**: fork - **URL**: https://github.com/username/laravel.git - Click **Add New/Save** @@ -49,12 +50,12 @@ ## Adding your Fork Remember to replace *username* with your GitHub username. *This is case-sensitive*. - + ## Creating Branches Now you are ready to create a new branch for your new feature or bug-fix. When you create a new branch, use a self-descriptive naming convention. For example, if you are going to fix a bug in Eloquent, name your branch *bug/eloquent*. Or if you were going to make changes to the localization documentation, name your branch *feature/localization-docs*. A good naming convention will encourage organization and help others understand the purpose of your branch. - - Right-click the Laravel directory and goto **TortoiseGit > Create Branch** +- Right-click the Laravel directory and goto **TortoiseGit > Create Branch** - **Branch:** feature/localization-docs - **Base On Branch:** remotes/origin/develop - **Check** *Track* @@ -67,47 +68,47 @@ ## Creating Branches Now that you have created your own branch and have switched to it, it's time to make your changes to the code. Add your new feature or fix that bug. - + ##Committing Now that you have finished coding and testing your changes, it's time to commit them to your local repository: - - Right-click the Laravel directory and goto **Git Commit -> "feature/localization-docs"...** - - Commit +- Right-click the Laravel directory and goto **Git Commit -> "feature/localization-docs"...** +- Commit - **Message:** Provide a brief explaination of what you added or changed - Click **Sign** - This tells the Laravel team know that you personally agree to your code being added to the Laravel core - **Changes made:** Check all changed/added files - Click **OK** - + ## Pushing to your Fork Now that your local repository has your committed changes, it's time to push (or sync) your new branch to your fork that is hosted in GitHub: - Right-click the Laravel directory and goto **Git Sync...** - Git Syncronization - - **Local Branch:** feature/localization-docs - - **Remote Branch:** leave this blank - - **Remote URL:** fork - - Click **Push** - - When asked for "username:" enter your GitHub *case-sensitive* username - - When asked for "password:" enter your GitHub *case-sensitive* account + - **Local Branch:** feature/localization-docs + - **Remote Branch:** leave this blank + - **Remote URL:** fork + - Click **Push** + - When asked for "username:" enter your GitHub *case-sensitive* username + - When asked for "password:" enter your GitHub *case-sensitive* account Your branch has been successfully pushed to your fork on GitHub. - + ## Submitting a Pull Request The final step is to submit a pull request to the Laravel repository. This means that you are requesting that the Laravel team pull and merge your changes to the Laravel core. In your browser, visit your Laravel fork at [https://github.com/username/laravel](https://github.com/username/laravel). Click on **Pull Request**. Next, make sure you choose the proper base and head repositories and branches: - - **base repo:** laravel/laravel - - **base branch:** develop - - **head repo:** username/laravel - - **head branch:** feature/localization-docs +- **base repo:** laravel/laravel +- **base branch:** develop +- **head repo:** username/laravel +- **head branch:** feature/localization-docs Use the form to write a more detailed description of the changes you made and why you made them. Finally, click **Send pull request**. That's it! The changes you made have been submitted to the Laravel team. - + ## What's Next? Do you have another feature you want to add or another bug you need to fix? Just follow the same instructions as before in the [Creating Branches](#creating-branches) section. Just remember to always create a new branch for every new feature/fix and don't forget to always base your new branches off of the *remotes/origin/develop* branch. From 359ee49f3773f29ef39b6402ca9777ff95e75b8a Mon Sep 17 00:00:00 2001 From: Hirohisa Kawase Date: Sat, 18 Aug 2012 20:40:56 +0900 Subject: [PATCH 204/260] Added ## Laravel 3.2.5, and changed 'Upgrading From ...' to

    Signed-off-by:Hirohisa Kawase --- laravel/documentation/changes.md | 53 ++++++++++++++++---------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/laravel/documentation/changes.md b/laravel/documentation/changes.md index 5ff87c38..20135b01 100644 --- a/laravel/documentation/changes.md +++ b/laravel/documentation/changes.md @@ -36,11 +36,12 @@ ## Contents - [Upgrading From 3.0](#upgrade-3.1) +## Laravel 3.2.5 - Revert nested where code back to 3.2.3 tag. -## Upgrading From 3.2.4 +### Upgrading From 3.2.4 - Replace the **laravel** folder. @@ -52,7 +53,7 @@ ## Laravel 3.2.4 - Various bug fixes and improvements. -## Upgrading From 3.2.3 +### Upgrading From 3.2.3 - Replace the **laravel** folder. @@ -63,7 +64,7 @@ ## Laravel 3.2.3 - Added `laravel.resolving` event for all IoC resolutions. -## Upgrading From 3.2.2 +### Upgrading From 3.2.2 - Replace the **laravel** folder. @@ -79,7 +80,7 @@ ## Laravel 3.2.2 - Added `password` option to Auth configuration. -## Upgrading From 3.2.1 +### Upgrading From 3.2.1 - Replace the **laravel** folder. @@ -94,7 +95,7 @@ ## Laravel 3.2.1 - Added `format` method to message container. -## Upgrading From 3.2 +### Upgrading From 3.2 - Replace the **laravel** folder. @@ -151,7 +152,7 @@ ## Laravel 3.2 - Added `array_except` and `array_only` helpers, similar to `Input::except` and `Input::only` but for arbitrary arrays. -## Upgrading From 3.1 +### Upgrading From 3.1 - Add new `asset_url` and `profiler` options to application configuration. - Replace **auth** configuration file. @@ -176,7 +177,7 @@ ## Laravel 3.1.9 - Fixes cookie session driver bug that caused infinite loop on some occasions. -## Upgrading From 3.1.8 +### Upgrading From 3.1.8 - Replace the **laravel** folder. @@ -186,7 +187,7 @@ ## Laravel 3.1.8 - Fixes possible WSOD when using Blade's @include expression. -## Upgrading From 3.1.7 +### Upgrading From 3.1.7 - Replace the **laravel** folder. @@ -198,7 +199,7 @@ ## Laravel 3.1.7 - Classify migration names. -## Upgrading From 3.1.6 +### Upgrading From 3.1.6 - Replace the **laravel** folder. @@ -208,7 +209,7 @@ ## Laravel 3.1.6 - Fixes many-to-many eager loading in Eloquent. -## Upgrading From 3.1.5 +### Upgrading From 3.1.5 - Replace the **laravel** folder. @@ -218,7 +219,7 @@ ## Laravel 3.1.5 - Fixes bug that could allow secure cookies to be sent over HTTP. -## Upgrading From 3.1.4 +### Upgrading From 3.1.4 - Replace the **laravel** folder. @@ -229,7 +230,7 @@ ## Laravel 3.1.4 - Fixes SQL "where in" (...) short-cut bug. -## Upgrading From 3.1.3 +### Upgrading From 3.1.3 - Replace the **laravel** folder. @@ -239,7 +240,7 @@ ## Laravel 3.1.3 - Fixes **delete** method in Eloquent models. -## Upgrade From 3.1.2 +### Upgrade From 3.1.2 - Replace the **laravel** folder. @@ -249,7 +250,7 @@ ## Laravel 3.1.2 - Fixes Eloquent query method constructor conflict. -## Upgrade From 3.1.1 +### Upgrade From 3.1.1 - Replace the **laravel** folder. @@ -259,7 +260,7 @@ ## Laravel 3.1.1 - Fixes Eloquent model hydration bug involving custom setters. -## Upgrading From 3.1 +### Upgrading From 3.1 - Replace the **laravel** folder. @@ -297,48 +298,48 @@ ## Laravel 3.1 - Added "before" and "after" validation checks for dates. -## Upgrading From 3.0 +### Upgrading From 3.0 -### Replace your **application/start.php** file. +#### Replace your **application/start.php** file. The default **start.php** file has been expanded in order to give you more flexibility over the loading of your language, configuration, and view files. To upgrade your file, copy your current file and paste it at the bottom of a copy of the new Laravel 3.1 start file. Next, scroll up in the **start** file until you see the default Autoloader registrations (line 61 and line 76). Delete both of these sections since you just pasted your previous auto-loader registrations at the bottom of the file. -### Remove the **display** option from your **errors** configuration file. +#### Remove the **display** option from your **errors** configuration file. This option is now set at the beginning of your **application/start** file. -### Call the parent controller's constructor from your controller. +#### Call the parent controller's constructor from your controller. Simply add a **parent::__construct();** to to any of your controllers that have a constructor. -### Prefix Laravel migration created indexes with their table name. +#### Prefix Laravel migration created indexes with their table name. If you have created indexes on tables using the Laravel migration system and you used to the default index naming scheme provided by Laravel, prefix the index names with their table name on your database. So, if the current index name is "id_unique" on the "users" table, make the index name "users_id_unique". -### Add alias for Eloquent in your application configuration. +#### Add alias for Eloquent in your application configuration. Add the following to the **aliases** array in your **application/config/application.php** file: 'Eloquent' => 'Laravel\\Database\\Eloquent\\Model', 'Blade' => 'Laravel\\Blade', -### Update Eloquent many-to-many tables. +#### Update Eloquent many-to-many tables. Eloquent now maintains **created_at** and **updated_at** column on many-to-many intermediate tables by default. Simply add these columns to your tables. Also, many-to-many tables are now the singular model names concatenated with an underscore. For example, if the relationship is between User and Role, the intermediate table name should be **role_user**. -### Remove Eloquent bundle. +#### Remove Eloquent bundle. If you are using the Eloquent bundle with your installation, you can remove it from your bundles directory and your **application/bundles.php** file. Eloquent version 2 is included in the core in Laravel 3.1. Your models can also now extend simply **Eloquent** instead of **Eloquent\Model**. -### Update your **config/strings.php** file. +#### Update your **config/strings.php** file. English pluralization and singularization is now automatic. Just completely replace your **application/config/strings.php** file. -### Add the **fetch** option to your database configuration file. +#### Add the **fetch** option to your database configuration file. A new **fetch** option allows you to specify in which format you receive your database results. Just copy and paste the option from the new **application/config/database.php** file. -### Add **database** option to your Redis configuration. +#### Add **database** option to your Redis configuration. If you are using Redis, add the "database" option to your Redis connection configurations. The "database" value can be zero by default. From aca179cb953914b4a4e1d2df2240314f903ab3b3 Mon Sep 17 00:00:00 2001 From: Hirohisa Kawase Date: Sat, 18 Aug 2012 21:57:54 +0900 Subject: [PATCH 205/260] Deleted an anchor of top of line. Defined "config", but it was reffered from no where. So, keep code simple. Signed-off-by:Hirohisa Kawase --- laravel/documentation/session/config.md | 1 - 1 file changed, 1 deletion(-) diff --git a/laravel/documentation/session/config.md b/laravel/documentation/session/config.md index 094148c8..14821320 100644 --- a/laravel/documentation/session/config.md +++ b/laravel/documentation/session/config.md @@ -1,4 +1,3 @@ - # Session Configuration ## Contents From 5c66ca9db793ed544749e504a845bed0664834df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Kj=C3=A6rgaard?= Date: Sun, 19 Aug 2012 13:02:25 +0200 Subject: [PATCH 206/260] Added Danish translations to pagination and validation --- application/language/da/pagination.php | 19 +++++ application/language/da/validation.php | 104 +++++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 application/language/da/pagination.php create mode 100644 application/language/da/validation.php diff --git a/application/language/da/pagination.php b/application/language/da/pagination.php new file mode 100644 index 00000000..089ec7e0 --- /dev/null +++ b/application/language/da/pagination.php @@ -0,0 +1,19 @@ + '« Forrige', + 'next' => 'Næste »', + +); \ No newline at end of file diff --git a/application/language/da/validation.php b/application/language/da/validation.php new file mode 100644 index 00000000..b49b75ec --- /dev/null +++ b/application/language/da/validation.php @@ -0,0 +1,104 @@ + ":attribute skal accepteres.", + "active_url" => ":attribute er ikke en gyldig URL.", + "after" => ":attribute skal være en dato efter :date.", + "alpha" => ":attribute må kun indeholde bogstaver.", + "alpha_dash" => ":attribute må kun indeholde bogstaver, numre, og skråstreg.", + "alpha_num" => ":attribute må kun indeholde bogstaver og numre.", + "array" => ":attribute skal have valgte elementer.", + "before" => ":attribute skal have en dato før :date.", + "between" => array( + "numeric" => ":attribute skal være mellem :min - :max.", + "file" => ":attribute skal være mellem :min - :max kilobytes.", + "string" => ":attribute skal være mellem :min - :max karakterer.", + ), + "confirmed" => ":attribute bekræftelse stemmer ikke overens.", + "count" => ":attribute skal være præcis :count valgte elementer.", + "countbetween" => ":attribute skal være mellem :min and :max valgte elementer.", + "countmax" => ":attribute skal have mindre end :max valgte elementer.", + "countmin" => ":attribute skal have minimum :min valgte elementer.", + "different" => ":attribute og :other skal være forskellige.", + "email" => "Formatet for :attribute er ugyldigt.", + "exists" => "Den valgte :attribute er ugyldig.", + "image" => ":attribute skal være et billede.", + "in" => "Den valgte :attribute er ugyldig.", + "integer" => ":attribute må kun indeholde tal.", + "ip" => ":attribute skal være en gyldig IP adresse.", + "match" => "Formatet for :attribute er ugyldigt.", + "max" => array( + "numeric" => ":attribute skal være mindre end :max.", + "file" => ":attribute skal være mindre end :max kilobytes.", + "string" => ":attribute skal være mindre end :max karakterer.", + ), + "mimes" => ":attribute skal have filtypen type: :values.", + "min" => array( + "numeric" => ":attribute ska minimum være :min.", + "file" => ":attribute skal være mindst :min kilobytes.", + "string" => ":attribute skal være mindst :min karakterer.", + ), + "not_in" => "Den valgte :attribute er ugyldig.", + "numeric" => ":attribute skal være et nummer.", + "required" => ":attribute er krævet.", + "same" => ":attribute og :other stemmer ikke overens.", + "size" => array( + "numeric" => ":attribute skal være :size.", + "file" => ":attribute skal være :size kilobyte.", + "string" => ":attribute skal være :size karakterer.", + ), + "unique" => ":attribute er allerede optaget.", + "url" => ":attribute formatet er ugyldigt.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file From 63fe95dadc3880839a139e0dc50ba749ae01d640 Mon Sep 17 00:00:00 2001 From: Callum McIntyre Date: Sun, 19 Aug 2012 14:50:05 +0100 Subject: [PATCH 207/260] Changed timestamp function in database/eloquent/model.php from protected to public. Allows eloquent model timestamps to be updated without actually changing any data. git push fork minor/unprotect-eloquent-timestamps git status git # Signed-off-by: Callum McIntyre --- laravel/database/eloquent/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index 61a7769c..d3d70fbb 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -445,7 +445,7 @@ public function delete() * * @return void */ - protected function timestamp() + public function timestamp() { $this->updated_at = new \DateTime; From f8fdcd894a1498025c0dca94485c11489cf6d51e Mon Sep 17 00:00:00 2001 From: Callum McIntyre Date: Sun, 19 Aug 2012 14:50:05 +0100 Subject: [PATCH 208/260] Changed timestamp function in eloquent/model.php to public --- laravel/database/eloquent/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index 61a7769c..d3d70fbb 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -445,7 +445,7 @@ public function delete() * * @return void */ - protected function timestamp() + public function timestamp() { $this->updated_at = new \DateTime; From be7544b67af20f2bf27c4f6913212e1556958835 Mon Sep 17 00:00:00 2001 From: daris Date: Sun, 19 Aug 2012 19:05:45 +0300 Subject: [PATCH 209/260] Update laravel/documentation/database/fluent.md Missing comma --- laravel/documentation/database/fluent.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/database/fluent.md b/laravel/documentation/database/fluent.md index 1f726540..ceeb809b 100644 --- a/laravel/documentation/database/fluent.md +++ b/laravel/documentation/database/fluent.md @@ -124,7 +124,7 @@ ## Nested Where Clauses ->or_where(function($query) { $query->where('age', '>', 25); - $query->where('votes' '>', 100); + $query->where('votes', '>', 100); }) ->get(); From 926cdaa7f5c71f09e53a5135fd95994600d819de Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Mon, 20 Aug 2012 10:46:23 -0500 Subject: [PATCH 210/260] reimplement locale uri slugs. --- application/config/application.php | 13 +++++++++ laravel/laravel.php | 44 ++++++++++++++++++++++++++++-- laravel/url.php | 20 +++++++++++--- 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/application/config/application.php b/application/config/application.php index 525227c2..60735a60 100755 --- a/application/config/application.php +++ b/application/config/application.php @@ -94,6 +94,19 @@ 'language' => 'en', + /* + |-------------------------------------------------------------------------- + | Supported Languages + |-------------------------------------------------------------------------- + | + | These languages may also be supported by your application. If a request + | enters your application with a URI beginning with one of these values + | the default language will automatically be set to that language. + | + */ + + 'languages' => array(), + /* |-------------------------------------------------------------------------- | SSL Link Generation diff --git a/laravel/laravel.php b/laravel/laravel.php index e1c2ba32..74c387f9 100644 --- a/laravel/laravel.php +++ b/laravel/laravel.php @@ -107,6 +107,48 @@ return Event::first('404'); }); +/* +|-------------------------------------------------------------------------- +| Gather The URI And Locales +|-------------------------------------------------------------------------- +| +| When routing, we'll need to grab the URI and the supported locales for +| the route so we can properly set the language and route the request +| to the proper end-point in the application. +| +*/ + +$uri = URI::current(); + +$languages = Config::get('application.languages', array()); + +$languages[] = Config::get('application.language'); + +/* +|-------------------------------------------------------------------------- +| Set The Locale Based On The Route +|-------------------------------------------------------------------------- +| +| If the URI starts with one of the supported languages, we will set +| the default lagnauge to match that URI segment and shorten the +| URI we'll pass to the router to not include the lang segment. +| +*/ + +foreach ($languages as $language) +{ + if (starts_with($uri, $language)) + { + Config::set('application.language', $language); + + $uri = trim(substr($uri, strlen($language)), '/'); break; + } +} + +if ($uri == '') $uri = '/'; + +URI::$uri = $uri; + /* |-------------------------------------------------------------------------- | Route The Incoming Request @@ -118,8 +160,6 @@ | */ -$uri = URI::current(); - Request::$route = Routing\Router::route(Request::method(), $uri); $response = Request::$route->call(); diff --git a/laravel/url.php b/laravel/url.php index 4ff0f474..b85dbc70 100644 --- a/laravel/url.php +++ b/laravel/url.php @@ -26,7 +26,7 @@ public static function full() */ public static function current() { - return static::to(URI::current()); + return static::to(URI::current(), null, false, false); } /** @@ -89,9 +89,11 @@ public static function base() * * @param string $url * @param bool $https + * @param bool $asset + * @param bool $locale * @return string */ - public static function to($url = '', $https = null) + public static function to($url = '', $https = null, $asset = false, $locale = true) { // If the given URL is already valid or begins with a hash, we'll just return // the URL unchanged since it is already well formed. Otherwise we will add @@ -105,7 +107,17 @@ public static function to($url = '', $https = null) // security for any new links generated. So https for all secure links. if (is_null($https)) $https = Request::secure(); - $root = static::base().'/'.Config::get('application.index'); + $root = static::base(); + + if ( ! $asset) + { + $root .= '/'.Config::get('application.index'); + } + + if ( ! $asset and $locale and count(Config::get('application.languages')) > 0) + { + $root .= '/'.Config::get('application.language'); + } // Since SSL is not often used while developing the application, we allow the // developer to disable SSL on all framework generated links to make it more @@ -232,7 +244,7 @@ public static function to_asset($url, $https = null) return rtrim($root, '/').'/'.ltrim($url, '/'); } - $url = static::to($url, $https); + $url = static::to($url, $https, true); // Since assets are not served by Laravel, we do not need to come through // the front controller. So, we'll remove the application index specified From b92f5bc854267fedf918f1923a4b7d2d1192bfba Mon Sep 17 00:00:00 2001 From: Tobsn Date: Tue, 21 Aug 2012 00:09:01 +0200 Subject: [PATCH 211/260] Docu on how to ensure foreign() works tons of people are doing it wrong every day - this should fix it or at least can be used as reference. --- laravel/documentation/database/schema.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/laravel/documentation/database/schema.md b/laravel/documentation/database/schema.md index 605f53d0..ff25ab65 100644 --- a/laravel/documentation/database/schema.md +++ b/laravel/documentation/database/schema.md @@ -144,4 +144,10 @@ ## Foreign Keys You may also easily drop a foreign key constraint. The default foreign key names follow the [same convention](#dropping-indexes) as the other indexes created by the Schema builder. Here's an example: - $table->drop_foreign('posts_user_id_foreign'); \ No newline at end of file + $table->drop_foreign('posts_user_id_foreign'); + +> **Note:** The field referenced in the foreign key is very likely an auto increment and therefore automatically an unsigned integer. Please make sure to create the foreign key field with **unsigned()** as both fields have to be the exact same type, the engine on both tables has to be set to **InnoDB**, and the referenced table must be created **before** the table with the foreign key. + + $table->engine = 'InnoDB'; + + $table->integer('user_id')->unsigned(); \ No newline at end of file From 546c96261254373b7b366ce294aeba56636611c6 Mon Sep 17 00:00:00 2001 From: Tobsn Date: Tue, 21 Aug 2012 00:10:03 +0200 Subject: [PATCH 212/260] Revert "Docu on how to ensure foreign() works" This reverts commit b92f5bc854267fedf918f1923a4b7d2d1192bfba. --- laravel/documentation/database/schema.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/laravel/documentation/database/schema.md b/laravel/documentation/database/schema.md index ff25ab65..605f53d0 100644 --- a/laravel/documentation/database/schema.md +++ b/laravel/documentation/database/schema.md @@ -144,10 +144,4 @@ ## Foreign Keys You may also easily drop a foreign key constraint. The default foreign key names follow the [same convention](#dropping-indexes) as the other indexes created by the Schema builder. Here's an example: - $table->drop_foreign('posts_user_id_foreign'); - -> **Note:** The field referenced in the foreign key is very likely an auto increment and therefore automatically an unsigned integer. Please make sure to create the foreign key field with **unsigned()** as both fields have to be the exact same type, the engine on both tables has to be set to **InnoDB**, and the referenced table must be created **before** the table with the foreign key. - - $table->engine = 'InnoDB'; - - $table->integer('user_id')->unsigned(); \ No newline at end of file + $table->drop_foreign('posts_user_id_foreign'); \ No newline at end of file From 161ae3f6e6758fa249fe022fca4059176042b478 Mon Sep 17 00:00:00 2001 From: Tobsn Date: Tue, 21 Aug 2012 00:12:29 +0200 Subject: [PATCH 213/260] Docu on how to ensure foreign() works tons of people are doing it wrong every day - this should fix it or at least can be used as reference. --- laravel/documentation/database/schema.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/laravel/documentation/database/schema.md b/laravel/documentation/database/schema.md index 605f53d0..ff25ab65 100644 --- a/laravel/documentation/database/schema.md +++ b/laravel/documentation/database/schema.md @@ -144,4 +144,10 @@ ## Foreign Keys You may also easily drop a foreign key constraint. The default foreign key names follow the [same convention](#dropping-indexes) as the other indexes created by the Schema builder. Here's an example: - $table->drop_foreign('posts_user_id_foreign'); \ No newline at end of file + $table->drop_foreign('posts_user_id_foreign'); + +> **Note:** The field referenced in the foreign key is very likely an auto increment and therefore automatically an unsigned integer. Please make sure to create the foreign key field with **unsigned()** as both fields have to be the exact same type, the engine on both tables has to be set to **InnoDB**, and the referenced table must be created **before** the table with the foreign key. + + $table->engine = 'InnoDB'; + + $table->integer('user_id')->unsigned(); \ No newline at end of file From fa0fcff34657e8a354bec6c872c0448a04b260bb Mon Sep 17 00:00:00 2001 From: Tobsn Date: Tue, 21 Aug 2012 14:09:41 +0200 Subject: [PATCH 214/260] added unsigned() description MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit was missing… --- laravel/documentation/database/schema.md | 1 + 1 file changed, 1 insertion(+) diff --git a/laravel/documentation/database/schema.md b/laravel/documentation/database/schema.md index ff25ab65..19565c89 100644 --- a/laravel/documentation/database/schema.md +++ b/laravel/documentation/database/schema.md @@ -71,6 +71,7 @@ ## Adding Columns `$table->blob('data');` | BLOB equivalent to the table `->nullable()` | Designate that the column allows NULL values `->default($value)` | Declare a default value for a column +`->unsigned()` | Set INTERGER to UNSIGNED > **Note:** Laravel's "boolean" type maps to a small integer column on all database systems. From 967d9898ae6448a24c773db876c95b7fd60783cf Mon Sep 17 00:00:00 2001 From: Tobsn Date: Tue, 21 Aug 2012 14:11:25 +0200 Subject: [PATCH 215/260] dann typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit i had one job… --- laravel/documentation/database/schema.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/documentation/database/schema.md b/laravel/documentation/database/schema.md index 19565c89..904edbba 100644 --- a/laravel/documentation/database/schema.md +++ b/laravel/documentation/database/schema.md @@ -71,7 +71,7 @@ ## Adding Columns `$table->blob('data');` | BLOB equivalent to the table `->nullable()` | Designate that the column allows NULL values `->default($value)` | Declare a default value for a column -`->unsigned()` | Set INTERGER to UNSIGNED +`->unsigned()` | Set INTEGER to UNSIGNED > **Note:** Laravel's "boolean" type maps to a small integer column on all database systems. From 20c696d4ae3da4624bf10f0f6d40bf4eeae46401 Mon Sep 17 00:00:00 2001 From: Christoph Menke Date: Tue, 21 Aug 2012 17:08:21 +0200 Subject: [PATCH 216/260] Added Routing Wildcard '(:all)' to Documentation --- laravel/documentation/routing.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/laravel/documentation/routing.md b/laravel/documentation/routing.md index 550e2ddc..eee1bb8c 100644 --- a/laravel/documentation/routing.md +++ b/laravel/documentation/routing.md @@ -78,6 +78,13 @@ #### Allowing a URI segment to be any alpha-numeric string: // }); +#### Catching the remaining URI without limitations: + + Route::get('files/(:all)', function($path) + { + // + }); + #### Allowing a URI segment to be optional: Route::get('page/(:any?)', function($page = 'index') From c44e69bf80dd3c6b31f2055c5d21afe017cab9d7 Mon Sep 17 00:00:00 2001 From: "H.J. van Meerveld" Date: Sat, 25 Aug 2012 22:09:20 +0200 Subject: [PATCH 217/260] improved code to insert related models --- laravel/documentation/database/eloquent.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/laravel/documentation/database/eloquent.md b/laravel/documentation/database/eloquent.md index e9eb32a1..cbcf83c9 100644 --- a/laravel/documentation/database/eloquent.md +++ b/laravel/documentation/database/eloquent.md @@ -299,7 +299,7 @@ ## Inserting Related Models $post = Post::find(1); - $post->comments()->insert($comment); + $comment = $post->comments()->insert($comment); When inserting related models through their parent model, the foreign key will automatically be set. So, in this case, the "post_id" was automatically set to "1" on the newly inserted comment. @@ -323,7 +323,7 @@ ### Inserting Related Models (Many-To-Many) $user = User::find(1); - $user->roles()->insert($role); + $role = $user->roles()->insert($role); Now, when the Role is inserted, not only is the Role inserted into the "roles" table, but a record in the intermediate table is also inserted for you. It couldn't be easier! From aa341357ece9eb65ffef75f890656e9a2db50592 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sun, 26 Aug 2012 01:10:31 +0300 Subject: [PATCH 218/260] Fix insert() method for related models. --- .../eloquent/relationships/has_one_or_many.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/laravel/database/eloquent/relationships/has_one_or_many.php b/laravel/database/eloquent/relationships/has_one_or_many.php index a8268de6..7dd453b3 100644 --- a/laravel/database/eloquent/relationships/has_one_or_many.php +++ b/laravel/database/eloquent/relationships/has_one_or_many.php @@ -12,11 +12,18 @@ class Has_One_Or_Many extends Relationship { */ public function insert($attributes) { - $attributes = ($attributes instanceof Model) ? $attributes->attributes : $attributes; + if ($attributes instanceof Model) + { + $attributes->set_attribute($this->foreign_key(), $this->base->get_key()); + + return $attributes->save(); + } + else + { + $attributes[$this->foreign_key()] = $this->base->get_key(); - $attributes[$this->foreign_key()] = $this->base->get_key(); - - return $this->model->create($attributes); + return $this->model->create($attributes); + } } /** From e46f07d4365222b04fd654cada7a1940fc2ec4fd Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 27 Aug 2012 13:46:32 +0300 Subject: [PATCH 219/260] Fix method signature and return values of insert() method. --- laravel/database/eloquent/relationships/has_one_or_many.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/laravel/database/eloquent/relationships/has_one_or_many.php b/laravel/database/eloquent/relationships/has_one_or_many.php index 7dd453b3..e7bfc0b0 100644 --- a/laravel/database/eloquent/relationships/has_one_or_many.php +++ b/laravel/database/eloquent/relationships/has_one_or_many.php @@ -7,8 +7,10 @@ class Has_One_Or_Many extends Relationship { /** * Insert a new record for the association. * + * If save is successful, the model will be returned, otherwise false. + * * @param Model|array $attributes - * @return bool + * @return Model|false */ public function insert($attributes) { @@ -16,7 +18,7 @@ public function insert($attributes) { $attributes->set_attribute($this->foreign_key(), $this->base->get_key()); - return $attributes->save(); + return $attributes->save() ? $attributes : false; } else { From e11d13ae3154925c77a42c65a822da22d7d81f95 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 27 Aug 2012 15:09:11 +0200 Subject: [PATCH 220/260] Get rid of duplicate code for DROP TABLE in schema grammars. --- laravel/database/schema/grammars/grammar.php | 12 ++++++++++++ laravel/database/schema/grammars/mysql.php | 12 ------------ laravel/database/schema/grammars/postgres.php | 12 ------------ laravel/database/schema/grammars/sqlite.php | 12 ------------ laravel/database/schema/grammars/sqlserver.php | 12 ------------ 5 files changed, 12 insertions(+), 48 deletions(-) diff --git a/laravel/database/schema/grammars/grammar.php b/laravel/database/schema/grammars/grammar.php index 62a55719..1fea9a31 100644 --- a/laravel/database/schema/grammars/grammar.php +++ b/laravel/database/schema/grammars/grammar.php @@ -50,6 +50,18 @@ public function foreign(Table $table, Fluent $command) return $sql; } + /** + * Generate the SQL statement for a drop table command. + * + * @param Table $table + * @param Fluent $command + * @return string + */ + public function drop(Table $table, Fluent $command) + { + return 'DROP TABLE '.$this->wrap($table); + } + /** * Drop a constraint from the table. * diff --git a/laravel/database/schema/grammars/mysql.php b/laravel/database/schema/grammars/mysql.php index e8c926fe..f2727fc4 100644 --- a/laravel/database/schema/grammars/mysql.php +++ b/laravel/database/schema/grammars/mysql.php @@ -224,18 +224,6 @@ public function rename(Table $table, Fluent $command) return 'RENAME TABLE '.$this->wrap($table).' TO '.$this->wrap($command->name); } - /** - * Generate the SQL statement for a drop table command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop(Table $table, Fluent $command) - { - return 'DROP TABLE '.$this->wrap($table); - } - /** * Generate the SQL statement for a drop column command. * diff --git a/laravel/database/schema/grammars/postgres.php b/laravel/database/schema/grammars/postgres.php index 4d014b1c..2b8620cc 100644 --- a/laravel/database/schema/grammars/postgres.php +++ b/laravel/database/schema/grammars/postgres.php @@ -210,18 +210,6 @@ public function rename(Table $table, Fluent $command) return 'ALTER TABLE '.$this->wrap($table).' RENAME TO '.$this->wrap($command->name); } - /** - * Generate the SQL statement for a drop table command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop(Table $table, Fluent $command) - { - return 'DROP TABLE '.$this->wrap($table); - } - /** * Generate the SQL statement for a drop column command. * diff --git a/laravel/database/schema/grammars/sqlite.php b/laravel/database/schema/grammars/sqlite.php index 4eae9151..975c4137 100644 --- a/laravel/database/schema/grammars/sqlite.php +++ b/laravel/database/schema/grammars/sqlite.php @@ -213,18 +213,6 @@ public function rename(Table $table, Fluent $command) return 'ALTER TABLE '.$this->wrap($table).' RENAME TO '.$this->wrap($command->name); } - /** - * Generate the SQL statement for a drop table command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop(Table $table, Fluent $command) - { - return 'DROP TABLE '.$this->wrap($table); - } - /** * Generate the SQL statement for a drop unique key command. * diff --git a/laravel/database/schema/grammars/sqlserver.php b/laravel/database/schema/grammars/sqlserver.php index 1a556367..3e1854c1 100644 --- a/laravel/database/schema/grammars/sqlserver.php +++ b/laravel/database/schema/grammars/sqlserver.php @@ -224,18 +224,6 @@ public function rename(Table $table, Fluent $command) return 'ALTER TABLE '.$this->wrap($table).' RENAME TO '.$this->wrap($command->name); } - /** - * Generate the SQL statement for a drop table command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop(Table $table, Fluent $command) - { - return 'DROP TABLE '.$this->wrap($table); - } - /** * Generate the SQL statement for a drop column command. * From 9484db18ced4f11034e4ca3828e0b047ee177520 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Tue, 28 Aug 2012 23:52:15 -0500 Subject: [PATCH 221/260] Revert Blade back to 3.2.3 due to regression with layouts. --- laravel/blade.php | 132 ++++++++++++++++++---------------------------- 1 file changed, 52 insertions(+), 80 deletions(-) diff --git a/laravel/blade.php b/laravel/blade.php index 15c8efde..f5bed6f4 100644 --- a/laravel/blade.php +++ b/laravel/blade.php @@ -105,7 +105,7 @@ public static function expired($view, $path) /** * Compiles the specified file containing Blade pseudo-code into valid PHP. * - * @param string $view + * @param string $path * @return string */ public static function compile($view) @@ -149,33 +149,31 @@ protected static function compile_layouts($value) } // First we'll split out the lines of the template so we can get the - // layout from the top of the template. By convention, it must be + // layout from the top of the template. By convention it must be // located on the first line of the template contents. - preg_replace_callback( - '/^@layout(\s*?\(.+?\))(\r?\n)?/', - function($matches) use (&$value) - { - $value = substr( $value, strlen( $matches[0] ) ).CRLF.'@include'.$matches[1]; - }, - $value - ); + $lines = preg_split("/(\r?\n)/", $value); - return $value; + $pattern = static::matcher('layout'); + + $lines[] = preg_replace($pattern, '$1@include$2', $lines[0]); + + // We will add a "render" statement to the end of the templates and + // then slice off the "@layout" shortcut from the start so the + // sections register before the parent template renders. + return implode(CRLF, array_slice($lines, 1)); } /** * Extract a variable value out of a Blade expression. * * @param string $value - * @param string $expression * @return string */ protected static function extract($value, $expression) { - if ( preg_match("/@layout\s*?\(\s*?'(.+?)'\s*?\)/", $value, $matches)) - { - return trim( $matches[1] ); - } + preg_match('/@layout(\s*\(.*\))(\s*)/', $value, $matches); + + return str_replace(array("('", "')"), '', $matches[1]); } /** @@ -186,9 +184,9 @@ protected static function extract($value, $expression) */ protected static function compile_comments($value) { - $value = preg_replace('/\{\{--(.*?)--\}\}/', "", $value); - - return preg_replace('/\{\{--(.*?)--\}\}/s', "$1", $value); + $value = preg_replace('/\{\{--(.+?)(--\}\})?\n/', "", $value); + + return preg_replace('/\{\{--((.|\s)*?)--\}\}/', "\n", $value); } /** @@ -199,7 +197,7 @@ protected static function compile_comments($value) */ protected static function compile_echos($value) { - return preg_replace('/\{\{(.+?)\}\}/s', '', $value); + return preg_replace('/\{\{(.+?)\}\}/', '', $value); } /** @@ -210,21 +208,27 @@ protected static function compile_echos($value) */ protected static function compile_forelse($value) { - preg_match_all('/@forelse\s*?\(\s*?\$(.+?)\s*?as\s*?\$(.+?)\s*?\)/', $value, $matches, PREG_SET_ORDER ); + preg_match_all('/(\s*)@forelse(\s*\(.*\))(\s*)/', $value, $matches); - if ( count($matches) < 1 ) return $value; - - foreach ($matches as $forelse) + foreach ($matches[0] as $forelse) { + preg_match('/\s*\(\s*(\S*)\s/', $forelse, $variable); + // Once we have extracted the variable being looped against, we can add // an if statement to the start of the loop that checks if the count // of the variable being looped against is greater than zero. - $replace = ' 0): foreach ($'.$forelse[1].' as $'.$forelse[2].'): ?>'; + $if = " 0): ?>"; + + $search = '/(\s*)@forelse(\s*\(.*\))/'; + + $replace = '$1'.$if.''; + + $blade = preg_replace($search, $replace, $forelse); // Finally, once we have the check prepended to the loop we'll replace // all instances of this forelse syntax in the view content of the // view being compiled to Blade syntax with real PHP syntax. - $value = str_replace($forelse[0], $replace, $value); + $value = str_replace($forelse, $blade, $value); } return $value; @@ -238,7 +242,7 @@ protected static function compile_forelse($value) */ protected static function compile_empty($value) { - return str_replace('@empty', '', $value); + return str_replace('@empty', '', $value); } /** @@ -260,42 +264,9 @@ protected static function compile_endforelse($value) */ protected static function compile_structure_openings($value) { - preg_replace_callback( - '/@(if|elseif|foreach|for|while)(\s*?)(\([^\n\r\t]+\))/', - function($matches) use (&$value) - { - if(count( $matches ) === 4) - { - $open = 0; - $close = 0; - $cut = 0; - $len = strlen($matches[3]); - for($i = 0; $i < $len; $i++) - { - if($matches[3][$i] === '(' ) - { - $open++; - } - if($matches[3][$i] === ')' ) - { - $close++; - } - if($open !== 0 && ($open === $close)) - { - break; - } - } - $condition = substr($matches[3], 0, ($i + 1)); - $value = str_replace( - '@'.$matches[1].$matches[2].$condition, - '', - $value - ); - } - }, - $value - ); - return $value; + $pattern = '/(\s*)@(if|elseif|foreach|for|while)(\s*\(.*\))/'; + + return preg_replace($pattern, '$1', $value); } /** @@ -306,9 +277,9 @@ function($matches) use (&$value) */ protected static function compile_structure_closings($value) { - $pattern = '/@(endif|endforeach|endfor|endwhile|break|continue)/'; + $pattern = '/(\s*)@(endif|endforeach|endfor|endwhile)(\s*)/'; - return preg_replace($pattern, '', $value); + return preg_replace($pattern, '$1$3', $value); } /** @@ -319,7 +290,7 @@ protected static function compile_structure_closings($value) */ protected static function compile_else($value) { - return str_replace( '@else', '', $value); + return preg_replace('/(\s*)@(else)(\s*)/', '$1$3', $value); } /** @@ -330,9 +301,9 @@ protected static function compile_else($value) */ protected static function compile_unless($value) { - $pattern = static::matcher('unless'); + $pattern = '/(\s*)@unless(\s*\(.*\))/'; - return preg_replace($pattern, '', $value); + return preg_replace($pattern, '$1', $value); } /** @@ -356,7 +327,7 @@ protected static function compile_includes($value) { $pattern = static::matcher('include'); - return preg_replace($pattern, 'with(get_defined_vars())->render(); ?>', $value); + return preg_replace($pattern, '$1with(get_defined_vars())->render(); ?>', $value); } /** @@ -369,7 +340,7 @@ protected static function compile_render($value) { $pattern = static::matcher('render'); - return preg_replace($pattern, '', $value); + return preg_replace($pattern, '$1', $value); } /** @@ -382,7 +353,7 @@ protected static function compile_render_each($value) { $pattern = static::matcher('render_each'); - return preg_replace($pattern, '', $value); + return preg_replace($pattern, '$1', $value); } /** @@ -397,18 +368,19 @@ protected static function compile_yields($value) { $pattern = static::matcher('yield'); - return preg_replace($pattern, '', $value); + return preg_replace($pattern, '$1', $value); } /** * Rewrites Blade yield section statements into valid PHP. * - * @param string $value * @return string */ protected static function compile_yield_sections($value) { - return str_replace('@yield_section', '', $value); + $replace = ''; + + return str_replace('@yield_section', $replace, $value); } /** @@ -423,7 +395,7 @@ protected static function compile_section_start($value) { $pattern = static::matcher('section'); - return preg_replace($pattern, '', $value); + return preg_replace($pattern, '$1', $value); } /** @@ -436,7 +408,7 @@ protected static function compile_section_start($value) */ protected static function compile_section_end($value) { - return str_replace('@endsection', '', $value); + return preg_replace('/@endsection/', '', $value); } /** @@ -453,7 +425,7 @@ protected static function compile_extensions($value) } return $value; - } + } /** * Get the regular expression for a generic Blade function. @@ -463,13 +435,13 @@ protected static function compile_extensions($value) */ public static function matcher($function) { - return '/@'.$function.'\s*?(\(.+?\))/'; + return '/(\s*)@'.$function.'(\s*\(.*\))/'; } /** * Get the fully qualified path for a compiled view. * - * @param string $path + * @param string $view * @return string */ public static function compiled($path) @@ -477,4 +449,4 @@ public static function compiled($path) return path('storage').'views/'.md5($path); } -} +} \ No newline at end of file From 9b902427fd983302139c4ec1e9140c52be5fc83d Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Tue, 28 Aug 2012 23:55:04 -0500 Subject: [PATCH 222/260] Updating version. --- artisan | 2 +- laravel/documentation/changes.md | 12 ++++++++++++ paths.php | 2 +- public/index.php | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/artisan b/artisan index 5127755f..6212745f 100644 --- a/artisan +++ b/artisan @@ -4,7 +4,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.5 + * @version 3.2.6 * @author Taylor Otwell * @link http://laravel.com */ diff --git a/laravel/documentation/changes.md b/laravel/documentation/changes.md index 20135b01..71d0c661 100644 --- a/laravel/documentation/changes.md +++ b/laravel/documentation/changes.md @@ -2,6 +2,8 @@ # Laravel Change Log ## Contents +- [Laravel 3.2.6](#3.2.6) +- [Upgrading From 3.2.5](#upgrade-3.2.6) - [Laravel 3.2.5](#3.2.5) - [Upgrading From 3.2.4](#upgrade-3.2.5) - [Laravel 3.2.4](#3.2.4) @@ -35,6 +37,16 @@ ## Contents - [Laravel 3.1](#3.1) - [Upgrading From 3.0](#upgrade-3.1) + +## Laravel 3.2.6 + +- Revert Blade code back to 3.2.3 tag. + + +### Upgrading From 3.2.5 + +- Replace the **laravel** folder. + ## Laravel 3.2.5 diff --git a/paths.php b/paths.php index 824f8ea0..9fdd9f90 100644 --- a/paths.php +++ b/paths.php @@ -3,7 +3,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.5 + * @version 3.2.6 * @author Taylor Otwell * @link http://laravel.com */ diff --git a/public/index.php b/public/index.php index 4c5604ba..ec6b0cca 100644 --- a/public/index.php +++ b/public/index.php @@ -3,7 +3,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.5 + * @version 3.2.6 * @author Taylor Otwell * @link http://laravel.com */ From e8046847c4774788e88d0fca87d56a8b9fa9ba99 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Tue, 28 Aug 2012 23:58:52 -0500 Subject: [PATCH 223/260] fix tests. --- laravel/tests/cases/blade.test.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/laravel/tests/cases/blade.test.php b/laravel/tests/cases/blade.test.php index 343be2ea..70e80b3b 100644 --- a/laravel/tests/cases/blade.test.php +++ b/laravel/tests/cases/blade.test.php @@ -30,10 +30,10 @@ public function testControlStructuresAreCreatedCorrectly() $blade3 = "@if (true)\nfoo\n@elseif (false)\nbar\n@endif"; $blade4 = "@if (true)\nfoo\n@else\nbar\n@endif"; - $this->assertEquals("\nfoo\n", Blade::compile_string($blade1)); - $this->assertEquals(" 0): ?>\nfoo\n", Blade::compile_string($blade2)); - $this->assertEquals("\nfoo\n\nbar\n", Blade::compile_string($blade3)); - $this->assertEquals("\nfoo\n\nbar\n", Blade::compile_string($blade4)); + $this->assertEquals("\nfoo\n", Blade::compile_string($blade1)); + $this->assertEquals(" 0): ?>\nfoo\n", Blade::compile_string($blade2)); + $this->assertEquals("\nfoo\n\nbar\n", Blade::compile_string($blade3)); + $this->assertEquals("\nfoo\n\nbar\n", Blade::compile_string($blade4)); } /** From f34063c5175cef6909825a74cacded3b9398db91 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Wed, 29 Aug 2012 14:44:16 -0500 Subject: [PATCH 224/260] Fix bug in Eloquent to_array method. --- laravel/database/eloquent/model.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index 61a7769c..4ee26264 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -617,6 +617,8 @@ public function to_array() // to_array method, keying them both by name and ID. elseif (is_array($models)) { + $attributes[$name] = array(); + foreach ($models as $id => $model) { $attributes[$name][$id] = $model->to_array(); From c785067e95e5fd9c97934e01b3ca9a70bf7cf009 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Wed, 29 Aug 2012 14:45:22 -0500 Subject: [PATCH 225/260] Increment version and change log. --- artisan | 2 +- laravel/documentation/changes.md | 12 ++++++++++++ paths.php | 2 +- public/index.php | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/artisan b/artisan index 6212745f..6c9af056 100644 --- a/artisan +++ b/artisan @@ -4,7 +4,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.6 + * @version 3.2.7 * @author Taylor Otwell * @link http://laravel.com */ diff --git a/laravel/documentation/changes.md b/laravel/documentation/changes.md index 71d0c661..c23c410c 100644 --- a/laravel/documentation/changes.md +++ b/laravel/documentation/changes.md @@ -2,6 +2,8 @@ # Laravel Change Log ## Contents +- [Laravel 3.2.7](#3.2.7) +- [Upgrading From 3.2.6](#upgrade-3.2.7) - [Laravel 3.2.6](#3.2.6) - [Upgrading From 3.2.5](#upgrade-3.2.6) - [Laravel 3.2.5](#3.2.5) @@ -37,6 +39,16 @@ ## Contents - [Laravel 3.1](#3.1) - [Upgrading From 3.0](#upgrade-3.1) + +## Laravel 3.2.7 + +- Fix bug in Eloquent `to_array` method. + + +### Upgrading From 3.2.6 + +- Replace the **laravel** folder. + ## Laravel 3.2.6 diff --git a/paths.php b/paths.php index 9fdd9f90..7bbd033e 100644 --- a/paths.php +++ b/paths.php @@ -3,7 +3,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.6 + * @version 3.2.7 * @author Taylor Otwell * @link http://laravel.com */ diff --git a/public/index.php b/public/index.php index ec6b0cca..6eeb7aa0 100644 --- a/public/index.php +++ b/public/index.php @@ -3,7 +3,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.6 + * @version 3.2.7 * @author Taylor Otwell * @link http://laravel.com */ From f97fb3a457240718b0a4c43c5e137da35b0a1d87 Mon Sep 17 00:00:00 2001 From: kapil verma Date: Sat, 1 Sep 2012 19:00:47 +0530 Subject: [PATCH 226/260] Updated Paginator to fit better with bootstrap 2.1 The Paginator Renders a list of links compatible with bootstrap 2.1 standards ... so the irritating bug that used to be there on active and disabled pages is gone --- laravel/paginator.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/laravel/paginator.php b/laravel/paginator.php index 3deb5f61..e45e7d7c 100644 --- a/laravel/paginator.php +++ b/laravel/paginator.php @@ -183,7 +183,7 @@ public function links($adjacent = 3) $links = $this->slider($adjacent); } - $content = $this->previous().' '.$links.' '.$this->next(); + $content = '
      ' . $this->previous() . $links . $this->next() . '
    '; return ''; } @@ -300,7 +300,7 @@ protected function element($element, $page, $text, $disabled) // the "first" element should be a span instead of a link. if ($disabled($this->page, $this->last)) { - return HTML::span($text, array('class' => "{$class} disabled")); + return '"{$class} disabled")).'>'.$text.''; } else { @@ -349,7 +349,7 @@ protected function range($start, $end) { if ($this->page == $page) { - $pages[] = HTML::span($page, array('class' => 'current')); + $pages[] = '
  • '.$page.'
  • '; } else { @@ -372,7 +372,7 @@ protected function link($page, $text, $class) { $query = '?page='.$page.$this->appendage($this->appends); - return HTML::link(URI::current().$query, $text, compact('class'), Request::secure()); + return ''. HTML::link(URI::current().$query, $text, [], Request::secure()).''; } /** From 2e01c58f92761ac24f9feb759d6f46c539984668 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Sat, 1 Sep 2012 21:48:37 -0500 Subject: [PATCH 227/260] Fix error handling. --- laravel/error.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/error.php b/laravel/error.php index ac2e4d15..6b75d210 100644 --- a/laravel/error.php +++ b/laravel/error.php @@ -41,7 +41,7 @@ public static function exception($exception, $trace = true) { $response = Event::first('500'); - return Response::prepare($response)->send(); + echo Response::prepare($response)->render(); } exit(1); From cfe5fa109a1b0073b2859154168c90658c859c24 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Sat, 1 Sep 2012 21:50:14 -0500 Subject: [PATCH 228/260] Add fix to change log. --- laravel/documentation/changes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/laravel/documentation/changes.md b/laravel/documentation/changes.md index c23c410c..dffb45ad 100644 --- a/laravel/documentation/changes.md +++ b/laravel/documentation/changes.md @@ -43,6 +43,7 @@ ## Contents ## Laravel 3.2.7 - Fix bug in Eloquent `to_array` method. +- Fix bug in displaying of generic error page. ### Upgrading From 3.2.6 From 4e21cfce39f8e86d78d69ed437fd1493fbe3cc26 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Sat, 1 Sep 2012 22:07:01 -0500 Subject: [PATCH 229/260] Fixing a double slash bug in URL generation with languages. add tests. --- laravel/tests/cases/url.test.php | 24 ++++++++++++++++++++++++ laravel/url.php | 9 +++++++-- phpunit.xml | 9 +++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 phpunit.xml diff --git a/laravel/tests/cases/url.test.php b/laravel/tests/cases/url.test.php index 393211be..603265ab 100644 --- a/laravel/tests/cases/url.test.php +++ b/laravel/tests/cases/url.test.php @@ -84,6 +84,8 @@ public function testToAssetGeneratesURLWithoutFrontControllerInURL() Request::foundation()->server->add(array('HTTPS' => 'on')); $this->assertEquals('https://localhost/image.jpg', URL::to_asset('image.jpg')); + + Request::foundation()->server->add(array('HTTPS' => 'off')); } /** @@ -103,4 +105,26 @@ public function testToRouteMethodGeneratesURLsToRoutes() $this->assertEquals('http://localhost/index.php/url/test/taylor/otwell', URL::to_route('url-test-2', array('taylor', 'otwell'))); } + + /** + * Test language based URL generation. + * + * @group laravel + */ + public function testUrlsGeneratedWithLanguages() + { + Config::set('application.languages', array('sp', 'fr')); + Config::set('application.language', 'sp'); + $this->assertEquals('http://localhost/index.php/sp/foo', URL::to('foo')); + $this->assertEquals('http://localhost/foo.jpg', URL::to_asset('foo.jpg')); + + Config::set('application.index', ''); + $this->assertEquals('http://localhost/sp/foo', URL::to('foo')); + + Config::set('application.index', 'index.php'); + Config::set('application.language', 'en'); + $this->assertEquals('http://localhost/index.php/foo', URL::to('foo')); + Config::set('application.languages', array()); + } + } \ No newline at end of file diff --git a/laravel/url.php b/laravel/url.php index b85dbc70..c87139e4 100644 --- a/laravel/url.php +++ b/laravel/url.php @@ -114,9 +114,14 @@ public static function to($url = '', $https = null, $asset = false, $locale = tr $root .= '/'.Config::get('application.index'); } - if ( ! $asset and $locale and count(Config::get('application.languages')) > 0) + $languages = Config::get('application.languages'); + + if ( ! $asset and $locale and count($languages) > 0) { - $root .= '/'.Config::get('application.language'); + if (in_array($default = Config::get('application.language'), $languages)) + { + $root = rtrim($root, '/').'/'.$default; + } } // Since SSL is not often used while developing the application, we allow the diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 00000000..d7a799bf --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,9 @@ + + + + /Users/taylor/Code/Laravel/framework/laravel/tests/cases + + + \ No newline at end of file From 8afab342c6fc0a26aeb04d0984f2e326e7fd94b5 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Sat, 1 Sep 2012 22:09:47 -0500 Subject: [PATCH 230/260] Incrementing version and updating change log. --- artisan | 2 +- laravel/documentation/changes.md | 12 ++++++++++++ paths.php | 2 +- public/index.php | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/artisan b/artisan index 6c9af056..2f3dbeb6 100644 --- a/artisan +++ b/artisan @@ -4,7 +4,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.7 + * @version 3.2.8 * @author Taylor Otwell * @link http://laravel.com */ diff --git a/laravel/documentation/changes.md b/laravel/documentation/changes.md index dffb45ad..d9b0ff41 100644 --- a/laravel/documentation/changes.md +++ b/laravel/documentation/changes.md @@ -2,6 +2,8 @@ # Laravel Change Log ## Contents +- [Laravel 3.2.8](#3.2.8) +- [Upgrading From 3.2.7](#upgrade-3.2.8) - [Laravel 3.2.7](#3.2.7) - [Upgrading From 3.2.6](#upgrade-3.2.7) - [Laravel 3.2.6](#3.2.6) @@ -39,6 +41,16 @@ ## Contents - [Laravel 3.1](#3.1) - [Upgrading From 3.0](#upgrade-3.1) + +## Laravel 3.2.8 + +- Fix double slash bug in URLs when using languages and no "index.php". + + +### Upgrading From 3.2.7 + +- Replace the **laravel** folder. + ## Laravel 3.2.7 diff --git a/paths.php b/paths.php index 7bbd033e..bd870438 100644 --- a/paths.php +++ b/paths.php @@ -3,7 +3,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.7 + * @version 3.2.8 * @author Taylor Otwell * @link http://laravel.com */ diff --git a/public/index.php b/public/index.php index 6eeb7aa0..3b213a95 100644 --- a/public/index.php +++ b/public/index.php @@ -3,7 +3,7 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.7 + * @version 3.2.8 * @author Taylor Otwell * @link http://laravel.com */ From 1f005bd7e5f737c23f52afd48dc9b2974d1261ea Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Sat, 1 Sep 2012 22:16:30 -0500 Subject: [PATCH 231/260] Remove notification from travis file. --- .travis.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index a1bcd71c..1d589555 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,4 @@ language: php php: - 5.3 -script: "php artisan test:core" - -notifications: - irc: - - "irc.freenode.org#laravel" \ No newline at end of file +script: "php artisan test:core" \ No newline at end of file From 2a5d7c3080901b30e37898e79e5df94d290ac11c Mon Sep 17 00:00:00 2001 From: kapil verma Date: Sun, 2 Sep 2012 12:27:06 +0530 Subject: [PATCH 232/260] Fixed the use of 5.4 array syntax in one place SO that things dont break for 5.3 peeps --- laravel/paginator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/paginator.php b/laravel/paginator.php index e45e7d7c..7f406281 100644 --- a/laravel/paginator.php +++ b/laravel/paginator.php @@ -372,7 +372,7 @@ protected function link($page, $text, $class) { $query = '?page='.$page.$this->appendage($this->appends); - return ''. HTML::link(URI::current().$query, $text, [], Request::secure()).''; + return ''. HTML::link(URI::current().$query, $text, array(), Request::secure()).''; } /** From 163f39075db7dde53dd4f8fb5c60cb111c2c9fde Mon Sep 17 00:00:00 2001 From: George Drakakis Date: Mon, 3 Sep 2012 13:59:49 +0300 Subject: [PATCH 233/260] Added Greek Language Signed-off-by: George Drakakis --- application/language/gr/pagination.php | 19 +++++ application/language/gr/validation.php | 104 +++++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 application/language/gr/pagination.php create mode 100644 application/language/gr/validation.php diff --git a/application/language/gr/pagination.php b/application/language/gr/pagination.php new file mode 100644 index 00000000..1b0a53ae --- /dev/null +++ b/application/language/gr/pagination.php @@ -0,0 +1,19 @@ + '« Προηγούμενο', + 'next' => 'Επόμενο »', + +); \ No newline at end of file diff --git a/application/language/gr/validation.php b/application/language/gr/validation.php new file mode 100644 index 00000000..f461ac0e --- /dev/null +++ b/application/language/gr/validation.php @@ -0,0 +1,104 @@ + "Το πεδίο :attribute πρέπει να εγκριθεί.", + "active_url" => "Το πεδίο :attribute δεν ειναι σωστό URL.", + "after" => "Το πεδίο :attribute πρέπει η ημερομηνία να ειναι μετά :date.", + "alpha" => "Το πεδίο :attribute μπορεί να περιλαμβάνει μόνο γράμματα.", + "alpha_dash" => "Το πεδίο :attribute μπορεί να περιλαμβάνει μόνο γράμματα, αριθμούς και παύλες.", + "alpha_num" => "Το πεδίο :attribute μπορεί να περιλαμβάνει μόνο γράμματα και αριθμούς.", + "array" => "Το πεδίο :attribute πρέπει να περιλαμβάνει επιλεγμένα αντικείμενα.", + "before" => "Το πεδίο :attribute πρέπει η ημερομηνία να ειναι πριν από :date.", + "between" => array( + "numeric" => "Το πεδίο :attribute πρέπει να έχει τιμές μεταξύ :min - :max.", + "file" => "Το πεδίο :attribute πρέπει να ειναι ανάμεσα σε :min - :max kb.", + "string" => "Το πεδίο :attribute πρέπει να περιλαμβάνει :min - :max χαρακτήρες.", + ), + "confirmed" => "Το πεδίο :attribute δεν πέρασε τον έλεγχο.", + "count" => "Το πεδίο :attribute πρέπει να έχει ακριβώς :count επιλεγμένα αντικείμενα.", + "countbetween" => "Το πεδίο :attribute πρέπει να είναι ανάμεσα σε :min και :max επιλεγμένα αντικείμενα.", + "countmax" => "Το πεδίο :attribute πρέπει να έχει λιγότερα από :max επιλεγμένα αντικείμενα.", + "countmin" => "Το πεδίο :attribute πρέπει να έχει τουλάχιστον :min επιλεγμένα αντικείμενα.", + "different" => "Τα πεδία :attribute και :other πρέπει να ειναι διαφορετικά.", + "email" => "Στο πεδίο :attribute η μορφοποίηση ειναι άκυρη.", + "exists" => "Το επιλεγμένο πεδίο :attribute είναι άκυρο.", + "image" => "Το πεδίο :attribute πρέπει να είναι εικόνα.", + "in" => "Το επιλεγμένο πεδίο :attribute είναι άκυρο.", + "integer" => "Το πεδίο :attribute πρέπει να ειναι αριθμός.", + "ip" => "Το πεδίο :attribute πρέπει να ειναι μια έγκυρη διεύθυνση IP.", + "match" => "Το φορμάτ του πεδίου :attribute είναι άκυρο.", + "max" => array( + "numeric" => "Το πεδίο :attribute πρέπει να είναι μικρότερο από :max.", + "file" => "Το πεδίο :attribute πρέπει να είναι μικρότερο από :max kb.", + "string" => "Το πεδίο :attribute πρέπει να έχει λιγότερους από :max χαρακτήρες.", + ), + "mimes" => "Το πεδίο :attribute πρέπει να ειναι αρχείο με τύπο: :values.", + "min" => array( + "numeric" => "Το πεδίο :attribute πρέπει να είναι τουλάχιστον :min.", + "file" => "Το πεδίο :attribute πρέπει να είναι μικρότερο από :max kb.", + "string" => "Το πεδίο :attribute πρέπει να έχει λιγότερους από :max χαρακτήρες.", + ), + "not_in" => "Το επιλεγμένο πεδίο :attribute είναι άκυρο.", + "numeric" => "Το πεδίο :attribute πρέπει να είναι αριθμός.", + "required" => "Το πεδίο :attribute είναι απαραίτητο.", + "same" => "Τα πεδία :attribute και :other πρέπει να είναι ίδια.", + "size" => array( + "numeric" => "Το πεδίο :attribute πρέπει να ειναι :size.", + "file" => "Το πεδίο :attribute πρέπει να έχει μέγεθος :size kb.", + "string" => "Το πεδίο :attribute πρέπει να είναι :size χαρακτήρες.", + ), + "unique" => "Το πεδίο :attribute έχει ήδη ανατεθεί.", + "url" => "Το πεδίο :attribute είναι άκυρο.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file From a1c7dde08bf60dcd916d529bcc315234e676d844 Mon Sep 17 00:00:00 2001 From: Joost Koehoorn Date: Mon, 3 Sep 2012 16:42:14 +0300 Subject: [PATCH 234/260] Fixed problem with manual running of Artisan tasks When running an Artisan task from within your application using `Command::run`, it fails when the same task is ran more than once. Every time the task is resolved, its file is included using `require` leading to duplicate class definitions. By using `require_once` this problem is avoided. --- laravel/cli/command.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/cli/command.php b/laravel/cli/command.php index 113881c2..c6a25ee4 100644 --- a/laravel/cli/command.php +++ b/laravel/cli/command.php @@ -125,7 +125,7 @@ public static function resolve($bundle, $task) // the requested method may be executed. if (file_exists($path = Bundle::path($bundle).'tasks/'.$task.EXT)) { - require $path; + require_once $path; $task = static::format($bundle, $task); From afe4485641b7c4baeb43dd7e3a355533fba0448d Mon Sep 17 00:00:00 2001 From: Roumen Damianoff Date: Mon, 3 Sep 2012 18:49:38 +0300 Subject: [PATCH 235/260] Bulgarian translation for array validator messages. --- application/language/bg/validation.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/application/language/bg/validation.php b/application/language/bg/validation.php index fe01d9be..c95b1ed3 100644 --- a/application/language/bg/validation.php +++ b/application/language/bg/validation.php @@ -24,7 +24,7 @@ "alpha" => "Полето :attribute трябва да съдържа само букви.", "alpha_dash" => "Полето :attribute трябва да съдържа само букви, цифри, долна черта и тире.", "alpha_num" => "Полето :attribute трябва да съдържа само букви и цифри.", - "array" => "The :attribute must have selected elements.", + "array" => "Полето :attribute трябва да има избрани елементи.", "before" => "Полето :attribute трябва да бъде дата преди :date.", "between" => array( "numeric" => "Полето :attribute трябва да бъде между :min и :max.", @@ -32,10 +32,10 @@ "string" => "Полето :attribute трябва да бъде между :min и :max знака.", ), "confirmed" => "Полето :attribute не е потвърдено.", - "count" => "The :attribute must have exactly :count selected elements.", - "countbetween" => "The :attribute must have between :min and :max selected elements.", - "countmax" => "The :attribute must have less than :max selected elements.", - "countmin" => "The :attribute must have at least :min selected elements.", + "count" => "Полето :attribute трябва да има точно :count избрани елементи.", + "countbetween" => "Полето :attribute трябва да има от :min до :max избрани елементи.", + "countmax" => "Полето :attribute трябва да има по-малко от :max избрани елементи.", + "countmin" => "Полето :attribute трябва да има минимум :min избрани елементи.", "different" => "Полетата :attribute и :other трябва да са различни.", "email" => "Полето :attribute е с невалиден формат.", "exists" => "Избраната стойност на :attribute вече съществува.", From 6b73974505557c9663f9f6cbc00793d3225c9d20 Mon Sep 17 00:00:00 2001 From: Callum McIntyre Date: Mon, 3 Sep 2012 21:44:16 +0100 Subject: [PATCH 236/260] Added new touch function to eloquent, updates timestamps and immediately saves Signed-off-by: Callum McIntyre --- laravel/database/eloquent/model.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php index 306d471a..c2566496 100644 --- a/laravel/database/eloquent/model.php +++ b/laravel/database/eloquent/model.php @@ -452,6 +452,16 @@ public function timestamp() if ( ! $this->exists) $this->created_at = $this->updated_at; } + /** + *Updates the timestamp on the model and immediately saves it. + * + * @return void + */ + public function touch(){ + $this->timestamp(); + $this->save(); + } + /** * Get a new fluent query builder instance for the model. * From 0161273010fd5217d0f0b2e1ee03066d2204fcb8 Mon Sep 17 00:00:00 2001 From: Callum McIntyre Date: Mon, 3 Sep 2012 22:23:58 +0100 Subject: [PATCH 237/260] Added documentation for the touch() function Signed-off-by: Callum McIntyre --- laravel/documentation/database/eloquent.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/laravel/documentation/database/eloquent.md b/laravel/documentation/database/eloquent.md index cbcf83c9..45969c79 100644 --- a/laravel/documentation/database/eloquent.md +++ b/laravel/documentation/database/eloquent.md @@ -132,6 +132,11 @@ ## Inserting & Updating Models Next, add **created_at** and **updated_at** date columns to your table. Now, whenever you save the model, the creation and update timestamps will be set automatically. You're welcome. +In some cases it may be useful to update the **updated_at** date column without actually modifying any data within the model. Simply use the **touch** method, which will also automatically save the changes immediately: + + $comment = Comment::find(1); + $comment->touch(); + > **Note:** You can change the default timezone of your application in the **application/config/application.php** file. From c8ee7ca6148942be2ccff7e26518721425f80247 Mon Sep 17 00:00:00 2001 From: Callum McIntyre Date: Mon, 3 Sep 2012 23:23:36 +0100 Subject: [PATCH 238/260] Added documentation regarding the newly public timestamp() function Signed-off-by: Callum McIntyre --- laravel/documentation/database/eloquent.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/laravel/documentation/database/eloquent.md b/laravel/documentation/database/eloquent.md index 45969c79..09493db0 100644 --- a/laravel/documentation/database/eloquent.md +++ b/laravel/documentation/database/eloquent.md @@ -137,6 +137,13 @@ ## Inserting & Updating Models $comment = Comment::find(1); $comment->touch(); +You can also use the **timestamp** function to update the **updated_at** date column without saving the model immediately. Note that if you are actually modifying the model's data this is handled behind the scenes: + + $comment = Comment::find(1); + $comment->timestamp(); + //do something else here, but not modifying the $comment model data + $comment->save(); + > **Note:** You can change the default timezone of your application in the **application/config/application.php** file. From 05552f2c617550563a40a58b9b4dcfb4b10dae21 Mon Sep 17 00:00:00 2001 From: flaviozantut Date: Mon, 3 Sep 2012 19:49:32 -0300 Subject: [PATCH 239/260] Added Portuguese Language --- application/language/pt/pagination.php | 0 application/language/pt/validation.php | 99 ++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 application/language/pt/pagination.php create mode 100644 application/language/pt/validation.php diff --git a/application/language/pt/pagination.php b/application/language/pt/pagination.php new file mode 100644 index 00000000..e69de29b diff --git a/application/language/pt/validation.php b/application/language/pt/validation.php new file mode 100644 index 00000000..6e98fb59 --- /dev/null +++ b/application/language/pt/validation.php @@ -0,0 +1,99 @@ + "O :attribute deve ser aceito.", + "active_url" => "O :attribute não é uma URL válida.", + "after" => "O :attribute deve ser uma data após :date.", + "alpha" => "O :attribute só pode conter letras.", + "alpha_dash" => "O :attribute só pode conter letras, números e traços.", + "alpha_num" => "O :attribute só pode conter letras e números.", + "before" => "O :attribute deve ser uma data anterior à :date.", + "between" => array( + "numeric" => "O :attribute deve estar entre :min - :max.", + "file" => "O :attribute deve estar entre :min - :max kilobytes.", + "string" => "O :attribute deve estar entre :min - :max caracteres.", + ), + "confirmed" => "O :attribute confirmação não coincide.", + "different" => "O :attribute e :other devem ser diferentes.", + "email" => "O :attribute não é um e-mail válido", + "exists" => "O :attribute selecionado é inválido.", + "image" => "O :attribute deve ser uma imagem.", + "in" => "O :attribute selecionado é inválido.", + "integer" => "O :attribute deve ser um inteiro", + "ip" => "O :attribute deve ser um endereço IP válido.", + "match" => "O formato :attribute é inválido.", + "max" => array( + "numeric" => "O :attribute deve ser inferior a :max.", + "file" => "O :attribute deve ser inferior a :max kilobytes.", + "string" => "O :attribute deve ser inferior a :max caracteres.", + ), + "mimes" => "O :attribute deve ser um arquivo do tipo: :values.", + "min" => array( + "numeric" => "O :attribute deve conter pelo menos :min.", + "file" => "O :attribute deve conter pelo menos :min kilobytes.", + "string" => "O :attribute deve conter pelo menos :min caracteres.", + ), + "not_in" => "O :attribute selecionado é inválido.", + "numeric" => "O :attribute deve ser um número.", + "required" => "O campo :attribute deve ser preenchido.", + "same" => "O :attribute e :other devem ser iguais", + "size" => array( + "numeric" => "O :attribute deve ser :size.", + "file" => "O :attribute deve ter :size kilobyte.", + "string" => "O :attribute deve ter :size caracteres.", + ), + "unique" => "O :attribute já existe", + "url" => "O formato :attribute é inválido.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file From 8599d7833859a0ca4af14c505e7465d368428b57 Mon Sep 17 00:00:00 2001 From: flaviozantut Date: Mon, 3 Sep 2012 20:27:56 -0300 Subject: [PATCH 240/260] Added Portuguese Language --- application/language/pt/pagination.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/application/language/pt/pagination.php b/application/language/pt/pagination.php index e69de29b..e6303530 100644 --- a/application/language/pt/pagination.php +++ b/application/language/pt/pagination.php @@ -0,0 +1,19 @@ + '« Anterior', + 'next' => 'Próxima »', + +); \ No newline at end of file From 8e145e6c118d5416c95b0d1391a0c9cc0b0e1f18 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Tue, 4 Sep 2012 16:36:17 +0300 Subject: [PATCH 241/260] Make Eloquent auth driver respect a model's custom password getter. This fixes #1140. --- laravel/auth/drivers/eloquent.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/auth/drivers/eloquent.php b/laravel/auth/drivers/eloquent.php index e376483e..35fe07d2 100644 --- a/laravel/auth/drivers/eloquent.php +++ b/laravel/auth/drivers/eloquent.php @@ -50,7 +50,7 @@ public function attempt($arguments = array()) $password_field = Config::get('auth.password', 'password'); - if ( ! is_null($user) and Hash::check($password, $user->get_attribute($password_field))) + if ( ! is_null($user) and Hash::check($password, $user->{$password_field})) { return $this->login($user->id, array_get($arguments, 'remember')); } From deac7b36a41ebe8890b4e1d5679c0a3c8f8b6570 Mon Sep 17 00:00:00 2001 From: George Drakakis Date: Tue, 4 Sep 2012 20:20:08 +0300 Subject: [PATCH 242/260] Changed the folder name from "gr" to "el" Signed-off-by: George Drakakis --- application/language/el/pagination.php | 19 +++++ application/language/el/validation.php | 104 +++++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 application/language/el/pagination.php create mode 100644 application/language/el/validation.php diff --git a/application/language/el/pagination.php b/application/language/el/pagination.php new file mode 100644 index 00000000..1b0a53ae --- /dev/null +++ b/application/language/el/pagination.php @@ -0,0 +1,19 @@ + '« Προηγούμενο', + 'next' => 'Επόμενο »', + +); \ No newline at end of file diff --git a/application/language/el/validation.php b/application/language/el/validation.php new file mode 100644 index 00000000..f461ac0e --- /dev/null +++ b/application/language/el/validation.php @@ -0,0 +1,104 @@ + "Το πεδίο :attribute πρέπει να εγκριθεί.", + "active_url" => "Το πεδίο :attribute δεν ειναι σωστό URL.", + "after" => "Το πεδίο :attribute πρέπει η ημερομηνία να ειναι μετά :date.", + "alpha" => "Το πεδίο :attribute μπορεί να περιλαμβάνει μόνο γράμματα.", + "alpha_dash" => "Το πεδίο :attribute μπορεί να περιλαμβάνει μόνο γράμματα, αριθμούς και παύλες.", + "alpha_num" => "Το πεδίο :attribute μπορεί να περιλαμβάνει μόνο γράμματα και αριθμούς.", + "array" => "Το πεδίο :attribute πρέπει να περιλαμβάνει επιλεγμένα αντικείμενα.", + "before" => "Το πεδίο :attribute πρέπει η ημερομηνία να ειναι πριν από :date.", + "between" => array( + "numeric" => "Το πεδίο :attribute πρέπει να έχει τιμές μεταξύ :min - :max.", + "file" => "Το πεδίο :attribute πρέπει να ειναι ανάμεσα σε :min - :max kb.", + "string" => "Το πεδίο :attribute πρέπει να περιλαμβάνει :min - :max χαρακτήρες.", + ), + "confirmed" => "Το πεδίο :attribute δεν πέρασε τον έλεγχο.", + "count" => "Το πεδίο :attribute πρέπει να έχει ακριβώς :count επιλεγμένα αντικείμενα.", + "countbetween" => "Το πεδίο :attribute πρέπει να είναι ανάμεσα σε :min και :max επιλεγμένα αντικείμενα.", + "countmax" => "Το πεδίο :attribute πρέπει να έχει λιγότερα από :max επιλεγμένα αντικείμενα.", + "countmin" => "Το πεδίο :attribute πρέπει να έχει τουλάχιστον :min επιλεγμένα αντικείμενα.", + "different" => "Τα πεδία :attribute και :other πρέπει να ειναι διαφορετικά.", + "email" => "Στο πεδίο :attribute η μορφοποίηση ειναι άκυρη.", + "exists" => "Το επιλεγμένο πεδίο :attribute είναι άκυρο.", + "image" => "Το πεδίο :attribute πρέπει να είναι εικόνα.", + "in" => "Το επιλεγμένο πεδίο :attribute είναι άκυρο.", + "integer" => "Το πεδίο :attribute πρέπει να ειναι αριθμός.", + "ip" => "Το πεδίο :attribute πρέπει να ειναι μια έγκυρη διεύθυνση IP.", + "match" => "Το φορμάτ του πεδίου :attribute είναι άκυρο.", + "max" => array( + "numeric" => "Το πεδίο :attribute πρέπει να είναι μικρότερο από :max.", + "file" => "Το πεδίο :attribute πρέπει να είναι μικρότερο από :max kb.", + "string" => "Το πεδίο :attribute πρέπει να έχει λιγότερους από :max χαρακτήρες.", + ), + "mimes" => "Το πεδίο :attribute πρέπει να ειναι αρχείο με τύπο: :values.", + "min" => array( + "numeric" => "Το πεδίο :attribute πρέπει να είναι τουλάχιστον :min.", + "file" => "Το πεδίο :attribute πρέπει να είναι μικρότερο από :max kb.", + "string" => "Το πεδίο :attribute πρέπει να έχει λιγότερους από :max χαρακτήρες.", + ), + "not_in" => "Το επιλεγμένο πεδίο :attribute είναι άκυρο.", + "numeric" => "Το πεδίο :attribute πρέπει να είναι αριθμός.", + "required" => "Το πεδίο :attribute είναι απαραίτητο.", + "same" => "Τα πεδία :attribute και :other πρέπει να είναι ίδια.", + "size" => array( + "numeric" => "Το πεδίο :attribute πρέπει να ειναι :size.", + "file" => "Το πεδίο :attribute πρέπει να έχει μέγεθος :size kb.", + "string" => "Το πεδίο :attribute πρέπει να είναι :size χαρακτήρες.", + ), + "unique" => "Το πεδίο :attribute έχει ήδη ανατεθεί.", + "url" => "Το πεδίο :attribute είναι άκυρο.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute_rule" to name the lines. This helps keep your + | custom validation clean and tidy. + | + | So, say you want to use a custom validation message when validating that + | the "email" attribute is unique. Just add "email_unique" to this array + | with your custom message. The Validator will handle the rest! + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as "E-Mail Address" instead + | of "email". Your users will thank you. + | + | The Validator class will automatically search this array of lines it + | is attempting to replace the :attribute place-holder in messages. + | It's pretty slick. We think you'll like it. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file From 69ebe6d56aa53fc555145ac4717004cd2856a9da Mon Sep 17 00:00:00 2001 From: Aaron Kuzemchak Date: Wed, 5 Sep 2012 16:07:20 -0400 Subject: [PATCH 243/260] Allow Input::json() to return array instead of object --- laravel/input.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/laravel/input.php b/laravel/input.php index 2235ad51..b76fc7c6 100644 --- a/laravel/input.php +++ b/laravel/input.php @@ -102,13 +102,14 @@ public static function query($key = null, $default = null) /** * Get the JSON payload for the request. * + * @param bool $as_array * @return object */ - public static function json() + public static function json($as_array = false) { if ( ! is_null(static::$json)) return static::$json; - return static::$json = json_decode(Request::foundation()->getContent()); + return static::$json = json_decode(Request::foundation()->getContent(), $as_array); } /** From c1bcfec3d2da1c6ef27b3de685228622ef21aa51 Mon Sep 17 00:00:00 2001 From: kapil verma Date: Thu, 6 Sep 2012 04:42:58 +0530 Subject: [PATCH 244/260] Turn profiler off using runtime Config just added a check in Profiler's render method to also look at Config::get('application.profiler') as laravel allows changing config during runtime. This allows turning off profiler for certain actions --- laravel/profiling/profiler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/profiling/profiler.php b/laravel/profiling/profiler.php index 01469ab8..360e4702 100644 --- a/laravel/profiling/profiler.php +++ b/laravel/profiling/profiler.php @@ -27,7 +27,7 @@ public static function render($response) // We only want to send the profiler toolbar if the request is not an AJAX // request, as sending it on AJAX requests could mess up JSON driven API // type applications, so we will not send anything in those scenarios. - if ( ! Request::ajax()) + if ( ! Request::ajax() and Config::get('application.profiler') ) { static::$data['memory'] = get_file_size(memory_get_usage(true)); static::$data['memory_peak'] = get_file_size(memory_get_peak_usage(true)); From 7e11bb74313fe6f388253b45d450390b663f39a7 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 7 Sep 2012 14:32:12 +0200 Subject: [PATCH 245/260] Delete phpunit.xml file. Looks like that was committed accidentally. --- phpunit.xml | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 phpunit.xml diff --git a/phpunit.xml b/phpunit.xml deleted file mode 100644 index d7a799bf..00000000 --- a/phpunit.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - /Users/taylor/Code/Laravel/framework/laravel/tests/cases - - - \ No newline at end of file From 9348046d0eaef216eaa7e2f2c2506c25bbad2086 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 7 Sep 2012 14:32:37 +0200 Subject: [PATCH 246/260] Fix dynamically generated phpunit.xml file not being deleted automatically in the test runner. --- laravel/cli/tasks/test/runner.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/laravel/cli/tasks/test/runner.php b/laravel/cli/tasks/test/runner.php index b34e5225..0d9fb4e6 100644 --- a/laravel/cli/tasks/test/runner.php +++ b/laravel/cli/tasks/test/runner.php @@ -86,9 +86,9 @@ protected function test() // fix the spaced directories problem when using the command line // strings with spaces inside should be wrapped in quotes. - $path = escapeshellarg($path); + $esc_path = escapeshellarg($path); - passthru('phpunit --configuration '.$path, $status); + passthru('phpunit --configuration '.$esc_path, $status); @unlink($path); From f7cdb76f36bf00f9016bc28eb19162cf71fee476 Mon Sep 17 00:00:00 2001 From: Neo Ighodaro Date: Sun, 9 Sep 2012 09:08:55 +0100 Subject: [PATCH 247/260] The bundle variable is not defined anywhere in the method scope. --- laravel/cli/tasks/bundle/providers/provider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/cli/tasks/bundle/providers/provider.php b/laravel/cli/tasks/bundle/providers/provider.php index 258500c2..d22487f7 100644 --- a/laravel/cli/tasks/bundle/providers/provider.php +++ b/laravel/cli/tasks/bundle/providers/provider.php @@ -73,7 +73,7 @@ protected function download($url) // zip that was put in the storage directory. if ($remote === false) { - throw new \Exception("Error downloading bundle [{$bundle}]."); + throw new \Exception("Error downloading bundle."); } return $remote; From f0a2ffef2b2178a4f9e56b453397cccf924f3632 Mon Sep 17 00:00:00 2001 From: Neo Ighodaro Date: Sun, 9 Sep 2012 09:09:41 +0100 Subject: [PATCH 248/260] The bundle variable is not defined anywhere in the method scope. Signed-off-by: Neo Ighodaro --- laravel/cli/tasks/bundle/providers/provider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/cli/tasks/bundle/providers/provider.php b/laravel/cli/tasks/bundle/providers/provider.php index d22487f7..8ac853ff 100644 --- a/laravel/cli/tasks/bundle/providers/provider.php +++ b/laravel/cli/tasks/bundle/providers/provider.php @@ -73,7 +73,7 @@ protected function download($url) // zip that was put in the storage directory. if ($remote === false) { - throw new \Exception("Error downloading bundle."); + throw new \Exception("Error downloading the requested bundle."); } return $remote; From fde0d1128ad0827643497418ba7c5bbcda7d3acc Mon Sep 17 00:00:00 2001 From: Bryan te Beek Date: Sun, 9 Sep 2012 16:34:39 +0200 Subject: [PATCH 249/260] Added/fixed Dutch Translation (nl_NL) Signed-off-by: Bryan te Beek --- application/language/nl/validation.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/application/language/nl/validation.php b/application/language/nl/validation.php index ac0c8416..920e32c0 100644 --- a/application/language/nl/validation.php +++ b/application/language/nl/validation.php @@ -10,12 +10,12 @@ */ "accepted" => "Het :attribute moet geaccepteerd zijn.", - "active_url" => "Het :attribute is geen geldig URL.", + "active_url" => "Het :attribute is geen geldige URL.", "after" => "Het :attribute moet een datum na :date zijn.", "alpha" => "Het :attribute mag alleen letters bevatten.", "alpha_dash" => "Het :attribute mag alleen letters, nummers, onderstreep(_) en strepen(-) bevatten.", - "alpha_num" => "Het :attribute mag alleen letters en nummers", - "array" => "The :attribute must have selected elements.", + "alpha_num" => "Het :attribute mag alleen letters en nummers bevatten.", + "array" => "Het :attribute moet geselecteerde elementen bevatten.", "before" => "Het :attribute moet een datum voor :date zijn.", "between" => array( "numeric" => "Het :attribute moet tussen :min en :max zijn.", @@ -23,17 +23,17 @@ "string" => "Het :attribute moet tussen :min en :max tekens zijn.", ), "confirmed" => "Het :attribute bevestiging komt niet overeen.", - "count" => "The :attribute must have exactly :count selected elements.", - "countbetween" => "The :attribute must have between :min and :max selected elements.", - "countmax" => "The :attribute must have less than :max selected elements.", - "countmin" => "The :attribute must have at least :min selected elements.", + "count" => "Het :attribute moet precies :count geselecteerde elementen bevatten.", + "countbetween" => "Het :attribute moet tussen :min en :max geselecteerde elementen bevatten.", + "countmax" => "Het :attribute moet minder dan :max geselecteerde elementen bevatten.", + "countmin" => "Het :attribute moet minimaal :min geselecteerde elementen bevatten.", "different" => "Het :attribute en :other moeten verschillend zijn.", "email" => "Het :attribute formaat is ongeldig.", "exists" => "Het gekozen :attribute is al ingebruik.", "image" => "Het :attribute moet een afbeelding zijn.", "in" => "Het gekozen :attribute is ongeldig.", "integer" => "Het :attribute moet een getal zijn.", - "ip" => "Het :attribute moet een geldig IP adres bevatten.", + "ip" => "Het :attribute moet een geldig IP adres zijn.", "match" => "Het :attribute formaat is ongeldig.", "max" => array( "numeric" => "Het :attribute moet minder dan :max zijn.", From b438fe819edf12ce6a88e77387840e7528b981ea Mon Sep 17 00:00:00 2001 From: Bryan te Beek Date: Sun, 9 Sep 2012 18:05:04 +0200 Subject: [PATCH 250/260] A few small fixes to Dutch translation (nl_NL) Signed-off-by: Bryan te Beek --- application/language/nl/validation.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/application/language/nl/validation.php b/application/language/nl/validation.php index 920e32c0..92ebf53e 100644 --- a/application/language/nl/validation.php +++ b/application/language/nl/validation.php @@ -20,7 +20,7 @@ "between" => array( "numeric" => "Het :attribute moet tussen :min en :max zijn.", "file" => "Het :attribute moet tussen :min en :max kilobytes zijn.", - "string" => "Het :attribute moet tussen :min en :max tekens zijn.", + "string" => "Het :attribute moet tussen :min en :max karakters zijn.", ), "confirmed" => "Het :attribute bevestiging komt niet overeen.", "count" => "Het :attribute moet precies :count geselecteerde elementen bevatten.", @@ -33,18 +33,18 @@ "image" => "Het :attribute moet een afbeelding zijn.", "in" => "Het gekozen :attribute is ongeldig.", "integer" => "Het :attribute moet een getal zijn.", - "ip" => "Het :attribute moet een geldig IP adres zijn.", + "ip" => "Het :attribute moet een geldig IP-adres zijn.", "match" => "Het :attribute formaat is ongeldig.", "max" => array( "numeric" => "Het :attribute moet minder dan :max zijn.", "file" => "Het :attribute moet minder dan :max kilobytes zijn.", - "string" => "Het :attribute moet minder dan :max tekens zijn.", + "string" => "Het :attribute moet minder dan :max karakters zijn.", ), "mimes" => "Het :attribute moet een bestand zijn van het bestandstype :values.", "min" => array( "numeric" => "Het :attribute moet minimaal :min zijn.", "file" => "Het :attribute moet minimaal :min kilobytes zijn.", - "string" => "Het :attribute moet minimaal :min characters zijn.", + "string" => "Het :attribute moet minimaal :min karakters zijn.", ), "not_in" => "Het :attribute formaat is ongeldig.", "numeric" => "Het :attribute moet een nummer zijn.", From 4de8921f2db47c6e216abfdb563dd31581f0e59d Mon Sep 17 00:00:00 2001 From: kapil verma Date: Mon, 10 Sep 2012 12:02:55 +0530 Subject: [PATCH 251/260] Fixed The $dots property So that it doesn't screw up pagination --- laravel/paginator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/paginator.php b/laravel/paginator.php index 7f406281..b12c4a27 100644 --- a/laravel/paginator.php +++ b/laravel/paginator.php @@ -65,7 +65,7 @@ class Paginator { * * @var string */ - protected $dots = '...'; + protected $dots = '
  • ...
  • '; /** * Create a new Paginator instance. From adc23dc9649aa9fce523e3b7b757cff85476af06 Mon Sep 17 00:00:00 2001 From: Jason Walton Date: Mon, 10 Sep 2012 11:25:08 -0700 Subject: [PATCH 252/260] Added traffic and chassis as uncountable words to properly feed pluralizer Signed-off-by: Jason Walton --- application/config/strings.php | 4 +++- laravel/tests/application/config/strings.php | 7 +++++-- laravel/tests/cases/str.test.php | 4 +++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/application/config/strings.php b/application/config/strings.php index 3d8b68f6..bbbe230c 100644 --- a/application/config/strings.php +++ b/application/config/strings.php @@ -96,6 +96,8 @@ 'sheep', 'species', 'moose', + 'chassis', + 'traffic', ), /* @@ -185,4 +187,4 @@ ), -); \ No newline at end of file +); diff --git a/laravel/tests/application/config/strings.php b/laravel/tests/application/config/strings.php index 730f973e..bbbe230c 100644 --- a/laravel/tests/application/config/strings.php +++ b/laravel/tests/application/config/strings.php @@ -8,7 +8,7 @@ |-------------------------------------------------------------------------- | | This array contains the singular and plural forms of words. It's used by - | the "singular" and "plural" methods on the Str class to convert a given + | the "singular" and "plural" methods in the Str class to convert a given | word from singular to plural and vice versa. | | Note that the regular expressions are only for inflecting English words. @@ -95,6 +95,9 @@ 'series', 'sheep', 'species', + 'moose', + 'chassis', + 'traffic', ), /* @@ -184,4 +187,4 @@ ), -); \ No newline at end of file +); diff --git a/laravel/tests/cases/str.test.php b/laravel/tests/cases/str.test.php index 7daab540..7c380600 100644 --- a/laravel/tests/cases/str.test.php +++ b/laravel/tests/cases/str.test.php @@ -96,6 +96,8 @@ public function testStringsCanBeSingularOrPlural() $this->assertEquals('Users', Str::plural('User')); $this->assertEquals('user', Str::plural('user', 1)); $this->assertEquals('users', Str::plural('user', 2)); + $this->assertEquals('chassis', Str::plural('chassis', 2)); + $this->assertEquals('traffic', Str::plural('traffic', 2)); } /** @@ -130,4 +132,4 @@ public function testRandomStringsCanBeGenerated() $this->assertEquals(40, strlen(Str::random(40))); } -} \ No newline at end of file +} From 85cab82f37731f09f319418a0a308d2580c57a1d Mon Sep 17 00:00:00 2001 From: kapil verma Date: Tue, 11 Sep 2012 07:48:01 +0530 Subject: [PATCH 253/260] Fixed 2 stupid bugs for better markup Thats it .. pulling on the docs now --- laravel/paginator.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/laravel/paginator.php b/laravel/paginator.php index b12c4a27..e9b95e35 100644 --- a/laravel/paginator.php +++ b/laravel/paginator.php @@ -300,7 +300,7 @@ protected function element($element, $page, $text, $disabled) // the "first" element should be a span instead of a link. if ($disabled($this->page, $this->last)) { - return '"{$class} disabled")).'>'.$text.''; + return '"{$class} disabled")).'>'.$text.''; } else { @@ -372,7 +372,7 @@ protected function link($page, $text, $class) { $query = '?page='.$page.$this->appendage($this->appends); - return ''. HTML::link(URI::current().$query, $text, array(), Request::secure()).''; + return ' $class)).'>'. HTML::link(URI::current().$query, $text, array(), Request::secure()).''; } /** From b63b0c08294a00a0a9c30e3d5a0152f9e3088b05 Mon Sep 17 00:00:00 2001 From: kapil verma Date: Tue, 11 Sep 2012 08:09:30 +0530 Subject: [PATCH 254/260] Updated Documentation for Bootstrap-y Pagination MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Docs now show bootstrap style Pagination  --- laravel/documentation/views/pagination.md | 30 ++++++++++++----------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/laravel/documentation/views/pagination.md b/laravel/documentation/views/pagination.md index 95b5479b..081a6f60 100644 --- a/laravel/documentation/views/pagination.md +++ b/laravel/documentation/views/pagination.md @@ -80,29 +80,31 @@ ## Pagination Styling All pagination link elements can be style using CSS classes. Here is an example of the HTML elements generated by the links method: When you are on the first page of results, the "Previous" link will be disabled. Likewise, the "Next" link will be disabled when you are on the last page of results. The generated HTML will look like this: - Previous +
  • Previous
  • From c7763a23bd7f43f8837ac7077664931518ce8e3b Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Wed, 12 Sep 2012 14:40:55 +0300 Subject: [PATCH 255/260] Add definition list helper to HTML class. --- laravel/html.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/laravel/html.php b/laravel/html.php index fd5bf82e..e3b2a993 100644 --- a/laravel/html.php +++ b/laravel/html.php @@ -347,6 +347,28 @@ private static function listing($type, $list, $attributes = array()) return '<'.$type.static::attributes($attributes).'>'.$html.''; } + + /** + * Generate a definition list. + * + * @param array $list + * @param array $attributes + * @return string + */ + public static function dl($list, $attributes = array()) + { + $html = ''; + + if (count($list) == 0) return $html; + + foreach ($list as $term => $description) + { + $html .= '
    '.static::entities($term).'
    '; + $html .= '
    '.static::entities($description).'
    '; + } + + return ''.$html.''; + } /** * Build a list of HTML attributes from an array. From 5942771ce9bd69d46ce2b84ac683681c322a776e Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Wed, 12 Sep 2012 14:42:20 +0300 Subject: [PATCH 256/260] Add documentation for definition list helper. --- laravel/documentation/views/html.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/laravel/documentation/views/html.md b/laravel/documentation/views/html.md index 5bcaa389..aabe244d 100644 --- a/laravel/documentation/views/html.md +++ b/laravel/documentation/views/html.md @@ -119,6 +119,8 @@ #### Creating lists from an array of items: echo HTML::ol(array('Get Peanut Butter', 'Get Chocolate', 'Feast')); echo HTML::ul(array('Ubuntu', 'Snow Leopard', 'Windows')); + + echo HTML::dl(array('Ubuntu' => 'An operating system by Canonical', 'Windows' => 'An operating system by Microsoft')); ## Custom Macros From 65d4b2448ba43fdfa61769a770786c1c47a43780 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 14 Sep 2012 22:21:35 +0300 Subject: [PATCH 257/260] Fix closing tag in definition list helper. --- laravel/html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/html.php b/laravel/html.php index e3b2a993..211e4022 100644 --- a/laravel/html.php +++ b/laravel/html.php @@ -367,7 +367,7 @@ public static function dl($list, $attributes = array()) $html .= '
    '.static::entities($description).'
    '; } - return ''.$html.''; + return ''.$html.''; } /** From 1474491d623b73fcba6ad0c46651a39aab00b3d5 Mon Sep 17 00:00:00 2001 From: decola977 Date: Sat, 15 Sep 2012 21:36:34 +0300 Subject: [PATCH 258/260] Update application/language/de/validation.php --- application/language/de/validation.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/application/language/de/validation.php b/application/language/de/validation.php index 170cc261..cb41d00c 100644 --- a/application/language/de/validation.php +++ b/application/language/de/validation.php @@ -22,8 +22,8 @@ "active_url" => ":attribute ist keine gültige URL.", "after" => ":attribute muss ein Datum nach dem :date sein.", "alpha" => ":attribute darf nur Buchstaben beinhalten.", - "alpha_dash" => ":attribute sollte nur aus Buchstaben, Nummern und Bindestrichen bestehen.", - "alpha_num" => ":attribute sollte nur aus Buchstaben und Nummern bestehen.", + "alpha_dash" => ":attribute darf nur aus Buchstaben, Nummern und Bindestrichen bestehen.", + "alpha_num" => ":attribute darf nur aus Buchstaben und Nummern bestehen.", "array" => ":attribute muss ausgewählte Elemente haben.", "before" => ":attribute muss ein Datum vor dem :date sein.", "between" => array( @@ -57,7 +57,7 @@ ), "not_in" => "Der gewählte Wert für :attribute ist ungültig.", "numeric" => ":attribute muss eine Zahl sein.", - "required" => ":attribute muss aufgefüllt sein.", + "required" => ":attribute muss ausgefüllt sein.", "same" => ":attribute und :other müssen übereinstimmen.", "size" => array( "numeric" => ":attribute muss gleich :size sein.", From 2d13b3d50475cef73ba8068cc6477be5f6575f52 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Mon, 17 Sep 2012 18:58:24 +0200 Subject: [PATCH 259/260] Add a CONTRIBUTING.md file for GitHub. --- CONTRIBUTING.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..94e2b12a --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,9 @@ +# Pull request guidelines + +[GitHub pull requests](https://help.github.com/articles/using-pull-requests) are a great way for everyone in the community to contribute to the Laravel codebase. Found a bug? Just fix it in your fork and submit a pull request. This will then be reviewed, and, if found as good, merged into the main repository. + +In order to keep the codebase clean, stable and at high quality, even with so many people contributing, some guidelines are necessary for high-quality pull requests: + +- **Branch:** Unless they are immediate documentation fixes relevant for old versions, pull requests should be sent to the `develop` branch only. Make sure to select that branch as target when creating the pull request (GitHub will not automatically select it.) +- **Documentation:** If you are adding a new feature or changing the API in any relevant way, this should be documented. The documentation files can be found directly in the core repository. +- **Unit tests:** To keep old bugs from re-appearing and generally hold quality at a high level, the Laravel core is thoroughly unit-tested. Thus, when you create a pull request, it is expected that you unit test any new code you add. For any bug you fix, you should also add regression tests to make sure the bug will never appear again. If you are unsure about how to write tests, the core team or other contributors will gladly help. \ No newline at end of file From 925e5bed738f3f9ab1321266e2accbc7a14e5dd3 Mon Sep 17 00:00:00 2001 From: Boris Strahija Date: Tue, 18 Sep 2012 17:22:45 +0300 Subject: [PATCH 260/260] Trimming whitespace before doctype tag When using layouts and sections --- laravel/blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laravel/blade.php b/laravel/blade.php index f5bed6f4..f0a520ab 100644 --- a/laravel/blade.php +++ b/laravel/blade.php @@ -68,7 +68,7 @@ public static function sharpen() // Once the view has been compiled, we can simply set the path to the // compiled view on the view instance and call the typical "get" // method on the view to evaluate the compiled PHP view. - return $view->get(); + return ltrim($view->get()); }); }