[Checkins] SVN: bluebream/trunk/ Merge from the ccomb-merge-templates branch:

Christophe Combelles ccomb at free.fr
Thu Apr 1 20:28:16 EDT 2010


Log message for revision 110446:
  Merge from the ccomb-merge-templates branch:
  Cleaned the code again, allow to choose a package name different from the
  project name, and added a test for an edge case.
  
  

Changed:
  U   bluebream/trunk/CHANGES.txt
  U   bluebream/trunk/src/bluebream/bluebream_base/project_template/etc/site.zcml_tmpl
  U   bluebream/trunk/src/bluebream/bluebream_base/project_template/setup.py_tmpl
  D   bluebream/trunk/src/bluebream/bluebream_base/project_template/src/+main_package+/
  A   bluebream/trunk/src/bluebream/bluebream_base/project_template/src/+ns_prefix++package+.egg-info/
  A   bluebream/trunk/src/bluebream/bluebream_base/project_template/src/+package+/
  D   bluebream/trunk/src/bluebream/bluebream_base/project_template/src/+package+.egg-info/
  U   bluebream/trunk/src/bluebream/bluebream_base/template.py
  U   bluebream/trunk/src/bluebream/bluebream_base/tests/bluebream.txt

-=-
Modified: bluebream/trunk/CHANGES.txt
===================================================================
--- bluebream/trunk/CHANGES.txt	2010-04-02 00:23:19 UTC (rev 110445)
+++ bluebream/trunk/CHANGES.txt	2010-04-02 00:28:16 UTC (rev 110446)
@@ -9,7 +9,7 @@
 - Use project name as i18n_domain in base template
 
 - Merge the two templates into a single one by allowing to create a
-  flat or nested namespace structure, depending on the project name.
+  flat or nested namespace structure, and choose the package name.
 
 - Enabled Distribute by default instead of Setuptools
 

Modified: bluebream/trunk/src/bluebream/bluebream_base/project_template/etc/site.zcml_tmpl
===================================================================
--- bluebream/trunk/src/bluebream/bluebream_base/project_template/etc/site.zcml_tmpl	2010-04-02 00:23:19 UTC (rev 110445)
+++ bluebream/trunk/src/bluebream/bluebream_base/project_template/etc/site.zcml_tmpl	2010-04-02 00:28:16 UTC (rev 110446)
@@ -44,6 +44,6 @@
   <include package="zope.traversing.browser" />
   <include package="zope.app.pagetemplate" />
 
-  <include package="${ns_prefix}${main_package}" />
+  <include package="${ns_prefix}${package}" />
 
 </configure>

Modified: bluebream/trunk/src/bluebream/bluebream_base/project_template/setup.py_tmpl
===================================================================
--- bluebream/trunk/src/bluebream/bluebream_base/project_template/setup.py_tmpl	2010-04-02 00:23:19 UTC (rev 110445)
+++ bluebream/trunk/src/bluebream/bluebream_base/project_template/setup.py_tmpl	2010-04-02 00:28:16 UTC (rev 110446)
@@ -57,9 +57,9 @@
                         ],
       entry_points = """
       [paste.app_factory]
-      main = ${ns_prefix}${main_package}.startup:application_factory
+      main = ${ns_prefix}${package}.startup:application_factory
 
       [paste.global_paster_command]
-      shell = ${ns_prefix}${main_package}.debug:Shell
+      shell = ${ns_prefix}${package}.debug:Shell
       """,
       )

Modified: bluebream/trunk/src/bluebream/bluebream_base/template.py
===================================================================
--- bluebream/trunk/src/bluebream/bluebream_base/template.py	2010-04-02 00:23:19 UTC (rev 110445)
+++ bluebream/trunk/src/bluebream/bluebream_base/template.py	2010-04-02 00:28:16 UTC (rev 110446)
@@ -23,6 +23,8 @@
     summary = "A BlueBream project, base template"
 
     vars = [
+        var('python_package',
+            'Main Python package (with namespace, if any)'),
         var('interpreter',
             'Name of custom Python interpreter',
             default='breampy'),
@@ -40,50 +42,73 @@
         ]
 
     def check_vars(self, vars, cmd):
+        """This method checks the variables and ask for missing ones
+        """
+        # suggest what Paste chose
+        for var in self.vars:
+            if var.name == 'python_package':
+                var.default = vars['package']
+                # but keep the user's input if there are dots in the middle
+                if '.' in vars['project'][1:-1]:
+                    var.default = re.sub('[^A-Za-z0-9.]+', '_',
+                                         vars['project']).lower()
+
+        # ask remaining variables
+        vars = templates.Template.check_vars(self, vars, cmd)
+
+        # replace Paste default choice with ours
+        vars['package'] = vars['python_package']
+
+        # check for bad python package names
         if vars['package'] in ('bluebream', 'bream', 'zope'):
             print
             print "Error: The chosen project name results in an invalid " \
-                "package name: %s." % vars['package']
+                "package name: %s." % name
             print "Please choose a different project name."
             sys.exit(1)
+        return vars
 
-        # detect namespaces in the project name
-        vars['package'] = re.sub('[^A-Za-z0-9.]+', '_', vars['project']).lower()
-        vars['main_package'] = vars['package'].split('.')[-1]
-        self.ns_split = vars['project'].split('.')
+    def pre(self, command, output_dir, vars):
+        """Detect namespaces in the project name
+        """
+        if not command.options.verbose:
+            command.verbose = 0
+        self.ns_split = vars['package'].split('.')
+        vars['package'] = self.ns_split[-1]
         vars['namespace_packages'] = list(reversed([
-                    vars['package'].rsplit('.', i)[0]
+                    vars['python_package'].rsplit('.', i)[0]
                     for i in range(1,len(self.ns_split))]))
         vars['ns_prefix'] = '.'.join(self.ns_split[:-1]) + '.'
         if len(self.ns_split) == 1:
             vars['ns_prefix'] = ''
 
-        return templates.Template.check_vars(self, vars, cmd)
 
-    def write_files(self, command, output_dir, vars):
+    def post(self, command, output_dir, vars):
         """Add namespace packages and move the main package to the last level
         """
-        if not command.options.verbose:
-            command.verbose = 0
-        templates.Template.write_files(self, command, output_dir, vars)
+        # do nothing if there is no namespace
+        if len(self.ns_split) == 1:
+            return
 
-        if len(self.ns_split) > 1:
-            target_dir = os.path.join(output_dir, 'src',
-                                      os.path.join(*self.ns_split[:-1]))
+        package_dir = os.path.join(output_dir, 'src', vars['package'])
+        tmp_dir = package_dir + '.tmp'
+        os.rename(package_dir, tmp_dir)
 
-            os.makedirs(target_dir)
+        # create the intermediate namespace packages
+        target_dir = os.path.join(output_dir, 'src',
+                                  os.path.join(*self.ns_split[:-1]))
+        os.makedirs(target_dir)
 
-            ns_decl = "__import__('pkg_resources').declare_namespace(__name__)"
-            for i, namespace_package in enumerate(self.ns_split[:-1]):
-                init_file = os.path.join(output_dir, 'src',
-                                         os.path.join(*self.ns_split[:i+1]),
-                                         '__init__.py')
-                open(init_file, 'w').write(ns_decl)
-            main_package_dir = os.path.join(output_dir,
-                                            'src',
-                                            vars['main_package'])
-            os.rename(main_package_dir,
-                      os.path.join(target_dir,
-                                   os.path.basename(main_package_dir,)))
+        # create each __init__.py with namespace declaration
+        ns_decl = "__import__('pkg_resources').declare_namespace(__name__)"
+        for i, namespace_package in enumerate(self.ns_split[:-1]):
+            init_file = os.path.join(output_dir, 'src',
+                                     os.path.join(*self.ns_split[:i+1]),
+                                     '__init__.py')
+            open(init_file, 'w').write(ns_decl)
 
+        # move the (renamed) main package to the last namespace
+        os.rename(tmp_dir,
+                  os.path.join(target_dir, os.path.basename(package_dir,)))
 
+

Modified: bluebream/trunk/src/bluebream/bluebream_base/tests/bluebream.txt
===================================================================
--- bluebream/trunk/src/bluebream/bluebream_base/tests/bluebream.txt	2010-04-02 00:23:19 UTC (rev 110445)
+++ bluebream/trunk/src/bluebream/bluebream_base/tests/bluebream.txt	2010-04-02 00:28:16 UTC (rev 110446)
@@ -22,6 +22,7 @@
 >>> runner = cmd('create')
 >>> option_args = []
 >>> extra_args = [
+...            "python_package=sample",
 ...            "interpreter=testpy",
 ...            "version=0.1",
 ...            "description=test_description",
@@ -48,6 +49,7 @@
   long_description:  test_long_description
   package:           sample
   project:           sample
+  python_package:    sample
   url:               http://example.com
   version:           0.1
   zip_safe:          False
@@ -100,6 +102,7 @@
 ----------------------------------------------
 
 >>> project = 'sample.main'
+>>> extra_args[0] = "python_package=sample.main"
 >>> exit_code = runner.run(option_args + ['-t', 'bluebream', project] + extra_args)
 Selected and implied templates:
   bluebream#bluebream  A BlueBream project, base template
@@ -115,6 +118,7 @@
   long_description:  test_long_description
   package:           samplemain
   project:           sample.main
+  python_package:    sample.main
   url:               http://example.com
   version:           0.1
   zip_safe:          False
@@ -174,6 +178,7 @@
 ---------------------------------------------
 
 >>> project = 'sample.app.main'
+>>> extra_args[0] = "python_package=sample.app.main"
 >>> exit_code = runner.run(option_args + ['-t', 'bluebream', project] + extra_args)
 Selected and implied templates:
   bluebream#bluebream  A BlueBream project, base template
@@ -189,6 +194,7 @@
   long_description:  test_long_description
   package:           sampleappmain
   project:           sample.app.main
+  python_package:    sample.app.main
   url:               http://example.com
   version:           0.1
   zip_safe:          False
@@ -243,3 +249,79 @@
 ...
 shell = sample.app.main.debug:Shell
 ...
+
+
+An edge case:
+
+>>> project = 'foobar.foobar'
+>>> extra_args[0] = "python_package=foobar.foobar"
+>>> exit_code = runner.run(option_args + ['-t', 'bluebream', project] + extra_args)
+Selected and implied templates:
+  bluebream#bluebream  A BlueBream project, base template
+<BLANKLINE>
+Variables:
+  author:            test_author
+  author_email:      test_author_email
+  description:       test_description
+  egg:               foobar.foobar
+  interpreter:       testpy
+  keywords:          test_keyword
+  license_name:      Test Public License
+  long_description:  test_long_description
+  package:           foobarfoobar
+  project:           foobar.foobar
+  python_package:    foobar.foobar
+  url:               http://example.com
+  version:           0.1
+  zip_safe:          False
+Creating template bluebream
+Creating directory ./foobar.foobar
+
+>>> print_dir('foobar.foobar')
+foobar.foobar/bootstrap.py
+foobar.foobar/buildout.cfg
+foobar.foobar/debug.ini
+foobar.foobar/deploy.ini
+foobar.foobar/setup.py
+foobar.foobar/versions.cfg
+foobar.foobar/etc/site.zcml
+foobar.foobar/src/foobar/__init__.py
+foobar.foobar/src/foobar.foobar.egg-info/PKG-INFO
+foobar.foobar/src/foobar.foobar.egg-info/SOURCES.txt
+foobar.foobar/src/foobar.foobar.egg-info/dependency_links.txt
+foobar.foobar/src/foobar.foobar.egg-info/entry_points.txt
+foobar.foobar/src/foobar.foobar.egg-info/namespace_packages.txt
+foobar.foobar/src/foobar.foobar.egg-info/requires.txt
+foobar.foobar/src/foobar.foobar.egg-info/top_level.txt
+foobar.foobar/src/foobar.foobar.egg-info/zip-safe
+foobar.foobar/src/foobar/foobar/__init__.py
+foobar.foobar/src/foobar/foobar/configure.zcml
+foobar.foobar/src/foobar/foobar/debug.py
+foobar.foobar/src/foobar/foobar/securitypolicy.zcml
+foobar.foobar/src/foobar/foobar/startup.py
+foobar.foobar/src/foobar/foobar/tests/__init__.py
+foobar.foobar/src/foobar/foobar/tests/ftesting.zcml
+foobar.foobar/src/foobar/foobar/tests/tests.py
+foobar.foobar/src/foobar/foobar/welcome/__init__.py
+foobar.foobar/src/foobar/foobar/welcome/app.py
+foobar.foobar/src/foobar/foobar/welcome/configure.zcml
+foobar.foobar/src/foobar/foobar/welcome/ftests.txt
+foobar.foobar/src/foobar/foobar/welcome/index.pt
+foobar.foobar/src/foobar/foobar/welcome/interfaces.py
+foobar.foobar/src/foobar/foobar/welcome/views.py
+foobar.foobar/src/foobar/foobar/welcome/static/logo.png
+foobar.foobar/src/foobar/foobar/welcome/static/style.css
+foobar.foobar/templates/zope_conf.in
+foobar.foobar/var/filestorage/README.txt
+foobar.foobar/var/log/README.txt
+
+>>> print open(os.path.join('foobar.foobar', 'setup.py')).read()
+from setuptools import setup, find_packages
+...
+      namespace_packages=['foobar'],
+...
+shell = foobar.foobar.debug:Shell
+...
+
+
+



More information about the checkins mailing list