Skip to content
Snippets Groups Projects
Commit c884073c authored by Caspar Martens's avatar Caspar Martens
Browse files

Merge branch 'feature/extensions/apiv2' into 'dev'

Feature/extensions/apiv2

See merge request !2
parents 7f6e0b3f 6c26e84f
No related branches found
No related tags found
1 merge request!2Feature/extensions/apiv2
......@@ -4,8 +4,7 @@ help:
cat Makefile
flatpak:
flatpak --user remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak-builder --user --install .flatpak-build/ org.blackfennec.extensions.base.yml --force-clean --install-deps-from flathub --repo=.flatpak-repo
flatpak-builder --user --install .flatpak-build/ org.blackfennec.app.extensions.base.yml --force-clean --repo=.flatpak-repo
lint:
find . -name "*.py" | xargs pylint --output-format=text || true
......
from pathlib import Path
from blackfennec.extension.extension import Extension
from blackfennec.extension.extension_api import ExtensionApi
from blackfennec.interpretation.specification import Specification
from base.date_time.date_time import DateTime
from base.extension import BaseExtension
import gi
gi.require_version('Gtk', '4.0')
gi.require_version('Adw', '1')
from base.date_time.date_time_view_factory import DateTimeViewFactory
from base.file.file_view_factory import FileViewFactory
from base.image.image_view_factory import ImageViewFactory
BASE_NAME = Path(__file__).parent.as_posix()
__types = []
def _types(api: ExtensionApi):
global __types
if not __types:
__types = [
DateTime.TYPE,
api.type_loader.load(BASE_NAME + '/file/file.json'),
api.type_loader.load(BASE_NAME + '/image/image.json'),
]
return __types
def create_extension(extension_api: ExtensionApi):
"""Registers all base types
Args:
extension_api (ExtensionApi): contains constructor injection
parameters.
"""
factories = [
DateTimeViewFactory(),
FileViewFactory(extension_api.document_registry),
ImageViewFactory(extension_api.document_registry),
]
for type in [DateTime.TYPE]:
extension_api.type_registry.register_type(type)
for type, factory in zip(_types(extension_api), factories):
for specification in [Specification(), Specification(request_preview=True)]:
if factory.satisfies(specification):
extension_api.view_factory_registry.register_view_factory(
type, specification, factory)
def destroy_extension(extension_api: ExtensionApi):
"""Deregisters all base types
Args:
extension_api (ExtensionApi): contains constructor injection
parameters
"""
for type in _types(extension_api):
extension_api.type_registry.deregister_type(type)
extension_api.view_factory_registry.deregister_view_factory(
type, Specification())
extension_api.view_factory_registry.deregister_view_factory(
type, Specification(True))
global __types
__types = []
def create(api: ExtensionApi) -> Extension:
return BaseExtension(api)
from pathlib import Path
from blackfennec.extension.extension import Extension
from blackfennec.extension.extension_api import ExtensionApi
from blackfennec.interpretation.specification import Specification
from base.date_time.date_time import DateTime
from base.date_time.date_time_view_factory import DateTimeViewFactory
from base.file.file_view_factory import FileViewFactory
from base.image.image_view_factory import ImageViewFactory
BASE_NAME = Path(__file__).parent.as_posix()
class BaseExtension(Extension):
def __init__(self, api: ExtensionApi):
super().__init__('base', api, dependencies={'core'})
self.types = []
self.view_factories = [
DateTimeViewFactory(),
FileViewFactory(self._api.document_registry),
ImageViewFactory(self._api.document_registry),
]
def register_types(self):
self.types = [
DateTime.TYPE,
self._api.type_loader.load(BASE_NAME + '/file/file.json'),
self._api.type_loader.load(BASE_NAME + '/image/image.json')
]
self._api.type_registry.register_type(DateTime.TYPE)
def deregister_types(self):
for t in self.types:
self._api.type_registry.deregister_type(t)
def register_view_factories(self):
for specification in [Specification(), Specification(True)]:
for type, view_factory in zip(self.types, self.view_factories):
if not view_factory.satisfies(specification):
continue
self._api.view_factory_registry.register_view_factory(
type, specification, view_factory)
def deregister_view_factories(self):
for specification in [Specification(), Specification(True)]:
for type, view_factory in zip(self.types, self.view_factories):
if not view_factory.satisfies(specification):
continue
self._api.view_factory_registry.deregister_view_factory(
type, specification)
<?xml version="1.0" encoding="UTF-8"?>
<component type="addon">
<id>org.blackfennec.app.extensions.base</id>
<name>Base</name>
<summary>Provides UIs and actions for base types</summary>
<icon type="remote">
https://gitlab.ost.ch/blackfennec/blackfennec/-/raw/main/icon.png
</icon>
<metadata_license>FSFAP</metadata_license>
<project_license>GPL-3.0-only</project_license>
<extends>org.blackfennec.app</extends>
<description>
<p>
This extension provides UIs and actions for base types like Maps and Strings.
</p>
</description>
<url type="homepage">http://blackfennec.org</url>
<url type="bugtracker">
https://gitlab.ost.ch/blackfennec/extensions/base/-/issues/
</url>
<url type="vcs-browser">https://gitlab.ost.ch/blackfennec/extensions/base.git
</url>
</component>
id: org.blackfennec.extensions.base
branch: '1.0'
id: org.blackfennec.app.extensions.base
branch: '0.11'
runtime: org.blackfennec.app
runtime-version: '1.0'
runtime-version: 'stable'
sdk: org.gnome.Sdk//43
build-extension: true
modules:
- name: blackfennec.extensions.base
- name: blackfennec.app.extensions.base
buildsystem: simple
build-commands:
- pip install --prefix=${FLATPAK_DEST} .
- install -Dm644 ./org.blackfennec.app.extensions.base.metainfo.xml /share/metainfo/org.blackfennec.app.extensions.base.metainfo.xml
sources:
- type: dir
path: .
<?xml version="1.0" encoding="UTF-8"?>
<component type="addon">
<id>org.blackfennec.extensions.base</id>
<extends>org.blackfennec.app</extends>
<name>Base</name>
<summary>Provides commonly used types</summary>
<project_license>GPL-3.0</project_license>
<metadata_license>FSFAP</metadata_license>
</component>
......@@ -4,7 +4,7 @@ from setuptools import setup, find_packages
setup(
name="blackfennec_extensions_base",
version="0.0.1",
version="0.11.0",
description="Base extension for BlackFennec",
long_description="Base extension for BlackFennec",
long_description_content_type='text/markdown',
......
import unittest
from base.extension import BaseExtension
import pytest
from blackfennec_doubles.double_dummy import Dummy
from blackfennec_doubles.type_system.double_type_registry import \
......@@ -7,38 +8,46 @@ from blackfennec_doubles.extension.double_view_factory_registry import \
ViewFactoryRegistryMock
from blackfennec_doubles.type_system.double_type_loader import TypeLoaderMock
from blackfennec.extension.extension_api import ExtensionApi
from base import create_extension, destroy_extension
class BaseExtensionTestSuite(unittest.TestCase):
def setUp(self) -> None:
self.type_registry = TypeRegistryMock()
self.view_factory_registry = ViewFactoryRegistryMock()
self.extension_api = ExtensionApi(
presenter_registry=Dummy('PresenterRegistry'),
type_registry=self.type_registry,
interpretation_service=Dummy('InterpretationService'),
view_factory=Dummy('ViewFactory'),
view_factory_registry=self.view_factory_registry,
type_loader=TypeLoaderMock(self.type_registry),
action_registry=Dummy('ActionRegistry'),
document_registry=Dummy('DocumentRegistry'),
document_factory=Dummy('DocumentFactory'),
ui_service_registry=Dummy('UiServiceRegistry'),
)
def test_create_base_extension(self):
create_extension(self.extension_api)
self.assertGreater(self.type_registry.register_type_count, 0)
def test_destroy_base_extension(self):
destroy_extension(self.extension_api)
self.assertGreater(self.type_registry.deregister_type_count, 0)
def test_everything_created_is_destroyed(self):
create_extension(self.extension_api)
destroy_extension(self.extension_api)
self.assertEqual(
self.type_registry.register_type_count,
self.type_registry.deregister_type_count
)
@pytest.fixture()
def extension_api():
type_registry = TypeRegistryMock()
return ExtensionApi(
presenter_registry=Dummy('PresenterRegistry'),
type_registry=type_registry,
interpretation_service=Dummy('InterpretationService'),
view_factory=Dummy('ViewFactory'),
view_factory_registry=ViewFactoryRegistryMock(),
type_loader=TypeLoaderMock(type_registry),
action_registry=Dummy('ActionRegistry'),
document_registry=Dummy('DocumentRegistry'),
document_factory=Dummy('DocumentFactory'),
ui_service_registry=Dummy('UiServiceRegistry'),
)
@pytest.fixture()
def extension(extension_api):
return BaseExtension(extension_api)
def test_can_construct(extension):
assert extension
def test_can_get_name(extension):
assert extension.name == 'base'
def test_can_get_dependencies(extension):
assert extension.dependencies == {'core'}
def test_can_activate(extension):
extension.activate()
def test_can_deactivate(extension):
extension.activate()
extension.deactivate()
import pytest
from blackfennec.extension.extension import Extension
from blackfennec_doubles.double_dummy import Dummy
from blackfennec_doubles.type_system.double_type_registry import \
TypeRegistryMock
from blackfennec_doubles.extension.double_view_factory_registry import \
ViewFactoryRegistryMock
from blackfennec_doubles.type_system.double_type_loader import TypeLoaderMock
from blackfennec.extension.extension_api import ExtensionApi
from base import create
@pytest.fixture()
def extension_api():
type_registry = TypeRegistryMock()
return ExtensionApi(
presenter_registry=Dummy('PresenterRegistry'),
type_registry=type_registry,
interpretation_service=Dummy('InterpretationService'),
view_factory=Dummy('ViewFactory'),
view_factory_registry=ViewFactoryRegistryMock(),
type_loader=TypeLoaderMock(type_registry),
action_registry=Dummy('ActionRegistry'),
document_registry=Dummy('DocumentRegistry'),
document_factory=Dummy('DocumentFactory'),
ui_service_registry=Dummy('UiServiceRegistry'),
)
def test_create_base_extension(extension_api):
extension = create(extension_api)
assert isinstance(extension, Extension)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment