This commit is contained in:
2019-09-30 01:25:32 +00:00
parent 544813052e
commit cb51be5f72
371 changed files with 44076 additions and 1 deletions

View File

@@ -1,2 +1,3 @@
[2019-09-29 07:53:00] eseye.INFO: [http 200, ok] get -> https://esi.evetech.net/latest/route/30000142/30002269/?datasource=tranquility&flag=secure [t/e: 0.10s/100]
[2019-09-29 08:40:11] eseye.INFO: [http 304, not modified] get -> https://esi.evetech.net/latest/route/30002269/30000142/?datasource=tranquility&flag=secure [t/e: 0.10s/100]
[2019-09-29 11:19:34] eseye.INFO: [http 304, not modified] get -> https://esi.evetech.net/latest/route/30002269/30000142/?datasource=tranquility&flag=secure [t/e: 0.07s/100]

10
vendor/cakephp/chronos/Dockerfile vendored Normal file
View File

@@ -0,0 +1,10 @@
# Basic docker based environment
# Necessary to trick dokku into building the documentation
# using dockerfile instead of herokuish
FROM php:7.3
WORKDIR /code
VOLUME ["/code"]
CMD [ '/bin/bash' ]

20
vendor/cakephp/chronos/LICENSE vendored Normal file
View File

@@ -0,0 +1,20 @@
Copyright (C) Brian Nesbitt
Copyright (C) Cake Software Foundation, Inc. (http://cakefoundation.org)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

147
vendor/cakephp/chronos/README.md vendored Normal file
View File

@@ -0,0 +1,147 @@
# CakePHP Chronos
[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
[![Build Status](https://img.shields.io/travis/cakephp/chronos/master.svg?style=flat-square)](https://travis-ci.org/cakephp/chronos)
[![Coverage Status](https://img.shields.io/coveralls/cakephp/chronos/master.svg?style=flat-square)](https://coveralls.io/r/cakephp/chronos?branch=master)
[![Total Downloads](https://img.shields.io/packagist/dt/cakephp/chronos.svg?style=flat-square)](https://packagist.org/packages/cakephp/chronos)
Chronos aims to be a drop-in replacement for `nesbot/carbon`. It focuses on providing
immutable date/datetime objects. Immutable objects help ensure that datetime objects
aren't accidentally modified keeping data more predictable.
# Installation
Installing with composer:
```
$ composer require cakephp/chronos
```
You can then use Chronos:
```php
<?php
require 'vendor/autoload.php';
use Cake\Chronos\Chronos;
printf("Now: %s", Chronos::now());
```
# Differences with nesbot/carbon
The biggest and main difference is that `Chronos` extends `DateTimeImmutable` instead of `DateTime`.
Immutability for date values has proven to be a great way of avoiding bugs and reduce the amount of code,
since developers don't have to manually copy the instance every time they need a change.
Another important feature it offers is the `Date` class, which is used for representing dates without time (calendar dates).
Any time method called on this type of object is basically a no-op.
A minor but still noticeable difference is that `Chronos` has no external dependencies, it is completely standalone.
Finally, Chronos is faster than Carbon as it has been optimized for the creation of hundreds of instances with minimal
overhead.
Chronos also strives for HHVM compatibility, this library can be used safely with HHVM 3.11.
# Migrating from Carbon
First add `cakephp/chronos` to your `composer.json`:
```shell
php composer.phar require cakephp/chronos
```
By default Chronos includes a compatibility script that creates aliases for the
relevant Carbon classes. This will let most applications upgrade with very
little effort. If you'd like to permanently update your code, you will
need to update imports and typehints. Assuming `src` contains the files you
want to migrate, we could use the following to update files:
```
# Replace imports
find ./src -type f -exec sed -i '' 's/use Carbon\\CarbonInterval/use Cake\\Chronos\\ChronosInterval/g' {} \;
find ./src -type f -exec sed -i '' 's/use Carbon\\Carbon/use Cake\\Chronos\\Chronos/g' {} \;
# Replace typehints and extensions
find ./src -type f -exec sed -i '' 's/CarbonInterval/ChronosInterval/g' {} \;
find ./src -type f -exec sed -i '' 's/Carbon/Chronos/g' {} \;
```
At this point your code should mostly work as it did before. The biggest
difference is that Chronos instances are immutable.
## Immutable Object Changes
Immutable objects have a number of advantages:
1. Using immutable objects is always free of side-effects.
2. Dates and times don't accidentally change underneath other parts of your code.
With those benefits in mind, there are a few things you need to keep in mind
when modifying immutable objects:
```php
// This will lose modifications
$date = new Chronos('2015-10-21 16:29:00');
$date->modify('+2 hours');
// This will keep modifications
$date = new Chronos('2015-10-21 16:29:00');
$date = $date->modify('+2 hours');
```
## Getting Mutable Objects
In the case that you need a mutable instance you can get one:
```php
$time = new Chronos('2015-10-21 16:29:00');
$mutable = $time->toMutable();
$date = new Date('2015-10-21');
$mutable = $date->toMutable();
```
## Converting Mutable Objects into Immutable ones.
If you have a mutable object and want an immutable variant you can do the following:
```php
$time = new MutableDateTime('2015-10-21 16:29:00');
$fixed = $time->toImmutable();
$date = new MutableDate('2015-10-21');
$fixed = $date->toImmutable();
```
# Calendar Dates
PHP only offers datetime objects as part of the native extensions. Chronos
adds a number of conveniences to the traditional DateTime object and introduces
a `Date` object. `Date` instances offer compatibility with the `ChronosInterface`, but
have their time & timezone frozen to `00:00:00 UTC`. This makes them ideal when working with
calendar dates as the time components will always match.
```php
use Cake\Chronos\Date;
$today = new Date();
echo $today;
// Outputs '2015-10-21'
echo $today->modify('+3 hours');
// Outputs '2015-10-21'
```
Like instances of `Chronos`, `Date` objects are also *immutable*. The `MutableDate` class provides
a mutable variant of `Date`.
# Documentation
A more descriptive documentation can be found at [book.cakephp.org/chronos/1.x/en/](https://book.cakephp.org/chronos/1.x/en/).
# API Documentation
API documentation can be found on [api.cakephp.org/chronos](https://api.cakephp.org/chronos).

62
vendor/cakephp/chronos/composer.json vendored Normal file
View File

@@ -0,0 +1,62 @@
{
"name": "cakephp/chronos",
"type": "library",
"description": "A simple API extension for DateTime.",
"keywords": [
"date",
"time",
"DateTime"
],
"homepage": "http://cakephp.org",
"license": "MIT",
"authors": [
{
"name": "Brian Nesbitt",
"email": "brian@nesbot.com",
"homepage": "http://nesbot.com"
},
{
"name": "The CakePHP Team",
"homepage": "http://cakephp.org"
}
],
"support": {
"issues": "https://github.com/cakephp/chronos/issues",
"irc": "irc://irc.freenode.org/cakephp",
"source": "https://github.com/cakephp/chronos"
},
"require": {
"php": "^5.5.9|^7"
},
"require-dev": {
"phpunit/phpunit": "<6.0 || ^7.0",
"athletic/athletic": "~0.1",
"cakephp/cakephp-codesniffer": "^3.0",
"phpbench/phpbench": "@dev",
"phpstan/phpstan": "^0.6.4"
},
"autoload": {
"psr-4": {
"Cake\\Chronos\\": "src/"
},
"files": ["src/carbon_compat.php"]
},
"autoload-dev": {
"psr-4": {
"Cake\\Chronos\\Test\\": "tests/"
},
"files": ["tests/TestCase.php"]
},
"scripts": {
"check": [
"@test",
"@cs-check",
"@phpstan"
],
"test": "phpunit",
"cs-check": "phpcs",
"cs-fix": "phpcbf",
"bench": "phpbench run",
"phpstan": "phpstan analyze -c phpstan.neon -l 3 src tests"
}
}

19
vendor/cakephp/chronos/docs.Dockerfile vendored Normal file
View File

@@ -0,0 +1,19 @@
# Generate the HTML output.
FROM markstory/cakephp-docs-builder as builder
RUN pip install git+https://github.com/sphinx-contrib/video.git@master
COPY docs /data/docs
RUN cd /data/docs-builder && \
# In the future repeat website for each version
make website LANGS="en fr ja pt" SOURCE=/data/docs DEST=/data/website/1.x
# Build a small nginx container with just the static site in it.
FROM nginx:1.15-alpine
COPY --from=builder /data/website /data/website
COPY --from=builder /data/docs-builder/nginx.conf /etc/nginx/conf.d/default.conf
# Move each version into place
RUN mv /data/website/1.x/html/ /usr/share/nginx/html/1.x

View File

View File

@@ -0,0 +1,46 @@
# Global configuration information used across all the
# translations of documentation.
#
# Import the base theme configuration
from cakephpsphinx.config.all import *
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The full version, including alpha/beta/rc tags.
release = '1.x'
# The search index version.
search_version = 'chronos-1'
# The marketing display name for the book.
version_name = ''
# Project name shown in the black header bar
project = 'Chronos'
# Other versions that display in the version picker menu.
version_list = [
{'name': '1.x', 'number': '/chronos/1.x', 'title': '1.x', 'current': True},
]
# Languages available.
languages = ['en', 'fr', 'ja', 'pt']
# The GitHub branch name for this version of the docs
# for edit links to point at.
branch = 'master'
# Current version being built
version = '1.x'
# Language in use for this directory.
language = 'en'
show_root_link = True
repository = 'cakephp/chronos'
source_path = 'docs/'

View File

@@ -0,0 +1,9 @@
import sys, os
# Append the top level directory of the docs, so we can import from the config dir.
sys.path.insert(0, os.path.abspath('..'))
# Pull in all the configuration options defined in the global config file..
from config.all import *
language = 'en'

View File

@@ -0,0 +1,7 @@
.. toctree::
:maxdepth: 2
:caption: CakePHP Chronos
/index
API <https://api.cakephp.org/chronos>

313
vendor/cakephp/chronos/docs/en/index.rst vendored Normal file
View File

@@ -0,0 +1,313 @@
Chronos
#######
Chronos provides a zero-dependency collection of extensions to the ``DateTime``
object. In addition to convenience methods, Chronos provides:
* ``Date`` objects for representing calendar dates.
* Immutable date and datetime objects.
* A pluggable translation system. Only English translations are included in the
library. However, ``cakephp/i18n`` can be used for full language support.
Installation
------------
To install Chronos, you should use ``composer``. From your
application's ROOT directory (where composer.json file is located) run the
following::
php composer.phar require cakephp/chronos "@stable"
Overview
--------
Chronos provides a number of extensions to the DateTime objects provided by PHP.
Chronos provides 5 classes that cover mutable and immutable date/time variants
and extensions to ``DateInterval``.
* ``Cake\Chronos\Chronos`` is an immutable *date and time* object.
* ``Cake\Chronos\Date`` is a immutable *date* object.
* ``Cake\Chronos\MutableDateTime`` is a mutable *date and time* object.
* ``Cake\Chronos\MutableDate`` is a mutable *date* object.
* ``Cake\Chronos\ChronosInterval`` is an extension to the ``DateInterval``
object.
Lastly, if you want to typehint against Chronos-provided date/time objects you
should use ``Cake\Chronos\ChronosInterface``. All of the date and time objects
implement this interface.
Creating Instances
------------------
There are many ways to get an instance of Chronos or Date. There are a number of
factory methods that work with different argument sets::
use Cake\Chronos\Chronos;
$now = Chronos::now();
$today = Chronos::today();
$yesterday = Chronos::yesterday();
$tomorrow = Chronos::tomorrow();
// Parse relative expressions
$date = Chronos::parse('+2 days, +3 hours');
// Date and time integer values.
$date = Chronos::create(2015, 12, 25, 4, 32, 58);
// Date or time integer values.
$date = Chronos::createFromDate(2015, 12, 25);
$date = Chronos::createFromTime(11, 45, 10);
// Parse formatted values.
$date = Chronos::createFromFormat('m/d/Y', '06/15/2015');
Working with Immutable Objects
------------------------------
If you've used PHP's ``DateTime`` objects, you're comfortable with *mutable*
objects. Chronos offers mutable objects, but it also provides *immutable*
objects. Immutable objects create copies of objects each time an object is
modified. Because modifier methods around datetimes are not always transparent,
data can be modified accidentally or without the developer knowing.
Immutable objects prevent accidental changes to
data, and make code free of order-based dependency issues. Immutability
does mean that you will need to remember to replace variables when using
modifiers::
// This code doesn't work with immutable objects
$time->addDay(1);
doSomething($time);
return $time;
// This works like you'd expect
$time = $time->addDay(1);
$time = doSomething($time);
return $time;
By capturing the return value of each modification your code will work as
expected. If you ever have an immutable object, and want to create a mutable
one, you can use ``toMutable()``::
$inplace = $time->toMutable();
Date Objects
------------
PHP only provides a single DateTime object. Representing calendar dates can be
a bit awkward with this class as it includes timezones, and time components that
don't really belong in the concept of a 'day'. Chronos provides a ``Date``
object that allows you to represent dates. The time and timezone for these
objects is always fixed to ``00:00:00 UTC`` and all formatting/difference
methods operate at the day resolution::
use Cake\Chronos\Date;
$today = Date::today();
// Changes to the time/timezone are ignored.
$today->modify('+1 hours');
// Outputs '2015-12-20'
echo $today;
Modifier Methods
----------------
Chronos objects provide modifier methods that let you modify the value in
a granular way::
// Set components of the datetime value.
$halloween = Date::create()
->year(2015)
->month(10)
->day(31)
->hour(20)
->minute(30);
You can also modify parts of a date relatively::
$future = Date::create()
->addYear(1)
->subMonth(2)
->addDays(15)
->addHours(20)
->subMinutes(2);
It is also possible to make big jumps to defined points in time::
$time = Chronos::create();
$time->startOfDay();
$time->endOfDay();
$time->startOfMonth();
$time->endOfMonth();
$time->startOfYear();
$time->endOfYear();
$time->startOfWeek();
$time->endOfWeek();
Or jump to specific days of the week::
$time->next(ChronosInterface::TUESDAY);
$time->previous(ChronosInterface::MONDAY);
When modifying dates/times across :abbr:`DST (Daylight Savings Time)` transitions
your operations may gain/lose an additional hours resulting in hour values that
don't add up. You can avoid these issues by first changing your timezone to
``UTC``, modifying the time::
// Additional hour gained.
$time = new Chronos('2014-03-30 00:00:00', 'Europe/London');
debug($time->modify('+24 hours')); // 2014-03-31 01:00:00
// First switch to UTC, and modify
$time = $time->setTimezone('UTC')
->modify('+24 hours');
Once you are done modifying the time you can add the original timezone to get
the localized time.
Comparison Methods
------------------
Once you have 2 instances of Chronos date/time objects you can compare them in
a variety of ways::
// Full suite of comparators exist
// ne, gt, lt, lte.
$first->eq($second);
$first->gte($second);
// See if the current object is between two others.
$now->between($start, $end);
// Find which argument is closest or farthest.
$now->closest($june, $november);
$now->farthest($june, $november);
You can also inquire about where a given value falls on the calendar::
$now->isToday();
$now->isYesterday();
$now->isFuture();
$now->isPast();
// Check the day of the week
$now->isWeekend();
// All other weekday methods exist too.
$now->isMonday();
You can also find out if a value was within a relative time period::
$time->wasWithinLast('3 days');
$time->isWithinNext('3 hours');
Generating Differences
----------------------
In addition to comparing datetimes, calculating differences or deltas between
two values is a common task::
// Get a DateInterval representing the difference
$first->diff($second);
// Get difference as a count of specific units.
$first->diffInHours($second);
$first->diffInDays($second);
$first->diffInWeeks($second);
$first->diffInYears($second);
You can generate human readable differences suitable for use in a feed or
timeline::
// Difference from now.
echo $date->diffForHumans();
// Difference from another point in time.
echo $date->diffForHumans($other); // 1 hour ago;
Formatting Strings
------------------
Chronos provides a number of methods for displaying our outputting datetime
objects::
// Uses the format controlled by setToStringFormat()
echo $date;
// Different standard formats
echo $time->toAtomString(); // 1975-12-25T14:15:16-05:00
echo $time->toCookieString(); // Thursday, 25-Dec-1975 14:15:16 EST
echo $time->toIso8601String(); // 1975-12-25T14:15:16-05:00
echo $time->toRfc822String(); // Thu, 25 Dec 75 14:15:16 -0500
echo $time->toRfc850String(); // Thursday, 25-Dec-75 14:15:16 EST
echo $time->toRfc1036String(); // Thu, 25 Dec 75 14:15:16 -0500
echo $time->toRfc1123String(); // Thu, 25 Dec 1975 14:15:16 -0500
echo $time->toRfc2822String(); // Thu, 25 Dec 1975 14:15:16 -0500
echo $time->toRfc3339String(); // 1975-12-25T14:15:16-05:00
echo $time->toRssString(); // Thu, 25 Dec 1975 14:15:16 -0500
echo $time->toW3cString(); // 1975-12-25T14:15:16-05:00
// Get the quarter/week
echo $time->toQuarter(); // 4
echo $time->toWeek(); // 52
// Generic formatting
echo $time->toTimeString(); // 14:15:16
echo $time->toDateString(); // 1975-12-25
echo $time->toDateTimeString(); // 1975-12-25 14:15:16
echo $time->toFormattedDateString(); // Dec 25, 1975
echo $time->toDayDateTimeString(); // Thu, Dec 25, 1975 2:15 PM
Extracting Date Components
--------------------------
Getting parts of a date object can be done by directly accessing properties::
$time = new Chronos('2015-12-31 23:59:58');
$time->year; // 2015
$time->month; // 12
$time->day; // 31
$time->hour // 23
$time->minute // 59
$time->second // 58
Other properties that can be accessed are:
- timezone
- timezoneName
- micro
- dayOfWeek
- dayOfMonth
- dayOfYear
- daysInMonth
- timestamp
- quarter
Testing Aids
------------
When writing unit tests, it is helpful to fixate the current time. Chronos lets
you fix the current time for each class. As part of your test suite's bootstrap
process you can include the following::
Chronos::setTestNow(Chronos::now());
MutableDateTime::setTestNow(MutableDateTime::now());
Date::setTestNow(Date::now());
MutableDate::setTestNow(MutableDate::now());
This will fix the current time of all objects to be the point at which the test
suite started.
For example, if you fixate the ``Chronos`` to some moment in the past, any new
instance of ``Chronos`` created with ``now`` or a relative time string, will be
returned relative to the fixated time::
Chronos::setTestNow(new Chronos('1975-12-25 00:00:00'));
$time = new Chronos(); // 1975-12-25 00:00:00
$time = new Chronos('1 hour ago'); // 1975-12-24 23:00:00
To reset the fixation, simply call ``setTestNow()`` again with no parameter or
with ``null`` as a parameter.

View File

@@ -0,0 +1,9 @@
import sys, os
# Append the top level directory of the docs, so we can import from the config dir.
sys.path.insert(0, os.path.abspath('..'))
# Pull in all the configuration options defined in the global config file..
from config.all import *
language = 'fr'

View File

@@ -0,0 +1,7 @@
.. toctree::
:maxdepth: 2
:caption: CakePHP Chronos
/index
API <https://api.cakephp.org/chronos>

306
vendor/cakephp/chronos/docs/fr/index.rst vendored Normal file
View File

@@ -0,0 +1,306 @@
Chronos
#######
Chronos fournit une collection d'extensions sans aucune dépendance pour l'objet
``DateTime``. En plus de méthodes pratiques, Chronos fournit:
* Des objets ``Date`` pour représenter les dates du calendrier.
* Des objets immutables pour les dates et les datetimes.
* Un système de traduction intégrable. Seules les traductions anglaises sont
inclues dans la librairie. Cependant, ``cakephp/i18n`` peut être utilisé
pour un support complet d'autres langues.
Installation
------------
Pour installer Chronos, vous devez utiliser ``composer``. A partir du répertoire
ROOT de votre application (où le fichier composer.json se trouve) exécutez ce
qui suit::
php composer.phar require cakephp/chronos "@stable"
Vue d'Ensemble
--------------
Chronos fournit un certain nombre d'extensions pour les objets DateTime fournis
par PHP. Chronos fournit 5 classes qui gèrent les variantes mutables et
immutables de date/time et les extensions de ``DateInterval``.
* ``Cake\Chronos\Chronos`` est un objet de *date et time* immutable.
* ``Cake\Chronos\Date`` est un objet de *date* immutable.
* ``Cake\Chronos\MutableDateTime`` est un objet de *date et time* mutable.
* ``Cake\Chronos\MutableDate`` est un objet de *date* mutable.
* ``Cake\Chronos\ChronosInterval`` est une extension pour l'objet
``DateInterval``.
Enfin si vous voulez typer selon les objets date/time fournis par Chronos,
vous devez utiliser ``Cake\Chronos\ChronosInterface``. Tous les objets date et
time implémentent cette interface.
Créer des Instances
-------------------
Il y a plusieurs façons d'obtenir une instance de Chronos ou de Date. Il y a
un certain nombre de méthodes factory qui fonctionnent avec des ensembles
ayant des arguments différents::
use Cake\Chronos\Chronos;
$now = Chronos::now();
$today = Chronos::today();
$yesterday = Chronos::yesterday();
$tomorrow = Chronos::tomorrow();
// Parse les expressions relatives
$date = Chronos::parse('+2 days, +3 hours');
// Les valeurs d'entier de Date et time.
$date = Chronos::create(2015, 12, 25, 4, 32, 58);
// Les valeurs d'entier pour Date ou time.
$date = Chronos::createFromDate(2015, 12, 25);
$date = Chronos::createFromTime(11, 45, 10);
// Parse les valeurs formatées.
$date = Chronos::createFromFormat('m/d/Y', '06/15/2015');
Travailler avec les Objets Immutables
-------------------------------------
Si vous avez utilisé les objets ``DateTime`` de PHP, vous êtes à l'aise avec
les objets *mutable*. Chronos offre des objets mutables, mais elle fournit
également des objets *immutables*. Les objets Immutables créent des copies des
objets à chaque fois qu'un objet est modifié. Puisque les méthodes de
modification autour des datetimes ne sont pas toujours transparentes, les
données peuvent être modifiées accidentellement ou sans que le développeur ne
le sache. Les objets immutables évitent les changements accidentels des
données et permettent de s'affranchir de tout problème lié à l'ordre d'appel
des fonctions ou des dépendances. L'immutabilité signifie que vous devez vous
souvenir de remplacer les variables quand vous utilisez les modificateurs::
// Ce code ne fonctionne pas avec les objets immutables
$time->addDay(1);
doSomething($time);
return $time;
// Ceci fonctionne comme vous le souhaitez
$time = $time->addDay(1);
$time = doSomething($time);
return $time;
En capturant la valeur de retour pour chaque modification, votre code
fonctionnera comme souhaité. Si vous avez déjà créé un objet immutable, et que
vous souhaitez un objet mutable, vous pouvez utiliser ``toMutable()``::
$inplace = $time->toMutable();
Objets Date
-----------
PHP fournit seulement un unique objet DateTime. Représenter les dates de
calendrier peut être un peu gênant avec cette classe puisqu'elle inclut les
timezones, et les composants de time qui n'appartiennent pas vraiment
dans le concept d'un 'jour'. Chronos fournit un objet ``Date`` qui vous permet
de représenter les dates. Les time et timezone pour ces objets sont toujours
fixés à ``00:00:00 UTC`` et toutes les méthodes de formatage/différence
fonctionnent au niveau du jour::
use Cake\Chronos\Date;
$today = Date::today();
// Changements selon le time/timezone sont ignorés.
$today->modify('+1 hours');
// Affiche '2015-12-20'
echo $today;
Méthodes de Modification
------------------------
Les objets Chronos fournissent des méthodes de modification qui vous laissent
modifier la valeur d'une façon assez précise::
// Définit les composants de la valeur du datetime.
$halloween = Date::create()
->year(2015)
->month(10)
->day(31)
->hour(20)
->minute(30);
Vous pouvez aussi modifier les parties de la date de façon relative::
$future = Date::create()
->addYear(1)
->subMonth(2)
->addDays(15)
->addHours(20)
->subMinutes(2);
Il est également possible de faire des sauts vers des points définis dans le
temps::
$time = Chronos::create();
$time->startOfDay();
$time->endOfDay();
$time->startOfMonth();
$time->endOfMonth();
$time->startOfYear();
$time->endOfYear();
$time->startOfWeek();
$time->endOfWeek();
Ou de sauter à un jour spécifique de la semaine::
$time->next(ChronosInterface::TUESDAY);
$time->previous(ChronosInterface::MONDAY);
Méthodes de Comparaison
-----------------------
Une fois que vous avez 2 instances d'objets date/time de Chronos, vous pouvez
les comparer de plusieurs façons::
// Suite complète de comparateurs existante
// ne, gt, lt, lte.
$first->eq($second);
$first->gte($second);
// Regardez si l'objet courant est entre deux autres.
$now->between($start, $end);
// Trouver l'argument le plus proche ou le plus éloigné.
$now->closest($june, $november);
$now->farthest($june, $november);
Vous pouvez aussi vous renseigner sur le moment où une valeur donnée tombe dans
le calendrier::
$now->isToday();
$now->isYesterday();
$now->isFuture();
$now->isPast();
// Vérifie le jour de la semaine
$now->isWeekend();
// Toutes les autres méthodes des jours de la semaine existent aussi.
$now->isMonday();
Vous pouvez aussi trouver si une valeur était dans une période de temps relative::
$time->wasWithinLast('3 days');
$time->isWithinNext('3 hours');
Générer des Différences
-----------------------
En plus de comparer les datetimes, calculer les différences ou les deltas entre
des valeurs est une tâche courante::
// Récupère un DateInterval représentant la différence
$first->diff($second);
// Récupère la différence en tant que nombre d'unités spécifiques.
$first->diffInHours($second);
$first->diffInDays($second);
$first->diffInWeeks($second);
$first->diffInYears($second);
Vous pouvez générer des différences lisibles qui peuvent vous servir pour
l'utilisation d'un feed ou d'une timeline::
// Différence à partir de maintenant.
echo $date->diffForHumans();
// Différence à partir d'un autre point du temps.
echo $date->diffForHumans($other); // 1 hour ago;
Formater les Chaînes
--------------------
Chronos fournit un certain nombre de méthodes pour afficher nos sorties d'objets
datetime::
// Utilise le format contrôlé par setToStringFormat()
echo $date;
// Différents formats standards
echo $time->toAtomString(); // 1975-12-25T14:15:16-05:00
echo $time->toCookieString(); // Thursday, 25-Dec-1975 14:15:16 EST
echo $time->toIso8601String(); // 1975-12-25T14:15:16-05:00
echo $time->toRfc822String(); // Thu, 25 Dec 75 14:15:16 -0500
echo $time->toRfc850String(); // Thursday, 25-Dec-75 14:15:16 EST
echo $time->toRfc1036String(); // Thu, 25 Dec 75 14:15:16 -0500
echo $time->toRfc1123String(); // Thu, 25 Dec 1975 14:15:16 -0500
echo $time->toRfc2822String(); // Thu, 25 Dec 1975 14:15:16 -0500
echo $time->toRfc3339String(); // 1975-12-25T14:15:16-05:00
echo $time->toRssString(); // Thu, 25 Dec 1975 14:15:16 -0500
echo $time->toW3cString(); // 1975-12-25T14:15:16-05:00
// Récupère le trimestre
echo $time->toQuarter(); // 4;
// Récupère la semaine
echo $time->toWeek(); // 52;
// Formatage générique
echo $time->toTimeString(); // 14:15:16
echo $time->toDateString(); // 1975-12-25
echo $time->toDateTimeString(); // 1975-12-25 14:15:16
echo $time->toFormattedDateString(); // Dec 25, 1975
echo $time->toDayDateTimeString(); // Thu, Dec 25, 1975 2:15 PM
Extraire des Fragments de Date
------------------------------
Il est possible de récupérer des parties d'un objet date en accédant directement
à ses propriétés::
$time = new Chronos('2015-12-31 23:59:58');
$time->year; // 2015
$time->month; // 12
$time->day; // 31
$time->hour // 23
$time->minute // 59
$time->second // 58
Les autres propriétés accessibles sont:
- timezone
- timezoneName
- micro
- dayOfWeek
- dayOfMonth
- dayOfYear
- daysInMonth
- timestamp
- quarter
Aides aux Tests
---------------
Quand vous écrivez des tests unitaires, il peut être utile de fixer le *time*
courant. Chronos vous permet de fixer le time courant pour chaque classe.
Pour l'intégrer dans votre processus de démarrage (bootstrap) de suite de tests,
vous pouvez inclure ce qui suit::
Chronos::setTestNow(Chronos::now());
MutableDateTime::setTestNow(MutableDateTime::now());
Date::setTestNow(Date::now());
MutableDate::setTestNow(MutableDate::now());
Ceci va fixer le time courant de tous les objets selon le moment où la suite de
tests a démarré.
Par exemple, si vous fixez le ``Chronos`` à un moment du passé, chaque nouvelle
instance de ``Chronos`` créée avec ``now`` ou une chaine de temps relative, sera
retournée relativement à la date fixée::
Chronos::setTestNow(new Chronos('1975-12-25 00:00:00'));
$time = new Chronos(); // 1975-12-25 00:00:00
$time = new Chronos('1 hour ago'); // 1975-12-24 23:00:00
Pour réinitialiser la "fixation" du temps, appelez simplement ``setTestNow()``
sans paramètre ou avec ``null`` comme paramètre.

View File

@@ -0,0 +1,9 @@
import sys, os
# Append the top level directory of the docs, so we can import from the config dir.
sys.path.insert(0, os.path.abspath('..'))
# Pull in all the configuration options defined in the global config file..
from config.all import *
language = 'ja'

View File

@@ -0,0 +1,7 @@
.. toctree::
:maxdepth: 2
:caption: CakePHP Chronos
/index
API <https://api.cakephp.org/chronos>

304
vendor/cakephp/chronos/docs/ja/index.rst vendored Normal file
View File

@@ -0,0 +1,304 @@
Chronos
#######
Chronos (クロノス) は、 ``DateTime`` オブジェクトへの拡張の依存関係の無いコレクションを提供します。
便利なメソッドに加えて、Chronos は以下を提供します。
* カレンダー日付のための ``Date`` オブジェクト
* イミュータブルな日付と日時オブジェクト
* プラグインのような翻訳システム。ライブラリーは英語のみの翻訳を含んでいます。
しかし、全ての言語サポートのために、 ``cakephp/i18n`` を使うことができます。
インストール
------------
Chronos をインストールするためには、 ``composer`` を利用することができます。
アプリケーションの ROOT ディレクトリーcomposer.json ファイルのある場所)
で以下のように実行します。 ::
php composer.phar require cakephp/chronos "@stable"
概要
----
Chronos は PHP が提供する DateTime オブジェクトのいくつかの拡張を提供します。
Chronos は ``DateInterval`` の拡張機能および、ミュータブル(変更可能)と
イミュータブル(変更不可)な 日付/時刻 の派生系をカバーする5つのクラスを提供します。
* ``Cake\Chronos\Chronos`` はイミュータブルな *日付と時刻* オブジェクト。
* ``Cake\Chronos\Date`` はイミュータブルな *日付* オブジェクト。
* ``Cake\Chronos\MutableDateTime`` はミュータブルな *日付と時刻* オブジェクト。
* ``Cake\Chronos\MutableDate`` はミュータブルな *日付* オブジェクト。
* ``Cake\Chronos\ChronosInterval````DateInterval`` の拡張機能。
最後に、もしあなたが Chronos が提供する 日付/時刻 のオブジェクトに対して型宣言を行ないたい場合、
``Cake\Chronos\ChronosInterface`` を使用することができます。
全ての日付と時間のオブジェクトはこのインターフェイスを実装しています。
インスタンスの作成
------------------
Chronos または Date のインスタンスを取得するためには、多くの方法があります。
異なる引数セットで動作する多くのファクトリーメソッドがあります。 ::
use Cake\Chronos\Chronos;
$now = Chronos::now();
$today = Chronos::today();
$yesterday = Chronos::yesterday();
$tomorrow = Chronos::tomorrow();
// 相対式のパース
$date = Chronos::parse('+2 days, +3 hours');
// 日付と時間の整数値
$date = Chronos::create(2015, 12, 25, 4, 32, 58);
// 日付または時間の整数値
$date = Chronos::createFromDate(2015, 12, 25);
$date = Chronos::createFromTime(11, 45, 10);
// 整形した値にパース
$date = Chronos::createFromFormat('m/d/Y', '06/15/2015');
イミュータブルオブジェクトの動作
--------------------------------
もしあなたが、PHP の ``DateTime`` オブジェクトを使用したことがあるなら、
*ミュータブル* オブジェクトは簡単に使用できます。
Chronos はミュータブルオブジェクトを提供しますが、これは *イミュータブル* オブジェクトにもなります。
イミュータブルオブジェクトはオブジェクトが変更されるたびにオブジェクトのコピーを作ります。
なぜなら、日時周りの変更メソッドは必ずしも透明でないため、データが誤って、
または開発者が知らない内に変更してしまうからです。
イミュータブルオブジェクトはデータが誤って変更されることを防止し、
順序ベースの依存関係の問題の無いコードを作ります。
不変性は、変更時に忘れずに変数を置き換える必要があることを意味しています。 ::
// このコードはイミュータブルオブジェクトでは動作しません
$time->addDay(1);
doSomething($time);
return $time
// このコードは期待通りに動作します
$time = $time->addDay(1);
$time = doSomething($time);
return $time
各修正の戻り値をキャプチャーすることによって、コードは期待通りに動作します。
イミュータブルオブジェクトを持っていて、ミュータブルオブジェクトを作りたい場合、
``toMutable()`` が使用できます。 ::
$inplace = $time->toMutable();
日付オブジェクト
------------------
PHP は単純な DateTime オブジェクトだけを提供します。このクラスのカレンダー日付の表現で、
タイムゾーンおよび、本当に「日」の概念に属していないタイムコンポーネントを含むと、
少し厄介な可能性があります。
Chronos は日時表現のための ``Date`` オブジェクトを提供します。
これらのオブジェクトの時間とタイムゾーンは常に ``00:00:00 UTC`` に固定されており、
全ての書式/差分のメソッドは一日単位で動作します。 ::
use Cake\Chronos\Date;
$today = Date::today();
// 時間/タイムゾーンの変更は無視されます
$today->modify('+1 hours');
// 出力 '2015-12-20'
echo $today;
変更メソッド
------------
Chronos オブジェクトは細やかに値を変更できるメソッドを提供します。 ::
// 日時の値のコンポーネントを設定
$halloween = Date::create()
->year(2015)
->month(10)
->day(31)
->hour(20)
->minute(30);
また、日付部分を相対日付に変更することもできます。 ::
$future = Date::create()
->addYear(1)
->subMonth(2)
->addDays(15)
->addHours(20)
->subMinutes(2);
また、ある時間の中で、定義された時点に飛ぶことも可能です。 ::
$time = Chronos::create();
$time->startOfDay();
$time->endOfDay();
$time->startOfMonth();
$time->endOfMonth();
$time->startOfYear();
$time->endOfYear();
$time->startOfWeek();
$time->endOfWeek();
また、1週間中の特定の日にも飛べます。 ::
$time->next(ChronosInterface::TUESDAY);
$time->previous(ChronosInterface::MONDAY);
:abbr:`DST (夏時間)` の遷移の前後で日付/時間を変更すると、
あなたの操作で時間が増減するかもしれませんが、その結果、意図しない時間の値になります。
これらの問題を回避するには、最初にタイムゾーンを ``UTC`` に変更し、時間を変更します。 ::
// 余分な時間が追加されました
$time = new Chronos('2014-03-30 00:00:00', 'Europe/London');
debug($time->modify('+24 hours')); // 2014-03-31 01:00:00
// 最初に UTC に切り替え、そして更新
$time = $time->setTimezone('UTC')
->modify('+24 hours');
時間を変更すると、元のタイムゾーンを追加してローカライズされた時間を取得することができます。
比較メソッド
------------
Chronos の日付/時間オブジェクトの2つのインスタンスを様々な方法で比較することができます。 ::
// 比較のフルセットが存在します
// ne, gt, lt, lte.
$first->eq($second);
$first->gte($second);
// カレントオブジェクトが2つのオブジェクトの間にあるかどうかを確認します。
$now->between($start, $end);
// どちらの引数が最も近い (closest) か、または最も遠い (farthest) かを見つけます。
$now->closest($june, $november);
$now->farthest($june, $november);
また、与えられた値のカレンダーに当たる場所について問い合わせできます。 ::
$now->isToday();
$now->isYesterday();
$now->isFuture();
$now->isPast();
// 曜日をチェック
$now->isWeekend();
// 他の曜日のメソッドも全て存在します。
$now->isMonday();
また、値が相対的な期間内にあったかどうかを見つけることができます。 ::
$time->wasWithinLast('3 days');
$time->isWithinNext('3 hours');
差の生成
--------
日時比較に加えて、2つの値の差や変化の計算は一般的なタスクです。 ::
// 差をあらわす DateInterval を取得
$first->diff($second);
// 特定の単位での差を取得
$first->diffInHours($second);
$first->diffInDays($second);
$first->diffInWeeks($second);
$first->diffInYears($second);
フィードやタイムラインで使用するのに適した、人が読める形式の差を生成することができます。 ::
// 現在からの差
echo $date->diffForHumans();
// 別の時点からの差
echo $date->diffForHumans($other); // 1時間前;
フォーマットの設定
------------------
Chronos は、出力した日時オブジェクトを表示するための多くのメソッドを提供します。 ::
// setToStringFormat() が制御するフォーマットを使用します
echo $date;
// 別の標準フォーマット
echo $time->toAtomString(); // 1975-12-25T14:15:16-05:00
echo $time->toCookieString(); // Thursday, 25-Dec-1975 14:15:16 EST
echo $time->toIso8601String(); // 1975-12-25T14:15:16-05:00
echo $time->toRfc822String(); // Thu, 25 Dec 75 14:15:16 -0500
echo $time->toRfc850String(); // Thursday, 25-Dec-75 14:15:16 EST
echo $time->toRfc1036String(); // Thu, 25 Dec 75 14:15:16 -0500
echo $time->toRfc1123String(); // Thu, 25 Dec 1975 14:15:16 -0500
echo $time->toRfc2822String(); // Thu, 25 Dec 1975 14:15:16 -0500
echo $time->toRfc3339String(); // 1975-12-25T14:15:16-05:00
echo $time->toRssString(); // Thu, 25 Dec 1975 14:15:16 -0500
echo $time->toW3cString(); // 1975-12-25T14:15:16-05:00
// クォーター/週数を取得
echo $time->toQuarter(); // 4;
echo $time->toWeek(); // 52
// 一般的なフォーマット
echo $time->toTimeString(); // 14:15:16
echo $time->toDateString(); // 1975-12-25
echo $time->toDateTimeString(); // 1975-12-25 14:15:16
echo $time->toFormattedDateString(); // Dec 25, 1975
echo $time->toDayDateTimeString(); // Thu, Dec 25, 1975 2:15 PM
日付要素の抽出
--------------
日付オブジェクトのプロパティーに直接アクセスして要素を取得することができます。 ::
$time = new Chronos('2015-12-31 23:59:58');
$time->year; // 2015
$time->month; // 12
$time->day; // 31
$time->hour // 23
$time->minute // 59
$time->second // 58
以下のプロパティーにもアクセスできます。 :
- timezone
- timezoneName
- micro
- dayOfWeek
- dayOfMonth
- dayOfYear
- daysInMonth
- timestamp
- quarter
テストの支援
------------
単体テストを書いている時、現在時刻を固定すると便利です。Chronos は、
各クラスの現在時刻を修正することができます。
テストスイートの bootstrap 処理に以下を含めることができます。 ::
Chronos::setTestNow(Chronos::now());
MutableDateTime::setTestNow(MutableDateTime::now());
Date::setTestNow(Date::now());
MutableDate::setTestNow(MutableDate::now());
これでテストスイートが開始された時点で全てのオブジェクトの現在時刻を修正します。
例えば、 ``Chronos`` を過去のある瞬間に固定した場合、新たな ``Chronos``
のインスタンスが生成する ``now`` または相対時刻の文字列は、
固定された時刻の相対を返却します。 ::
Chronos::setTestNow(new Chronos('1975-12-25 00:00:00'));
$time = new Chronos(); // 1975-12-25 00:00:00
$time = new Chronos('1 hour ago'); // 1975-12-24 23:00:00
固定をリセットするには、 ``setTestNow()`` をパラメーター無し、または ``null`` を設定して
再び呼び出してください。

View File

@@ -0,0 +1,9 @@
import sys, os
# Append the top level directory of the docs, so we can import from the config dir.
sys.path.insert(0, os.path.abspath('..'))
# Pull in all the configuration options defined in the global config file..
from config.all import *
language = 'pt'

View File

@@ -0,0 +1,7 @@
.. toctree::
:maxdepth: 2
:caption: CakePHP Chronos
/index
API <https://api.cakephp.org/chronos>

285
vendor/cakephp/chronos/docs/pt/index.rst vendored Normal file
View File

@@ -0,0 +1,285 @@
Chronos
#######
O Chronos oferece uma coleção independente de extensões para lidar com o objeto
``DateTime``. Além de métodos de conveniência, o Chronos oferece:
* Objetos ``Date`` para representar datas de calendário.
* Objetos *date* e *datetime* imutáveis.
* Um sistema de tradução acoplável. Apenas traduções em inglês estão incluídas
na biblioteca. Todavia, ``cakephp/i18n`` pode ser usado para suporte completo
a idiomas.
Instalação
----------
Para instalar o Chronos, você deve usar o ``composer``. A partir do diretório
*ROOT* de sua aplicação (local onde o arquivo composer.json está localizado)
execute o seguinte comando::
php composer.phar require cakephp/chronos "@stable"
Visão geral
-----------
Chronos oferece extensões para lidar com objetos *DateTime* do PHP. 5 classes
cobrem variantes de data/hora mutáveis e imutáveis e uma extensão do objeto
``DateInterval``.
* ``Cake\Chronos\Chronos`` é um objeto *date & time* imutável.
* ``Cake\Chronos\Date`` é um objeto *date* imutável.
* ``Cake\Chronos\MutableDateTime`` é um objeto *date and time* mutável.
* ``Cake\Chronos\MutableDate`` é um objeto *date* mutável.
* ``Cake\Chronos\ChronosInterval`` é uma extensão do objeto ``DateInterval``.
Por último, se você quiser usar o *typehint* em objetos do Chronos, será preciso
usar a interface ``Cake\Chronos\ChronosInterface``. Todos os objetos de data e
hora implementam essa interface.
Criando instâncias
------------------
Existem várias maneiras de criar instâncias do Chronos ou mesmo, do objeto Date.
Um número considerável de métodos padrão que funcionam com conjuntos diferentes
de argumentos::
use Cake\Chronos\Chronos;
$now = Chronos::now();
$today = Chronos::today();
$yesterday = Chronos::yesterday();
$tomorrow = Chronos::tomorrow();
// Interpreta expressões relativas.
$date = Chronos::parse('+2 days, +3 hours');
// Valores inteiros de Date e Time.
$date = Chronos::create(2015, 12, 25, 4, 32, 58);
// Valores inteiros de Date ou Time.
$date = Chronos::createFromDate(2015, 12, 25);
$date = Chronos::createFromTime(11, 45, 10);
// Interpreta valores formatados.
$date = Chronos::createFromFormat('m/d/Y', '06/15/2015');
Trabalhando com objetos imutáveis
---------------------------------
Se você é familiarizado com os objetos ``DateTime`` do PHP, você se sentirá
confortável com objetos *mutáveis*. Além de objetos mutáveis o Chronos também
oferece objetos imutáveis que por sua vez criam cópias de objetos toda vez que
um objeto é modificado. Devido ao fato de que metodos modificadores relativos
a data e hora nem sempre serem transparentes, informações podem ser modificadas
acidentalmente ou sem que o desenvolvedor saiba. Objetos imutáveis previnem
essas alterações acidentais nos dados. Imutabilidade significa que você deverá
lembrar de substituir variáveis usando modificadores::
// Esse código não funciona com objetos imutáveis
$time->addDay(1);
doSomething($time);
return $time;
// Esse funciona como o esperado
$time = $time->addDay(1);
$time = doSomething($time);
return $time;
Ao capturar o valor de retorno de cada modificação, seu código funcionará como o
esperado. Se você tem um objeto imutável e quer criar um mutável a partir do
mesmo, use ``toMutable()``::
$inplace = $time->toMutable();
Objetos Date
------------
O PHP disponibiliza um único objeto DateTime. Representar datas de calendário
pode ser um pouco desconfortável por essa classe, uma vez que ela inclui
*timezones* e componentes de hora que realmente não se encaixam no conceito de
'dia'. O Chronos oferece um objeto ``Date`` para representar datas. A hora e a
zona desse objeto é sempre fixado em ``00:00:00 UTC`` e todos os métodos de
formatação/diferença operam sob a resolução de dia::
use Cake\Chronos\Date;
$today = Date::today();
// Mudanças na hora/timezone são ignoradas
$today->modify('+1 hours');
// Exibe '2016-08-15'
echo $today;
Métodos modificadores
---------------------
Objetos Chronos disponibilizam métodos que permitem a modificação de valores de
forma granular::
// Define componentes do valor datetime
$halloween = Date::create()
->year(2015)
->month(10)
->day(31)
->hour(20)
->minute(30);
Você também pode modificar partes da data relativamente::
$future = Date::create()
->addYear(1)
->subMonth(2)
->addDays(15)
->addHours(20)
->subMinutes(2);
Também é possível realizar grandes saltos para períodos definidos no tempo::
$time = Chronos::create();
$time->startOfDay();
$time->startOfMonth();
$time->endOfMonth();
$time->endOfYear();
$time->startOfWeek();
$time->endOfWeek();
Ou ainda para dias específicos da semana::
$time->next(ChronosInterface::TUESDAY);
$time->previous(ChronosInterface::MONDAY);
Métodos de comparação
---------------------
Uma vez que você possui 2 instâncias de objetos data/hora do Chronos, é possível
compará-los de várias maneiras::
// Coleção completa de comparadores
// ne, gt, lt, lte.
$first->eq($second);
$first->gte($second);
// Veja se o objeto atual está entre outros
$now->between($start, $end);
// Encontre qual argumento está mais perto ou mais longe
$now->closest($june, $november);
$now->farthest($june, $november);
Você também pode arguir sobre quando um determinado valor cai no calendário::
$now->isToday();
$now->isYesterday();
$now->isFuture();
$now->isPast();
// Verifica se o dia é no final de semana
$now->isWeekend();
// Todos os métodos para outros dias da semana existem também
$now->isMonday();
Você também pode verificar se um determinado valor está dentro de um período de
tempo relativo::
$time->wasWithinLast('3 days');
$time->isWithinNext('3 hours');
Gerando diferenças
------------------
Em adição à comparação de *datetimes*, calcular diferenças ou deltas entre
valores é uma tarefa simples::
// Recebe um DateInterval representando a diferença
$first->diff($second);
// Recebe a diferença como um contador de unidades específicas
$first->diffInHours($second);
$first->diffInDays($second);
$first->diffInWeeks($second);
$first->diffInYears($second);
Você pode gerar diferenças de fácil leitura para humanos para usar em um *feed*
ou *timeline*::
// Diferença em relação ao momento atual
echo $date->diffForHumans();
// Diferença em relação a outro período no tempo
echo $date->diffForHumans($other); // 1 hora atrás;
Formatando strings
------------------
O Chronos disponibiliza métodos para exibir nossos objetos *datetime*::
// Usa o formato controlado por setToStringFormat()
echo $date;
// Diferentes padrões de formato
echo $time->toAtomString(); // 1975-12-25T14:15:16-05:00
echo $time->toCookieString(); // Thursday, 25-Dec-1975 14:15:16 EST
echo $time->toIso8601String(); // 1975-12-25T14:15:16-05:00
echo $time->toRfc822String(); // Thu, 25 Dec 75 14:15:16 -0500
echo $time->toRfc850String(); // Thursday, 25-Dec-75 14:15:16 EST
echo $time->toRfc1036String(); // Thu, 25 Dec 75 14:15:16 -0500
echo $time->toRfc1123String(); // Thu, 25 Dec 1975 14:15:16 -0500
echo $time->toRfc2822String(); // Thu, 25 Dec 1975 14:15:16 -0500
echo $time->toRfc3339String(); // 1975-12-25T14:15:16-05:00
echo $time->toRssString(); // Thu, 25 Dec 1975 14:15:16 -0500
echo $time->toW3cString(); // 1975-12-25T14:15:16-05:00
// Recebe o trimestre
echo $time->toQuarter(); // 4;
Extraindo componentes de data
-----------------------------
Podemos receber partes de um objeto *date* acessando propriedades::
$time = new Chronos('2015-12-31 23:59:58');
$time->year; // 2015
$time->month; // 12
$time->day; // 31
$time->hour // 23
$time->minute // 59
$time->second // 58
Outras propriedades que podem ser acessadas são:
- timezone
- timezoneName
- micro
- dayOfWeek
- dayOfMonth
- dayOfYear
- daysInMonth
- timestamp
- quarter
Auxílio para testes
-------------------
Ao escrever testes unitários, fixar a hora atual é bastante útil. O Chronos
lhe permite fixar a hora atual para cada classe. Como parte das suas ferramentas
de testes, você pode incluir o seguinte::
Chronos::setTestNow(Chronos::now());
MutableDateTime::setTestNow(MutableDateTime::now());
Date::setTestNow(Date::now());
MutableDate::setTestNow(MutableDate::now());
Isso irá corrigir a hora atual de todos os objetos para o momento em que o
processo de testes foi iniciado.
Por exemplo, se você fixar o ``Chronos`` em algum momento no passado, qualquer
nova instância do ``Chronos`` criada com ``now`` ou uma *string* de tempo
relativa, teremos um retorno referente ao tempo fixado::
Chronos::setTestNow(new Chronos('1975-12-25 00:00:00'));
$time = new Chronos(); // 1975-12-25 00:00:00
$time = new Chronos('1 hour ago'); // 1975-12-24 23:00:00

212
vendor/cakephp/chronos/src/Chronos.php vendored Normal file
View File

@@ -0,0 +1,212 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos;
use DateTimeImmutable;
use DateTimeZone;
/**
* An Immutable extension on the native DateTime object.
*
* Adds a number of convenience APIs methods and the ability
* to easily convert into a mutable object.
*
* @property-read int $year
* @property-read int $yearIso
* @property-read int $month
* @property-read int $day
* @property-read int $hour
* @property-read int $minute
* @property-read int $second
* @property-read int $timestamp seconds since the Unix Epoch
* @property-read DateTimeZone $timezone the current timezone
* @property-read DateTimeZone $tz alias of timezone
* @property-read int $micro
* @property-read int $dayOfWeek 1 (for Monday) through 7 (for Sunday)
* @property-read int $dayOfYear 0 through 365
* @property-read int $weekOfMonth 1 through 5
* @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday
* @property-read int $daysInMonth number of days in the given month
* @property-read int $age does a diffInYears() with default parameters
* @property-read int $quarter the quarter of this instance, 1 - 4
* @property-read int $offset the timezone offset in seconds from UTC
* @property-read int $offsetHours the timezone offset in hours from UTC
* @property-read bool $dst daylight savings time indicator, true if DST, false otherwise
* @property-read bool $local checks if the timezone is local, true if local, false otherwise
* @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise
* @property-read string $timezoneName
* @property-read string $tzName
*/
class Chronos extends DateTimeImmutable implements ChronosInterface
{
use Traits\ComparisonTrait;
use Traits\DifferenceTrait;
use Traits\FactoryTrait;
use Traits\FormattingTrait;
use Traits\MagicPropertyTrait;
use Traits\ModifierTrait;
use Traits\RelativeKeywordTrait;
use Traits\TimezoneTrait;
/**
* A test ChronosInterface instance to be returned when now instances are created
*
* There is a single test now for all date/time classes provided by Chronos.
* This aims to emulate stubbing out 'now' which is a single global fact.
*
* @var \Cake\Chronos\ChronosInterface
*/
protected static $testNow;
/**
* Format to use for __toString method when type juggling occurs.
*
* @var string
*/
protected static $toStringFormat = ChronosInterface::DEFAULT_TO_STRING_FORMAT;
/**
* Create a new Chronos instance.
*
* Please see the testing aids section (specifically static::setTestNow())
* for more on the possibility of this constructor returning a test instance.
*
* @param string|null $time Fixed or relative time
* @param \DateTimeZone|string|null $tz The timezone for the instance
*/
public function __construct($time = 'now', $tz = null)
{
if ($tz !== null) {
$tz = $tz instanceof DateTimeZone ? $tz : new DateTimeZone($tz);
}
static::$_lastErrors = [];
$testNow = static::getTestNow();
if ($testNow === null) {
parent::__construct($time === null ? 'now' : $time, $tz);
return;
}
$relative = static::hasRelativeKeywords($time);
if (!empty($time) && $time !== 'now' && !$relative) {
parent::__construct($time, $tz);
return;
}
$testNow = clone $testNow;
if ($relative) {
$testNow = $testNow->modify($time);
}
$relativetime = static::isTimeExpression($time);
if (!$relativetime && $tz !== $testNow->getTimezone()) {
$testNow = $testNow->setTimezone($tz === null ? date_default_timezone_get() : $tz);
}
$time = $testNow->format('Y-m-d H:i:s.u');
parent::__construct($time, $tz);
}
/**
* Create a new mutable instance from current immutable instance.
*
* @return \Cake\Chronos\MutableDateTime
*/
public function toMutable()
{
return MutableDateTime::instance($this);
}
/**
* Get a copy of the instance
*
* @return $this
*/
public function copy()
{
return $this;
}
/**
* Set a ChronosInterface instance (real or mock) to be returned when a "now"
* instance is created. The provided instance will be returned
* specifically under the following conditions:
* - A call to the static now() method, ex. ChronosInterface::now()
* - When a null (or blank string) is passed to the constructor or parse(), ex. new Chronos(null)
* - When the string "now" is passed to the constructor or parse(), ex. new Chronos('now')
* - When a string containing the desired time is passed to ChronosInterface::parse()
*
* Note the timezone parameter was left out of the examples above and
* has no affect as the mock value will be returned regardless of its value.
*
* To clear the test instance call this method using the default
* parameter of null.
*
* @param \Cake\Chronos\ChronosInterface|string|null $testNow The instance to use for all future instances.
* @return void
*/
public static function setTestNow($testNow = null)
{
static::$testNow = is_string($testNow) ? static::parse($testNow) : $testNow;
}
/**
* Get the ChronosInterface instance (real or mock) to be returned when a "now"
* instance is created.
*
* @return \Cake\Chronos\ChronosInterface The current instance used for testing
*/
public static function getTestNow()
{
return static::$testNow;
}
/**
* Determine if there is a valid test instance set. A valid test instance
* is anything that is not null.
*
* @return bool True if there is a test instance, otherwise false
*/
public static function hasTestNow()
{
return static::$testNow !== null;
}
/**
* Return properties for debugging.
*
* @return array
*/
public function __debugInfo()
{
// Conditionally add properties if state exists to avoid
// errors when using a debugger.
$vars = get_object_vars($this);
$properties = [
'hasFixedNow' => static::hasTestNow(),
];
if (isset($vars['date'])) {
$properties['time'] = $this->format('Y-m-d H:i:s.u');
}
if (isset($vars['timezone'])) {
$properties['timezone'] = $this->getTimezone()->getName();
}
return $properties;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,526 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos;
use DateInterval;
use InvalidArgumentException;
/**
* A simple API extension for DateInterval.
* The implementation provides helpers to handle weeks but only days are saved.
* Weeks are calculated based on the total days of the current instance.
*
* @property int $years Total years of the current interval.
* @property int $months Total months of the current interval.
* @property int $weeks Total weeks of the current interval calculated from the days.
* @property int $dayz Total days of the current interval (weeks * 7 + days).
* @property int $hours Total hours of the current interval.
* @property int $minutes Total minutes of the current interval.
* @property int $seconds Total seconds of the current interval.
*
* @property-read int $dayzExcludeWeeks Total days remaining in the final week of the current instance (days % 7).
* @property-read int $daysExcludeWeeks alias of dayzExcludeWeeks
*
* @method static ChronosInterval years($years = 1) Create instance specifying a number of years.
* @method static ChronosInterval year($years = 1) Alias for years
* @method static ChronosInterval months($months = 1) Create instance specifying a number of months.
* @method static ChronosInterval month($months = 1) Alias for months
* @method static ChronosInterval weeks($weeks = 1) Create instance specifying a number of weeks.
* @method static ChronosInterval week($weeks = 1) Alias for weeks
* @method static ChronosInterval days($days = 1) Create instance specifying a number of days.
* @method static ChronosInterval dayz($days = 1) Alias for days
* @method static ChronosInterval day($days = 1) Alias for days
* @method static ChronosInterval hours($hours = 1) Create instance specifying a number of hours.
* @method static ChronosInterval hour($hours = 1) Alias for hours
* @method static ChronosInterval minutes($minutes = 1) Create instance specifying a number of minutes.
* @method static ChronosInterval minute($minutes = 1) Alias for minutes
* @method static ChronosInterval seconds($seconds = 1) Create instance specifying a number of seconds.
* @method static ChronosInterval second($seconds = 1) Alias for seconds
*
* @method ChronosInterval years() years($years = 1) Set the years portion of the current interval.
* @method ChronosInterval year() year($years = 1) Alias for years.
* @method ChronosInterval months() months($months = 1) Set the months portion of the current interval.
* @method ChronosInterval month() month($months = 1) Alias for months.
* @method ChronosInterval weeks() weeks($weeks = 1) Set the weeks portion of the current interval. Will overwrite dayz value.
* @method ChronosInterval week() week($weeks = 1) Alias for weeks.
* @method ChronosInterval days() days($days = 1) Set the days portion of the current interval.
* @method ChronosInterval dayz() dayz($days = 1) Alias for days.
* @method ChronosInterval day() day($days = 1) Alias for days.
* @method ChronosInterval hours() hours($hours = 1) Set the hours portion of the current interval.
* @method ChronosInterval hour() hour($hours = 1) Alias for hours.
* @method ChronosInterval minutes() minutes($minutes = 1) Set the minutes portion of the current interval.
* @method ChronosInterval minute() minute($minutes = 1) Alias for minutes.
* @method ChronosInterval seconds() seconds($seconds = 1) Set the seconds portion of the current interval.
* @method ChronosInterval second() second($seconds = 1) Alias for seconds.
*/
class ChronosInterval extends DateInterval
{
/**
* Interval spec period designators
*/
const PERIOD_PREFIX = 'P';
const PERIOD_YEARS = 'Y';
const PERIOD_MONTHS = 'M';
const PERIOD_DAYS = 'D';
const PERIOD_TIME_PREFIX = 'T';
const PERIOD_HOURS = 'H';
const PERIOD_MINUTES = 'M';
const PERIOD_SECONDS = 'S';
/**
* Before PHP 5.4.20/5.5.4 instead of `false` days will be set to -99999 when the interval instance
* was created by DateTime:diff().
*/
const PHP_DAYS_FALSE = -99999;
/**
* Whether or not this object was created in HHVM
*
* @var bool
*/
protected $isHHVM = false;
/**
* Determine if the interval was created via DateTime:diff() or not.
*
* @param \DateInterval $interval The interval to check.
* @return bool
*/
protected static function wasCreatedFromDiff(DateInterval $interval)
{
return ($interval->days !== false && $interval->days !== static::PHP_DAYS_FALSE);
}
/**
* Create a new ChronosInterval instance.
*
* @param int|null $years The year to use.
* @param int|null $months The month to use.
* @param int|null $weeks The week to use.
* @param int|null $days The day to use.
* @param int|null $hours The hours to use.
* @param int|null $minutes The minutes to use.
* @param int|null $seconds The seconds to use.
*/
public function __construct($years = 1, $months = null, $weeks = null, $days = null, $hours = null, $minutes = null, $seconds = null)
{
$this->isHHVM = defined('HHVM_VERSION');
$spec = static::PERIOD_PREFIX;
$spec .= $years > 0 ? $years . static::PERIOD_YEARS : '';
$spec .= $months > 0 ? $months . static::PERIOD_MONTHS : '';
$specDays = 0;
$specDays += $weeks > 0 ? $weeks * ChronosInterface::DAYS_PER_WEEK : 0;
$specDays += $days > 0 ? $days : 0;
$spec .= ($specDays > 0) ? $specDays . static::PERIOD_DAYS : '';
if ($spec === static::PERIOD_PREFIX) {
$spec .= '0' . static::PERIOD_YEARS;
}
if ($hours > 0 || $minutes > 0 || $seconds > 0) {
$spec .= static::PERIOD_TIME_PREFIX;
$spec .= $hours > 0 ? $hours . static::PERIOD_HOURS : '';
$spec .= $minutes > 0 ? $minutes . static::PERIOD_MINUTES : '';
$spec .= $seconds > 0 ? $seconds . static::PERIOD_SECONDS : '';
}
parent::__construct($spec);
}
/**
* Create a new ChronosInterval instance from specific values.
* This is an alias for the constructor that allows better fluent
* syntax as it allows you to do ChronosInterval::create(1)->fn() rather than
* (new ChronosInterval(1))->fn().
*
* @param int|null $years The year to use.
* @param int|null $months The month to use.
* @param int|null $weeks The week to use.
* @param int|null $days The day to use.
* @param int|null $hours The hours to use.
* @param int|null $minutes The minutes to use.
* @param int|null $seconds The seconds to use.
* @return static
*/
public static function create($years = 1, $months = null, $weeks = null, $days = null, $hours = null, $minutes = null, $seconds = null)
{
return new static($years, $months, $weeks, $days, $hours, $minutes, $seconds);
}
/**
* Provide static helpers to create instances. Allows:
*
* ```
* ChronosInterval::years(3)
* // or
* ChronosInterval::month(1);
* ```
*
* Note: This is done using the magic method to allow static and instance methods to
* have the same names.
*
* @param string $name The property to configure. Accepts singular and plural forms.
* @param array $args Contains the value to use.
* @return static
*/
public static function __callStatic($name, $args)
{
$arg = count($args) === 0 ? 1 : $args[0];
switch ($name) {
case 'years':
case 'year':
return new static($arg);
case 'months':
case 'month':
return new static(null, $arg);
case 'weeks':
case 'week':
return new static(null, null, $arg);
case 'days':
case 'dayz':
case 'day':
return new static(null, null, null, $arg);
case 'hours':
case 'hour':
return new static(null, null, null, null, $arg);
case 'minutes':
case 'minute':
return new static(null, null, null, null, null, $arg);
case 'seconds':
case 'second':
return new static(null, null, null, null, null, null, $arg);
}
}
/**
* Create a ChronosInterval instance from a DateInterval one. Can not instance
* DateInterval objects created from DateTime::diff() as you can't externally
* set the $days field.
*
* @param \DateInterval $di The DateInterval instance to copy.
* @throws \InvalidArgumentException
* @return static
*/
public static function instance(DateInterval $di)
{
if (static::wasCreatedFromDiff($di)) {
throw new InvalidArgumentException(
"Can not instance a DateInterval object created from DateTime::diff()."
);
}
$instance = new static($di->y, $di->m, 0, $di->d, $di->h, $di->i, $di->s);
$instance->invert = $di->invert;
$instance->days = $di->days;
return $instance;
}
/**
* Get a part of the ChronosInterval object
*
* @param string $name The property to read.
* @throws \InvalidArgumentException
* @return int
*/
public function __get($name)
{
switch ($name) {
case 'years':
return $this->isHHVM ? parent::__get('y') : $this->y;
case 'months':
return $this->isHHVM ? parent::__get('m') : $this->m;
case 'dayz':
return $this->isHHVM ? parent::__get('d') : $this->d;
case 'hours':
return $this->isHHVM ? parent::__get('h') : $this->h;
case 'minutes':
return $this->isHHVM ? parent::__get('i') : $this->i;
case 'seconds':
return $this->isHHVM ? parent::__get('s') : $this->s;
case 'weeks':
return (int)floor(($this->isHHVM ? parent::__get('d') : $this->d) / ChronosInterface::DAYS_PER_WEEK);
case 'daysExcludeWeeks':
case 'dayzExcludeWeeks':
return $this->dayz % ChronosInterface::DAYS_PER_WEEK;
case 'days':
return $this->isHHVM ? parent::__get('days') : $this->days;
case 'y':
case 'm':
case 'd':
case 'h':
case 'i':
case 's':
case 'invert':
return parent::__get($name);
default:
throw new InvalidArgumentException(sprintf("Unknown getter '%s'", $name));
}
}
/**
* Set a part of the ChronosInterval object
*
* @param string $name The property to augment.
* @param int $val The value to change.
* @return void
* @throws \InvalidArgumentException
*/
public function __set($name, $val)
{
switch ($name) {
case 'years':
$this->isHHVM ? parent::__set('y', $val) : $this->y = $val;
break;
case 'months':
$this->isHHVM ? parent::__set('m', $val) : $this->m = $val;
break;
case 'weeks':
$val = $val * ChronosInterface::DAYS_PER_WEEK;
$this->isHHVM ? parent::__set('d', $val) : $this->d = $val;
break;
case 'dayz':
$this->isHHVM ? parent::__set('d', $val) : $this->d = $val;
break;
case 'hours':
$this->isHHVM ? parent::__set('h', $val) : $this->h = $val;
break;
case 'minutes':
$this->isHHVM ? parent::__set('i', $val) : $this->i = $val;
break;
case 'seconds':
$this->isHHVM ? parent::__set('s', $val) : $this->s = $val;
break;
case 'invert':
$this->isHHVM ? parent::__set('invert', $val) : $this->invert = $val;
break;
default:
if ($this->isHHVM) {
parent::__set($name, $val);
}
}
}
/**
* Allow setting of weeks and days to be cumulative.
*
* @param int $weeks Number of weeks to set
* @param int $days Number of days to set
* @return static
*/
public function weeksAndDays($weeks, $days)
{
$this->dayz = ($weeks * ChronosInterface::DAYS_PER_WEEK) + $days;
return $this;
}
/**
* Allow fluent calls on the setters... ChronosInterval::years(3)->months(5)->day().
*
* Note: This is done using the magic method to allow static and instance methods to
* have the same names.
*
* @param string $name The property name to augment. Accepts plural forms in addition
* to singular ones.
* @param array $args The value to set.
* @return static
*/
public function __call($name, $args)
{
$arg = count($args) === 0 ? 1 : $args[0];
switch ($name) {
case 'years':
case 'year':
$this->years = $arg;
break;
case 'months':
case 'month':
$this->months = $arg;
break;
case 'weeks':
case 'week':
$this->dayz = $arg * ChronosInterface::DAYS_PER_WEEK;
break;
case 'days':
case 'dayz':
case 'day':
$this->dayz = $arg;
break;
case 'hours':
case 'hour':
$this->hours = $arg;
break;
case 'minutes':
case 'minute':
$this->minutes = $arg;
break;
case 'seconds':
case 'second':
$this->seconds = $arg;
break;
}
return $this;
}
/**
* Add the passed interval to the current instance
*
* @param \DateInterval $interval The interval to add.
* @return static
*/
public function add(DateInterval $interval)
{
$sign = ($interval->invert === 1) ? -1 : 1;
if (static::wasCreatedFromDiff($interval)) {
$this->dayz = $this->dayz + ($interval->days * $sign);
} else {
$this->years = $this->years + ($interval->y * $sign);
$this->months = $this->months + ($interval->m * $sign);
$this->dayz = $this->dayz + ($interval->d * $sign);
$this->hours = $this->hours + ($interval->h * $sign);
$this->minutes = $this->minutes + ($interval->i * $sign);
$this->seconds = $this->seconds + ($interval->s * $sign);
}
return $this;
}
/**
* Returns the ISO 8601 interval string.
*
* @return string Interval as string representation
*/
public function __toString()
{
// equivalence
$oneMinuteInSeconds = 60;
$oneHourInSeconds = $oneMinuteInSeconds * 60;
$oneDayInSeconds = $oneHourInSeconds * 24;
$oneMonthInDays = 365 / 12;
$oneMonthInSeconds = $oneDayInSeconds * $oneMonthInDays;
$oneYearInSeconds = 12 * $oneMonthInSeconds;
// convert
$ySecs = $this->y * $oneYearInSeconds;
$mSecs = $this->m * $oneMonthInSeconds;
$dSecs = $this->d * $oneDayInSeconds;
$hSecs = $this->h * $oneHourInSeconds;
$iSecs = $this->i * $oneMinuteInSeconds;
$sSecs = $this->s;
$totalSecs = $ySecs + $mSecs + $dSecs + $hSecs + $iSecs + $sSecs;
$y = null;
$m = null;
$d = null;
$h = null;
$i = null;
// years
if ($totalSecs >= $oneYearInSeconds) {
$y = floor($totalSecs / $oneYearInSeconds);
$totalSecs = $totalSecs - $y * $oneYearInSeconds;
}
// months
if ($totalSecs >= $oneMonthInSeconds) {
$m = floor($totalSecs / $oneMonthInSeconds);
$totalSecs = $totalSecs - $m * $oneMonthInSeconds;
}
// days
if ($totalSecs >= $oneDayInSeconds) {
$d = floor($totalSecs / $oneDayInSeconds);
$totalSecs = $totalSecs - $d * $oneDayInSeconds;
}
// hours
if ($totalSecs >= $oneHourInSeconds) {
$h = floor($totalSecs / $oneHourInSeconds);
$totalSecs = $totalSecs - $h * $oneHourInSeconds;
}
// minutes
if ($totalSecs >= $oneMinuteInSeconds) {
$i = floor($totalSecs / $oneMinuteInSeconds);
$totalSecs = $totalSecs - $i * $oneMinuteInSeconds;
}
$s = $totalSecs;
$date = array_filter([
static::PERIOD_YEARS => $y,
static::PERIOD_MONTHS => $m,
static::PERIOD_DAYS => $d,
]);
$time = array_filter([
static::PERIOD_HOURS => $h,
static::PERIOD_MINUTES => $i,
static::PERIOD_SECONDS => $s,
]);
$specString = static::PERIOD_PREFIX;
foreach ($date as $key => $value) {
$specString .= $value . $key;
}
if (count($time) > 0) {
$specString .= static::PERIOD_TIME_PREFIX;
foreach ($time as $key => $value) {
$specString .= $value . $key;
}
}
if ($specString === static::PERIOD_PREFIX) {
return 'PT0S';
}
return $this->invert === 1 ? '-' . $specString : $specString;
}
}

150
vendor/cakephp/chronos/src/Date.php vendored Normal file
View File

@@ -0,0 +1,150 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos;
use DateTimeImmutable;
use DateTimeZone;
/**
* An immutable date object that converts all time components into 00:00:00.
*
* This class is useful when you want to represent a calendar date and ignore times.
* This means that timezone changes take no effect as a calendar date exists in all timezones
* in each respective date.
*
* @property-read int $year
* @property-read int $yearIso
* @property-read int $month
* @property-read int $day
* @property-read int $hour
* @property-read int $minute
* @property-read int $second
* @property-read int $timestamp seconds since the Unix Epoch
* @property-read DateTimeZone $timezone the current timezone
* @property-read DateTimeZone $tz alias of timezone
* @property-read int $micro
* @property-read int $dayOfWeek 1 (for Monday) through 7 (for Sunday)
* @property-read int $dayOfYear 0 through 365
* @property-read int $weekOfMonth 1 through 5
* @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday
* @property-read int $daysInMonth number of days in the given month
* @property-read int $age does a diffInYears() with default parameters
* @property-read int $quarter the quarter of this instance, 1 - 4
* @property-read int $offset the timezone offset in seconds from UTC
* @property-read int $offsetHours the timezone offset in hours from UTC
* @property-read bool $dst daylight savings time indicator, true if DST, false otherwise
* @property-read bool $local checks if the timezone is local, true if local, false otherwise
* @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise
* @property-read string $timezoneName
* @property-read string $tzName
*/
class Date extends DateTimeImmutable implements ChronosInterface
{
use Traits\ComparisonTrait;
use Traits\DifferenceTrait;
use Traits\FactoryTrait;
use Traits\FormattingTrait;
use Traits\FrozenTimeTrait;
use Traits\MagicPropertyTrait;
use Traits\ModifierTrait;
use Traits\TestingAidTrait;
/**
* Format to use for __toString method when type juggling occurs.
*
* @var string
*/
protected static $toStringFormat = 'Y-m-d';
/**
* Create a new Immutable Date instance.
*
* Please see the testing aids section (specifically static::setTestNow())
* for more on the possibility of this constructor returning a test instance.
*
* Date instances lack time components, however due to limitations in PHP's
* internal Datetime object the time will always be set to 00:00:00, and the
* timezone will always be UTC. Normalizing the timezone allows for
* subtraction/addition to have deterministic results.
*
* @param string|null $time Fixed or relative time
*/
public function __construct($time = 'now')
{
$tz = new DateTimeZone('UTC');
$testNow = Chronos::getTestNow();
if ($testNow === null) {
$time = $this->stripTime($time);
parent::__construct($time, $tz);
return;
}
$relative = static::hasRelativeKeywords($time);
if (!empty($time) && $time !== 'now' && !$relative) {
$time = $this->stripTime($time);
parent::__construct($time, $tz);
return;
}
$testNow = clone $testNow;
if ($relative) {
$time = $this->stripRelativeTime($time);
if (strlen($time) > 0) {
$testNow = $testNow->modify($time);
}
}
if ($tz !== $testNow->getTimezone()) {
$testNow = $testNow->setTimezone($tz === null ? date_default_timezone_get() : $tz);
}
$time = $testNow->format('Y-m-d 00:00:00');
parent::__construct($time, $tz);
}
/**
* Create a new mutable instance from current immutable instance.
*
* @return \Cake\Chronos\MutableDate
*/
public function toMutable()
{
return MutableDate::instance($this);
}
/**
* Return properties for debugging.
*
* @return array
*/
public function __debugInfo()
{
// Conditionally add properties if state exists to avoid
// errors when using a debugger.
$vars = get_object_vars($this);
$properties = [
'hasFixedNow' => static::hasTestNow(),
];
if (isset($vars['date'])) {
$properties['date'] = $this->format('Y-m-d');
}
return $properties;
}
}

View File

@@ -0,0 +1,103 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos;
/**
* Handles formatting differences in text.
*
* Provides a swappable component for other libraries to leverage.
* when localizing or customizing the difference output.
*/
class DifferenceFormatter
{
/**
* The text translator object
*
* @var \Cake\Chronos\Translator
*/
protected $translate;
/**
* Constructor.
*
* @param \Cake\Chronos\Translator|null $translate The text translator object.
*/
public function __construct($translate = null)
{
$this->translate = $translate ?: new Translator();
}
/**
* Get the difference in a human readable format.
*
* @param \Cake\Chronos\ChronosInterface $date The datetime to start with.
* @param \Cake\Chronos\ChronosInterface|null $other The datetime to compare against.
* @param bool $absolute removes time difference modifiers ago, after, etc
* @return string The difference between the two days in a human readable format
* @see \Cake\Chronos\ChronosInterface::diffForHumans
*/
public function diffForHumans(ChronosInterface $date, ChronosInterface $other = null, $absolute = false)
{
$isNow = $other === null;
if ($isNow) {
$other = $date->now($date->tz);
}
$diffInterval = $date->diff($other);
switch (true) {
case ($diffInterval->y > 0):
$unit = 'year';
$count = $diffInterval->y;
break;
case ($diffInterval->m > 0):
$unit = 'month';
$count = $diffInterval->m;
break;
case ($diffInterval->d > 0):
$unit = 'day';
$count = $diffInterval->d;
if ($count >= ChronosInterface::DAYS_PER_WEEK) {
$unit = 'week';
$count = (int)($count / ChronosInterface::DAYS_PER_WEEK);
}
break;
case ($diffInterval->h > 0):
$unit = 'hour';
$count = $diffInterval->h;
break;
case ($diffInterval->i > 0):
$unit = 'minute';
$count = $diffInterval->i;
break;
default:
$count = $diffInterval->s;
$unit = 'second';
break;
}
$time = $this->translate->plural($unit, $count, ['count' => $count]);
if ($absolute) {
return $time;
}
$isFuture = $diffInterval->invert === 1;
$transId = $isNow ? ($isFuture ? 'from_now' : 'ago') : ($isFuture ? 'after' : 'before');
// Some langs have special pluralization for past and future tense.
$tryKeyExists = $unit . '_' . $transId;
if ($this->translate->exists($tryKeyExists)) {
$time = $this->translate->plural($tryKeyExists, $count, ['count' => $count]);
}
return $this->translate->singular($transId, ['time' => $time]);
}
}

View File

@@ -0,0 +1,149 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos;
use DateTime;
use DateTimeZone;
/**
* A mutable date object that converts all time components into 00:00:00.
*
* This class is useful when you want to represent a calendar date and ignore times.
* This means that timezone changes take no effect as a calendar date exists in all timezones
* in each respective date.
*
* @property-read int $year
* @property-read int $yearIso
* @property-read int $month
* @property-read int $day
* @property-read int $hour
* @property-read int $minute
* @property-read int $second
* @property-read int $timestamp seconds since the Unix Epoch
* @property-read DateTimeZone $timezone the current timezone
* @property-read DateTimeZone $tz alias of timezone
* @property-read int $micro
* @property-read int $dayOfWeek 1 (for Monday) through 7 (for Sunday)
* @property-read int $dayOfYear 0 through 365
* @property-read int $weekOfMonth 1 through 5
* @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday
* @property-read int $daysInMonth number of days in the given month
* @property-read int $age does a diffInYears() with default parameters
* @property-read int $quarter the quarter of this instance, 1 - 4
* @property-read int $offset the timezone offset in seconds from UTC
* @property-read int $offsetHours the timezone offset in hours from UTC
* @property-read bool $dst daylight savings time indicator, true if DST, false otherwise
* @property-read bool $local checks if the timezone is local, true if local, false otherwise
* @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise
* @property-read string $timezoneName
* @property-read string $tzName
*/
class MutableDate extends DateTime implements ChronosInterface
{
use Traits\ComparisonTrait;
use Traits\DifferenceTrait;
use Traits\FactoryTrait;
use Traits\FormattingTrait;
use Traits\FrozenTimeTrait;
use Traits\MagicPropertyTrait;
use Traits\ModifierTrait;
use Traits\TestingAidTrait;
/**
* Format to use for __toString method when type juggling occurs.
*
* @var string
*/
protected static $toStringFormat = 'Y-m-d';
/**
* Create a new mutable Date instance.
*
* Please see the testing aids section (specifically static::setTestNow())
* for more on the possibility of this constructor returning a test instance.
*
* Date instances lack time components, however due to limitations in PHP's
* internal Datetime object the time will always be set to 00:00:00, and the
* timezone will always be UTC. Normalizing the timezone allows for
* subtraction/addition to have deterministic results.
*
* @param string|null $time Fixed or relative time
*/
public function __construct($time = 'now')
{
$tz = new DateTimeZone('UTC');
$testNow = Chronos::getTestNow();
if ($testNow === null) {
$time = $this->stripTime($time);
parent::__construct($time, $tz);
return;
}
$relative = static::hasRelativeKeywords($time);
if (!empty($time) && $time !== 'now' && !$relative) {
$time = $this->stripTime($time);
parent::__construct($time, $tz);
return;
}
$testNow = clone $testNow;
if ($relative) {
$time = $this->stripRelativeTime($time);
if (strlen($time) > 0) {
$testNow = $testNow->modify($time);
}
}
if ($tz !== $testNow->getTimezone()) {
$testNow = $testNow->setTimezone($tz === null ? date_default_timezone_get() : $tz);
}
$time = $testNow->format('Y-m-d 00:00:00');
parent::__construct($time, $tz);
}
/**
* Create a new immutable instance from current mutable instance.
*
* @return \Cake\Chronos\Date
*/
public function toImmutable()
{
return Date::instance($this);
}
/**
* Return properties for debugging.
*
* @return array
*/
public function __debugInfo()
{
// Conditionally add properties if state exists to avoid
// errors when using a debugger.
$vars = get_object_vars($this);
$properties = [
'hasFixedNow' => static::hasTestNow(),
];
if (isset($vars['date'])) {
$properties['date'] = $this->format('Y-m-d');
}
return $properties;
}
}

View File

@@ -0,0 +1,196 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos;
use DateTime;
use DateTimeZone;
use InvalidArgumentException;
/**
* A mutable datetime instance that implements the ChronosInterface.
*
* This object can be mutated in place using any setter method,
* or __set().
*
* @property-read int $year
* @property-read int $yearIso
* @property-read int $month
* @property-read int $day
* @property-read int $hour
* @property-read int $minute
* @property-read int $second
* @property-read int $timestamp seconds since the Unix Epoch
* @property-read DateTimeZone $timezone the current timezone
* @property-read DateTimeZone $tz alias of timezone
* @property-read int $micro
* @property-read int $dayOfWeek 1 (for Monday) through 7 (for Sunday)
* @property-read int $dayOfYear 0 through 365
* @property-read int $weekOfMonth 1 through 5
* @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday
* @property-read int $daysInMonth number of days in the given month
* @property-read int $age does a diffInYears() with default parameters
* @property-read int $quarter the quarter of this instance, 1 - 4
* @property-read int $offset the timezone offset in seconds from UTC
* @property-read int $offsetHours the timezone offset in hours from UTC
* @property-read bool $dst daylight savings time indicator, true if DST, false otherwise
* @property-read bool $local checks if the timezone is local, true if local, false otherwise
* @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise
* @property-read string $timezoneName
* @property-read string $tzName
*/
class MutableDateTime extends DateTime implements ChronosInterface
{
use Traits\ComparisonTrait;
use Traits\DifferenceTrait;
use Traits\FactoryTrait;
use Traits\FormattingTrait;
use Traits\MagicPropertyTrait;
use Traits\ModifierTrait;
use Traits\RelativeKeywordTrait;
use Traits\TestingAidTrait;
use Traits\TimezoneTrait;
/**
* Format to use for __toString method when type juggling occurs.
*
* @var string
*/
protected static $toStringFormat = ChronosInterface::DEFAULT_TO_STRING_FORMAT;
/**
* Create a new MutableDateTime instance.
*
* Please see the testing aids section (specifically static::setTestNow())
* for more on the possibility of this constructor returning a test instance.
*
* @param string|null $time Fixed or relative time
* @param \DateTimeZone|string|null $tz The timezone for the instance
*/
public function __construct($time = 'now', $tz = null)
{
if ($tz !== null) {
$tz = $tz instanceof DateTimeZone ? $tz : new DateTimeZone($tz);
}
$testNow = Chronos::getTestNow();
if ($testNow === null) {
parent::__construct($time === null ? 'now' : $time, $tz);
return;
}
$relative = static::hasRelativeKeywords($time);
if (!empty($time) && $time !== 'now' && !$relative) {
parent::__construct($time, $tz);
return;
}
$testNow = clone $testNow;
if ($relative) {
$testNow = $testNow->modify($time);
}
$relativetime = static::isTimeExpression($time);
if (!$relativetime && $tz !== $testNow->getTimezone()) {
$testNow = $testNow->setTimezone($tz === null ? date_default_timezone_get() : $tz);
}
$time = $testNow->format('Y-m-d H:i:s.u');
parent::__construct($time, $tz);
}
/**
* Create a new immutable instance from current mutable instance.
*
* @return Chronos
*/
public function toImmutable()
{
return Chronos::instance($this);
}
/**
* Set a part of the ChronosInterface object
*
* @param string $name The property to set.
* @param string|int|\DateTimeZone $value The value to set.
* @throws \InvalidArgumentException
* @return void
*/
public function __set($name, $value)
{
switch ($name) {
case 'year':
$this->year($value);
break;
case 'month':
$this->month($value);
break;
case 'day':
$this->day($value);
break;
case 'hour':
$this->hour($value);
break;
case 'minute':
$this->minute($value);
break;
case 'second':
$this->second($value);
break;
case 'timestamp':
$this->timestamp($value);
break;
case 'timezone':
case 'tz':
$this->timezone($value);
break;
default:
throw new InvalidArgumentException(sprintf("Unknown setter '%s'", $name));
}
}
/**
* Return properties for debugging.
*
* @return array
*/
public function __debugInfo()
{
// Conditionally add properties if state exists to avoid
// errors when using a debugger.
$vars = get_object_vars($this);
$properties = [
'hasFixedNow' => static::hasTestNow(),
];
if (isset($vars['date'])) {
$properties['time'] = $this->format('Y-m-d H:i:s.u');
}
if (isset($vars['timezone'])) {
$properties['timezone'] = $this->getTimezone()->getName();
}
return $properties;
}
}

View File

@@ -0,0 +1,499 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos\Traits;
use Cake\Chronos\ChronosInterface;
use DateTime;
/**
* Provides various comparison operator methods for datetime objects.
*/
trait ComparisonTrait
{
use CopyTrait;
/**
* Days of weekend
*
* @var array
*/
protected static $weekendDays = [ChronosInterface::SATURDAY, ChronosInterface::SUNDAY];
/**
* Get weekend days
*
* @return array
*/
public static function getWeekendDays()
{
return static::$weekendDays;
}
/**
* Set weekend days
*
* @param array $days Which days are 'weekends'.
* @return void
*/
public static function setWeekendDays($days)
{
static::$weekendDays = $days;
}
/**
* Determines if the instance is equal to another
*
* @param \Cake\Chronos\ChronosInterface $dt The instance to compare with.
* @return bool
*/
public function eq(ChronosInterface $dt)
{
return $this == $dt;
}
/**
* Determines if the instance is not equal to another
*
* @param \Cake\Chronos\ChronosInterface $dt The instance to compare with.
* @return bool
*/
public function ne(ChronosInterface $dt)
{
return !$this->eq($dt);
}
/**
* Determines if the instance is greater (after) than another
*
* @param \Cake\Chronos\ChronosInterface $dt The instance to compare with.
* @return bool
*/
public function gt(ChronosInterface $dt)
{
return $this > $dt;
}
/**
* Determines if the instance is greater (after) than or equal to another
*
* @param \Cake\Chronos\ChronosInterface $dt The instance to compare with.
* @return bool
*/
public function gte(ChronosInterface $dt)
{
return $this >= $dt;
}
/**
* Determines if the instance is less (before) than another
*
* @param \Cake\Chronos\ChronosInterface $dt The instance to compare with.
* @return bool
*/
public function lt(ChronosInterface $dt)
{
return $this < $dt;
}
/**
* Determines if the instance is less (before) or equal to another
*
* @param \Cake\Chronos\ChronosInterface $dt The instance to compare with.
* @return bool
*/
public function lte(ChronosInterface $dt)
{
return $this <= $dt;
}
/**
* Determines if the instance is between two others
*
* @param \Cake\Chronos\ChronosInterface $dt1 The instance to compare with.
* @param \Cake\Chronos\ChronosInterface $dt2 The instance to compare with.
* @param bool $equal Indicates if a > and < comparison should be used or <= or >=
* @return bool
*/
public function between(ChronosInterface $dt1, ChronosInterface $dt2, $equal = true)
{
if ($dt1->gt($dt2)) {
$temp = $dt1;
$dt1 = $dt2;
$dt2 = $temp;
}
if ($equal) {
return $this->gte($dt1) && $this->lte($dt2);
}
return $this->gt($dt1) && $this->lt($dt2);
}
/**
* Get the closest date from the instance.
*
* @param \Cake\Chronos\ChronosInterface $dt1 The instance to compare with.
* @param \Cake\Chronos\ChronosInterface $dt2 The instance to compare with.
* @return \Cake\Chronos\ChronosInterface
*/
public function closest(ChronosInterface $dt1, ChronosInterface $dt2)
{
return $this->diffInSeconds($dt1) < $this->diffInSeconds($dt2) ? $dt1 : $dt2;
}
/**
* Get the farthest date from the instance.
*
* @param \Cake\Chronos\ChronosInterface $dt1 The instance to compare with.
* @param \Cake\Chronos\ChronosInterface $dt2 The instance to compare with.
* @return \Cake\Chronos\ChronosInterface
*/
public function farthest(ChronosInterface $dt1, ChronosInterface $dt2)
{
return $this->diffInSeconds($dt1) > $this->diffInSeconds($dt2) ? $dt1 : $dt2;
}
/**
* Get the minimum instance between a given instance (default now) and the current instance.
*
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to compare with.
* @return static
*/
public function min(ChronosInterface $dt = null)
{
$dt = ($dt === null) ? static::now($this->tz) : $dt;
return $this->lt($dt) ? $this : $dt;
}
/**
* Get the maximum instance between a given instance (default now) and the current instance.
*
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to compare with.
* @return static
*/
public function max(ChronosInterface $dt = null)
{
$dt = ($dt === null) ? static::now($this->tz) : $dt;
return $this->gt($dt) ? $this : $dt;
}
/**
* Determines if the instance is a weekday
*
* @return bool
*/
public function isWeekday()
{
return !$this->isWeekend();
}
/**
* Determines if the instance is a weekend day
*
* @return bool
*/
public function isWeekend()
{
return in_array($this->dayOfWeek, self::$weekendDays, true);
}
/**
* Determines if the instance is yesterday
*
* @return bool
*/
public function isYesterday()
{
return $this->toDateString() === static::yesterday($this->tz)->toDateString();
}
/**
* Determines if the instance is today
*
* @return bool
*/
public function isToday()
{
return $this->toDateString() === static::now($this->tz)->toDateString();
}
/**
* Determines if the instance is tomorrow
*
* @return bool
*/
public function isTomorrow()
{
return $this->toDateString() === static::tomorrow($this->tz)->toDateString();
}
/**
* Determines if the instance is within the next week
*
* @return bool
*/
public function isNextWeek()
{
return $this->format('W o') === static::now($this->tz)->addWeek()->format('W o');
}
/**
* Determines if the instance is within the last week
*
* @return bool
*/
public function isLastWeek()
{
return $this->format('W o') === static::now($this->tz)->subWeek()->format('W o');
}
/**
* Determines if the instance is within the next month
*
* @return bool
*/
public function isNextMonth()
{
return $this->format('m Y') === static::now($this->tz)->addMonth()->format('m Y');
}
/**
* Determines if the instance is within the last month
*
* @return bool
*/
public function isLastMonth()
{
return $this->format('m Y') === static::now($this->tz)->subMonth()->format('m Y');
}
/**
* Determines if the instance is within the next year
*
* @return bool
*/
public function isNextYear()
{
return $this->year === static::now($this->tz)->addYear()->year;
}
/**
* Determines if the instance is within the last year
*
* @return bool
*/
public function isLastYear()
{
return $this->year === static::now($this->tz)->subYear()->year;
}
/**
* Determines if the instance is in the future, ie. greater (after) than now
*
* @return bool
*/
public function isFuture()
{
return $this->gt(static::now($this->tz));
}
/**
* Determines if the instance is in the past, ie. less (before) than now
*
* @return bool
*/
public function isPast()
{
return $this->lt(static::now($this->tz));
}
/**
* Determines if the instance is a leap year
*
* @return bool
*/
public function isLeapYear()
{
return $this->format('L') === '1';
}
/**
* Checks if the passed in date is the same day as the instance current day.
*
* @param \Cake\Chronos\ChronosInterface $dt The instance to check against.
* @return bool
*/
public function isSameDay(ChronosInterface $dt)
{
return $this->toDateString() === $dt->toDateString();
}
/**
* Checks if this day is a Sunday.
*
* @return bool
*/
public function isSunday()
{
return $this->dayOfWeek === ChronosInterface::SUNDAY;
}
/**
* Checks if this day is a Monday.
*
* @return bool
*/
public function isMonday()
{
return $this->dayOfWeek === ChronosInterface::MONDAY;
}
/**
* Checks if this day is a Tuesday.
*
* @return bool
*/
public function isTuesday()
{
return $this->dayOfWeek === ChronosInterface::TUESDAY;
}
/**
* Checks if this day is a Wednesday.
*
* @return bool
*/
public function isWednesday()
{
return $this->dayOfWeek === ChronosInterface::WEDNESDAY;
}
/**
* Checks if this day is a Thursday.
*
* @return bool
*/
public function isThursday()
{
return $this->dayOfWeek === ChronosInterface::THURSDAY;
}
/**
* Checks if this day is a Friday.
*
* @return bool
*/
public function isFriday()
{
return $this->dayOfWeek === ChronosInterface::FRIDAY;
}
/**
* Checks if this day is a Saturday.
*
* @return bool
*/
public function isSaturday()
{
return $this->dayOfWeek === ChronosInterface::SATURDAY;
}
/**
* Returns true if this object represents a date within the current week
*
* @return bool
*/
public function isThisWeek()
{
return static::now($this->getTimezone())->format('W o') === $this->format('W o');
}
/**
* Returns true if this object represents a date within the current month
*
* @return bool
*/
public function isThisMonth()
{
return static::now($this->getTimezone())->format('m Y') === $this->format('m Y');
}
/**
* Returns true if this object represents a date within the current year
*
* @return bool
*/
public function isThisYear()
{
return static::now($this->getTimezone())->format('Y') === $this->format('Y');
}
/**
* Check if its the birthday. Compares the date/month values of the two dates.
*
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to compare with or null to use current day.
* @return static
*/
public function isBirthday(ChronosInterface $dt = null)
{
if ($dt === null) {
$dt = static::now($this->tz);
}
return $this->format('md') === $dt->format('md');
}
/**
* Returns true this instance happened within the specified interval
*
* @param string|int $timeInterval the numeric value with space then time type.
* Example of valid types: 6 hours, 2 days, 1 minute.
* @return bool
*/
public function wasWithinLast($timeInterval)
{
$now = new static();
$interval = $now->copy()->modify('-' . $timeInterval);
$thisTime = $this->format('U');
return $thisTime >= $interval->format('U') && $thisTime <= $now->format('U');
}
/**
* Returns true this instance will happen within the specified interval
*
* @param string|int $timeInterval the numeric value with space then time type.
* Example of valid types: 6 hours, 2 days, 1 minute.
* @return bool
*/
public function isWithinNext($timeInterval)
{
$now = new static();
$interval = $now->copy()->modify('+' . $timeInterval);
$thisTime = $this->format('U');
return $thisTime <= $interval->format('U') && $thisTime >= $now->format('U');
}
/**
* Check if instance of ChronosInterface is mutable.
*
* @return bool
*/
public function isMutable()
{
return $this instanceof DateTime;
}
}

View File

@@ -0,0 +1,31 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos\Traits;
/**
* Provides methods for copying datetime objects.
*
* Expects that implementing classes provide a static `instance()` method.
*/
trait CopyTrait
{
/**
* Get a copy of the instance
*
* @return static
*/
public function copy()
{
return static::instance($this);
}
}

View File

@@ -0,0 +1,302 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos\Traits;
use Cake\Chronos\ChronosInterface;
use Cake\Chronos\ChronosInterval;
use Cake\Chronos\DifferenceFormatter;
use DatePeriod;
use DateTimeImmutable;
use DateTimeInterface;
/**
* Provides methods for getting differences between datetime objects.
*
* Expects that the implementing class implements:
*
* - static::now()
* - static::instance()
* - copy()
*/
trait DifferenceTrait
{
/**
* Instance of the diff formatting object.
*
* @var \Cake\Chronos\DifferenceFormatter
*/
protected static $diffFormatter;
/**
* Get the difference in years
*
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
* @param bool $abs Get the absolute of the difference
* @return int
*/
public function diffInYears(ChronosInterface $dt = null, $abs = true)
{
$dt = $dt === null ? static::now($this->tz) : $dt;
return (int)$this->diff($dt, $abs)->format('%r%y');
}
/**
* Get the difference in months
*
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
* @param bool $abs Get the absolute of the difference
* @return int
*/
public function diffInMonths(ChronosInterface $dt = null, $abs = true)
{
$dt = $dt === null ? static::now($this->tz) : $dt;
return $this->diffInYears($dt, $abs) * ChronosInterface::MONTHS_PER_YEAR + (int)$this->diff($dt, $abs)->format('%r%m');
}
/**
* Get the difference in weeks
*
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
* @param bool $abs Get the absolute of the difference
* @return int
*/
public function diffInWeeks(ChronosInterface $dt = null, $abs = true)
{
return (int)($this->diffInDays($dt, $abs) / ChronosInterface::DAYS_PER_WEEK);
}
/**
* Get the difference in days
*
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
* @param bool $abs Get the absolute of the difference
* @return int
*/
public function diffInDays(ChronosInterface $dt = null, $abs = true)
{
$dt = $dt === null ? static::now($this->tz) : $dt;
return (int)$this->diff($dt, $abs)->format('%r%a');
}
/**
* Get the difference in days using a filter callable
*
* @param callable $callback The callback to use for filtering.
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
* @param bool $abs Get the absolute of the difference
* @return int
*/
public function diffInDaysFiltered(callable $callback, ChronosInterface $dt = null, $abs = true)
{
return $this->diffFiltered(ChronosInterval::day(), $callback, $dt, $abs);
}
/**
* Get the difference in hours using a filter callable
*
* @param callable $callback The callback to use for filtering.
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
* @param bool $abs Get the absolute of the difference
* @return int
*/
public function diffInHoursFiltered(callable $callback, ChronosInterface $dt = null, $abs = true)
{
return $this->diffFiltered(ChronosInterval::hour(), $callback, $dt, $abs);
}
/**
* Get the difference by the given interval using a filter callable
*
* @param \Cake\Chronos\ChronosInterval $ci An interval to traverse by
* @param callable $callback The callback to use for filtering.
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
* @param bool $abs Get the absolute of the difference
* @return int
*/
public function diffFiltered(ChronosInterval $ci, callable $callback, ChronosInterface $dt = null, $abs = true)
{
$start = $this;
$end = $dt === null ? static::now($this->tz) : $dt;
$inverse = false;
if (defined('HHVM_VERSION')) {
$start = new DateTimeImmutable($this->toIso8601String());
$end = new DateTimeImmutable($end->toIso8601String());
}
if ($end < $start) {
$start = $end;
$end = $this;
$inverse = true;
}
$period = new DatePeriod($start, $ci, $end);
$vals = array_filter(iterator_to_array($period), function (DateTimeInterface $date) use ($callback) {
return $callback(static::instance($date));
});
$diff = count($vals);
return $inverse && !$abs ? -$diff : $diff;
}
/**
* Get the difference in weekdays
*
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
* @param bool $abs Get the absolute of the difference
* @return int
*/
public function diffInWeekdays(ChronosInterface $dt = null, $abs = true)
{
return $this->diffInDaysFiltered(function (ChronosInterface $date) {
return $date->isWeekday();
}, $dt, $abs);
}
/**
* Get the difference in weekend days using a filter
*
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
* @param bool $abs Get the absolute of the difference
* @return int
*/
public function diffInWeekendDays(ChronosInterface $dt = null, $abs = true)
{
return $this->diffInDaysFiltered(function (ChronosInterface $date) {
return $date->isWeekend();
}, $dt, $abs);
}
/**
* Get the difference in hours
*
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
* @param bool $abs Get the absolute of the difference
* @return int
*/
public function diffInHours(ChronosInterface $dt = null, $abs = true)
{
return (int)($this->diffInSeconds($dt, $abs) / ChronosInterface::SECONDS_PER_MINUTE / ChronosInterface::MINUTES_PER_HOUR);
}
/**
* Get the difference in minutes
*
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
* @param bool $abs Get the absolute of the difference
* @return int
*/
public function diffInMinutes(ChronosInterface $dt = null, $abs = true)
{
return (int)($this->diffInSeconds($dt, $abs) / ChronosInterface::SECONDS_PER_MINUTE);
}
/**
* Get the difference in seconds
*
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
* @param bool $abs Get the absolute of the difference
* @return int
*/
public function diffInSeconds(ChronosInterface $dt = null, $abs = true)
{
$dt = ($dt === null) ? static::now($this->tz) : $dt;
$value = $dt->getTimestamp() - $this->getTimestamp();
return $abs ? abs($value) : $value;
}
/**
* The number of seconds since midnight.
*
* @return int
*/
public function secondsSinceMidnight()
{
return $this->diffInSeconds($this->copy()->startOfDay());
}
/**
* The number of seconds until 23:59:59.
*
* @return int
*/
public function secondsUntilEndOfDay()
{
return $this->diffInSeconds($this->copy()->endOfDay());
}
/**
* Convenience method for getting the remaining time from a given time.
*
* @param \DateTime|\DateTimeImmutable $datetime The date to get the remaining time from.
* @return \DateInterval|bool The DateInterval object representing the difference between the two dates or FALSE on failure.
*/
public static function fromNow($datetime)
{
$timeNow = new static();
return $timeNow->diff($datetime);
}
/**
* Get the difference in a human readable format.
*
* When comparing a value in the past to default now:
* 1 hour ago
* 5 months ago
*
* When comparing a value in the future to default now:
* 1 hour from now
* 5 months from now
*
* When comparing a value in the past to another value:
* 1 hour before
* 5 months before
*
* When comparing a value in the future to another value:
* 1 hour after
* 5 months after
*
* @param \Cake\Chronos\ChronosInterface|null $other The datetime to compare with.
* @param bool $absolute removes time difference modifiers ago, after, etc
* @return string
*/
public function diffForHumans(ChronosInterface $other = null, $absolute = false)
{
return static::diffFormatter()->diffForHumans($this, $other, $absolute);
}
/**
* Get the difference formatter instance or overwrite the current one.
*
* @param \Cake\Chronos\DifferenceFormatter|null $formatter The formatter instance when setting.
* @return \Cake\Chronos\DifferenceFormatter The formatter instance.
*/
public static function diffFormatter($formatter = null)
{
if ($formatter === null) {
if (static::$diffFormatter === null) {
static::$diffFormatter = new DifferenceFormatter();
}
return static::$diffFormatter;
}
return static::$diffFormatter = $formatter;
}
}

View File

@@ -0,0 +1,280 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos\Traits;
use DateTimeInterface;
use DateTimeZone;
use InvalidArgumentException;
/**
* Provides a number of datetime related factory methods.
*/
trait FactoryTrait
{
/**
* Holds the last error generated by createFromFormat
*
* @var array
*/
protected static $_lastErrors = [];
/**
* Create a ChronosInterface instance from a DateTimeInterface one
*
* @param \DateTimeInterface $dt The datetime instance to convert.
* @return static
*/
public static function instance(DateTimeInterface $dt)
{
if ($dt instanceof static) {
return clone $dt;
}
return new static($dt->format('Y-m-d H:i:s.u'), $dt->getTimezone());
}
/**
* Create a ChronosInterface instance from a string. This is an alias for the
* constructor that allows better fluent syntax as it allows you to do
* ChronosInterface::parse('Monday next week')->fn() rather than
* (new Chronos('Monday next week'))->fn()
*
* @param string $time The strtotime compatible string to parse
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name.
* @return static
*/
public static function parse($time = 'now', $tz = null)
{
return new static($time, $tz);
}
/**
* Get a ChronosInterface instance for the current date and time
*
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name.
* @return static
*/
public static function now($tz = null)
{
return new static('now', $tz);
}
/**
* Create a ChronosInterface instance for today
*
* @param \DateTimeZone|string|null $tz The timezone to use.
* @return static
*/
public static function today($tz = null)
{
return new static('midnight', $tz);
}
/**
* Create a ChronosInterface instance for tomorrow
*
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name the new instance should use.
* @return static
*/
public static function tomorrow($tz = null)
{
return new static('tomorrow, midnight', $tz);
}
/**
* Create a ChronosInterface instance for yesterday
*
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name the new instance should use.
* @return static
*/
public static function yesterday($tz = null)
{
return new static('yesterday, midnight', $tz);
}
/**
* Create a ChronosInterface instance for the greatest supported date.
*
* @return \Cake\Chronos\ChronosInterface
*/
public static function maxValue()
{
return static::createFromTimestampUTC(PHP_INT_MAX);
}
/**
* Create a ChronosInterface instance for the lowest supported date.
*
* @return \Cake\Chronos\ChronosInterface
*/
public static function minValue()
{
$max = PHP_INT_SIZE === 4 ? PHP_INT_MAX : PHP_INT_MAX / 10;
return static::createFromTimestampUTC(~$max);
}
/**
* Create a new ChronosInterface instance from a specific date and time.
*
* If any of $year, $month or $day are set to null their now() values
* will be used.
*
* If $hour is null it will be set to its now() value and the default values
* for $minute and $second will be their now() values.
* If $hour is not null then the default values for $minute and $second
* will be 0.
*
* @param int|null $year The year to create an instance with.
* @param int|null $month The month to create an instance with.
* @param int|null $day The day to create an instance with.
* @param int|null $hour The hour to create an instance with.
* @param int|null $minute The minute to create an instance with.
* @param int|null $second The second to create an instance with.
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name the new instance should use.
* @return static
*/
public static function create($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null)
{
$year = ($year === null) ? date('Y') : $year;
$month = ($month === null) ? date('n') : $month;
$day = ($day === null) ? date('j') : $day;
if ($hour === null) {
$hour = date('G');
$minute = ($minute === null) ? date('i') : $minute;
$second = ($second === null) ? date('s') : $second;
} else {
$minute = ($minute === null) ? 0 : $minute;
$second = ($second === null) ? 0 : $second;
}
$instance = static::createFromFormat('Y-n-j G:i:s', sprintf('%s-%s-%s %s:%02s:%02s', 0, $month, $day, $hour, $minute, $second), $tz);
return $instance->addYears($year);
}
/**
* Create a ChronosInterface instance from just a date. The time portion is set to now.
*
* @param int $year The year to create an instance with.
* @param int $month The month to create an instance with.
* @param int $day The day to create an instance with.
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name the new instance should use.
* @return static
*/
public static function createFromDate($year = null, $month = null, $day = null, $tz = null)
{
return static::create($year, $month, $day, null, null, null, $tz);
}
/**
* Create a ChronosInterface instance from just a time. The date portion is set to today.
*
* @param int|null $hour The hour to create an instance with.
* @param int|null $minute The minute to create an instance with.
* @param int|null $second The second to create an instance with.
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name the new instance should use.
* @return static
*/
public static function createFromTime($hour = null, $minute = null, $second = null, $tz = null)
{
return static::create(null, null, null, $hour, $minute, $second, $tz);
}
/**
* Create a ChronosInterface instance from a specific format
*
* @param string $format The date() compatible format string.
* @param string $time The formatted date string to interpret.
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name the new instance should use.
* @return static
* @throws \InvalidArgumentException
*/
public static function createFromFormat($format, $time, $tz = null)
{
if ($tz !== null) {
$dt = parent::createFromFormat($format, $time, static::safeCreateDateTimeZone($tz));
} else {
$dt = parent::createFromFormat($format, $time);
}
$errors = parent::getLastErrors();
if ($dt == false) {
throw new InvalidArgumentException(implode(PHP_EOL, $errors['errors']));
}
$dt = static::instance($dt);
static::$_lastErrors = $errors;
return $dt;
}
/**
* Create a ChronosInterface instance from a timestamp
*
* @param int $timestamp The timestamp to create an instance from.
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name the new instance should use.
* @return static
*/
public static function createFromTimestamp($timestamp, $tz = null)
{
return static::now($tz)->setTimestamp($timestamp);
}
/**
* Create a ChronosInterface instance from an UTC timestamp
*
* @param int $timestamp The UTC timestamp to create an instance from.
* @return static
*/
public static function createFromTimestampUTC($timestamp)
{
return new static('@' . $timestamp);
}
/**
* Creates a DateTimeZone from a string or a DateTimeZone
*
* @param \DateTimeZone|string|null $object The value to convert.
* @return \DateTimeZone
* @throws \InvalidArgumentException
*/
protected static function safeCreateDateTimeZone($object)
{
if ($object === null) {
return new DateTimeZone(date_default_timezone_get());
}
if ($object instanceof DateTimeZone) {
return $object;
}
return new DateTimeZone($object);
}
/**
* Returns any errors or warnings that were found during the parsing
* of the last object created by this class.
*
* @return array
*/
public static function getLastErrors()
{
if (empty(static::$_lastErrors)) {
return parent::getLastErrors();
}
return static::$_lastErrors;
}
}

View File

@@ -0,0 +1,259 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos\Traits;
use Cake\Chronos\ChronosInterface;
use DateTime;
/**
* Provides string formatting methods for datetime instances.
*
* Expects implementing classes to define static::$toStringFormat
*/
trait FormattingTrait
{
/**
* Reset the format used to the default when type juggling a ChronosInterface instance to a string
*
* @return void
*/
public static function resetToStringFormat()
{
static::setToStringFormat(ChronosInterface::DEFAULT_TO_STRING_FORMAT);
}
/**
* Set the default format used when type juggling a ChronosInterface instance to a string
*
* @param string $format The format to use in future __toString() calls.
* @return void
*/
public static function setToStringFormat($format)
{
static::$toStringFormat = $format;
}
/**
* Format the instance as a string using the set format
*
* @return string
*/
public function __toString()
{
return $this->format(static::$toStringFormat);
}
/**
* Format the instance as date
*
* @return string
*/
public function toDateString()
{
return $this->format('Y-m-d');
}
/**
* Format the instance as a readable date
*
* @return string
*/
public function toFormattedDateString()
{
return $this->format('M j, Y');
}
/**
* Format the instance as time
*
* @return string
*/
public function toTimeString()
{
return $this->format('H:i:s');
}
/**
* Format the instance as date and time
*
* @return string
*/
public function toDateTimeString()
{
return $this->format('Y-m-d H:i:s');
}
/**
* Format the instance with day, date and time
*
* @return string
*/
public function toDayDateTimeString()
{
return $this->format('D, M j, Y g:i A');
}
/**
* Format the instance as ATOM
*
* @return string
*/
public function toAtomString()
{
return $this->format(DateTime::ATOM);
}
/**
* Format the instance as COOKIE
*
* @return string
*/
public function toCookieString()
{
return $this->format(DateTime::COOKIE);
}
/**
* Format the instance as ISO8601
*
* @return string
*/
public function toIso8601String()
{
return $this->format(DateTime::ATOM);
}
/**
* Format the instance as RFC822
*
* @return string
*/
public function toRfc822String()
{
return $this->format(DateTime::RFC822);
}
/**
* Format the instance as RFC850
*
* @return string
*/
public function toRfc850String()
{
return $this->format(DateTime::RFC850);
}
/**
* Format the instance as RFC1036
*
* @return string
*/
public function toRfc1036String()
{
return $this->format(DateTime::RFC1036);
}
/**
* Format the instance as RFC1123
*
* @return string
*/
public function toRfc1123String()
{
return $this->format(DateTime::RFC1123);
}
/**
* Format the instance as RFC2822
*
* @return string
*/
public function toRfc2822String()
{
return $this->format(DateTime::RFC2822);
}
/**
* Format the instance as RFC3339
*
* @return string
*/
public function toRfc3339String()
{
return $this->format(DateTime::RFC3339);
}
/**
* Format the instance as RSS
*
* @return string
*/
public function toRssString()
{
return $this->format(DateTime::RSS);
}
/**
* Format the instance as W3C
*
* @return string
*/
public function toW3cString()
{
return $this->format(DateTime::W3C);
}
/**
* Returns a UNIX timestamp.
*
* @return string UNIX timestamp
*/
public function toUnixString()
{
return $this->format('U');
}
/**
* Returns the quarter
*
* @param bool $range Range.
* @return int|array 1, 2, 3, or 4 quarter of year or array if $range true
*/
public function toQuarter($range = false)
{
$quarter = ceil($this->format('m') / 3);
if ($range === false) {
return $quarter;
}
$year = $this->format('Y');
switch ($quarter) {
case 1:
return [$year . '-01-01', $year . '-03-31'];
case 2:
return [$year . '-04-01', $year . '-06-30'];
case 3:
return [$year . '-07-01', $year . '-09-30'];
case 4:
return [$year . '-10-01', $year . '-12-31'];
}
}
/**
* @return int
*/
public function toWeek()
{
return (int)$this->format('W');
}
}

View File

@@ -0,0 +1,186 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos\Traits;
use DateTimeInterface;
/**
* A trait for freezing the time aspect of a DateTime.
*
* Used in making calendar date objects, both mutable and immutable.
*/
trait FrozenTimeTrait
{
use RelativeKeywordTrait;
/**
* Removes the time components from an input string.
*
* Used to ensure constructed objects always lack time.
*
* @param string|int $time The input time. Integer values will be assumed
* to be in UTC. The 'now' and '' values will use the current local time.
* @return string The date component of $time.
*/
protected function stripTime($time)
{
if (is_int($time) || ctype_digit($time)) {
return gmdate('Y-m-d 00:00:00', $time);
}
if ($time instanceof DateTimeInterface) {
$time = $time->format('Y-m-d 00:00:00');
}
if (substr($time, 0, 1) === '@') {
return gmdate('Y-m-d 00:00:00', substr($time, 1));
}
if ($time === null || $time === 'now' || $time === '') {
return date('Y-m-d 00:00:00');
}
if ($this->hasRelativeKeywords($time)) {
return date('Y-m-d 00:00:00', strtotime($time));
}
return preg_replace('/\d{1,2}:\d{1,2}:\d{1,2}(?:\.\d+)?/', '00:00:00', $time);
}
/**
* Remove time components from strtotime relative strings.
*
* @param string $time The input expression
* @return string The output expression with no time modifiers.
*/
protected function stripRelativeTime($time)
{
return preg_replace('/([-+]\s*\d+\s(?:minutes|seconds|hours|microseconds))/', '', $time);
}
/**
* Modify the time on the Date.
*
* This method ignores all inputs and forces all inputs to 0.
*
* @param int $hours The hours to set (ignored)
* @param int $minutes The minutes to set (ignored)
* @param int $seconds The seconds to set (ignored)
* @param int $microseconds The microseconds to set (ignored)
* @return static A modified Date instance.
*/
public function setTime($hours, $minutes, $seconds = null, $microseconds = null)
{
if (CHRONOS_SUPPORTS_MICROSECONDS) {
return parent::setTime(0, 0, 0, 0);
}
return parent::setTime(0, 0, 0);
}
/**
* Add an Interval to a Date
*
* Any changes to the time will be ignored and reset to 00:00:00
*
* @param \DateInterval $interval The interval to modify this date by.
* @return static A modified Date instance
*/
public function add($interval)
{
return parent::add($interval)->setTime(0, 0, 0);
}
/**
* Subtract an Interval from a Date.
*
* Any changes to the time will be ignored and reset to 00:00:00
*
* @param \DateInterval $interval The interval to modify this date by.
* @return static A modified Date instance
*/
public function sub($interval)
{
return parent::sub($interval)->setTime(0, 0, 0);
}
/**
* No-op method.
*
* Timezones have no effect on calendar dates.
*
* @param \DateTimeZone|string $value The DateTimeZone object or timezone name to use.
* @return $this
*/
public function timezone($value)
{
return $this;
}
/**
* No-op method.
*
* Timezones have no effect on calendar dates.
*
* @param \DateTimeZone|string $value The DateTimeZone object or timezone name to use.
* @return $this
*/
public function tz($value)
{
return $this;
}
/**
* No-op method.
*
* Timezones have no effect on calendar dates.
*
* @param \DateTimeZone|string $value The DateTimeZone object or timezone name to use.
* @return $this
*/
public function setTimezone($value)
{
return $this;
}
/**
* Set the timestamp value and get a new object back.
*
* This method will discard the time aspects of the timestamp
* and only apply the date portions
*
* @param int $value The timestamp value to set.
* @return static
*/
public function setTimestamp($value)
{
return parent::setTimestamp($value)->setTime(0, 0, 0);
}
/**
* Overloaded to ignore time changes.
*
* Changing any aspect of the time will be ignored, and the resulting object
* will have its time frozen to 00:00:00.
*
* @param string $relative The relative change to make.
* @return static A new date with the applied date changes.
*/
public function modify($relative)
{
if (preg_match('/hour|minute|second/', $relative)) {
return $this;
}
$new = parent::modify($relative);
if ($new->format('H:i:s') !== '00:00:00') {
return $new->setTime(0, 0, 0);
}
return $new;
}
}

View File

@@ -0,0 +1,131 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice. Provides various operator methods for datetime
* objects.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos\Traits;
use Cake\Chronos\ChronosInterface;
use InvalidArgumentException;
/**
* Provides the magic methods that allow read access
* to magic properties.
*
* @property-read int $year
* @property-read int $yearIso
* @property-read int $month
* @property-read int $day
* @property-read int $hour
* @property-read int $minute
* @property-read int $second
* @property-read int $micro
* @property-read int $dayOfWeek
* @property-read int $dayOfYear
* @property-read int $weekOfYear
* @property-read int $daysInMonth
* @property-read int $timestamp
* @property-read int $weekOfMonth
* @property-read int $age
* @property-read int $quarter
* @property-read int $offset
* @property-read int $offsetHours
* @property-read boolean $dst
* @property-read boolean $local
* @property-read boolean $utc
* @property-read \DateTimeZone $timezone
* @property-read \DateTimeZone $tz
* @property-read string $timezoneName
* @property-read string $tzName
*/
trait MagicPropertyTrait
{
/**
* Get a part of the ChronosInterface object
*
* @param string $name The property name to read.
* @return string|int|\DateTimeZone The property value.
* @throws \InvalidArgumentException
*/
public function __get($name)
{
static $formats = [
'year' => 'Y',
'yearIso' => 'o',
'month' => 'n',
'day' => 'j',
'hour' => 'G',
'minute' => 'i',
'second' => 's',
'micro' => 'u',
'dayOfWeek' => 'N',
'dayOfYear' => 'z',
'weekOfYear' => 'W',
'daysInMonth' => 't',
'timestamp' => 'U',
];
switch (true) {
case isset($formats[$name]):
return (int)$this->format($formats[$name]);
case $name === 'weekOfMonth':
return (int)ceil($this->day / ChronosInterface::DAYS_PER_WEEK);
case $name === 'age':
return $this->diffInYears();
case $name === 'quarter':
return (int)ceil($this->month / 3);
case $name === 'offset':
return $this->getOffset();
case $name === 'offsetHours':
return $this->getOffset() / ChronosInterface::SECONDS_PER_MINUTE / ChronosInterface::MINUTES_PER_HOUR;
case $name === 'dst':
return $this->format('I') === '1';
case $name === 'local':
return $this->offset === $this->copy()->setTimezone(date_default_timezone_get())->offset;
case $name === 'utc':
return $this->offset === 0;
case $name === 'timezone' || $name === 'tz':
return $this->getTimezone();
case $name === 'timezoneName' || $name === 'tzName':
return $this->getTimezone()->getName();
default:
throw new InvalidArgumentException(sprintf("Unknown getter '%s'", $name));
}
}
/**
* Check if an attribute exists on the object
*
* @param string $name The property name to check.
* @return bool Whether or not the property exists.
*/
public function __isset($name)
{
try {
$this->__get($name);
} catch (InvalidArgumentException $e) {
return false;
}
return true;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,58 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice. Provides various operator methods for datetime
* objects.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos\Traits;
/**
* Provides methods for testing if strings contain relative keywords.
*/
trait RelativeKeywordTrait
{
protected static $relativePattern = '/this|next|last|tomorrow|yesterday|midnight|today|[+-]|first|last|ago/i';
/**
* Determine if there is just a time in the time string
*
* @param string $time The time string to check.
* @return bool true if there is a keyword, otherwise false
*/
private static function isTimeExpression($time)
{
// Just a time
if (preg_match('/^[0-2]?[0-9]:[0-5][0-9](?::[0-5][0-9])?$/', $time)) {
return true;
}
return false;
}
/**
* Determine if there is a relative keyword in the time string, this is to
* create dates relative to now for test instances. e.g.: next tuesday
*
* @param string $time The time string to check.
* @return bool true if there is a keyword, otherwise false
*/
public static function hasRelativeKeywords($time)
{
if (self::isTimeExpression($time)) {
return true;
}
// skip common format with a '-' in it
if (preg_match('/[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}/', $time) !== 1) {
return preg_match(static::$relativePattern, $time) > 0;
}
return false;
}
}

View File

@@ -0,0 +1,59 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice. Provides various operator methods for datetime
* objects.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos\Traits;
use Cake\Chronos\Chronos;
use Cake\Chronos\ChronosInterface;
/**
* Provides methods for setting a 'test' now. This lets you
* retrieve pre-determined times with now().
*/
trait TestingAidTrait
{
/**
* Set the test now used by Date and Time classes provided by Chronos
*
* @see \Cake\Chronos\Chronos::setTestNow()
* @param \Cake\Chronos\ChronosInterface|string|null $testNow The instance to use for all future instances.
* @return void
*/
public static function setTestNow($testNow = null)
{
Chronos::setTestNow($testNow);
}
/**
* Get the test instance stored in Chronos
*
* @see \Cake\Chronos\Chronos::getTestNow()
* @return static|null the current instance used for testing or null.
*/
public static function getTestNow()
{
return Chronos::getTestNow();
}
/**
* Get whether or not Chronos has a test instance set.
*
* @see \Cake\Chronos\Chronos::hasTestNow()
* @return bool True if there is a test instance, otherwise false
*/
public static function hasTestNow()
{
return Chronos::hasTestNow();
}
}

View File

@@ -0,0 +1,60 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice. Provides various operator methods for datetime
* objects.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos\Traits;
/**
* Methods for modifying/reading timezone data.
*/
trait TimezoneTrait
{
/**
* Alias for setTimezone()
*
* @param \DateTimeZone|string $value The DateTimeZone object or timezone name to use.
* @return static
*/
public function timezone($value)
{
return $this->setTimezone($value);
}
/**
* Alias for setTimezone()
*
* @param \DateTimeZone|string $value The DateTimeZone object or timezone name to use.
* @return static
*/
public function tz($value)
{
return $this->setTimezone($value);
}
/**
* Set the instance's timezone from a string or object
*
* @param \DateTimeZone|string $value The DateTimeZone object or timezone name to use.
* @return static
*/
public function setTimezone($value)
{
$date = parent::setTimezone(static::safeCreateDateTimeZone($value));
// https://bugs.php.net/bug.php?id=72338
// this is workaround for this bug
// Needed for PHP below 7.0 version
$date->getTimestamp();
return $date;
}
}

View File

@@ -0,0 +1,93 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Chronos;
/**
* Basic english only 'translator' for diffForHumans()
*/
class Translator
{
/**
* Translation strings.
*
* @var array
*/
public static $strings = [
'year' => '1 year',
'year_plural' => '{count} years',
'month' => '1 month',
'month_plural' => '{count} months',
'week' => '1 week',
'week_plural' => '{count} weeks',
'day' => '1 day',
'day_plural' => '{count} days',
'hour' => '1 hour',
'hour_plural' => '{count} hours',
'minute' => '1 minute',
'minute_plural' => '{count} minutes',
'second' => '1 second',
'second_plural' => '{count} seconds',
'ago' => '{time} ago',
'from_now' => '{time} from now',
'after' => '{time} after',
'before' => '{time} before',
];
/**
* Check if a translation key exists.
*
* @param string $key The key to check.
* @return bool Whether or not the key exists.
*/
public function exists($key)
{
return isset(static::$strings[$key]);
}
/**
* Get a plural message.
*
* @param string $key The key to use.
* @param int $count The number of items in the translation.
* @param array $vars Additional context variables.
* @return string The translated message or ''.
*/
public function plural($key, $count, array $vars = [])
{
if ($count === 1) {
return $this->singular($key, $vars);
}
return $this->singular($key . '_plural', ['count' => $count] + $vars);
}
/**
* Get a singular message.
*
* @param string $key The key to use.
* @param array $vars Additional context variables.
* @return string The translated message or ''.
*/
public function singular($key, array $vars = [])
{
if (isset(static::$strings[$key])) {
$varKeys = array_keys($vars);
foreach ($varKeys as $i => $k) {
$varKeys[$i] = '{' . $k . '}';
}
return str_replace($varKeys, $vars, static::$strings[$key]);
}
return '';
}
}

View File

@@ -0,0 +1,20 @@
<?php
/**
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
define('CHRONOS_SUPPORTS_MICROSECONDS', version_compare(PHP_VERSION, '7.1.0', '>='));
if (!class_exists('Carbon\Carbon')) {
// Create class aliases for Carbon so applications
// can upgrade more easily.
class_alias('Cake\Chronos\Chronos', 'Carbon\MutableDateTime');
class_alias('Cake\Chronos\ChronosInterface', 'Carbon\CarbonInterface');
}

View File

@@ -377,7 +377,7 @@ class ClassLoader
$subPath = $class;
while (false !== $lastPos = strrpos($subPath, '\\')) {
$subPath = substr($subPath, 0, $lastPos);
$search = $subPath . '\\';
$search = $subPath.'\\';
if (isset($this->prefixDirsPsr4[$search])) {
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
foreach ($this->prefixDirsPsr4[$search] as $dir) {

View File

@@ -44,6 +44,7 @@ return array(
'App\\Providers\\EveOnlineOAuthProvider' => $baseDir . '/app/Providers/EveOnlineOAuthProvider.php',
'App\\Providers\\EveOnlineOAuthServiceProvider' => $baseDir . '/app/Providers/EveOnlineOAuthServiceProvider.php',
'App\\Providers\\EventServiceProvider' => $baseDir . '/app/Providers/EventServiceProvider.php',
'App\\Providers\\HorizonServiceProvider' => $baseDir . '/app/Providers/HorizonServiceProvider.php',
'App\\Providers\\RouteServiceProvider' => $baseDir . '/app/Providers/RouteServiceProvider.php',
'App\\SolarSystemDistance' => $baseDir . '/app/Models/Lookups/SolarSystemDistance.php',
'App\\User' => $baseDir . '/app/Models/User/User.php',
@@ -84,6 +85,25 @@ return array(
'Barryvdh\\Debugbar\\Twig\\Extension\\Stopwatch' => $vendorDir . '/barryvdh/laravel-debugbar/src/Twig/Extension/Stopwatch.php',
'Barryvdh\\Debugbar\\Twig\\Node\\StopwatchNode' => $vendorDir . '/barryvdh/laravel-debugbar/src/Twig/Node/StopwatchNode.php',
'Barryvdh\\Debugbar\\Twig\\TokenParser\\StopwatchTokenParser' => $vendorDir . '/barryvdh/laravel-debugbar/src/Twig/TokenParser/StopwatchTokenParser.php',
'Cake\\Chronos\\Chronos' => $vendorDir . '/cakephp/chronos/src/Chronos.php',
'Cake\\Chronos\\ChronosInterface' => $vendorDir . '/cakephp/chronos/src/ChronosInterface.php',
'Cake\\Chronos\\ChronosInterval' => $vendorDir . '/cakephp/chronos/src/ChronosInterval.php',
'Cake\\Chronos\\Date' => $vendorDir . '/cakephp/chronos/src/Date.php',
'Cake\\Chronos\\DifferenceFormatter' => $vendorDir . '/cakephp/chronos/src/DifferenceFormatter.php',
'Cake\\Chronos\\MutableDate' => $vendorDir . '/cakephp/chronos/src/MutableDate.php',
'Cake\\Chronos\\MutableDateTime' => $vendorDir . '/cakephp/chronos/src/MutableDateTime.php',
'Cake\\Chronos\\Traits\\ComparisonTrait' => $vendorDir . '/cakephp/chronos/src/Traits/ComparisonTrait.php',
'Cake\\Chronos\\Traits\\CopyTrait' => $vendorDir . '/cakephp/chronos/src/Traits/CopyTrait.php',
'Cake\\Chronos\\Traits\\DifferenceTrait' => $vendorDir . '/cakephp/chronos/src/Traits/DifferenceTrait.php',
'Cake\\Chronos\\Traits\\FactoryTrait' => $vendorDir . '/cakephp/chronos/src/Traits/FactoryTrait.php',
'Cake\\Chronos\\Traits\\FormattingTrait' => $vendorDir . '/cakephp/chronos/src/Traits/FormattingTrait.php',
'Cake\\Chronos\\Traits\\FrozenTimeTrait' => $vendorDir . '/cakephp/chronos/src/Traits/FrozenTimeTrait.php',
'Cake\\Chronos\\Traits\\MagicPropertyTrait' => $vendorDir . '/cakephp/chronos/src/Traits/MagicPropertyTrait.php',
'Cake\\Chronos\\Traits\\ModifierTrait' => $vendorDir . '/cakephp/chronos/src/Traits/ModifierTrait.php',
'Cake\\Chronos\\Traits\\RelativeKeywordTrait' => $vendorDir . '/cakephp/chronos/src/Traits/RelativeKeywordTrait.php',
'Cake\\Chronos\\Traits\\TestingAidTrait' => $vendorDir . '/cakephp/chronos/src/Traits/TestingAidTrait.php',
'Cake\\Chronos\\Traits\\TimezoneTrait' => $vendorDir . '/cakephp/chronos/src/Traits/TimezoneTrait.php',
'Cake\\Chronos\\Translator' => $vendorDir . '/cakephp/chronos/src/Translator.php',
'Carbon\\Carbon' => $vendorDir . '/nesbot/carbon/src/Carbon/Carbon.php',
'Carbon\\CarbonImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonImmutable.php',
'Carbon\\CarbonInterface' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonInterface.php',
@@ -1842,6 +1862,266 @@ return array(
'JakubOnderka\\PhpConsoleColor\\InvalidStyleException' => $vendorDir . '/jakub-onderka/php-console-color/src/InvalidStyleException.php',
'JakubOnderka\\PhpConsoleHighlighter\\Highlighter' => $vendorDir . '/jakub-onderka/php-console-highlighter/src/Highlighter.php',
'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
'Khill\\Lavacharts\\Builders\\ChartBuilder' => $vendorDir . '/khill/lavacharts/src/Builders/ChartBuilder.php',
'Khill\\Lavacharts\\Builders\\DashboardBuilder' => $vendorDir . '/khill/lavacharts/src/Builders/DashboardBuilder.php',
'Khill\\Lavacharts\\Builders\\GenericBuilder' => $vendorDir . '/khill/lavacharts/src/Builders/GenericBuilder.php',
'Khill\\Lavacharts\\Charts\\AnnotationChart' => $vendorDir . '/khill/lavacharts/src/Charts/AnnotationChart.php',
'Khill\\Lavacharts\\Charts\\AreaChart' => $vendorDir . '/khill/lavacharts/src/Charts/AreaChart.php',
'Khill\\Lavacharts\\Charts\\BarChart' => $vendorDir . '/khill/lavacharts/src/Charts/BarChart.php',
'Khill\\Lavacharts\\Charts\\BubbleChart' => $vendorDir . '/khill/lavacharts/src/Charts/BubbleChart.php',
'Khill\\Lavacharts\\Charts\\CalendarChart' => $vendorDir . '/khill/lavacharts/src/Charts/CalendarChart.php',
'Khill\\Lavacharts\\Charts\\CandlestickChart' => $vendorDir . '/khill/lavacharts/src/Charts/CandlestickChart.php',
'Khill\\Lavacharts\\Charts\\Chart' => $vendorDir . '/khill/lavacharts/src/Charts/Chart.php',
'Khill\\Lavacharts\\Charts\\ChartFactory' => $vendorDir . '/khill/lavacharts/src/Charts/ChartFactory.php',
'Khill\\Lavacharts\\Charts\\ColumnChart' => $vendorDir . '/khill/lavacharts/src/Charts/ColumnChart.php',
'Khill\\Lavacharts\\Charts\\ComboChart' => $vendorDir . '/khill/lavacharts/src/Charts/ComboChart.php',
'Khill\\Lavacharts\\Charts\\DonutChart' => $vendorDir . '/khill/lavacharts/src/Charts/DonutChart.php',
'Khill\\Lavacharts\\Charts\\GanttChart' => $vendorDir . '/khill/lavacharts/src/Charts/GanttChart.php',
'Khill\\Lavacharts\\Charts\\GaugeChart' => $vendorDir . '/khill/lavacharts/src/Charts/GaugeChart.php',
'Khill\\Lavacharts\\Charts\\GeoChart' => $vendorDir . '/khill/lavacharts/src/Charts/GeoChart.php',
'Khill\\Lavacharts\\Charts\\HistogramChart' => $vendorDir . '/khill/lavacharts/src/Charts/HistogramChart.php',
'Khill\\Lavacharts\\Charts\\LineChart' => $vendorDir . '/khill/lavacharts/src/Charts/LineChart.php',
'Khill\\Lavacharts\\Charts\\OrgChart' => $vendorDir . '/khill/lavacharts/src/Charts/OrgChart.php',
'Khill\\Lavacharts\\Charts\\PieChart' => $vendorDir . '/khill/lavacharts/src/Charts/PieChart.php',
'Khill\\Lavacharts\\Charts\\SankeyChart' => $vendorDir . '/khill/lavacharts/src/Charts/SankeyChart.php',
'Khill\\Lavacharts\\Charts\\ScatterChart' => $vendorDir . '/khill/lavacharts/src/Charts/ScatterChart.php',
'Khill\\Lavacharts\\Charts\\SteppedAreaChart' => $vendorDir . '/khill/lavacharts/src/Charts/SteppedAreaChart.php',
'Khill\\Lavacharts\\Charts\\TableChart' => $vendorDir . '/khill/lavacharts/src/Charts/TableChart.php',
'Khill\\Lavacharts\\Charts\\TimelineChart' => $vendorDir . '/khill/lavacharts/src/Charts/TimelineChart.php',
'Khill\\Lavacharts\\Charts\\TreeMapChart' => $vendorDir . '/khill/lavacharts/src/Charts/TreeMapChart.php',
'Khill\\Lavacharts\\Charts\\WordTreeChart' => $vendorDir . '/khill/lavacharts/src/Charts/WordTreeChart.php',
'Khill\\Lavacharts\\Dashboards\\Bindings\\Binding' => $vendorDir . '/khill/lavacharts/src/Dashboards/Bindings/Binding.php',
'Khill\\Lavacharts\\Dashboards\\Bindings\\BindingFactory' => $vendorDir . '/khill/lavacharts/src/Dashboards/Bindings/BindingFactory.php',
'Khill\\Lavacharts\\Dashboards\\Bindings\\ManyToMany' => $vendorDir . '/khill/lavacharts/src/Dashboards/Bindings/ManyToMany.php',
'Khill\\Lavacharts\\Dashboards\\Bindings\\ManyToOne' => $vendorDir . '/khill/lavacharts/src/Dashboards/Bindings/ManyToOne.php',
'Khill\\Lavacharts\\Dashboards\\Bindings\\OneToMany' => $vendorDir . '/khill/lavacharts/src/Dashboards/Bindings/OneToMany.php',
'Khill\\Lavacharts\\Dashboards\\Bindings\\OneToOne' => $vendorDir . '/khill/lavacharts/src/Dashboards/Bindings/OneToOne.php',
'Khill\\Lavacharts\\Dashboards\\Dashboard' => $vendorDir . '/khill/lavacharts/src/Dashboards/Dashboard.php',
'Khill\\Lavacharts\\Dashboards\\DashboardFactory' => $vendorDir . '/khill/lavacharts/src/Dashboards/DashboardFactory.php',
'Khill\\Lavacharts\\Dashboards\\Filters\\CategoryFilter' => $vendorDir . '/khill/lavacharts/src/Dashboards/Filters/CategoryFilter.php',
'Khill\\Lavacharts\\Dashboards\\Filters\\ChartRangeFilter' => $vendorDir . '/khill/lavacharts/src/Dashboards/Filters/ChartRangeFilter.php',
'Khill\\Lavacharts\\Dashboards\\Filters\\DateRangeFilter' => $vendorDir . '/khill/lavacharts/src/Dashboards/Filters/DateRangeFilter.php',
'Khill\\Lavacharts\\Dashboards\\Filters\\Filter' => $vendorDir . '/khill/lavacharts/src/Dashboards/Filters/Filter.php',
'Khill\\Lavacharts\\Dashboards\\Filters\\FilterFactory' => $vendorDir . '/khill/lavacharts/src/Dashboards/Filters/FilterFactory.php',
'Khill\\Lavacharts\\Dashboards\\Filters\\NumberRangeFilter' => $vendorDir . '/khill/lavacharts/src/Dashboards/Filters/NumberRangeFilter.php',
'Khill\\Lavacharts\\Dashboards\\Filters\\StringFilter' => $vendorDir . '/khill/lavacharts/src/Dashboards/Filters/StringFilter.php',
'Khill\\Lavacharts\\Dashboards\\Wrappers\\ChartWrapper' => $vendorDir . '/khill/lavacharts/src/Dashboards/Wrappers/ChartWrapper.php',
'Khill\\Lavacharts\\Dashboards\\Wrappers\\ControlWrapper' => $vendorDir . '/khill/lavacharts/src/Dashboards/Wrappers/ControlWrapper.php',
'Khill\\Lavacharts\\Dashboards\\Wrappers\\Wrapper' => $vendorDir . '/khill/lavacharts/src/Dashboards/Wrappers/Wrapper.php',
'Khill\\Lavacharts\\DataTables\\Cells\\Cell' => $vendorDir . '/khill/lavacharts/src/DataTables/Cells/Cell.php',
'Khill\\Lavacharts\\DataTables\\Cells\\DateCell' => $vendorDir . '/khill/lavacharts/src/DataTables/Cells/DateCell.php',
'Khill\\Lavacharts\\DataTables\\Cells\\NullCell' => $vendorDir . '/khill/lavacharts/src/DataTables/Cells/NullCell.php',
'Khill\\Lavacharts\\DataTables\\Columns\\Column' => $vendorDir . '/khill/lavacharts/src/DataTables/Columns/Column.php',
'Khill\\Lavacharts\\DataTables\\Columns\\ColumnBuilder' => $vendorDir . '/khill/lavacharts/src/DataTables/Columns/ColumnBuilder.php',
'Khill\\Lavacharts\\DataTables\\Columns\\ColumnFactory' => $vendorDir . '/khill/lavacharts/src/DataTables/Columns/ColumnFactory.php',
'Khill\\Lavacharts\\DataTables\\DataFactory' => $vendorDir . '/khill/lavacharts/src/DataTables/DataFactory.php',
'Khill\\Lavacharts\\DataTables\\DataTable' => $vendorDir . '/khill/lavacharts/src/DataTables/DataTable.php',
'Khill\\Lavacharts\\DataTables\\Formats\\ArrowFormat' => $vendorDir . '/khill/lavacharts/src/DataTables/Formats/ArrowFormat.php',
'Khill\\Lavacharts\\DataTables\\Formats\\BarFormat' => $vendorDir . '/khill/lavacharts/src/DataTables/Formats/BarFormat.php',
'Khill\\Lavacharts\\DataTables\\Formats\\DateFormat' => $vendorDir . '/khill/lavacharts/src/DataTables/Formats/DateFormat.php',
'Khill\\Lavacharts\\DataTables\\Formats\\Format' => $vendorDir . '/khill/lavacharts/src/DataTables/Formats/Format.php',
'Khill\\Lavacharts\\DataTables\\Formats\\NumberFormat' => $vendorDir . '/khill/lavacharts/src/DataTables/Formats/NumberFormat.php',
'Khill\\Lavacharts\\DataTables\\Rows\\NullRow' => $vendorDir . '/khill/lavacharts/src/DataTables/Rows/NullRow.php',
'Khill\\Lavacharts\\DataTables\\Rows\\Row' => $vendorDir . '/khill/lavacharts/src/DataTables/Rows/Row.php',
'Khill\\Lavacharts\\DataTables\\Rows\\RowFactory' => $vendorDir . '/khill/lavacharts/src/DataTables/Rows/RowFactory.php',
'Khill\\Lavacharts\\Exceptions\\ChartNotFound' => $vendorDir . '/khill/lavacharts/src/Exceptions/ChartNotFound.php',
'Khill\\Lavacharts\\Exceptions\\DashboardNotFound' => $vendorDir . '/khill/lavacharts/src/Exceptions/DashboardNotFound.php',
'Khill\\Lavacharts\\Exceptions\\DataTableNotFound' => $vendorDir . '/khill/lavacharts/src/Exceptions/DataTableNotFound.php',
'Khill\\Lavacharts\\Exceptions\\ElementIdException' => $vendorDir . '/khill/lavacharts/src/Exceptions/ElementIdException.php',
'Khill\\Lavacharts\\Exceptions\\InvalidBindings' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidBindings.php',
'Khill\\Lavacharts\\Exceptions\\InvalidCellCount' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidCellCount.php',
'Khill\\Lavacharts\\Exceptions\\InvalidChartType' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidChartType.php',
'Khill\\Lavacharts\\Exceptions\\InvalidChartWrapperParams' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidChartWrapperParams.php',
'Khill\\Lavacharts\\Exceptions\\InvalidColumnDefinition' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidColumnDefinition.php',
'Khill\\Lavacharts\\Exceptions\\InvalidColumnFormat' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidColumnFormat.php',
'Khill\\Lavacharts\\Exceptions\\InvalidColumnIndex' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidColumnIndex.php',
'Khill\\Lavacharts\\Exceptions\\InvalidColumnRole' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidColumnRole.php',
'Khill\\Lavacharts\\Exceptions\\InvalidColumnType' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidColumnType.php',
'Khill\\Lavacharts\\Exceptions\\InvalidConfigProperty' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidConfigProperty.php',
'Khill\\Lavacharts\\Exceptions\\InvalidConfigValue' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidConfigValue.php',
'Khill\\Lavacharts\\Exceptions\\InvalidControlWrapperParams' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidControlWrapperParams.php',
'Khill\\Lavacharts\\Exceptions\\InvalidDataTable' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidDataTable.php',
'Khill\\Lavacharts\\Exceptions\\InvalidDate' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidDate.php',
'Khill\\Lavacharts\\Exceptions\\InvalidDateTimeFormat' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidDateTimeFormat.php',
'Khill\\Lavacharts\\Exceptions\\InvalidDateTimeString' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidDateTimeString.php',
'Khill\\Lavacharts\\Exceptions\\InvalidDivDimensions' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidDivDimensions.php',
'Khill\\Lavacharts\\Exceptions\\InvalidElementId' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidElementId.php',
'Khill\\Lavacharts\\Exceptions\\InvalidFilterParam' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidFilterParam.php',
'Khill\\Lavacharts\\Exceptions\\InvalidFilterType' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidFilterType.php',
'Khill\\Lavacharts\\Exceptions\\InvalidFormatType' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidFormatType.php',
'Khill\\Lavacharts\\Exceptions\\InvalidFunctionParam' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidFunctionParam.php',
'Khill\\Lavacharts\\Exceptions\\InvalidJson' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidJson.php',
'Khill\\Lavacharts\\Exceptions\\InvalidLabel' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidLabel.php',
'Khill\\Lavacharts\\Exceptions\\InvalidLavaObject' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidLavaObject.php',
'Khill\\Lavacharts\\Exceptions\\InvalidOptions' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidOptions.php',
'Khill\\Lavacharts\\Exceptions\\InvalidParamType' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidParamType.php',
'Khill\\Lavacharts\\Exceptions\\InvalidRowDefinition' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidRowDefinition.php',
'Khill\\Lavacharts\\Exceptions\\InvalidRowProperty' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidRowProperty.php',
'Khill\\Lavacharts\\Exceptions\\InvalidStringValue' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidStringValue.php',
'Khill\\Lavacharts\\Exceptions\\InvalidTimeZone' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidTimeZone.php',
'Khill\\Lavacharts\\Exceptions\\InvalidUIProperty' => $vendorDir . '/khill/lavacharts/src/Exceptions/InvalidUIProperty.php',
'Khill\\Lavacharts\\Exceptions\\LavaException' => $vendorDir . '/khill/lavacharts/src/Exceptions/LavaException.php',
'Khill\\Lavacharts\\Exceptions\\RenderingException' => $vendorDir . '/khill/lavacharts/src/Exceptions/RenderingException.php',
'Khill\\Lavacharts\\Javascript\\ChartJsFactory' => $vendorDir . '/khill/lavacharts/src/Javascript/ChartJsFactory.php',
'Khill\\Lavacharts\\Javascript\\DashboardJsFactory' => $vendorDir . '/khill/lavacharts/src/Javascript/DashboardJsFactory.php',
'Khill\\Lavacharts\\Javascript\\JavascriptFactory' => $vendorDir . '/khill/lavacharts/src/Javascript/JavascriptFactory.php',
'Khill\\Lavacharts\\Javascript\\ScriptManager' => $vendorDir . '/khill/lavacharts/src/Javascript/ScriptManager.php',
'Khill\\Lavacharts\\Laravel\\LavachartsFacade' => $vendorDir . '/khill/lavacharts/src/Laravel/LavachartsFacade.php',
'Khill\\Lavacharts\\Laravel\\LavachartsServiceProvider' => $vendorDir . '/khill/lavacharts/src/Laravel/LavachartsServiceProvider.php',
'Khill\\Lavacharts\\Lavacharts' => $vendorDir . '/khill/lavacharts/src/Lavacharts.php',
'Khill\\Lavacharts\\Support\\Buffer' => $vendorDir . '/khill/lavacharts/src/Support/Buffer.php',
'Khill\\Lavacharts\\Support\\Config' => $vendorDir . '/khill/lavacharts/src/Support/Config.php',
'Khill\\Lavacharts\\Support\\Contracts\\Arrayable' => $vendorDir . '/khill/lavacharts/src/Support/Contracts/Arrayable.php',
'Khill\\Lavacharts\\Support\\Contracts\\DataTableInterface' => $vendorDir . '/khill/lavacharts/src/Support/Contracts/DataTableInterface.php',
'Khill\\Lavacharts\\Support\\Contracts\\JsClassInterface' => $vendorDir . '/khill/lavacharts/src/Support/Contracts/JsClassInterface.php',
'Khill\\Lavacharts\\Support\\Contracts\\Jsonable' => $vendorDir . '/khill/lavacharts/src/Support/Contracts/Jsonable.php',
'Khill\\Lavacharts\\Support\\Contracts\\JsonableInterface' => $vendorDir . '/khill/lavacharts/src/Support/Contracts/JsonableInterface.php',
'Khill\\Lavacharts\\Support\\Contracts\\RenderableInterface' => $vendorDir . '/khill/lavacharts/src/Support/Contracts/RenderableInterface.php',
'Khill\\Lavacharts\\Support\\Contracts\\VisualizationInterface' => $vendorDir . '/khill/lavacharts/src/Support/Contracts/VisualizationInterface.php',
'Khill\\Lavacharts\\Support\\Contracts\\WrappableInterface' => $vendorDir . '/khill/lavacharts/src/Support/Contracts/WrappableInterface.php',
'Khill\\Lavacharts\\Support\\Customizable' => $vendorDir . '/khill/lavacharts/src/Support/Customizable.php',
'Khill\\Lavacharts\\Support\\Html\\HtmlFactory' => $vendorDir . '/khill/lavacharts/src/Support/Html/HtmlFactory.php',
'Khill\\Lavacharts\\Support\\JavascriptDate' => $vendorDir . '/khill/lavacharts/src/Support/JavascriptDate.php',
'Khill\\Lavacharts\\Support\\Options' => $vendorDir . '/khill/lavacharts/src/Support/Options.php',
'Khill\\Lavacharts\\Support\\Psr4Autoloader' => $vendorDir . '/khill/lavacharts/src/Support/Psr4Autoloader.php',
'Khill\\Lavacharts\\Support\\RenderableTrait' => $vendorDir . '/khill/lavacharts/src/Support/Renderable.php',
'Khill\\Lavacharts\\Support\\Traits\\DataTableTrait' => $vendorDir . '/khill/lavacharts/src/Support/Traits/DataTableTrait.php',
'Khill\\Lavacharts\\Support\\Traits\\ElementIdTrait' => $vendorDir . '/khill/lavacharts/src/Support/Traits/ElementIdTrait.php',
'Khill\\Lavacharts\\Support\\Traits\\HasOptionsTrait' => $vendorDir . '/khill/lavacharts/src/Support/Traits/HasOptionsTrait.php',
'Khill\\Lavacharts\\Support\\Traits\\MaterialRenderableTrait' => $vendorDir . '/khill/lavacharts/src/Support/Traits/MaterialRenderableTrait.php',
'Khill\\Lavacharts\\Support\\Traits\\ParameterValidatorsTrait' => $vendorDir . '/khill/lavacharts/src/Support/Traits/ParameterValidatorsTrait.php',
'Khill\\Lavacharts\\Support\\Traits\\PngRenderableTrait' => $vendorDir . '/khill/lavacharts/src/Support/Traits/PngRenderableTrait.php',
'Khill\\Lavacharts\\Support\\Traits\\RenderableTrait' => $vendorDir . '/khill/lavacharts/src/Support/Traits/RenderableTrait.php',
'Khill\\Lavacharts\\Symfony\\Bundle\\LavachartsBundle' => $vendorDir . '/khill/lavacharts/src/Symfony/Bundle/LavachartsBundle.php',
'Khill\\Lavacharts\\Symfony\\Bundle\\Twig\\LavachartsExtension' => $vendorDir . '/khill/lavacharts/src/Symfony/Bundle/Twig/LavachartsExtension.php',
'Khill\\Lavacharts\\Values\\ElementId' => $vendorDir . '/khill/lavacharts/src/Values/ElementId.php',
'Khill\\Lavacharts\\Values\\Label' => $vendorDir . '/khill/lavacharts/src/Values/Label.php',
'Khill\\Lavacharts\\Values\\Role' => $vendorDir . '/khill/lavacharts/src/Values/Role.php',
'Khill\\Lavacharts\\Values\\StringValue' => $vendorDir . '/khill/lavacharts/src/Values/StringValue.php',
'Khill\\Lavacharts\\Volcano' => $vendorDir . '/khill/lavacharts/src/Volcano.php',
'Laravel\\Horizon\\AutoScaler' => $vendorDir . '/laravel/horizon/src/AutoScaler.php',
'Laravel\\Horizon\\BackgroundProcess' => $vendorDir . '/laravel/horizon/src/BackgroundProcess.php',
'Laravel\\Horizon\\Connectors\\RedisConnector' => $vendorDir . '/laravel/horizon/src/Connectors/RedisConnector.php',
'Laravel\\Horizon\\Console\\AssetsCommand' => $vendorDir . '/laravel/horizon/src/Console/AssetsCommand.php',
'Laravel\\Horizon\\Console\\ContinueCommand' => $vendorDir . '/laravel/horizon/src/Console/ContinueCommand.php',
'Laravel\\Horizon\\Console\\HorizonCommand' => $vendorDir . '/laravel/horizon/src/Console/HorizonCommand.php',
'Laravel\\Horizon\\Console\\InstallCommand' => $vendorDir . '/laravel/horizon/src/Console/InstallCommand.php',
'Laravel\\Horizon\\Console\\ListCommand' => $vendorDir . '/laravel/horizon/src/Console/ListCommand.php',
'Laravel\\Horizon\\Console\\PauseCommand' => $vendorDir . '/laravel/horizon/src/Console/PauseCommand.php',
'Laravel\\Horizon\\Console\\PurgeCommand' => $vendorDir . '/laravel/horizon/src/Console/PurgeCommand.php',
'Laravel\\Horizon\\Console\\SnapshotCommand' => $vendorDir . '/laravel/horizon/src/Console/SnapshotCommand.php',
'Laravel\\Horizon\\Console\\StatusCommand' => $vendorDir . '/laravel/horizon/src/Console/StatusCommand.php',
'Laravel\\Horizon\\Console\\SupervisorCommand' => $vendorDir . '/laravel/horizon/src/Console/SupervisorCommand.php',
'Laravel\\Horizon\\Console\\SupervisorsCommand' => $vendorDir . '/laravel/horizon/src/Console/SupervisorsCommand.php',
'Laravel\\Horizon\\Console\\TerminateCommand' => $vendorDir . '/laravel/horizon/src/Console/TerminateCommand.php',
'Laravel\\Horizon\\Console\\TimeoutCommand' => $vendorDir . '/laravel/horizon/src/Console/TimeoutCommand.php',
'Laravel\\Horizon\\Console\\WorkCommand' => $vendorDir . '/laravel/horizon/src/Console/WorkCommand.php',
'Laravel\\Horizon\\Contracts\\HorizonCommandQueue' => $vendorDir . '/laravel/horizon/src/Contracts/HorizonCommandQueue.php',
'Laravel\\Horizon\\Contracts\\JobRepository' => $vendorDir . '/laravel/horizon/src/Contracts/JobRepository.php',
'Laravel\\Horizon\\Contracts\\MasterSupervisorRepository' => $vendorDir . '/laravel/horizon/src/Contracts/MasterSupervisorRepository.php',
'Laravel\\Horizon\\Contracts\\MetricsRepository' => $vendorDir . '/laravel/horizon/src/Contracts/MetricsRepository.php',
'Laravel\\Horizon\\Contracts\\Pausable' => $vendorDir . '/laravel/horizon/src/Contracts/Pausable.php',
'Laravel\\Horizon\\Contracts\\ProcessRepository' => $vendorDir . '/laravel/horizon/src/Contracts/ProcessRepository.php',
'Laravel\\Horizon\\Contracts\\Restartable' => $vendorDir . '/laravel/horizon/src/Contracts/Restartable.php',
'Laravel\\Horizon\\Contracts\\SupervisorRepository' => $vendorDir . '/laravel/horizon/src/Contracts/SupervisorRepository.php',
'Laravel\\Horizon\\Contracts\\TagRepository' => $vendorDir . '/laravel/horizon/src/Contracts/TagRepository.php',
'Laravel\\Horizon\\Contracts\\Terminable' => $vendorDir . '/laravel/horizon/src/Contracts/Terminable.php',
'Laravel\\Horizon\\Contracts\\WorkloadRepository' => $vendorDir . '/laravel/horizon/src/Contracts/WorkloadRepository.php',
'Laravel\\Horizon\\EventMap' => $vendorDir . '/laravel/horizon/src/EventMap.php',
'Laravel\\Horizon\\Events\\JobDeleted' => $vendorDir . '/laravel/horizon/src/Events/JobDeleted.php',
'Laravel\\Horizon\\Events\\JobFailed' => $vendorDir . '/laravel/horizon/src/Events/JobFailed.php',
'Laravel\\Horizon\\Events\\JobPushed' => $vendorDir . '/laravel/horizon/src/Events/JobPushed.php',
'Laravel\\Horizon\\Events\\JobReleased' => $vendorDir . '/laravel/horizon/src/Events/JobReleased.php',
'Laravel\\Horizon\\Events\\JobReserved' => $vendorDir . '/laravel/horizon/src/Events/JobReserved.php',
'Laravel\\Horizon\\Events\\JobsMigrated' => $vendorDir . '/laravel/horizon/src/Events/JobsMigrated.php',
'Laravel\\Horizon\\Events\\LongWaitDetected' => $vendorDir . '/laravel/horizon/src/Events/LongWaitDetected.php',
'Laravel\\Horizon\\Events\\MasterSupervisorDeployed' => $vendorDir . '/laravel/horizon/src/Events/MasterSupervisorDeployed.php',
'Laravel\\Horizon\\Events\\MasterSupervisorLooped' => $vendorDir . '/laravel/horizon/src/Events/MasterSupervisorLooped.php',
'Laravel\\Horizon\\Events\\MasterSupervisorReviving' => $vendorDir . '/laravel/horizon/src/Events/MasterSupervisorReviving.php',
'Laravel\\Horizon\\Events\\RedisEvent' => $vendorDir . '/laravel/horizon/src/Events/RedisEvent.php',
'Laravel\\Horizon\\Events\\SupervisorLooped' => $vendorDir . '/laravel/horizon/src/Events/SupervisorLooped.php',
'Laravel\\Horizon\\Events\\SupervisorProcessRestarting' => $vendorDir . '/laravel/horizon/src/Events/SupervisorProcessRestarting.php',
'Laravel\\Horizon\\Events\\UnableToLaunchProcess' => $vendorDir . '/laravel/horizon/src/Events/UnableToLaunchProcess.php',
'Laravel\\Horizon\\Events\\WorkerProcessRestarting' => $vendorDir . '/laravel/horizon/src/Events/WorkerProcessRestarting.php',
'Laravel\\Horizon\\Exec' => $vendorDir . '/laravel/horizon/src/Exec.php',
'Laravel\\Horizon\\Horizon' => $vendorDir . '/laravel/horizon/src/Horizon.php',
'Laravel\\Horizon\\HorizonApplicationServiceProvider' => $vendorDir . '/laravel/horizon/src/HorizonApplicationServiceProvider.php',
'Laravel\\Horizon\\HorizonServiceProvider' => $vendorDir . '/laravel/horizon/src/HorizonServiceProvider.php',
'Laravel\\Horizon\\Http\\Controllers\\Controller' => $vendorDir . '/laravel/horizon/src/Http/Controllers/Controller.php',
'Laravel\\Horizon\\Http\\Controllers\\DashboardStatsController' => $vendorDir . '/laravel/horizon/src/Http/Controllers/DashboardStatsController.php',
'Laravel\\Horizon\\Http\\Controllers\\FailedJobsController' => $vendorDir . '/laravel/horizon/src/Http/Controllers/FailedJobsController.php',
'Laravel\\Horizon\\Http\\Controllers\\HomeController' => $vendorDir . '/laravel/horizon/src/Http/Controllers/HomeController.php',
'Laravel\\Horizon\\Http\\Controllers\\JobMetricsController' => $vendorDir . '/laravel/horizon/src/Http/Controllers/JobMetricsController.php',
'Laravel\\Horizon\\Http\\Controllers\\MasterSupervisorController' => $vendorDir . '/laravel/horizon/src/Http/Controllers/MasterSupervisorController.php',
'Laravel\\Horizon\\Http\\Controllers\\MonitoringController' => $vendorDir . '/laravel/horizon/src/Http/Controllers/MonitoringController.php',
'Laravel\\Horizon\\Http\\Controllers\\QueueMetricsController' => $vendorDir . '/laravel/horizon/src/Http/Controllers/QueueMetricsController.php',
'Laravel\\Horizon\\Http\\Controllers\\RecentJobsController' => $vendorDir . '/laravel/horizon/src/Http/Controllers/RecentJobsController.php',
'Laravel\\Horizon\\Http\\Controllers\\RetryController' => $vendorDir . '/laravel/horizon/src/Http/Controllers/RetryController.php',
'Laravel\\Horizon\\Http\\Controllers\\WorkloadController' => $vendorDir . '/laravel/horizon/src/Http/Controllers/WorkloadController.php',
'Laravel\\Horizon\\Http\\Middleware\\Authenticate' => $vendorDir . '/laravel/horizon/src/Http/Middleware/Authenticate.php',
'Laravel\\Horizon\\JobId' => $vendorDir . '/laravel/horizon/src/JobId.php',
'Laravel\\Horizon\\JobPayload' => $vendorDir . '/laravel/horizon/src/JobPayload.php',
'Laravel\\Horizon\\Jobs\\MonitorTag' => $vendorDir . '/laravel/horizon/src/Jobs/MonitorTag.php',
'Laravel\\Horizon\\Jobs\\RetryFailedJob' => $vendorDir . '/laravel/horizon/src/Jobs/RetryFailedJob.php',
'Laravel\\Horizon\\Jobs\\StopMonitoringTag' => $vendorDir . '/laravel/horizon/src/Jobs/StopMonitoringTag.php',
'Laravel\\Horizon\\Listeners\\ExpireSupervisors' => $vendorDir . '/laravel/horizon/src/Listeners/ExpireSupervisors.php',
'Laravel\\Horizon\\Listeners\\MarkJobAsComplete' => $vendorDir . '/laravel/horizon/src/Listeners/MarkJobAsComplete.php',
'Laravel\\Horizon\\Listeners\\MarkJobAsFailed' => $vendorDir . '/laravel/horizon/src/Listeners/MarkJobAsFailed.php',
'Laravel\\Horizon\\Listeners\\MarkJobAsReleased' => $vendorDir . '/laravel/horizon/src/Listeners/MarkJobAsReleased.php',
'Laravel\\Horizon\\Listeners\\MarkJobAsReserved' => $vendorDir . '/laravel/horizon/src/Listeners/MarkJobAsReserved.php',
'Laravel\\Horizon\\Listeners\\MarkJobsAsMigrated' => $vendorDir . '/laravel/horizon/src/Listeners/MarkJobsAsMigrated.php',
'Laravel\\Horizon\\Listeners\\MarshalFailedEvent' => $vendorDir . '/laravel/horizon/src/Listeners/MarshalFailedEvent.php',
'Laravel\\Horizon\\Listeners\\MonitorMasterSupervisorMemory' => $vendorDir . '/laravel/horizon/src/Listeners/MonitorMasterSupervisorMemory.php',
'Laravel\\Horizon\\Listeners\\MonitorSupervisorMemory' => $vendorDir . '/laravel/horizon/src/Listeners/MonitorSupervisorMemory.php',
'Laravel\\Horizon\\Listeners\\MonitorWaitTimes' => $vendorDir . '/laravel/horizon/src/Listeners/MonitorWaitTimes.php',
'Laravel\\Horizon\\Listeners\\PruneTerminatingProcesses' => $vendorDir . '/laravel/horizon/src/Listeners/PruneTerminatingProcesses.php',
'Laravel\\Horizon\\Listeners\\SendNotification' => $vendorDir . '/laravel/horizon/src/Listeners/SendNotification.php',
'Laravel\\Horizon\\Listeners\\StartTimingJob' => $vendorDir . '/laravel/horizon/src/Listeners/StartTimingJob.php',
'Laravel\\Horizon\\Listeners\\StoreJob' => $vendorDir . '/laravel/horizon/src/Listeners/StoreJob.php',
'Laravel\\Horizon\\Listeners\\StoreMonitoredTags' => $vendorDir . '/laravel/horizon/src/Listeners/StoreMonitoredTags.php',
'Laravel\\Horizon\\Listeners\\StoreTagsForFailedJob' => $vendorDir . '/laravel/horizon/src/Listeners/StoreTagsForFailedJob.php',
'Laravel\\Horizon\\Listeners\\TrimFailedJobs' => $vendorDir . '/laravel/horizon/src/Listeners/TrimFailedJobs.php',
'Laravel\\Horizon\\Listeners\\TrimMonitoredJobs' => $vendorDir . '/laravel/horizon/src/Listeners/TrimMonitoredJobs.php',
'Laravel\\Horizon\\Listeners\\TrimRecentJobs' => $vendorDir . '/laravel/horizon/src/Listeners/TrimRecentJobs.php',
'Laravel\\Horizon\\Listeners\\UpdateJobMetrics' => $vendorDir . '/laravel/horizon/src/Listeners/UpdateJobMetrics.php',
'Laravel\\Horizon\\ListensForSignals' => $vendorDir . '/laravel/horizon/src/ListensForSignals.php',
'Laravel\\Horizon\\Lock' => $vendorDir . '/laravel/horizon/src/Lock.php',
'Laravel\\Horizon\\LuaScripts' => $vendorDir . '/laravel/horizon/src/LuaScripts.php',
'Laravel\\Horizon\\MasterSupervisor' => $vendorDir . '/laravel/horizon/src/MasterSupervisor.php',
'Laravel\\Horizon\\MasterSupervisorCommands\\AddSupervisor' => $vendorDir . '/laravel/horizon/src/MasterSupervisorCommands/AddSupervisor.php',
'Laravel\\Horizon\\Notifications\\LongWaitDetected' => $vendorDir . '/laravel/horizon/src/Notifications/LongWaitDetected.php',
'Laravel\\Horizon\\PhpBinary' => $vendorDir . '/laravel/horizon/src/PhpBinary.php',
'Laravel\\Horizon\\ProcessInspector' => $vendorDir . '/laravel/horizon/src/ProcessInspector.php',
'Laravel\\Horizon\\ProcessPool' => $vendorDir . '/laravel/horizon/src/ProcessPool.php',
'Laravel\\Horizon\\ProvisioningPlan' => $vendorDir . '/laravel/horizon/src/ProvisioningPlan.php',
'Laravel\\Horizon\\QueueCommandString' => $vendorDir . '/laravel/horizon/src/QueueCommandString.php',
'Laravel\\Horizon\\RedisHorizonCommandQueue' => $vendorDir . '/laravel/horizon/src/RedisHorizonCommandQueue.php',
'Laravel\\Horizon\\RedisQueue' => $vendorDir . '/laravel/horizon/src/RedisQueue.php',
'Laravel\\Horizon\\Repositories\\RedisJobRepository' => $vendorDir . '/laravel/horizon/src/Repositories/RedisJobRepository.php',
'Laravel\\Horizon\\Repositories\\RedisMasterSupervisorRepository' => $vendorDir . '/laravel/horizon/src/Repositories/RedisMasterSupervisorRepository.php',
'Laravel\\Horizon\\Repositories\\RedisMetricsRepository' => $vendorDir . '/laravel/horizon/src/Repositories/RedisMetricsRepository.php',
'Laravel\\Horizon\\Repositories\\RedisProcessRepository' => $vendorDir . '/laravel/horizon/src/Repositories/RedisProcessRepository.php',
'Laravel\\Horizon\\Repositories\\RedisSupervisorRepository' => $vendorDir . '/laravel/horizon/src/Repositories/RedisSupervisorRepository.php',
'Laravel\\Horizon\\Repositories\\RedisTagRepository' => $vendorDir . '/laravel/horizon/src/Repositories/RedisTagRepository.php',
'Laravel\\Horizon\\Repositories\\RedisWorkloadRepository' => $vendorDir . '/laravel/horizon/src/Repositories/RedisWorkloadRepository.php',
'Laravel\\Horizon\\ServiceBindings' => $vendorDir . '/laravel/horizon/src/ServiceBindings.php',
'Laravel\\Horizon\\Stopwatch' => $vendorDir . '/laravel/horizon/src/Stopwatch.php',
'Laravel\\Horizon\\Supervisor' => $vendorDir . '/laravel/horizon/src/Supervisor.php',
'Laravel\\Horizon\\SupervisorCommandString' => $vendorDir . '/laravel/horizon/src/SupervisorCommandString.php',
'Laravel\\Horizon\\SupervisorCommands\\Balance' => $vendorDir . '/laravel/horizon/src/SupervisorCommands/Balance.php',
'Laravel\\Horizon\\SupervisorCommands\\ContinueWorking' => $vendorDir . '/laravel/horizon/src/SupervisorCommands/ContinueWorking.php',
'Laravel\\Horizon\\SupervisorCommands\\Pause' => $vendorDir . '/laravel/horizon/src/SupervisorCommands/Pause.php',
'Laravel\\Horizon\\SupervisorCommands\\Restart' => $vendorDir . '/laravel/horizon/src/SupervisorCommands/Restart.php',
'Laravel\\Horizon\\SupervisorCommands\\Scale' => $vendorDir . '/laravel/horizon/src/SupervisorCommands/Scale.php',
'Laravel\\Horizon\\SupervisorCommands\\Terminate' => $vendorDir . '/laravel/horizon/src/SupervisorCommands/Terminate.php',
'Laravel\\Horizon\\SupervisorFactory' => $vendorDir . '/laravel/horizon/src/SupervisorFactory.php',
'Laravel\\Horizon\\SupervisorOptions' => $vendorDir . '/laravel/horizon/src/SupervisorOptions.php',
'Laravel\\Horizon\\SupervisorProcess' => $vendorDir . '/laravel/horizon/src/SupervisorProcess.php',
'Laravel\\Horizon\\SystemProcessCounter' => $vendorDir . '/laravel/horizon/src/SystemProcessCounter.php',
'Laravel\\Horizon\\Tags' => $vendorDir . '/laravel/horizon/src/Tags.php',
'Laravel\\Horizon\\WaitTimeCalculator' => $vendorDir . '/laravel/horizon/src/WaitTimeCalculator.php',
'Laravel\\Horizon\\WorkerCommandString' => $vendorDir . '/laravel/horizon/src/WorkerCommandString.php',
'Laravel\\Horizon\\WorkerProcess' => $vendorDir . '/laravel/horizon/src/WorkerProcess.php',
'Laravel\\Socialite\\AbstractUser' => $vendorDir . '/laravel/socialite/src/AbstractUser.php',
'Laravel\\Socialite\\Contracts\\Factory' => $vendorDir . '/laravel/socialite/src/Contracts/Factory.php',
'Laravel\\Socialite\\Contracts\\Provider' => $vendorDir . '/laravel/socialite/src/Contracts/Provider.php',

View File

@@ -21,6 +21,7 @@ return array(
'538ca81a9a966a6716601ecf48f4eaef' => $vendorDir . '/opis/closure/functions.php',
'f0906e6318348a765ffb6eb24e0d0938' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/helpers.php',
'58571171fd5812e6e447dce228f52f4d' => $vendorDir . '/laravel/framework/src/Illuminate/Support/helpers.php',
'34122c0574b76bf21c9a8db62b5b9cf3' => $vendorDir . '/cakephp/chronos/src/carbon_compat.php',
'9cdd7b9056abc3081735233ba9dd9c7f' => $vendorDir . '/facade/flare-client-php/src/helpers.php',
'6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
'801c31d8ed748cfa537fa45402288c95' => $vendorDir . '/psy/psysh/src/functions.php',

View File

@@ -50,6 +50,8 @@ return array(
'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'),
'Laravel\\Tinker\\' => array($vendorDir . '/laravel/tinker/src'),
'Laravel\\Socialite\\' => array($vendorDir . '/laravel/socialite/src'),
'Laravel\\Horizon\\' => array($vendorDir . '/laravel/horizon/src'),
'Khill\\Lavacharts\\' => array($vendorDir . '/khill/lavacharts/src'),
'JakubOnderka\\PhpConsoleHighlighter\\' => array($vendorDir . '/jakub-onderka/php-console-highlighter/src'),
'JakubOnderka\\PhpConsoleColor\\' => array($vendorDir . '/jakub-onderka/php-console-color/src'),
'Illuminate\\' => array($vendorDir . '/laravel/framework/src/Illuminate'),
@@ -71,6 +73,7 @@ return array(
'Cron\\' => array($vendorDir . '/dragonmantank/cron-expression/src/Cron'),
'Collective\\Html\\' => array($vendorDir . '/laravelcollective/html/src'),
'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'),
'Cake\\Chronos\\' => array($vendorDir . '/cakephp/chronos/src'),
'Barryvdh\\Debugbar\\' => array($vendorDir . '/barryvdh/laravel-debugbar/src'),
'App\\' => array($baseDir . '/app'),
);

View File

@@ -22,6 +22,7 @@ class ComposerStaticInit33afb8ba5b252c3933eb137784fa7f04
'538ca81a9a966a6716601ecf48f4eaef' => __DIR__ . '/..' . '/opis/closure/functions.php',
'f0906e6318348a765ffb6eb24e0d0938' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/helpers.php',
'58571171fd5812e6e447dce228f52f4d' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/helpers.php',
'34122c0574b76bf21c9a8db62b5b9cf3' => __DIR__ . '/..' . '/cakephp/chronos/src/carbon_compat.php',
'9cdd7b9056abc3081735233ba9dd9c7f' => __DIR__ . '/..' . '/facade/flare-client-php/src/helpers.php',
'6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
'801c31d8ed748cfa537fa45402288c95' => __DIR__ . '/..' . '/psy/psysh/src/functions.php',
@@ -108,6 +109,11 @@ class ComposerStaticInit33afb8ba5b252c3933eb137784fa7f04
'League\\Flysystem\\' => 17,
'Laravel\\Tinker\\' => 15,
'Laravel\\Socialite\\' => 18,
'Laravel\\Horizon\\' => 16,
),
'K' =>
array (
'Khill\\Lavacharts\\' => 17,
),
'J' =>
array (
@@ -150,6 +156,7 @@ class ComposerStaticInit33afb8ba5b252c3933eb137784fa7f04
'Cron\\' => 5,
'Collective\\Html\\' => 16,
'Carbon\\' => 7,
'Cake\\Chronos\\' => 13,
),
'B' =>
array (
@@ -340,6 +347,14 @@ class ComposerStaticInit33afb8ba5b252c3933eb137784fa7f04
array (
0 => __DIR__ . '/..' . '/laravel/socialite/src',
),
'Laravel\\Horizon\\' =>
array (
0 => __DIR__ . '/..' . '/laravel/horizon/src',
),
'Khill\\Lavacharts\\' =>
array (
0 => __DIR__ . '/..' . '/khill/lavacharts/src',
),
'JakubOnderka\\PhpConsoleHighlighter\\' =>
array (
0 => __DIR__ . '/..' . '/jakub-onderka/php-console-highlighter/src',
@@ -424,6 +439,10 @@ class ComposerStaticInit33afb8ba5b252c3933eb137784fa7f04
array (
0 => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon',
),
'Cake\\Chronos\\' =>
array (
0 => __DIR__ . '/..' . '/cakephp/chronos/src',
),
'Barryvdh\\Debugbar\\' =>
array (
0 => __DIR__ . '/..' . '/barryvdh/laravel-debugbar/src',
@@ -505,6 +524,7 @@ class ComposerStaticInit33afb8ba5b252c3933eb137784fa7f04
'App\\Providers\\EveOnlineOAuthProvider' => __DIR__ . '/../..' . '/app/Providers/EveOnlineOAuthProvider.php',
'App\\Providers\\EveOnlineOAuthServiceProvider' => __DIR__ . '/../..' . '/app/Providers/EveOnlineOAuthServiceProvider.php',
'App\\Providers\\EventServiceProvider' => __DIR__ . '/../..' . '/app/Providers/EventServiceProvider.php',
'App\\Providers\\HorizonServiceProvider' => __DIR__ . '/../..' . '/app/Providers/HorizonServiceProvider.php',
'App\\Providers\\RouteServiceProvider' => __DIR__ . '/../..' . '/app/Providers/RouteServiceProvider.php',
'App\\SolarSystemDistance' => __DIR__ . '/../..' . '/app/Models/Lookups/SolarSystemDistance.php',
'App\\User' => __DIR__ . '/../..' . '/app/Models/User/User.php',
@@ -545,6 +565,25 @@ class ComposerStaticInit33afb8ba5b252c3933eb137784fa7f04
'Barryvdh\\Debugbar\\Twig\\Extension\\Stopwatch' => __DIR__ . '/..' . '/barryvdh/laravel-debugbar/src/Twig/Extension/Stopwatch.php',
'Barryvdh\\Debugbar\\Twig\\Node\\StopwatchNode' => __DIR__ . '/..' . '/barryvdh/laravel-debugbar/src/Twig/Node/StopwatchNode.php',
'Barryvdh\\Debugbar\\Twig\\TokenParser\\StopwatchTokenParser' => __DIR__ . '/..' . '/barryvdh/laravel-debugbar/src/Twig/TokenParser/StopwatchTokenParser.php',
'Cake\\Chronos\\Chronos' => __DIR__ . '/..' . '/cakephp/chronos/src/Chronos.php',
'Cake\\Chronos\\ChronosInterface' => __DIR__ . '/..' . '/cakephp/chronos/src/ChronosInterface.php',
'Cake\\Chronos\\ChronosInterval' => __DIR__ . '/..' . '/cakephp/chronos/src/ChronosInterval.php',
'Cake\\Chronos\\Date' => __DIR__ . '/..' . '/cakephp/chronos/src/Date.php',
'Cake\\Chronos\\DifferenceFormatter' => __DIR__ . '/..' . '/cakephp/chronos/src/DifferenceFormatter.php',
'Cake\\Chronos\\MutableDate' => __DIR__ . '/..' . '/cakephp/chronos/src/MutableDate.php',
'Cake\\Chronos\\MutableDateTime' => __DIR__ . '/..' . '/cakephp/chronos/src/MutableDateTime.php',
'Cake\\Chronos\\Traits\\ComparisonTrait' => __DIR__ . '/..' . '/cakephp/chronos/src/Traits/ComparisonTrait.php',
'Cake\\Chronos\\Traits\\CopyTrait' => __DIR__ . '/..' . '/cakephp/chronos/src/Traits/CopyTrait.php',
'Cake\\Chronos\\Traits\\DifferenceTrait' => __DIR__ . '/..' . '/cakephp/chronos/src/Traits/DifferenceTrait.php',
'Cake\\Chronos\\Traits\\FactoryTrait' => __DIR__ . '/..' . '/cakephp/chronos/src/Traits/FactoryTrait.php',
'Cake\\Chronos\\Traits\\FormattingTrait' => __DIR__ . '/..' . '/cakephp/chronos/src/Traits/FormattingTrait.php',
'Cake\\Chronos\\Traits\\FrozenTimeTrait' => __DIR__ . '/..' . '/cakephp/chronos/src/Traits/FrozenTimeTrait.php',
'Cake\\Chronos\\Traits\\MagicPropertyTrait' => __DIR__ . '/..' . '/cakephp/chronos/src/Traits/MagicPropertyTrait.php',
'Cake\\Chronos\\Traits\\ModifierTrait' => __DIR__ . '/..' . '/cakephp/chronos/src/Traits/ModifierTrait.php',
'Cake\\Chronos\\Traits\\RelativeKeywordTrait' => __DIR__ . '/..' . '/cakephp/chronos/src/Traits/RelativeKeywordTrait.php',
'Cake\\Chronos\\Traits\\TestingAidTrait' => __DIR__ . '/..' . '/cakephp/chronos/src/Traits/TestingAidTrait.php',
'Cake\\Chronos\\Traits\\TimezoneTrait' => __DIR__ . '/..' . '/cakephp/chronos/src/Traits/TimezoneTrait.php',
'Cake\\Chronos\\Translator' => __DIR__ . '/..' . '/cakephp/chronos/src/Translator.php',
'Carbon\\Carbon' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Carbon.php',
'Carbon\\CarbonImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonImmutable.php',
'Carbon\\CarbonInterface' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonInterface.php',
@@ -2303,6 +2342,266 @@ class ComposerStaticInit33afb8ba5b252c3933eb137784fa7f04
'JakubOnderka\\PhpConsoleColor\\InvalidStyleException' => __DIR__ . '/..' . '/jakub-onderka/php-console-color/src/InvalidStyleException.php',
'JakubOnderka\\PhpConsoleHighlighter\\Highlighter' => __DIR__ . '/..' . '/jakub-onderka/php-console-highlighter/src/Highlighter.php',
'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
'Khill\\Lavacharts\\Builders\\ChartBuilder' => __DIR__ . '/..' . '/khill/lavacharts/src/Builders/ChartBuilder.php',
'Khill\\Lavacharts\\Builders\\DashboardBuilder' => __DIR__ . '/..' . '/khill/lavacharts/src/Builders/DashboardBuilder.php',
'Khill\\Lavacharts\\Builders\\GenericBuilder' => __DIR__ . '/..' . '/khill/lavacharts/src/Builders/GenericBuilder.php',
'Khill\\Lavacharts\\Charts\\AnnotationChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/AnnotationChart.php',
'Khill\\Lavacharts\\Charts\\AreaChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/AreaChart.php',
'Khill\\Lavacharts\\Charts\\BarChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/BarChart.php',
'Khill\\Lavacharts\\Charts\\BubbleChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/BubbleChart.php',
'Khill\\Lavacharts\\Charts\\CalendarChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/CalendarChart.php',
'Khill\\Lavacharts\\Charts\\CandlestickChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/CandlestickChart.php',
'Khill\\Lavacharts\\Charts\\Chart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/Chart.php',
'Khill\\Lavacharts\\Charts\\ChartFactory' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/ChartFactory.php',
'Khill\\Lavacharts\\Charts\\ColumnChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/ColumnChart.php',
'Khill\\Lavacharts\\Charts\\ComboChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/ComboChart.php',
'Khill\\Lavacharts\\Charts\\DonutChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/DonutChart.php',
'Khill\\Lavacharts\\Charts\\GanttChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/GanttChart.php',
'Khill\\Lavacharts\\Charts\\GaugeChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/GaugeChart.php',
'Khill\\Lavacharts\\Charts\\GeoChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/GeoChart.php',
'Khill\\Lavacharts\\Charts\\HistogramChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/HistogramChart.php',
'Khill\\Lavacharts\\Charts\\LineChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/LineChart.php',
'Khill\\Lavacharts\\Charts\\OrgChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/OrgChart.php',
'Khill\\Lavacharts\\Charts\\PieChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/PieChart.php',
'Khill\\Lavacharts\\Charts\\SankeyChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/SankeyChart.php',
'Khill\\Lavacharts\\Charts\\ScatterChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/ScatterChart.php',
'Khill\\Lavacharts\\Charts\\SteppedAreaChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/SteppedAreaChart.php',
'Khill\\Lavacharts\\Charts\\TableChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/TableChart.php',
'Khill\\Lavacharts\\Charts\\TimelineChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/TimelineChart.php',
'Khill\\Lavacharts\\Charts\\TreeMapChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/TreeMapChart.php',
'Khill\\Lavacharts\\Charts\\WordTreeChart' => __DIR__ . '/..' . '/khill/lavacharts/src/Charts/WordTreeChart.php',
'Khill\\Lavacharts\\Dashboards\\Bindings\\Binding' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Bindings/Binding.php',
'Khill\\Lavacharts\\Dashboards\\Bindings\\BindingFactory' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Bindings/BindingFactory.php',
'Khill\\Lavacharts\\Dashboards\\Bindings\\ManyToMany' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Bindings/ManyToMany.php',
'Khill\\Lavacharts\\Dashboards\\Bindings\\ManyToOne' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Bindings/ManyToOne.php',
'Khill\\Lavacharts\\Dashboards\\Bindings\\OneToMany' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Bindings/OneToMany.php',
'Khill\\Lavacharts\\Dashboards\\Bindings\\OneToOne' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Bindings/OneToOne.php',
'Khill\\Lavacharts\\Dashboards\\Dashboard' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Dashboard.php',
'Khill\\Lavacharts\\Dashboards\\DashboardFactory' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/DashboardFactory.php',
'Khill\\Lavacharts\\Dashboards\\Filters\\CategoryFilter' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Filters/CategoryFilter.php',
'Khill\\Lavacharts\\Dashboards\\Filters\\ChartRangeFilter' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Filters/ChartRangeFilter.php',
'Khill\\Lavacharts\\Dashboards\\Filters\\DateRangeFilter' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Filters/DateRangeFilter.php',
'Khill\\Lavacharts\\Dashboards\\Filters\\Filter' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Filters/Filter.php',
'Khill\\Lavacharts\\Dashboards\\Filters\\FilterFactory' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Filters/FilterFactory.php',
'Khill\\Lavacharts\\Dashboards\\Filters\\NumberRangeFilter' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Filters/NumberRangeFilter.php',
'Khill\\Lavacharts\\Dashboards\\Filters\\StringFilter' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Filters/StringFilter.php',
'Khill\\Lavacharts\\Dashboards\\Wrappers\\ChartWrapper' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Wrappers/ChartWrapper.php',
'Khill\\Lavacharts\\Dashboards\\Wrappers\\ControlWrapper' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Wrappers/ControlWrapper.php',
'Khill\\Lavacharts\\Dashboards\\Wrappers\\Wrapper' => __DIR__ . '/..' . '/khill/lavacharts/src/Dashboards/Wrappers/Wrapper.php',
'Khill\\Lavacharts\\DataTables\\Cells\\Cell' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/Cells/Cell.php',
'Khill\\Lavacharts\\DataTables\\Cells\\DateCell' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/Cells/DateCell.php',
'Khill\\Lavacharts\\DataTables\\Cells\\NullCell' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/Cells/NullCell.php',
'Khill\\Lavacharts\\DataTables\\Columns\\Column' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/Columns/Column.php',
'Khill\\Lavacharts\\DataTables\\Columns\\ColumnBuilder' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/Columns/ColumnBuilder.php',
'Khill\\Lavacharts\\DataTables\\Columns\\ColumnFactory' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/Columns/ColumnFactory.php',
'Khill\\Lavacharts\\DataTables\\DataFactory' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/DataFactory.php',
'Khill\\Lavacharts\\DataTables\\DataTable' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/DataTable.php',
'Khill\\Lavacharts\\DataTables\\Formats\\ArrowFormat' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/Formats/ArrowFormat.php',
'Khill\\Lavacharts\\DataTables\\Formats\\BarFormat' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/Formats/BarFormat.php',
'Khill\\Lavacharts\\DataTables\\Formats\\DateFormat' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/Formats/DateFormat.php',
'Khill\\Lavacharts\\DataTables\\Formats\\Format' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/Formats/Format.php',
'Khill\\Lavacharts\\DataTables\\Formats\\NumberFormat' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/Formats/NumberFormat.php',
'Khill\\Lavacharts\\DataTables\\Rows\\NullRow' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/Rows/NullRow.php',
'Khill\\Lavacharts\\DataTables\\Rows\\Row' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/Rows/Row.php',
'Khill\\Lavacharts\\DataTables\\Rows\\RowFactory' => __DIR__ . '/..' . '/khill/lavacharts/src/DataTables/Rows/RowFactory.php',
'Khill\\Lavacharts\\Exceptions\\ChartNotFound' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/ChartNotFound.php',
'Khill\\Lavacharts\\Exceptions\\DashboardNotFound' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/DashboardNotFound.php',
'Khill\\Lavacharts\\Exceptions\\DataTableNotFound' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/DataTableNotFound.php',
'Khill\\Lavacharts\\Exceptions\\ElementIdException' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/ElementIdException.php',
'Khill\\Lavacharts\\Exceptions\\InvalidBindings' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidBindings.php',
'Khill\\Lavacharts\\Exceptions\\InvalidCellCount' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidCellCount.php',
'Khill\\Lavacharts\\Exceptions\\InvalidChartType' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidChartType.php',
'Khill\\Lavacharts\\Exceptions\\InvalidChartWrapperParams' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidChartWrapperParams.php',
'Khill\\Lavacharts\\Exceptions\\InvalidColumnDefinition' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidColumnDefinition.php',
'Khill\\Lavacharts\\Exceptions\\InvalidColumnFormat' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidColumnFormat.php',
'Khill\\Lavacharts\\Exceptions\\InvalidColumnIndex' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidColumnIndex.php',
'Khill\\Lavacharts\\Exceptions\\InvalidColumnRole' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidColumnRole.php',
'Khill\\Lavacharts\\Exceptions\\InvalidColumnType' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidColumnType.php',
'Khill\\Lavacharts\\Exceptions\\InvalidConfigProperty' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidConfigProperty.php',
'Khill\\Lavacharts\\Exceptions\\InvalidConfigValue' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidConfigValue.php',
'Khill\\Lavacharts\\Exceptions\\InvalidControlWrapperParams' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidControlWrapperParams.php',
'Khill\\Lavacharts\\Exceptions\\InvalidDataTable' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidDataTable.php',
'Khill\\Lavacharts\\Exceptions\\InvalidDate' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidDate.php',
'Khill\\Lavacharts\\Exceptions\\InvalidDateTimeFormat' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidDateTimeFormat.php',
'Khill\\Lavacharts\\Exceptions\\InvalidDateTimeString' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidDateTimeString.php',
'Khill\\Lavacharts\\Exceptions\\InvalidDivDimensions' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidDivDimensions.php',
'Khill\\Lavacharts\\Exceptions\\InvalidElementId' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidElementId.php',
'Khill\\Lavacharts\\Exceptions\\InvalidFilterParam' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidFilterParam.php',
'Khill\\Lavacharts\\Exceptions\\InvalidFilterType' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidFilterType.php',
'Khill\\Lavacharts\\Exceptions\\InvalidFormatType' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidFormatType.php',
'Khill\\Lavacharts\\Exceptions\\InvalidFunctionParam' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidFunctionParam.php',
'Khill\\Lavacharts\\Exceptions\\InvalidJson' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidJson.php',
'Khill\\Lavacharts\\Exceptions\\InvalidLabel' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidLabel.php',
'Khill\\Lavacharts\\Exceptions\\InvalidLavaObject' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidLavaObject.php',
'Khill\\Lavacharts\\Exceptions\\InvalidOptions' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidOptions.php',
'Khill\\Lavacharts\\Exceptions\\InvalidParamType' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidParamType.php',
'Khill\\Lavacharts\\Exceptions\\InvalidRowDefinition' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidRowDefinition.php',
'Khill\\Lavacharts\\Exceptions\\InvalidRowProperty' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidRowProperty.php',
'Khill\\Lavacharts\\Exceptions\\InvalidStringValue' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidStringValue.php',
'Khill\\Lavacharts\\Exceptions\\InvalidTimeZone' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidTimeZone.php',
'Khill\\Lavacharts\\Exceptions\\InvalidUIProperty' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/InvalidUIProperty.php',
'Khill\\Lavacharts\\Exceptions\\LavaException' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/LavaException.php',
'Khill\\Lavacharts\\Exceptions\\RenderingException' => __DIR__ . '/..' . '/khill/lavacharts/src/Exceptions/RenderingException.php',
'Khill\\Lavacharts\\Javascript\\ChartJsFactory' => __DIR__ . '/..' . '/khill/lavacharts/src/Javascript/ChartJsFactory.php',
'Khill\\Lavacharts\\Javascript\\DashboardJsFactory' => __DIR__ . '/..' . '/khill/lavacharts/src/Javascript/DashboardJsFactory.php',
'Khill\\Lavacharts\\Javascript\\JavascriptFactory' => __DIR__ . '/..' . '/khill/lavacharts/src/Javascript/JavascriptFactory.php',
'Khill\\Lavacharts\\Javascript\\ScriptManager' => __DIR__ . '/..' . '/khill/lavacharts/src/Javascript/ScriptManager.php',
'Khill\\Lavacharts\\Laravel\\LavachartsFacade' => __DIR__ . '/..' . '/khill/lavacharts/src/Laravel/LavachartsFacade.php',
'Khill\\Lavacharts\\Laravel\\LavachartsServiceProvider' => __DIR__ . '/..' . '/khill/lavacharts/src/Laravel/LavachartsServiceProvider.php',
'Khill\\Lavacharts\\Lavacharts' => __DIR__ . '/..' . '/khill/lavacharts/src/Lavacharts.php',
'Khill\\Lavacharts\\Support\\Buffer' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Buffer.php',
'Khill\\Lavacharts\\Support\\Config' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Config.php',
'Khill\\Lavacharts\\Support\\Contracts\\Arrayable' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Contracts/Arrayable.php',
'Khill\\Lavacharts\\Support\\Contracts\\DataTableInterface' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Contracts/DataTableInterface.php',
'Khill\\Lavacharts\\Support\\Contracts\\JsClassInterface' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Contracts/JsClassInterface.php',
'Khill\\Lavacharts\\Support\\Contracts\\Jsonable' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Contracts/Jsonable.php',
'Khill\\Lavacharts\\Support\\Contracts\\JsonableInterface' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Contracts/JsonableInterface.php',
'Khill\\Lavacharts\\Support\\Contracts\\RenderableInterface' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Contracts/RenderableInterface.php',
'Khill\\Lavacharts\\Support\\Contracts\\VisualizationInterface' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Contracts/VisualizationInterface.php',
'Khill\\Lavacharts\\Support\\Contracts\\WrappableInterface' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Contracts/WrappableInterface.php',
'Khill\\Lavacharts\\Support\\Customizable' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Customizable.php',
'Khill\\Lavacharts\\Support\\Html\\HtmlFactory' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Html/HtmlFactory.php',
'Khill\\Lavacharts\\Support\\JavascriptDate' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/JavascriptDate.php',
'Khill\\Lavacharts\\Support\\Options' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Options.php',
'Khill\\Lavacharts\\Support\\Psr4Autoloader' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Psr4Autoloader.php',
'Khill\\Lavacharts\\Support\\RenderableTrait' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Renderable.php',
'Khill\\Lavacharts\\Support\\Traits\\DataTableTrait' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Traits/DataTableTrait.php',
'Khill\\Lavacharts\\Support\\Traits\\ElementIdTrait' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Traits/ElementIdTrait.php',
'Khill\\Lavacharts\\Support\\Traits\\HasOptionsTrait' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Traits/HasOptionsTrait.php',
'Khill\\Lavacharts\\Support\\Traits\\MaterialRenderableTrait' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Traits/MaterialRenderableTrait.php',
'Khill\\Lavacharts\\Support\\Traits\\ParameterValidatorsTrait' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Traits/ParameterValidatorsTrait.php',
'Khill\\Lavacharts\\Support\\Traits\\PngRenderableTrait' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Traits/PngRenderableTrait.php',
'Khill\\Lavacharts\\Support\\Traits\\RenderableTrait' => __DIR__ . '/..' . '/khill/lavacharts/src/Support/Traits/RenderableTrait.php',
'Khill\\Lavacharts\\Symfony\\Bundle\\LavachartsBundle' => __DIR__ . '/..' . '/khill/lavacharts/src/Symfony/Bundle/LavachartsBundle.php',
'Khill\\Lavacharts\\Symfony\\Bundle\\Twig\\LavachartsExtension' => __DIR__ . '/..' . '/khill/lavacharts/src/Symfony/Bundle/Twig/LavachartsExtension.php',
'Khill\\Lavacharts\\Values\\ElementId' => __DIR__ . '/..' . '/khill/lavacharts/src/Values/ElementId.php',
'Khill\\Lavacharts\\Values\\Label' => __DIR__ . '/..' . '/khill/lavacharts/src/Values/Label.php',
'Khill\\Lavacharts\\Values\\Role' => __DIR__ . '/..' . '/khill/lavacharts/src/Values/Role.php',
'Khill\\Lavacharts\\Values\\StringValue' => __DIR__ . '/..' . '/khill/lavacharts/src/Values/StringValue.php',
'Khill\\Lavacharts\\Volcano' => __DIR__ . '/..' . '/khill/lavacharts/src/Volcano.php',
'Laravel\\Horizon\\AutoScaler' => __DIR__ . '/..' . '/laravel/horizon/src/AutoScaler.php',
'Laravel\\Horizon\\BackgroundProcess' => __DIR__ . '/..' . '/laravel/horizon/src/BackgroundProcess.php',
'Laravel\\Horizon\\Connectors\\RedisConnector' => __DIR__ . '/..' . '/laravel/horizon/src/Connectors/RedisConnector.php',
'Laravel\\Horizon\\Console\\AssetsCommand' => __DIR__ . '/..' . '/laravel/horizon/src/Console/AssetsCommand.php',
'Laravel\\Horizon\\Console\\ContinueCommand' => __DIR__ . '/..' . '/laravel/horizon/src/Console/ContinueCommand.php',
'Laravel\\Horizon\\Console\\HorizonCommand' => __DIR__ . '/..' . '/laravel/horizon/src/Console/HorizonCommand.php',
'Laravel\\Horizon\\Console\\InstallCommand' => __DIR__ . '/..' . '/laravel/horizon/src/Console/InstallCommand.php',
'Laravel\\Horizon\\Console\\ListCommand' => __DIR__ . '/..' . '/laravel/horizon/src/Console/ListCommand.php',
'Laravel\\Horizon\\Console\\PauseCommand' => __DIR__ . '/..' . '/laravel/horizon/src/Console/PauseCommand.php',
'Laravel\\Horizon\\Console\\PurgeCommand' => __DIR__ . '/..' . '/laravel/horizon/src/Console/PurgeCommand.php',
'Laravel\\Horizon\\Console\\SnapshotCommand' => __DIR__ . '/..' . '/laravel/horizon/src/Console/SnapshotCommand.php',
'Laravel\\Horizon\\Console\\StatusCommand' => __DIR__ . '/..' . '/laravel/horizon/src/Console/StatusCommand.php',
'Laravel\\Horizon\\Console\\SupervisorCommand' => __DIR__ . '/..' . '/laravel/horizon/src/Console/SupervisorCommand.php',
'Laravel\\Horizon\\Console\\SupervisorsCommand' => __DIR__ . '/..' . '/laravel/horizon/src/Console/SupervisorsCommand.php',
'Laravel\\Horizon\\Console\\TerminateCommand' => __DIR__ . '/..' . '/laravel/horizon/src/Console/TerminateCommand.php',
'Laravel\\Horizon\\Console\\TimeoutCommand' => __DIR__ . '/..' . '/laravel/horizon/src/Console/TimeoutCommand.php',
'Laravel\\Horizon\\Console\\WorkCommand' => __DIR__ . '/..' . '/laravel/horizon/src/Console/WorkCommand.php',
'Laravel\\Horizon\\Contracts\\HorizonCommandQueue' => __DIR__ . '/..' . '/laravel/horizon/src/Contracts/HorizonCommandQueue.php',
'Laravel\\Horizon\\Contracts\\JobRepository' => __DIR__ . '/..' . '/laravel/horizon/src/Contracts/JobRepository.php',
'Laravel\\Horizon\\Contracts\\MasterSupervisorRepository' => __DIR__ . '/..' . '/laravel/horizon/src/Contracts/MasterSupervisorRepository.php',
'Laravel\\Horizon\\Contracts\\MetricsRepository' => __DIR__ . '/..' . '/laravel/horizon/src/Contracts/MetricsRepository.php',
'Laravel\\Horizon\\Contracts\\Pausable' => __DIR__ . '/..' . '/laravel/horizon/src/Contracts/Pausable.php',
'Laravel\\Horizon\\Contracts\\ProcessRepository' => __DIR__ . '/..' . '/laravel/horizon/src/Contracts/ProcessRepository.php',
'Laravel\\Horizon\\Contracts\\Restartable' => __DIR__ . '/..' . '/laravel/horizon/src/Contracts/Restartable.php',
'Laravel\\Horizon\\Contracts\\SupervisorRepository' => __DIR__ . '/..' . '/laravel/horizon/src/Contracts/SupervisorRepository.php',
'Laravel\\Horizon\\Contracts\\TagRepository' => __DIR__ . '/..' . '/laravel/horizon/src/Contracts/TagRepository.php',
'Laravel\\Horizon\\Contracts\\Terminable' => __DIR__ . '/..' . '/laravel/horizon/src/Contracts/Terminable.php',
'Laravel\\Horizon\\Contracts\\WorkloadRepository' => __DIR__ . '/..' . '/laravel/horizon/src/Contracts/WorkloadRepository.php',
'Laravel\\Horizon\\EventMap' => __DIR__ . '/..' . '/laravel/horizon/src/EventMap.php',
'Laravel\\Horizon\\Events\\JobDeleted' => __DIR__ . '/..' . '/laravel/horizon/src/Events/JobDeleted.php',
'Laravel\\Horizon\\Events\\JobFailed' => __DIR__ . '/..' . '/laravel/horizon/src/Events/JobFailed.php',
'Laravel\\Horizon\\Events\\JobPushed' => __DIR__ . '/..' . '/laravel/horizon/src/Events/JobPushed.php',
'Laravel\\Horizon\\Events\\JobReleased' => __DIR__ . '/..' . '/laravel/horizon/src/Events/JobReleased.php',
'Laravel\\Horizon\\Events\\JobReserved' => __DIR__ . '/..' . '/laravel/horizon/src/Events/JobReserved.php',
'Laravel\\Horizon\\Events\\JobsMigrated' => __DIR__ . '/..' . '/laravel/horizon/src/Events/JobsMigrated.php',
'Laravel\\Horizon\\Events\\LongWaitDetected' => __DIR__ . '/..' . '/laravel/horizon/src/Events/LongWaitDetected.php',
'Laravel\\Horizon\\Events\\MasterSupervisorDeployed' => __DIR__ . '/..' . '/laravel/horizon/src/Events/MasterSupervisorDeployed.php',
'Laravel\\Horizon\\Events\\MasterSupervisorLooped' => __DIR__ . '/..' . '/laravel/horizon/src/Events/MasterSupervisorLooped.php',
'Laravel\\Horizon\\Events\\MasterSupervisorReviving' => __DIR__ . '/..' . '/laravel/horizon/src/Events/MasterSupervisorReviving.php',
'Laravel\\Horizon\\Events\\RedisEvent' => __DIR__ . '/..' . '/laravel/horizon/src/Events/RedisEvent.php',
'Laravel\\Horizon\\Events\\SupervisorLooped' => __DIR__ . '/..' . '/laravel/horizon/src/Events/SupervisorLooped.php',
'Laravel\\Horizon\\Events\\SupervisorProcessRestarting' => __DIR__ . '/..' . '/laravel/horizon/src/Events/SupervisorProcessRestarting.php',
'Laravel\\Horizon\\Events\\UnableToLaunchProcess' => __DIR__ . '/..' . '/laravel/horizon/src/Events/UnableToLaunchProcess.php',
'Laravel\\Horizon\\Events\\WorkerProcessRestarting' => __DIR__ . '/..' . '/laravel/horizon/src/Events/WorkerProcessRestarting.php',
'Laravel\\Horizon\\Exec' => __DIR__ . '/..' . '/laravel/horizon/src/Exec.php',
'Laravel\\Horizon\\Horizon' => __DIR__ . '/..' . '/laravel/horizon/src/Horizon.php',
'Laravel\\Horizon\\HorizonApplicationServiceProvider' => __DIR__ . '/..' . '/laravel/horizon/src/HorizonApplicationServiceProvider.php',
'Laravel\\Horizon\\HorizonServiceProvider' => __DIR__ . '/..' . '/laravel/horizon/src/HorizonServiceProvider.php',
'Laravel\\Horizon\\Http\\Controllers\\Controller' => __DIR__ . '/..' . '/laravel/horizon/src/Http/Controllers/Controller.php',
'Laravel\\Horizon\\Http\\Controllers\\DashboardStatsController' => __DIR__ . '/..' . '/laravel/horizon/src/Http/Controllers/DashboardStatsController.php',
'Laravel\\Horizon\\Http\\Controllers\\FailedJobsController' => __DIR__ . '/..' . '/laravel/horizon/src/Http/Controllers/FailedJobsController.php',
'Laravel\\Horizon\\Http\\Controllers\\HomeController' => __DIR__ . '/..' . '/laravel/horizon/src/Http/Controllers/HomeController.php',
'Laravel\\Horizon\\Http\\Controllers\\JobMetricsController' => __DIR__ . '/..' . '/laravel/horizon/src/Http/Controllers/JobMetricsController.php',
'Laravel\\Horizon\\Http\\Controllers\\MasterSupervisorController' => __DIR__ . '/..' . '/laravel/horizon/src/Http/Controllers/MasterSupervisorController.php',
'Laravel\\Horizon\\Http\\Controllers\\MonitoringController' => __DIR__ . '/..' . '/laravel/horizon/src/Http/Controllers/MonitoringController.php',
'Laravel\\Horizon\\Http\\Controllers\\QueueMetricsController' => __DIR__ . '/..' . '/laravel/horizon/src/Http/Controllers/QueueMetricsController.php',
'Laravel\\Horizon\\Http\\Controllers\\RecentJobsController' => __DIR__ . '/..' . '/laravel/horizon/src/Http/Controllers/RecentJobsController.php',
'Laravel\\Horizon\\Http\\Controllers\\RetryController' => __DIR__ . '/..' . '/laravel/horizon/src/Http/Controllers/RetryController.php',
'Laravel\\Horizon\\Http\\Controllers\\WorkloadController' => __DIR__ . '/..' . '/laravel/horizon/src/Http/Controllers/WorkloadController.php',
'Laravel\\Horizon\\Http\\Middleware\\Authenticate' => __DIR__ . '/..' . '/laravel/horizon/src/Http/Middleware/Authenticate.php',
'Laravel\\Horizon\\JobId' => __DIR__ . '/..' . '/laravel/horizon/src/JobId.php',
'Laravel\\Horizon\\JobPayload' => __DIR__ . '/..' . '/laravel/horizon/src/JobPayload.php',
'Laravel\\Horizon\\Jobs\\MonitorTag' => __DIR__ . '/..' . '/laravel/horizon/src/Jobs/MonitorTag.php',
'Laravel\\Horizon\\Jobs\\RetryFailedJob' => __DIR__ . '/..' . '/laravel/horizon/src/Jobs/RetryFailedJob.php',
'Laravel\\Horizon\\Jobs\\StopMonitoringTag' => __DIR__ . '/..' . '/laravel/horizon/src/Jobs/StopMonitoringTag.php',
'Laravel\\Horizon\\Listeners\\ExpireSupervisors' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/ExpireSupervisors.php',
'Laravel\\Horizon\\Listeners\\MarkJobAsComplete' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/MarkJobAsComplete.php',
'Laravel\\Horizon\\Listeners\\MarkJobAsFailed' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/MarkJobAsFailed.php',
'Laravel\\Horizon\\Listeners\\MarkJobAsReleased' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/MarkJobAsReleased.php',
'Laravel\\Horizon\\Listeners\\MarkJobAsReserved' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/MarkJobAsReserved.php',
'Laravel\\Horizon\\Listeners\\MarkJobsAsMigrated' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/MarkJobsAsMigrated.php',
'Laravel\\Horizon\\Listeners\\MarshalFailedEvent' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/MarshalFailedEvent.php',
'Laravel\\Horizon\\Listeners\\MonitorMasterSupervisorMemory' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/MonitorMasterSupervisorMemory.php',
'Laravel\\Horizon\\Listeners\\MonitorSupervisorMemory' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/MonitorSupervisorMemory.php',
'Laravel\\Horizon\\Listeners\\MonitorWaitTimes' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/MonitorWaitTimes.php',
'Laravel\\Horizon\\Listeners\\PruneTerminatingProcesses' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/PruneTerminatingProcesses.php',
'Laravel\\Horizon\\Listeners\\SendNotification' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/SendNotification.php',
'Laravel\\Horizon\\Listeners\\StartTimingJob' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/StartTimingJob.php',
'Laravel\\Horizon\\Listeners\\StoreJob' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/StoreJob.php',
'Laravel\\Horizon\\Listeners\\StoreMonitoredTags' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/StoreMonitoredTags.php',
'Laravel\\Horizon\\Listeners\\StoreTagsForFailedJob' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/StoreTagsForFailedJob.php',
'Laravel\\Horizon\\Listeners\\TrimFailedJobs' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/TrimFailedJobs.php',
'Laravel\\Horizon\\Listeners\\TrimMonitoredJobs' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/TrimMonitoredJobs.php',
'Laravel\\Horizon\\Listeners\\TrimRecentJobs' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/TrimRecentJobs.php',
'Laravel\\Horizon\\Listeners\\UpdateJobMetrics' => __DIR__ . '/..' . '/laravel/horizon/src/Listeners/UpdateJobMetrics.php',
'Laravel\\Horizon\\ListensForSignals' => __DIR__ . '/..' . '/laravel/horizon/src/ListensForSignals.php',
'Laravel\\Horizon\\Lock' => __DIR__ . '/..' . '/laravel/horizon/src/Lock.php',
'Laravel\\Horizon\\LuaScripts' => __DIR__ . '/..' . '/laravel/horizon/src/LuaScripts.php',
'Laravel\\Horizon\\MasterSupervisor' => __DIR__ . '/..' . '/laravel/horizon/src/MasterSupervisor.php',
'Laravel\\Horizon\\MasterSupervisorCommands\\AddSupervisor' => __DIR__ . '/..' . '/laravel/horizon/src/MasterSupervisorCommands/AddSupervisor.php',
'Laravel\\Horizon\\Notifications\\LongWaitDetected' => __DIR__ . '/..' . '/laravel/horizon/src/Notifications/LongWaitDetected.php',
'Laravel\\Horizon\\PhpBinary' => __DIR__ . '/..' . '/laravel/horizon/src/PhpBinary.php',
'Laravel\\Horizon\\ProcessInspector' => __DIR__ . '/..' . '/laravel/horizon/src/ProcessInspector.php',
'Laravel\\Horizon\\ProcessPool' => __DIR__ . '/..' . '/laravel/horizon/src/ProcessPool.php',
'Laravel\\Horizon\\ProvisioningPlan' => __DIR__ . '/..' . '/laravel/horizon/src/ProvisioningPlan.php',
'Laravel\\Horizon\\QueueCommandString' => __DIR__ . '/..' . '/laravel/horizon/src/QueueCommandString.php',
'Laravel\\Horizon\\RedisHorizonCommandQueue' => __DIR__ . '/..' . '/laravel/horizon/src/RedisHorizonCommandQueue.php',
'Laravel\\Horizon\\RedisQueue' => __DIR__ . '/..' . '/laravel/horizon/src/RedisQueue.php',
'Laravel\\Horizon\\Repositories\\RedisJobRepository' => __DIR__ . '/..' . '/laravel/horizon/src/Repositories/RedisJobRepository.php',
'Laravel\\Horizon\\Repositories\\RedisMasterSupervisorRepository' => __DIR__ . '/..' . '/laravel/horizon/src/Repositories/RedisMasterSupervisorRepository.php',
'Laravel\\Horizon\\Repositories\\RedisMetricsRepository' => __DIR__ . '/..' . '/laravel/horizon/src/Repositories/RedisMetricsRepository.php',
'Laravel\\Horizon\\Repositories\\RedisProcessRepository' => __DIR__ . '/..' . '/laravel/horizon/src/Repositories/RedisProcessRepository.php',
'Laravel\\Horizon\\Repositories\\RedisSupervisorRepository' => __DIR__ . '/..' . '/laravel/horizon/src/Repositories/RedisSupervisorRepository.php',
'Laravel\\Horizon\\Repositories\\RedisTagRepository' => __DIR__ . '/..' . '/laravel/horizon/src/Repositories/RedisTagRepository.php',
'Laravel\\Horizon\\Repositories\\RedisWorkloadRepository' => __DIR__ . '/..' . '/laravel/horizon/src/Repositories/RedisWorkloadRepository.php',
'Laravel\\Horizon\\ServiceBindings' => __DIR__ . '/..' . '/laravel/horizon/src/ServiceBindings.php',
'Laravel\\Horizon\\Stopwatch' => __DIR__ . '/..' . '/laravel/horizon/src/Stopwatch.php',
'Laravel\\Horizon\\Supervisor' => __DIR__ . '/..' . '/laravel/horizon/src/Supervisor.php',
'Laravel\\Horizon\\SupervisorCommandString' => __DIR__ . '/..' . '/laravel/horizon/src/SupervisorCommandString.php',
'Laravel\\Horizon\\SupervisorCommands\\Balance' => __DIR__ . '/..' . '/laravel/horizon/src/SupervisorCommands/Balance.php',
'Laravel\\Horizon\\SupervisorCommands\\ContinueWorking' => __DIR__ . '/..' . '/laravel/horizon/src/SupervisorCommands/ContinueWorking.php',
'Laravel\\Horizon\\SupervisorCommands\\Pause' => __DIR__ . '/..' . '/laravel/horizon/src/SupervisorCommands/Pause.php',
'Laravel\\Horizon\\SupervisorCommands\\Restart' => __DIR__ . '/..' . '/laravel/horizon/src/SupervisorCommands/Restart.php',
'Laravel\\Horizon\\SupervisorCommands\\Scale' => __DIR__ . '/..' . '/laravel/horizon/src/SupervisorCommands/Scale.php',
'Laravel\\Horizon\\SupervisorCommands\\Terminate' => __DIR__ . '/..' . '/laravel/horizon/src/SupervisorCommands/Terminate.php',
'Laravel\\Horizon\\SupervisorFactory' => __DIR__ . '/..' . '/laravel/horizon/src/SupervisorFactory.php',
'Laravel\\Horizon\\SupervisorOptions' => __DIR__ . '/..' . '/laravel/horizon/src/SupervisorOptions.php',
'Laravel\\Horizon\\SupervisorProcess' => __DIR__ . '/..' . '/laravel/horizon/src/SupervisorProcess.php',
'Laravel\\Horizon\\SystemProcessCounter' => __DIR__ . '/..' . '/laravel/horizon/src/SystemProcessCounter.php',
'Laravel\\Horizon\\Tags' => __DIR__ . '/..' . '/laravel/horizon/src/Tags.php',
'Laravel\\Horizon\\WaitTimeCalculator' => __DIR__ . '/..' . '/laravel/horizon/src/WaitTimeCalculator.php',
'Laravel\\Horizon\\WorkerCommandString' => __DIR__ . '/..' . '/laravel/horizon/src/WorkerCommandString.php',
'Laravel\\Horizon\\WorkerProcess' => __DIR__ . '/..' . '/laravel/horizon/src/WorkerProcess.php',
'Laravel\\Socialite\\AbstractUser' => __DIR__ . '/..' . '/laravel/socialite/src/AbstractUser.php',
'Laravel\\Socialite\\Contracts\\Factory' => __DIR__ . '/..' . '/laravel/socialite/src/Contracts/Factory.php',
'Laravel\\Socialite\\Contracts\\Provider' => __DIR__ . '/..' . '/laravel/socialite/src/Contracts/Provider.php',

View File

@@ -69,6 +69,65 @@
"webprofiler"
]
},
{
"name": "cakephp/chronos",
"version": "1.2.8",
"version_normalized": "1.2.8.0",
"source": {
"type": "git",
"url": "https://github.com/cakephp/chronos.git",
"reference": "0292f06e8cc23fc82f0574889da2d8bf27b613c1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/cakephp/chronos/zipball/0292f06e8cc23fc82f0574889da2d8bf27b613c1",
"reference": "0292f06e8cc23fc82f0574889da2d8bf27b613c1",
"shasum": ""
},
"require": {
"php": "^5.5.9|^7"
},
"require-dev": {
"athletic/athletic": "~0.1",
"cakephp/cakephp-codesniffer": "^3.0",
"phpbench/phpbench": "@dev",
"phpstan/phpstan": "^0.6.4",
"phpunit/phpunit": "<6.0 || ^7.0"
},
"time": "2019-06-17T15:19:18+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-4": {
"Cake\\Chronos\\": "src/"
},
"files": [
"src/carbon_compat.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Brian Nesbitt",
"email": "brian@nesbot.com",
"homepage": "http://nesbot.com"
},
{
"name": "The CakePHP Team",
"homepage": "http://cakephp.org"
}
],
"description": "A simple API extension for DateTime.",
"homepage": "http://cakephp.org",
"keywords": [
"date",
"datetime",
"time"
]
},
{
"name": "dnoegel/php-xdg-base-dir",
"version": "0.1",
@@ -1190,6 +1249,74 @@
],
"description": "Highlight PHP code in terminal"
},
{
"name": "khill/lavacharts",
"version": "3.1.12",
"version_normalized": "3.1.12.0",
"source": {
"type": "git",
"url": "https://github.com/kevinkhill/lavacharts.git",
"reference": "5823620b6c976ced1ab28ae900dab2bb573af793"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/kevinkhill/lavacharts/zipball/5823620b6c976ced1ab28ae900dab2bb573af793",
"reference": "5823620b6c976ced1ab28ae900dab2bb573af793",
"shasum": ""
},
"require": {
"nesbot/carbon": ">=1.14 <3.0",
"php": ">=5.4.0"
},
"require-dev": {
"codeclimate/php-test-reporter": "~0.3",
"mockery/mockery": "~0.9",
"phpunit/phpunit": "~4.8",
"satooshi/php-coveralls": "~1.0",
"squizlabs/php_codesniffer": "~2.5"
},
"suggest": {
"khill/datatableplus": "Adds extra features to DataTables such as csv and laravel collection parsing."
},
"time": "2019-07-11T15:47:24+00:00",
"type": "library",
"extra": {
"laravel": {
"providers": [
"Khill\\Lavacharts\\Laravel\\LavachartsServiceProvider"
],
"aliases": {
"Lava": "Khill\\Lavacharts\\Laravel\\LavachartsFacade"
}
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"Khill\\Lavacharts\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Kevin Hill",
"email": "kevinkhill@gmail.com",
"role": "Creator"
}
],
"description": "PHP wrapper library for the Google Chart API",
"homepage": "http://lavacharts.com",
"keywords": [
"charts",
"google",
"graphs",
"laravel",
"symfony"
]
},
{
"name": "laravel/framework",
"version": "v6.0.4",
@@ -1337,6 +1464,77 @@
"laravel"
]
},
{
"name": "laravel/horizon",
"version": "v3.3.2",
"version_normalized": "3.3.2.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/horizon.git",
"reference": "692d3649a9c1bd13a3340ecc10036c1d3b55155b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/horizon/zipball/692d3649a9c1bd13a3340ecc10036c1d3b55155b",
"reference": "692d3649a9c1bd13a3340ecc10036c1d3b55155b",
"shasum": ""
},
"require": {
"cakephp/chronos": "^1.0",
"ext-json": "*",
"ext-pcntl": "*",
"ext-posix": "*",
"illuminate/contracts": "~5.7.0|~5.8.0|^6.0|^7.0",
"illuminate/queue": "~5.7.0|~5.8.0|^6.0|^7.0",
"illuminate/support": "~5.7.0|~5.8.0|^6.0|^7.0",
"php": ">=7.1.0",
"predis/predis": "^1.1",
"ramsey/uuid": "^3.5",
"symfony/debug": "^4.2",
"symfony/process": "^4.2"
},
"require-dev": {
"mockery/mockery": "^1.0",
"orchestra/testbench": "^3.7|^4.0|^5.0",
"phpunit/phpunit": "^7.0|^8.0"
},
"time": "2019-08-27T14:30:05+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
},
"laravel": {
"providers": [
"Laravel\\Horizon\\HorizonServiceProvider"
],
"aliases": {
"Horizon": "Laravel\\Horizon\\Horizon"
}
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"Laravel\\Horizon\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Taylor Otwell",
"email": "taylor@laravel.com"
}
],
"description": "Dashboard and code-driven configuration for Laravel queues.",
"keywords": [
"laravel",
"queue"
]
},
{
"name": "laravel/socialite",
"version": "v4.2.0",

View File

@@ -0,0 +1,30 @@
## Contributing
First of all, **thank you** for contributing!
Here are a few guidelines to follow in order to ease code reviews and merging:
### For the PHP code base
- follow [PSR-1](http://www.php-fig.org/psr/1/) and [PSR-2](http://www.php-fig.org/psr/2/)
- run the test suite
- write (or update) unit tests when applicable
- write documentation for new features
- use [commit messages that make sense](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
One may ask you to [squash your commits](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html) too. This is used to "clean" your pull request before merging it (we don't want commits such as `fix tests`, `fix 2`, `fix 3`, etc.).
When creating your pull request on GitHub, please write a description which gives the context and/or explains why you are creating it.
### For the Javascript code base
To get started, you will need to have nodejs installed with npm.
- From the root of the project, navigate to the javascript directory: `cd javascript`
- Then run `npm install` to fetch all the tooling needed for compiling lava.js
Gulp is used to build the module so you will need to use the tasks:
- Use `gulp watch` to monitor the files for changes and rebuild when detected.
- Use `gulp build` to initiate a manual dev build.
- Use `gulp release` to initiate a manual production build. (Strips comments, removes logging, and minifys the code.)

View File

@@ -0,0 +1,18 @@
#### What Version?
> Run `composer show khill/lavacharts` if you don't know
#### Issue
> Please describe the issue.
#### Controller Code (chart creation code)
```
// paste over this
```
#### View Code
```
// paste over this
```

24
vendor/khill/lavacharts/.gitlab-ci.yml vendored Normal file
View File

@@ -0,0 +1,24 @@
# Select image from https://hub.docker.com/_/php/
image: php:5.6
# Select what we should cache
cache:
paths:
- vendor/
before_script:
- apt-get update -yqq
- apt-get install git unzip nodejs -yqq
- curl -sS https://getcomposer.org/installer | php
#- echo 'date.timezone = "America/Los_Angeles"' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
- mkdir -p build/logs
- php composer.phar install --no-progress --no-interaction --prefer-dist
- npm install --no-progress --production
after_script:
- php ./vendor/bin/coveralls
test:
script:
- php composer.phar run test
- npm run test

226
vendor/khill/lavacharts/CHANGELOG.md vendored Normal file
View File

@@ -0,0 +1,226 @@
- 3.1.9
- Fixing bug where using `setOptions` instead of the constructor skipped the processing of `png` and `material` attributes.
- 3.1.8
- Production build of the Lava.js module.
- 3.1.7
- Added the tag lavacharts to the config publishing.
Use `php artisan vendor:publish --tag=lavacharts`
If that does not work, try to clear the cache with `php artisan config:clear` and re-publish with `--force`.
- 3.1.6
- The event callback within lava.js was modified to pass back the chart and the datatable so users can interact with either during an event. This solves issue [#203](https://github.com/kevinkhill/lavacharts/issues/203)
- 3.1.5
- Adding DonutChart alias class back
- 3.1.4
- Chart's should resize properly on page resize.
- 3.1.3
- Adding support for date columns to be null which enables support for Gantt charts to have linked sections.
- Adding JavascriptDate class that mimics the way the Javascript Date object is created. (I wanted to be able to copy and paste google's examples into addRows)
- 3.1.1 & 3.1.2
- Adding back and repairing the Symfony Bundle
- 3.1.0
- Public Release
- 3.1.0-beta2
- Adjusting elementId precedence to prevent backwards compatability breaks and enable new features. The order of precedence goes as follows:
- An elementId string passed to the render method will override an elementId set to the chart.
- It is recommended to move all of the elementId strings on `render()` methods into the constructor, as an option: `['elementId' => 'render-to-div']`
- Setting the elementId as an option during creation is preferred, to enable the use of the new feature, `renderAll()`, that will output all defined charts to the page.
- 3.1.0-beta1
- Adding setLocale() method for changing language of charts.
- 3.1.0-alpha
- Adding more supported chart types
- AnnotationChart
- BubbleChart
- CandlestickChart
- HistogramChart
- SankeyChart
- SteppedAreaChart
- TimelineChart
- TreemapChart
- Adding DataFactory with arrayToDataTable() method to try and automatically
create columns and rows based on an array of data with labels. This mimics how
Google's javascript version of the method works for creating DataTables more
efficiently. Currently only works with strings and numbers.
- Adding DataTable() method to the DataFactory as a shortcut to chaining methods.
- The method has three signatures:
- No params for an empty, default timezone DataTable
- String param for setting the timezone
- Array of columns and array of rows as 1st and 2nd for a complete DataTable in
one method call. (The third parameter can also be used to set the timezone.)
- [DataFactory Examples](https://gist.github.com/kevinkhill/0c7c5f6211c7fd8f9658)
- Massive overhaul of lava.js module.
- Refactored and using browserify to compile
- Added `lava.ready()` method for wrapping any lava.js interaction. When given a function
it will be called after all charts have rendered onto the page. Useful for delaying ajax requests
until the chart is ready.
- Added the ability to render directly as PNGs instead of SVGs
- Just pass into the options `['png' => true]`
- Created examples for each chart, available to view locally using the built in PHP server.
- Navigate to the Examples folder in the lavacharts package folder. If you installed with Composer, then it
should be at `$PROJECT_ROOT/vendor/khill/lavacharts/tests/Examples`
- Use the given config and router to start the examples page `php -S 127.0.0.1:8000 -c php.ini router.php`
- All exceptions now extend LavaException if the user wants to have a catch all
- Utils class removed, broken into traits, and applied to classes that needed the methods
- 3.0.4
- Fixing bug where TreeMap was not in list of chartClasses
- 3.0.3
- Events Bugfix
- 3.0.2
- Blade template extension bug fixes
- Combining the `customize` method into the constructor to provide
restriction free option setting without the extra method call.
- 3.0.1
- Bug fixes
- 3.0.0
- Dropping support for PHP 5.3
- Minimum version PHP 5.4+
- Added Dashboards
- ChartWrappers
- ControlWrappers
- Added filters for Dashboard ControlWrappers
- Category
- ChartRange
- DateRange
- NumberRange
- String
- Chart Improvements
- Assign DataTable and options via constructor.
- Refactored all ConfigObject creation into the classes, no more manually instantiation.
- Removed Event classes in favor of associative array definitions of events.
- DataTable Improvements
- Added support for csv file read/write and Laravel collection parsing into DataTables,
just add the separate package to composer "khill/datatableplus":"dev-master".
DataTablePlus extends the DataTable to add the extra functions and Lavacharts will seamlessly
create DataTablePluses over DataTables if available via composer.
- Added ScatterChart & TableChart
- Added Format#formatColumn method to format datatable columns.
- Added new formats.
- ArrowFormat
- BarFormat
- lava.js has been refactored:
- lava.get() replaced with:
- getChart(label, callback) -> callback(Google chartObj, Lava chartObj)
- Google chart object allows for using google's documented chart methods
- Lava chart object contains all relevant info about the chart
- chart, data, options, formats etc...
- getDashboard(label, callback) -> callback(Google dashboardObj, Lava dashboardObj)
- Google dashboard object allows for using google's documented dashboard methods
- Lava dashboard object contains all relevant info about the dashboard
- dashboard, control bindings, chart wrapper, data, options, etc...
- lava.ready() used to wrap other lava.js interaction.
- Called after all of the google jsapi is loaded and the charts are rendered.
- 2.5.7
- AJAX data loading bugfixes
- 2.5.6
- Fixes for AJAX chart loading
- 2.5.5
- Blade extensions fix
- 2.5.4
- Fixed namespace bug
- 2.5.3
- Added column roles
- 2.5.2
- AddedTimeOfDay columns
- 2.5.1
- Lava.js bug fixes
- 2.5.0
- Ajax chart loading
- 2.4.2
- Added Lava#exists() method for checking if a chart exists
- 2.4.1
- Added focusTarget to Line and Area charts
- 2.4.0
- BarCharts added
- Cleaned up code to PSR2
- Changed from PSR0 -> PSR4
- 2.3.0
- Added jsapi() method for manual script placement.
- 2.2.1
- Timezone fixes
Now they can be set with the constructor when creating a DataTable.
- 2.2.0
- Gauge Chart support
- 2.1.0
- Calendar Chart support
- 2.0.5
- Updated Carbon
- Laravel 5 compatibility
- 2.0.4
- Multiple chart bug fixes
- 2.0.3
- Fixing event bugs
- 2.0.2
- Responsive charts
- 2.0.1
- Multiple chart support
- 2.0.0
- Its Here!
- 2.0.0-beta1
- Passed 75% test coverage
- Added new options to TextStyle
- Bold
- Italic
- 2.0.0-alpha4
- Added Events
- select
- onmouseover
- onmouseout
- 2.0.0-alpha3
- Added DataTable column formatters
- DateFormat
- NumberFormat
- 2.0.0-alpha2
- Added render method in favor of outputInto method
- Added blade template extensions for seamless chart rendering
- Moar tests!
- 2.0.0-alpha1
- Refactored the main Lavacharts class to not be static anymore (yay!)
- Moved the creation of the javascript into it's own class
- Added a new class "Volcano" to store all the charts.
- Modified the charts to not statically call the Lavacharts functions
- DataTables are no longer magic, but applied via method chaining
- Added render method in favor of outputInto method
- Added blade template extensions as aliases to the render method
- Tests tests tests!
- Using phpcs to bring all the code up to PSR2 standards

14
vendor/khill/lavacharts/CONTRIBUTORS.md vendored Normal file
View File

@@ -0,0 +1,14 @@
# Contributors
Thank you for finding bugs, helping me fix them, pull requests, issues and anything else.
- [deringer](https://github.com/deringer)
- [MicahKV](micah138@yahoo.com)
- [rajivseelam](https://github.com/rajivseelam)
- [SendDerek](https://github.com/SendDerek)
- [stevebauman](https://github.com/stevebauman)
- [Stonos](https://github.com/Stonos)
- [tobias-kuendig](https://github.com/tobias-kuendig)
- [twify93](https://github.com/twify93)
If your name is not on this list and needs to be, I'm sorry! Please add it in a pull request and I will merge it in.

23
vendor/khill/lavacharts/LICENSE vendored Normal file
View File

@@ -0,0 +1,23 @@
Lavacharts - A PHP wrapper library for the Google Chart API
Copyright (c) 2017 Kevin Hill
The MIT License (MIT)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

248
vendor/khill/lavacharts/README.md vendored Normal file
View File

@@ -0,0 +1,248 @@
# Lavacharts 3.1.11
[![Total Downloads](https://img.shields.io/packagist/dt/khill/lavacharts.svg?style=plastic)](https://packagist.org/packages/khill/lavacharts)
[![License](https://img.shields.io/packagist/l/khill/lavacharts.svg?style=plastic)](http://opensource.org/licenses/MIT)
[![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%205.4-8892BF.svg?style=plastic)](https://php.net/)
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/kevinkhill/lavacharts?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
[![PayPal](https://img.shields.io/badge/paypal-donate-yellow.svg?style=plastic)](https://www.paypal.me/kevinkhill/)
Lavacharts is a graphing / chart library for PHP5.4+ that wraps the Google Chart API.
Stable:
[![Current Release](https://img.shields.io/github/release/kevinkhill/lavacharts.svg?style=plastic)](https://github.com/kevinkhill/lavacharts/releases)
[![Build Status](https://img.shields.io/travis/kevinkhill/lavacharts/3.1.svg?style=plastic)](https://travis-ci.org/kevinkhill/lavacharts)
[![Coverage Status](https://img.shields.io/coveralls/kevinkhill/lavacharts/3.1.svg?style=plastic)](https://coveralls.io/r/kevinkhill/lavacharts?branch=3.1)
Dev:
[![Development Release](https://img.shields.io/badge/release-dev--master-brightgreen.svg?style=plastic)](https://github.com/kevinkhill/lavacharts/tree/master)
[![Build Status](https://img.shields.io/travis/kevinkhill/lavacharts/master.svg?style=plastic)](https://travis-ci.org/kevinkhill/lavacharts)
[![Coverage Status](https://img.shields.io/coveralls/kevinkhill/lavacharts/master.svg?style=plastic)](https://coveralls.io/r/kevinkhill/lavacharts?branch=master)
## Package Features
- **Updated!** Laravel 5.5+ auto-discovery
- Any option for customizing charts that Google supports, Lavacharts should as well. Just use the chart constructor to assign any customization options you wish!
- Visit [Google's Chart Gallery](https://developers.google.com/chart/interactive/docs/gallery) for details on available options
- Custom JavaScript module for interacting with charts client-side
- AJAX data reloading
- Fetching charts
- Events integration
- Column Formatters & Roles
- Blade template extensions for Laravel
- Twig template extensions for Symfony
- [Carbon](https://github.com/briannesbitt/Carbon) support for date/datetime/timeofday columns
- Now supporting **22** Charts!
- Annotation, Area, Bar, Bubble, Calendar, Candlestick, Column, Combo, Gantt, Gauge, Geo, Histogram, Line, Org, Pie, Sankey, Scatter, SteppedArea, Table, Timeline, TreeMap, and WordTree!
### For complete documentation, please visit [lavacharts.com](http://lavacharts.com/)
#### Upgrade guide: [Migrating from 2.5.x to 3.0.x](https://github.com/kevinkhill/lavacharts/wiki/Upgrading-from-2.5-to-3.0)
#### For contributing, a handy guide [can be found here](https://github.com/kevinkhill/lavacharts/blob/master/.github/CONTRIBUTING.md)
---
## Installing
In your project's main `composer.json` file, add this line to the requirements:
```json
"khill/lavacharts": "^3.1"
```
Run Composer to install Lavacharts:
```bash
$ composer update
```
## Framework Agnostic
If you are using Lavacharts with Silex, Lumen or your own Composer project, that's no problem! Just make sure to:
`require 'vendor/autoload.php';` within you project and create an instance of Lavacharts: `$lava = new Khill\Lavacharts\Lavacharts;`
## Laravel
To integrate Lavacharts into Laravel, a ServiceProvider has been included.
### Laravel ~5.5
Thanks to the fantastic new [Package Auto-Discovery](https://laravel-news.com/package-auto-discovery) feature added in 5.5, you're ready to go, no registration required :+1:
#### Configuration
To modify the default configuration of Lavacharts, datetime formats for datatables or adding your maps api key...
Publish the configuration with `php artisan vendor:publish --tag=lavacharts`
### Laravel ~5.4
Register Lavacharts in your app by adding these lines to the respective arrays found in `config/app.php`:
```php
<?php
// config/app.php
// ...
'providers' => [
// ...
Khill\Lavacharts\Laravel\LavachartsServiceProvider::class,
],
// ...
'aliases' => [
// ...
'Lava' => Khill\Lavacharts\Laravel\LavachartsFacade::class,
]
```
#### Configuration
To modify the default configuration of Lavacharts, datetime formats for datatables or adding your maps api key...
Publish the configuration with `php artisan vendor:publish --tag=lavacharts`
### Laravel ~4
Register Lavacharts in your app by adding these lines to the respective arrays found in `app/config/app.php`:
```php
<?php
// app/config/app.php
// ...
'providers' => array(
// ...
"Khill\Lavacharts\Laravel\LavachartsServiceProvider",
),
// ...
'aliases' => array(
// ...
'Lava' => "Khill\Lavacharts\Laravel\LavachartsFacade",
)
```
#### Configuration
To modify the default configuration of Lavacharts, datetime formats for datatables or adding your maps api key...
Publish the configuration with `php artisan config:publish khill/lavacharts`
## Symfony
The package also includes a Bundle for Symfony to enable Lavacharts as a service that can be pulled from the Container.
### Add Bundle
Add the bundle to the registerBundles method in the AppKernel, found at `app/AppKernel.php`:
```php
<?php
// app/AppKernel.php
class AppKernel extends Kernel
{
// ..
public function registerBundles()
{
$bundles = array(
// ...
new Khill\Lavacharts\Symfony\Bundle\LavachartsBundle(),
);
}
}
```
### Import Config
Add the service definition to the `app/config/config.yml` file
```yaml
imports:
# ...
- { resource: "@LavachartsBundle/Resources/config/services.yml"
```
# Usage
The creation of charts is separated into two parts:
First, within a route or controller, you define the chart, the data table, and the customization of the output.
Second, within a view, you use one line and the library will output all the necessary JavaScript code for you.
## Basic Example
Here is an example of the simplest chart you can create: A line chart with one dataset and a title, no configuration.
### Controller
Setting up your first chart.
#### Data
```php
$data = $lava->DataTable();
$data->addDateColumn('Day of Month')
->addNumberColumn('Projected')
->addNumberColumn('Official');
// Random Data For Example
for ($a = 1; $a < 30; $a++) {
$rowData = [
"2017-4-$a", rand(800,1000), rand(800,1000)
];
$data->addRow($rowData);
}
```
Arrays work for datatables as well...
```php
$data->addColumns([
['date', 'Day of Month'],
['number', 'Projected'],
['number', 'Official']
]);
```
Or you can `use \Khill\Lavacharts\DataTables\DataFactory` [to create DataTables in another way](https://gist.github.com/kevinkhill/0c7c5f6211c7fd8f9658)
#### Chart Options
Customize your chart, with any options found in Google's documentation. Break objects down into arrays and pass to the chart.
```php
$lava->LineChart('Stocks', $data, [
'title' => 'Stock Market Trends',
'animation' => [
'startup' => true,
'easing' => 'inAndOut'
],
'colors' => ['blue', '#F4C1D8']
]);
```
#### Output ID
The chart will needs to be output into a div on the page, so an html ID for a div is needed.
Here is where you want your chart `<div id="stocks-div"></div>`
- If no options for the chart are set, then the third parameter is the id of the output:
```php
$lava->LineChart('Stocks', $data, 'stocks-div');
```
- If there are options set for the chart, then the id may be included in the options:
```php
$lava->LineChart('Stocks', $data, [
'elementId' => 'stocks-div'
'title' => 'Stock Market Trends'
]);
```
- The 4th parameter will also work:
```php
$lava->LineChart('Stocks', $data, [
'title' => 'Stock Market Trends'
], 'stocks-div');
```
## View
Pass the main Lavacharts instance to the view, because all of the defined charts are stored within, and render!
```php
<?= $lava->render('LineChart', 'Stocks', 'stocks-div'); ?>
```
Or if you have multiple charts, you can condense theh view code withL
```php
<?= $lava->renderAll(); ?>
```
# Changelog
The complete changelog can be found [here](https://github.com/kevinkhill/lavacharts/wiki/Changelog)
## Stargazers over time
[![Stargazers over time](https://starchart.cc/kevinkhill/lavacharts.svg)](https://starchart.cc/kevinkhill/lavacharts)

78
vendor/khill/lavacharts/composer.json vendored Normal file
View File

@@ -0,0 +1,78 @@
{
"name": "khill/lavacharts",
"description": "PHP wrapper library for the Google Chart API",
"keywords": [
"charts",
"graphs",
"google",
"laravel",
"symfony"
],
"homepage": "http://lavacharts.com",
"license": "MIT",
"authors": [
{
"name": "Kevin Hill",
"email": "kevinkhill@gmail.com",
"role": "Creator"
}
],
"support": {
"docs": "http://lavacharts.com",
"email": "kevinkhill@gmail.com",
"forum": "https://gitter.im/kevinkhill/lavacharts",
"wiki": "https://github.com/kevinkhill/lavacharts/wiki",
"source": "https://github.com/kevinkhill/lavacharts",
"issues": "https://github.com/kevinkhill/lavacharts/issues"
},
"suggest": {
"khill/datatableplus": "Adds extra features to DataTables such as csv and laravel collection parsing."
},
"require": {
"php": ">=5.4.0",
"nesbot/carbon": ">=1.14 <3.0"
},
"autoload": {
"psr-4": {
"Khill\\Lavacharts\\": "src/"
}
},
"require-dev": {
"phpunit/phpunit": "~4.8",
"mockery/mockery": "~0.9",
"squizlabs/php_codesniffer": "~2.5",
"satooshi/php-coveralls": "~1.0",
"codeclimate/php-test-reporter": "~0.3"
},
"autoload-dev": {
"psr-4": {
"Khill\\Lavacharts\\Tests\\": "tests/"
}
},
"scripts": {
"test": "phpunit -c phpunit.xml",
"cs": "phpcs --standard=PSR2 src tests",
"cbf" : "phpcbf --standard=PSR2 src tests",
"version": "php -r \"require(__DIR__.\\\"/src/Lavacharts.php\\\");echo \\Khill\\Lavacharts\\Lavacharts::VERSION;\"",
"lavajs:release" : "gulp --cwd javascript release && git add javascript/dist/lava.js && git commit -m 'Releasing new build of the lava.js module' && git push",
"lavajs:gulp" : "gulp --cwd javascript",
"lavajs:pull" : "git subtree --prefix=javascript pull lavajs master",
"lavajs:push" : "git subtree --prefix=javascript push lavajs master"
},
"extra": {
"laravel": {
"providers": [
"Khill\\Lavacharts\\Laravel\\LavachartsServiceProvider"
],
"aliases": {
"Lava": "Khill\\Lavacharts\\Laravel\\LavachartsFacade"
}
}
},
"config": {
"platform": {
"php": "5.4"
}
},
"minimum-stability": "stable"
}

2097
vendor/khill/lavacharts/composer.lock generated vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,17 @@
module.exports = function (config) {
config.set({
frameworks: ['jasmine','sinon'],
files: [
'./node_modules/jasmine-sinon/lib/jasmine-sinon.js',
'./dist/lava.js',
'./tests/lava.spec.js'
],
singleRun: false,
reporters: ['dots'],
port: 9876,
colors: true,
logLevel: config.LOG_ERROR,
autoWatch: true,
browsers: [(process.env.TRAVIS ? 'PhantomJS' : 'Chrome')]
});
};

View File

@@ -0,0 +1,19 @@
/* jshint undef: true */
/* globals module, require, phantom, window */
"use strict";
var resemble = require('node-resemble-js');
var rendersDir = './javascript/phantomjs/renders/';
var args = process.argv;
var chart = args[2];
resemble(rendersDir + chart + '.png').compareTo(rendersDir + chart + '.png').onComplete(function (data) {
//console.log(data);
if (Number(data.misMatchPercentage) <= 0.01) {
console.log('Pass!');
} else {
console.log('Fail!');
}
});

View File

@@ -0,0 +1,33 @@
/* jshint undef: true */
/* globals module, require, phantom, window */
"use strict";
var page = require('webpage').create();
var args = require('system').args;
var renderOutputDir = './javascript/phantomjs/renders';
var url = 'http://127.0.0.1:5000/';
var chart = args[1];
page.onConsoleMessage = function(msg) {
console.log(msg);
};
page.open(url + chart, function (status) {
if (status !== "success") {
console.log('Error loading page.');
} else {
console.log('Page loaded, waiting on chart to render.');
page.onCallback = function (data) {
page.render(renderOutputDir + '/' + chart + '.png');
console.log('Saved to disk.');
phantom.exit();
//console.log('CALLBACK: ' + JSON.stringify(data));
// Prints 'CALLBACK: { "hello": "world" }'
};
}
});

View File

@@ -0,0 +1,44 @@
/* jshint undef: true, unused: true */
/* globals window, require */
/**
* Lava.js entry point for Browserify
*/
(function(){
"use strict";
var window = this;
var debounced = null;
var debounceTimeout = 250;
var bind = require('lodash').bind;
var ready = require('document-ready');
var addResizeEvent = require('./lava/Utils').addResizeEvent;
window.lava = require('./lava/Lava.js');
/**
* Once the window is ready...
*/
ready(function() {
/**
* Adding the resize event listener for redrawing charts.
*/
addResizeEvent(function (event) {
var redraw = bind(event.target.lava.redrawCharts, window.lava);
console.log('Window resized, redrawing charts');
clearTimeout(debounced);
debounced = setTimeout(redraw, debounceTimeout);
});
/**
* Let's go!
*/
if (window.lava.options.auto_run === true) {
window.lava.run();
}
});
}.apply(window));

View File

@@ -0,0 +1,162 @@
/* jshint undef: true */
/* globals document, google, require, module */
/**
* Chart class used for storing all the needed configuration for rendering.
*
* @typedef {Function} Chart
* @property {string} label - Label for the chart.
* @property {string} type - Type of chart.
* @property {Object} element - Html element in which to render the chart.
* @property {Object} chart - Google chart object.
* @property {string} package - Type of Google chart package to load.
* @property {boolean} pngOutput - Should the chart be displayed as a PNG.
* @property {Object} data - Datatable for the chart.
* @property {Object} options - Configuration options for the chart.
* @property {Array} formats - Formatters to apply to the chart data.
* @property {Object} promises - Promises used in the rendering chain.
* @property {Function} init - Initializes the chart.
* @property {Function} configure - Configures the chart.
* @property {Function} render - Renders the chart.
* @property {Function} uuid - Creates identification string for the chart.
* @property {Object} _errors - Collection of errors to be thrown.
*/
/**
* Chart module
*
* @class Chart
* @module lava/Chart
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @license MIT
*/
module.exports = (function() {
'use strict';
var Q = require('q');
/**
* Chart Class
*
* This is the javascript version of a lavachart with methods for interacting with
* the google chart and the PHP lavachart output.
*
* @param {string} type
* @param {string} label
* @constructor
*/
function Chart (type, label) {
this.label = label;
this.type = type;
this.element = null;
this.chart = null;
this.package = null;
this.pngOutput = false;
this.data = {};
this.options = {};
this.formats = [];
this.promises = {
configure: Q.defer(),
rendered: Q.defer()
};
this.init = function(){};
this.configure = function(){};
this.render = function(){};
this.uuid = function() {
return this.type+'::'+this.label;
};
this._errors = require('./Errors.js');
}
/**
* Sets the data for the chart by creating a new DataTable
*
* @public
* @external "google.visualization.DataTable"
* @see {@link https://developers.google.com/chart/interactive/docs/reference#DataTable|DataTable Class}
* @param {object} data Json representation of a DataTable
* @param {Array.<Array>} data.cols Array of column definitions
* @param {Array.<Array>} data.rows Array of row definitions
*/
Chart.prototype.setData = function (data) {
this.data = new google.visualization.DataTable(data);
};
/**
* Sets the options for the chart.
*
* @public
* @param {object} options
*/
Chart.prototype.setOptions = function (options) {
this.options = options;
};
/**
* Sets whether the chart is to be rendered as PNG or SVG
*
* @public
* @param {string|int} png
*/
Chart.prototype.setPngOutput = function (png) {
this.pngOutput = Boolean(typeof png == 'undefined' ? false : png);
};
/**
* Set the ID of the output element for the Dashboard.
*
* @public
* @param {string} elemId
* @throws ElementIdNotFound
*/
Chart.prototype.setElement = function (elemId) {
this.element = document.getElementById(elemId);
if (! this.element) {
throw new this._errors.ElementIdNotFound(elemId);
}
};
/**
* Redraws the chart.
*
* @public
*/
Chart.prototype.redraw = function() {
this.chart.draw(this.data, this.options);
};
/**
* Draws the chart as a PNG instead of the standard SVG
*
* @public
* @external "chart.getImageURI"
* @see {@link https://developers.google.com/chart/interactive/docs/printing|Printing PNG Charts}
*/
Chart.prototype.drawPng = function() {
var img = document.createElement('img');
img.src = this.chart.getImageURI();
this.element.innerHTML = '';
this.element.appendChild(img);
};
/**
* Formats columns of the DataTable.
*
* @public
* @param {Array.<Object>} formatArr Array of format definitions
*/
Chart.prototype.applyFormats = function (formatArr) {
for(var a=0; a < formatArr.length; a++) {
var formatJson = formatArr[a];
var formatter = new google.visualization[formatJson.type](formatJson.config);
formatter.format(this.data, formatJson.index);
}
};
return Chart;
}());

View File

@@ -0,0 +1,74 @@
/* jshint undef: true */
/* globals document, google, require, module */
/**
* Dashboard module
*
* @class Dashboard
* @module lava/Dashboard
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @license MIT
*/
module.exports = (function() {
'use strict';
var Q = require('q');
/**
* Dashboard Class
*
* This is the javascript version of a dashboard with methods for interacting with
* the google chart and the PHP lavachart output.
*
* @param {String} label
* @constructor
*/
function Dashboard (label) {
this.label = label;
this.type = 'Dashboard';
this.element = null;
this.data = null;
this.bindings = [];
this.dashboard = null;
this.deferred = Q.defer();
this.init = function(){};
this.configure = function(){};
this.render = function(){};
this.uuid = function() {
return this.type+'::'+this.label;
};
this._errors = require('./Errors.js');
}
/**
* Sets the data for the chart by creating a new DataTable
*
* @external "google.visualization.DataTable"
* @see {@link https://developers.google.com/chart/interactive/docs/reference#DataTable|DataTable}
* @param {Object} data Json representation of a DataTable
* @param {Array.<Array>} data.cols Array of column definitions
* @param {Array.<Array>} data.rows Array of row definitions
*/
Dashboard.prototype.setData = function (data) {
this.data = new google.visualization.DataTable(data);
};
/**
* Set the ID of the output element for the Dashboard.
*
* @public
* @param {string} elemId
* @throws ElementIdNotFound
*/
Dashboard.prototype.setElement = function (elemId) {
this.element = document.getElementById(elemId);
if (! this.element) {
throw new this._errors.ElementIdNotFound(elemId);
}
};
return Dashboard;
}());

View File

@@ -0,0 +1,82 @@
/* jshint undef: true */
/* globals module, require */
'use strict';
/**
* Errors module
*
* @module lava/Errors
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @license MIT
*/
var LavachartsError = function (message) {
this.name = 'LavachartsError';
this.message = (message || '');
};
LavachartsError.prototype = Error.prototype;
/**
* InvalidCallback Error
*
* thrown when when anything but a function is given as a callback
* @type {function}
*/
var InvalidCallback = function (callback) {
this.name = 'InvalidCallback';
this.message = '[Lavacharts] ' + typeof callback + ' is not a valid callback.';
};
InvalidCallback.prototype = LavachartsError.prototype;
module.exports.InvalidCallback = InvalidCallback;
/**
* InvalidLabel Error
*
* Thrown when when anything but a string is given as a label.
*
* @type {function}
*/
module.exports.InvalidLabel = function (label) {
this.name = 'InvalidLabel';
this.message = '[Lavacharts] "' + typeof label + '" is not a valid label.';
};
module.exports.InvalidLabel.prototype = Error.prototype;
/**
* ElementIdNotFound Error
*
* Thrown when when anything but a string is given as a label.
*
* @type {function}
*/
module.exports.ElementIdNotFound = function (elemId) {
this.name = 'ElementIdNotFound';
this.message = '[Lavacharts] DOM node #' + elemId + ' was not found.';
};
module.exports.ElementIdNotFound.prototype = Error.prototype;
/**
* ChartNotFound Error
*
* Thrown when when the getChart() method cannot find a chart with the given label.
*
* @type {function}
*/
module.exports.ChartNotFound = function (label) {
this.name = 'ChartNotFound';
this.message = '[Lavacharts] Chart with label "' + label + '" was not found.';
};
module.exports.ChartNotFound.prototype = Error.prototype;
/**
* DashboardNotFound Error
*
* Thrown when when the getDashboard() method cannot find a chart with the given label.
*
* @type {function}
*/
module.exports.DashboardNotFound = function (label) {
this.name = 'DashboardNotFound';
this.message = '[Lavacharts] Dashboard with label "' + label + '" was not found.';
};
module.exports.DashboardNotFound.prototype = Error.prototype;

View File

@@ -0,0 +1,540 @@
/* jshint undef: true, unused: true */
/* globals window, document, console, google, module, require */
/**
* lava.js module
*
* @module lava/Lava
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @license http://opensource.org/licenses/MIT MIT
*/
module.exports = (function() {
'use strict';
var Q = require('q');
// var Promise = require('bluebird');
var _ = require('lodash');
var util = require('util');
var EventEmitter = require('events');
function Lava() {
/**
* Defining the Chart class within the module.
*
* @type {Chart}
*/
this.Chart = require('./Chart.js');
/**
* Defining the Dashboard class within the module.
*
* @type {Dashboard}
*/
this.Dashboard = require('./Dashboard.js');
/**
* Urls to Google's static loader
*
* @type {string}
* @public
*/
this.gstaticUrl = 'https://www.gstatic.com/charts/loader.js';
/**
* JSON object of config items.
*
* @type {Object}
* @private
*/
this.options = (function () {
if (typeof OPTIONS_JSON !== 'object') {
return {};
}
return OPTIONS_JSON;
}());
/**
* Array of charts stored in the module.
*
* @type {Array.<Chart>}
* @private
*/
this._charts = [];
/**
* Array of dashboards stored in the module.
*
* @type {Array.<Dashboard>}
* @private
*/
this._dashboards = [];
/**
* Ready callback to be called when the module is finished running.
*
* @callback _readyCallback
* @private
*/
this._readyCallback = _.noop();
/**
* Error definitions for the module.
*
* @private
*/
this._errors = require('./Errors.js');
/**
* Apply the EventEmitter methods to Lava
*/
EventEmitter.call(this);
}
/**
* Inherit from the EventEmitter
*/
util.inherits(Lava, EventEmitter);
/**
* Initialize the Lava.js module by attaching the event listeners
* and calling the charts' and dashboards' init methods
*
* @public
*/
Lava.prototype.init = function () {
console.log('[lava.js] Initializing');
var $lava = this;
var readyCount = 0;
this.on('ready', function (renderable) {
console.log('[lava.js] ' + renderable.uuid() + ' -> ready');
readyCount++;
if (readyCount === $lava._getRenderables().length) {
console.log('[lava.js] Loading Google');
$lava._loadGoogle().then(function() {
return $lava._mapRenderables(function (renderable) {
console.log('[lava.js] ' + renderable.uuid() + ' -> configuring');
return renderable.configure();
});
}).then(function() {
return $lava._mapRenderables(function (renderable) {
console.log('[lava.js] ' + renderable.uuid() + ' -> rendering');
return renderable.render();
});
}).then(function() {
console.log('[lava.js] Ready, firing ready callback');
$lava._readyCallback();
});
}
});
};
/**
* Runs the Lava.js module by calling all the renderables' init methods
*
* @public
*/
Lava.prototype.run = function () {
this.init();
this._forEachRenderable(function (renderable) {
console.log('[lava.js] ' + renderable.uuid() + ' -> initializing');
renderable.init();
});
};
/**
* Stores a renderable lava object within the module.
*
* @param {Chart|Dashboard} renderable
*/
Lava.prototype.store = function (renderable) {
if (renderable instanceof this.Chart) {
this.storeChart(renderable);
}
if (renderable instanceof this.Dashboard) {
this.storeDashboard(renderable);
}
};
/**
* Assigns a callback for when the charts are ready to be interacted with.
*
* This is used to wrap calls to lava.loadData() or lava.loadOptions()
* to protect against accessing charts that aren't loaded yet
*
* @public
* @param {Function} callback
*/
Lava.prototype.ready = function (callback) {
if (typeof callback !== 'function') {
throw new this._errors.InvalidCallback(callback);
}
this._readyCallback = callback;
};
/**
* Event wrapper for chart events.
*
*
* Used internally when events are applied so the user event function has
* access to the chart within the event callback.
*
* @param {Object} event
* @param {Object} lavachart
* @param {Function} callback
* @return {Function}
*/
Lava.prototype.event = function (event, lavachart, callback) {
if (typeof callback !== 'function') {
throw new this._errors.InvalidCallback(callback);
}
return callback(event, lavachart.chart, lavachart.data);
};
/**
* Loads new data into the chart and redraws.
*
*
* Used with an AJAX call to a PHP method returning DataTable->toJson(),
* a chart can be dynamically update in page, without reloads.
*
* @public
* @param {string} label
* @param {string} json
* @param {Function} callback
*/
Lava.prototype.loadData = function (label, json, callback) {
if (typeof callback === 'undefined') {
callback = _.noop;
}
if (typeof callback !== 'function') {
throw new this._errors.InvalidCallback(callback);
}
this.getChart(label, function (chart) {
if (typeof json.data !== 'undefined') {
chart.setData(json.data);
} else {
chart.setData(json);
}
if (typeof json.formats !== 'undefined') {
chart.applyFormats(json.formats);
}
chart.redraw();
callback(chart);
});
};
/**
* Loads new options into a chart and redraws.
*
*
* Used with an AJAX call, or javascript events, to load a new array of options into a chart.
* This can be used to update a chart dynamically, without reloads.
*
* @public
* @param {string} label
* @param {string} json
* @param {Function} callback
*/
Lava.prototype.loadOptions = function (label, json, callback) {
if (typeof callback === 'undefined') {
callback = callback || _.noop;
}
if (typeof callback !== 'function') {
throw new this._errors.InvalidCallback(callback);
}
this.getChart(label, function (chart) {
chart.setOptions(json);
chart.redraw();
callback(chart);
});
};
/**
* Redraws all of the registered charts on screen.
*
* This method is attached to the window resize event with a 300ms debounce
* to make the charts responsive to the browser resizing.
*/
Lava.prototype.redrawCharts = function() {
this._forEachRenderable(function (renderable) {
console.log('[lava.js] ' + renderable.uuid() + ' -> redrawing');
var redraw = _.bind(renderable.redraw, renderable);
redraw();
});
};
/**
* Create a new Chart.
*
* @public
* @param {string} type Type of chart to create
* @param {string} label Label for the chart
* @return {Chart}
*/
Lava.prototype.createChart = function (type, label) {
return new this.Chart(type, label);
};
/**
* Stores a chart within the module.
*
* @public
* @param {Chart} chart
*/
Lava.prototype.storeChart = function (chart) {
this._charts.push(chart);
};
/**
* Returns the LavaChart javascript objects
*
*
* The LavaChart object holds all the user defined properties such as data, options, formats,
* the GoogleChart object, and relative methods for internal use.
*
* The GoogleChart object is available as ".chart" from the returned LavaChart.
* It can be used to access any of the available methods such as
* getImageURI() or getChartLayoutInterface().
* See https://google-developers.appspot.com/chart/interactive/docs/gallery/linechart#methods
* for some examples relative to LineCharts.
*
* @public
* @param {string} label
* @param {Function} callback
* @throws InvalidLabel
* @throws InvalidCallback
* @throws ChartNotFound
*/
Lava.prototype.getChart = function (label, callback) {
if (typeof label !== 'string') {
throw new this._errors.InvalidLabel(label);
}
if (typeof callback !== 'function') {
throw new this._errors.InvalidCallback(callback);
}
var chart = _.find(this._charts, {label: label});
if (!chart) {
throw new this._errors.ChartNotFound(label);
}
callback(chart);
};
/**
* Create a new Dashboard with a given label.
*
* @public
* @param {string} label
* @return {Dashboard}
*/
Lava.prototype.createDashboard = function (label) {
return new this.Dashboard(label);
};
/**
* Stores a dashboard within the module.
*
* @public
* @param {Dashboard} dash
*/
Lava.prototype.storeDashboard = function (dash) {
this._dashboards.push(dash);
};
/**
* Retrieve a Dashboard from Lava.js
*
* @public
* @param {string} label Dashboard label
* @param {Function} callback Callback function
* @throws InvalidLabel
* @throws InvalidCallback
* @throws DashboardNotFound
*/
Lava.prototype.getDashboard = function (label, callback) {
if (typeof label !== 'string') {
throw new this._errors.InvalidLabel(label);
}
if (typeof callback !== 'function') {
throw new this._errors.InvalidCallback(callback);
}
var dash = _.find(this._dashboards, {label: label});
if (dash instanceof this.Dashboard === false) {
throw new this._errors.DashboardNotFound(label);
}
callback(dash);
};
/**
* Returns an array with the charts and dashboards.
*
* @private
* @return {Array}
*/
Lava.prototype._getRenderables = function () {
return _.concat(this._charts, this._dashboards);
};
/**
* Applies the callback to each of the charts and dashboards.
*
* @private
* @param {Function} callback
*/
Lava.prototype._forEachRenderable = function (callback) {
_.forEach(this._getRenderables(), callback);
};
/**
* Applies the callback and builds an array of return values
* for each of the charts and dashboards.
*
* @private
* @param {Function} callback
* @return {Array}
*/
Lava.prototype._mapRenderables = function (callback) {
return _.map(this._getRenderables(), callback);
};
/**
* Returns an array of the google packages to load.
*
* @private
* @return {Array}
*/
Lava.prototype._getPackages = function () {
return _.union(
_.map(this._charts, 'package'),
_.flatten(_.map(this._dashboards, 'packages'))
);
};
/**
* Check if Google's Static Loader is in page.
*
* @private
* @returns {boolean}
*/
Lava.prototype._googleIsLoaded = function () {
var scripts = document.getElementsByTagName('script');
var loaded = false;
for (var i = scripts.length; i--;) {
if (scripts[i].src === this.gstaticUrl) {
loaded = true;
}
}
return loaded;
};
/**
* Load the Google Static Loader and resolve the promise when ready.
*
* @private
* @returns {Promise}
*/
Lava.prototype._loadGoogle = function () {
var $lava = this;
var deferred = Q.defer();
var script = this._createScriptTag(deferred);
if (this._googleIsLoaded()) {
console.log('[lava.js] Static loader found, initializing window.google');
$lava._googleChartLoader(deferred);
} else {
console.log('[lava.js] Static loader not found, appending to head');
document.head.appendChild(script);
}
return deferred.promise;
};
/**
* Create a new script tag for the Google Static Loader.
*
* @private
* @param {Promise} deferred
* @returns {Element}
*/
Lava.prototype._createScriptTag = function (deferred) {
var script = document.createElement('script');
var $lava = this;
script.type = 'text/javascript';
script.async = true;
script.src = this.gstaticUrl;
script.onload = script.onreadystatechange = function (event) {
event = event || window.event;
if (event.type === 'load' || (/loaded|complete/.test(this.readyState))) {
this.onload = this.onreadystatechange = null;
$lava._googleChartLoader(deferred);
}
};
return script;
};
/**
* Runs the Google chart loader and resolves the promise.
*
* @param {Promise} deferred
* @private
*/
Lava.prototype._googleChartLoader = function (deferred) {
var config = {
packages: this._getPackages(),
language: this.options.locale
};
if (this.options.maps_api_key !== '') {
config.mapsApiKey = this.options.maps_api_key;
}
console.log('[lava.js] Google loaded with options:', config);
google.charts.load('current', config);
google.charts.setOnLoadCallback(deferred.resolve);
};
return new Lava();
}());

View File

@@ -0,0 +1,22 @@
/* jshint undef: true, unused: true */
/* globals exports, window */
/**
* Slightly modified event attachment handler.
*
* Credit to Alex V.
*
* @link https://stackoverflow.com/users/327934/alex-v
* @link http://stackoverflow.com/a/3150139
* @param {Function} callback
*/
exports.addResizeEvent = function (callback) {
if (window === null || typeof(window) === 'undefined') return;
if (window.addEventListener) {
window.addEventListener('resize', callback, false);
} else if (window.attachEvent) {
window.attachEvent('onresize', callback);
} else {
window['onresize'] = callback;
}
};

View File

@@ -0,0 +1,43 @@
/* jshint undef: true, unused: true */
/* globals lava, google */
(function(){
"use strict";
var $chart = lava.createChart('<chartType>', '<chartLabel>');
$chart.init = function() {
$chart.package = '<chartPackage>';
$chart.setElement('<elemId>');
$chart.setPngOutput(<pngOutput>);
$chart.configure = function () {
$chart.render = function (data) {
$chart.setData(<chartData>);
$chart.options = <chartOptions>;
$chart.chart = new <chartClass>($chart.element);
<formats>
<events>
$chart.chart.draw($chart.data, $chart.options);
if ($chart.pngOutput === true) {
$chart.drawPng();
}
$chart.promises.rendered.resolve();
return $chart.promises.rendered.promise;
};
$chart.promises.configure.resolve();
return $chart.promises.configure.promise;
};
lava.emit('ready', $chart);
};
lava.store($chart);
})();

View File

@@ -0,0 +1,34 @@
/* jshint undef: true, unused: true */
/* globals lava, google */
(function(){
"use strict";
var $dash = lava.createDashboard('<label>');
$dash.init = function () {
$dash.setElement('<elemId>');
$dash.packages = <packages>;
$dash.configure = function () {
$dash.render = function (data) {
$dash.dashboard = new <class>($dash.element);
$dash.setData(<chartData>);
<bindings>
$dash.dashboard.draw($dash.data);
lava.emit('rendered', $dash);
};
$dash.deferred.resolve();
return $dash.deferred.promise;
};
lava.emit('ready', $dash);
};
lava.store($dash);
})();

56
vendor/khill/lavacharts/phpunit.xml vendored Normal file
View File

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="vendor/autoload.php"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
syntaxCheck="true"
>
<testsuites>
<testsuite name="core">
<file>tests/LavachartsTest.php</file>
<file>tests/VolcanoTest.php</file>
</testsuite>
<testsuite name="charts">
<directory>tests/Charts/</directory>
</testsuite>
<testsuite name="dashboards">
<directory>tests/Dashboards/</directory>
</testsuite>
<testsuite name="datatables">
<directory>tests/DataTables/</directory>
</testsuite>
<testsuite name="javascript">
<directory>tests/Javascript/</directory>
</testsuite>
<testsuite name="values">
<directory>tests/Values/</directory>
</testsuite>
</testsuites>
<filter>
<blacklist>
<directory>vendor/</directory>
<directory>tests/</directory>
<directory>src/Laravel/</directory>
<directory>src/Symfony/</directory>
</blacklist>
</filter>
<logging>
<log type="coverage-clover"
target="build/logs/clover.xml"
charset="UTF-8"
highlight="false"
lowUpperBound="35"
highLowerBound="70" />
<log type="testdox-html"
target="build/logs/testdox.html" />
</logging>
<listeners>
<listener class="\Mockery\Adapter\Phpunit\TestListener" />
</listeners>
</phpunit>

View File

@@ -0,0 +1,164 @@
<?php
namespace Khill\Lavacharts\Builders;
use Khill\Lavacharts\Charts\ChartFactory;
use Khill\Lavacharts\DataTables\DataTable;
use Khill\Lavacharts\Exceptions\InvalidChartType;
/**
* Class ChartBuilder
*
* This class is used to build charts by setting the properties, instead of trying to cover
* everything in the constructor.
*
* @package Khill\Lavacharts\Builders
* @since 3.1.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class ChartBuilder extends GenericBuilder
{
/**
* Type of chart to create.
*
* @var string
*/
protected $type = null;
/**
* Datatable for the chart.
*
* @var \Khill\Lavacharts\DataTables\DataTable
*/
protected $datatable = null;
/**
* Options for the chart.
*
* @var array
*/
protected $options = [];
/**
* The chart's png output override.
*
* @var bool
*/
protected $pngOutput = false;
/**
* The chart's material output override.
*
* @var bool
*/
protected $materialOutput = false;
/**
* Set the type of chart to create.
*
* @param string $type Type of chart.
* @return self
* @throws \Khill\Lavacharts\Exceptions\InvalidChartType description
*/
public function setType($type)
{
if (ChartFactory::isValidChart($type) === false) {
throw new InvalidChartType($type);
}
$this->type = $type;
return $this;
}
/**
* Sets the DataTable for the chart.
*
* @param \Khill\Lavacharts\DataTables\DataTable $datatable
* @return self
*/
public function setDatatable(DataTable $datatable = null)
{
$this->datatable = $datatable;
return $this;
}
/**
* Sets the options for the chart.
*
* @param array $options
* @return self
*/
public function setOptions($options)
{
$this->options = $options;
return $this;
}
/**
* Sets the charts output override.
*
* @param bool $png
* @return self
*/
public function setPngOutput($png)
{
$this->pngOutput = (is_bool($png) ? $png : false);
return $this;
}
/**
* Sets the charts output override.
*
* @param bool $material
* @return self
*/
public function setMaterialOutput($material)
{
$this->materialOutput = (is_bool($material) ? $material : false);
return $this;
}
/**
* Creates the chart from the assigned values.
*
* @return \Khill\Lavacharts\Charts\Chart
*/
public function getChart()
{
$chart = '\\Khill\\Lavacharts\\Charts\\' . $this->type;
/** @var \Khill\Lavacharts\Charts\Chart $newChart */
$newChart = new $chart(
$this->label,
$this->datatable,
$this->options
);
if (array_key_exists('elementId', $this->options)) {
$newChart->setElementId($this->options['elementId']);
}
if (isset($this->elementId)) {
$newChart->setElementId($this->elementId);
}
if (method_exists($newChart, 'setPngOutput')) {
$newChart->setPngOutput($this->pngOutput);
}
if (method_exists($newChart, 'setMaterialOutput')) {
$newChart->setMaterialOutput($this->materialOutput);
}
return $newChart;
}
}

View File

@@ -0,0 +1,79 @@
<?php
namespace Khill\Lavacharts\Builders;
use \Khill\Lavacharts\Dashboards\Dashboard;
use \Khill\Lavacharts\DataTables\DataTable;
/**
* Class DashboardBuilder
*
* This class is used to build dashboards by setting the properties, instead of trying to cover
* everything in the constructor.
*
* @package Khill\Lavacharts\Builders
* @since 3.0.3
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class DashboardBuilder extends GenericBuilder
{
/**
* Datatable for the chart.
*
* @var \Khill\Lavacharts\DataTables\DataTable
*/
protected $datatable = null;
/**
* Bindings to use for the dashboard.
*
* @var \Khill\Lavacharts\Dashboards\Bindings\Binding[]
*/
protected $bindings = [];
/**
* Set the bindings for the Dashboard.
*
* @param \Khill\Lavacharts\Dashboards\Bindings\Binding[] $bindings Array of bindings
* @return $this
*/
public function setBindings(array $bindings)
{
$this->bindings = $bindings;
return $this;
}
/**
* Set the DataTable for the dashboard
*
* @param \Khill\Lavacharts\DataTables\DataTable $datatable
* @return $this
*/
public function setDataTable(DataTable $datatable)
{
$this->datatable = $datatable;
return $this;
}
/**
* Returns the built Dashboard.
*
* @return \Khill\Lavacharts\Dashboards\Dashboard
*/
public function getDashboard()
{
$dash = new Dashboard(
$this->label,
$this->datatable,
$this->elementId
);
return $dash->setBindings($this->bindings);
}
}

View File

@@ -0,0 +1,64 @@
<?php
namespace Khill\Lavacharts\Builders;
use Khill\Lavacharts\Values\Label;
use Khill\Lavacharts\Values\ElementId;
/**
* Class GenericBuilder
*
* This class will provide some common methods to the other builders.
*
* @package Khill\Lavacharts\Builders
* @since 3.1.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class GenericBuilder
{
/**
* The chart's unique label.
*
* @var \Khill\Lavacharts\Values\Label
*/
protected $label = null;
/**
* The chart's unique elementId.
*
* @var \Khill\Lavacharts\Values\ElementId
*/
protected $elementId = null;
/**
* Creates and sets the label for the chart.
*
* @param string|\Khill\Lavacharts\Values\Label $label
* @return self
* @throws \Khill\Lavacharts\Exceptions\InvalidLabel
*/
public function setLabel($label)
{
$this->label = new Label($label);
return $this;
}
/**
* Creates and sets the elementId for the chart.
*
* @param string|\Khill\Lavacharts\Values\ElementId $elementId
* @return self
* @throws \Khill\Lavacharts\Exceptions\InvalidElementId
*/
public function setElementId($elementId)
{
$this->elementId = new ElementId($elementId);
return $this;
}
}

View File

@@ -0,0 +1,43 @@
<?php
namespace Khill\Lavacharts\Charts;
/**
* AnnotationChart Class
*
* Annotation charts are interactive time series line charts that support annotations.
* Unlike the annotated timeline, which uses Flash, annotation charts are SVG/VML and
* should be preferred whenever possible.
*
*
* @package Khill\Lavacharts\Charts
* @since 3.0.5
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class AnnotationChart extends Chart
{
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'AnnotationChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'annotationchart';
}

View File

@@ -0,0 +1,46 @@
<?php
namespace Khill\Lavacharts\Charts;
use \Khill\Lavacharts\Support\Traits\PngRenderableTrait as PngRenderable;
/**
* AreaChart Class
*
* An area chart that is rendered within the browser using SVG or VML. Displays
* tips when hovering over points.
*
*
* @package Khill\Lavacharts\Charts
* @since 1.0.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class AreaChart extends Chart
{
use PngRenderable;
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'AreaChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'corechart';
}

View File

@@ -0,0 +1,78 @@
<?php
namespace Khill\Lavacharts\Charts;
use \Khill\Lavacharts\Support\Traits\PngRenderableTrait as PngRenderable;
use \Khill\Lavacharts\Support\Traits\MaterialRenderableTrait as MaterialRenderable;
/**
* BarChart Class
*
* A vertical bar chart that is rendered within the browser using SVG or VML.
* Displays tips when hovering over bars. For a horizontal version of this
* chart, see the Bar Chart.
*
*
* @package Khill\Lavacharts\Charts
* @since 2.3.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class BarChart extends Chart
{
use PngRenderable, MaterialRenderable;
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'BarChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'corechart';
/**
* Returns the chart visualization class.
*
* @since 3.1.0
* @return string
*/
public function getJsPackage()
{
if ($this->material) {
return 'bar';
} else {
return static::VISUALIZATION_PACKAGE;
}
}
/**
* Returns the chart visualization package.
*
* @since 3.1.0
* @return string
*/
public function getJsClass()
{
if ($this->material) {
return 'google.charts.Bar';
} else {
return 'google.visualization.' . static::TYPE;
}
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace Khill\Lavacharts\Charts;
use \Khill\Lavacharts\Support\Traits\PngRenderableTrait as PngRenderable;
/**
* BubbleChart Class
*
* A bubble chart is used to visualize a data set with two to four dimensions.
* The first two dimensions are visualized as coordinates, the third as color
* and the fourth as size.
*
*
* @package Khill\Lavacharts\Charts
* @since 3.1.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class BubbleChart extends Chart
{
use PngRenderable;
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'BubbleChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'corechart';
}

View File

@@ -0,0 +1,54 @@
<?php
namespace Khill\Lavacharts\Charts;
/**
* CalendarChart Class
*
* A calendar chart is a visualization used to show activity over the course of a long span of time,
* such as months or years. They're best used when you want to illustrate how some quantity varies
* depending on the day of the week, or how it trends over time.
*
*
* @package Khill\Lavacharts\Charts
* @since 2.1.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class CalendarChart extends Chart
{
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'CalendarChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1.1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'calendar';
/**
* Returns the google javascript package name.
*
* @since 3.0.5
* @return string
*/
public function getJsClass()
{
return 'google.visualization.Calendar';
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace Khill\Lavacharts\Charts;
use \Khill\Lavacharts\Support\Traits\PngRenderableTrait as PngRenderable;
/**
* CandlestickChart Class
*
* A bubble chart is used to visualize a data set with two to four dimensions.
* The first two dimensions are visualized as coordinates, the third as color
* and the fourth as size.
*
*
* @package Khill\Lavacharts\Charts
* @since 3.1.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class CandlestickChart extends Chart
{
use PngRenderable;
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'CandlestickChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'corechart';
}

197
vendor/khill/lavacharts/src/Charts/Chart.php vendored Executable file
View File

@@ -0,0 +1,197 @@
<?php
namespace Khill\Lavacharts\Charts;
use Khill\Lavacharts\Support\Customizable;
use Khill\Lavacharts\DataTables\DataTable;
use Khill\Lavacharts\Values\ElementId;
use Khill\Lavacharts\Values\Label;
use Khill\Lavacharts\Support\Traits\ElementIdTrait as HasElementId;
use Khill\Lavacharts\Support\Traits\DataTableTrait as HasDataTable;
use Khill\Lavacharts\Support\Traits\RenderableTrait as IsRenderable;
use Khill\Lavacharts\Support\Contracts\JsonableInterface as Jsonable;
use Khill\Lavacharts\Support\Contracts\WrappableInterface as Wrappable;
use Khill\Lavacharts\Support\Contracts\RenderableInterface as Renderable;
use Khill\Lavacharts\Support\Contracts\VisualizationInterface as Visualization;
/**
* Class Chart
*
* Parent to all charts which has common properties and methods
* used between all the different charts.
*
*
* @package Khill\Lavacharts\Charts
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class Chart extends Customizable implements Renderable, Wrappable, Jsonable, Visualization
{
use HasDataTable, IsRenderable;
/**
* Type of wrappable class
*/
const WRAP_TYPE = 'chartType';
/**
* Builds a new chart with the given label.
*
* @param \Khill\Lavacharts\Values\Label $chartLabel Identifying label for the chart.
* @param \Khill\Lavacharts\DataTables\DataTable $datatable DataTable used for the chart.
* @param array $options Options fot the chart.
*/
public function __construct(Label $chartLabel, DataTable $datatable = null, array $options = [])
{
parent::__construct($options);
$this->label = $chartLabel;
$this->datatable = $datatable;
$this->setExtendedAttributes();
}
/**
* Set extended chart attributes from the assigned options, if present.
*
* @since 3.1.9
*/
protected function setExtendedAttributes()
{
if (array_key_exists('elementId', $this->options)) {
$this->setElementId($this->options['elementId']);
unset($this->options['elementId']);
}
if (method_exists($this, 'setPngOutput') &&
array_key_exists('png', $this->options))
{
$this->setPngOutput($this->options['png']);
unset($this->options['png']);
}
if (method_exists($this, 'setMaterialOutput') &&
array_key_exists('material', $this->options))
{
$this->setMaterialOutput($this->options['material']);
unset($this->options['material']);
}
}
/**
* Returns the chart type.
*
* @since 3.0.0
* @return string
*/
public function getType()
{
return static::TYPE;
}
/**
* Returns the Filter wrap type.
*
* @since 3.0.5
* @return string
*/
public function getWrapType()
{
return static::WRAP_TYPE;
}
/**
* Returns the chart version.
*
* @since 3.0.5
* @return string
*/
public function getVersion()
{
return static::VERSION;
}
/**
* Returns the chart visualization class.
*
* @since 3.0.5
* @return string
*/
public function getJsPackage()
{
return static::VISUALIZATION_PACKAGE;
}
/**
* Returns the chart visualization package.
*
* @since 3.0.5
* @return string
*/
public function getJsClass()
{
return 'google.visualization.' . static::TYPE;
}
/**
* Return a JSON representation of the chart, which would be the customizations.
*
* @return string
*/
public function toJson()
{
return json_encode($this);
}
/**
* Retrieves the events if any have been assigned to the chart.
*
* @since 3.0.5
* @return array
*/
public function getEvents()
{
return $this['events'];
}
/**
* Checks if any events have been assigned to the chart.
*
* @return bool
*/
public function hasEvents()
{
return isset($this['events']);
}
/**
* Sets any configuration option, with no checks for type / validity
*
*
* This is method was added in 2.5 as a bandaid to remove the handcuffs from
* users who want to add options that Google has added, that I have not.
* I didn't intend to restrict the user to only select options, as the
* goal was to type isNonEmpty and validate. This method can be used to set
* any option, just pass in arrays with key value pairs for any setting.
*
* If the setting is an object, per the google docs, then use multi-dimensional
* arrays and they will be converted upon rendering.
*
* @since 3.0.0
* @param array $options Array of customization options for the chart
* @return \Khill\Lavacharts\Charts\Chart
*/
public function customize(array $options)
{
$this->setOptions($options);
return $this;
}
}

View File

@@ -0,0 +1,154 @@
<?php
namespace Khill\Lavacharts\Charts;
use \Khill\Lavacharts\Builders\ChartBuilder;
use Khill\Lavacharts\DataTables\DataTable;
use \Khill\Lavacharts\Exceptions\InvalidDataTable;
/**
* ChartFactory Class
*
* Used for creating new charts and removing the need for the main Lavacharts
* class to handle the creation.
*
*
* @category Class
* @package Khill\Lavacharts\Charts
* @since 3.1.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class ChartFactory
{
/**
* Instance of the ChartBuilder for, well, building charts.
*
* @var \Khill\Lavacharts\Builders\ChartBuilder
*/
private $chartBuilder;
/**
* Types of charts that can be created.
*
* @var array
*/
public static $CHART_TYPES = [
'AreaChart',
'AnnotationChart',
'BarChart',
'BubbleChart',
'CalendarChart',
'CandlestickChart',
'ColumnChart',
'ComboChart',
'DonutChart',
'GanttChart',
'GaugeChart',
'GeoChart',
'HistogramChart',
'LineChart',
'PieChart',
'SankeyChart',
'ScatterChart',
'SteppedAreaChart',
'TableChart',
'TimelineChart',
'TreeMapChart',
'WordTreeChart',
];
/**
* ChartFactory constructor.
*/
public function __construct()
{
$this->chartBuilder = new ChartBuilder;
}
/**
* ChartFactory constructor.
*/
public static function build($type, $args)
{
return (new self)->create($type, $args);
}
/**
* Create new chart from type with DataTable and config passed
* from the main Lavacharts class.
*
* @param string $type Type of chart to create.
* @param array $args Passed arguments from __call in Lavacharts.
* @return \Khill\Lavacharts\Charts\Chart
* @throws \Khill\Lavacharts\Exceptions\InvalidChartType
* @throws \Khill\Lavacharts\Exceptions\InvalidDataTable
*/
public function create($type, $args)
{
if ($args[1] !== null && $args[1] instanceof DataTable === false) {
throw new InvalidDataTable;
}
$this->chartBuilder->setType($type)
->setLabel($args[0])
->setDatatable($args[1]);
if (isset($args[2])) {
if (is_string($args[2])) {
$this->chartBuilder->setElementId($args[2]);
}
if (is_array($args[2])) {
if (array_key_exists('elementId', $args[2])) {
$this->chartBuilder->setElementId($args[2]['elementId']);
unset($args[2]['elementId']);
}
if (array_key_exists('png', $args[2])) {
$this->chartBuilder->setPngOutput($args[2]['png']);
unset($args[2]['png']);
}
if (array_key_exists('material', $args[2])) {
$this->chartBuilder->setMaterialOutput($args[2]['material']);
unset($args[2]['material']);
}
$this->chartBuilder->setOptions($args[2]);
}
}
if (isset($args[3])) {
$this->chartBuilder->setElementId($args[3]);
}
return $this->chartBuilder->getChart();
}
/**
* Returns the array of supported chart types.
*
* @since 3.1.0
* @return array
*/
public static function getChartTypes()
{
return static::$CHART_TYPES;
}
/**
* Returns the array of supported chart types.
*
* @since 3.1.0
* @param string $type Type of chart to check.
* @return bool
*/
public static function isValidChart($type)
{
return in_array($type, self::$CHART_TYPES, true);
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace Khill\Lavacharts\Charts;
use \Khill\Lavacharts\Support\Traits\PngRenderableTrait as PngRenderable;
/**
* ColumnChart Class
*
* A vertical bar chart that is rendered within the browser using SVG or VML.
* Displays tips when hovering over bars. For a horizontal version of this
* chart, see the Bar Chart.
*
*
* @package Khill\Lavacharts\Charts
* @since 1.0.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class ColumnChart extends Chart
{
use PngRenderable;
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'ColumnChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'corechart';
}

View File

@@ -0,0 +1,49 @@
<?php
namespace Khill\Lavacharts\Charts;
use \Khill\Lavacharts\Support\Traits\PngRenderableTrait as PngRenderable;
/**
* ComboChart Class
*
* A chart that lets you render each series as a different marker type from the following list:
* line, area, bars, candlesticks and stepped area.
*
* To assign a default marker type for series, specify the seriesType property.
* Use the series property to specify properties of each series individually.
*
*
* @package Khill\Lavacharts\Charts
* @since 2.0.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class ComboChart extends Chart
{
use PngRenderable;
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'ComboChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'corechart';
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Khill\Lavacharts\Charts;
/**
* DonutChart Class
*
* A pie chart, with a hole in the center, that is rendered within the browser using SVG or VML.
* Displays tooltips when hovering over slices.
*
*
* @package Khill\Lavacharts\Charts
* @since 3.1.5
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class DonutChart extends PieChart
{
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'DonutChart';
/**
* Returns the chart visualization package.
*
* @return string
*/
public function getJsClass()
{
return 'google.visualization.PieChart';
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace Khill\Lavacharts\Charts;
/**
* GanttChart Class
*
* A Gantt chart is a type of chart that illustrates the breakdown of a
* project into its component tasks. Google Gantt charts illustrate the
* start, end, and duration of tasks within a project, as well as any
* dependencies a task may have. Google Gantt charts are rendered in
* the browser using SVG. Like all Google charts, Gantt charts display
* tooltips when the user hovers over the data.
*
*
* @package Khill\Lavacharts\Charts
* @since 3.0.5
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class GanttChart extends Chart
{
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'GanttChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'gantt';
/**
* Returns the google javascript package name.
*
* @since 3.0.5
* @return string
*/
public function getJsClass()
{
return 'google.visualization.Gantt';
}
}

View File

@@ -0,0 +1,52 @@
<?php
namespace Khill\Lavacharts\Charts;
/**
* GaugeChart Class
*
* A gauge with a dial, rendered within the browser using SVG or VML.
*
*
* @package Khill\Lavacharts\Charts
* @since 2.2.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class GaugeChart extends Chart
{
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'GaugeChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'gauge';
/**
* Returns the google javascript package name.
*
* @since 3.0.5
* @return string
*/
public function getJsClass()
{
return 'google.visualization.Gauge';
}
}

View File

@@ -0,0 +1,49 @@
<?php
namespace Khill\Lavacharts\Charts;
use \Khill\Lavacharts\Support\Traits\PngRenderableTrait as PngRenderable;
/**
* GeoChart Class
*
* A Geochart is a map of a country, a continent, or a region with two modes:
* - The region mode colorizes whole regions, such as countries, provinces,
* or states.
* - The marker mode marks designated regions using bubbles that are scaled
* according to a value that you specify.
*
*
* @package Khill\Lavacharts\Charts
* @since 1.0.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class GeoChart extends Chart
{
use PngRenderable;
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'GeoChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'geochart';
}

View File

@@ -0,0 +1,64 @@
<?php
namespace Khill\Lavacharts\Charts;
use \Khill\Lavacharts\Support\Traits\PngRenderableTrait as PngRenderable;
/**
* HistogramChart Class
*
* A histogram is a chart that groups numeric data into bins,
* displaying the bins as segmented columns. They're used to
* depict the distribution of a dataset: how often values fall
* into ranges.
*
* Google Charts automatically chooses the number of bins for you.
* All bins are equal width and have a height proportional to the
* number of data points in the bin. In other respects, histograms
* are similar to column charts.
*
*
* @package Khill\Lavacharts\Charts
* @since 3.1.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class HistogramChart extends Chart
{
use PngRenderable;
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'HistogramChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'corechart';
/**
* Returns the google javascript package name.
*
* @since 3.1.0
* @return string
*/
public function getJsClass()
{
return 'google.visualization.Histogram';
}
}

View File

@@ -0,0 +1,77 @@
<?php
namespace Khill\Lavacharts\Charts;
use \Khill\Lavacharts\Support\Traits\PngRenderableTrait as PngRenderable;
use \Khill\Lavacharts\Support\Traits\MaterialRenderableTrait as MaterialRenderable;
/**
* LineChart Class
*
* A line chart that is rendered within the browser using SVG or VML. Displays
* tips when hovering over points.
*
*
* @package Khill\Lavacharts\Charts
* @since 1.0.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class LineChart extends Chart
{
use PngRenderable, MaterialRenderable;
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'LineChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'corechart';
/**
* Returns the chart visualization class.
*
* @since 3.1.0
* @return string
*/
public function getJsPackage()
{
if ($this->material) {
return 'line';
} else {
return static::VISUALIZATION_PACKAGE;
}
}
/**
* Returns the chart visualization package.
*
* @since 3.1.0
* @return string
*/
public function getJsClass()
{
if ($this->material) {
return 'google.charts.Line';
} else {
return 'google.visualization.' . static::TYPE;
}
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace Khill\Lavacharts\Charts;
use Khill\Lavacharts\Support\Traits\PngOutputTrait as PngRenderable;
/**
* OrgChart Class
*
* Org charts are diagrams of a hierarchy of nodes, commonly used to
* portray superior/subordinate relationships in an organization.
* A family tree is a type of org chart.
*
*
* @package Khill\Lavacharts\Charts
* @since 3.0.5
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class OrgChart extends Chart
{
use PngRenderable;
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'OrgChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'orgchart';
}

View File

@@ -0,0 +1,46 @@
<?php
namespace Khill\Lavacharts\Charts;
use \Khill\Lavacharts\Support\Traits\PngRenderableTrait as PngRenderable;
/**
* PieChart Class
*
* A pie chart that is rendered within the browser using SVG or VML. Displays
* tooltips when hovering over slices.
*
*
* @package Khill\Lavacharts\Charts
* @since 1.0.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class PieChart extends Chart
{
use PngRenderable;
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'PieChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'corechart';
}

View File

@@ -0,0 +1,59 @@
<?php
namespace Khill\Lavacharts\Charts;
/**
* SankeyChart Class
*
* A sankey diagram is a visualization used to depict a flow from one set
* of values to another. The things being connected are called nodes and
* the connections are called links.
*
* Sankeys are best used when you want to show a many-to-many mapping
* between two domains (e.g., universities and majors) or multiple paths
* through a set of stages (for instance, Google Analytics uses sankeys
* to show how traffic flows from pages to other pages on your web site).
*
*
* @package Khill\Lavacharts\Charts
* @since 3.0.5
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class SankeyChart extends Chart
{
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'SankeyChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'sankey';
/**
* Returns the google javascript package name.
*
* @since 3.0.5
* @return string
*/
public function getJsClass()
{
return 'google.visualization.Sankey';
}
}

View File

@@ -0,0 +1,80 @@
<?php
namespace Khill\Lavacharts\Charts;
use \Khill\Lavacharts\Support\Traits\PngRenderableTrait as PngRenderable;
use \Khill\Lavacharts\Support\Traits\MaterialRenderableTrait as MaterialRenderable;
/**
* ScatterChart Class
*
* A chart that lets you render each series as a different marker type from the following list:
* line, area, bars, candlesticks and stepped area.
*
* To assign a default marker type for series, specify the seriesType property.
* Use the series property to specify properties of each series individually.
*
*
* @package Khill\Lavacharts\Charts
* @since 3.0.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class ScatterChart extends Chart
{
use PngRenderable, MaterialRenderable;
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'ScatterChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'corechart';
/**
* Returns the chart visualization class.
*
* @since 3.1.0
* @return string
*/
public function getJsPackage()
{
if ($this->material) {
return 'scatter';
} else {
return static::VISUALIZATION_PACKAGE;
}
}
/**
* Returns the chart visualization package.
*
* @since 3.1.0
* @return string
*/
public function getJsClass()
{
if ($this->material) {
return 'google.charts.Scatter';
} else {
return 'google.visualization.' . static::TYPE;
}
}
}

View File

@@ -0,0 +1,45 @@
<?php
namespace Khill\Lavacharts\Charts;
use \Khill\Lavacharts\Support\Traits\PngRenderableTrait as PngRenderable;
/**
* SteppedAreaChart Class
*
* A stacking, stair like version of the AreaChart.
*
*
* @package Khill\Lavacharts\Charts
* @since 3.1.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class SteppedAreaChart extends Chart
{
use PngRenderable;
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'SteppedAreaChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'corechart';
}

View File

@@ -0,0 +1,54 @@
<?php
namespace Khill\Lavacharts\Charts;
/**
* Table Chart Class
*
* A table chart is rendered within the browser. Displays a data from a DataTable in an easily sortable form.
* Can be searched by rendering as a wrapper and binding to a control within a dashboard.
*
*
* @package Khill\Lavacharts\Charts
* @since 3.0.0
* @author Peter Draznik <peter.draznik@38thStreetStudios.com>
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, 38th Street Studios
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class TableChart extends Chart
{
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'TableChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'table';
/**
* Returns the google javascript package name.
*
* @since 3.0.5
* @return string
*/
public function getJsClass()
{
return 'google.visualization.Table';
}
}

View File

@@ -0,0 +1,56 @@
<?php
namespace Khill\Lavacharts\Charts;
/**
* TimelineChart Class
*
*
* A timeline is a chart that depicts how a set of resources are used over time.
* If you're managing a software project and want to illustrate who is doing what
* and when, or if you're organizing a conference and need to schedule meeting
* rooms, a timeline is often a reasonable visualization choice.
*
*
* @package Khill\Lavacharts\Charts
* @since 3.0.5
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class TimelineChart extends Chart
{
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'TimelineChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'timeline';
/**
* Returns the google javascript package name.
*
* @since 3.0.5
* @return string
*/
public function getJsClass()
{
return 'google.visualization.Timeline';
}
}

View File

@@ -0,0 +1,65 @@
<?php
namespace Khill\Lavacharts\Charts;
/**
* TreeMap Chart Class
*
*
* A visual representation of a data tree, where each node can have zero or more
* children, and one parent (except for the root, which has no parents). Each
* node is displayed as a rectangle, sized and colored according to values that
* you assign. Sizes and colors are valued relative to all other nodes in the
* graph. You can specify how many levels to display simultaneously, and
* optionally to display deeper levels in a hinted fashion. If a node is a leaf
* node, you can specify a size and color; if it is not a leaf, it will be
* displayed as a bounding box for leaf nodes. The default behavior is to move
* down the tree when a user left-clicks a node, and to move back up the tree
* when a user right-clicks the graph.
*
* The total size of the graph is determined by the size of the containing
* element that you insert in your page. If you have leaf nodes with names too
* long to show, the name will be truncated with an ellipsis (...).
*
* @package Khill\Lavacharts\Charts
* @since 3.1.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class TreeMapChart extends Chart
{
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'TreeMapChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'treemap';
/**
* Returns the google javascript package name.
*
* @since 3.1.0
* @return string
*/
public function getJsClass()
{
return 'google.visualization.TreeMap';
}
}

View File

@@ -0,0 +1,65 @@
<?php
namespace Khill\Lavacharts\Charts;
/**
* WordTreeChart Class
*
*
* A visual representation of a data tree, where each node can have zero or more
* children, and one parent (except for the root, which has no parents). Each
* node is displayed as a rectangle, sized and colored according to values that
* you assign. Sizes and colors are valued relative to all other nodes in the
* graph. You can specify how many levels to display simultaneously, and
* optionally to display deeper levels in a hinted fashion. If a node is a leaf
* node, you can specify a size and color; if it is not a leaf, it will be
* displayed as a bounding box for leaf nodes. The default behavior is to move
* down the tree when a user left-clicks a node, and to move back up the tree
* when a user right-clicks the graph.
*
* The total size of the graph is determined by the size of the containing
* element that you insert in your page. If you have leaf nodes with names too
* long to show, the name will be truncated with an ellipsis (...).
*
* @package Khill\Lavacharts\Charts
* @since 3.0.5
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class WordTreeChart extends Chart
{
/**
* Javascript chart type.
*
* @var string
*/
const TYPE = 'WordTreeChart';
/**
* Javascript chart version.
*
* @var string
*/
const VERSION = '1';
/**
* Javascript chart package.
*
* @var string
*/
const VISUALIZATION_PACKAGE = 'wordtree';
/**
* Returns the google javascript package name.
*
* @since 3.0.5
* @return string
*/
public function getJsClass()
{
return 'google.visualization.WordTree';
}
}

View File

@@ -0,0 +1,89 @@
<?php
namespace Khill\Lavacharts\Dashboards\Bindings;
/**
* Parent Binding Class
*
* Binds a ControlWrapper to a ChartWrapper to use in dashboards.
*
* @package Khill\Lavacharts\Dashboards\Bindings
* @since 3.0.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class Binding
{
/**
* Array of ControlWrappers.
*
* @var array
*/
protected $controlWrappers;
/**
* Array of ChartWrappers.
*
* @var array
*/
protected $chartWrappers;
/**
* Assigns the wrappers and creates the new Binding.
*
* @param array $chartWrappers
* @param array $controlWrappers
*/
public function __construct(array $controlWrappers, array $chartWrappers)
{
$this->chartWrappers = $chartWrappers;
$this->controlWrappers = $controlWrappers;
}
/**
* Get the ChartWrappers
*
* @return array
*/
public function getChartWrappers()
{
return $this->chartWrappers;
}
/**
* Get the a specific ChartWrap
*
* @since 3.1.0
* @param int $index Which chart wrap to retrieve
* @return array
*/
public function getChartWrap($index)
{
return $this->chartWrappers[$index];
}
/**
* Get the ControlWrappers
*
* @return array
*/
public function getControlWrappers()
{
return $this->controlWrappers;
}
/**
* Get the a specific ControlWrap
*
* @since 3.1.0
* @param int $index Which control wrap to retrieve
* @return array
*/
public function getControlWrap($index)
{
return $this->controlWrappers[$index];
}
}

View File

@@ -0,0 +1,52 @@
<?php
namespace Khill\Lavacharts\Dashboards\Bindings;
use \Khill\Lavacharts\Dashboards\Wrappers\ChartWrapper;
use \Khill\Lavacharts\Dashboards\Wrappers\ControlWrapper;
use \Khill\Lavacharts\Exceptions\InvalidBindings;
/**
* BindingFactory Class
*
* Creates new bindings for dashboards.
*
* @package Khill\Lavacharts\Dashboards\Bindings
* @since 3.0.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class BindingFactory
{
/**
* Create a new Binding for the dashboard.
*
* @param mixed $controlWraps One or array of many ControlWrappers
* @param mixed $chartWraps One or array of many ChartWrappers
* @throws \Khill\Lavacharts\Exceptions\InvalidBindings
* @return \Khill\Lavacharts\Dashboards\Bindings\Binding
*/
public function create($controlWraps, $chartWraps)
{
if ($controlWraps instanceof ControlWrapper && $chartWraps instanceof ChartWrapper) {
return new OneToOne($controlWraps, $chartWraps);
}
if ($controlWraps instanceof ControlWrapper && is_array($chartWraps)) {
return new OneToMany($controlWraps, $chartWraps);
}
if (is_array($controlWraps) && $chartWraps instanceof ChartWrapper) {
return new ManyToOne($controlWraps, $chartWraps);
}
if (is_array($chartWraps) && is_array($controlWraps)) {
return new ManyToMany($controlWraps, $chartWraps);
}
throw new InvalidBindings;
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace Khill\Lavacharts\Dashboards\Bindings;
/**
* ManyToMany Binding Class
*
* Binds multiple ControlWrappers to a multiple ChartWrapper for use in dashboards.
*
* @package Khill\Lavacharts\Dashboards\Bindings
* @since 3.0.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class ManyToMany extends Binding
{
/**
* Type of binding.
*
* @var string
*/
const TYPE = 'ManyToMany';
/**
* Creates the new Binding.
*
* @param array $chartWrappers
* @param array $controlWrappers
*/
public function __construct(array $controlWrappers, array $chartWrappers)
{
parent::__construct($controlWrappers, $chartWrappers);
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace Khill\Lavacharts\Dashboards\Bindings;
use Khill\Lavacharts\Dashboards\Wrappers\ChartWrapper;
/**
* ManyToOne Binding Class
*
* Binds multiple ControlWrappers to a single ChartWrapper for use in dashboards.
*
* @package Khill\Lavacharts\Dashboards\Bindings
* @since 3.0.0
* @author Kevin Hill <kevinkhill@gmail.com>
* @copyright (c) 2017, KHill Designs
* @link http://github.com/kevinkhill/lavacharts GitHub Repository Page
* @link http://lavacharts.com Official Docs Site
* @license http://opensource.org/licenses/MIT MIT
*/
class ManyToOne extends Binding
{
/**
* Type of binding.
*
* @var string
*/
const TYPE = 'ManyToOne';
/**
* Creates the new Binding.
*
* @param array $controlWrappers
* @param \Khill\Lavacharts\Dashboards\Wrappers\ChartWrapper $chartWrapper
*/
public function __construct(array $controlWrappers, ChartWrapper $chartWrapper)
{
parent::__construct($controlWrappers, [$chartWrapper]);
}
}

Some files were not shown because too many files have changed in this diff Show More