From a7f6848e53474dfff6c3f14260e0b30d3658b46b Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 3 Jun 2015 18:22:47 +0200 Subject: [PATCH] Lots of stuff gets cached now. --- .../Controllers/Chart/AccountController.php | 8 +- app/Http/Controllers/Chart/BillController.php | 6 +- .../Controllers/Chart/BudgetController.php | 10 +- .../Controllers/Chart/CategoryController.php | 4 +- app/Http/Controllers/HomeController.php | 6 +- app/Http/Controllers/JsonController.php | 10 +- app/Http/Middleware/Reminders.php | 65 ++-- app/Models/TransactionJournal.php | 37 ++- .../Account/AccountRepository.php | 36 ++- ...hartProperties.php => CacheProperties.php} | 10 +- app/Support/Preferences.php | 2 - app/Support/Steam.php | 17 +- app/Support/Twig/Journal.php | 39 ++- composer.json | 1 - composer.lock | 277 +++++++----------- 15 files changed, 286 insertions(+), 242 deletions(-) rename app/Support/{ChartProperties.php => CacheProperties.php} (89%) diff --git a/app/Http/Controllers/Chart/AccountController.php b/app/Http/Controllers/Chart/AccountController.php index e7f4d5b7fc..ae14e368f0 100644 --- a/app/Http/Controllers/Chart/AccountController.php +++ b/app/Http/Controllers/Chart/AccountController.php @@ -8,7 +8,7 @@ use Carbon\Carbon; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Account; use FireflyIII\Repositories\Account\AccountRepositoryInterface; -use FireflyIII\Support\ChartProperties; +use FireflyIII\Support\CacheProperties; use Grumpydictator\Gchart\GChart; use Illuminate\Support\Collection; use Log; @@ -43,7 +43,7 @@ class AccountController extends Controller $end->endOfMonth(); // chart properties for cache: - $chartProperties = new ChartProperties(); + $chartProperties = new CacheProperties(); $chartProperties->addProperty($start); $chartProperties->addProperty($end); $chartProperties->addProperty('all'); @@ -118,7 +118,7 @@ class AccountController extends Controller $accounts = $repository->getFrontpageAccounts($frontPage); // chart properties for cache: - $chartProperties = new ChartProperties(); + $chartProperties = new CacheProperties(); $chartProperties->addProperty($start); $chartProperties->addProperty($end); $chartProperties->addProperty('frontpage'); @@ -182,7 +182,7 @@ class AccountController extends Controller $today = new Carbon; // chart properties for cache: - $chartProperties = new ChartProperties(); + $chartProperties = new CacheProperties(); $chartProperties->addProperty($start); $chartProperties->addProperty($end); $chartProperties->addProperty('frontpage'); diff --git a/app/Http/Controllers/Chart/BillController.php b/app/Http/Controllers/Chart/BillController.php index 569aee84d5..d79c879350 100644 --- a/app/Http/Controllers/Chart/BillController.php +++ b/app/Http/Controllers/Chart/BillController.php @@ -8,7 +8,7 @@ use FireflyIII\Models\Bill; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface; -use FireflyIII\Support\ChartProperties; +use FireflyIII\Support\CacheProperties; use Grumpydictator\Gchart\GChart; use Illuminate\Support\Collection; use Response; @@ -40,7 +40,7 @@ class BillController extends Controller $chart->addColumn(trans('firefly.minAmount'), 'number'); $chart->addColumn(trans('firefly.billEntry'), 'number'); - $chartProperties = new ChartProperties; + $chartProperties = new CacheProperties; $chartProperties->addProperty('single'); $chartProperties->addProperty('bill'); $chartProperties->addProperty($bill->id); @@ -87,7 +87,7 @@ class BillController extends Controller // chart properties for cache: - $chartProperties = new ChartProperties(); + $chartProperties = new CacheProperties(); $chartProperties->addProperty($start); $chartProperties->addProperty($end); $chartProperties->addProperty('bills'); diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php index 649c2be783..9627a53c07 100644 --- a/app/Http/Controllers/Chart/BudgetController.php +++ b/app/Http/Controllers/Chart/BudgetController.php @@ -8,7 +8,7 @@ use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Budget; use FireflyIII\Models\LimitRepetition; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; -use FireflyIII\Support\ChartProperties; +use FireflyIII\Support\CacheProperties; use Grumpydictator\Gchart\GChart; use Illuminate\Support\Collection; use Log; @@ -45,7 +45,7 @@ class BudgetController extends Controller $last = Navigation::endOfX($last, $range, $final); // chart properties for cache: - $chartProperties = new ChartProperties(); + $chartProperties = new CacheProperties(); $chartProperties->addProperty($first); $chartProperties->addProperty($last); $chartProperties->addProperty('budget'); @@ -93,7 +93,7 @@ class BudgetController extends Controller $end = $repetition->enddate; // chart properties for cache: - $chartProperties = new ChartProperties(); + $chartProperties = new CacheProperties(); $chartProperties->addProperty($start); $chartProperties->addProperty($end); $chartProperties->addProperty('budget'); @@ -153,7 +153,7 @@ class BudgetController extends Controller $allEntries = new Collection; // chart properties for cache: - $chartProperties = new ChartProperties(); + $chartProperties = new CacheProperties(); $chartProperties->addProperty($start); $chartProperties->addProperty($end); $chartProperties->addProperty('budget'); @@ -227,7 +227,7 @@ class BudgetController extends Controller $budgets = $repository->getBudgets(); // chart properties for cache: - $chartProperties = new ChartProperties(); + $chartProperties = new CacheProperties(); $chartProperties->addProperty($start); $chartProperties->addProperty($end); $chartProperties->addProperty('budget'); diff --git a/app/Http/Controllers/Chart/CategoryController.php b/app/Http/Controllers/Chart/CategoryController.php index 8c076a1791..b86eb143f3 100644 --- a/app/Http/Controllers/Chart/CategoryController.php +++ b/app/Http/Controllers/Chart/CategoryController.php @@ -8,7 +8,7 @@ use Carbon\Carbon; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Category; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; -use FireflyIII\Support\ChartProperties; +use FireflyIII\Support\CacheProperties; use Grumpydictator\Gchart\GChart; use Log; use Navigation; @@ -80,7 +80,7 @@ class CategoryController extends Controller $end = Session::get('end', Carbon::now()->endOfMonth()); // chart properties for cache: - $chartProperties = new ChartProperties; + $chartProperties = new CacheProperties; $chartProperties->addProperty($start); $chartProperties->addProperty($end); $chartProperties->addProperty('category'); diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 2c2d9a8789..7ffa3d9b4e 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -62,9 +62,11 @@ class HomeController extends Controller public function index(AccountRepositoryInterface $repository) { + $types = Config::get('firefly.accountTypesByIdentifier.asset'); $count = $repository->countAccounts($types); + if ($count == 0) { return Redirect::route('new-user.index'); } @@ -78,8 +80,11 @@ class HomeController extends Controller $end = Session::get('end', Carbon::now()->endOfMonth()); $accounts = $repository->getFrontpageAccounts($frontPage); $savings = $repository->getSavingsAccounts(); + $piggyBankAccounts = $repository->getPiggyBankAccounts(); + + $savingsTotal = 0; foreach ($savings as $savingAccount) { $savingsTotal += Steam::balance($savingAccount, $end); @@ -100,7 +105,6 @@ class HomeController extends Controller $transactions[] = [$set, $account]; } } - return view('index', compact('count', 'title', 'savings', 'subTitle', 'mainTitleIcon', 'transactions', 'savingsTotal', 'piggyBankAccounts')); } diff --git a/app/Http/Controllers/JsonController.php b/app/Http/Controllers/JsonController.php index 9ad1f8b6a7..1908ed7dcf 100644 --- a/app/Http/Controllers/JsonController.php +++ b/app/Http/Controllers/JsonController.php @@ -11,7 +11,7 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface; -use FireflyIII\Support\ChartProperties; +use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; use Log; use Response; @@ -40,7 +40,7 @@ class JsonController extends Controller $end = Session::get('end', Carbon::now()->endOfMonth()); // works for json too! - $prop = new ChartProperties; + $prop = new CacheProperties; $prop->addProperty($start); $prop->addProperty($end); $prop->addProperty('box-bills-paid'); @@ -96,7 +96,7 @@ class JsonController extends Controller $end = Session::get('end', Carbon::now()->endOfMonth()); // works for json too! - $prop = new ChartProperties; + $prop = new CacheProperties; $prop->addProperty($start); $prop->addProperty($end); $prop->addProperty('box-bills-unpaid'); @@ -158,7 +158,7 @@ class JsonController extends Controller $end = Session::get('end', Carbon::now()->endOfMonth()); // works for json too! - $prop = new ChartProperties; + $prop = new CacheProperties; $prop->addProperty($start); $prop->addProperty($end); $prop->addProperty('box-in'); @@ -190,7 +190,7 @@ class JsonController extends Controller // works for json too! - $prop = new ChartProperties; + $prop = new CacheProperties; $prop->addProperty($start); $prop->addProperty($end); $prop->addProperty('box-out'); diff --git a/app/Http/Middleware/Reminders.php b/app/Http/Middleware/Reminders.php index 9814e448d0..eb161a4123 100644 --- a/app/Http/Middleware/Reminders.php +++ b/app/Http/Middleware/Reminders.php @@ -3,11 +3,12 @@ namespace FireflyIII\Http\Middleware; use App; +use Cache; use Carbon\Carbon; use Closure; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\Reminder; -use FireflyIII\User; +use FireflyIII\Support\CacheProperties; use Illuminate\Contracts\Auth\Guard; use Illuminate\Http\Request; use View; @@ -47,35 +48,49 @@ class Reminders */ public function handle(Request $request, Closure $next) { + + if ($this->auth->check() && !$request->isXmlHttpRequest()) { // do reminders stuff. - $reminders = []; - if ($this->auth->user() instanceof User) { - $piggyBanks = $this->auth->user()->piggyBanks()->where('remind_me', 1)->get(); - /** @var \FireflyIII\Helpers\Reminders\ReminderHelperInterface $helper */ - $helper = App::make('FireflyIII\Helpers\Reminders\ReminderHelperInterface'); - /** @var PiggyBank $piggyBank */ - foreach ($piggyBanks as $piggyBank) { - $helper->createReminders($piggyBank, new Carbon); - } - // delete invalid reminders - // this is a construction SQLITE cannot handle :( - if (env('DB_CONNECTION') != 'sqlite') { - Reminder::whereUserId($this->auth->user()->id) - ->leftJoin('piggy_banks', 'piggy_banks.id', '=', 'remindersable_id') - ->whereNull('piggy_banks.id') - ->delete(); - } + // abuse CacheProperties to find out if we need to do this: + $properties = new CacheProperties; - // get and list active reminders: - $reminders = $this->auth->user()->reminders()->today()->get(); - $reminders->each( - function (Reminder $reminder) use ($helper) { - $reminder->description = $helper->getReminderText($reminder); - } - ); + $properties->addProperty('reminders'); + $md5 = $properties->md5(); + + if (Cache::has($md5)) { + $reminders = Cache::get($md5); + View::share('reminders', $reminders); + + return $next($request); } + + + $piggyBanks = $this->auth->user()->piggyBanks()->where('remind_me', 1)->get(); + + /** @var \FireflyIII\Helpers\Reminders\ReminderHelperInterface $helper */ + $helper = App::make('FireflyIII\Helpers\Reminders\ReminderHelperInterface'); + + /** @var PiggyBank $piggyBank */ + foreach ($piggyBanks as $piggyBank) { + $helper->createReminders($piggyBank, new Carbon); + } + // delete invalid reminders + // this is a construction SQLITE cannot handle :( + if (env('DB_CONNECTION') != 'sqlite') { + Reminder::whereUserId($this->auth->user()->id)->leftJoin('piggy_banks', 'piggy_banks.id', '=', 'remindersable_id') + ->whereNull('piggy_banks.id')->delete(); + } + + // get and list active reminders: + $reminders = $this->auth->user()->reminders()->today()->get(); + $reminders->each( + function (Reminder $reminder) use ($helper) { + $reminder->description = $helper->getReminderText($reminder); + } + ); + Cache::forever($md5, $reminders); View::share('reminders', $reminders); } diff --git a/app/Models/TransactionJournal.php b/app/Models/TransactionJournal.php index 5b771bd9cf..b4fc946b3e 100644 --- a/app/Models/TransactionJournal.php +++ b/app/Models/TransactionJournal.php @@ -1,7 +1,9 @@ addProperty($this->id); + $prop->addProperty('amount'); + $md5 = $prop->md5(); + if (Cache::has($md5)) { + return Cache::get($md5); + } + + $amount = '0'; bcscale(2); /** @var Transaction $t */ @@ -147,6 +158,8 @@ class TransactionJournal extends Model * If the journal has tags, it gets complicated. */ if ($this->tags->count() == 0) { + Cache::forever($md5, $amount); + return $amount; } @@ -160,6 +173,7 @@ class TransactionJournal extends Model foreach ($others as $other) { $amount = bcsub($amount, $other->actual_amount); } + Cache::forever($md5, $amount); return $amount; } @@ -167,6 +181,8 @@ class TransactionJournal extends Model // if this journal is part of an advancePayment AND the journal is a deposit, // then the journal amount is correcting a withdrawal, and the amount is zero: if ($advancePayment && $this->transactionType->type == 'Deposit') { + Cache::forever($md5, '0'); + return '0'; } @@ -180,12 +196,15 @@ class TransactionJournal extends Model $transfer = $balancingAct->transactionJournals()->transactionTypes(['Transfer'])->first(); if ($transfer) { $amount = bcsub($amount, $transfer->actual_amount); + Cache::forever($md5, $amount); return $amount; } } // @codeCoverageIgnore } // @codeCoverageIgnore + Cache::forever($md5, $amount); + return $amount; } @@ -219,6 +238,15 @@ class TransactionJournal extends Model } + /** + * @codeCoverageIgnore + * @return \Illuminate\Database\Eloquent\Relations\HasMany + */ + public function transactions() + { + return $this->hasMany('FireflyIII\Models\Transaction'); + } + /** * @return string */ @@ -235,15 +263,6 @@ class TransactionJournal extends Model return '0'; } - /** - * @codeCoverageIgnore - * @return \Illuminate\Database\Eloquent\Relations\HasMany - */ - public function transactions() - { - return $this->hasMany('FireflyIII\Models\Transaction'); - } - /** * @codeCoverageIgnore * @return string[] diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index dc9939aeab..02559a82d9 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -4,6 +4,7 @@ namespace FireflyIII\Repositories\Account; use App; use Auth; +use Cache; use Carbon\Carbon; use Config; use DB; @@ -15,6 +16,7 @@ use FireflyIII\Models\Preference; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; +use FireflyIII\Support\CacheProperties; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Query\Builder; use Illuminate\Pagination\LengthAwarePaginator; @@ -109,12 +111,23 @@ class AccountRepository implements AccountRepositoryInterface */ public function getFrontpageAccounts(Preference $preference) { + $cache = new CacheProperties(); + $cache->addProperty($preference->data); + $cache->addProperty('frontPageaccounts'); + $md5 = $cache->md5(); + if (Cache::has($md5)) { + return Cache::get($md5); + } + + if ($preference->data == []) { $accounts = Auth::user()->accounts()->accountTypeIn(['Default account', 'Asset account'])->orderBy('accounts.name', 'ASC')->get(['accounts.*']); } else { $accounts = Auth::user()->accounts()->whereIn('id', $preference->data)->orderBy('accounts.name', 'ASC')->get(['accounts.*']); } + Cache::forever($md5, $accounts); + return $accounts; } @@ -131,7 +144,16 @@ class AccountRepository implements AccountRepositoryInterface */ public function getFrontpageTransactions(Account $account, Carbon $start, Carbon $end) { - return Auth::user() + $prop = new CacheProperties(); + $prop->addProperty($account->id); + $prop->addProperty($start); + $prop->addProperty($end); + $md5 = $prop->md5(); + if(Cache::has($md5)) { + return Cache::get($md5); + } + + $set = Auth::user() ->transactionjournals() ->with(['transactions']) ->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') @@ -144,6 +166,8 @@ class AccountRepository implements AccountRepositoryInterface ->orderBy('transaction_journals.id', 'DESC') ->take(10) ->get(['transaction_journals.*', 'transaction_currencies.symbol', 'transaction_types.type']); + Cache::forever($md5, $set); + return $set; } /** @@ -207,6 +231,14 @@ class AccountRepository implements AccountRepositoryInterface $ids[] = intval($id->account_id); } + $cache = new CacheProperties; + $cache->addProperty($ids); + $cache->addProperty('piggyAccounts'); + $md5 = $cache->md5(); + if (Cache::has($md5)) { + return Cache::get($md5); + } + $ids = array_unique($ids); if (count($ids) > 0) { $accounts = Auth::user()->accounts()->whereIn('id', $ids)->get(); @@ -231,6 +263,8 @@ class AccountRepository implements AccountRepositoryInterface } ); + Cache::forever($md5, $accounts); + return $accounts; } diff --git a/app/Support/ChartProperties.php b/app/Support/CacheProperties.php similarity index 89% rename from app/Support/ChartProperties.php rename to app/Support/CacheProperties.php index 3bff338446..699d7e9a26 100644 --- a/app/Support/ChartProperties.php +++ b/app/Support/CacheProperties.php @@ -10,11 +10,11 @@ use Illuminate\Support\Collection; use Preferences as Prefs; /** - * Class ChartProperties + * Class CacheProperties * * @package FireflyIII\Support */ -class ChartProperties +class CacheProperties { /** @var Collection */ @@ -56,6 +56,12 @@ class ChartProperties $string .= $property->toRfc3339String(); continue; } + + if (is_array($property)) { + $string .= print_r($property, true); + continue; + } + if (is_object($property)) { $string .= $property->__toString(); } diff --git a/app/Support/Preferences.php b/app/Support/Preferences.php index bf781877d7..d5ddc4f181 100644 --- a/app/Support/Preferences.php +++ b/app/Support/Preferences.php @@ -4,7 +4,6 @@ namespace FireflyIII\Support; use Auth; use FireflyIII\Models\Preference; -use Log; /** * Class Preferences * @@ -26,7 +25,6 @@ class Preferences * @return bool */ public function mark() { - Log::debug('MARK!'); $this->set('lastActivity',microtime()); return true; } diff --git a/app/Support/Steam.php b/app/Support/Steam.php index a04e3ee002..6e61e3cff5 100644 --- a/app/Support/Steam.php +++ b/app/Support/Steam.php @@ -2,10 +2,9 @@ namespace FireflyIII\Support; +use Cache; use Carbon\Carbon; use FireflyIII\Models\Account; -use FireflyIII\Models\PiggyBank; -use FireflyIII\Models\PiggyBankRepetition; /** * Class Steam @@ -24,6 +23,19 @@ class Steam */ public function balance(Account $account, Carbon $date, $ignoreVirtualBalance = false) { + + // abuse chart properties: + $properties = new CacheProperties; + $properties->addProperty($account->id); + $properties->addProperty('balance'); + $properties->addProperty($date); + $properties->addProperty($ignoreVirtualBalance); + $md5 = $properties->md5(); + if (Cache::has($md5)) { + return Cache::get($md5); + } + + // find the first known transaction on this account: $firstDateObject = $account ->transactions() @@ -45,6 +57,7 @@ class Steam if (!$ignoreVirtualBalance) { $balance = bcadd($balance, $account->virtual_balance); } + Cache::forever($md5, round($balance, 2)); return round($balance, 2); } diff --git a/app/Support/Twig/Journal.php b/app/Support/Twig/Journal.php index beaafae668..ba03775a5d 100644 --- a/app/Support/Twig/Journal.php +++ b/app/Support/Twig/Journal.php @@ -4,7 +4,9 @@ namespace FireflyIII\Support\Twig; use App; +use Cache; use FireflyIII\Models\TransactionJournal; +use FireflyIII\Support\CacheProperties; use Twig_Extension; use Twig_SimpleFilter; use Twig_SimpleFunction; @@ -26,21 +28,38 @@ class Journal extends Twig_Extension $filters = []; $filters[] = new Twig_SimpleFilter( - 'typeIcon', function(TransactionJournal $journal) { + 'typeIcon', function (TransactionJournal $journal) { + + $prop = new CacheProperties(); + $prop->addProperty($journal->id); + $prop->addProperty('typeIcon'); + $md5 = $prop->md5(); + if (Cache::has($md5)) { + return Cache::get($md5); + } + $type = $journal->transactionType->type; switch ($type) { case 'Withdrawal': - return ''; + $txt = ''; + break; case 'Deposit': - return ''; + $txt = ''; + break; case 'Transfer': - return ''; + $txt = ''; + break; case 'Opening balance': - return ''; + $txt = ''; + break; default: - return ''; + $txt = ''; + break; } + Cache::forever($md5, $txt); + + return $txt; }, ['is_safe' => ['html']] @@ -59,7 +78,7 @@ class Journal extends Twig_Extension $functions = []; $functions[] = new Twig_SimpleFunction( - 'invalidJournal', function(TransactionJournal $journal) { + 'invalidJournal', function (TransactionJournal $journal) { if (!isset($journal->transactions[1]) || !isset($journal->transactions[0])) { return true; } @@ -69,7 +88,7 @@ class Journal extends Twig_Extension ); $functions[] = new Twig_SimpleFunction( - 'relevantTags', function(TransactionJournal $journal) { + 'relevantTags', function (TransactionJournal $journal) { if ($journal->tags->count() == 0) { return App::make('amount')->formatJournal($journal); } @@ -82,7 +101,7 @@ class Journal extends Twig_Extension $amount = App::make('amount')->format($journal->actual_amount, false); return ' ' . $tag->tag . ''; + . '"> ' . $tag->tag . ''; } /* @@ -92,7 +111,7 @@ class Journal extends Twig_Extension $amount = App::make('amount')->formatJournal($journal, false); return ' ' . $tag->tag . ''; + . '"> ' . $tag->tag . ''; } /* * AdvancePayment with a withdrawal will show the amount with a link to diff --git a/composer.json b/composer.json index 48d5895bfe..f123bbe2b4 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,6 @@ "illuminate/html": "~5.0", "league/commonmark": "0.7.*", "rcrowe/twigbridge": "0.7.x@dev", - "twig/extensions": "~1.2", "zizaco/entrust": "dev-laravel-5" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 09cf164f3e..e65ab9a13c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "a0c92aa0223617ca2730500921bdd82c", + "hash": "077d2b2548df62c8ef92871c6e52c856", "packages": [ { "name": "classpreloader/classpreloader", @@ -943,16 +943,16 @@ }, { "name": "laravel/framework", - "version": "v5.0.31", + "version": "v5.0.32", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "db0a7400465df159ba8c6eaa954f97f50bc19687" + "reference": "85f12207cf45cc288e9e6b9b5d184aad5f08e2ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/db0a7400465df159ba8c6eaa954f97f50bc19687", - "reference": "db0a7400465df159ba8c6eaa954f97f50bc19687", + "url": "https://api.github.com/repos/laravel/framework/zipball/85f12207cf45cc288e9e6b9b5d184aad5f08e2ca", + "reference": "85f12207cf45cc288e9e6b9b5d184aad5f08e2ca", "shasum": "" }, "require": { @@ -1065,7 +1065,7 @@ "framework", "laravel" ], - "time": "2015-05-11 22:15:00" + "time": "2015-05-29 18:56:49" }, { "name": "league/commonmark", @@ -1645,17 +1645,17 @@ }, { "name": "symfony/console", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/Console", "source": { "type": "git", "url": "https://github.com/symfony/Console.git", - "reference": "2343f6d8026306bd330e0c987e4c102483c213e7" + "reference": "b5ec0c11a204718f2b656357f5505a8e578f30dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/2343f6d8026306bd330e0c987e4c102483c213e7", - "reference": "2343f6d8026306bd330e0c987e4c102483c213e7", + "url": "https://api.github.com/repos/symfony/Console/zipball/b5ec0c11a204718f2b656357f5505a8e578f30dd", + "reference": "b5ec0c11a204718f2b656357f5505a8e578f30dd", "shasum": "" }, "require": { @@ -1699,11 +1699,11 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2015-05-22 14:53:08" + "time": "2015-05-29 14:42:58" }, { "name": "symfony/debug", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/Debug", "source": { "type": "git", @@ -1764,21 +1764,20 @@ }, { "name": "symfony/event-dispatcher", - "version": "v2.6.8", - "target-dir": "Symfony/Component/EventDispatcher", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "672593bc4b0043a0acf91903bb75a1c82d8f2e02" + "reference": "687039686d0e923429ba6e958d0baa920cd5d458" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/672593bc4b0043a0acf91903bb75a1c82d8f2e02", - "reference": "672593bc4b0043a0acf91903bb75a1c82d8f2e02", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/687039686d0e923429ba6e958d0baa920cd5d458", + "reference": "687039686d0e923429ba6e958d0baa920cd5d458", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.9" }, "require-dev": { "psr/log": "~1.0", @@ -1795,11 +1794,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { - "psr-0": { + "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" } }, @@ -1819,25 +1818,24 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2015-05-02 15:18:45" + "time": "2015-05-02 15:21:08" }, { "name": "symfony/filesystem", - "version": "v2.6.8", - "target-dir": "Symfony/Component/Filesystem", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/symfony/Filesystem.git", - "reference": "1f8429f72a5bfa58b33fd96824bea146fc4b3f49" + "reference": "ae4551fd6d4d4f51f2e7390fbc902fbd67f3b7ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Filesystem/zipball/1f8429f72a5bfa58b33fd96824bea146fc4b3f49", - "reference": "1f8429f72a5bfa58b33fd96824bea146fc4b3f49", + "url": "https://api.github.com/repos/symfony/Filesystem/zipball/ae4551fd6d4d4f51f2e7390fbc902fbd67f3b7ba", + "reference": "ae4551fd6d4d4f51f2e7390fbc902fbd67f3b7ba", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.9" }, "require-dev": { "symfony/phpunit-bridge": "~2.7" @@ -1845,11 +1843,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { - "psr-0": { + "psr-4": { "Symfony\\Component\\Filesystem\\": "" } }, @@ -1869,11 +1867,11 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2015-05-15 13:32:45" + "time": "2015-05-15 13:33:16" }, { "name": "symfony/finder", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/Finder", "source": { "type": "git", @@ -1923,7 +1921,7 @@ }, { "name": "symfony/http-foundation", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/HttpFoundation", "source": { "type": "git", @@ -1977,17 +1975,17 @@ }, { "name": "symfony/http-kernel", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/HttpKernel", "source": { "type": "git", "url": "https://github.com/symfony/HttpKernel.git", - "reference": "a9a6f595941fce8dddd64f4e9bf47747cf1515fc" + "reference": "7c883eb1a5d8b52b1fa6d4134b82304c6bb7007f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/a9a6f595941fce8dddd64f4e9bf47747cf1515fc", - "reference": "a9a6f595941fce8dddd64f4e9bf47747cf1515fc", + "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/7c883eb1a5d8b52b1fa6d4134b82304c6bb7007f", + "reference": "7c883eb1a5d8b52b1fa6d4134b82304c6bb7007f", "shasum": "" }, "require": { @@ -2051,11 +2049,11 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2015-05-27 00:17:10" + "time": "2015-05-29 22:55:07" }, { "name": "symfony/process", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/Process", "source": { "type": "git", @@ -2105,7 +2103,7 @@ }, { "name": "symfony/routing", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/Routing", "source": { "type": "git", @@ -2174,7 +2172,7 @@ }, { "name": "symfony/security-core", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/Security/Core", "source": { "type": "git", @@ -2238,17 +2236,17 @@ }, { "name": "symfony/translation", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/Translation", "source": { "type": "git", "url": "https://github.com/symfony/Translation.git", - "reference": "d030b3d8d9699795dbf8c59e915ef879007a4483" + "reference": "89cdf3c43bc24c85dd8173dfcf5a979a95e5bd9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Translation/zipball/d030b3d8d9699795dbf8c59e915ef879007a4483", - "reference": "d030b3d8d9699795dbf8c59e915ef879007a4483", + "url": "https://api.github.com/repos/symfony/Translation/zipball/89cdf3c43bc24c85dd8173dfcf5a979a95e5bd9c", + "reference": "89cdf3c43bc24c85dd8173dfcf5a979a95e5bd9c", "shasum": "" }, "require": { @@ -2293,11 +2291,11 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2015-05-22 14:37:51" + "time": "2015-05-29 14:42:58" }, { "name": "symfony/var-dumper", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/VarDumper", "source": { "type": "git", @@ -2355,58 +2353,6 @@ ], "time": "2015-05-01 14:14:24" }, - { - "name": "twig/extensions", - "version": "v1.2.0", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig-extensions.git", - "reference": "8cf4b9fe04077bd54fc73f4fde83347040c3b8cd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/8cf4b9fe04077bd54fc73f4fde83347040c3b8cd", - "reference": "8cf4b9fe04077bd54fc73f4fde83347040c3b8cd", - "shasum": "" - }, - "require": { - "twig/twig": "~1.12" - }, - "require-dev": { - "symfony/translation": "~2.3" - }, - "suggest": { - "symfony/translation": "Allow the time_diff output to be translated" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-0": { - "Twig_Extensions_": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Common additional features for Twig that do not directly belong in core", - "homepage": "http://twig.sensiolabs.org/doc/extensions/index.html", - "keywords": [ - "i18n", - "text" - ], - "time": "2014-10-30 14:30:03" - }, { "name": "twig/twig", "version": "v1.18.1", @@ -2466,16 +2412,16 @@ }, { "name": "vlucas/phpdotenv", - "version": "v1.1.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "732d2adb7d916c9593b9d58c3b0d9ebefead07aa" + "reference": "0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/732d2adb7d916c9593b9d58c3b0d9ebefead07aa", - "reference": "732d2adb7d916c9593b9d58c3b0d9ebefead07aa", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa", + "reference": "0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa", "shasum": "" }, "require": { @@ -2485,11 +2431,6 @@ "phpunit/phpunit": "~4.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, "autoload": { "psr-0": { "Dotenv": "src/" @@ -2513,20 +2454,20 @@ "env", "environment" ], - "time": "2014-12-05 15:19:21" + "time": "2015-05-30 15:59:26" }, { "name": "watson/validating", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/dwightwatson/validating.git", - "reference": "47320813a45cc35384e72364484d54fe44dcd3fb" + "reference": "c32912f760b456c043657951683ed6c468ab83e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dwightwatson/validating/zipball/47320813a45cc35384e72364484d54fe44dcd3fb", - "reference": "47320813a45cc35384e72364484d54fe44dcd3fb", + "url": "https://api.github.com/repos/dwightwatson/validating/zipball/c32912f760b456c043657951683ed6c468ab83e7", + "reference": "c32912f760b456c043657951683ed6c468ab83e7", "shasum": "" }, "require": { @@ -2568,7 +2509,7 @@ "laravel", "validation" ], - "time": "2015-05-23 00:03:54" + "time": "2015-06-03 02:25:38" }, { "name": "zizaco/entrust", @@ -3322,16 +3263,16 @@ }, { "name": "phpspec/phpspec", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/phpspec/phpspec.git", - "reference": "9727d75919a00455433e867565bc022f0b985a39" + "reference": "e9a40577323e67f1de2e214abf32976a0352d8f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/phpspec/zipball/9727d75919a00455433e867565bc022f0b985a39", - "reference": "9727d75919a00455433e867565bc022f0b985a39", + "url": "https://api.github.com/repos/phpspec/phpspec/zipball/e9a40577323e67f1de2e214abf32976a0352d8f8", + "reference": "e9a40577323e67f1de2e214abf32976a0352d8f8", "shasum": "" }, "require": { @@ -3396,7 +3337,7 @@ "testing", "tests" ], - "time": "2015-04-18 16:22:51" + "time": "2015-05-30 15:21:40" }, { "name": "phpspec/prophecy", @@ -3460,16 +3401,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "2.0.17", + "version": "2.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c4e8e7725e351184a76544634855b8a9c405a6e3" + "reference": "28a6b34e91d789b2608072ab3c82eaae7cdb973c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c4e8e7725e351184a76544634855b8a9c405a6e3", - "reference": "c4e8e7725e351184a76544634855b8a9c405a6e3", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/28a6b34e91d789b2608072ab3c82eaae7cdb973c", + "reference": "28a6b34e91d789b2608072ab3c82eaae7cdb973c", "shasum": "" }, "require": { @@ -3492,7 +3433,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.1.x-dev" } }, "autoload": { @@ -3518,7 +3459,7 @@ "testing", "xunit" ], - "time": "2015-05-25 05:11:59" + "time": "2015-06-03 07:01:01" }, { "name": "phpunit/php-file-iterator", @@ -3706,16 +3647,16 @@ }, { "name": "phpunit/phpunit", - "version": "4.6.7", + "version": "4.6.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "57bf06dd4eebe2a5ced79a8de71509e7d5c18b25" + "reference": "7b5fe98b28302a8b25693b2298bca74463336975" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/57bf06dd4eebe2a5ced79a8de71509e7d5c18b25", - "reference": "57bf06dd4eebe2a5ced79a8de71509e7d5c18b25", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7b5fe98b28302a8b25693b2298bca74463336975", + "reference": "7b5fe98b28302a8b25693b2298bca74463336975", "shasum": "" }, "require": { @@ -3774,20 +3715,20 @@ "testing", "xunit" ], - "time": "2015-05-25 05:18:18" + "time": "2015-06-03 05:03:30" }, { "name": "phpunit/phpunit-mock-objects", - "version": "2.3.1", + "version": "2.3.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "74ffb87f527f24616f72460e54b595f508dccb5c" + "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/74ffb87f527f24616f72460e54b595f508dccb5c", - "reference": "74ffb87f527f24616f72460e54b595f508dccb5c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/253c005852591fd547fc18cd5b7b43a1ec82d8f7", + "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7", "shasum": "" }, "require": { @@ -3829,7 +3770,7 @@ "mock", "xunit" ], - "time": "2015-04-02 05:36:41" + "time": "2015-05-29 05:19:18" }, { "name": "satooshi/php-coveralls", @@ -4272,21 +4213,20 @@ }, { "name": "symfony/class-loader", - "version": "v2.6.8", - "target-dir": "Symfony/Component/ClassLoader", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/symfony/ClassLoader.git", - "reference": "abf5632a31402ae6ac19cd00683faf603046440a" + "reference": "fa19598cb708b92d983b34aae313f57c217f9386" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/abf5632a31402ae6ac19cd00683faf603046440a", - "reference": "abf5632a31402ae6ac19cd00683faf603046440a", + "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/fa19598cb708b92d983b34aae313f57c217f9386", + "reference": "fa19598cb708b92d983b34aae313f57c217f9386", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.9" }, "require-dev": { "symfony/finder": "~2.0,>=2.0.5", @@ -4295,11 +4235,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { - "psr-0": { + "psr-4": { "Symfony\\Component\\ClassLoader\\": "" } }, @@ -4319,25 +4259,24 @@ ], "description": "Symfony ClassLoader Component", "homepage": "https://symfony.com", - "time": "2015-05-15 13:32:45" + "time": "2015-05-15 13:33:16" }, { "name": "symfony/config", - "version": "v2.6.8", - "target-dir": "Symfony/Component/Config", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/symfony/Config.git", - "reference": "2696c5bc7c31485a482c10865d713de9fcc7aa31" + "reference": "537e9912063e66aa70cbcddd7d6e6e8db61d98e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Config/zipball/2696c5bc7c31485a482c10865d713de9fcc7aa31", - "reference": "2696c5bc7c31485a482c10865d713de9fcc7aa31", + "url": "https://api.github.com/repos/symfony/Config/zipball/537e9912063e66aa70cbcddd7d6e6e8db61d98e4", + "reference": "537e9912063e66aa70cbcddd7d6e6e8db61d98e4", "shasum": "" }, "require": { - "php": ">=5.3.3", + "php": ">=5.3.9", "symfony/filesystem": "~2.3" }, "require-dev": { @@ -4346,11 +4285,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { - "psr-0": { + "psr-4": { "Symfony\\Component\\Config\\": "" } }, @@ -4370,25 +4309,24 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2015-05-15 13:32:45" + "time": "2015-05-15 13:33:16" }, { "name": "symfony/stopwatch", - "version": "v2.6.8", - "target-dir": "Symfony/Component/Stopwatch", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/symfony/Stopwatch.git", - "reference": "b470f87c69837cb71115f1fa720388bb19b63635" + "reference": "7702945bceddc0e1f744519abb8a2baeb94bd5ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/b470f87c69837cb71115f1fa720388bb19b63635", - "reference": "b470f87c69837cb71115f1fa720388bb19b63635", + "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/7702945bceddc0e1f744519abb8a2baeb94bd5ce", + "reference": "7702945bceddc0e1f744519abb8a2baeb94bd5ce", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.9" }, "require-dev": { "symfony/phpunit-bridge": "~2.7" @@ -4396,11 +4334,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { - "psr-0": { + "psr-4": { "Symfony\\Component\\Stopwatch\\": "" } }, @@ -4420,25 +4358,24 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2015-05-02 15:18:45" + "time": "2015-05-02 15:21:08" }, { "name": "symfony/yaml", - "version": "v2.6.8", - "target-dir": "Symfony/Component/Yaml", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/symfony/Yaml.git", - "reference": "f157ab074e453ecd4c0fa775f721f6e67a99d9e2" + "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/f157ab074e453ecd4c0fa775f721f6e67a99d9e2", - "reference": "f157ab074e453ecd4c0fa775f721f6e67a99d9e2", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/4a29a5248aed4fb45f626a7bbbd330291492f5c3", + "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.9" }, "require-dev": { "symfony/phpunit-bridge": "~2.7" @@ -4446,11 +4383,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { - "psr-0": { + "psr-4": { "Symfony\\Component\\Yaml\\": "" } }, @@ -4470,7 +4407,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2015-05-02 15:18:45" + "time": "2015-05-02 15:21:08" } ], "aliases": [],