diff --git a/src/Application/UseCases/ImportAbcFile.php b/src/Application/UseCases/ImportAbcFile.php index 9aa529f..a7e30be 100644 --- a/src/Application/UseCases/ImportAbcFile.php +++ b/src/Application/UseCases/ImportAbcFile.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Application\UseCases; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Core\Collection; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Core\TuneCollection; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -12,19 +13,19 @@ use XaiCorp\AbcParser\Domain\Modules\Interpreter\Interpreter; class ImportAbcFile { /** - * @var Builder + * @var TuneBuilder */ protected $builderTemplate; /** - * @param Builder $builderTemplate + * @param TuneBuilder $builderTemplate */ - public function __construct(Builder $builderTemplate) + public function __construct(TuneBuilder $builderTemplate) { $this->builderTemplate = $builderTemplate; } - public static function create(Builder $builderTemplate = null) + public static function create(TuneBuilder $builderTemplate = null) { $builder = $builderTemplate ?: new Builder(); diff --git a/src/Domain/Core/Collection.php b/src/Domain/Core/Collection.php index ebb4553..a7fc590 100644 --- a/src/Domain/Core/Collection.php +++ b/src/Domain/Core/Collection.php @@ -17,6 +17,14 @@ class Collection extends BaseCollection return array_reduce($this->items, $callback, $initial); } + /** + * @return \XaiCorp\AbcParser\Domain\Core\Collection + */ + public function unique() + { + return new self(array_unique($this->items)); + } + /** * @param \XaiCorp\AbcParser\Domain\Core\Collection $collection * @return static diff --git a/src/Domain/Core/MultivalueAttribute.php b/src/Domain/Core/MultivalueAttribute.php new file mode 100644 index 0000000..fb58de8 --- /dev/null +++ b/src/Domain/Core/MultivalueAttribute.php @@ -0,0 +1,80 @@ +data = new Collection(); + } + + /** + * @param string $item + * @return \XaiCorp\AbcParser\Domain\Core\MultivalueAttribute + */ + public static function create(string $item) + { + return (new self())->add($item); + } + + /** + * @param array $items + * @return \XaiCorp\AbcParser\Domain\Core\MultivalueAttribute + */ + public static function createFromArray(array $items) + { + $attribute = new self(); + + foreach ($items as $item) { + $attribute->add($item); + } + + return $attribute; + } + + /** + * @param string $item + * @return static + */ + public function add(string $item) + { + $this->data = $this->data->push($item)->unique(); + + return $this; + } + + /** + * @param MultivalueAttribute $attribute + * @return static + */ + public function merge(MultivalueAttribute $attribute) + { + $this->data = $this->data + ->pushArray($attribute->data->toArray()) + ->unique(); + + return $this; + } + + /** + * @return string + */ + public function first() + { + return $this->data->firstOrDefault(''); + } + + /** + * @return string[] + */ + public function toArray() + { + return $this->data->toArray(); + } +} diff --git a/src/Domain/Core/Person.php b/src/Domain/Core/Person.php index 356756e..540df7b 100644 --- a/src/Domain/Core/Person.php +++ b/src/Domain/Core/Person.php @@ -30,6 +30,20 @@ class Person implements EntityInterface $this->setIdentity($identity); } + /** + * @param string $name + * @param \XaiCorp\AbcParser\Domain\Atoms\EmailAtom $email + * @param \Webpatser\Uuid\Uuid|null $identity + * @return static + * @throws \Enzyme\Axiom\Exceptions\AtomException + */ + public static function create(string $name, EmailAtom $email, Uuid $identity = null) + { + $nameAtom = new StringAtom($name); + + return new static($nameAtom, $email, $identity); + } + /** * Checks whether this model has the given attribute set. * diff --git a/src/Domain/Core/Tune.php b/src/Domain/Core/Tune.php index cede3be..36cfc98 100644 --- a/src/Domain/Core/Tune.php +++ b/src/Domain/Core/Tune.php @@ -124,6 +124,7 @@ class Tune implements EntityInterface /** * @param string $title * @return $this + * @deprecated */ public function addTitle(string $title) : Tune { @@ -278,15 +279,19 @@ class Tune implements EntityInterface call_user_func([$this, 'set'.$attribute], $value); break; + case 'Authors': + call_user_func([$this, 'addAuthor'], $value); + break; + default: $this->append($attribute, $value); } } - protected function append($attribute, array $values) + protected function append($attribute, MultivalueAttribute $values) { $method = 'add' . substr($attribute, 0, -1); - foreach ($values as $value) { + foreach ($values->toArray() as $value) { call_user_func([$this, $method], $value); } } @@ -329,13 +334,18 @@ class Tune implements EntityInterface * @param StringAtom $musicLine * @return $this */ - public function appendMusicLine(string $musicLine) + public function addMusicLine(string $musicLine) { - $this->music .= $musicLine->getValue() . PHP_EOL; + $this->music .= $musicLine . PHP_EOL; return $this; } + public function getMusic() + { + return $this->music; + } + public function merge(Tune $source) { //TODO diff --git a/src/Domain/Core/TuneAttributeArrayBuilder.php b/src/Domain/Core/TuneAttributeArrayBuilder.php new file mode 100644 index 0000000..4521afb --- /dev/null +++ b/src/Domain/Core/TuneAttributeArrayBuilder.php @@ -0,0 +1,172 @@ +attributes, $identity); + } + + /** + * @return $this + */ + public function handleEndOfMusic() + { + // TODO: Implement handleEndOfMusic() method. + } + + /** + * @param UnsignedIntegerAtom $param + * @return $this + */ + public function setIndex(UnsignedIntegerAtom $param): \XaiCorp\AbcParser\Domain\Core\TuneBuilder + { + $this->attributes['index'] = $param; + + return $this; + } + + /** + * @param \Enzyme\Axiom\Atoms\StringAtom $param + * @return $this + */ + public function appendMusic(StringAtom $param): \XaiCorp\AbcParser\Domain\Core\TuneBuilder + { + $index = 'MusicLines'; + $item = $param->getValue(); + + if (!isset($this->attributes[$index])) { + $this->attributes[$index] = MultivalueAttribute::create($item); + } else { + $this->attributes[$index]->add($item); + } + + return $this; + } + + public function addTitle(string $title): \XaiCorp\AbcParser\Domain\Core\TuneBuilder + { + $index = 'Titles'; + $item = $title; + + if (!isset($this->attributes[$index])) { + $this->attributes[$index] = MultivalueAttribute::create($item); + } else { + $this->attributes[$index]->add($item); + } + + return $this; + } + + public function setKey(StringAtom $key) + { + // TODO: Implement setKey() method. + } + + public function setMeter(StringAtom $key) + { + // TODO: Implement setMeter() method. + } + + public function addAuthor(string $name): \XaiCorp\AbcParser\Domain\Core\TuneBuilder + { + $index = 'Authors'; + $item = Author::create($name, new EmailAtom('')); + + if (!isset($this->attributes[$index])) { + $this->attributes[$index] = $item; + } else { + $this->attributes[$index]->add($item); + } + + return $this; + } + + public function addComposer(StringAtom $composerName) + { + // TODO: Implement addComposer() method. + } + + public function addTranscriber(StringAtom $transcriberName) + { + // TODO: Implement addTranscriber() method. + } + + public function addDiscography(StringAtom $recording) + { + // TODO: Implement addDiscography() method. + } + + public function addGroup(StringAtom $groupName) + { + // TODO: Implement addGroup() method. + } + + public function setParts(StringAtom $part) + { + // TODO: Implement setParts() method. + } + + public function addSource(StringAtom $source) + { + // TODO: Implement addSource() method. + } + + public function addFilename(StringAtom $filename) + { + // TODO: Implement addFilename() method. + } + + public function addHistory(StringAtom $history) + { + // TODO: Implement addHistory() method. + } + + public function addRhythm(StringAtom $rhythm) + { + // TODO: Implement addRhythm() method. + } + + public function addBook(StringAtom $param) + { + // TODO: Implement addBook() method. + } + + public function addWords(StringAtom $param) + { + // TODO: Implement addWords() method. + } + + public function addTempo(StringAtom $param) + { + // TODO: Implement addTempo() method. + } + + public function addNoteLength(StringAtom $param) + { + // TODO: Implement addNoteLength() method. + } + + public function addNote(StringAtom $param) + { + // TODO: Implement addNote() method. + } + + public function addOrigin(StringAtom $param) + { + // TODO: Implement addOrigin() method. + } +} diff --git a/src/Domain/Core/TuneBuilder.php b/src/Domain/Core/TuneBuilder.php new file mode 100644 index 0000000..880ca26 --- /dev/null +++ b/src/Domain/Core/TuneBuilder.php @@ -0,0 +1,69 @@ +tune->addSetting($this->setting); } - public function getTune() + public function getTune(Uuid $identity = null): \XaiCorp\AbcParser\Domain\Core\Tune { return $this->tune; } @@ -64,7 +66,7 @@ class Builder } /** - * @return $this + * @return TuneBuilder */ public function handleEndOfMusic() { @@ -82,26 +84,26 @@ class Builder } /** - * @param UnsignedIntegerAtom $index - * @return $this + * @param UnsignedIntegerAtom $param + * @return TuneBuilder */ - public function setIndex(UnsignedIntegerAtom $index) + public function setIndex(UnsignedIntegerAtom $param): \XaiCorp\AbcParser\Domain\Core\TuneBuilder { - $this->tune->setIndex($index); + $this->tune->setIndex($param); return $this; } - public function appendMusic(StringAtom $musicLine) + public function appendMusic(StringAtom $param): \XaiCorp\AbcParser\Domain\Core\TuneBuilder { - $this->setting->addMusicLine($musicLine->getValue()); + $this->setting->addMusicLine($param->getValue()); return $this; } - public function addTitle(StringAtom $title) + public function addTitle(string $title): \XaiCorp\AbcParser\Domain\Core\TuneBuilder { - $this->tune->addTitle($title->getValue()); + $this->tune->addTitle($title); return $this; } @@ -120,9 +122,9 @@ class Builder return $this; } - public function addAuthor(StringAtom $name) + public function addAuthor(string $name): \XaiCorp\AbcParser\Domain\Core\TuneBuilder { - $author = new Author($name, new EmailAtom('')); + $author = Author::create($name, new EmailAtom('')); $this->tune->addAuthor($author); return $this; diff --git a/src/Domain/Modules/Interpreter/DefaultInterpreter.php b/src/Domain/Modules/Interpreter/DefaultInterpreter.php index ce68082..9f28ff1 100644 --- a/src/Domain/Modules/Interpreter/DefaultInterpreter.php +++ b/src/Domain/Modules/Interpreter/DefaultInterpreter.php @@ -94,7 +94,6 @@ class DefaultInterpreter extends Interpreter $context->next(); } while ($context->count() > $context->key()); -// return $this->builder->getTune(); return $this; } diff --git a/src/Domain/Modules/Interpreter/Interpreter.php b/src/Domain/Modules/Interpreter/Interpreter.php index a821126..c3ad62f 100644 --- a/src/Domain/Modules/Interpreter/Interpreter.php +++ b/src/Domain/Modules/Interpreter/Interpreter.php @@ -2,6 +2,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter; use XaiCorp\AbcParser\Domain\Core\Tune; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Core\TuneCollection; abstract class Interpreter @@ -11,14 +12,14 @@ abstract class Interpreter const LN_FIELD = '/^\w:(.+)$/'; /** - * @var Builder + * @var TuneBuilder */ protected $builder; /** * Interpreter constructor. */ - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Author.php b/src/Domain/Modules/Interpreter/Lexicon/Author.php index 36f07be..49b6db5 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Author.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Author.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Author implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } @@ -32,7 +33,7 @@ class Author implements Lex list($key, $data) = $this->getKeyDataFromLine($line); if ($key === 'A') { - $this->builder->addAuthor(new StringAtom($data)); + $this->builder->addAuthor($data); } return $next($context); diff --git a/src/Domain/Modules/Interpreter/Lexicon/Book.php b/src/Domain/Modules/Interpreter/Lexicon/Book.php index 17c4128..3dba5a7 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Book.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Book.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Book implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Composer.php b/src/Domain/Modules/Interpreter/Lexicon/Composer.php index 46a3100..ac70c91 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Composer.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Composer.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Composer implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Discography.php b/src/Domain/Modules/Interpreter/Lexicon/Discography.php index bd1655d..b9b4941 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Discography.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Discography.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Discography implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/EndOfTune.php b/src/Domain/Modules/Interpreter/Lexicon/EndOfTune.php index 7c83550..7d93318 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/EndOfTune.php +++ b/src/Domain/Modules/Interpreter/Lexicon/EndOfTune.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class EndOfTune implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Filename.php b/src/Domain/Modules/Interpreter/Lexicon/Filename.php index 77f0923..a7a2bef 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Filename.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Filename.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Filename implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Group.php b/src/Domain/Modules/Interpreter/Lexicon/Group.php index 73b3a2c..ed3f959 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Group.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Group.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Group implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/History.php b/src/Domain/Modules/Interpreter/Lexicon/History.php index 2afe87d..2013ae1 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/History.php +++ b/src/Domain/Modules/Interpreter/Lexicon/History.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class History implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Index.php b/src/Domain/Modules/Interpreter/Lexicon/Index.php index cdca636..984e435 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Index.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Index.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Index implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/KeySignature.php b/src/Domain/Modules/Interpreter/Lexicon/KeySignature.php index 2171b10..37a74d5 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/KeySignature.php +++ b/src/Domain/Modules/Interpreter/Lexicon/KeySignature.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class KeySignature implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Meter.php b/src/Domain/Modules/Interpreter/Lexicon/Meter.php index 378bb29..973fbdc 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Meter.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Meter.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Meter implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/MusicLine.php b/src/Domain/Modules/Interpreter/Lexicon/MusicLine.php index 413f3a4..4df61dc 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/MusicLine.php +++ b/src/Domain/Modules/Interpreter/Lexicon/MusicLine.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class MusicLine implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/NoteLength.php b/src/Domain/Modules/Interpreter/Lexicon/NoteLength.php index 9ef7315..b2dd722 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/NoteLength.php +++ b/src/Domain/Modules/Interpreter/Lexicon/NoteLength.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class NoteLength implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Notes.php b/src/Domain/Modules/Interpreter/Lexicon/Notes.php index 001b9e6..274280d 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Notes.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Notes.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Notes implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Origin.php b/src/Domain/Modules/Interpreter/Lexicon/Origin.php index 02cb4eb..88b85e6 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Origin.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Origin.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Origin implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Parts.php b/src/Domain/Modules/Interpreter/Lexicon/Parts.php index 6194715..839b125 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Parts.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Parts.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Parts implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Rhythm.php b/src/Domain/Modules/Interpreter/Lexicon/Rhythm.php index 3c93c44..fe8004a 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Rhythm.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Rhythm.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Rhythm implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Source.php b/src/Domain/Modules/Interpreter/Lexicon/Source.php index c448953..3cfe1d4 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Source.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Source.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Source implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Tempo.php b/src/Domain/Modules/Interpreter/Lexicon/Tempo.php index 4650d5f..eda7ee0 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Tempo.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Tempo.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Tempo implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Title.php b/src/Domain/Modules/Interpreter/Lexicon/Title.php index 147effc..ead49ef 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Title.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Title.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Title implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } @@ -32,7 +33,7 @@ class Title implements Lex list($key, $data) = $this->getKeyDataFromLine($line); if ($key === 'T') { - $this->builder->addTitle(new StringAtom($data)); + $this->builder->addTitle($data); } return $next($context); diff --git a/src/Domain/Modules/Interpreter/Lexicon/Transcriber.php b/src/Domain/Modules/Interpreter/Lexicon/Transcriber.php index 8427eb7..28cef88 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Transcriber.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Transcriber.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Transcriber implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/src/Domain/Modules/Interpreter/Lexicon/Words.php b/src/Domain/Modules/Interpreter/Lexicon/Words.php index 8900e24..9d53f65 100644 --- a/src/Domain/Modules/Interpreter/Lexicon/Words.php +++ b/src/Domain/Modules/Interpreter/Lexicon/Words.php @@ -3,6 +3,7 @@ namespace XaiCorp\AbcParser\Domain\Modules\Interpreter\Lexicon; use Enzyme\Axiom\Atoms\StringAtom; use XaiCorp\AbcParser\Domain\Atoms\UnsignedIntegerAtom; +use XaiCorp\AbcParser\Domain\Core\TuneBuilder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Builder; use XaiCorp\AbcParser\Domain\Modules\Interpreter\Context; @@ -11,11 +12,11 @@ class Words implements Lex use LineKeyDataTrait; /** - * @var Builder + * @var TuneBuilder */ protected $builder; - public function __construct(Builder $builder) + public function __construct(TuneBuilder $builder) { $this->builder = $builder; } diff --git a/tests/unit/AbcParser/Domain/Core/TuneAttributeArrayBuilderTest.php b/tests/unit/AbcParser/Domain/Core/TuneAttributeArrayBuilderTest.php new file mode 100644 index 0000000..e4739c3 --- /dev/null +++ b/tests/unit/AbcParser/Domain/Core/TuneAttributeArrayBuilderTest.php @@ -0,0 +1,37 @@ +setIndex($index)->getTune(); + + $this->assertInstanceOf(Tune::class, $tune); + $this->assertEquals($index->getValue(), $tune->getIndex()); + } + + public function testAppendMusic() + { + $music = new \Enzyme\Axiom\Atoms\StringAtom('Abcd|'); + $builder = new TuneAttributeArrayBuilder(); + + $tune = $builder->appendMusic($music)->getTune(); + + $this->assertInstanceOf(Tune::class, $tune); + $this->assertEquals($music->getValue(), trim($tune->getMusic())); + } +} diff --git a/tests/unit/AbcParser/Domain/Core/TuneTest.php b/tests/unit/AbcParser/Domain/Core/TuneTest.php index 3925f9c..0389fcc 100644 --- a/tests/unit/AbcParser/Domain/Core/TuneTest.php +++ b/tests/unit/AbcParser/Domain/Core/TuneTest.php @@ -16,6 +16,7 @@ use XaiCorp\AbcParser\Domain\Core\Author; use XaiCorp\AbcParser\Domain\Core\Composer; use XaiCorp\AbcParser\Domain\Core\Tune; use XaiCorp\AbcParser\Domain\Core\Setting; +use XaiCorp\AbcParser\Domain\Core\TuneAttributeArrayBuilder; class TuneTest extends \PHPUnit_Framework_TestCase { @@ -28,17 +29,15 @@ class TuneTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf(Tune::class, $tune); } - public function testCanIntializeFromArray() + public function testCanInitializeFromArray() { $titles = ['Title']; $authors = ['Richard Morgan']; - $config = [ - 'Titles' => $titles, - 'Authors' => $authors - ]; - - $tune = new Tune($config); + $tune = TuneAttributeArrayBuilder::create() + ->addTitle($titles[0]) + ->addAuthor($authors[0]) + ->getTune(); $this->assertInstanceOf(Tune::class, $tune); $this->assertEquals($tune->getTitles(), $titles); @@ -187,17 +186,21 @@ class TuneTest extends \PHPUnit_Framework_TestCase public function testMergeAddsExtraDataToTune() { - $targetTune = new Tune([ - 'titles' => ['target'] - ]); - $sourceTune = new Tune([ - 'titles' => ['source'] - ]); + $targetTune = TuneAttributeArrayBuilder::create() + ->addTitle('target') + ->getTune(); + + $sourceTune = TuneAttributeArrayBuilder::create() + ->addTitle('source') + ->getTune(); + + $expected = TuneAttributeArrayBuilder::create() + ->addTitle('target') + ->addTitle('source') + ->getTune($targetTune->identity()); $result = $targetTune->merge($sourceTune); - $this->assertEquals(new Tune([ - 'titles' => ['target', 'source'] - ]), $result); + $this->assertEquals($expected, $result); } }