Welcome, guest | Sign In | My Account | Store | Cart

Notice! PyPM is being replaced with the ActiveState Platform, which enhances PyPM’s build and deploy capabilities. Create your free Platform account to download ActivePython or customize Python with the packages you require and get automatic updates.

Download
ActivePython
INSTALL>
pypm install voodoo

How to install Voodoo

  1. Download and install ActivePython
  2. Open Command Prompt
  3. Type pypm install voodoo
 Python 2.7Python 3.2Python 3.3
Windows (32-bit)
1.0.1
1.2.0Never BuiltWhy not?
1.0.1 Available View build log
0.9 Available View build log
0.8 Available View build log
0.5 Available View build log
0.3 Available View build log
0.2.10 Available View build log
Windows (64-bit)
1.0.1
1.2.0Never BuiltWhy not?
1.0.1 Available View build log
0.9 Available View build log
0.8 Available View build log
0.5 Available View build log
0.3 Available View build log
0.2.10 Available View build log
Mac OS X (10.5+)
1.1.1
1.2.0Never BuiltWhy not?
1.1.1 Available View build log
1.0.1 Failed View build log
0.9 Failed View build log
0.8 Failed View build log
0.5 Failed View build log
0.3 Available View build log
0.2.10 Available View build log
Linux (32-bit)
0.3
1.2.0Never BuiltWhy not?
1.0.1 Failed View build log
0.9 Failed View build log
0.8 Failed View build log
0.5 Failed View build log
0.3 Available View build log
0.2.10 Available View build log
Linux (64-bit)
1.2.0 Available View build log
1.1.1 Available View build log
1.0.1 Failed View build log
0.9 Failed View build log
0.8 Failed View build log
0.5 Failed View build log
0.3 Available View build log
0.2.10 Available View build log
1.2.0 Available View build log
1.1.1 Available View build log
 
License
BSD License
Depended by
Imports
Lastest release
version 1.2.0 on Sep 20th, 2013
===============================
Voodoo
===============================

.. image:: https://badge.fury.io/py/Voodoo.png
    :target: http://badge.fury.io/py/Voodoo

.. image:: https://pypip.in/d/Voodoo/badge.png
    :target: https://crate.io/packages/Voodoo?version=latest

Voodoo is a template system for project skeletons (similar to the template part
of PasteScript):

* It can make a copy of a project skeleton processing some files, filter others, etc.
* It generates a beautiful output and take care of not overwrite existing files, unless instructed to do so.
* BSD License. See ``LICENSE`` for more details.


.. image:: https://raw.github.com/lucuma/Voodoo/master/docs/static/images/output.png
    :alt: Voodoo sample output as used in a program.

*Above, Voodoo sample output as used in a program*

**Requirements:**

* Pypy or Python 2.6, 2.7, 3.3 or newer.

* It also uses the Jinja2 and Colorama Python libraries.


How to use
-----------

First of all install it and/or add it to your requirements.txt::

    $  pip install voodoo

The API is very simple. A ``render_skeleton`` function that takes two
absolute paths: the project skeleton to process, and where to copy it.:

.. code:: python

    from voodoo import render_skeleton

    render_skeleton(skeleton_path, new_project_path)

It also provide a ``prompt`` and ``prompt_bool`` functions that take
user input, to help you to make interactive scripts.

How it works
-------------

Files inside the skeleton are be copied to destination directly, unless
are suffixed with the extension '.tmpl'. In that case, the templating
engine will be used to render them.

A slightly customized Jinja2 templating is used. The main difference is
that variables are referenced with ``[[ name ]]`` instead of
``{{ name }}`` and blocks are ``[% if name %]`` instead of
``{% if name %}``. To read more about templating see the `Jinja2
documentation `__.

Use the data argument to pass whatever context you want to be available
in the templates. The arguments can be any valid Python value, even a
function:

.. code:: python

    from hashlib import sha256
    from os import urandom
    from voodoo import render_skeleton

    data = {
        'package': 'demo',
        'py3': True,
        'make_secret': lambda: sha256(urandom(48)).hexdigest()
    }
    render_skeleton(skeleton_path, new_project_path, data=data)

so in your template you can have:

.. code:: jinja

    import [[ package ]]

    secret = '[[ make_secret() ]]'
    [% if py3 %]
    msg = 'Python 3!'
    [% else %]
    msg = 'meh'
    [% endif %]

Using it in a script
--------------------

It's easy to integrate Voodoo with your own scripts. The following
example it's a classic make new project script found in many popular
frameworks:

.. code:: python

    from os.path import join, dirname, basename
    from voodoo import render_skeleton


    default_context = {
        'foo': 'bar',
    }
    SKELETON_PATH = join(dirname(__file__), '..', 'tests', 'demo')


    def new_project(path, options):
           data = default_context.copy()
        data['project_name'] = basename(path)
        render_skeleton(SKELETON_PATH, path, data=data, **options)


    if __name__ == '__main__':
           import argparse

        parser = argparse.ArgumentParser(description='Create a new project')
        parser.add_argument('path', help='The name or fullpath of the new project')
        parser.add_argument('-p', '--pretend', action='store_true',
                            help='Run but do not make any changes')
        parser.add_argument('-f', '--force', action='store_true',
                            help='Overwrite files that already exist, without asking')
        parser.add_argument('-s', '--skip', action='store_true',
                            help='Skip files that already exist, without asking')
        parser.add_argument('-q', '--quiet', action='store_true',
                            help='Suppress status output')

        args = parser.parse_args()
        da = vars(args)
        new_project(da.pop('path'), da)

You can se this example working in the examples folder. Play with it,
generate a new project and manually update some files. Then run the
script again to see how it detects what files has changed, and what
files are identical and with no need of regeneration.

An interactive version of this script could be made using the
``voodoo.prompt`` and/or the ``voodoo.prompt_bool`` helper functions.

VCS Support
------------

Voodoo supports rendering project skeletons from a version control
system repository. Git and Mercurial are supported. It requires a
working VCS command on your path: git or hg.

The forms of the URL is the same that the ``pip`` installer uses,
detecting the type of VCS using URL prefixes: "git+" or "hg+".

Git
~~~

Currently supports cloning over ``git``, ``git+https`` and ``git+ssh``::

    git+git://git.myproject.org/MyProject
    git+https://git.myproject.org/MyProject
    git+ssh://git.myproject.org/MyProject
    git+git@git.myproject.org:MyProject

Passing branch names, a commit hash or a tag name is possible like so::

    git://git.myproject.org/MyProject.git@master
    git://git.myproject.org/MyProject.git@v1.0
    git://git.myproject.org/MyProject.git@da39a3ee5e6b4b0d3255bfef95601890afd80709

Mercurial
~~~~~~~~~

The supported schemes are: ``hg+http``, ``hg+https``, ``hg+static-http``
and ``hg+ssh``::

    hg+http://hg.myproject.org/MyProject
    hg+https://hg.myproject.org/MyProject
    hg+ssh://hg.myproject.org/MyProject

You can also specify a revision number, a revision hash, a tag name or a
local branch name like so::

    hg+http://hg.myproject.org/MyProject@da39a3ee5e6b
    hg+http://hg.myproject.org/MyProject@2019
    hg+http://hg.myproject.org/MyProject@v1.0
    hg+http://hg.myproject.org/MyProject@special_feature

API
---

render_skeleton
~~~~~~~~~~~~~~~~

``render_skeleton (src_path, dst_path, data=None, filter_ext=None, pretend=False, force=False, skip=False, quiet=False, envops=None)``

src_path:
    Absolute path to the project skeleton

dst_path:
    Absolute path to where to render the skeleton

data:
    Data to be passed to the templates, as context.

filter_this:
    A list of names or shell-style patterns matching files or folders that musn't be copied. The default is: ``['.*', '~*', '*.py[co]']``

include_this:
    A list of names or shell-style patterns matching files or folders that must be included, even if its name are in the filter_this list. Eg: ``['.gitignore']``. The default is an empty list.

pretend:
    Run but do not make any changes

force:
    Overwrite files that already exist, without asking

skip:
    Skip files that already exist, without asking

quiet:
    Suppress the status output

envops:
    Extra options for the Jinja template environment.

prompt
~~~~~~

``prompt (text, default=None)``

Ask a question via raw_input() and return their answer.

text:
    prompt text

default:
    default value if no answer is provided.

prompt_bool
~~~~~~~~~~~~

``prompt_bool (text, default=False, yes_choices=None, no_choices=None)``

Ask a yes/no question via raw_input() and return their answer.

text:
    prompt text

default:
    default value if no answer is provided.

yes_choices:
    default ``['y', 'yes', '1', 'on', 'true', 't']``

no_choices:
    default ``['n', 'no', '0', 'off', 'false', 'f']``

.. :changelog:

History
-------

1.2.0 (2013-08-17)
+++++++++++++++++++++++++++++++++++++

* VCS support using pip.
* Support for variable substitution in folder names

1.1.0 (2013-06-30)
+++++++++++++++++++++++++++++++++++++

* Correctly compare the rendered content of the templates (previously it always reported them as different)
* Support for Python 3.3

0.3 (2011-11-13)
+++++++++++++++++++++++++++++++++++++

* Public release

Subscribe to package updates

Last updated Sep 20th, 2013

Download Stats

Last month:1

What does the lock icon mean?

Builds marked with a lock icon are only available via PyPM to users with a current ActivePython Business Edition subscription.

Need custom builds or support?

ActivePython Enterprise Edition guarantees priority access to technical support, indemnification, expert consulting and quality-assured language builds.

Plan on re-distributing ActivePython?

Get re-distribution rights and eliminate legal risks with ActivePython OEM Edition.