diff options
66 files changed, 2729 insertions, 10 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index 1e4d73c6c..d7f5b7a4f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -31,11 +31,23 @@ Features (delta from BFG 1.3.X) - Using ``request.session`` now returns a (dictionary-like) session object if a session factory has been configured. +- New module: ``pyramid.personality.pylons``: contains Pylons-specific + features. + +- The request now has a new attribute: ``tmpl_context`` for benefit of + Pylons users. + Documentation (delta from BFG 1.3) ----------------------------------- - Added a ``pyramid.httpexceptions`` API documentation chapter. +- Added a ``pyramid.session`` API documentation chapter. + +- Added a ``Session Objects`` narrative documentation chapter. + +- Added an API chapter for the ``pyramid.personality`` module. + Backwards Incompatibilities (with BFG 1.3.X) -------------------------------------------- @@ -62,13 +62,9 @@ - Update App engine chapter. -- Add SessionFactory interface +- Browser id? -- Create session interface (flash() is part of it, figure out granularity) - -- Add CacheFactory interface - -- Browser id +- .flash API on session. - Signed_signature method of the request and response from pylons2. diff --git a/docs/api.rst b/docs/api.rst index 8e7c0c283..e457d28f0 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -20,6 +20,7 @@ documentation is organized alphabetically by module name. api/interfaces api/location api/paster + api/personality api/renderers api/request api/router diff --git a/docs/api/personality.rst b/docs/api/personality.rst new file mode 100644 index 000000000..7eb964e76 --- /dev/null +++ b/docs/api/personality.rst @@ -0,0 +1,9 @@ +.. _personality_module: + +:mod:`pyramid.personality.pylons` +--------------------------------- + +.. module:: pyramid.personality.pylons + +.. function:: renderer_globals_factory_config + diff --git a/docs/api/request.rst b/docs/api/request.rst index 9e851ba8d..97b164428 100644 --- a/docs/api/request.rst +++ b/docs/api/request.rst @@ -93,3 +93,8 @@ ``request.session`` attribute will cause a :class:`pyramid.exceptions.ConfigurationError` to be raised. + .. attribute:: tmpl_context + + The template context for Pylons-style applications. + + diff --git a/docs/narr/project.rst b/docs/narr/project.rst index 0e18f0924..f88496fcc 100644 --- a/docs/narr/project.rst +++ b/docs/narr/project.rst @@ -21,6 +21,9 @@ templates". single: pyramid_zodb paster template single: pyramid_alchemy paster template single: pyramid_routesalchemy paster template + single: pylons_minimal paster template + single: pylons_basic paster template + single: pylons_sqla paster template .. _additional_paster_templates: @@ -52,6 +55,18 @@ The included templates are these: URL mapping via :term:`traversal` and persistence via :term:`SQLAlchemy` +``pylons_minimal`` + URL mapping via :term:`URL dispatch` and Pylons-style view handlers, + minimal setup. + +``pylons_basic`` + URL mapping via :term:`URL dispatch` and Pylons-style view handlers, + and some extra functionality. + +``pylons_sqla`` + URL mapping via :term:`URL dispatch` and Pylons-style view handlers, + some extra functionality, and SQLAlchemy set up. + Each of these project templates uses :term:`ZCML` instead of :term:`imperative configuration`. Each also makes the assumption that you want your code to live in a Python :term:`package`. Even if your diff --git a/docs/narr/webob.rst b/docs/narr/webob.rst index 15f8da9cf..b41979a1f 100644 --- a/docs/narr/webob.rst +++ b/docs/narr/webob.rst @@ -112,9 +112,9 @@ Special Attributes Added to the Request by :mod:`pyramid` In addition to the standard :term:`WebOb` attributes, :mod:`pyramid` adds special attributes to every request: ``context``, ``registry``, ``root``, ``subpath``, ``traversed``, ``view_name``, ``virtual_root`` -, ``virtual_root_path``, and ``session``. These attributes are -documented further within the :class:`pyramid.request.Request` API -documentation. +, ``virtual_root_path``, ``session``, and ``tmpl_context``. These +attributes are documented further within the +:class:`pyramid.request.Request` API documentation. .. index:: single: request URLs diff --git a/pyramid/paster.py b/pyramid/paster.py index 0b7a4f7c7..1a0e3f6cb 100644 --- a/pyramid/paster.py +++ b/pyramid/paster.py @@ -9,7 +9,6 @@ from paste.util.template import paste_script_template_renderer from pyramid.scripting import get_root - class StarterProjectTemplate(Template): _template_dir = 'paster_templates/starter' summary = 'pyramid starter project' @@ -30,6 +29,21 @@ class AlchemyProjectTemplate(Template): summary = 'pyramid SQLAlchemy project using traversal' template_renderer = staticmethod(paste_script_template_renderer) +class PylonsBasicProjectTemplate(Template): + _template_dir = 'paster_templates/pylons_basic' + summary = 'Pylons basic project' + template_renderer = staticmethod(paste_script_template_renderer) + +class PylonsMinimalProjectTemplate(Template): + _template_dir = 'paster_templates/pylons_minimal' + summary = 'Pylons minimal project' + template_renderer = staticmethod(paste_script_template_renderer) + +class PylonsSQLAlchemyProjectTemplate(Template): + _template_dir = 'paster_templates/pylons_sqla' + summary = 'Pylons SQLAlchemy project' + template_renderer = staticmethod(paste_script_template_renderer) + def get_app(config_file, name, loadapp=loadapp): """ Return the WSGI application named ``name`` in the PasteDeploy config file ``config_file``""" diff --git a/pyramid/paster_templates/pylons_basic/+package+/__init__.py_tmpl b/pyramid/paster_templates/pylons_basic/+package+/__init__.py_tmpl new file mode 100644 index 000000000..b8f5219a7 --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/+package+/__init__.py_tmpl @@ -0,0 +1,22 @@ +from pyramid_beaker import session_factory_from_settings +from pyramid.personality.pylons import renderer_globals_factory_config +from {{package}}.lib import helpers + +def main(global_config, **settings): + """ This function returns a Pyramid WSGI application. + """ + from pyramid.configuration import Configurator + config = Configurator(settings=settings) + config.begin() + session_factory = session_factory_from_settings(settings) + config.set_session_factory(session_factory) + globals_factory = renderer_globals_factory_config(helpers) + config.set_renderer_globals_factory(globals_factory) + # XXX add caching setup + config.add_static_view('static', '{{package}}:static/') + config.add_handler('action', '/{action}', + '{{package}}.handlers.hello:HelloHandler') + config.add_handler('home', '/', '{{package}}.handlers.hello:HelloHandler', + action='index') + config.end() + return config.make_wsgi_app() diff --git a/pyramid/paster_templates/pylons_basic/+package+/handlers/__init__.py b/pyramid/paster_templates/pylons_basic/+package+/handlers/__init__.py new file mode 100644 index 000000000..5bb534f79 --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/+package+/handlers/__init__.py @@ -0,0 +1 @@ +# package diff --git a/pyramid/paster_templates/pylons_basic/+package+/handlers/hello.py_tmpl b/pyramid/paster_templates/pylons_basic/+package+/handlers/hello.py_tmpl new file mode 100644 index 000000000..696772798 --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/+package+/handlers/hello.py_tmpl @@ -0,0 +1,9 @@ +from pyramid.view import action + +class HelloHandler(object): + def __init__(self, request): + self.request = request + + @action(renderer='mytemplate.mak') + def index(self): + return {'project':'{{project}}'} diff --git a/pyramid/paster_templates/pylons_basic/+package+/lib/__init__.py b/pyramid/paster_templates/pylons_basic/+package+/lib/__init__.py new file mode 100644 index 000000000..4287ca861 --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/+package+/lib/__init__.py @@ -0,0 +1 @@ +#
\ No newline at end of file diff --git a/pyramid/paster_templates/pylons_basic/+package+/lib/helpers.py b/pyramid/paster_templates/pylons_basic/+package+/lib/helpers.py new file mode 100644 index 000000000..878b8882f --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/+package+/lib/helpers.py @@ -0,0 +1,7 @@ +"""Helper functions + +Consists of functions to typically be used within templates, but also +available to Controllers. This module is available to templates as 'h'. +""" +# Import helpers as desired, or define your own, ie: +#from webhelpers.html.tags import checkbox, password diff --git a/pyramid/paster_templates/pylons_basic/+package+/static/default.css b/pyramid/paster_templates/pylons_basic/+package+/static/default.css new file mode 100644 index 000000000..41b3debde --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/+package+/static/default.css @@ -0,0 +1,380 @@ +/* +Design by Free CSS Templates +http://www.freecsstemplates.org +Released for free under a Creative Commons Attribution 2.5 License +*/ + +body { + margin: 0; + padding: 0; + background: url(images/img01.gif) repeat-x left top; + font-size: 13px; + font-family: "Trebuchet MS", Georgia, "Times New Roman", Times, serif; + text-align: justify; + color: #FFFFFF; +} + +h1, h2, h3 { + margin: 0; + text-transform: lowercase; + font-weight: normal; + color: #FFFFFF; +} + +h1 { + letter-spacing: -1px; + font-size: 32px; +} + +h2 { + font-size: 23px; +} + +p, ul, ol { + margin: 0 0 2em 0; + text-align: justify; + line-height: 26px; +} + +a:link { + color: #8BD80E; +} + +a:hover, a:active { + text-decoration: none; + color: #8BD80E; +} + +a:visited { + color: #8BD80E; +} + +img { + border: none; +} + +img.left { + float: left; + margin-right: 15px; +} + +img.right { + float: right; + margin-left: 15px; +} + +/* Form */ + +form { + margin: 0; + padding: 0; +} + +fieldset { + margin: 0; + padding: 0; + border: none; +} + +legend { + display: none; +} + +input, textarea, select { + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + font-size: 13px; + color: #333333; +} + +#wrapper { + margin: 0; + padding: 0; + background: #000000; +} + +/* Header */ + +#header { + width: 713px; + margin: 0 auto; + height: 42px; +} + +/* Menu */ + +#menu { + float: left; + width: 713px; + height: 50px; + background: url(images/img02.gif) no-repeat left top; +} + +#menu ul { + margin: 0; + padding: 0px 0 0 10px; + list-style: none; + line-height: normal; +} + +#menu li { + display: block; + float: left; +} + +#menu a { + display: block; + float: left; + background: url(images/img04.gif) no-repeat right 55%; + margin-top: 5px; + margin-right: 3px; + padding: 8px 17px; + text-decoration: none; + font-size: 13px; + color: #000000; +} + +#menu a:hover { + color: #000000; +} + +#menu .current_page_item a { + color: #000000; +} + +/** LOGO */ + +#logo { + width: 713px; + height: 80px; + margin: 0 auto; +} + +#logo h1, #logo h2 { + float: left; + margin: 0; + padding: 30px 0 0 0px; + line-height: normal; +} + +#logo h1 { + font-family: Georgia, "Times New Roman", Times, serif; + font-size:40px; +} + +#logo h1 a { + text-decoration: none; + color: #4C4C4C; +} + +#logo h1 a:hover { text-decoration: underline; } + +#logo h2 { + float: left; + padding: 45px 0 0 18px; + font: 18px Georgia, "Times New Roman", Times, serif; + color: #8BD80E; +} + +#logo p a { + text-decoration: none; + color: #8BD80E; +} + +#logo p a:hover { text-decoration: underline; } + + + +/* Page */ + +#page { + width: 663px; + margin: 0 auto; + background: #4C4C4C url(images/img03.gif) no-repeat left bottom; + padding: 0 25px; +} + +/* Content */ + +#content { + float: left; + width: 410px; + +} + +/* Post */ + +.post { + padding: 15px 0px; + margin-bottom: 20px; +} + +.post .title { + margin-bottom: 20px; + padding-bottom: 5px; +} + +.post h1 { + padding: 0px 0 0 0px; + background: url(images/img08.jpg) no-repeat left top; + font-size: 24px; + color: #FFFFFF; +} + +.post h2 { + padding: 0px 0 0 0px; + font-size: 22px; + color: #FFFFFF; +} + +.post .entry { +} + +.post .meta { + padding: 15px 15px 30px 0px; + font-family: Arial, Helvetica, sans-serif; + font-size: 11px; +} + +.post .meta p { + margin: 0; + padding-top: 15px; + line-height: normal; + color: #FFFFFF; +} + +.post .meta .byline { + float: left; +} + +.post .meta .links { + float: right; +} + +.post .meta .more { + padding: 0 10px 0 18px; +} + +.post .meta .comments { +} + +.post .meta b { + display: none; +} + + +/* Sidebar */ + +#sidebar { + width: 210px; + float: right; + margin: 0; + padding: 0; +} + +#sidebar ul { + margin: 0; + padding: 0; + list-style: none; +} + +#sidebar li { + margin-bottom: 40px; +} + +#sidebar li ul { +} + +#sidebar li li { + margin: 0; +} + +#sidebar h2 { + width: 250px; + padding: 8px 0 0 0px; + margin-bottom: 10px; + background: url(images/img07.jpg) no-repeat left top; + font-size: 20px; + color: #FFFFFF; +} + +/* Search */ + +#search { + +} + +#search h2 { + margin-bottom: 20px; +} + +#s { + width: 140px; + margin-right: 5px; + padding: 3px; + border: 1px solid #BED99C; +} + +#x { + padding: 3px; + border: none; + background: #8BD80E; + text-transform: lowercase; + font-size: 11px; + color: #FFFFFF; +} + +/* Boxes */ + +.box1 { + padding: 20px; +} + +.box2 { + color: #BABABA; +} + +.box2 h2 { + margin-bottom: 15px; + font-size: 16px; + color: #FFFFFF; +} + +.box2 ul { + margin: 0; + padding: 0; + list-style: none; +} + +.box2 a:link, .box2 a:hover, .box2 a:active, .box2 a:visited { + color: #EDEDED; +} + +/* Footer */ +#footer-wrap { +} + +#footer { + margin: 0 auto; + padding: 20px 0 10px 0; + background: #000000; +} + +html>body #footer { + height: auto; +} + +#footer p { + font-size: 11px; +} + +#legal { + clear: both; + padding-top: 17px; + text-align: center; + color: #FFFFFF; +} + +#legal a { + font-weight: normal; + color: #FFFFFF; +} diff --git a/pyramid/paster_templates/pylons_basic/+package+/static/images/img01.gif b/pyramid/paster_templates/pylons_basic/+package+/static/images/img01.gif Binary files differnew file mode 100644 index 000000000..5f082bd99 --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/+package+/static/images/img01.gif diff --git a/pyramid/paster_templates/pylons_basic/+package+/static/images/img02.gif b/pyramid/paster_templates/pylons_basic/+package+/static/images/img02.gif Binary files differnew file mode 100644 index 000000000..45a3ae976 --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/+package+/static/images/img02.gif diff --git a/pyramid/paster_templates/pylons_basic/+package+/static/images/img03.gif b/pyramid/paster_templates/pylons_basic/+package+/static/images/img03.gif Binary files differnew file mode 100644 index 000000000..d92ea38f9 --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/+package+/static/images/img03.gif diff --git a/pyramid/paster_templates/pylons_basic/+package+/static/images/img04.gif b/pyramid/paster_templates/pylons_basic/+package+/static/images/img04.gif Binary files differnew file mode 100644 index 000000000..950c4af9d --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/+package+/static/images/img04.gif diff --git a/pyramid/paster_templates/pylons_basic/+package+/static/images/spacer.gif b/pyramid/paster_templates/pylons_basic/+package+/static/images/spacer.gif Binary files differnew file mode 100644 index 000000000..5bfd67a2d --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/+package+/static/images/spacer.gif diff --git a/pyramid/paster_templates/pylons_basic/+package+/static/templatelicense.txt b/pyramid/paster_templates/pylons_basic/+package+/static/templatelicense.txt new file mode 100644 index 000000000..ccb6b06ab --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/+package+/static/templatelicense.txt @@ -0,0 +1,243 @@ +Creative Commons </> + +Creative Commons Legal Code + +*Attribution 2.5* + +CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE +LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN +ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION +ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE +INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM +ITS USE. + +/License/ + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE +RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS +AND CONDITIONS. + +*1. Definitions* + + 1. *"Collective Work"* means a work, such as a periodical issue, + anthology or encyclopedia, in which the Work in its entirety in + unmodified form, along with a number of other contributions, + constituting separate and independent works in themselves, are + assembled into a collective whole. A work that constitutes a + Collective Work will not be considered a Derivative Work (as + defined below) for the purposes of this License. + 2. *"Derivative Work"* means a work based upon the Work or upon the + Work and other pre-existing works, such as a translation, musical + arrangement, dramatization, fictionalization, motion picture + version, sound recording, art reproduction, abridgment, + condensation, or any other form in which the Work may be recast, + transformed, or adapted, except that a work that constitutes a + Collective Work will not be considered a Derivative Work for the + purpose of this License. For the avoidance of doubt, where the + Work is a musical composition or sound recording, the + synchronization of the Work in timed-relation with a moving image + ("synching") will be considered a Derivative Work for the purpose + of this License. + 3. *"Licensor"* means the individual or entity that offers the Work + under the terms of this License. + 4. *"Original Author"* means the individual or entity who created the + Work. + 5. *"Work"* means the copyrightable work of authorship offered under + the terms of this License. + 6. *"You"* means an individual or entity exercising rights under this + License who has not previously violated the terms of this License + with respect to the Work, or who has received express permission + from the Licensor to exercise rights under this License despite a + previous violation. + +*2. Fair Use Rights.* Nothing in this license is intended to reduce, +limit, or restrict any rights arising from fair use, first sale or other +limitations on the exclusive rights of the copyright owner under +copyright law or other applicable laws. + +*3. License Grant.* Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + 1. to reproduce the Work, to incorporate the Work into one or more + Collective Works, and to reproduce the Work as incorporated in the + Collective Works; + 2. to create and reproduce Derivative Works; + 3. to distribute copies or phonorecords of, display publicly, perform + publicly, and perform publicly by means of a digital audio + transmission the Work including as incorporated in Collective Works; + 4. to distribute copies or phonorecords of, display publicly, perform + publicly, and perform publicly by means of a digital audio + transmission Derivative Works. + 5. + + For the avoidance of doubt, where the work is a musical composition: + + 1. *Performance Royalties Under Blanket Licenses*. Licensor + waives the exclusive right to collect, whether individually + or via a performance rights society (e.g. ASCAP, BMI, + SESAC), royalties for the public performance or public + digital performance (e.g. webcast) of the Work. + 2. *Mechanical Rights and Statutory Royalties*. Licensor waives + the exclusive right to collect, whether individually or via + a music rights agency or designated agent (e.g. Harry Fox + Agency), royalties for any phonorecord You create from the + Work ("cover version") and distribute, subject to the + compulsory license created by 17 USC Section 115 of the US + Copyright Act (or the equivalent in other jurisdictions). + 6. *Webcasting Rights and Statutory Royalties*. For the avoidance of + doubt, where the Work is a sound recording, Licensor waives the + exclusive right to collect, whether individually or via a + performance-rights society (e.g. SoundExchange), royalties for the + public digital performance (e.g. webcast) of the Work, subject to + the compulsory license created by 17 USC Section 114 of the US + Copyright Act (or the equivalent in other jurisdictions). + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights +in other media and formats. All rights not expressly granted by Licensor +are hereby reserved. + +*4. Restrictions.*The license granted in Section 3 above is expressly +made subject to and limited by the following restrictions: + + 1. You may distribute, publicly display, publicly perform, or + publicly digitally perform the Work only under the terms of this + License, and You must include a copy of, or the Uniform Resource + Identifier for, this License with every copy or phonorecord of the + Work You distribute, publicly display, publicly perform, or + publicly digitally perform. You may not offer or impose any terms + on the Work that alter or restrict the terms of this License or + the recipients' exercise of the rights granted hereunder. You may + not sublicense the Work. You must keep intact all notices that + refer to this License and to the disclaimer of warranties. You may + not distribute, publicly display, publicly perform, or publicly + digitally perform the Work with any technological measures that + control access or use of the Work in a manner inconsistent with + the terms of this License Agreement. The above applies to the Work + as incorporated in a Collective Work, but this does not require + the Collective Work apart from the Work itself to be made subject + to the terms of this License. If You create a Collective Work, + upon notice from any Licensor You must, to the extent practicable, + remove from the Collective Work any credit as required by clause + 4(b), as requested. If You create a Derivative Work, upon notice + from any Licensor You must, to the extent practicable, remove from + the Derivative Work any credit as required by clause 4(b), as + requested. + 2. If you distribute, publicly display, publicly perform, or publicly + digitally perform the Work or any Derivative Works or Collective + Works, You must keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) + the name of the Original Author (or pseudonym, if applicable) if + supplied, and/or (ii) if the Original Author and/or Licensor + designate another party or parties (e.g. a sponsor institute, + publishing entity, journal) for attribution in Licensor's + copyright notice, terms of service or by other reasonable means, + the name of such party or parties; the title of the Work if + supplied; to the extent reasonably practicable, the Uniform + Resource Identifier, if any, that Licensor specifies to be + associated with the Work, unless such URI does not refer to the + copyright notice or licensing information for the Work; and in the + case of a Derivative Work, a credit identifying the use of the + Work in the Derivative Work (e.g., "French translation of the Work + by Original Author," or "Screenplay based on original Work by + Original Author"). Such credit may be implemented in any + reasonable manner; provided, however, that in the case of a + Derivative Work or Collective Work, at a minimum such credit will + appear where any other comparable authorship credit appears and in + a manner at least as prominent as such other comparable authorship + credit. + +*5. Representations, Warranties and Disclaimer* + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE +EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +*6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY +APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL +THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY +DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF +LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +*7. Termination* + + 1. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Derivative Works or + Collective Works from You under this License, however, will not + have their licenses terminated provided such individuals or + entities remain in full compliance with those licenses. Sections + 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + 2. Subject to the above terms and conditions, the license granted + here is perpetual (for the duration of the applicable copyright in + the Work). Notwithstanding the above, Licensor reserves the right + to release the Work under different license terms or to stop + distributing the Work at any time; provided, however that any such + election will not serve to withdraw this License (or any other + license that has been, or is required to be, granted under the + terms of this License), and this License will continue in full + force and effect unless terminated as stated above. + +*8. Miscellaneous* + + 1. Each time You distribute or publicly digitally perform the Work or + a Collective Work, the Licensor offers to the recipient a license + to the Work on the same terms and conditions as the license + granted to You under this License. + 2. Each time You distribute or publicly digitally perform a + Derivative Work, Licensor offers to the recipient a license to the + original Work on the same terms and conditions as the license + granted to You under this License. + 3. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability + of the remainder of the terms of this License, and without further + action by the parties to this agreement, such provision shall be + reformed to the minimum extent necessary to make such provision + valid and enforceable. + 4. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in + writing and signed by the party to be charged with such waiver or + consent. + 5. This License constitutes the entire agreement between the parties + with respect to the Work licensed here. There are no + understandings, agreements or representations with respect to the + Work not specified here. Licensor shall not be bound by any + additional provisions that may appear in any communication from + You. This License may not be modified without the mutual written + agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty +whatsoever in connection with the Work. Creative Commons will not be +liable to You or any party on any legal theory for any damages +whatsoever, including without limitation any general, special, +incidental or consequential damages arising in connection to this +license. Notwithstanding the foregoing two (2) sentences, if Creative +Commons has expressly identified itself as the Licensor hereunder, it +shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work +is licensed under the CCPL, neither party will use the trademark +"Creative Commons" or any related trademark or logo of Creative Commons +without the prior written consent of Creative Commons. Any permitted use +will be in compliance with Creative Commons' then-current trademark +usage guidelines, as may be published on its website or otherwise made +available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/ +<http://creativecommons.org>. + +« Back to Commons Deed <./> diff --git a/pyramid/paster_templates/pylons_basic/+package+/templates/mytemplate.mak b/pyramid/paster_templates/pylons_basic/+package+/templates/mytemplate.mak new file mode 100644 index 000000000..035cc2f78 --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/+package+/templates/mytemplate.mak @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:tal="http://xml.zope.org/namespaces/tal"> +<head> +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>${project} Application</title> +<meta name="keywords" content="python web application" /> +<meta name="description" content="Pylons web application" /> +<link href="${request.application_url}/static/default.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<!-- start header --> +<div id="logo"> + <h2><code>${project}</code>, a <code>Pylons</code> application</h2> +</div> +<div id="header"> + <div id="menu"> + </div> +</div> +<!-- end header --> +<div id="wrapper"> + <!-- start page --> + <div id="page"> + <!-- start content --> + <div id="content"> + <div class="post"> + <h1 class="title">Welcome to <code>${project}</code>, an + application generated by the <a + href="http://pylonshq.com">Pylons</a> web + application framework.</h1> + </div> + </div> + <!-- end content --> + <!-- start sidebar --> + <div id="sidebar"></div> + <!-- end sidebar --> + <div style="clear: both;"> </div> + </div> +</div> +<!-- end page --> +<!-- start footer --> +<div id="footer"> + <p id="legal">( c ) 2008. All Rights Reserved. Template design + by <a href="http://www.freecsstemplates.org/">Free CSS + Templates</a>.</p> +</div> +<!-- end footer --> +</body> +</html> diff --git a/pyramid/paster_templates/pylons_basic/+package+/tests.py_tmpl b/pyramid/paster_templates/pylons_basic/+package+/tests.py_tmpl new file mode 100644 index 000000000..d98bee355 --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/+package+/tests.py_tmpl @@ -0,0 +1,24 @@ +import unittest + +from pyramid.configuration import Configurator + +class MyControllerTests(unittest.TestCase): + def setUp(self): + self.config = Configurator() + self.config.begin() + + def tearDown(self): + self.config.end() + + def _makeOne(self, request): + from {{package}}.handlers import MyHandler + return MyHandler(request) + + def test_index(self): + request = DummyRequest() + controller = self._makeOne(request) + info = controller.index() + self.assertEqual(info['project'], '{{project}}') + +class DummyRequest(object): + pass diff --git a/pyramid/paster_templates/pylons_basic/CHANGES.txt_tmpl b/pyramid/paster_templates/pylons_basic/CHANGES.txt_tmpl new file mode 100644 index 000000000..35a34f332 --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/CHANGES.txt_tmpl @@ -0,0 +1,4 @@ +0.0 +--- + +- Initial version diff --git a/pyramid/paster_templates/pylons_basic/README.txt_tmpl b/pyramid/paster_templates/pylons_basic/README.txt_tmpl new file mode 100644 index 000000000..0ddebfc3e --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/README.txt_tmpl @@ -0,0 +1,4 @@ +{{project}} README + + + diff --git a/pyramid/paster_templates/pylons_basic/development.ini_tmpl b/pyramid/paster_templates/pylons_basic/development.ini_tmpl new file mode 100644 index 000000000..d3c8b57c9 --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/development.ini_tmpl @@ -0,0 +1,28 @@ +[app:{{project}}] +use = egg:{{project}} +reload_templates = true +mako.directories = {{package}}:templates +debug_authorization = false +debug_notfound = false +debug_templates = true +default_locale_name = en +session.type = file +session.data_dir = %(here)s/data/sessions/data +session.lock_dir = %(here)s/data/sessions/lock +session.key = {{project}} +session.secret = your_app_secret_string +cache.regions = default_term, second, short_term, long_term +cache.type = memory +cache.second.expire = 1 +cache.short_term.expire = 60 +cache.default_term.expire = 300 +cache.long_term.expire = 3600 + +[pipeline:main] +pipeline = egg:WebError#evalerror + {{project}} + +[server:main] +use = egg:Paste#http +host = 0.0.0.0 +port = 5000 diff --git a/pyramid/paster_templates/pylons_basic/setup.cfg_tmpl b/pyramid/paster_templates/pylons_basic/setup.cfg_tmpl new file mode 100644 index 000000000..5bec29823 --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/setup.cfg_tmpl @@ -0,0 +1,27 @@ +[nosetests] +match=^test +nocapture=1 +cover-package={{package}} +with-coverage=1 +cover-erase=1 + +[compile_catalog] +directory = {{package}}/locale +domain = {{project}} +statistics = true + +[extract_messages] +add_comments = TRANSLATORS: +output_file = {{package}}/locale/{{project}}.pot +width = 80 + +[init_catalog] +domain = {{project}} +input_file = {{package}}/locale/{{project}}.pot +output_dir = {{package}}/locale + +[update_catalog] +domain = {{project}} +input_file = {{package}}/locale/{{project}}.pot +output_dir = {{package}}/locale +previous = true diff --git a/pyramid/paster_templates/pylons_basic/setup.py_tmpl b/pyramid/paster_templates/pylons_basic/setup.py_tmpl new file mode 100644 index 000000000..baa57aa4e --- /dev/null +++ b/pyramid/paster_templates/pylons_basic/setup.py_tmpl @@ -0,0 +1,36 @@ +import os + +from setuptools import setup, find_packages + +here = os.path.abspath(os.path.dirname(__file__)) +README = open(os.path.join(here, 'README.txt')).read() +CHANGES = open(os.path.join(here, 'CHANGES.txt')).read() + +requires = ['pyramid', 'pyramid_beaker', 'WebError'] + +setup(name='{{project}}', + version='0.0', + description='{{project}}', + long_description=README + '\n\n' + CHANGES, + classifiers=[ + "Programming Language :: Python", + "Framework :: Pylons", + "Topic :: Internet :: WWW/HTTP", + "Topic :: Internet :: WWW/HTTP :: WSGI :: Application", + ], + author='', + author_email='', + url='', + keywords='web pylons', + packages=find_packages(), + include_package_data=True, + zip_safe=False, + install_requires=requires, + tests_require=requires, + test_suite="{{package}}", + entry_points = """\ + [paste.app_factory] + main = {{package}}:main + """ + ) + diff --git a/pyramid/paster_templates/pylons_minimal/+package+/__init__.py_tmpl b/pyramid/paster_templates/pylons_minimal/+package+/__init__.py_tmpl new file mode 100644 index 000000000..f47060997 --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/+package+/__init__.py_tmpl @@ -0,0 +1,21 @@ +from pyramid_beaker import session_factory_from_settings +from pyramid.personality.pylons import renderer_globals_factory_config + +def main(global_config, **settings): + """ This function returns a Pyramid WSGI application. + """ + from pyramid.configuration import Configurator + config = Configurator(settings=settings) + config.begin() + session_factory = session_factory_from_settings(settings) + config.set_session_factory(session_factory) + # XXX add caching setup + globals_factory = renderer_globals_factory_config(None) + config.set_renderer_globals_factory(globals_factory) + config.add_static_view('static', '{{package}}:static/') + config.add_handler('action', '/{action}', '{{package}}.handlers:MyHandler') + config.add_handler('home', '/', '{{package}}.handlers:MyHandler', + action='index') + config.end() + return config.make_wsgi_app() + diff --git a/pyramid/paster_templates/pylons_minimal/+package+/handlers.py_tmpl b/pyramid/paster_templates/pylons_minimal/+package+/handlers.py_tmpl new file mode 100644 index 000000000..be1202551 --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/+package+/handlers.py_tmpl @@ -0,0 +1,9 @@ +from pyramid.view import action + +class MyHandler(object): + def __init__(self, request): + self.request = request + + @action(renderer='mytemplate.mak') + def index(self): + return {'project':'{{project}}'} diff --git a/pyramid/paster_templates/pylons_minimal/+package+/static/default.css b/pyramid/paster_templates/pylons_minimal/+package+/static/default.css new file mode 100644 index 000000000..41b3debde --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/+package+/static/default.css @@ -0,0 +1,380 @@ +/* +Design by Free CSS Templates +http://www.freecsstemplates.org +Released for free under a Creative Commons Attribution 2.5 License +*/ + +body { + margin: 0; + padding: 0; + background: url(images/img01.gif) repeat-x left top; + font-size: 13px; + font-family: "Trebuchet MS", Georgia, "Times New Roman", Times, serif; + text-align: justify; + color: #FFFFFF; +} + +h1, h2, h3 { + margin: 0; + text-transform: lowercase; + font-weight: normal; + color: #FFFFFF; +} + +h1 { + letter-spacing: -1px; + font-size: 32px; +} + +h2 { + font-size: 23px; +} + +p, ul, ol { + margin: 0 0 2em 0; + text-align: justify; + line-height: 26px; +} + +a:link { + color: #8BD80E; +} + +a:hover, a:active { + text-decoration: none; + color: #8BD80E; +} + +a:visited { + color: #8BD80E; +} + +img { + border: none; +} + +img.left { + float: left; + margin-right: 15px; +} + +img.right { + float: right; + margin-left: 15px; +} + +/* Form */ + +form { + margin: 0; + padding: 0; +} + +fieldset { + margin: 0; + padding: 0; + border: none; +} + +legend { + display: none; +} + +input, textarea, select { + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + font-size: 13px; + color: #333333; +} + +#wrapper { + margin: 0; + padding: 0; + background: #000000; +} + +/* Header */ + +#header { + width: 713px; + margin: 0 auto; + height: 42px; +} + +/* Menu */ + +#menu { + float: left; + width: 713px; + height: 50px; + background: url(images/img02.gif) no-repeat left top; +} + +#menu ul { + margin: 0; + padding: 0px 0 0 10px; + list-style: none; + line-height: normal; +} + +#menu li { + display: block; + float: left; +} + +#menu a { + display: block; + float: left; + background: url(images/img04.gif) no-repeat right 55%; + margin-top: 5px; + margin-right: 3px; + padding: 8px 17px; + text-decoration: none; + font-size: 13px; + color: #000000; +} + +#menu a:hover { + color: #000000; +} + +#menu .current_page_item a { + color: #000000; +} + +/** LOGO */ + +#logo { + width: 713px; + height: 80px; + margin: 0 auto; +} + +#logo h1, #logo h2 { + float: left; + margin: 0; + padding: 30px 0 0 0px; + line-height: normal; +} + +#logo h1 { + font-family: Georgia, "Times New Roman", Times, serif; + font-size:40px; +} + +#logo h1 a { + text-decoration: none; + color: #4C4C4C; +} + +#logo h1 a:hover { text-decoration: underline; } + +#logo h2 { + float: left; + padding: 45px 0 0 18px; + font: 18px Georgia, "Times New Roman", Times, serif; + color: #8BD80E; +} + +#logo p a { + text-decoration: none; + color: #8BD80E; +} + +#logo p a:hover { text-decoration: underline; } + + + +/* Page */ + +#page { + width: 663px; + margin: 0 auto; + background: #4C4C4C url(images/img03.gif) no-repeat left bottom; + padding: 0 25px; +} + +/* Content */ + +#content { + float: left; + width: 410px; + +} + +/* Post */ + +.post { + padding: 15px 0px; + margin-bottom: 20px; +} + +.post .title { + margin-bottom: 20px; + padding-bottom: 5px; +} + +.post h1 { + padding: 0px 0 0 0px; + background: url(images/img08.jpg) no-repeat left top; + font-size: 24px; + color: #FFFFFF; +} + +.post h2 { + padding: 0px 0 0 0px; + font-size: 22px; + color: #FFFFFF; +} + +.post .entry { +} + +.post .meta { + padding: 15px 15px 30px 0px; + font-family: Arial, Helvetica, sans-serif; + font-size: 11px; +} + +.post .meta p { + margin: 0; + padding-top: 15px; + line-height: normal; + color: #FFFFFF; +} + +.post .meta .byline { + float: left; +} + +.post .meta .links { + float: right; +} + +.post .meta .more { + padding: 0 10px 0 18px; +} + +.post .meta .comments { +} + +.post .meta b { + display: none; +} + + +/* Sidebar */ + +#sidebar { + width: 210px; + float: right; + margin: 0; + padding: 0; +} + +#sidebar ul { + margin: 0; + padding: 0; + list-style: none; +} + +#sidebar li { + margin-bottom: 40px; +} + +#sidebar li ul { +} + +#sidebar li li { + margin: 0; +} + +#sidebar h2 { + width: 250px; + padding: 8px 0 0 0px; + margin-bottom: 10px; + background: url(images/img07.jpg) no-repeat left top; + font-size: 20px; + color: #FFFFFF; +} + +/* Search */ + +#search { + +} + +#search h2 { + margin-bottom: 20px; +} + +#s { + width: 140px; + margin-right: 5px; + padding: 3px; + border: 1px solid #BED99C; +} + +#x { + padding: 3px; + border: none; + background: #8BD80E; + text-transform: lowercase; + font-size: 11px; + color: #FFFFFF; +} + +/* Boxes */ + +.box1 { + padding: 20px; +} + +.box2 { + color: #BABABA; +} + +.box2 h2 { + margin-bottom: 15px; + font-size: 16px; + color: #FFFFFF; +} + +.box2 ul { + margin: 0; + padding: 0; + list-style: none; +} + +.box2 a:link, .box2 a:hover, .box2 a:active, .box2 a:visited { + color: #EDEDED; +} + +/* Footer */ +#footer-wrap { +} + +#footer { + margin: 0 auto; + padding: 20px 0 10px 0; + background: #000000; +} + +html>body #footer { + height: auto; +} + +#footer p { + font-size: 11px; +} + +#legal { + clear: both; + padding-top: 17px; + text-align: center; + color: #FFFFFF; +} + +#legal a { + font-weight: normal; + color: #FFFFFF; +} diff --git a/pyramid/paster_templates/pylons_minimal/+package+/static/images/img01.gif b/pyramid/paster_templates/pylons_minimal/+package+/static/images/img01.gif Binary files differnew file mode 100644 index 000000000..5f082bd99 --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/+package+/static/images/img01.gif diff --git a/pyramid/paster_templates/pylons_minimal/+package+/static/images/img02.gif b/pyramid/paster_templates/pylons_minimal/+package+/static/images/img02.gif Binary files differnew file mode 100644 index 000000000..45a3ae976 --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/+package+/static/images/img02.gif diff --git a/pyramid/paster_templates/pylons_minimal/+package+/static/images/img03.gif b/pyramid/paster_templates/pylons_minimal/+package+/static/images/img03.gif Binary files differnew file mode 100644 index 000000000..d92ea38f9 --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/+package+/static/images/img03.gif diff --git a/pyramid/paster_templates/pylons_minimal/+package+/static/images/img04.gif b/pyramid/paster_templates/pylons_minimal/+package+/static/images/img04.gif Binary files differnew file mode 100644 index 000000000..950c4af9d --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/+package+/static/images/img04.gif diff --git a/pyramid/paster_templates/pylons_minimal/+package+/static/images/spacer.gif b/pyramid/paster_templates/pylons_minimal/+package+/static/images/spacer.gif Binary files differnew file mode 100644 index 000000000..5bfd67a2d --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/+package+/static/images/spacer.gif diff --git a/pyramid/paster_templates/pylons_minimal/+package+/static/templatelicense.txt b/pyramid/paster_templates/pylons_minimal/+package+/static/templatelicense.txt new file mode 100644 index 000000000..ccb6b06ab --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/+package+/static/templatelicense.txt @@ -0,0 +1,243 @@ +Creative Commons </> + +Creative Commons Legal Code + +*Attribution 2.5* + +CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE +LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN +ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION +ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE +INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM +ITS USE. + +/License/ + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE +RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS +AND CONDITIONS. + +*1. Definitions* + + 1. *"Collective Work"* means a work, such as a periodical issue, + anthology or encyclopedia, in which the Work in its entirety in + unmodified form, along with a number of other contributions, + constituting separate and independent works in themselves, are + assembled into a collective whole. A work that constitutes a + Collective Work will not be considered a Derivative Work (as + defined below) for the purposes of this License. + 2. *"Derivative Work"* means a work based upon the Work or upon the + Work and other pre-existing works, such as a translation, musical + arrangement, dramatization, fictionalization, motion picture + version, sound recording, art reproduction, abridgment, + condensation, or any other form in which the Work may be recast, + transformed, or adapted, except that a work that constitutes a + Collective Work will not be considered a Derivative Work for the + purpose of this License. For the avoidance of doubt, where the + Work is a musical composition or sound recording, the + synchronization of the Work in timed-relation with a moving image + ("synching") will be considered a Derivative Work for the purpose + of this License. + 3. *"Licensor"* means the individual or entity that offers the Work + under the terms of this License. + 4. *"Original Author"* means the individual or entity who created the + Work. + 5. *"Work"* means the copyrightable work of authorship offered under + the terms of this License. + 6. *"You"* means an individual or entity exercising rights under this + License who has not previously violated the terms of this License + with respect to the Work, or who has received express permission + from the Licensor to exercise rights under this License despite a + previous violation. + +*2. Fair Use Rights.* Nothing in this license is intended to reduce, +limit, or restrict any rights arising from fair use, first sale or other +limitations on the exclusive rights of the copyright owner under +copyright law or other applicable laws. + +*3. License Grant.* Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + 1. to reproduce the Work, to incorporate the Work into one or more + Collective Works, and to reproduce the Work as incorporated in the + Collective Works; + 2. to create and reproduce Derivative Works; + 3. to distribute copies or phonorecords of, display publicly, perform + publicly, and perform publicly by means of a digital audio + transmission the Work including as incorporated in Collective Works; + 4. to distribute copies or phonorecords of, display publicly, perform + publicly, and perform publicly by means of a digital audio + transmission Derivative Works. + 5. + + For the avoidance of doubt, where the work is a musical composition: + + 1. *Performance Royalties Under Blanket Licenses*. Licensor + waives the exclusive right to collect, whether individually + or via a performance rights society (e.g. ASCAP, BMI, + SESAC), royalties for the public performance or public + digital performance (e.g. webcast) of the Work. + 2. *Mechanical Rights and Statutory Royalties*. Licensor waives + the exclusive right to collect, whether individually or via + a music rights agency or designated agent (e.g. Harry Fox + Agency), royalties for any phonorecord You create from the + Work ("cover version") and distribute, subject to the + compulsory license created by 17 USC Section 115 of the US + Copyright Act (or the equivalent in other jurisdictions). + 6. *Webcasting Rights and Statutory Royalties*. For the avoidance of + doubt, where the Work is a sound recording, Licensor waives the + exclusive right to collect, whether individually or via a + performance-rights society (e.g. SoundExchange), royalties for the + public digital performance (e.g. webcast) of the Work, subject to + the compulsory license created by 17 USC Section 114 of the US + Copyright Act (or the equivalent in other jurisdictions). + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights +in other media and formats. All rights not expressly granted by Licensor +are hereby reserved. + +*4. Restrictions.*The license granted in Section 3 above is expressly +made subject to and limited by the following restrictions: + + 1. You may distribute, publicly display, publicly perform, or + publicly digitally perform the Work only under the terms of this + License, and You must include a copy of, or the Uniform Resource + Identifier for, this License with every copy or phonorecord of the + Work You distribute, publicly display, publicly perform, or + publicly digitally perform. You may not offer or impose any terms + on the Work that alter or restrict the terms of this License or + the recipients' exercise of the rights granted hereunder. You may + not sublicense the Work. You must keep intact all notices that + refer to this License and to the disclaimer of warranties. You may + not distribute, publicly display, publicly perform, or publicly + digitally perform the Work with any technological measures that + control access or use of the Work in a manner inconsistent with + the terms of this License Agreement. The above applies to the Work + as incorporated in a Collective Work, but this does not require + the Collective Work apart from the Work itself to be made subject + to the terms of this License. If You create a Collective Work, + upon notice from any Licensor You must, to the extent practicable, + remove from the Collective Work any credit as required by clause + 4(b), as requested. If You create a Derivative Work, upon notice + from any Licensor You must, to the extent practicable, remove from + the Derivative Work any credit as required by clause 4(b), as + requested. + 2. If you distribute, publicly display, publicly perform, or publicly + digitally perform the Work or any Derivative Works or Collective + Works, You must keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) + the name of the Original Author (or pseudonym, if applicable) if + supplied, and/or (ii) if the Original Author and/or Licensor + designate another party or parties (e.g. a sponsor institute, + publishing entity, journal) for attribution in Licensor's + copyright notice, terms of service or by other reasonable means, + the name of such party or parties; the title of the Work if + supplied; to the extent reasonably practicable, the Uniform + Resource Identifier, if any, that Licensor specifies to be + associated with the Work, unless such URI does not refer to the + copyright notice or licensing information for the Work; and in the + case of a Derivative Work, a credit identifying the use of the + Work in the Derivative Work (e.g., "French translation of the Work + by Original Author," or "Screenplay based on original Work by + Original Author"). Such credit may be implemented in any + reasonable manner; provided, however, that in the case of a + Derivative Work or Collective Work, at a minimum such credit will + appear where any other comparable authorship credit appears and in + a manner at least as prominent as such other comparable authorship + credit. + +*5. Representations, Warranties and Disclaimer* + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE +EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +*6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY +APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL +THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY +DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF +LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +*7. Termination* + + 1. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Derivative Works or + Collective Works from You under this License, however, will not + have their licenses terminated provided such individuals or + entities remain in full compliance with those licenses. Sections + 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + 2. Subject to the above terms and conditions, the license granted + here is perpetual (for the duration of the applicable copyright in + the Work). Notwithstanding the above, Licensor reserves the right + to release the Work under different license terms or to stop + distributing the Work at any time; provided, however that any such + election will not serve to withdraw this License (or any other + license that has been, or is required to be, granted under the + terms of this License), and this License will continue in full + force and effect unless terminated as stated above. + +*8. Miscellaneous* + + 1. Each time You distribute or publicly digitally perform the Work or + a Collective Work, the Licensor offers to the recipient a license + to the Work on the same terms and conditions as the license + granted to You under this License. + 2. Each time You distribute or publicly digitally perform a + Derivative Work, Licensor offers to the recipient a license to the + original Work on the same terms and conditions as the license + granted to You under this License. + 3. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability + of the remainder of the terms of this License, and without further + action by the parties to this agreement, such provision shall be + reformed to the minimum extent necessary to make such provision + valid and enforceable. + 4. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in + writing and signed by the party to be charged with such waiver or + consent. + 5. This License constitutes the entire agreement between the parties + with respect to the Work licensed here. There are no + understandings, agreements or representations with respect to the + Work not specified here. Licensor shall not be bound by any + additional provisions that may appear in any communication from + You. This License may not be modified without the mutual written + agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty +whatsoever in connection with the Work. Creative Commons will not be +liable to You or any party on any legal theory for any damages +whatsoever, including without limitation any general, special, +incidental or consequential damages arising in connection to this +license. Notwithstanding the foregoing two (2) sentences, if Creative +Commons has expressly identified itself as the Licensor hereunder, it +shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work +is licensed under the CCPL, neither party will use the trademark +"Creative Commons" or any related trademark or logo of Creative Commons +without the prior written consent of Creative Commons. Any permitted use +will be in compliance with Creative Commons' then-current trademark +usage guidelines, as may be published on its website or otherwise made +available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/ +<http://creativecommons.org>. + +« Back to Commons Deed <./> diff --git a/pyramid/paster_templates/pylons_minimal/+package+/templates/mytemplate.mak b/pyramid/paster_templates/pylons_minimal/+package+/templates/mytemplate.mak new file mode 100644 index 000000000..035cc2f78 --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/+package+/templates/mytemplate.mak @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:tal="http://xml.zope.org/namespaces/tal"> +<head> +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>${project} Application</title> +<meta name="keywords" content="python web application" /> +<meta name="description" content="Pylons web application" /> +<link href="${request.application_url}/static/default.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<!-- start header --> +<div id="logo"> + <h2><code>${project}</code>, a <code>Pylons</code> application</h2> +</div> +<div id="header"> + <div id="menu"> + </div> +</div> +<!-- end header --> +<div id="wrapper"> + <!-- start page --> + <div id="page"> + <!-- start content --> + <div id="content"> + <div class="post"> + <h1 class="title">Welcome to <code>${project}</code>, an + application generated by the <a + href="http://pylonshq.com">Pylons</a> web + application framework.</h1> + </div> + </div> + <!-- end content --> + <!-- start sidebar --> + <div id="sidebar"></div> + <!-- end sidebar --> + <div style="clear: both;"> </div> + </div> +</div> +<!-- end page --> +<!-- start footer --> +<div id="footer"> + <p id="legal">( c ) 2008. All Rights Reserved. Template design + by <a href="http://www.freecsstemplates.org/">Free CSS + Templates</a>.</p> +</div> +<!-- end footer --> +</body> +</html> diff --git a/pyramid/paster_templates/pylons_minimal/+package+/tests.py_tmpl b/pyramid/paster_templates/pylons_minimal/+package+/tests.py_tmpl new file mode 100644 index 000000000..d98bee355 --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/+package+/tests.py_tmpl @@ -0,0 +1,24 @@ +import unittest + +from pyramid.configuration import Configurator + +class MyControllerTests(unittest.TestCase): + def setUp(self): + self.config = Configurator() + self.config.begin() + + def tearDown(self): + self.config.end() + + def _makeOne(self, request): + from {{package}}.handlers import MyHandler + return MyHandler(request) + + def test_index(self): + request = DummyRequest() + controller = self._makeOne(request) + info = controller.index() + self.assertEqual(info['project'], '{{project}}') + +class DummyRequest(object): + pass diff --git a/pyramid/paster_templates/pylons_minimal/CHANGES.txt_tmpl b/pyramid/paster_templates/pylons_minimal/CHANGES.txt_tmpl new file mode 100644 index 000000000..35a34f332 --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/CHANGES.txt_tmpl @@ -0,0 +1,4 @@ +0.0 +--- + +- Initial version diff --git a/pyramid/paster_templates/pylons_minimal/README.txt_tmpl b/pyramid/paster_templates/pylons_minimal/README.txt_tmpl new file mode 100644 index 000000000..0ddebfc3e --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/README.txt_tmpl @@ -0,0 +1,4 @@ +{{project}} README + + + diff --git a/pyramid/paster_templates/pylons_minimal/development.ini_tmpl b/pyramid/paster_templates/pylons_minimal/development.ini_tmpl new file mode 100644 index 000000000..d3c8b57c9 --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/development.ini_tmpl @@ -0,0 +1,28 @@ +[app:{{project}}] +use = egg:{{project}} +reload_templates = true +mako.directories = {{package}}:templates +debug_authorization = false +debug_notfound = false +debug_templates = true +default_locale_name = en +session.type = file +session.data_dir = %(here)s/data/sessions/data +session.lock_dir = %(here)s/data/sessions/lock +session.key = {{project}} +session.secret = your_app_secret_string +cache.regions = default_term, second, short_term, long_term +cache.type = memory +cache.second.expire = 1 +cache.short_term.expire = 60 +cache.default_term.expire = 300 +cache.long_term.expire = 3600 + +[pipeline:main] +pipeline = egg:WebError#evalerror + {{project}} + +[server:main] +use = egg:Paste#http +host = 0.0.0.0 +port = 5000 diff --git a/pyramid/paster_templates/pylons_minimal/setup.cfg_tmpl b/pyramid/paster_templates/pylons_minimal/setup.cfg_tmpl new file mode 100644 index 000000000..5bec29823 --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/setup.cfg_tmpl @@ -0,0 +1,27 @@ +[nosetests] +match=^test +nocapture=1 +cover-package={{package}} +with-coverage=1 +cover-erase=1 + +[compile_catalog] +directory = {{package}}/locale +domain = {{project}} +statistics = true + +[extract_messages] +add_comments = TRANSLATORS: +output_file = {{package}}/locale/{{project}}.pot +width = 80 + +[init_catalog] +domain = {{project}} +input_file = {{package}}/locale/{{project}}.pot +output_dir = {{package}}/locale + +[update_catalog] +domain = {{project}} +input_file = {{package}}/locale/{{project}}.pot +output_dir = {{package}}/locale +previous = true diff --git a/pyramid/paster_templates/pylons_minimal/setup.py_tmpl b/pyramid/paster_templates/pylons_minimal/setup.py_tmpl new file mode 100644 index 000000000..baa57aa4e --- /dev/null +++ b/pyramid/paster_templates/pylons_minimal/setup.py_tmpl @@ -0,0 +1,36 @@ +import os + +from setuptools import setup, find_packages + +here = os.path.abspath(os.path.dirname(__file__)) +README = open(os.path.join(here, 'README.txt')).read() +CHANGES = open(os.path.join(here, 'CHANGES.txt')).read() + +requires = ['pyramid', 'pyramid_beaker', 'WebError'] + +setup(name='{{project}}', + version='0.0', + description='{{project}}', + long_description=README + '\n\n' + CHANGES, + classifiers=[ + "Programming Language :: Python", + "Framework :: Pylons", + "Topic :: Internet :: WWW/HTTP", + "Topic :: Internet :: WWW/HTTP :: WSGI :: Application", + ], + author='', + author_email='', + url='', + keywords='web pylons', + packages=find_packages(), + include_package_data=True, + zip_safe=False, + install_requires=requires, + tests_require=requires, + test_suite="{{package}}", + entry_points = """\ + [paste.app_factory] + main = {{package}}:main + """ + ) + diff --git a/pyramid/paster_templates/pylons_sqla/+package+/__init__.py_tmpl b/pyramid/paster_templates/pylons_sqla/+package+/__init__.py_tmpl new file mode 100644 index 000000000..cf26cd0ea --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/+package+/__init__.py_tmpl @@ -0,0 +1,38 @@ +from pyramid_beaker import session_factory_from_settings +from pyramid.personality.pylons import renderer_globals_factory_config + +def main(global_config, **settings): + """ This function returns a Pylons WSGI application. + """ + from paste.deploy.converters import asbool + from pyramid.configuration import Configurator + from {{package}}.models import initialize_sql + db_string = settings.get('db_string') + if db_string is None: + raise ValueError("No 'db_string' value in application " + "configuration.") + initialize_sql(db_string, asbool(settings.get('db_echo'))) + config = Configurator(settings=settings) + config.begin() + session_factory = session_factory_from_settings(settings) + config.set_session_factory(session_factory) + # XXX add caching setup + globals_factory = renderer_globals_factory_config(None) + config.set_renderer_globals_factory(globals_factory) + config.add_static_view( + 'static', + '{{package}}:static/' + ) + config.add_handler( + 'main', + '/{action}', + '{{package}}.handlers:MyHandler', + ) + config.add_handler( + 'home', + '/', + '{{package}}.handlers:MyHandler', + action='index' + ) + config.end() + return config.make_wsgi_app() diff --git a/pyramid/paster_templates/pylons_sqla/+package+/handlers.py_tmpl b/pyramid/paster_templates/pylons_sqla/+package+/handlers.py_tmpl new file mode 100644 index 000000000..ce30a635e --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/+package+/handlers.py_tmpl @@ -0,0 +1,12 @@ +from pyramid.view import action + +from {{package}}.models import MyModel + +class MyHandler(object): + def __init__(self, request): + self.request = request + + @action(renderer='mytemplate.mak') + def index(self): + root = MyModel.by_name('root') + return {'root':root, 'project':'{{package}}'} diff --git a/pyramid/paster_templates/pylons_sqla/+package+/models.py b/pyramid/paster_templates/pylons_sqla/+package+/models.py new file mode 100644 index 000000000..092166902 --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/+package+/models.py @@ -0,0 +1,47 @@ +import transaction + +from sqlalchemy import create_engine +from sqlalchemy import Column +from sqlalchemy import Integer +from sqlalchemy import Unicode + +from sqlalchemy.exc import IntegrityError +from sqlalchemy.ext.declarative import declarative_base + +from sqlalchemy.orm import scoped_session +from sqlalchemy.orm import sessionmaker + +from zope.sqlalchemy import ZopeTransactionExtension + +DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension())) +Base = declarative_base() + +class MyModel(Base): + __tablename__ = 'models' + id = Column(Integer, primary_key=True) + name = Column(Unicode(255), unique=True) + value = Column(Integer) + + def __init__(self, name, value): + self.name = name + self.value = value + + @classmethod + def by_name(cls, name=None): + return DBSession.query(cls).filter(cls.name == name).first() + +def populate(): + model = MyModel(name=u'root', value=55) + DBSession.add(model) + DBSession.flush() + transaction.commit() + +def initialize_sql(db_string, db_echo=False): + engine = create_engine(db_string, echo=db_echo) + DBSession.configure(bind=engine) + Base.metadata.bind = engine + Base.metadata.create_all(engine) + try: + populate() + except IntegrityError: + pass diff --git a/pyramid/paster_templates/pylons_sqla/+package+/static/default.css b/pyramid/paster_templates/pylons_sqla/+package+/static/default.css new file mode 100644 index 000000000..41b3debde --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/+package+/static/default.css @@ -0,0 +1,380 @@ +/* +Design by Free CSS Templates +http://www.freecsstemplates.org +Released for free under a Creative Commons Attribution 2.5 License +*/ + +body { + margin: 0; + padding: 0; + background: url(images/img01.gif) repeat-x left top; + font-size: 13px; + font-family: "Trebuchet MS", Georgia, "Times New Roman", Times, serif; + text-align: justify; + color: #FFFFFF; +} + +h1, h2, h3 { + margin: 0; + text-transform: lowercase; + font-weight: normal; + color: #FFFFFF; +} + +h1 { + letter-spacing: -1px; + font-size: 32px; +} + +h2 { + font-size: 23px; +} + +p, ul, ol { + margin: 0 0 2em 0; + text-align: justify; + line-height: 26px; +} + +a:link { + color: #8BD80E; +} + +a:hover, a:active { + text-decoration: none; + color: #8BD80E; +} + +a:visited { + color: #8BD80E; +} + +img { + border: none; +} + +img.left { + float: left; + margin-right: 15px; +} + +img.right { + float: right; + margin-left: 15px; +} + +/* Form */ + +form { + margin: 0; + padding: 0; +} + +fieldset { + margin: 0; + padding: 0; + border: none; +} + +legend { + display: none; +} + +input, textarea, select { + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + font-size: 13px; + color: #333333; +} + +#wrapper { + margin: 0; + padding: 0; + background: #000000; +} + +/* Header */ + +#header { + width: 713px; + margin: 0 auto; + height: 42px; +} + +/* Menu */ + +#menu { + float: left; + width: 713px; + height: 50px; + background: url(images/img02.gif) no-repeat left top; +} + +#menu ul { + margin: 0; + padding: 0px 0 0 10px; + list-style: none; + line-height: normal; +} + +#menu li { + display: block; + float: left; +} + +#menu a { + display: block; + float: left; + background: url(images/img04.gif) no-repeat right 55%; + margin-top: 5px; + margin-right: 3px; + padding: 8px 17px; + text-decoration: none; + font-size: 13px; + color: #000000; +} + +#menu a:hover { + color: #000000; +} + +#menu .current_page_item a { + color: #000000; +} + +/** LOGO */ + +#logo { + width: 713px; + height: 80px; + margin: 0 auto; +} + +#logo h1, #logo h2 { + float: left; + margin: 0; + padding: 30px 0 0 0px; + line-height: normal; +} + +#logo h1 { + font-family: Georgia, "Times New Roman", Times, serif; + font-size:40px; +} + +#logo h1 a { + text-decoration: none; + color: #4C4C4C; +} + +#logo h1 a:hover { text-decoration: underline; } + +#logo h2 { + float: left; + padding: 45px 0 0 18px; + font: 18px Georgia, "Times New Roman", Times, serif; + color: #8BD80E; +} + +#logo p a { + text-decoration: none; + color: #8BD80E; +} + +#logo p a:hover { text-decoration: underline; } + + + +/* Page */ + +#page { + width: 663px; + margin: 0 auto; + background: #4C4C4C url(images/img03.gif) no-repeat left bottom; + padding: 0 25px; +} + +/* Content */ + +#content { + float: left; + width: 410px; + +} + +/* Post */ + +.post { + padding: 15px 0px; + margin-bottom: 20px; +} + +.post .title { + margin-bottom: 20px; + padding-bottom: 5px; +} + +.post h1 { + padding: 0px 0 0 0px; + background: url(images/img08.jpg) no-repeat left top; + font-size: 24px; + color: #FFFFFF; +} + +.post h2 { + padding: 0px 0 0 0px; + font-size: 22px; + color: #FFFFFF; +} + +.post .entry { +} + +.post .meta { + padding: 15px 15px 30px 0px; + font-family: Arial, Helvetica, sans-serif; + font-size: 11px; +} + +.post .meta p { + margin: 0; + padding-top: 15px; + line-height: normal; + color: #FFFFFF; +} + +.post .meta .byline { + float: left; +} + +.post .meta .links { + float: right; +} + +.post .meta .more { + padding: 0 10px 0 18px; +} + +.post .meta .comments { +} + +.post .meta b { + display: none; +} + + +/* Sidebar */ + +#sidebar { + width: 210px; + float: right; + margin: 0; + padding: 0; +} + +#sidebar ul { + margin: 0; + padding: 0; + list-style: none; +} + +#sidebar li { + margin-bottom: 40px; +} + +#sidebar li ul { +} + +#sidebar li li { + margin: 0; +} + +#sidebar h2 { + width: 250px; + padding: 8px 0 0 0px; + margin-bottom: 10px; + background: url(images/img07.jpg) no-repeat left top; + font-size: 20px; + color: #FFFFFF; +} + +/* Search */ + +#search { + +} + +#search h2 { + margin-bottom: 20px; +} + +#s { + width: 140px; + margin-right: 5px; + padding: 3px; + border: 1px solid #BED99C; +} + +#x { + padding: 3px; + border: none; + background: #8BD80E; + text-transform: lowercase; + font-size: 11px; + color: #FFFFFF; +} + +/* Boxes */ + +.box1 { + padding: 20px; +} + +.box2 { + color: #BABABA; +} + +.box2 h2 { + margin-bottom: 15px; + font-size: 16px; + color: #FFFFFF; +} + +.box2 ul { + margin: 0; + padding: 0; + list-style: none; +} + +.box2 a:link, .box2 a:hover, .box2 a:active, .box2 a:visited { + color: #EDEDED; +} + +/* Footer */ +#footer-wrap { +} + +#footer { + margin: 0 auto; + padding: 20px 0 10px 0; + background: #000000; +} + +html>body #footer { + height: auto; +} + +#footer p { + font-size: 11px; +} + +#legal { + clear: both; + padding-top: 17px; + text-align: center; + color: #FFFFFF; +} + +#legal a { + font-weight: normal; + color: #FFFFFF; +} diff --git a/pyramid/paster_templates/pylons_sqla/+package+/static/images/img01.gif b/pyramid/paster_templates/pylons_sqla/+package+/static/images/img01.gif Binary files differnew file mode 100644 index 000000000..5f082bd99 --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/+package+/static/images/img01.gif diff --git a/pyramid/paster_templates/pylons_sqla/+package+/static/images/img02.gif b/pyramid/paster_templates/pylons_sqla/+package+/static/images/img02.gif Binary files differnew file mode 100644 index 000000000..45a3ae976 --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/+package+/static/images/img02.gif diff --git a/pyramid/paster_templates/pylons_sqla/+package+/static/images/img03.gif b/pyramid/paster_templates/pylons_sqla/+package+/static/images/img03.gif Binary files differnew file mode 100644 index 000000000..d92ea38f9 --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/+package+/static/images/img03.gif diff --git a/pyramid/paster_templates/pylons_sqla/+package+/static/images/img04.gif b/pyramid/paster_templates/pylons_sqla/+package+/static/images/img04.gif Binary files differnew file mode 100644 index 000000000..950c4af9d --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/+package+/static/images/img04.gif diff --git a/pyramid/paster_templates/pylons_sqla/+package+/static/images/spacer.gif b/pyramid/paster_templates/pylons_sqla/+package+/static/images/spacer.gif Binary files differnew file mode 100644 index 000000000..5bfd67a2d --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/+package+/static/images/spacer.gif diff --git a/pyramid/paster_templates/pylons_sqla/+package+/static/templatelicense.txt b/pyramid/paster_templates/pylons_sqla/+package+/static/templatelicense.txt new file mode 100644 index 000000000..ccb6b06ab --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/+package+/static/templatelicense.txt @@ -0,0 +1,243 @@ +Creative Commons </> + +Creative Commons Legal Code + +*Attribution 2.5* + +CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE +LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN +ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION +ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE +INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM +ITS USE. + +/License/ + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE +RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS +AND CONDITIONS. + +*1. Definitions* + + 1. *"Collective Work"* means a work, such as a periodical issue, + anthology or encyclopedia, in which the Work in its entirety in + unmodified form, along with a number of other contributions, + constituting separate and independent works in themselves, are + assembled into a collective whole. A work that constitutes a + Collective Work will not be considered a Derivative Work (as + defined below) for the purposes of this License. + 2. *"Derivative Work"* means a work based upon the Work or upon the + Work and other pre-existing works, such as a translation, musical + arrangement, dramatization, fictionalization, motion picture + version, sound recording, art reproduction, abridgment, + condensation, or any other form in which the Work may be recast, + transformed, or adapted, except that a work that constitutes a + Collective Work will not be considered a Derivative Work for the + purpose of this License. For the avoidance of doubt, where the + Work is a musical composition or sound recording, the + synchronization of the Work in timed-relation with a moving image + ("synching") will be considered a Derivative Work for the purpose + of this License. + 3. *"Licensor"* means the individual or entity that offers the Work + under the terms of this License. + 4. *"Original Author"* means the individual or entity who created the + Work. + 5. *"Work"* means the copyrightable work of authorship offered under + the terms of this License. + 6. *"You"* means an individual or entity exercising rights under this + License who has not previously violated the terms of this License + with respect to the Work, or who has received express permission + from the Licensor to exercise rights under this License despite a + previous violation. + +*2. Fair Use Rights.* Nothing in this license is intended to reduce, +limit, or restrict any rights arising from fair use, first sale or other +limitations on the exclusive rights of the copyright owner under +copyright law or other applicable laws. + +*3. License Grant.* Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + 1. to reproduce the Work, to incorporate the Work into one or more + Collective Works, and to reproduce the Work as incorporated in the + Collective Works; + 2. to create and reproduce Derivative Works; + 3. to distribute copies or phonorecords of, display publicly, perform + publicly, and perform publicly by means of a digital audio + transmission the Work including as incorporated in Collective Works; + 4. to distribute copies or phonorecords of, display publicly, perform + publicly, and perform publicly by means of a digital audio + transmission Derivative Works. + 5. + + For the avoidance of doubt, where the work is a musical composition: + + 1. *Performance Royalties Under Blanket Licenses*. Licensor + waives the exclusive right to collect, whether individually + or via a performance rights society (e.g. ASCAP, BMI, + SESAC), royalties for the public performance or public + digital performance (e.g. webcast) of the Work. + 2. *Mechanical Rights and Statutory Royalties*. Licensor waives + the exclusive right to collect, whether individually or via + a music rights agency or designated agent (e.g. Harry Fox + Agency), royalties for any phonorecord You create from the + Work ("cover version") and distribute, subject to the + compulsory license created by 17 USC Section 115 of the US + Copyright Act (or the equivalent in other jurisdictions). + 6. *Webcasting Rights and Statutory Royalties*. For the avoidance of + doubt, where the Work is a sound recording, Licensor waives the + exclusive right to collect, whether individually or via a + performance-rights society (e.g. SoundExchange), royalties for the + public digital performance (e.g. webcast) of the Work, subject to + the compulsory license created by 17 USC Section 114 of the US + Copyright Act (or the equivalent in other jurisdictions). + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights +in other media and formats. All rights not expressly granted by Licensor +are hereby reserved. + +*4. Restrictions.*The license granted in Section 3 above is expressly +made subject to and limited by the following restrictions: + + 1. You may distribute, publicly display, publicly perform, or + publicly digitally perform the Work only under the terms of this + License, and You must include a copy of, or the Uniform Resource + Identifier for, this License with every copy or phonorecord of the + Work You distribute, publicly display, publicly perform, or + publicly digitally perform. You may not offer or impose any terms + on the Work that alter or restrict the terms of this License or + the recipients' exercise of the rights granted hereunder. You may + not sublicense the Work. You must keep intact all notices that + refer to this License and to the disclaimer of warranties. You may + not distribute, publicly display, publicly perform, or publicly + digitally perform the Work with any technological measures that + control access or use of the Work in a manner inconsistent with + the terms of this License Agreement. The above applies to the Work + as incorporated in a Collective Work, but this does not require + the Collective Work apart from the Work itself to be made subject + to the terms of this License. If You create a Collective Work, + upon notice from any Licensor You must, to the extent practicable, + remove from the Collective Work any credit as required by clause + 4(b), as requested. If You create a Derivative Work, upon notice + from any Licensor You must, to the extent practicable, remove from + the Derivative Work any credit as required by clause 4(b), as + requested. + 2. If you distribute, publicly display, publicly perform, or publicly + digitally perform the Work or any Derivative Works or Collective + Works, You must keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) + the name of the Original Author (or pseudonym, if applicable) if + supplied, and/or (ii) if the Original Author and/or Licensor + designate another party or parties (e.g. a sponsor institute, + publishing entity, journal) for attribution in Licensor's + copyright notice, terms of service or by other reasonable means, + the name of such party or parties; the title of the Work if + supplied; to the extent reasonably practicable, the Uniform + Resource Identifier, if any, that Licensor specifies to be + associated with the Work, unless such URI does not refer to the + copyright notice or licensing information for the Work; and in the + case of a Derivative Work, a credit identifying the use of the + Work in the Derivative Work (e.g., "French translation of the Work + by Original Author," or "Screenplay based on original Work by + Original Author"). Such credit may be implemented in any + reasonable manner; provided, however, that in the case of a + Derivative Work or Collective Work, at a minimum such credit will + appear where any other comparable authorship credit appears and in + a manner at least as prominent as such other comparable authorship + credit. + +*5. Representations, Warranties and Disclaimer* + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE +EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +*6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY +APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL +THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY +DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF +LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +*7. Termination* + + 1. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Derivative Works or + Collective Works from You under this License, however, will not + have their licenses terminated provided such individuals or + entities remain in full compliance with those licenses. Sections + 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + 2. Subject to the above terms and conditions, the license granted + here is perpetual (for the duration of the applicable copyright in + the Work). Notwithstanding the above, Licensor reserves the right + to release the Work under different license terms or to stop + distributing the Work at any time; provided, however that any such + election will not serve to withdraw this License (or any other + license that has been, or is required to be, granted under the + terms of this License), and this License will continue in full + force and effect unless terminated as stated above. + +*8. Miscellaneous* + + 1. Each time You distribute or publicly digitally perform the Work or + a Collective Work, the Licensor offers to the recipient a license + to the Work on the same terms and conditions as the license + granted to You under this License. + 2. Each time You distribute or publicly digitally perform a + Derivative Work, Licensor offers to the recipient a license to the + original Work on the same terms and conditions as the license + granted to You under this License. + 3. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability + of the remainder of the terms of this License, and without further + action by the parties to this agreement, such provision shall be + reformed to the minimum extent necessary to make such provision + valid and enforceable. + 4. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in + writing and signed by the party to be charged with such waiver or + consent. + 5. This License constitutes the entire agreement between the parties + with respect to the Work licensed here. There are no + understandings, agreements or representations with respect to the + Work not specified here. Licensor shall not be bound by any + additional provisions that may appear in any communication from + You. This License may not be modified without the mutual written + agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty +whatsoever in connection with the Work. Creative Commons will not be +liable to You or any party on any legal theory for any damages +whatsoever, including without limitation any general, special, +incidental or consequential damages arising in connection to this +license. Notwithstanding the foregoing two (2) sentences, if Creative +Commons has expressly identified itself as the Licensor hereunder, it +shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work +is licensed under the CCPL, neither party will use the trademark +"Creative Commons" or any related trademark or logo of Creative Commons +without the prior written consent of Creative Commons. Any permitted use +will be in compliance with Creative Commons' then-current trademark +usage guidelines, as may be published on its website or otherwise made +available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/ +<http://creativecommons.org>. + +« Back to Commons Deed <./> diff --git a/pyramid/paster_templates/pylons_sqla/+package+/templates/mytemplate.mak b/pyramid/paster_templates/pylons_sqla/+package+/templates/mytemplate.mak new file mode 100644 index 000000000..42c61bc4d --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/+package+/templates/mytemplate.mak @@ -0,0 +1,50 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:tal="http://xml.zope.org/namespaces/tal"> +<head> +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>${project} Application</title> +<meta name="keywords" content="python web application" /> +<meta name="description" content="Pylons web application" /> +<link href="${request.application_url}/static/default.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<!-- start header --> +<div id="logo"> + <h2><code>${project}</code>, a <code>Pylons</code> application</h2> +</div> +<div id="header"> + <div id="menu"> + </div> +</div> +<!-- end header --> +<div id="wrapper"> + <!-- start page --> + <div id="page"> + <!-- start content --> + <div id="content"> + <div class="post"> + <h1 class="title">Welcome to <code>${project}</code>, an + application generated by the <a + href="http://pylonshq.com">Pylons</a> web + application framework.</h1> + </div> + <div>The root object's name is "${root.name}"</div> + </div> + <!-- end content --> + <!-- start sidebar --> + <div id="sidebar"></div> + <!-- end sidebar --> + <div style="clear: both;"> </div> + </div> +</div> +<!-- end page --> +<!-- start footer --> +<div id="footer"> + <p id="legal">( c ) 2008. All Rights Reserved. Template design + by <a href="http://www.freecsstemplates.org/">Free CSS + Templates</a>.</p> +</div> +<!-- end footer --> +</body> +</html> diff --git a/pyramid/paster_templates/pylons_sqla/+package+/tests.py_tmpl b/pyramid/paster_templates/pylons_sqla/+package+/tests.py_tmpl new file mode 100644 index 000000000..099df47bd --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/+package+/tests.py_tmpl @@ -0,0 +1,26 @@ +import unittest + +class MyHandlerTests(unittest.TestCase): + def setUp(self): + from pyramid.configuration import Configurator + from {{package}}.models import initialize_sql + self.session = initialize_sql('sqlite://') + self.config = Configurator() + self.config.begin() + + def tearDown(self): + self.config.end() + + def _makeOne(self, request): + from {{package}}.handlers import MyHandler + return MyHandler(request) + + def test_index(self): + request = DummyRequest() + handler = self._makeOne(request) + info = handler.index() + self.assertEqual(info['project'], '{{package}}') + self.assertEqual(info['root'].name, 'root') + +class DummyRequest(object): + pass diff --git a/pyramid/paster_templates/pylons_sqla/CHANGES.txt_tmpl b/pyramid/paster_templates/pylons_sqla/CHANGES.txt_tmpl new file mode 100644 index 000000000..35a34f332 --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/CHANGES.txt_tmpl @@ -0,0 +1,4 @@ +0.0 +--- + +- Initial version diff --git a/pyramid/paster_templates/pylons_sqla/README.txt_tmpl b/pyramid/paster_templates/pylons_sqla/README.txt_tmpl new file mode 100644 index 000000000..0ddebfc3e --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/README.txt_tmpl @@ -0,0 +1,4 @@ +{{project}} README + + + diff --git a/pyramid/paster_templates/pylons_sqla/development.ini_tmpl b/pyramid/paster_templates/pylons_sqla/development.ini_tmpl new file mode 100644 index 000000000..f1f1e28f2 --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/development.ini_tmpl @@ -0,0 +1,32 @@ +[app:{{project}}] +use = egg:{{project}} +reload_templates = true +mako.directories = {{package}}:templates +debug_authorization = false +debug_notfound = false +debug_templates = true +default_locale_name = en +db_string = sqlite:///%(here)s/tutorial.db +db_echo = true +session.type = file +session.data_dir = %(here)s/data/sessions/data +session.lock_dir = %(here)s/data/sessions/lock +session.key = {{project}} +session.secret = your_app_secret_string +cache.regions = default_term, second, short_term, long_term +cache.type = memory +cache.second.expire = 1 +cache.short_term.expire = 60 +cache.default_term.expire = 300 +cache.long_term.expire = 3600 + +[pipeline:main] +pipeline = + egg:WebError#evalerror + egg:repoze.tm2#tm + {{project}} + +[server:main] +use = egg:Paste#http +host = 0.0.0.0 +port = 5000 diff --git a/pyramid/paster_templates/pylons_sqla/setup.cfg_tmpl b/pyramid/paster_templates/pylons_sqla/setup.cfg_tmpl new file mode 100644 index 000000000..5bec29823 --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/setup.cfg_tmpl @@ -0,0 +1,27 @@ +[nosetests] +match=^test +nocapture=1 +cover-package={{package}} +with-coverage=1 +cover-erase=1 + +[compile_catalog] +directory = {{package}}/locale +domain = {{project}} +statistics = true + +[extract_messages] +add_comments = TRANSLATORS: +output_file = {{package}}/locale/{{project}}.pot +width = 80 + +[init_catalog] +domain = {{project}} +input_file = {{package}}/locale/{{project}}.pot +output_dir = {{package}}/locale + +[update_catalog] +domain = {{project}} +input_file = {{package}}/locale/{{project}}.pot +output_dir = {{package}}/locale +previous = true diff --git a/pyramid/paster_templates/pylons_sqla/setup.py_tmpl b/pyramid/paster_templates/pylons_sqla/setup.py_tmpl new file mode 100644 index 000000000..38881367a --- /dev/null +++ b/pyramid/paster_templates/pylons_sqla/setup.py_tmpl @@ -0,0 +1,48 @@ +import os +import sys + +from setuptools import setup, find_packages + +here = os.path.abspath(os.path.dirname(__file__)) +README = open(os.path.join(here, 'README.txt')).read() +CHANGES = open(os.path.join(here, 'CHANGES.txt')).read() + +requires = [ + 'pyramid', + 'pyramid_beaker', + 'SQLAlchemy', + 'transaction', + 'repoze.tm2', + 'zope.sqlalchemy', + 'WebError', +] + +if sys.version_info[:3] < (2,5,0): + requires.append('pysqlite') + +setup(name='{{project}}', + version='0.0', + description='{{project}}', + long_description=README + '\n\n' + CHANGES, + classifiers=[ + "Programming Language :: Python", + "Framework :: Pylons", + "Topic :: Internet :: WWW/HTTP", + "Topic :: Internet :: WWW/HTTP :: WSGI :: Application", + ], + author='', + author_email='', + url='', + keywords='web pylons', + packages=find_packages(), + include_package_data=True, + zip_safe=False, + install_requires=requires, + tests_require=requires, + test_suite="{{package}}", + entry_points = """\ + [paste.app_factory] + main = {{package}}:main + """ + ) + diff --git a/pyramid/personality/__init__.py b/pyramid/personality/__init__.py new file mode 100644 index 000000000..5bb534f79 --- /dev/null +++ b/pyramid/personality/__init__.py @@ -0,0 +1 @@ +# package diff --git a/pyramid/personality/pylons.py b/pyramid/personality/pylons.py new file mode 100644 index 000000000..2e7984fd9 --- /dev/null +++ b/pyramid/personality/pylons.py @@ -0,0 +1,24 @@ +from pyramid.threadlocal import get_current_request +from pyramid.url import route_url + +def renderer_globals_factory_config(helpers): + """ Return a Pylons renderer globals factory using ``helpers`` as + a helpers key.""" + def renderer_globals_factory(system): + req = system['request'] + if req is None: + req = get_current_request() + renderer_globals = { + 'url': route_url, + 'h': helpers, + 'request':req, + } + if req is not None: + tmpl_context = req.tmpl_context + renderer_globals['c'] = tmpl_context + renderer_globals['tmpl_context'] = tmpl_context + if 'session' in req.__dict__: + renderer_globals['session'] = req.session + return renderer_globals + return renderer_globals_factory + diff --git a/pyramid/request.py b/pyramid/request.py index 7ffdb7495..76fff37a8 100644 --- a/pyramid/request.py +++ b/pyramid/request.py @@ -9,6 +9,9 @@ from pyramid.interfaces import ISessionFactory from pyramid.exceptions import ConfigurationError from pyramid.decorator import reify +class TemplateContext(object): + pass + class Request(WebobRequest): """ A subclass of the :term:`WebOb` Request class. An instance of @@ -36,6 +39,11 @@ class Request(WebobRequest): finished_callbacks = () exception = None + @reify + def tmpl_context(self): + """ Template context (for Pylons apps) """ + return TemplateContext() + def add_response_callback(self, callback): """ Add a callback to the set of callbacks to be called by the diff --git a/pyramid/tests/test_pylons_personality.py b/pyramid/tests/test_pylons_personality.py new file mode 100644 index 000000000..570fcba5b --- /dev/null +++ b/pyramid/tests/test_pylons_personality.py @@ -0,0 +1,54 @@ +import unittest + + +class Test_pylons_renderer_globals_factory_config(unittest.TestCase): + def setUp(self): + from pyramid.configuration import Configurator + self.config = Configurator() + request = DummyRequest() + self.config.begin(request) + + def tearDown(self): + self.config.end() + + def _makeOne(self, helpers): + from pyramid.personality import pylons + return pylons.renderer_globals_factory_config(helpers) + + def test_with_request(self): + request = DummyRequest() + from pyramid.url import route_url + system = {'request':request} + factory = self._makeOne('helpers') + result = factory(system) + self.assertEqual(result['url'], route_url) + self.assertEqual(result['h'], 'helpers') + self.assertEqual(result['c'], request.tmpl_context) + self.assertEqual(result['tmpl_context'], request.tmpl_context) + + def test_without_request(self): + from pyramid.url import route_url + from pyramid.threadlocal import get_current_request + system = {'request':None} + factory = self._makeOne('helpers') + result = factory(system) + self.assertEqual(result['url'], route_url) + self.assertEqual(result['h'], 'helpers') + request = get_current_request() + self.assertEqual(result['c'], request.tmpl_context) + self.assertEqual(result['tmpl_context'], request.tmpl_context) + self.assertEqual(result['request'], request) + + def test_with_session(self): + request = DummyRequest() + request.session = 'session' + system = {'request':request} + factory = self._makeOne('helpers') + result = factory(system) + self.assertEqual(result['session'], 'session') + +class DummyRequest(object): + def __init__(self): + self.tmpl_context = object() + + diff --git a/pyramid/tests/test_request.py b/pyramid/tests/test_request.py index 93cbb9691..775c41731 100644 --- a/pyramid/tests/test_request.py +++ b/pyramid/tests/test_request.py @@ -43,6 +43,12 @@ class TestRequest(unittest.TestCase): inst = self._makeOne({}) self.assertTrue(IRequest.providedBy(inst)) + def test_tmpl_context(self): + from pyramid.request import TemplateContext + inst = self._makeOne({}) + result = inst.tmpl_context + self.assertEqual(result.__class__, TemplateContext) + def test_session_configured(self): from pyramid.interfaces import ISessionFactory inst = self._makeOne({}) @@ -82,6 +82,9 @@ setup(name='pyramid', pyramid_zodb=pyramid.paster:ZODBProjectTemplate pyramid_routesalchemy=pyramid.paster:RoutesAlchemyProjectTemplate pyramid_alchemy=pyramid.paster:AlchemyProjectTemplate + pylons_basic=pyramid.paster:PylonsBasicProjectTemplate + pylons_minimal=pyramid.paster:PylonsMinimalProjectTemplate + pylons_sqla=pyramid.paster:PylonsSQLAlchemyProjectTemplate [paste.paster_command] pyramid_shell=pyramid.paster:BFGShellCommand [console_scripts] |
