Обеспечение обратной совместимости для компонента zope
Я работаю над новым выпуском colle.imagetags, в котором весь функционал, который был перенесен из браузера (imagetags-manage
) теперь перемещен на новый адаптер (еще не зафиксированный), который обеспечивает почти тот же интерфейс, что и вид браузера:
class IManageTags(Interface):
"""
imagetags-manage view interface
Tag management browser view
"""
def get_tag(id, create_on_fail=True):
""" Gets / creates a specific tag """
def get_tags():
""" Gets all the tags for the object """
def get_sorted_tags():
""" Sorted list of tags
"""
def save_tag(data):
""" Saves a tag with the passed data """
Я действительно не знаю, использует ли кто-нибудь этот продукт в проекте, однако, я думаю, что было бы разумно предложить какой-то механизм обратной совместимости, если кто-то использует методы просмотра браузера за пределами функциональность коробки.
Что я должен делать? Сохранить интерфейс для просмотра в браузере с методами-заглушками, которые ретранслируют на новом адаптере? Любое предложение?
1 ответ
Такое изменение довольно сложно! Дело не в API, а в дизайне.
- Представления браузера являются компонентом, в котором вы смешиваете использование / запрос с контекстом.
- Адаптеры являются компонентом, где вы не заботитесь о пользователе или его запросе.
- Утилиты являются компонентом, где вы не заботитесь о контексте.
Таким образом, вы должны сохранить свой браузер и заставить его использовать адаптер, этого должно быть достаточно, чтобы сохранить совместимость.
Обновления используются при внесении изменений в профиль по умолчанию. Сначала версия metadata.xml должна быть целым числом (1000 часто используется в качестве первой стабильной версии). Далее, каждое изменение профиля должно следовать за увеличением номера этой версии, и вы должны добавить шаг обновления:
<gs:upgradeStep
title="Upgrade collective.myaddon from 1000 to 1010"
description=""
source="1000"
destination="1010"
handler=".upgrades.upgrade_1000_1010"
profile="collective.myaddon:default"/>
upgrades.py
def upgrade_1000_1010(context):
"""documentation
"""
context.runImportStepFromProfile(default_profile, 'viewlets')
portal_javascripts = getToolByName(context, 'portal_javascripts')
portal_javascripts.cookResources()