Code for new release

This commit is contained in:
James Cole
2023-07-15 16:02:42 +02:00
parent f43b539470
commit b557805eeb
213 changed files with 1942 additions and 1426 deletions

View File

@@ -1,8 +1,8 @@
<?php
declare(strict_types=1);
/**
/*
* Calculator.php
* Copyright (c) 2023 Antonio Spinelli https://github.com/tonicospinelli
*
* This file is part of Firefly III (https://github.com/firefly-iii).
@@ -21,10 +21,13 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Calendar;
use Carbon\Carbon;
use FireflyIII\Support\Calendar\Exceptions\IntervalException;
use SplObjectStorage;
/**
* Class Calculator
@@ -32,62 +35,18 @@ use FireflyIII\Support\Calendar\Exceptions\IntervalException;
class Calculator
{
public const DEFAULT_INTERVAL = 1;
private static array $intervals = [];
private static ?\SplObjectStorage $intervalMap = null;
/**
* @return \SplObjectStorage
*/
private static function loadIntervalMap(): \SplObjectStorage
{
if (self::$intervalMap != null) {
return self::$intervalMap;
}
self::$intervalMap = new \SplObjectStorage();
foreach (Periodicity::cases() as $interval) {
$periodicityClass = __NAMESPACE__ . "\\Periodicity\\{$interval->name}";
self::$intervals[] = $interval->name;
self::$intervalMap->attach($interval, new $periodicityClass());
}
return self::$intervalMap;
}
/**
* @param Periodicity $periodicity
* @return bool
*/
private static function containsInterval(Periodicity $periodicity): bool
{
return self::loadIntervalMap()->contains($periodicity);
}
/**
* @param Periodicity $periodicity
* @return bool
*/
public function isAvailablePeriodicity(Periodicity $periodicity): bool
{
return self::containsInterval($periodicity);
}
/**
* @param int $skip
* @return int
*/
private function skipInterval(int $skip): int
{
return self::DEFAULT_INTERVAL + $skip;
}
private static ?SplObjectStorage $intervalMap = null;
private static array $intervals = [];
/**
* @param Carbon $epoch
* @param Periodicity $periodicity
* @param int $skipInterval
*
* @return Carbon
* @throws IntervalException
*/
public function nextDateByInterval(Carbon $epoch, Periodicity $periodicity, int $skipInterval = 0): Carbon
{
public function nextDateByInterval(Carbon $epoch, Periodicity $periodicity, int $skipInterval = 0): Carbon {
if (!self::isAvailablePeriodicity($periodicity)) {
throw IntervalException::unavailable($periodicity, self::$intervals);
}
@@ -98,4 +57,47 @@ class Calculator
return $periodicity->nextDate($epoch->clone(), $interval);
}
/**
* @param Periodicity $periodicity
*
* @return bool
*/
public function isAvailablePeriodicity(Periodicity $periodicity): bool {
return self::containsInterval($periodicity);
}
/**
* @param Periodicity $periodicity
*
* @return bool
*/
private static function containsInterval(Periodicity $periodicity): bool {
return self::loadIntervalMap()->contains($periodicity);
}
/**
* @return SplObjectStorage
*/
private static function loadIntervalMap(): SplObjectStorage {
if (self::$intervalMap != null) {
return self::$intervalMap;
}
self::$intervalMap = new SplObjectStorage();
foreach (Periodicity::cases() as $interval) {
$periodicityClass = __NAMESPACE__ . "\\Periodicity\\{$interval->name}";
self::$intervals[] = $interval->name;
self::$intervalMap->attach($interval, new $periodicityClass());
}
return self::$intervalMap;
}
/**
* @param int $skip
*
* @return int
*/
private function skipInterval(int $skip): int {
return self::DEFAULT_INTERVAL + $skip;
}
}

View File

@@ -1,8 +1,8 @@
<?php
declare(strict_types=1);
/**
/*
* IntervalException.php
* Copyright (c) 2023 Antonio Spinelli https://github.com/tonicospinelli
*
* This file is part of Firefly III (https://github.com/firefly-iii).
@@ -21,32 +21,36 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Calendar\Exceptions;
use Exception;
use FireflyIII\Support\Calendar\Periodicity;
use Throwable;
/**
* Class IntervalException
*/
final class IntervalException extends \Exception
final class IntervalException extends Exception
{
protected $message = 'The periodicity %s is unknown. Choose one of available periodicity: %s';
public readonly array $availableIntervals;
public readonly Periodicity $periodicity;
public readonly array $availableIntervals;
protected $message = 'The periodicity %s is unknown. Choose one of available periodicity: %s';
/**
* @param Periodicity $periodicity
* @param array $intervals
* @param int $code
* @param \Throwable|null $previous
* @param Periodicity $periodicity
* @param array $intervals
* @param int $code
* @param Throwable|null $previous
*
* @return IntervalException
*/
public static function unavailable(
Periodicity $periodicity,
array $intervals,
int $code = 0,
?\Throwable $previous = null
?Throwable $previous = null
): IntervalException {
$message = sprintf(
'The periodicity %s is unknown. Choose one of available periodicity: %s',

View File

@@ -1,8 +1,8 @@
<?php
declare(strict_types=1);
/**
/*
* Periodicity.php
* Copyright (c) 2023 Antonio Spinelli <https://github.com/tonicospinelli>
*
* This file is part of Firefly III (https://github.com/firefly-iii).
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Calendar;
/**

View File

@@ -1,8 +1,8 @@
<?php
declare(strict_types=1);
/**
/*
* Bimonthly.php
* Copyright (c) 2023 Antonio Spinelli <https://github.com/tonicospinelli>
*
* This file is part of Firefly III (https://github.com/firefly-iii).
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Calendar\Periodicity;
/**

View File

@@ -1,8 +1,8 @@
<?php
declare(strict_types=1);
/**
/*
* Daily.php
* Copyright (c) 2023 Antonio Spinelli <https://github.com/tonicospinelli>
*
* This file is part of Firefly III (https://github.com/firefly-iii).
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Calendar\Periodicity;
use Carbon\Carbon;
@@ -32,11 +34,11 @@ final class Daily extends Interval
{
/**
* @param Carbon $date
* @param int $interval
* @param int $interval
*
* @return Carbon
*/
public function nextDate(Carbon $date, int $interval = 1): Carbon
{
public function nextDate(Carbon $date, int $interval = 1): Carbon {
return ($date->clone())->addDays($this->skip($interval));
}
}

View File

@@ -1,8 +1,8 @@
<?php
declare(strict_types=1);
/**
/*
* Fortnightly.php
* Copyright (c) 2023 Antonio Spinelli <https://github.com/tonicospinelli>
*
* This file is part of Firefly III (https://github.com/firefly-iii).
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Calendar\Periodicity;
/**

View File

@@ -1,8 +1,8 @@
<?php
declare(strict_types=1);
/**
/*
* HalfYearly.php
* Copyright (c) 2023 Antonio Spinelli <https://github.com/tonicospinelli>
*
* This file is part of Firefly III (https://github.com/firefly-iii).
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Calendar\Periodicity;
/**

View File

@@ -1,8 +1,8 @@
<?php
declare(strict_types=1);
/**
/*
* Interspacable.php
* Copyright (c) 2023 Antonio Spinelli <https://github.com/tonicospinelli>
*
* This file is part of Firefly III (https://github.com/firefly-iii).
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Calendar\Periodicity;
use Carbon\Carbon;
@@ -32,7 +34,8 @@ interface Interspacable
{
/**
* @param Carbon $date
* @param int $interval
* @param int $interval
*
* @return Carbon
*/
public function nextDate(Carbon $date, int $interval = 1): Carbon;

View File

@@ -1,8 +1,8 @@
<?php
declare(strict_types=1);
/**
/*
* Interval.php
* Copyright (c) 2023 Antonio Spinelli <https://github.com/tonicospinelli>
*
* This file is part of Firefly III (https://github.com/firefly-iii).
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Calendar\Periodicity;
/**
@@ -32,10 +34,10 @@ abstract class Interval implements Interspacable
/**
* @param int $skip
*
* @return int
*/
public function skip(int $skip): int
{
public function skip(int $skip): int {
return static::INTERVAL * $skip;
}
}

View File

@@ -1,8 +1,8 @@
<?php
declare(strict_types=1);
/**
/*
* Monthly.php
* Copyright (c) 2023 Antonio Spinelli <https://github.com/tonicospinelli>
*
* This file is part of Firefly III (https://github.com/firefly-iii).
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Calendar\Periodicity;
use Carbon\Carbon;
@@ -32,11 +34,11 @@ class Monthly extends Interval
{
/**
* @param Carbon $date
* @param int $interval
* @param int $interval
*
* @return Carbon
*/
public function nextDate(Carbon $date, int $interval = 1): Carbon
{
public function nextDate(Carbon $date, int $interval = 1): Carbon {
return ($date->clone())->addMonthsNoOverflow($this->skip($interval));
}
}

View File

@@ -1,8 +1,8 @@
<?php
declare(strict_types=1);
/**
/*
* Quarterly.php
* Copyright (c) 2023 Antonio Spinelli <https://github.com/tonicospinelli>
*
* This file is part of Firefly III (https://github.com/firefly-iii).
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Calendar\Periodicity;
/**

View File

@@ -1,8 +1,8 @@
<?php
declare(strict_types=1);
/**
/*
* Weekly.php
* Copyright (c) 2023 Antonio Spinelli <https://github.com/tonicospinelli>
*
* This file is part of Firefly III (https://github.com/firefly-iii).
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Calendar\Periodicity;
use Carbon\Carbon;
@@ -32,11 +34,11 @@ class Weekly extends Interval
{
/**
* @param Carbon $date
* @param int $interval
* @param int $interval
*
* @return Carbon
*/
public function nextDate(Carbon $date, int $interval = 1): Carbon
{
public function nextDate(Carbon $date, int $interval = 1): Carbon {
return ($date->clone())->addWeeks($this->skip($interval));
}
}

View File

@@ -1,8 +1,8 @@
<?php
declare(strict_types=1);
/**
/*
* Yearly.php
* Copyright (c) 2023 Antonio Spinelli <https://github.com/tonicospinelli>
*
* This file is part of Firefly III (https://github.com/firefly-iii).
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Calendar\Periodicity;
use Carbon\Carbon;
@@ -32,11 +34,11 @@ final class Yearly extends Interval
{
/**
* @param Carbon $date
* @param int $interval
* @param int $interval
*
* @return Carbon
*/
public function nextDate(Carbon $date, int $interval = 1): Carbon
{
public function nextDate(Carbon $date, int $interval = 1): Carbon {
return ($date->clone())->addYearsNoOverflow($this->skip($interval));
}
}