Components and environment

Для обеспечения модульности в NGW используются разделение на компоненты. Один python-пакет может содержать один или несколько компонентов. Каждый компонент является наследником класса Component, а для загрузки соответствующих модулей используются точки входа (entry points) setuptools.

def pkginfo():
    return dict(components=dict(
        somecomp='somepackage.somecomp'))

setup(
    name = 'somepackage',
    entry_points = {'nextgisweb.packages':
        'somepackage = somepackage:somemod:pkginfo'}
)

У каждого компонента есть идентификатор (somecomp в примере выше). Так же этот идентификатор указываетс в атрибуте класса identity. Этот идентификатор должен быть уникален в рамках всех пакетов NGW.

Для объединения компонентов в единое целое используется объект-окружение, экземпляр класса Env, который создается на этапе инициализации. Инициализация происходит следующим образом:

  1. Создаются экземпляры компонентов

  2. Для каждого компонента вызывается initialize()

  3. Для каждого компонента вызывается configure()

Component dependency

Вызовы методов initialize() и configure() осуществляются с учетом зависимостей, которые могут быть указаны при помощи декоратора require().

Таким образом, если необходимо вызывать initialize() компонента B после A, то выглядеть это будет следующим образом:

from nextgisweb.component import Component, require

class A(Component):
    identity = 'A'

    def initialize(self):
        pass

class B(Component):
    identity = 'B'

    @require('A')
    def initialize(self):
        pass

Global environment object

Component class

Env class