move plugin out of __init__.py
move plugin out of __init__.py

file:a/README.txt -> file:b/README.txt
--- a/README.txt
+++ b/README.txt
@@ -2,7 +2,7 @@
 
 It comprises:
 
-   * A CKAN Extension "plugin" at ``ckanext/exampletheme/__init__.py``
+   * A CKAN Extension "plugin" at ``ckanext/exampletheme/plugin.py``
      which, when loaded, overrides various settings in the core
      ``ini``-file to provide:
 
@@ -21,7 +21,7 @@
 
 To install this package, from your CKAN virtualenv, run the following from your CKAN base folder (e.g. ``pyenv/``)::
 
- pip install -e hg+https://bitbucket.org/okfn/ckanext-exampletheme#egg=ckanext-exampletheme
+  pip install -e hg+https://bitbucket.org/okfn/ckanext-exampletheme#egg=ckanext-exampletheme
 
 Then activate it by setting ``ckan.plugins = exampletheme`` in your main ``ini``-file.
 
@@ -29,7 +29,7 @@
 Orientation
 ===========
 
-* Examine the source code, starting with ``ckanext/exampletheme/__init__.py``
+* Examine the source code, starting with ``ckanext/exampletheme/plugin.py``
 
 * To understand the nuts and bolts of this file, which is a CKAN
   *Extension*, read in conjunction with the "Extension

--- a/ckanext/exampletheme/__init__.py
+++ b/ckanext/exampletheme/__init__.py
@@ -1,86 +1,2 @@
-import os
-from logging import getLogger
+# package
 
-from genshi.filters.transform import Transformer
-
-from ckan.plugins import implements, SingletonPlugin
-from ckan.plugins import IConfigurer
-from ckan.plugins import IGenshiStreamFilter
-from ckan.plugins import IRoutes
-
-log = getLogger(__name__)
-
-
-class ExampleThemePlugin(SingletonPlugin):
-    """This plugin demonstrates how a theme packaged as a CKAN
-    extension might extend CKAN behaviour.
-
-    In this case, we implement three extension interfaces:
-
-      - ``IConfigurer`` allows us to override configuration normally
-        found in the ``ini``-file.  Here we use it to specify the site
-        title, and to tell CKAN to look in this package for templates
-        and resources that customise the core look and feel.
-      - ``IGenshiStreamFilter`` allows us to filter and transform the
-        HTML stream just before it is rendered.  In this case we use
-        it to rename "frob" to "foobar"
-      - ``IRoutes`` allows us to add new URLs, or override existing
-        URLs.  In this example we use it to override the default
-        ``/register`` behaviour with a custom controller
-    """
-    implements(IConfigurer, inherit=True)
-    implements(IGenshiStreamFilter, inherit=True)
-    implements(IRoutes, inherit=True)
-
-    def update_config(self, config):
-        """This IConfigurer implementation causes CKAN to look in the
-        ```public``` and ```templates``` directories present in this
-        package for any customisations.
-
-        It also shows how to set the site title here (rather than in
-        the main site .ini file), and causes CKAN to use the
-        customised package form defined in ``package_form.py`` in this
-        directory.
-        """
-        here = os.path.dirname(__file__)
-        rootdir = os.path.dirname(os.path.dirname(here))
-        our_public_dir = os.path.join(rootdir, 'ckanext',
-                                      'exampletheme', 'theme', 'public')
-        template_dir = os.path.join(rootdir, 'ckanext',
-                                    'exampletheme', 'theme',
-        'templates')
-        # set our local template and resource overrides
-        config['extra_public_paths'] = ','.join([our_public_dir,
-                config.get('extra_public_paths', '')])
-        config['extra_template_paths'] = ','.join([template_dir,
-                config.get('extra_template_paths', '')])
-        # set the title
-        config['ckan.site_title'] = "An example CKAN theme"
-        # set the customised package form (see ``setup.py`` for entry point)
-        config['package_form'] = "example_form"
-
-    def filter(self, stream):
-        """Conform to IGenshiStreamFilter interface.
-
-        This example filter renames 'frob' to 'foobar' (this string is
-        found in the custom ``home/index.html`` template provided as
-        part of the package).
-        """
-        stream = stream | Transformer('//p[@id="examplething"]/text()')\
-                 .substitute(r'frob', r'foobar')
-        return stream
-
-    def before_map(self, map):
-        """This IRoutes implementation overrides the standard
-        ``/user/register`` behaviour with a custom controller.  You
-        might instead use it to provide a completely new page, for
-        example.
-
-        Note that we have also provided a custom register form
-        template at ``theme/templates/user/register.html``.
-        """
-        map.connect('/user/register',
-                    controller='ckanext.exampletheme.controller:CustomUserController',
-                    action='custom_register')
-        return map
-

--- /dev/null
+++ b/ckanext/exampletheme/plugin.py
@@ -1,1 +1,86 @@
+import os
+from logging import getLogger
 
+from genshi.filters.transform import Transformer
+
+from ckan.plugins import implements, SingletonPlugin
+from ckan.plugins import IConfigurer
+from ckan.plugins import IGenshiStreamFilter
+from ckan.plugins import IRoutes
+
+log = getLogger(__name__)
+
+
+class ExampleThemePlugin(SingletonPlugin):
+    """This plugin demonstrates how a theme packaged as a CKAN
+    extension might extend CKAN behaviour.
+
+    In this case, we implement three extension interfaces:
+
+      - ``IConfigurer`` allows us to override configuration normally
+        found in the ``ini``-file.  Here we use it to specify the site
+        title, and to tell CKAN to look in this package for templates
+        and resources that customise the core look and feel.
+      - ``IGenshiStreamFilter`` allows us to filter and transform the
+        HTML stream just before it is rendered.  In this case we use
+        it to rename "frob" to "foobar"
+      - ``IRoutes`` allows us to add new URLs, or override existing
+        URLs.  In this example we use it to override the default
+        ``/register`` behaviour with a custom controller
+    """
+    implements(IConfigurer, inherit=True)
+    implements(IGenshiStreamFilter, inherit=True)
+    implements(IRoutes, inherit=True)
+
+    def update_config(self, config):
+        """This IConfigurer implementation causes CKAN to look in the
+        ```public``` and ```templates``` directories present in this
+        package for any customisations.
+
+        It also shows how to set the site title here (rather than in
+        the main site .ini file), and causes CKAN to use the
+        customised package form defined in ``package_form.py`` in this
+        directory.
+        """
+        here = os.path.dirname(__file__)
+        rootdir = os.path.dirname(os.path.dirname(here))
+        our_public_dir = os.path.join(rootdir, 'ckanext',
+                                      'exampletheme', 'theme', 'public')
+        template_dir = os.path.join(rootdir, 'ckanext',
+                                    'exampletheme', 'theme',
+        'templates')
+        # set our local template and resource overrides
+        config['extra_public_paths'] = ','.join([our_public_dir,
+                config.get('extra_public_paths', '')])
+        config['extra_template_paths'] = ','.join([template_dir,
+                config.get('extra_template_paths', '')])
+        # set the title
+        config['ckan.site_title'] = "An example CKAN theme"
+        # set the customised package form (see ``setup.py`` for entry point)
+        config['package_form'] = "example_form"
+
+    def filter(self, stream):
+        """Conform to IGenshiStreamFilter interface.
+
+        This example filter renames 'frob' to 'foobar' (this string is
+        found in the custom ``home/index.html`` template provided as
+        part of the package).
+        """
+        stream = stream | Transformer('//p[@id="examplething"]/text()')\
+                 .substitute(r'frob', r'foobar')
+        return stream
+
+    def before_map(self, map):
+        """This IRoutes implementation overrides the standard
+        ``/user/register`` behaviour with a custom controller.  You
+        might instead use it to provide a completely new page, for
+        example.
+
+        Note that we have also provided a custom register form
+        template at ``theme/templates/user/register.html``.
+        """
+        map.connect('/user/register',
+                    controller='ckanext.exampletheme.controller:CustomUserController',
+                    action='custom_register')
+        return map
+

file:a/setup.py -> file:b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -25,7 +25,7 @@
 	entry_points=\
 	"""
         [ckan.plugins]
-	exampletheme=ckanext.exampletheme:ExampleThemePlugin
+	exampletheme=ckanext.exampletheme.plugin:ExampleThemePlugin
 
         [ckan.forms]
         example_form = ckanext.exampletheme.package_form:get_example_fieldset