Commits

Anonymous committed 6bf5e02

TAGGING verions 0.3.0.0

-Changed the copyright notices to 2013
-Finished updating setup.py and added ez_setup.py so hopefully it is.

  • Participants
  • Parent commits 9b93e96
  • Tags 0.3.0.0

Comments (0)

Files changed (23)

-v0.1.0-dev, 2012 Aug 13 --- Initial development pre-release.
+v0.3.0.0-dev, 2013 Jan 16 --- Primarily just improved python distribution and packaging.
 
+v0.1.0.0-dev, 2012 Aug 13 --- Initial development pre-release.
+
-
-====================================
-templ - Template Processing Language
-====================================
-
-
-
-.. _Section-1:
-
-1: Introduction
----------------
-
-\ **templ**\  is the \ **Tem**\ plate \ **P**\ rocessing \ **L**\ anguage. 
-
-
-
-\ ``templ``\  is a (Turing complete) programming language, used for content generation
-from text-based template files and a simple but powerful processing language
-(\ ``templ``\  itself) which is embedded directly in the template file. 
-
-
-
-\ ``templ``\  can be used for: 
-
-- Code generation.
-- Form letters.
-- Server-side scripting for web servers.
-- Customized markup with variant output formats.
-- Any other kind of dynamic text-based content generation.
-
-
-
-.. _Section-1.1:
-
-1.1: Contact Information
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-This project is currently hosted on `bitbucket <https://bitbucket.org>`_, 
-at `https://bitbucket.org/bmearns/templ/ <https://bitbucket.org/bmearns/templ/>`_. The primary author is Brian Mearns:
-you can contact Brian through bitbucket at `https://bitbucket.org/bmearns <https://bitbucket.org/bmearns>`_. 
-
-
-
-.. _Section-1.2:
-
-1.2: Copyright and License
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-\ ``templ``\  is \ *free software*\ : you can redistribute it and/or modify
-it under the terms of the \ **GNU Affero General Public License**\  as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version. 
-
-
-
-\ ``templ``\  is distributed in the hope that it will be useful,
-but \ **without any warranty**\ ; without even the implied warranty of
-\ *merchantability*\  or \ *fitness for a particular purpose*\ .  See the
-GNU Affero General Public License for more details. 
-
-
-
-A copy of the GNU Affero General Public License is available in the templ
-distribution under the file LICENSE.txt. If you did not receive a copy of
-this file, see `http://www.gnu.org/licenses/ <http://www.gnu.org/licenses/>`_. 
-
-
-
-.. _Section-2:
-
-2: Examples
------------
-
-The following show some simple example templates and they're output, to give
-an idea of what can be done with templ.
-
-
-
-.. _Section-2.1:
-
-2.1: Templ Basics
-~~~~~~~~~~~~~~~~~ 
-            
-
-The following template shows some of the basic elements of \ ``templ``\  templates:
-
-
-            
-
-::
-
-    Hello, World!
-    My Name is {set :NAME "templ"}. I am the TEMplate Processing Language.
-    Sometimes, {$ :NAME} likes to speak in the third person.
-    
-    {$ :NAME} can do math:
-        1 + 1 = {+ 1 1}
-        1 + 2 = {+ 1 2}
-        2 + 3 = {+ 2 3}
-        3 + 5 = {+ 3 5}
-        etc...
-    
-    {$ :NAME} can operate on strings and lists:
-        {implode "a" {' b n n s}}
-        {str {cat {' a b c } {' d e f } }}
-    
-    {$ :NAME} can do conditional processing:
-        {if
-            {== {+ 2 2} 5}
-            "Oh No!"
-    
-            {== {+ 2 2} 4}
-            "Phew!"
-    
-            "How did I get here?"
-        }
-    
-    {$ :NAME} can loop (and do trig):
-    {for :THETA {range 0 40 10} {
-        echo "    sin(" {$ :THETA} ") = " {sin {rad {$ :THETA}}} {\n}}
-    }
-    
-    {$ :NAME} can even do list comprehensions and user defined functions:
-    {v {set
-        :MY-FUNC
-        {lambda
-            {' :THETA }
-            {:
-                {let :RADS}
-                {$ :RADS {rad {$ :THETA}}}
-    
-                {echo "Processing theta=" {$ :THETA} "..." {\n}}
-    
-                %return value
-                {+ {cos {$ :RADS}} {sin {$ :RADS}} }
-            }
-        }
-    }}{wrap "{" "}" {implode {glue "," {\n} "    "} {gen
-        :T
-        {range 40 80 10}
-        {join ":" {$ :T} {:MY-FUNC {$ :T}}}
-    }}}
-    
-
-            
-
-The output looks like this:
-
-
-            
-
-::
-
-    Hello, World!
-    My Name is templ. I am the TEMplate Processing Language.
-    Sometimes, templ likes to speak in the third person.
-    
-    templ can do math:
-        1 + 1 = 2
-        1 + 2 = 3
-        2 + 3 = 5
-        3 + 5 = 8
-        etc...
-    
-    templ can operate on strings and lists:
-        bananas
-        [a, b, c, d, e, f]
-    
-    templ can do conditional processing:
-        Phew!
-    
-    templ can loop (and do trig):
-        sin(0) = 0.0
-        sin(10) = 0.173648177667
-        sin(20) = 0.342020143326
-        sin(30) = 0.5
-    
-    
-    templ can even do list comprehensions and user defined functions:
-    Processing theta=40...
-    Processing theta=50...
-    Processing theta=60...
-    Processing theta=70...
-    {40:1.40883205281,
-        50:1.40883205281,
-        60:1.36602540378,
-        70:1.28171276411}
-        
-        
-
-
-.. _Section-2.2:
-
-2.2: Code Generation - A Sine Lookup Table
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
-            
-
-The following template shows an example of how to use \ ``templ``\ 
-to generate C-code, in this case a sine lookup table.
-
-
-            
-
-::
-
-    {v
-        {set :SIZE 10}
-    }const double sine_lut[{get :SIZE}] =
-    \{
-    {for i {range {get :SIZE}} {::
-        {let :THETA}
-        {$ :THETA {mult
-            {$ i}
-            {div 360 {$ :SIZE}}
-        }}
-        {spit {'
-            "    "
-            {round 
-                {sin {rad {$ :THETA}}}
-                4
-            }
-            ,
-            {\t}
-            "// i = "
-            {get i}
-            ", theta = "
-            {$ :THETA}
-            " deg"
-            {lnbrk}
-        }}
-    }}\};
-    
-
-            
-
-The output looks like this:
-
-
-            
-
-::
-
-    const double sine_lut[10] =
-    {
-        0.0,	// i = 0, theta = 0 deg
-        0.5878,	// i = 1, theta = 36 deg
-        0.9511,	// i = 2, theta = 72 deg
-        0.9511,	// i = 3, theta = 108 deg
-        0.5878,	// i = 4, theta = 144 deg
-        -0.0,	// i = 5, theta = 180 deg
-        -0.5878,	// i = 6, theta = 216 deg
-        -0.9511,	// i = 7, theta = 252 deg
-        -0.9511,	// i = 8, theta = 288 deg
-        -0.5878,	// i = 9, theta = 324 deg
-    };
-        
-
-
-
-.. _Section-2.3:
-
-2.3: Embedded Data
-~~~~~~~~~~~~~~~~~~ 
-            
-
-The next example shows how \ ``templ``\  allows you to easily embed data
-directly in the template file that uses it, allowing you to keep just
-one file under version control, for instance. 
-
-
-            
-
-::
-
-    
-    {v
-        %Embedded data
-        {$ :DATA {'
-            %   Name            Year    Month (-1)      Date
-            {'  "Alan T."     1912    05              23 }
-            {'  "John V."     1903    11              28 }
-            {'  "Claude S."   1916    03              30 }
-            {'  "George B."   1815    10              2  }
-            {'  "George B."   1815    10              2  }
-            {'  "Ada L."      1815    11              15 }
-            {'  "Charles B."  1791    11              26 }
-            {'  "Donald K."   1938    0               10 }
-            {'  "Dennis R."   1941    8               9  }
-        }}
-    }{for :ROW {$ :DATA} {:
-        {$ :STAMP {stamp {slice 1 {$ :ROW}}}}
-        {$ :NOW {stamp}}
-        {$ :AGE {floor {div {- {$ :NOW} {$ :STAMP}} {* 60 60 24 365.25}}}}
-        {echo {@ 0 {$ :ROW}} ", age " {$ :AGE} " years." {\n} }
-    }}
-
-            
-
-It produces this:
-
-
-            
-
-::
-
-    
-    Alan T., age 100 years.
-    John V., age 108 years.
-    Claude S., age 96 years.
-    George B., age 196 years.
-    George B., age 196 years.
-    Ada L., age 196 years.
-    Charles B., age 220 years.
-    Donald K., age 74 years.
-    Dennis R., age 70 years.
-    
-        
-    
-
-
-.. _Section-2.4:
-
-2.4: Programmatic Invocation
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The real power of \ ``templ``\  comes from the programmatic interface,
-which allows you to predefine symbols, and even executables (functions, macros
-and operators) in python, which are then accessible from the template.
-Because, although \ ``templ``\  \ *is*\  Turing complete, and you \ *could*\  do all
-of your processing directly in the template (or a separate included template), doing
-advanced data processing in python can help keep your template files simpler. 
-
+
+====================================
+templ - Template Processing Language
+====================================
+
+
+.. contents:: Contents
+    :depth: 2
+
+
+.. _Section-1:
+
+1: Introduction
+---------------
+
+\ **templ**\  is the \ **Tem**\ plate \ **P**\ rocessing \ **L**\ anguage. 
+
+
+
+\ ``templ``\  is a (Turing complete) programming language, used for content generation
+from text-based template files and a simple but powerful processing language
+(\ ``templ``\  itself) which is embedded directly in the template file. 
+
+
+
+\ ``templ``\  can be used for: 
+
+- Code generation.
+- Form letters.
+- Server-side scripting for web servers.
+- Customized markup with variant output formats.
+- Any other kind of dynamic text-based content generation.
+
+
+
+.. _Section-1.1:
+
+1.1: Contact Information
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+This project is currently hosted on `bitbucket <https://bitbucket.org>`_, 
+at `https://bitbucket.org/bmearns/templ/ <https://bitbucket.org/bmearns/templ/>`_. The primary author is Brian Mearns:
+you can contact Brian through bitbucket at `https://bitbucket.org/bmearns <https://bitbucket.org/bmearns>`_. 
+
+
+
+.. _Section-1.2:
+
+1.2: Copyright and License
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+\ ``templ``\  is \ *free software*\ : you can redistribute it and/or modify
+it under the terms of the \ **GNU Affero General Public License**\  as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version. 
+
+
+
+\ ``templ``\  is distributed in the hope that it will be useful,
+but \ **without any warranty**\ ; without even the implied warranty of
+\ *merchantability*\  or \ *fitness for a particular purpose*\ .  See the
+GNU Affero General Public License for more details. 
+
+
+
+A copy of the GNU Affero General Public License is available in the templ
+distribution under the file LICENSE.txt. If you did not receive a copy of
+this file, see `http://www.gnu.org/licenses/ <http://www.gnu.org/licenses/>`_. 
+
+
+
+.. _Section-2:
+
+2: Examples
+-----------
+
+The following show some simple example templates and they're output, to give
+an idea of what can be done with templ.
+
+
+
+.. _Section-2.1:
+
+2.1: Templ Basics
+~~~~~~~~~~~~~~~~~ 
+            
+
+The following template shows some of the basic elements of \ ``templ``\  templates:
+
+
+            
+
+::
+
+    Hello, World!
+    My Name is {set :NAME "templ"}. I am the TEMplate Processing Language.
+    Sometimes, {$ :NAME} likes to speak in the third person.
+    
+    {$ :NAME} can do math:
+        1 + 1 = {+ 1 1}
+        1 + 2 = {+ 1 2}
+        2 + 3 = {+ 2 3}
+        3 + 5 = {+ 3 5}
+        etc...
+    
+    {$ :NAME} can operate on strings and lists:
+        {implode "a" {' b n n s}}
+        {str {cat {' a b c } {' d e f } }}
+    
+    {$ :NAME} can do conditional processing:
+        {if
+            {== {+ 2 2} 5}
+            "Oh No!"
+    
+            {== {+ 2 2} 4}
+            "Phew!"
+    
+            "How did I get here?"
+        }
+    
+    {$ :NAME} can loop (and do trig):
+    {for :THETA {range 0 40 10} {
+        echo "    sin(" {$ :THETA} ") = " {sin {rad {$ :THETA}}} {eol}}
+    }
+    
+    {$ :NAME} can even do list comprehensions and user defined functions:
+    {v {set
+        :MY-FUNC
+        {lambda
+            {' :THETA }
+            {:
+                {let :RADS}
+                {$ :RADS {rad {$ :THETA}}}
+    
+                {echo "Processing theta=" {$ :THETA} "..." {eol}}
+    
+                %return value
+                {+ {cos {$ :RADS}} {sin {$ :RADS}} }
+            }
+        }
+    }}{wrap "{" "}" {implode {glue "," {eol} "    "} {gen
+        :T
+        {range 40 80 10}
+        {join ":" {$ :T} {:MY-FUNC {$ :T}}}
+    }}}
+    
+
+            
+
+The output looks like this:
+
+
+            
+
+::
+
+    Hello, World!
+    My Name is templ. I am the TEMplate Processing Language.
+    Sometimes, templ likes to speak in the third person.
+    
+    templ can do math:
+        1 + 1 = 2
+        1 + 2 = 3
+        2 + 3 = 5
+        3 + 5 = 8
+        etc...
+    
+    templ can operate on strings and lists:
+        bananas
+        [a, b, c, d, e, f]
+    
+    templ can do conditional processing:
+        Phew!
+    
+    templ can loop (and do trig):
+        sin(0) = 0.0
+        sin(10) = 0.173648177667
+        sin(20) = 0.342020143326
+        sin(30) = 0.5
+    
+    
+    templ can even do list comprehensions and user defined functions:
+    Processing theta=40...
+    Processing theta=50...
+    Processing theta=60...
+    Processing theta=70...
+    {40:1.40883205281,
+        50:1.40883205281,
+        60:1.36602540378,
+        70:1.28171276411}
+        
+        
+
+
+.. _Section-2.2:
+
+2.2: Code Generation - A Sine Lookup Table
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+            
+
+The following template shows an example of how to use \ ``templ``\ 
+to generate C-code, in this case a sine lookup table.
+
+
+            
+
+::
+
+    {v
+        {set :SIZE 10}
+    }const double sine_lut[{get :SIZE}] =
+    \{
+    {for i {range {get :SIZE}} {::
+        {let :THETA}
+        {$ :THETA {mult
+            {$ i}
+            {div 360 {$ :SIZE}}
+        }}
+        {spit {'
+            "    "
+            {round 
+                {sin {rad {$ :THETA}}}
+                4
+            }
+            ,
+            {\t}
+            "// i = "
+            {get i}
+            ", theta = "
+            {$ :THETA}
+            " deg"
+            {eol}
+        }}
+    }}\};
+    
+
+            
+
+The output looks like this:
+
+
+            
+
+::
+
+    const double sine_lut[10] =
+    {
+        0.0,	// i = 0, theta = 0 deg
+        0.5878,	// i = 1, theta = 36 deg
+        0.9511,	// i = 2, theta = 72 deg
+        0.9511,	// i = 3, theta = 108 deg
+        0.5878,	// i = 4, theta = 144 deg
+        -0.0,	// i = 5, theta = 180 deg
+        -0.5878,	// i = 6, theta = 216 deg
+        -0.9511,	// i = 7, theta = 252 deg
+        -0.9511,	// i = 8, theta = 288 deg
+        -0.5878,	// i = 9, theta = 324 deg
+    };
+        
+
+
+
+.. _Section-2.3:
+
+2.3: Embedded Data
+~~~~~~~~~~~~~~~~~~ 
+            
+
+The next example shows how \ ``templ``\  allows you to easily embed data
+directly in the template file that uses it, allowing you to keep just
+one file under version control, for instance. 
+
+
+            
+
+::
+
+    
+    {v
+        %Embedded data
+        {$ :DATA {'
+            %   Name            Year    Month (-1)      Date
+            {'  "Alan T."     1912    05              23 }
+            {'  "John V."     1903    11              28 }
+            {'  "Claude S."   1916    03              30 }
+            {'  "George B."   1815    10              2  }
+            {'  "George B."   1815    10              2  }
+            {'  "Ada L."      1815    11              15 }
+            {'  "Charles B."  1791    11              26 }
+            {'  "Donald K."   1938    0               10 }
+            {'  "Dennis R."   1941    8               9  }
+        }}
+    }{for :ROW {$ :DATA} {:
+        {$ :STAMP {stamp {slice 1 {$ :ROW}}}}
+        {$ :NOW {stamp}}
+        {$ :AGE {floor {div {- {$ :NOW} {$ :STAMP}} {* 60 60 24 365.25}}}}
+        {echo {@ 0 {$ :ROW}} ", age " {$ :AGE} " years." {eol} }
+    }}
+
+            
+
+It produces this:
+
+
+            
+
+::
+
+    
+    Alan T., age 100 years.
+    John V., age 109 years.
+    Claude S., age 96 years.
+    George B., age 197 years.
+    George B., age 197 years.
+    Ada L., age 197 years.
+    Charles B., age 221 years.
+    Donald K., age 75 years.
+    Dennis R., age 71 years.
+    
+        
+    
+
+
+.. _Section-2.4:
+
+2.4: Programmatic Invocation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The real power of \ ``templ``\  comes from the programmatic interface,
+which allows you to predefine symbols, and even executables (functions, macros
+and operators) in python, which are then accessible from the template.
+Because, although \ ``templ``\  \ *is*\  Turing complete, and you \ *could*\  do all
+of your processing directly in the template (or a separate included template), doing
+advanced data processing in python can help keep your template files simpler. 
+
+
+
+.. _Section-3:
+
+3: Complete Contents
+--------------------
+.. contents::
+    :depth: 10
+#!python
+"""Bootstrap setuptools installation
+
+If you want to use setuptools in your package's setup.py, just include this
+file in the same directory with it, and add this to the top of your setup.py::
+
+    from ez_setup import use_setuptools
+    use_setuptools()
+
+If you want to require a specific version of setuptools, set a download
+mirror, or use an alternate download directory, you can do so by supplying
+the appropriate options to ``use_setuptools()``.
+
+This file can also be run as a script to install or upgrade setuptools.
+"""
+import sys
+DEFAULT_VERSION = "0.6c11"
+DEFAULT_URL     = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
+
+md5_data = {
+    'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
+    'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
+    'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
+    'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
+    'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
+    'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
+    'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
+    'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
+    'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
+    'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
+    'setuptools-0.6c10-py2.3.egg': 'ce1e2ab5d3a0256456d9fc13800a7090',
+    'setuptools-0.6c10-py2.4.egg': '57d6d9d6e9b80772c59a53a8433a5dd4',
+    'setuptools-0.6c10-py2.5.egg': 'de46ac8b1c97c895572e5e8596aeb8c7',
+    'setuptools-0.6c10-py2.6.egg': '58ea40aef06da02ce641495523a0b7f5',
+    'setuptools-0.6c11-py2.3.egg': '2baeac6e13d414a9d28e7ba5b5a596de',
+    'setuptools-0.6c11-py2.4.egg': 'bd639f9b0eac4c42497034dec2ec0c2b',
+    'setuptools-0.6c11-py2.5.egg': '64c94f3bf7a72a13ec83e0b24f2749b2',
+    'setuptools-0.6c11-py2.6.egg': 'bfa92100bd772d5a213eedd356d64086',
+    'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
+    'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
+    'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
+    'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
+    'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
+    'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
+    'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
+    'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
+    'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
+    'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
+    'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
+    'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
+    'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
+    'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
+    'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
+    'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
+    'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
+    'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',
+    'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',
+    'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',
+    'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',
+    'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',
+    'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',
+    'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',
+}
+
+import sys, os
+try: from hashlib import md5
+except ImportError: from md5 import md5
+
+def _validate_md5(egg_name, data):
+    if egg_name in md5_data:
+        digest = md5(data).hexdigest()
+        if digest != md5_data[egg_name]:
+            print >>sys.stderr, (
+                "md5 validation of %s failed!  (Possible download problem?)"
+                % egg_name
+            )
+            sys.exit(2)
+    return data
+
+def use_setuptools(
+    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
+    download_delay=15
+):
+    """Automatically find/download setuptools and make it available on sys.path
+
+    `version` should be a valid setuptools version number that is available
+    as an egg for download under the `download_base` URL (which should end with
+    a '/').  `to_dir` is the directory where setuptools will be downloaded, if
+    it is not already available.  If `download_delay` is specified, it should
+    be the number of seconds that will be paused before initiating a download,
+    should one be required.  If an older version of setuptools is installed,
+    this routine will print a message to ``sys.stderr`` and raise SystemExit in
+    an attempt to abort the calling script.
+    """
+    was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
+    def do_download():
+        egg = download_setuptools(version, download_base, to_dir, download_delay)
+        sys.path.insert(0, egg)
+        import setuptools; setuptools.bootstrap_install_from = egg
+    try:
+        import pkg_resources
+    except ImportError:
+        return do_download()       
+    try:
+        pkg_resources.require("setuptools>="+version); return
+    except pkg_resources.VersionConflict, e:
+        if was_imported:
+            print >>sys.stderr, (
+            "The required version of setuptools (>=%s) is not available, and\n"
+            "can't be installed while this script is running. Please install\n"
+            " a more recent version first, using 'easy_install -U setuptools'."
+            "\n\n(Currently using %r)"
+            ) % (version, e.args[0])
+            sys.exit(2)
+    except pkg_resources.DistributionNotFound:
+        pass
+
+    del pkg_resources, sys.modules['pkg_resources']    # reload ok
+    return do_download()
+
+def download_setuptools(
+    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
+    delay = 15
+):
+    """Download setuptools from a specified location and return its filename
+
+    `version` should be a valid setuptools version number that is available
+    as an egg for download under the `download_base` URL (which should end
+    with a '/'). `to_dir` is the directory where the egg will be downloaded.
+    `delay` is the number of seconds to pause before an actual download attempt.
+    """
+    import urllib2, shutil
+    egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
+    url = download_base + egg_name
+    saveto = os.path.join(to_dir, egg_name)
+    src = dst = None
+    if not os.path.exists(saveto):  # Avoid repeated downloads
+        try:
+            from distutils import log
+            if delay:
+                log.warn("""
+---------------------------------------------------------------------------
+This script requires setuptools version %s to run (even to display
+help).  I will attempt to download it for you (from
+%s), but
+you may need to enable firewall access for this script first.
+I will start the download in %d seconds.
+
+(Note: if this machine does not have network access, please obtain the file
+
+   %s
+
+and place it in this directory before rerunning this script.)
+---------------------------------------------------------------------------""",
+                    version, download_base, delay, url
+                ); from time import sleep; sleep(delay)
+            log.warn("Downloading %s", url)
+            src = urllib2.urlopen(url)
+            # Read/write all in one block, so we don't create a corrupt file
+            # if the download is interrupted.
+            data = _validate_md5(egg_name, src.read())
+            dst = open(saveto,"wb"); dst.write(data)
+        finally:
+            if src: src.close()
+            if dst: dst.close()
+    return os.path.realpath(saveto)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+def main(argv, version=DEFAULT_VERSION):
+    """Install or upgrade setuptools and EasyInstall"""
+    try:
+        import setuptools
+    except ImportError:
+        egg = None
+        try:
+            egg = download_setuptools(version, delay=0)
+            sys.path.insert(0,egg)
+            from setuptools.command.easy_install import main
+            return main(list(argv)+[egg])   # we're done here
+        finally:
+            if egg and os.path.exists(egg):
+                os.unlink(egg)
+    else:
+        if setuptools.__version__ == '0.0.1':
+            print >>sys.stderr, (
+            "You have an obsolete version of setuptools installed.  Please\n"
+            "remove it from your system entirely before rerunning this script."
+            )
+            sys.exit(2)
+
+    req = "setuptools>="+version
+    import pkg_resources
+    try:
+        pkg_resources.require(req)
+    except pkg_resources.VersionConflict:
+        try:
+            from setuptools.command.easy_install import main
+        except ImportError:
+            from easy_install import main
+        main(list(argv)+[download_setuptools(delay=0)])
+        sys.exit(0) # try to force an exit
+    else:
+        if argv:
+            from setuptools.command.easy_install import main
+            main(argv)
+        else:
+            print "Setuptools version",version,"or greater has been installed."
+            print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
+
+def update_md5(filenames):
+    """Update our built-in md5 registry"""
+
+    import re
+
+    for name in filenames:
+        base = os.path.basename(name)
+        f = open(name,'rb')
+        md5_data[base] = md5(f.read()).hexdigest()
+        f.close()
+
+    data = ["    %r: %r,\n" % it for it in md5_data.items()]
+    data.sort()
+    repl = "".join(data)
+
+    import inspect
+    srcfile = inspect.getsourcefile(sys.modules[__name__])
+    f = open(srcfile, 'rb'); src = f.read(); f.close()
+
+    match = re.search("\nmd5_data = {\n([^}]+)}", src)
+    if not match:
+        print >>sys.stderr, "Internal error!"
+        sys.exit(2)
+
+    src = src[:match.start(1)] + repl + src[match.end(1):]
+    f = open(srcfile,'w')
+    f.write(src)
+    f.close()
+
+
+if __name__=='__main__':
+    if len(sys.argv)>2 and sys.argv[1]=='--md5update':
+        update_md5(sys.argv[2:])
+    else:
+        main(sys.argv[1:])
+
+
+
+
+
+
+import ez_setup
+ez_setup.use_setuptools()
+
 from setuptools import setup
 import sys
+import os
+import cStringIO
 
-sys.path.append("templ")
-import templ.version as version
+
+### This is a lot of screwing around to populate the README for the package from
+# a template we have in the templ directory.
+sys.path.insert(0, "templ")
+import version as templVersion
+import templ
+import tstreams
+import texec
+
+globs = texec.getGlobalScope()
+
+os.chdir("templ")
+readmePath = "README.txt.templ"
+istream = open(readmePath, "r")
+ostream = cStringIO.StringIO()
+otstream = tstreams.TemplateStreamOutputStream(ostream)
+templ.process(istream, otstream, globs, iname="readmePath", debug=True)
+istream.close()
+readme = ostream.getvalue()
+otstream.close()
+os.chdir("..")
+
 
 setup(
     name='templ',
-    version=version.setuptools_str(),
+    version=templVersion.setuptools_string(),
     author='Brian Mearns',
     author_email='bmearns@ieee.org',
     packages=['templ',],
     url='https://bitbucket.org/bmearns/templ/',
     license='LICENSE.txt',
     description='Template Processing Language.',
-    long_description=open('README.txt').read(),
+    long_description=readme,
     entry_points = {
         "console_scripts" : [
-            'templ = templ.TemplCore:main',
+            'templ = templ.templ:main',
         ],
     }
 )

File templ/README.core.templ

 {#
-    Copyright 2012 Brian Mearns
+    Copyright 2013 Brian Mearns
 
     This file is part of templ.
 

File templ/README.rest.templ

 {#
-    Copyright 2012 Brian Mearns
+    Copyright 2013 Brian Mearns
 
     This file is part of templ.
 

File templ/README.txt.templ

 {#
-    Copyright 2012 Brian Mearns
+    Copyright 2013 Brian Mearns
 
     This file is part of templ.
 

File templ/__init__.py

 """
-Copyright 2012 Brian Mearns
+Copyright 2013 Brian Mearns
 
 This file is part of templ.
 

File templ/filepos.py

 """
-Copyright 2012 Brian Mearns
+Copyright 2013 Brian Mearns
 
 This file is part of templ.
 

File templ/html.itmpl

 {#
-    Copyright 2012 Brian Mearns
+    Copyright 2013 Brian Mearns
 
     This file is part of templ.
 

File templ/rest.itmpl

 {#
-    Copyright 2012 Brian Mearns
+    Copyright 2013 Brian Mearns
 
     This file is part of templ.
 

File templ/stack.py

 """
-Copyright 2012 Brian Mearns
+Copyright 2013 Brian Mearns
 
 This file is part of templ.
 

File templ/tbuiltin.py

 """
-Copyright 2012 Brian Mearns
+Copyright 2013 Brian Mearns
 
 This file is part of templ.
 

File templ/templ.py

 #!/usr/bin/python
 """
-Copyright 2012 Brian Mearns
+Copyright 2013 Brian Mearns
 
 This file is part of templ.
 

File templ/teval.py

 """
-Copyright 2012 Brian Mearns
+Copyright 2013 Brian Mearns
 
 This file is part of templ.
 

File templ/texceptions.py

 """
-Copyright 2012 Brian Mearns
+Copyright 2013 Brian Mearns
 
 This file is part of templ.
 

File templ/texec.py

 """
-Copyright 2012 Brian Mearns
+Copyright 2013 Brian Mearns
 
 This file is part of templ.
 

File templ/tstreams.py

 """
-Copyright 2012 Brian Mearns
+Copyright 2013 Brian Mearns
 
 This file is part of templ.
 

File templ/ttypes.py

 """
-Copyright 2012 Brian Mearns
+Copyright 2013 Brian Mearns
 
 This file is part of templ.
 

File templ/tutorial.core.templ

 {#
-    Copyright 2012 Brian Mearns
+    Copyright 2013 Brian Mearns
 
     This file is part of templ.
 

File templ/tutorial.rest.templ

 {#
-    Copyright 2012 Brian Mearns
+    Copyright 2013 Brian Mearns
 
     This file is part of templ.
 

File templ/txtdoc.itmpl

 {#
-    Copyright 2012 Brian Mearns
+    Copyright 2013 Brian Mearns
 
     This file is part of templ.
 

File templ/version.py

 """
-Copyright 2012 Brian Mearns
+Copyright 2013 Brian Mearns
 
 This file is part of templ.