add recurring object
This commit is contained in:
parent
7199ad4dfa
commit
0d5a2b46e6
|
@ -7,6 +7,7 @@
|
||||||
```php
|
```php
|
||||||
use DavidBadura\Taskwarrior\TaskManager;
|
use DavidBadura\Taskwarrior\TaskManager;
|
||||||
use DavidBadura\Taskwarrior\Task;
|
use DavidBadura\Taskwarrior\Task;
|
||||||
|
use DavidBadura\Taskwarrior\Recurring;
|
||||||
|
|
||||||
$tm = TaskManager::create();
|
$tm = TaskManager::create();
|
||||||
|
|
||||||
|
@ -16,7 +17,7 @@ $task->setProject('hobby');
|
||||||
$task->setDue(new \DateTime('tomorrow'));
|
$task->setDue(new \DateTime('tomorrow'));
|
||||||
$task->setPriority(Task::PRIORITY_HIGH);
|
$task->setPriority(Task::PRIORITY_HIGH);
|
||||||
$task->addTag('next');
|
$task->addTag('next');
|
||||||
$task->setRecur('daily');
|
$task->setRecur(new Recurring(Recurring::DAILY));
|
||||||
|
|
||||||
$tm->save($task);
|
$tm->save($task);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace DavidBadura\Taskwarrior;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author David Badura <d.a.badura@gmail.com>
|
||||||
|
*/
|
||||||
|
class Recurring
|
||||||
|
{
|
||||||
|
const DAILY = 'daily';
|
||||||
|
const WEEKDAYS = 'weekdays';
|
||||||
|
const WEEKLY = 'weekly';
|
||||||
|
const BIWEEKLY = 'biweekly';
|
||||||
|
const QUARTERLY = 'quarterly';
|
||||||
|
const SEMIANNUAL = 'semiannual';
|
||||||
|
const ANNUAL = 'annual';
|
||||||
|
const YEARLY = 'yearly';
|
||||||
|
const BIANNUAL = 'biannual';
|
||||||
|
const BIYEARLY = 'biyearly';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $recurring;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $recurring
|
||||||
|
* @throws TaskwarriorException
|
||||||
|
*/
|
||||||
|
public function __construct($recurring)
|
||||||
|
{
|
||||||
|
if ($this->isValid($recurring)) {
|
||||||
|
$this->recurring = $recurring;
|
||||||
|
} else {
|
||||||
|
throw new TaskwarriorException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function __toString()
|
||||||
|
{
|
||||||
|
return $this->recurring;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $recur
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function isValid($recur)
|
||||||
|
{
|
||||||
|
$refClass = new \ReflectionClass(__CLASS__);
|
||||||
|
$constants = $refClass->getConstants();
|
||||||
|
|
||||||
|
if (in_array($recur, $constants)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preg_match('/^[0-9]+d$/', $recur)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preg_match('/^[0-9]+w$/', $recur)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preg_match('/^[0-9]+q$/', $recur)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preg_match('/^[0-9]+y$/', $recur)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace DavidBadura\Taskwarrior\Serializer\Handler;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use DavidBadura\Taskwarrior\Recurring;
|
||||||
|
use JMS\Serializer\Context;
|
||||||
|
use JMS\Serializer\Exception\RuntimeException;
|
||||||
|
use JMS\Serializer\GraphNavigator;
|
||||||
|
use JMS\Serializer\Handler\SubscribingHandlerInterface;
|
||||||
|
use JMS\Serializer\VisitorInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author David Badura <d.a.badura@gmail.com>
|
||||||
|
*/
|
||||||
|
class RecurringHandler implements SubscribingHandlerInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function getSubscribingMethods()
|
||||||
|
{
|
||||||
|
$methods = array();
|
||||||
|
|
||||||
|
$methods[] = array(
|
||||||
|
'type' => 'Recurring',
|
||||||
|
'format' => 'json',
|
||||||
|
'direction' => GraphNavigator::DIRECTION_DESERIALIZATION,
|
||||||
|
'method' => 'deserializeCarbon'
|
||||||
|
);
|
||||||
|
|
||||||
|
$methods[] = array(
|
||||||
|
'type' => 'Recurring',
|
||||||
|
'format' => 'json',
|
||||||
|
'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
|
||||||
|
'method' => 'serializeCarbon'
|
||||||
|
);
|
||||||
|
|
||||||
|
return $methods;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param VisitorInterface $visitor
|
||||||
|
* @param Recurring $recurring
|
||||||
|
* @param array $type
|
||||||
|
* @param Context $context
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function serializeCarbon(VisitorInterface $visitor, Recurring $recurring, array $type, Context $context)
|
||||||
|
{
|
||||||
|
return $visitor->visitString((string)$recurring, $type, $context);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param VisitorInterface $visitor
|
||||||
|
* @param string $data
|
||||||
|
* @param array $type
|
||||||
|
* @return \DateTime|null
|
||||||
|
*/
|
||||||
|
public function deserializeCarbon(VisitorInterface $visitor, $data, array $type)
|
||||||
|
{
|
||||||
|
if (null === $data) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Recurring((string) $data);
|
||||||
|
}
|
||||||
|
}
|
14
src/Task.php
14
src/Task.php
|
@ -86,7 +86,7 @@ class Task
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
*
|
*
|
||||||
* @JMS\Type("string")
|
* @JMS\Type("Recurring")
|
||||||
*/
|
*/
|
||||||
private $recur;
|
private $recur;
|
||||||
|
|
||||||
|
@ -269,11 +269,19 @@ class Task
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $recur
|
* @param string|Recurring $recur
|
||||||
|
* @throws TaskwarriorException
|
||||||
*/
|
*/
|
||||||
public function setRecur($recur)
|
public function setRecur($recur)
|
||||||
{
|
{
|
||||||
$this->recur = $recur;
|
if (is_string($recur)) {
|
||||||
|
$this->recur = new Recurring($recur);
|
||||||
|
} elseif ($recur instanceof Recurring) {
|
||||||
|
$this->recur = $recur;
|
||||||
|
} else {
|
||||||
|
throw new TaskwarriorException();
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
namespace DavidBadura\Taskwarrior;
|
namespace DavidBadura\Taskwarrior;
|
||||||
|
|
||||||
use DavidBadura\Taskwarrior\Serializer\Handler\CarbonHandler;
|
use DavidBadura\Taskwarrior\Serializer\Handler\CarbonHandler;
|
||||||
|
use DavidBadura\Taskwarrior\Serializer\Handler\RecurringHandler;
|
||||||
use JMS\Serializer\Handler\HandlerRegistryInterface;
|
use JMS\Serializer\Handler\HandlerRegistryInterface;
|
||||||
use JMS\Serializer\Serializer;
|
use JMS\Serializer\Serializer;
|
||||||
use JMS\Serializer\SerializerBuilder;
|
use JMS\Serializer\SerializerBuilder;
|
||||||
|
@ -277,6 +278,7 @@ class TaskManager
|
||||||
return SerializerBuilder::create()
|
return SerializerBuilder::create()
|
||||||
->configureHandlers(function (HandlerRegistryInterface $registry) {
|
->configureHandlers(function (HandlerRegistryInterface $registry) {
|
||||||
$registry->registerSubscribingHandler(new CarbonHandler());
|
$registry->registerSubscribingHandler(new CarbonHandler());
|
||||||
|
$registry->registerSubscribingHandler(new RecurringHandler());
|
||||||
})
|
})
|
||||||
->addDefaultHandlers()
|
->addDefaultHandlers()
|
||||||
->setDebug(true)
|
->setDebug(true)
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace DavidBadura\Taskwarrior\Test;
|
||||||
|
|
||||||
|
use DavidBadura\Taskwarrior\Recurring;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author David Badura <badura@simplethings.de>
|
||||||
|
*/
|
||||||
|
class RecurringTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function validData()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
['daily'],
|
||||||
|
['weekdays'],
|
||||||
|
['weekly'],
|
||||||
|
['biweekly'],
|
||||||
|
['quarterly'],
|
||||||
|
['semiannual'],
|
||||||
|
['annual'],
|
||||||
|
['yearly'],
|
||||||
|
['biannual'],
|
||||||
|
['biyearly'],
|
||||||
|
['2d'],
|
||||||
|
['12d'],
|
||||||
|
['2w'],
|
||||||
|
['12w'],
|
||||||
|
['2q'],
|
||||||
|
['12q'],
|
||||||
|
['2y'],
|
||||||
|
['12y']
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider validData
|
||||||
|
* @param $recur
|
||||||
|
*/
|
||||||
|
public function testValid($recur)
|
||||||
|
{
|
||||||
|
$this->assertEquals($recur, (string)new Recurring($recur));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function invalidData()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
['dailya'],
|
||||||
|
['asdasd'],
|
||||||
|
['foo'],
|
||||||
|
['weekday'],
|
||||||
|
['2x'],
|
||||||
|
['a2w'],
|
||||||
|
['d']
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider invalidData
|
||||||
|
* @param $recur
|
||||||
|
*/
|
||||||
|
public function testInvalid($recur)
|
||||||
|
{
|
||||||
|
$this->setExpectedException('DavidBadura\Taskwarrior\TaskwarriorException');
|
||||||
|
|
||||||
|
$obj = new Recurring($recur);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue