From 363f81aa4a761b5497ae679612d501d3fadaf735 Mon Sep 17 00:00:00 2001 From: Marek Bartos Date: Sun, 16 Sep 2018 14:54:41 +0200 Subject: [PATCH] Native typehints, strict types --- .docs/README.md | 204 ++++++++++ .docs/assets/CategoryChart.png | Bin 0 -> 21425 bytes .docs/assets/Chart.png | Bin 0 -> 14051 bytes .docs/assets/DateChart.png | Bin 0 -> 19340 bytes .docs/assets/DonutChart.png | Bin 0 -> 16205 bytes .docs/assets/PieChart.png | Bin 0 -> 13730 bytes .editorconfig | 20 + .gitattributes | 11 + .gitignore | 13 +- .travis.yml | 53 +++ LICENSE | 373 ++++++++++++++++++ README.md | 64 ++- composer.json | 85 ++-- netterobots.txt | 2 - phpstan.neon | 11 + phpunit.xml.dist | 28 -- ruleset.xml | 21 + src/AbstractChart.php | 62 ++- src/Category.php | 31 +- src/CategoryChart.php | 53 +-- src/Chart.php | 19 +- src/DateChart.php | 48 +-- src/DonutChart.php | 36 +- src/PieChart.php | 26 +- src/Segment/CategorySegment.php | 31 +- src/Segment/DateSegment.php | 45 +-- src/Segment/DonutSegment.php | 7 +- src/Segment/PieSegment.php | 31 +- src/Segment/Segment.php | 31 +- src/Serie/AbstractSerie.php | 78 ++-- src/Serie/CategorySerie.php | 19 +- src/Serie/DateSerie.php | 23 +- src/Serie/Serie.php | 17 +- src/Util/C3Adapter.php | 14 +- ...goryChart.html.php => CategoryChart.phtml} | 0 .../c3/{Chart.html.php => Chart.html.phtml} | 0 .../{DateChart.html.php => DateChart.phtml} | 0 .../{DonutChart.html.php => DonutChart.phtml} | 0 .../c3/{PieChart.html.php => PieChart.phtml} | 0 tests/.coveralls.yml | 4 + tests/coverage.xml | 11 + 41 files changed, 1025 insertions(+), 446 deletions(-) create mode 100644 .docs/README.md create mode 100644 .docs/assets/CategoryChart.png create mode 100644 .docs/assets/Chart.png create mode 100644 .docs/assets/DateChart.png create mode 100644 .docs/assets/DonutChart.png create mode 100644 .docs/assets/PieChart.png create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .travis.yml create mode 100644 LICENSE delete mode 100644 netterobots.txt create mode 100644 phpstan.neon delete mode 100644 phpunit.xml.dist create mode 100644 ruleset.xml rename src/templates/c3/{CategoryChart.html.php => CategoryChart.phtml} (100%) rename src/templates/c3/{Chart.html.php => Chart.html.phtml} (100%) rename src/templates/c3/{DateChart.html.php => DateChart.phtml} (100%) rename src/templates/c3/{DonutChart.html.php => DonutChart.phtml} (100%) rename src/templates/c3/{PieChart.html.php => PieChart.phtml} (100%) create mode 100644 tests/.coveralls.yml create mode 100644 tests/coverage.xml diff --git a/.docs/README.md b/.docs/README.md new file mode 100644 index 0000000..4ff6334 --- /dev/null +++ b/.docs/README.md @@ -0,0 +1,204 @@ +# Tlapnet Chart + +Graphs and charts based on [C3.js](http://c3js.org/) + +## Content + +- [Assets](#Assets) +- [Graphs](#graphs) + - [Chart](#chart) + - [CategoryChart](#categorychart) + - [DateChart](#datechart) + - [DonutChart](#donutchart) + - [PieChart](#piechart) +- [Series](#series) + - [Stacking series](#stacking-series) + - [Types](#types) + +## Assets + +Graphs are rendered through [C3.js](http://c3js.org/). + +```html + + + + + +``` + +## Graphs + +### Chart + +- x (number), y (number) + +```php +use Tlapnet\Chart\Chart; +use Tlapnet\Chart\Serie\Serie; +use Tlapnet\Chart\Segment\Segment; + +$chart = new Chart(); + +$serie = new Serie(Serie::LINE, 'Serie 1', 'red'); +$serie->addSegment(new Segment(5, 10)); +$serie->addSegment(new Segment(6, 4)); +$serie->addSegment(new Segment(2, 8)); +$chart->addSerie($serie); + +$serie = new Serie(Serie::LINE, 'Serie 2'); +$serie->addSegment(new Segment(2, 8)); +$serie->addSegment(new Segment(4, 6)); +$serie->addSegment(new Segment(8, 5)); +$serie->addSegment(new Segment(7, 7)); +$chart->addSerie($serie); + +echo $chart; +``` + +![Chart](./assets/Chart.png?raw=true) + +### CategoryChart + +- x (unique key, string|int), y (number) + +```php +use Tlapnet\Chart\Category; +use Tlapnet\Chart\CategoryChart; +use Tlapnet\Chart\Serie\CategorySerie; +use Tlapnet\Chart\Segment\CategorySegment; + +$chart = new CategoryChart([ + new Category(1, 'January'), + new Category(2, 'February'), + new Category(3, 'March'), +]); +$chart->setValueSuffix(' $'); + +$serie = new CategorySerie(CategorySerie::BAR, 'Company 1', 'red'); +$serie->addSegment(new CategorySegment(1, 0)); +$serie->addSegment(new CategorySegment(2, 4000)); +$serie->addSegment(new CategorySegment(3, 1000)); +$chart->addSerie($serie, 'group1'); + +$serie = new CategorySerie(CategorySerie::BAR, 'Company 2', 'green'); +$serie->addSegment(new CategorySegment(1, 3000)); +// Segments could be omitted (default value is 0) +$serie->addSegment(new CategorySegment(3, 500)); +$chart->addSerie($serie, 'group1'); + +$serie = new CategorySerie(CategorySerie::LINE, 'Summary'); +$serie->addSegment(new CategorySegment(1, 3000)); +$serie->addSegment(new CategorySegment(3, 1500)); +$serie->addSegment(new CategorySegment(2, 4000)); +$chart->addSerie($serie); + +echo $chart; +``` + +![CategoryChart](./assets/CategoryChart.png?raw=true) + +### DateChart + +- x (date), y (number) + +```php +use Tlapnet\Chart\DateChart; +use Tlapnet\Chart\Serie\DateSerie; +use Tlapnet\Chart\Segment\DateSegment; +use DateTimeImmutable; + +$chart = new DateChart(); +$chart->setValueSuffix(' $'); +//$chart->enableTimePrecision(); // Enable time accurate to seconds + +$serie = new DateSerie(DateSerie::LINE, 'Revenues', 'green'); +$serie->addSegment(new DateSegment(new DateTimeImmutable('2012-01-01'), 10)); +$serie->addSegment(new DateSegment(new DateTimeImmutable('2012-02-01'), 4)); +$serie->addSegment(new DateSegment(new DateTimeImmutable('2012-03-01'), 8)); +$chart->addSerie($serie); + +$serie = new DateSerie(DateSerie::LINE, 'Costs', 'red'); +$serie->addSegment(new DateSegment(new DateTimeImmutable('2012-01-01'), 2)); +$serie->addSegment(new DateSegment(new DateTimeImmutable('2012-02-01'), 9)); +$serie->addSegment(new DateSegment(new DateTimeImmutable('2012-03-01'), 5)); +$chart->addSerie($serie); + +$serie = new DateSerie(DateSerie::AREA_LINE, 'Balance', 'blue'); +$serie->addSegment(new DateSegment(new DateTimeImmutable('2012-01-01'), 8)); +$serie->addSegment(new DateSegment(new DateTimeImmutable('2012-02-01'), -5)); +$serie->addSegment(new DateSegment(new DateTimeImmutable('2012-03-01'), 3)); +$chart->addSerie($serie); + +echo $chart; +``` + +![DateChart](./assets/DateChart.png?raw=true) + +### DonutChart + +```php +use Tlapnet\Chart\DonutChart; +use Tlapnet\Chart\Segment\DonutSegment; + +$chart = new DonutChart(); +$chart->setTitle(15); +$chart->setValueSuffix(' pcs'); +$chart->enableRatioLabel(); // Show percents instead of absolute values +$chart->addSegment(new DonutSegment('Item 1', 5)); +$chart->addSegment(new DonutSegment('Item 2', 8)); +$chart->addSegment(new DonutSegment('Item 3', 2)); + +echo $chart; +``` + +![DonutChart](./assets/DonutChart.png?raw=true) + +### PieChart + +```php +use Tlapnet\Chart\PieChart; +use Tlapnet\Chart\Segment\PieSegment; + +$chart = new PieChart(); +$chart->enableRatioLabel(); // Show percents instead of absolute values +$chart->setValueSuffix(' pcs'); +$chart->addSegment(new PieSegment('Item 1', 5)); +$chart->addSegment(new PieSegment('Item 2', 8)); +$chart->addSegment(new PieSegment('Item 3', 2)); + +echo $chart; +``` + +![PieChart](./assets/PieChart.png?raw=true) + +## Series + +Graphs Chart, CategoryChart and DateChart each have their series (Serie, CategorySerie, DateSerie). + +### Stacking series + +```php +$chart->addSerie($barSerie1, 'group1'); +$chart->addSerie($barSerie2, 'group1'); +$chart->addSerie($barSerie3, 'group1'); +$chart->addSerie($barSerie4, 'group1'); +``` + +```php +// Group name could be any value valid for array key +// Null (default value) mean no group +$chart->addSerie($splineSerie1, 1); +$chart->addSerie($splineSerie2, 1); +``` + +### Types + +- *Serie::BAR +- *Serie::LINE +- *Serie::SPLINE +- *Serie::STEP +- *Serie::AREA_LINE +- *Serie::AREA_SPLINE +- *Serie::AREA_STEP + diff --git a/.docs/assets/CategoryChart.png b/.docs/assets/CategoryChart.png new file mode 100644 index 0000000000000000000000000000000000000000..66e9a4bb03cf3edd6e11f705a5c050f07192143c GIT binary patch literal 21425 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 C;1k0D literal 0 HcmV?d00001 diff --git a/.docs/assets/DateChart.png b/.docs/assets/DateChart.png new file mode 100644 index 0000000000000000000000000000000000000000..607fd1c9c9864d3c224a0eededa2cf72f8df35f4 GIT binary patch literal 19340 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 z�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%0Aga8S0H~N$P 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 7.1` | +| stable | `^2.0.0` | `master` | `>= 7.1` | +| stable | `^1.0.0` | `master` | `>= 5.4` | + +## Overview + +- [Assets](.docs/README.md#assets) +- [Graphs](.docs/README.md#graphs) + - [Chart](.docs/README.md#chart) + - [CategoryChart](.docs/README.md#categorychart) + - [DateChart](.docs/README.md#datechart) + - [DonutChart](.docs/README.md#donutchart) + - [PieChart](.docs/README.md#piechart) +- [Series](.docs/README.md#series) + - [Stacking series](.docs/README.md#stacking-series) + - [Types](.docs/README.md#types) + +## Maintainers + + + + + + + + +
+ + + +
+ Milan Felix Šulc +
+ + + +
+ Marek Bartoš +
diff --git a/composer.json b/composer.json index 06e9b2e..237678f 100644 --- a/composer.json +++ b/composer.json @@ -1,34 +1,57 @@ { - "name": "tlapnet/chart", - "authors": [ - { - "name": "Tlapnet", - "email": "webmaster@tlapnet.cz" - } + "name": "tlapnet/chart", + "description": "Graphs and charts based on C3.js", + "type": "library", + "license": "MPL-2.0", + "homepage": "https://github.com/tlapnet/chart", + "authors": [ + { + "name": "Luděk Benedík" + } + ], + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "ninjify/qa": "^0.8.0", + "phpunit/phpunit": "^7.3.5" + }, + "minimum-stability": "dev", + "prefer-stable": true, + "autoload": { + "psr-4": { + "Tlapnet\\Chart\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Tlapnet\\Chart\\Tests\\": "tests/" + } + }, + "scripts": { + "qa": [ + "linter src tests", + "codesniffer src tests" ], - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "4.2.*" - }, - "autoload": { - "psr-4": { - "Tlapnet\\Chart\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "Tlapnet\\Chart\\Tests\\": "tests/" - } - }, - "minimum-stability": "dev", - "prefer-stable": true, - "license": "proprietary", - "repositories": [ - { - "type": "composer", - "url": "https://packagist.ispalliance.cz/" - } + "phpunit": [ + "phpunit tests --colors=always" + ], + "coverage": [ + "phpunit tests --colors=always -c tests/coverage.xml" + ], + "phpstan-install": [ + "mkdir -p temp/phpstan", + "composer require -d temp/phpstan phpstan/phpstan:0.10.3", + "composer require -d temp/phpstan phpstan/phpstan-deprecation-rules:0.10.2", + "composer require -d temp/phpstan phpstan/phpstan-strict-rules:0.10.1" + ], + "phpstan": [ + "temp/phpstan/vendor/bin/phpstan analyse -l max -c phpstan.neon src" ] -} \ No newline at end of file + }, + "extra": { + "branch-alias": { + "dev-dev": "2.1.x-dev" + } + } +} diff --git a/netterobots.txt b/netterobots.txt deleted file mode 100644 index d392021..0000000 --- a/netterobots.txt +++ /dev/null @@ -1,2 +0,0 @@ -Disallow: /tests -Disallow: /tests_output diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000..8ccc328 --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,11 @@ +includes: + - temp/phpstan/vendor/phpstan/phpstan-deprecation-rules/rules.neon + - temp/phpstan/vendor/phpstan/phpstan-strict-rules/rules.neon + +parameters: + ignoreErrors: + # Cannot happen + - '#^Parameter \#1 \$unixtimestamp of method DateTimeImmutable\:\:setTimestamp\(\) expects int, int\|string given\.$#' + # Extract has a reason here + - '#^Parameter \#1 \$var_array of function extract is passed by reference, so it expects variables only\.$#' + - '#^Parameter \#1 \$path of function dirname expects string, string\|false given\.$#' diff --git a/phpunit.xml.dist b/phpunit.xml.dist deleted file mode 100644 index dd1fd3a..0000000 --- a/phpunit.xml.dist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - ./tests/ - - - - - - ./src - - ./src/Resources - - - - diff --git a/ruleset.xml b/ruleset.xml new file mode 100644 index 0000000..a3d4d14 --- /dev/null +++ b/ruleset.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + /tests/tmp + diff --git a/src/AbstractChart.php b/src/AbstractChart.php index 86c570f..88011ac 100644 --- a/src/AbstractChart.php +++ b/src/AbstractChart.php @@ -1,17 +1,15 @@ -valueSuffix = (string) $suffix; + $this->valueSuffix = $suffix; } - - /** - * @return string - */ - public function __toString() + public function __toString(): string { return $this->render(); } - - /** - * @return string - */ - public function render() + public function render(): string { extract($this->getTemplateParameters()); ob_start(); require $this->getTemplateFile(); - return ob_get_clean(); + return (string) ob_get_clean(); } - /** - * @return array + * @return mixed[] */ - protected function getTemplateParameters() + protected function getTemplateParameters(): array { return [ - 'c3Adapter' => new C3Adapter(), - 'chartId' => 'tlapnet-chart-' . self::$rendersCount++, - 'width' => $this->width, - 'height' => $this->height, + 'c3Adapter' => new C3Adapter(), + 'chartId' => 'tlapnet-chart-' . self::$rendersCount++, + 'width' => $this->width, + 'height' => $this->height, 'valueSuffix' => $this->valueSuffix, ]; } - - /** - * @return string - */ - private function getTemplateFile() + private function getTemplateFile(): string { - $classRefl = new ReflectionClass($this); - $classDir = dirname($classRefl->getFileName()); - $classShort = $classRefl->getShortName(); + $classReflection = new ReflectionClass($this); + $classDir = dirname($classReflection->getFileName()); + $classShort = $classReflection->getShortName(); - $file = "$classDir/templates/c3/$classShort.html.php"; + $file = sprintf('%s/templates/c3/%s.phtml', $classDir, $classShort); if (!file_exists($file)) { - throw new \LogicException(sprintf('Template file for "%s" not found.', $classShort)); + throw new LogicException(sprintf('Template file for "%s" not found.', $classShort)); } return $file; } + } diff --git a/src/Category.php b/src/Category.php index f3eca0d..8a1324d 100644 --- a/src/Category.php +++ b/src/Category.php @@ -1,45 +1,30 @@ -key = (string) $key; - $this->title = (string) $title; + $this->key = $key; + $this->title = $title; } - - /** - * @return string - */ - public function getKey() + public function getKey(): string { return $this->key; } - - /** - * @return string - */ - public function getTitle() + public function getTitle(): string { return $this->title; } + } diff --git a/src/CategoryChart.php b/src/CategoryChart.php index a6a664d..700a130 100644 --- a/src/CategoryChart.php +++ b/src/CategoryChart.php @@ -1,4 +1,4 @@ - group */ + /** @var mixed[] serie_index => group */ private $groups = []; - /** * @param Category[] $categories */ - function __construct(array $categories) + public function __construct(array $categories) { - $this->categories = $categories; + $this->categories = $categories; $this->categoryKeys = []; foreach ($this->categories as $category) { @@ -40,34 +36,27 @@ function __construct(array $categories) $this->assertCategoryKeyUniqueness(); } - - /** - * @throws LogicException When category keys are not unique - */ - private function assertCategoryKeyUniqueness() + private function assertCategoryKeyUniqueness(): void { $uniqueKeys = array_unique($this->categoryKeys); if (count($this->categoryKeys) !== count($uniqueKeys)) { - throw new LogicException("Category keys have to be unigue."); + throw new LogicException('Category keys have to be unique.'); } } - /** - * @param CategorySerie $serie * @param mixed $group Valid PHP array key. If NULL then serie is ungrouped */ - public function addSerie(CategorySerie $serie, $group = null) + public function addSerie(CategorySerie $serie, $group = null): void { $categorizedSegments = $this->getCategorizedSegments($serie); - $normalizedSerie = new CategorySerie($serie->getType(), $serie->getTitle(), $serie->getColor()); + $normalizedSerie = new CategorySerie($serie->getType(), $serie->getTitle(), $serie->getColor()); foreach ($this->categoryKeys as $key) { if (isset($categorizedSegments[$key])) { $normalizedSerie->addSegment($categorizedSegments[$key]); - } - else { + } else { $normalizedSerie->addSegment(new CategorySegment($key, 0)); } } @@ -76,20 +65,20 @@ public function addSerie(CategorySerie $serie, $group = null) $this->groups[] = $group; } - /** - * @param CategorySerie $serie - * @return array key => CategorySegment + * @return CategorySegment[] * @throws LogicException When any serie segment has undefined category */ - private function getCategorizedSegments(CategorySerie $serie) + private function getCategorizedSegments(CategorySerie $serie): array { $categorizedSegments = []; foreach ($serie->getSegments() as $segment) { - if (!in_array($segment->getKey(), $this->categoryKeys)) { + if (!in_array($segment->getKey(), $this->categoryKeys, true)) { throw new LogicException(sprintf( - 'Serie "%s" has segment with undefined category key "%s".', $serie->getTitle(), $segment->getKey() + 'Serie "%s" has segment with undefined category key "%s".', + $serie->getTitle(), + $segment->getKey() )); } @@ -99,17 +88,17 @@ private function getCategorizedSegments(CategorySerie $serie) return $categorizedSegments; } - /** * {@inheritdoc} */ - protected function getTemplateParameters() + protected function getTemplateParameters(): array { - $params = parent::getTemplateParameters(); + $params = parent::getTemplateParameters(); $params['categories'] = $this->categories; - $params['series'] = $this->series; - $params['groups'] = $this->groups; + $params['series'] = $this->series; + $params['groups'] = $this->groups; return $params; } + } diff --git a/src/Chart.php b/src/Chart.php index 4d5dfb4..f0e897d 100644 --- a/src/Chart.php +++ b/src/Chart.php @@ -1,42 +1,37 @@ - group */ + /** @var mixed[] serie_index => group */ private $groups = []; - /** - * @param Serie $serie * @param mixed $group Valid PHP array key. If NULL then serie is ungrouped */ - public function addSerie(Serie $serie, $group = null) + public function addSerie(Serie $serie, $group = null): void { $this->series[] = $serie; $this->groups[] = $group; } - /** * {@inheritdoc} */ - protected function getTemplateParameters() + protected function getTemplateParameters(): array { - $params = parent::getTemplateParameters(); + $params = parent::getTemplateParameters(); $params['series'] = $this->series; $params['groups'] = $this->groups; return $params; } + } diff --git a/src/DateChart.php b/src/DateChart.php index 62b6402..44c61a9 100644 --- a/src/DateChart.php +++ b/src/DateChart.php @@ -1,66 +1,53 @@ - group */ + /** @var mixed[] serie_index => group */ private $groups = []; /** @var bool */ private $useTimePrecision = false; - /** - * @param DateSerie $serie * @param mixed $group Valid PHP array key. If NULL then serie is ungrouped */ - public function addSerie(DateSerie $serie, $group = null) + public function addSerie(DateSerie $serie, $group = null): void { $this->series[] = $serie; $this->groups[] = $group; } - - /** - */ - public function enableTimePrecision() + public function enableTimePrecision(): void { $this->useTimePrecision = true; } - /** * {@inheritdoc} */ - protected function getTemplateParameters() + protected function getTemplateParameters(): array { - $params = parent::getTemplateParameters(); - $params['series'] = $this->series; - $params['groups'] = $this->groups; + $params = parent::getTemplateParameters(); + $params['series'] = $this->series; + $params['groups'] = $this->groups; + $params['minTime'] = $this->getMinTime(); + $params['maxTime'] = $this->getMaxTime(); $params['useTimePrecision'] = $this->useTimePrecision; - $params['minTime'] = $this->getMinTime(); - $params['maxTime'] = $this->getMaxTime(); return $params; } - - /** - * @return int - */ - private function getMinTime() + private function getMinTime(): int { - $min = array(); + $min = []; foreach ($this->series as $serie) { $min[] = $serie->getMinTime(); @@ -69,13 +56,9 @@ private function getMinTime() return min($min); } - - /** - * @return int - */ - private function getMaxTime() + private function getMaxTime(): int { - $max = array(); + $max = []; foreach ($this->series as $serie) { $max[] = $serie->getMaxTime(); @@ -83,4 +66,5 @@ private function getMaxTime() return max($max); } + } diff --git a/src/DonutChart.php b/src/DonutChart.php index 44035c6..cbf1341 100644 --- a/src/DonutChart.php +++ b/src/DonutChart.php @@ -1,15 +1,12 @@ -segments[] = $segment; } - - /** - * @param string $title - */ - public function setTitle($title) + public function setTitle(string $title): void { - $this->title = (string) $title; + $this->title = $title; } - - /** - */ - public function enableRatioLabel() + public function enableRatioLabel(): void { $this->enableRatioLabel = true; } - /** * {@inheritdoc} */ - protected function getTemplateParameters() + protected function getTemplateParameters(): array { - $params = parent::getTemplateParameters(); - $params['segments'] = $this->segments; - $params['title'] = $this->title; + $params = parent::getTemplateParameters(); + $params['title'] = $this->title; + $params['segments'] = $this->segments; $params['enableRatioLabel'] = $this->enableRatioLabel; return $params; } + } diff --git a/src/PieChart.php b/src/PieChart.php index 50e329a..9b72042 100644 --- a/src/PieChart.php +++ b/src/PieChart.php @@ -1,48 +1,38 @@ -segments[] = $segment; } - - /** - */ - public function enableRatioLabel() + public function enableRatioLabel(): void { $this->enableRatioLabel = true; } - /** * {@inheritdoc} */ - protected function getTemplateParameters() + protected function getTemplateParameters(): array { - $params = parent::getTemplateParameters(); - $params['segments'] = $this->segments; + $params = parent::getTemplateParameters(); + $params['segments'] = $this->segments; $params['enableRatioLabel'] = $this->enableRatioLabel; return $params; } + } diff --git a/src/Segment/CategorySegment.php b/src/Segment/CategorySegment.php index 53e083e..2120a54 100644 --- a/src/Segment/CategorySegment.php +++ b/src/Segment/CategorySegment.php @@ -1,45 +1,30 @@ -key = (string) $key; - $this->value = (float) $value; + $this->key = $key; + $this->value = $value; } - - /** - * @return string - */ - public function getKey() + public function getKey(): string { return $this->key; } - - /** - * @return float - */ - public function getValue() + public function getValue(): float { return $this->value; } + } diff --git a/src/Segment/DateSegment.php b/src/Segment/DateSegment.php index 5d00cca..a48d7ac 100644 --- a/src/Segment/DateSegment.php +++ b/src/Segment/DateSegment.php @@ -1,57 +1,44 @@ -date = $date; - } - elseif (is_numeric($date)) { - $this->date = new DateTime(); + } elseif (is_numeric($date)) { + $this->date = new DateTimeImmutable(); $this->date->setTimestamp($date); - } - else { - $this->date = new DateTime($date); + } else { + $this->date = new DateTimeImmutable($date); } - $this->value = (float) $value; + $this->value = $value; } - - /** - * @return DateTime - */ - public function getDate() + public function getDate(): DateTimeInterface { return $this->date; } - - /** - * @return float - */ - public function getValue() + public function getValue(): float { return $this->value; } + } diff --git a/src/Segment/DonutSegment.php b/src/Segment/DonutSegment.php index 7e0a776..04669a1 100644 --- a/src/Segment/DonutSegment.php +++ b/src/Segment/DonutSegment.php @@ -1,11 +1,8 @@ -title = (string) $title; - $this->value = (float) $value; + $this->title = $title; + $this->value = $value; } - - /** - * @return string - */ - public function getTitle() + public function getTitle(): string { return $this->title; } - - /** - * @return float - */ - public function getValue() + public function getValue(): float { return $this->value; } + } diff --git a/src/Segment/Segment.php b/src/Segment/Segment.php index 3a20a27..e5f6266 100644 --- a/src/Segment/Segment.php +++ b/src/Segment/Segment.php @@ -1,47 +1,32 @@ -x = (float) $x; - $this->y = (float) $y; + $this->x = $x; + $this->y = $y; } - /** - * @return float - */ - public function getX() + public function getX(): float { return $this->x; } - /** - * @return float - */ - public function getY() + public function getY(): float { return $this->y; } + } diff --git a/src/Serie/AbstractSerie.php b/src/Serie/AbstractSerie.php index c4e1b26..9e485bd 100644 --- a/src/Serie/AbstractSerie.php +++ b/src/Serie/AbstractSerie.php @@ -1,88 +1,82 @@ -assertType($type); - $this->type = (string) $type; - $this->title = (string) $title; - $this->color = $color === null ? null : (string) $color; + $this->type = $type; + $this->title = $title; + $this->color = $color; } - /** - * @param string $type * @throws InvalidArgumentException When type is undefined */ - private function assertType($type) + private function assertType(string $type): void { - static $allowedTypes = [self::AREA_LINE, self::AREA_SPLINE, self::AREA_STEP, self::BAR, self::LINE, self::SPLINE, self::STEP]; - - if (!in_array($type, $allowedTypes)) { + if (!in_array($type, self::TYPES, true)) { throw new InvalidArgumentException(sprintf('Undefined type "%s".', $type)); } } - - /** - * @return string - */ - public function getType() + public function getType(): string { return $this->type; } - - /** - * @return string - */ - public function getTitle() + public function getTitle(): string { return $this->title; } - - /** - * @return string|null - */ - public function getColor() + public function getColor(): ?string { return $this->color; } + } diff --git a/src/Serie/CategorySerie.php b/src/Serie/CategorySerie.php index 34b32c1..7112493 100644 --- a/src/Serie/CategorySerie.php +++ b/src/Serie/CategorySerie.php @@ -1,43 +1,38 @@ -getKey(), $this->usedCategoryKeys)) { + if (in_array($segment->getKey(), $this->usedCategoryKeys, true)) { throw new LogicException(sprintf('Category key "%s" has another segment.', $segment->getKey())); } - $this->segments[] = $segment; + $this->segments[] = $segment; $this->usedCategoryKeys[] = $segment->getKey(); } - /** * @return CategorySegment[] */ - public function getSegments() + public function getSegments(): array { return $this->segments; } + } diff --git a/src/Serie/DateSerie.php b/src/Serie/DateSerie.php index 6615720..50b3f43 100644 --- a/src/Serie/DateSerie.php +++ b/src/Serie/DateSerie.php @@ -1,15 +1,12 @@ -getDate()->getTimestamp(); @@ -33,30 +26,28 @@ public function addSegment(DateSegment $segment) $this->segments[] = $segment; } - /** * @return DateSegment[] */ - public function getSegments() + public function getSegments(): array { return $this->segments; } - /** * @return int Timestamp */ - public function getMinTime() + public function getMinTime(): int { return $this->minTime; } - /** * @return int Timestamp */ - public function getMaxTime() + public function getMaxTime(): int { return $this->maxTime; } + } diff --git a/src/Serie/Serie.php b/src/Serie/Serie.php index 43e61c4..dc1ca11 100644 --- a/src/Serie/Serie.php +++ b/src/Serie/Serie.php @@ -1,33 +1,26 @@ -segments[] = $segment; } - /** * @return Segment[] */ - public function getSegments() + public function getSegments(): array { return $this->segments; } + } diff --git a/src/Util/C3Adapter.php b/src/Util/C3Adapter.php index 0d2c89c..32d4efd 100644 --- a/src/Util/C3Adapter.php +++ b/src/Util/C3Adapter.php @@ -1,20 +1,13 @@ - 'area', @@ -26,4 +19,5 @@ public function getSerieType($libraryType) return str_replace('_', '-', $libraryType); } + } diff --git a/src/templates/c3/CategoryChart.html.php b/src/templates/c3/CategoryChart.phtml similarity index 100% rename from src/templates/c3/CategoryChart.html.php rename to src/templates/c3/CategoryChart.phtml diff --git a/src/templates/c3/Chart.html.php b/src/templates/c3/Chart.html.phtml similarity index 100% rename from src/templates/c3/Chart.html.php rename to src/templates/c3/Chart.html.phtml diff --git a/src/templates/c3/DateChart.html.php b/src/templates/c3/DateChart.phtml similarity index 100% rename from src/templates/c3/DateChart.html.php rename to src/templates/c3/DateChart.phtml diff --git a/src/templates/c3/DonutChart.html.php b/src/templates/c3/DonutChart.phtml similarity index 100% rename from src/templates/c3/DonutChart.html.php rename to src/templates/c3/DonutChart.phtml diff --git a/src/templates/c3/PieChart.html.php b/src/templates/c3/PieChart.phtml similarity index 100% rename from src/templates/c3/PieChart.html.php rename to src/templates/c3/PieChart.phtml diff --git a/tests/.coveralls.yml b/tests/.coveralls.yml new file mode 100644 index 0000000..82764a3 --- /dev/null +++ b/tests/.coveralls.yml @@ -0,0 +1,4 @@ +# for php-coveralls +service_name: travis-ci +coverage_clover: coverage.xml +json_path: coverage.json diff --git a/tests/coverage.xml b/tests/coverage.xml new file mode 100644 index 0000000..180ebfa --- /dev/null +++ b/tests/coverage.xml @@ -0,0 +1,11 @@ + + + + + ./../src + + + + + +