Пример #1
0
def test_set_global_vars(tmpdir):
    template = """
[main]
version=5.1
"""
    target_dir = tmpdir.strpath + "/collective.foo"
    os.mkdir(target_dir)
    with open(os.path.join(target_dir + "/bobtemplate.cfg"), "w") as f:
        f.write(template)
    configurator = Configurator(
        template="bobtemplates.plone:addon",
        target_directory=target_dir,
        variables={
            "year": 1970,
            "plone.version": "5.1-latest"
        },
    )
    base.set_global_vars(configurator)

    configurator = Configurator(
        template="bobtemplates.plone:addon",
        target_directory=target_dir,
        variables={"year": 1970},
    )
    base.set_global_vars(configurator)
Пример #2
0
def test_set_global_vars(tmpdir):
    template = """
[main]
version=5.1
"""
    target_dir = tmpdir.strpath + '/collective.foo'
    os.mkdir(target_dir)
    with open(os.path.join(target_dir + '/bobtemplate.cfg'), 'w') as f:
        f.write(template)
    configurator = Configurator(
        template='bobtemplates.plone:addon',
        target_directory=target_dir,
        variables={
            'year': 1970,
            'plone.version': '5.1-latest',
        },
    )
    base.set_global_vars(configurator)

    configurator = Configurator(
        template='bobtemplates.plone:addon',
        target_directory=target_dir,
        variables={
            'year': 1970,
        },
    )
    base.set_global_vars(configurator)
Пример #3
0
def test_delete_unwanted_files_python(tmpdir):
    package_root = tmpdir.strpath + "/collective.todo"
    package_path = init_package_base_structure(package_root)
    views_path = os.path.join(package_path + "/views/")

    configurator = Configurator(
        template="bobtemplates.plone:view",
        target_directory=package_path,
        bobconfig={"non_interactive": True},
        variables={
            "view_name": "my-new-view",
            "view_python_class": True,
            "view_python_class_name": "NewView",
            "view_template": False,
            "view_template_name": "new_view",
            "plone.version": "5.1",
        },
    )
    assert configurator
    os.chdir(package_path)
    base.set_global_vars(configurator)
    configurator.render()  # pre/render/post
    # as the post_rederer also calls delete_unwanted_files. we don't need to call here
    python_file_name = configurator.variables.get(
        'view_python_file_name') + '.py'
    template_file_name = configurator.variables.get(
        'view_template_name') + '.pt'
    python_file_path = os.path.join(views_path + python_file_name)
    template_file_path = os.path.join(views_path + template_file_name)
    assert not os.path.isfile(template_file_path)
    assert os.path.isfile(python_file_path)
def test_post_renderer(tmpdir):
    package_root = tmpdir.strpath + "/collective.todo"
    package_path = init_package_base_structure(package_root)

    configurator = Configurator(
        template="bobtemplates.plone:theme_barceloneta",
        target_directory=package_path,
        bobconfig={"non_interactive": True},
        variables={
            "plone.version": "5.1",
            "theme.name": "My Theme"
        },
    )

    assert configurator
    os.chdir(package_path)
    base.set_global_vars(configurator)
    configurator.render()  # pre/render/post
Пример #5
0
def test_cleanup_package(tmpdir):
    target_path = tmpdir.strpath + '/collective.foo.bar'
    package_path = target_path + '/src/collective/foo/bar'
    profiles_path = package_path + '/profiles/default'
    os.makedirs(target_path)
    os.makedirs(package_path)
    os.makedirs(profiles_path)
    template = """<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <version>1000</version>
  <dependencies>

  </dependencies>
</metadata>
"""
    with open(os.path.join(profiles_path + '/metadata.xml'), 'w') as f:
        f.write(template)

    configurator = Configurator(
        template='bobtemplates.plone:addon',
        target_directory=target_path,
        bobconfig={
            'non_interactive': True,
        },
        variables={
            'package.nested': True,
            'package.namespace': 'collective',
            'package.namespace2': 'foo',
            'package.name': 'bar',
            'year': 1970,
            'package.git.init': True,
            'package.description': 'Test',
            'author.name': 'The Plone Collective',
            'author.email': '*****@*****.**',
            'author.github.user': '******',
            'plone.version': '5.1',
            'python.version': 'python2.7',
            'plone.is_plone5': True,
            'vscode_support': True,
        },
    )
    assert configurator
    base.set_global_vars(configurator)
    configurator.render()
Пример #6
0
def test_post_renderer(tmpdir):
    """Test post rendering."""
    package_root = tmpdir.strpath + "/collective.todo"
    package_path = init_package_base_structure(package_root)

    configurator = Configurator(
        template="bobtemplates.plone:view",
        target_directory=package_path,
        bobconfig={"non_interactive": True},
        variables={
            "view_name": "my-new-view",
            "view_python_class": True,
            "view_python_class_name": "NewView",
            "view_base_class": "BrowserView",
            "view_template": True,
            "view_template_name": "new_view",
            "plone.version": "5.1",
        },
    )

    assert configurator
    os.chdir(package_path)
    base.set_global_vars(configurator)
    configurator.render()  # pre/render/post
Пример #7
0
def test_post_renderer(tmpdir):
    base_path = tmpdir.strpath
    package_root_folder = os.path.join(
        base_path,
        'collective.foo',
    )
    package_path = init_package_base_structure(package_root_folder)
    configurator = Configurator(
        template='bobtemplates.plone:indexer',
        bobconfig={"non_interactive": True},
        target_directory=package_path,
        variables={
            'package.root_folder': package_root_folder,
            "indexer_name": "my_cool_index",
            "package_folder": package_path,
        },
    )
    # os.makedirs(target_path)

    template = """
    <configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
    xmlns:i18n="http://namespaces.zope.org/i18n"
    xmlns:plone="http://namespaces.plone.org/plone">

    <!-- -*- extra stuff goes here -*- -->

    </configure>
"""
    with open(os.path.join(package_path + '/configure.zcml'), 'w') as f:
        f.write(template)

    os.chdir(package_path)
    base.set_global_vars(configurator)
    configurator.render()
def test_post_renderer(tmpdir):
    base_path = tmpdir.strpath
    target_path = os.path.join(
        base_path,
        'collective.theme',
    )
    package_path = os.path.join(
        target_path,
        u'src/collective/theme',
    )
    profiles_path = os.path.join(
        package_path,
        u'profiles/default',
    )
    theme_path = os.path.join(
        package_path,
        u'theme',
    )
    os.makedirs(package_path)
    os.makedirs(profiles_path)
    os.makedirs(theme_path)

    template = """<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <version>1000</version>
  <dependencies>

  </dependencies>
</metadata>
"""
    with open(os.path.join(profiles_path + '/metadata.xml'), 'w') as f:
        f.write(template)

    template = """
[main]
version=5.1
"""
    with open(os.path.join(target_path + '/bobtemplate.cfg'), 'w') as f:
        f.write(template)

    template = """
    dummy
    '-*- Extra requirements: -*-'
"""
    with open(os.path.join(target_path + '/setup.py'), 'w') as f:
        f.write(template)

    template = """
    <configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
    xmlns:i18n="http://namespaces.zope.org/i18n"
    xmlns:plone="http://namespaces.plone.org/plone">

    <!-- -*- extra stuff goes here -*- -->

    </configure>
"""
    with open(os.path.join(package_path + '/configure.zcml'), 'w') as f:
        f.write(template)
    configurator = Configurator(
        template='bobtemplates.plone:theme_barceloneta',
        target_directory=package_path,
        bobconfig={
            'non_interactive': True,
        },
        variables={
            'plone.version': '5.1',
            'theme.name': 'My Theme',
        },
    )

    assert configurator
    os.chdir(package_path)
    base.set_global_vars(configurator)
    theme_barceloneta.prepare_renderer(configurator)
    configurator.render()
    theme_barceloneta.post_renderer(configurator)
Пример #9
0
def test_post_renderer(tmpdir):
    """Test post rendering."""
    target_path = tmpdir.strpath + '/collective.todo'
    package_path = target_path + '/src/collective/todo'
    portlets_path = package_path + '/portlets'
    profile_path = package_path + '/profiles/default/'
    os.makedirs(target_path)
    os.makedirs(package_path)
    os.makedirs(portlets_path)
    os.makedirs(profile_path)

    template = """# -*- coding: utf-8 -*-
from Acquisition import aq_inner
from collective.todo import _
from plone import schema
from plone.app.portlets.portlets import base
from plone.memoize.instance import memoize
from plone.portlets.interfaces import IPortletDataProvider
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from z3c.form import field
from zope.component import getMultiAdapter
from zope.interface import implements

import json
import urllib
import urllib2


class IMyWeatherPortlet(IPortletDataProvider):
    place_str = schema.TextLine(
        title=_(u'Name of your place with country code'),
        description=_(u'City name along with country code i.e Delhi,IN'),  # NOQA: E501
        required=True,
        default=u'delhi,in'
    )


class Assignment(base.Assignment):
    implements(IMyWeatherPortlet)
    schema = IMyWeatherPortlet

    def __init__(self, place_str='delhi,in'):
        self.place_str = place_str.lower()

    @property
    def title(self):
        return _(u'Weather of the place')


class AddForm(base.AddForm):
    schema = IMyWeatherPortlet
    form_fields = field.Fields(IMyWeatherPortlet)
    label = _(u'Add Place weather')
    description = _(u'This portlet displays weather of the place.')

    def create(self, data):
        return Assignment(
            place_str=data.get('place_str', 'delhi,in'),
        )


class EditForm(base.EditForm):
    schema = IMyWeatherPortlet
    form_fields = field.Fields(IMyWeatherPortlet)
    label = _(u'Edit Place weather')
    description = _(u'This portlet displays weather of the place.')


class Renderer(base.Renderer):
    schema = IMyWeatherPortlet
    _template = ViewPageTemplateFile('my_weather.pt')

    def __init__(self, *args):
        base.Renderer.__init__(self, *args)
        context = aq_inner(self.context)
        portal_state = getMultiAdapter(
            (context, self.request),
            name=u'plone_portal_state'
        )
        self.anonymous = portal_state.anonymous()

    def render(self):
        return self._template()

    @property
    def available(self):
        \"""Show the portlet only if there are one or more elements.\"""
        return not self.anonymous and self._data()

    def weather_report(self):
        self.result = self._data()
        return self.result['description']

    def get_humidity(self):
        return self.result['humidity']

    def get_pressure(self):
        return self.result['pressure']
"""
    with open(os.path.join(portlets_path + '/my_weather.py'), 'w') as f:
        f.write(template)

    template = """<div class="weather">
    <h3>Weather Report</h3>
    ${view/weather_report}
    <br>
    Pressure: ${view/get_pressure}
    <br>
    Humidity: ${view/get_humidity}
    <br>
</div>
"""
    with open(os.path.join(portlets_path + '/my_weather.pt'), 'w') as f:
        f.write(template)
    template = """<configure
  xmlns="http://namespaces.zope.org/zope"
  xmlns:browser="http://namespaces.zope.org/browser"
  xmlns:plone="http://namespaces.plone.org/plone">

  <include package="plone.app.portlets" />

  '-*- extra stuff goes here -*-'

  <plone:portlet
    name="collective.todo.portlets.MyWeather"
    interface=".my_weather.IMyWeatherPortlet"
    assignment=".my_weather.Assignment"
    renderer=".my_weather.Renderer"
    addview=".my_weather.AddForm"
    editview=".my_weather.EditForm" />

</configure>"""
    with open(os.path.join(portlets_path + '/configure.zcml'), 'w') as f:
        f.write(template)

    template = """<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
    xmlns:i18n="http://namespaces.zope.org/i18n"
    xmlns:plone="http://namespaces.plone.org/plone"
    i18n_domain="collective.todo">


  <i18n:registerTranslations directory="locales" />

  <!--
    Be careful if you use general includeDependencies, it can have sideffects!
    Better import explicite packages or configurations ;)
  -->
  <!--<includeDependencies package="." />-->

  <include package=".portlets" />

</configure>
"""
    with open(os.path.join(package_path + '/configure.zcml'), 'w') as f:
        f.write(template)

    template = """
        dummy
        '-*- Extra requirements: -*-'
"""
    with open(os.path.join(target_path + '/setup.py'), 'w') as f:
        f.write(template)

    template = """<?xml version="1.0"?>
<portlets
    xmlns:i18n="http://xml.zope.org/namespaces/i18n"
    i18n:domain="plone">
  <!-- Extra portlets here  -->

  <portlet
    addview="collective.todo.portlets.MyWeather"
    title="My Weather"
    description="A portlet which can render weather of the given place."
    i18n:attributes="title title_my_weather;
                     description description_my_weather">

    <!-- This will enable the portlet for right column,
    left column and the footer too.
    -->
    <for interface="plone.app.portlets.interfaces.IColumn" />

    <!--
    This will enable the portlet in the dashboard.
    -->
    <!--<for interface="plone.app.portlets.interfaces.IDashboard" />-->

  </portlet>


</portlets>
"""
    with open(os.path.join(profile_path + '/portlets.xml.example'), 'w') as f:
        f.write(template)

    configurator = Configurator(
        template='bobtemplates.plone:addon',
        target_directory=package_path,
        bobconfig={
            'non_interactive': True,
        },
        variables={
            'portlet_name': 'My Weather',
            'plone.version': '5.1',
        },
    )
    os.chdir(package_path)
    base.set_global_vars(configurator)
    portlet.prepare_renderer(configurator)
    portlet.post_renderer(configurator)
def test_post_renderer(tmpdir):
    """Test post rendering."""
    target_path = tmpdir.strpath + '/collective.todo'
    package_path = target_path + '/src/collective/todo'
    profiles_path = package_path + '/profiles/default'
    os.makedirs(target_path)
    os.makedirs(package_path)
    os.makedirs(profiles_path + '/types')

    template = """<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <version>1000</version>
  <dependencies>

  </dependencies>
</metadata>
"""
    with open(os.path.join(profiles_path + '/metadata.xml'), 'w') as f:
        f.write(template)

    template = """<?xml version="1.0"?>
<rolemap>
  <permissions>
  <!-- -*- extra stuff goes here -*- -->

  </permissions>
</rolemap>
"""
    with open(os.path.join(profiles_path + '/rolemap.xml'), 'w') as f:
        f.write(template)

    template = """<?xml version="1.0"?>
<object name="portal_types" meta_type="Plone Types Tool">
 <property name="title">Controls the available contenttypes in your portal
 </property>
 <!--<object name="example_ct" meta_type="Dexterity FTI"/>-->
</object>
"""
    with open(os.path.join(profiles_path + '/types.xml'), 'w') as f:
        f.write(template)

    template = """<configure
  xmlns="http://namespaces.zope.org/zope"
  xmlns:zcml="http://namespaces.zope.org/zcml"
  i18n_domain="plone">

  <configure zcml:condition="installed AccessControl.security">
  <!-- -*- extra stuff goes here -*- -->


  </configure>

</configure>
"""
    with open(os.path.join(package_path + '/permissions.zcml'), 'w') as f:
        f.write(template)

    template = """
[main]
version=5.1
"""
    with open(os.path.join(target_path + '/bobtemplate.cfg'), 'w') as f:
        f.write(template)

    template = """
    dummy
    '-*- Extra requirements: -*-'
"""
    with open(os.path.join(target_path + '/setup.py'), 'w') as f:
        f.write(template)

    configurator = Configurator(
        template='bobtemplates.plone:addon',
        target_directory=package_path,
        bobconfig={
            'non_interactive': True,
        },
        variables={
            'dexterity_type_name': 'Task',
            'plone.version': '5.1',
        },
    )

    os.chdir(package_path)
    base.set_global_vars(configurator)
    content_type.prepare_renderer(configurator)
    content_type.post_renderer(configurator)
Пример #11
0
def test_post_renderer(tmpdir):
    """Test post rendering."""
    target_path = tmpdir.strpath + '/collective.todo'
    package_path = target_path + '/src/collective/todo'
    views_path = package_path + '/views'
    os.makedirs(target_path)
    os.makedirs(package_path)
    os.makedirs(views_path)

    template = """# -*- coding: utf-8 -*-

from collective.todo import _
from Products.Five.browser import BrowserView


class MyView(BrowserView):

    def __call__(self):
        return _(u'This view works!')

"""
    with open(os.path.join(views_path + '/view.py'), 'w') as f:
        f.write(template)
    template = """<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
      i18n:domain="collective.todo"
      metal:use-macro="context/main_template/macros/master">
<body>
    <metal:block fill-slot="content-core">
        <li class="heading" i18n:translate="">
          Sample View
        </li>
    </metal:block>

<body>
</html>
"""
    with open(os.path.join(views_path + '/view.pt'), 'w') as f:
        f.write(template)
    template = """<configure
        xmlns="http://namespaces.zope.org/zope"
        xmlns:browser="http://namespaces.zope.org/browser"
        xmlns:plone="http://namespaces.plone.org/plone"
        i18n_domain="collective.todo">

      -*- extra stuff goes here -*-
      <browser:page
         name="view"
         for="*"
         class=".view.MyView"
         template="view.pt"
         permission="zope2.View"
         />


    </configure>
    """
    with open(os.path.join(views_path + '/configure.zcml'), 'w') as f:
        f.write(template)

    template = """<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
    xmlns:i18n="http://namespaces.zope.org/i18n"
    xmlns:plone="http://namespaces.plone.org/plone"
    i18n_domain="collective.todo">

  <i18n:registerTranslations directory="locales" />

  <!--
    Be careful if you use general includeDependencies, it can have sideffects!
    Better import explicite packages or configurations ;)
  -->
  <!--<includeDependencies package="." />-->

  <include package=".views" />

</configure>
"""
    with open(os.path.join(package_path + '/configure.zcml'), 'w') as f:
        f.write(template)

    configurator = Configurator(
        template='bobtemplates.plone:addon',
        target_directory=package_path,
        bobconfig={
            'non_interactive': True,
        },
        variables={
            'view_name': 'view',
            'view_python_class': True,
            'view_python_class_name': 'MyView',
            'view_template': True,
            'view_template_name': 'view',
            'plone.version': '5.1',
        },
    )

    template = """
        dummy
        '-*- Extra requirements: -*-'
"""
    with open(os.path.join(target_path + '/setup.py'), 'w') as f:
        f.write(template)

    os.chdir(package_path)
    base.set_global_vars(configurator)
    view.prepare_renderer(configurator)
    view.post_renderer(configurator)
Пример #12
0
def test_post_renderer_without_template(tmpdir):
    """Test post rendering."""
    target_path = tmpdir.strpath + '/collective.todo'
    package_path = target_path + '/src/collective/todo'
    viewlets_path = package_path + '/viewlets'
    os.makedirs(target_path)
    os.makedirs(package_path)
    os.makedirs(viewlets_path)

    template = """# -*- coding: utf-8 -*-

from plone.app.layout.viewlets import ViewletBase


class MyViewlet(ViewletBase):

    def render(self):
        return u'Sample viewlet!'

"""
    with open(os.path.join(viewlets_path + '/viewlet.py'), 'w') as f:
        f.write(template)
    template = """<div class="days_to_conf">
    ${view/get_message}
</div>
"""
    with open(os.path.join(viewlets_path + '/viewlet.pt'), 'w') as f:
        f.write(template)
    template = """<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:browser="http://namespaces.zope.org/browser"
    xmlns:plone="http://namespaces.plone.org/plone"
    i18n_domain="collective.todo">

    -*- extra stuff goes here -*-
    <browser:viewlet
       name="viewlet"
       for="*"
       manager="plone.app.layout.viewlets.interfaces.IBelowContentTitle"
       layer="collective.todo.interfaces.ICollectiveTodoLayer"
       class=".viewlet.MyViewlet"
       template="viewlet.pt"
       permission="zope2.View"
       />


    </configure>
    """
    with open(os.path.join(viewlets_path + '/configure.zcml'), 'w') as f:
        f.write(template)

    template = """<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
    xmlns:i18n="http://namespaces.zope.org/i18n"
    xmlns:plone="http://namespaces.plone.org/plone"
    i18n_domain="collective.todo">

  <i18n:registerTranslations directory="locales" />

  <!--
    Be careful if you use general includeDependencies, it can have sideffects!
    Better import explicite packages or configurations ;)
  -->
  <!--<includeDependencies package="." />-->

  <include package=".viewlets" />

</configure>
"""
    with open(os.path.join(package_path + '/configure.zcml'), 'w') as f:
        f.write(template)

    configurator = Configurator(
        template='bobtemplates.plone:addon',
        target_directory=package_path,
        bobconfig={
            'non_interactive': True,
        },
        variables={
            'viewlet_name': 'viewlet',
            'viewlet_python_class_name': 'MyViewlet',
            'viewlet_template': False,
            'plone.version': '5.1',
        },
    )

    template = """
        dummy
        '-*- Extra requirements: -*-'
"""
    with open(os.path.join(target_path + '/setup.py'), 'w') as f:
        f.write(template)

    os.chdir(package_path)
    base.set_global_vars(configurator)
    viewlet.prepare_renderer(configurator)
    viewlet.post_renderer(configurator)
Пример #13
0
def test_post_renderer(tmpdir):
    target_path = tmpdir.strpath + '/collective.todo'
    package_path = target_path + '/src/collective/todo'
    profiles_path = package_path + '/profiles/default'
    os.makedirs(target_path)
    os.makedirs(package_path)
    os.makedirs(profiles_path)

    template = """<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <version>1000</version>
  <dependencies>

  </dependencies>
</metadata>
"""
    with open(os.path.join(profiles_path + '/metadata.xml'), 'w') as f:
        f.write(template)

    template = """
[main]
version=5.1
"""
    with open(os.path.join(target_path + '/bobtemplate.cfg'), 'w') as f:
        f.write(template)

    template = """
    dummy
    '-*- Extra requirements: -*-'
"""
    with open(os.path.join(target_path + '/setup.py'), 'w') as f:
        f.write(template)

    template = """
    <configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
    xmlns:i18n="http://namespaces.zope.org/i18n"
    xmlns:plone="http://namespaces.plone.org/plone">

    <!-- -*- extra stuff goes here -*- -->

    </configure>
"""
    with open(os.path.join(package_path + '/configure.zcml'), 'w') as f:
        f.write(template)

    configurator = Configurator(
        template='bobtemplates.plone:restapi_service',
        target_directory=package_path,
        bobconfig={
            'non_interactive': True,
        },
        variables={
            'package_folder': package_path,
            'plone.version': '5.1',
            'service_class_name': 'SomeRelatedThings',
            'service_name': 'some-related-things',
        },
    )
    assert configurator
    os.chdir(package_path)
    base.set_global_vars(configurator)
    restapi_service.pre_renderer(configurator)
    configurator.render()
    restapi_service.post_renderer(configurator)
Пример #14
0
def test_post_renderer(tmpdir):
    target_path = tmpdir.strpath + '/collective.todo'
    package_path = target_path + '/src/collective/todo'
    profiles_path = package_path + '/profiles/default'
    os.makedirs(target_path)
    os.makedirs(package_path)
    os.makedirs(profiles_path)

    template = """<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <version>1000</version>
  <dependencies>

  </dependencies>
</metadata>
"""
    with open(os.path.join(profiles_path + '/metadata.xml'), 'w') as f:
        f.write(template)

    template = """
[main]
version=5.1
"""
    with open(os.path.join(target_path + '/bobtemplate.cfg'), 'w') as f:
        f.write(template)

    template = """
    dummy
    '-*- Extra requirements: -*-'
"""
    with open(os.path.join(target_path + '/setup.py'), 'w') as f:
        f.write(template)

    template = """
    <configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
    xmlns:i18n="http://namespaces.zope.org/i18n"
    xmlns:plone="http://namespaces.plone.org/plone">

    <!-- -*- extra stuff goes here -*- -->

    </configure>
"""
    with open(os.path.join(package_path + '/configure.zcml'), 'w') as f:
        f.write(template)
    configurator = Configurator(
        template='bobtemplates.plone:upgrade_step',
        target_directory=package_path,
        bobconfig={
            'non_interactive': True,
        },
        variables={
            'plone.version':
            '5.1',
            'upgrade_step_title':
            'Add cool index and reindex it',
            'upgrade_step_description':
            'We add an index and reindex it with existing content.',
        },
    )

    assert configurator
    os.chdir(package_path)
    base.set_global_vars(configurator)
    configurator.render()