refactor -> add task manager
This commit is contained in:
@@ -16,11 +16,6 @@ class Taskwarrior
|
||||
*/
|
||||
private $rcOptions;
|
||||
|
||||
/**
|
||||
* @var Task[]
|
||||
*/
|
||||
private $tasks = [];
|
||||
|
||||
/**
|
||||
* @param string $taskrc
|
||||
* @param string $taskData
|
||||
@@ -40,110 +35,19 @@ class Taskwarrior
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Task $task
|
||||
* @param string $uuid
|
||||
*/
|
||||
public function save(Task $task)
|
||||
public function delete($uuid)
|
||||
{
|
||||
if (!$task->getUuid()) {
|
||||
$this->add($task);
|
||||
} else {
|
||||
$this->edit($task);
|
||||
}
|
||||
$this->command('delete', $uuid);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $uuid
|
||||
* @return Task
|
||||
* @throws TaskwarriorException
|
||||
*/
|
||||
public function find($uuid)
|
||||
public function done($uuid)
|
||||
{
|
||||
if (isset($this->tasks[$uuid])) {
|
||||
return $this->tasks[$uuid];
|
||||
}
|
||||
|
||||
$tasks = $this->filterAll($uuid);
|
||||
|
||||
if (count($tasks) == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (count($tasks) == 1) {
|
||||
return $tasks[0];
|
||||
}
|
||||
|
||||
throw new TaskwarriorException();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string|array $filter
|
||||
* @return Task[]
|
||||
*/
|
||||
public function filterAll($filter = null)
|
||||
{
|
||||
if (is_string($filter)) {
|
||||
$filter = explode(' ', $filter);
|
||||
}
|
||||
|
||||
$result = $this->export($filter);
|
||||
|
||||
foreach ($result as $key => $task) {
|
||||
if (isset($this->tasks[$task->getUuid()])) {
|
||||
|
||||
$result[$key] = $this->tasks[$task->getUuid()];
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->tasks[$task->getUuid()] = $task;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string|array $filter
|
||||
* @return Task[]
|
||||
*/
|
||||
public function filter($filter = null)
|
||||
{
|
||||
$tasks = $this->filterAll($filter . ' status:pending');
|
||||
|
||||
return $this->sort($tasks);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Task $task
|
||||
*/
|
||||
public function delete(Task $task)
|
||||
{
|
||||
if (!$task->getUuid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->command('delete', $task->getUuid());
|
||||
$this->update($task);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Task $task
|
||||
*/
|
||||
public function done(Task $task)
|
||||
{
|
||||
if (!$task->getUuid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->command('done', $task->getUuid());
|
||||
$this->update($task);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function clear()
|
||||
{
|
||||
$this->tasks = [];
|
||||
$this->command('done', $uuid);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -151,7 +55,7 @@ class Taskwarrior
|
||||
* @return string
|
||||
* @throws TaskwarriorException
|
||||
*/
|
||||
private function import($json)
|
||||
public function import($json)
|
||||
{
|
||||
$fs = new Filesystem();
|
||||
|
||||
@@ -169,17 +73,11 @@ class Taskwarrior
|
||||
|
||||
/**
|
||||
* @param string|array $filter
|
||||
* @return Task[]
|
||||
* @return string
|
||||
*/
|
||||
private function export($filter = null)
|
||||
public function export($filter = null)
|
||||
{
|
||||
$json = $this->command('export', $filter);
|
||||
|
||||
$serializer = SerializerBuilder::create()
|
||||
->addDefaultHandlers()
|
||||
->build();
|
||||
|
||||
return $serializer->deserialize($json, 'array<DavidBadura\Taskwarrior\Task>', 'json');
|
||||
return $this->command('export', $filter);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -189,7 +87,7 @@ class Taskwarrior
|
||||
* @return string
|
||||
* @throws TaskwarriorException
|
||||
*/
|
||||
private function command($command, $filter = null, array $options = array())
|
||||
public function command($command, $filter = null, array $options = array())
|
||||
{
|
||||
$builder = $this->createProcessBuilder();
|
||||
|
||||
@@ -225,71 +123,6 @@ class Taskwarrior
|
||||
return $process->getOutput();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Task $task
|
||||
* @throws TaskwarriorException
|
||||
*/
|
||||
private function add(Task $task)
|
||||
{
|
||||
$json = $this->serializeTask($task);
|
||||
$uuid = $this->import($json);
|
||||
|
||||
$this->setValue($task, 'uuid', $uuid);
|
||||
$this->tasks[$uuid] = $task;
|
||||
|
||||
$this->update($task);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Task $task
|
||||
*/
|
||||
private function edit(Task $task)
|
||||
{
|
||||
$options = [];
|
||||
|
||||
if ($task->getDue()) {
|
||||
$options[] = 'due:' . $task->getDue()->format('Ymd\THis\Z');
|
||||
} else {
|
||||
$options[] = 'due:';
|
||||
}
|
||||
|
||||
$options[] = $task->getDescription();
|
||||
|
||||
$this->command('modify', $task->getUuid(), $options);
|
||||
$this->update($task);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Task $task
|
||||
*/
|
||||
private function update(Task $task)
|
||||
{
|
||||
$clean = $this->export($task->getUuid())[0];
|
||||
|
||||
$this->setValue($task, 'urgency', $clean->getUrgency());
|
||||
$this->setValue($task, 'status', $clean->getStatus());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Task[] $tasks
|
||||
* @return Task[]
|
||||
*/
|
||||
private function sort(array $tasks)
|
||||
{
|
||||
usort(
|
||||
$tasks,
|
||||
function (Task $a, Task $b) {
|
||||
if (0 != $diff = $b->getUrgency() - $a->getUrgency()) {
|
||||
return $diff;
|
||||
}
|
||||
|
||||
return $a->getEntry() >= $b->getEntry() ? 1 : -1;
|
||||
}
|
||||
);
|
||||
|
||||
return $tasks;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ProcessBuilder
|
||||
*/
|
||||
@@ -306,33 +139,4 @@ class Taskwarrior
|
||||
|
||||
return $builder;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param Task $task
|
||||
* @return string
|
||||
*/
|
||||
private function serializeTask(Task $task)
|
||||
{
|
||||
$serializer = SerializerBuilder::create()
|
||||
->addDefaultHandlers()
|
||||
->build();
|
||||
|
||||
$result = $serializer->serialize($task, 'json');
|
||||
|
||||
return str_replace("\\/", "/", $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Task $task
|
||||
* @param string $attr
|
||||
* @param mixed $value
|
||||
*/
|
||||
private function setValue(Task $task, $attr, $value)
|
||||
{
|
||||
$reflectionClass = new \ReflectionClass('DavidBadura\Taskwarrior\Task');
|
||||
$prop = $reflectionClass->getProperty($attr);
|
||||
$prop->setAccessible(true);
|
||||
$prop->setValue($task, $value);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user