From edae178fb75a16666fc91a696c063452b3e827a4 Mon Sep 17 00:00:00 2001 From: Awilum Date: Tue, 15 Dec 2020 18:30:55 +0300 Subject: [PATCH] feat(fields): Add new field `registry.get` for Registry API #494 --- .../Entries/Fields/RegistryField.php | 31 ++++++++++++++++++ src/flextype/settings.yaml | 3 ++ .../Entries/Fields/RegistryFieldTest.php | 32 +++++++++++++++++++ .../fixtures/entries/registry-root/entry.md | 16 ++++++++++ .../entries/registry-root/level-1/entry.md | 16 ++++++++++ .../registry-root/level-1/level-2/entry.md | 11 +++++++ 6 files changed, 109 insertions(+) create mode 100644 src/flextype/Foundation/Entries/Fields/RegistryField.php create mode 100644 tests/Foundation/Entries/Fields/RegistryFieldTest.php create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/registry-root/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/registry-root/level-1/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/registry-root/level-1/level-2/entry.md diff --git a/src/flextype/Foundation/Entries/Fields/RegistryField.php b/src/flextype/Foundation/Entries/Fields/RegistryField.php new file mode 100644 index 00000000..6a9ab01b --- /dev/null +++ b/src/flextype/Foundation/Entries/Fields/RegistryField.php @@ -0,0 +1,31 @@ +get('flextype.settings.entries.fields.registry.get.enabled')) { + flextype('emitter')->addListener('onEntriesFetchSingleHasResult', static function (): void { + if (flextype('entries')->hasStorage('fetch.data.registry.get')) { + // Get fetch. + $original = flextype('entries')->getStorage('fetch'); + + $data = []; + + // Modify fetch. + foreach (flextype('entries')->getStorage('fetch.data.registry.get') as $field => $body) { + $data = arrays($data)->merge(arrays($data)->set($field, flextype('registry')->get($body['key'], + isset($body['default']) ? + $body['default'] : + []))->toArray())->toArray(); + + } + + // Save fetch. + flextype('entries')->setStorage('fetch.data', arrays($original['data'])->merge($data)->toArray()); + } + }); +} diff --git a/src/flextype/settings.yaml b/src/flextype/settings.yaml index e19e220d..141fbbef 100644 --- a/src/flextype/settings.yaml +++ b/src/flextype/settings.yaml @@ -59,6 +59,9 @@ errors: entries: extension: md fields: + registry: + get: + enabled: true entries: fetchCollection: enabled: true diff --git a/tests/Foundation/Entries/Fields/RegistryFieldTest.php b/tests/Foundation/Entries/Fields/RegistryFieldTest.php new file mode 100644 index 00000000..841eda72 --- /dev/null +++ b/tests/Foundation/Entries/Fields/RegistryFieldTest.php @@ -0,0 +1,32 @@ +directory(PATH['project'] . '/entries')->create(); +}); + +afterEach(function (): void { + filesystem()->directory(PATH['project'] . '/entries')->delete(); +}); + +test('test registry field', function () { + flextype('entries')->create('registry-root', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/registry-root/entry.md')->get())); + flextype('entries')->create('registry-root/level-1', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/registry-root/level-1/entry.md')->get())); + flextype('entries')->create('registry-root/level-1/level-2', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/registry-root/level-1/level-2/entry.md')->get())); + + $data = flextype('entries')->fetchSingle('registry-root'); + + print_r($data); + print_r($data->toJson()); + + $this->assertEquals('Flextype', $data['flextype']); + $this->assertEquals('Sergey Romanenko', $data['author']['name']); + $this->assertEquals('MIT', $data['license']); + $this->assertEquals('Flextype', $data['level1']['flextype']); + $this->assertEquals('Sergey Romanenko', $data['level1']['author']['name']); + $this->assertEquals('MIT', $data['level1']['license']); + $this->assertEquals('Flextype', $data['level1']['level2']['flextype']); + $this->assertEquals('Sergey Romanenko', $data['level1']['level2']['author']['name']); + $this->assertEquals('MIT', $data['level1']['level2']['license']); +}); diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/registry-root/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/registry-root/entry.md new file mode 100644 index 00000000..559555e5 --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/registry-root/entry.md @@ -0,0 +1,16 @@ +--- +title: Root +registry: + get: + flextype: + key: flextype.manifest.name + author.name: + key: flextype.manifest.author.name + license: + key: flextype.manifest.license +entries: + fetchSingle: + level1: + id: registry-root/level-1 + result: toArray +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/registry-root/level-1/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/registry-root/level-1/entry.md new file mode 100644 index 00000000..5ae608cf --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/registry-root/level-1/entry.md @@ -0,0 +1,16 @@ +--- +title: Level 1 +entries: + fetchSingle: + level2: + id: registry-root/level-1/level-2 + result: toArray +registry: + get: + flextype: + key: flextype.manifest.name + author.name: + key: flextype.manifest.author.name + license: + key: flextype.manifest.license +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/registry-root/level-1/level-2/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/registry-root/level-1/level-2/entry.md new file mode 100644 index 00000000..48a5fc19 --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/registry-root/level-1/level-2/entry.md @@ -0,0 +1,11 @@ +--- +title: Level 2 +registry: + get: + flextype: + key: flextype.manifest.name + author.name: + key: flextype.manifest.author.name + license: + key: flextype.manifest.license +---