From bffdb722ac220e07394bc8382e8d0e5fa8a0aefd Mon Sep 17 00:00:00 2001 From: erlehmann Date: Thu, 31 Jul 2008 19:19:08 +0000 Subject: [PATCH] going pylons ! git-svn-id: http://yolanda.mister-muffin.de/svn@362 7eef14d0-6ed0-489d-bf55-20463b2d70db --- trunk/MANIFEST.in | 2 + trunk/README.txt | 19 ++++ trunk/Yolanda.egg-info/PKG-INFO | 10 ++ trunk/Yolanda.egg-info/SOURCES.txt | 29 +++++ trunk/Yolanda.egg-info/dependency_links.txt | 1 + trunk/Yolanda.egg-info/entry_points.txt | 7 ++ .../paste_deploy_config.ini_tmpl | 58 ++++++++++ trunk/Yolanda.egg-info/paster_plugins.txt | 3 + trunk/Yolanda.egg-info/requires.txt | 1 + trunk/Yolanda.egg-info/top_level.txt | 1 + .../6b/6b6319534be44c654af01dfd8269df82.cache | 12 ++ trunk/data/templates/index.mako.py | 40 +++++++ trunk/data/templates/index.mako.pyc | Bin 0 -> 1834 bytes trunk/data/templates/index.myt.py | 22 ++++ trunk/data/templates/index.myt.pyc | Bin 0 -> 1409 bytes trunk/data/templates/results.mako.py | 62 +++++++++++ trunk/data/templates/results.mako.pyc | Bin 0 -> 2284 bytes trunk/data/templates/results.myt.py | 44 ++++++++ trunk/data/templates/results.myt.pyc | Bin 0 -> 1568 bytes trunk/data/templates/search.myt.py | 22 ++++ trunk/data/templates/search.myt.pyc | Bin 0 -> 1049 bytes trunk/data/templates/xhtml/base.mako.py | 48 ++++++++ trunk/data/templates/xhtml/base.mako.pyc | Bin 0 -> 3512 bytes trunk/data/templates/xhtml/index.mako.py | 57 ++++++++++ trunk/data/templates/xhtml/index.mako.pyc | Bin 0 -> 2343 bytes trunk/data/templates/xhtml/results.mako.py | 105 ++++++++++++++++++ trunk/data/templates/xhtml/results.mako.pyc | Bin 0 -> 3893 bytes trunk/development.ini | 64 +++++++++++ trunk/docs/index.txt | 12 ++ trunk/setup.cfg | 59 ++++++++++ trunk/setup.py | 31 ++++++ trunk/test.ini | 21 ++++ trunk/yolanda/__init__.py | 0 trunk/yolanda/__init__.pyc | Bin 0 -> 135 bytes trunk/yolanda/config/__init__.py | 0 trunk/yolanda/config/__init__.pyc | Bin 0 -> 142 bytes trunk/yolanda/config/environment.py | 33 ++++++ trunk/yolanda/config/environment.pyc | Bin 0 -> 1319 bytes trunk/yolanda/config/middleware.py | 57 ++++++++++ trunk/yolanda/config/middleware.pyc | Bin 0 -> 2075 bytes trunk/yolanda/config/routing.py | 46 ++++++++ trunk/yolanda/config/routing.pyc | Bin 0 -> 1432 bytes trunk/yolanda/controllers/__init__.py | 0 trunk/yolanda/controllers/__init__.pyc | Bin 0 -> 147 bytes trunk/yolanda/controllers/account.py | 13 +++ trunk/yolanda/controllers/error.py | 39 +++++++ trunk/yolanda/controllers/error.pyc | Bin 0 -> 2226 bytes trunk/yolanda/controllers/index.py | 10 ++ trunk/yolanda/controllers/index.pyc | Bin 0 -> 687 bytes trunk/yolanda/controllers/search.py | 31 ++++++ trunk/yolanda/controllers/search.pyc | Bin 0 -> 1536 bytes trunk/yolanda/controllers/template.py | 27 +++++ trunk/yolanda/controllers/template.pyc | Bin 0 -> 1347 bytes trunk/yolanda/controllers/video.py | 14 +++ trunk/yolanda/controllers/video.pyc | Bin 0 -> 846 bytes trunk/yolanda/lib/__init__.py | 0 trunk/yolanda/lib/__init__.pyc | Bin 0 -> 139 bytes trunk/yolanda/lib/app_globals.py | 14 +++ trunk/yolanda/lib/app_globals.pyc | Bin 0 -> 889 bytes trunk/yolanda/lib/base.py | 27 +++++ trunk/yolanda/lib/base.pyc | Bin 0 -> 1586 bytes trunk/yolanda/lib/helpers.py | 6 + trunk/yolanda/lib/helpers.pyc | Bin 0 -> 359 bytes trunk/yolanda/model/__init__.py | 0 trunk/yolanda/model/__init__.pyc | Bin 0 -> 141 bytes trunk/yolanda/public/css/default.css | 97 ++++++++++++++++ trunk/yolanda/public/images/404.png | Bin 0 -> 53955 bytes trunk/yolanda/templates/xhtml/base.mako | 90 +++++++++++++++ trunk/yolanda/templates/xhtml/index.mako | 11 ++ trunk/yolanda/templates/xhtml/results.mako | 27 +++++ trunk/yolanda/tests/__init__.py | 40 +++++++ trunk/yolanda/tests/functional/__init__.py | 0 .../yolanda/tests/functional/test_account.py | 7 ++ trunk/yolanda/tests/functional/test_index.py | 7 ++ trunk/yolanda/tests/functional/test_search.py | 7 ++ trunk/yolanda/tests/functional/test_video.py | 7 ++ trunk/yolanda/tests/test_models.py | 0 trunk/yolanda/websetup.py | 14 +++ 78 files changed, 1354 insertions(+) create mode 100644 trunk/MANIFEST.in create mode 100644 trunk/README.txt create mode 100644 trunk/Yolanda.egg-info/PKG-INFO create mode 100644 trunk/Yolanda.egg-info/SOURCES.txt create mode 100644 trunk/Yolanda.egg-info/dependency_links.txt create mode 100644 trunk/Yolanda.egg-info/entry_points.txt create mode 100644 trunk/Yolanda.egg-info/paste_deploy_config.ini_tmpl create mode 100644 trunk/Yolanda.egg-info/paster_plugins.txt create mode 100644 trunk/Yolanda.egg-info/requires.txt create mode 100644 trunk/Yolanda.egg-info/top_level.txt create mode 100644 trunk/data/sessions/container_file/6/6b/6b6319534be44c654af01dfd8269df82.cache create mode 100644 trunk/data/templates/index.mako.py create mode 100644 trunk/data/templates/index.mako.pyc create mode 100644 trunk/data/templates/index.myt.py create mode 100644 trunk/data/templates/index.myt.pyc create mode 100644 trunk/data/templates/results.mako.py create mode 100644 trunk/data/templates/results.mako.pyc create mode 100644 trunk/data/templates/results.myt.py create mode 100644 trunk/data/templates/results.myt.pyc create mode 100644 trunk/data/templates/search.myt.py create mode 100644 trunk/data/templates/search.myt.pyc create mode 100644 trunk/data/templates/xhtml/base.mako.py create mode 100644 trunk/data/templates/xhtml/base.mako.pyc create mode 100644 trunk/data/templates/xhtml/index.mako.py create mode 100644 trunk/data/templates/xhtml/index.mako.pyc create mode 100644 trunk/data/templates/xhtml/results.mako.py create mode 100644 trunk/data/templates/xhtml/results.mako.pyc create mode 100644 trunk/development.ini create mode 100644 trunk/docs/index.txt create mode 100644 trunk/setup.cfg create mode 100644 trunk/setup.py create mode 100644 trunk/test.ini create mode 100644 trunk/yolanda/__init__.py create mode 100644 trunk/yolanda/__init__.pyc create mode 100644 trunk/yolanda/config/__init__.py create mode 100644 trunk/yolanda/config/__init__.pyc create mode 100644 trunk/yolanda/config/environment.py create mode 100644 trunk/yolanda/config/environment.pyc create mode 100644 trunk/yolanda/config/middleware.py create mode 100644 trunk/yolanda/config/middleware.pyc create mode 100644 trunk/yolanda/config/routing.py create mode 100644 trunk/yolanda/config/routing.pyc create mode 100644 trunk/yolanda/controllers/__init__.py create mode 100644 trunk/yolanda/controllers/__init__.pyc create mode 100644 trunk/yolanda/controllers/account.py create mode 100644 trunk/yolanda/controllers/error.py create mode 100644 trunk/yolanda/controllers/error.pyc create mode 100644 trunk/yolanda/controllers/index.py create mode 100644 trunk/yolanda/controllers/index.pyc create mode 100644 trunk/yolanda/controllers/search.py create mode 100644 trunk/yolanda/controllers/search.pyc create mode 100644 trunk/yolanda/controllers/template.py create mode 100644 trunk/yolanda/controllers/template.pyc create mode 100644 trunk/yolanda/controllers/video.py create mode 100644 trunk/yolanda/controllers/video.pyc create mode 100644 trunk/yolanda/lib/__init__.py create mode 100644 trunk/yolanda/lib/__init__.pyc create mode 100644 trunk/yolanda/lib/app_globals.py create mode 100644 trunk/yolanda/lib/app_globals.pyc create mode 100644 trunk/yolanda/lib/base.py create mode 100644 trunk/yolanda/lib/base.pyc create mode 100644 trunk/yolanda/lib/helpers.py create mode 100644 trunk/yolanda/lib/helpers.pyc create mode 100644 trunk/yolanda/model/__init__.py create mode 100644 trunk/yolanda/model/__init__.pyc create mode 100644 trunk/yolanda/public/css/default.css create mode 100644 trunk/yolanda/public/images/404.png create mode 100644 trunk/yolanda/templates/xhtml/base.mako create mode 100644 trunk/yolanda/templates/xhtml/index.mako create mode 100644 trunk/yolanda/templates/xhtml/results.mako create mode 100644 trunk/yolanda/tests/__init__.py create mode 100644 trunk/yolanda/tests/functional/__init__.py create mode 100644 trunk/yolanda/tests/functional/test_account.py create mode 100644 trunk/yolanda/tests/functional/test_index.py create mode 100644 trunk/yolanda/tests/functional/test_search.py create mode 100644 trunk/yolanda/tests/functional/test_video.py create mode 100644 trunk/yolanda/tests/test_models.py create mode 100644 trunk/yolanda/websetup.py diff --git a/trunk/MANIFEST.in b/trunk/MANIFEST.in new file mode 100644 index 0000000..ac17a74 --- /dev/null +++ b/trunk/MANIFEST.in @@ -0,0 +1,2 @@ +recursive-include yolanda/public * +recursive-include yolanda/templates * diff --git a/trunk/README.txt b/trunk/README.txt new file mode 100644 index 0000000..b6a6861 --- /dev/null +++ b/trunk/README.txt @@ -0,0 +1,19 @@ +This file is for you to describe the Yolanda application. Typically +you would include information such as the information below: + +Installation and Setup +====================== + +Install ``Yolanda`` using easy_install:: + + easy_install Yolanda + +Make a config file as follows:: + + paster make-config Yolanda config.ini + +Tweak the config file as appropriate and then setup the application:: + + paster setup-app config.ini + +Then you are ready to go. diff --git a/trunk/Yolanda.egg-info/PKG-INFO b/trunk/Yolanda.egg-info/PKG-INFO new file mode 100644 index 0000000..2e4f694 --- /dev/null +++ b/trunk/Yolanda.egg-info/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: Yolanda +Version: 0.0.0dev +Summary: UNKNOWN +Home-page: UNKNOWN +Author: UNKNOWN +Author-email: UNKNOWN +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN diff --git a/trunk/Yolanda.egg-info/SOURCES.txt b/trunk/Yolanda.egg-info/SOURCES.txt new file mode 100644 index 0000000..b4a97a0 --- /dev/null +++ b/trunk/Yolanda.egg-info/SOURCES.txt @@ -0,0 +1,29 @@ +MANIFEST.in +README.txt +setup.cfg +setup.py +Yolanda.egg-info/PKG-INFO +Yolanda.egg-info/SOURCES.txt +Yolanda.egg-info/dependency_links.txt +Yolanda.egg-info/entry_points.txt +Yolanda.egg-info/paste_deploy_config.ini_tmpl +Yolanda.egg-info/requires.txt +Yolanda.egg-info/top_level.txt +yolanda/__init__.py +yolanda/websetup.py +yolanda/config/__init__.py +yolanda/config/environment.py +yolanda/config/middleware.py +yolanda/config/routing.py +yolanda/controllers/__init__.py +yolanda/controllers/error.py +yolanda/controllers/template.py +yolanda/lib/__init__.py +yolanda/lib/app_globals.py +yolanda/lib/base.py +yolanda/lib/helpers.py +yolanda/model/__init__.py +yolanda/public/index.html +yolanda/tests/__init__.py +yolanda/tests/test_models.py +yolanda/tests/functional/__init__.py \ No newline at end of file diff --git a/trunk/Yolanda.egg-info/dependency_links.txt b/trunk/Yolanda.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/trunk/Yolanda.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/trunk/Yolanda.egg-info/entry_points.txt b/trunk/Yolanda.egg-info/entry_points.txt new file mode 100644 index 0000000..6655f5b --- /dev/null +++ b/trunk/Yolanda.egg-info/entry_points.txt @@ -0,0 +1,7 @@ + + [paste.app_factory] + main = yolanda.config.middleware:make_app + + [paste.app_install] + main = pylons.util:PylonsInstaller + \ No newline at end of file diff --git a/trunk/Yolanda.egg-info/paste_deploy_config.ini_tmpl b/trunk/Yolanda.egg-info/paste_deploy_config.ini_tmpl new file mode 100644 index 0000000..9f4f7f0 --- /dev/null +++ b/trunk/Yolanda.egg-info/paste_deploy_config.ini_tmpl @@ -0,0 +1,58 @@ +# +# Yolanda - Pylons configuration +# +# The %(here)s variable will be replaced with the parent directory of this file +# +[DEFAULT] +debug = true +email_to = you@yourdomain.com +smtp_server = localhost +error_email_from = paste@localhost + +[server:main] +use = egg:Paste#http +host = 0.0.0.0 +port = 5000 + +[app:main] +use = egg:Yolanda +full_stack = true +cache_dir = %(here)s/data +beaker.session.key = yolanda +beaker.session.secret = ${app_instance_secret} +app_instance_uuid = ${app_instance_uuid} + +# If you'd like to fine-tune the individual locations of the cache data dirs +# for the Cache data, or the Session saves, un-comment the desired settings +# here: +#beaker.cache.data_dir = %(here)s/data/cache +#beaker.session.data_dir = %(here)s/data/sessions + +# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* +# Debug mode will enable the interactive debugging tool, allowing ANYONE to +# execute malicious code after an exception is raised. +set debug = false + + +# Logging configuration +[loggers] +keys = root + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = INFO +handlers = console + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(asctime)s %(levelname)-5.5s [%(name)s] %(message)s diff --git a/trunk/Yolanda.egg-info/paster_plugins.txt b/trunk/Yolanda.egg-info/paster_plugins.txt new file mode 100644 index 0000000..b3ee8d7 --- /dev/null +++ b/trunk/Yolanda.egg-info/paster_plugins.txt @@ -0,0 +1,3 @@ +Pylons +WebHelpers +PasteScript diff --git a/trunk/Yolanda.egg-info/requires.txt b/trunk/Yolanda.egg-info/requires.txt new file mode 100644 index 0000000..a7c9299 --- /dev/null +++ b/trunk/Yolanda.egg-info/requires.txt @@ -0,0 +1 @@ +Pylons>=0.9.6.1 \ No newline at end of file diff --git a/trunk/Yolanda.egg-info/top_level.txt b/trunk/Yolanda.egg-info/top_level.txt new file mode 100644 index 0000000..11a9aa0 --- /dev/null +++ b/trunk/Yolanda.egg-info/top_level.txt @@ -0,0 +1 @@ +yolanda diff --git a/trunk/data/sessions/container_file/6/6b/6b6319534be44c654af01dfd8269df82.cache b/trunk/data/sessions/container_file/6/6b/6b6319534be44c654af01dfd8269df82.cache new file mode 100644 index 0000000..7d115ef --- /dev/null +++ b/trunk/data/sessions/container_file/6/6b/6b6319534be44c654af01dfd8269df82.cache @@ -0,0 +1,12 @@ +(dp1 +S'_authentication_token' +p2 +S'141491361115205551276239095199970379580' +p3 +sS'_accessed_time' +p4 +F1217161386.3120041 +sS'_creation_time' +p5 +F1217161386.3120079 +s. \ No newline at end of file diff --git a/trunk/data/templates/index.mako.py b/trunk/data/templates/index.mako.py new file mode 100644 index 0000000..836a3d0 --- /dev/null +++ b/trunk/data/templates/index.mako.py @@ -0,0 +1,40 @@ +from mako import runtime, filters, cache +UNDEFINED = runtime.UNDEFINED +_magic_number = 2 +_modified_time = 1216907993.197489 +_template_filename='/home/nils/src/yolanda/trunk/yolanda/templates/index.mako' +_template_uri='/index.mako' +_template_cache=cache.Cache(__name__, _modified_time) +_source_encoding=None +_exports = [] + + +def render_body(context,**pageargs): + context.caller_stack.push_frame() + try: + __M_locals = dict(pageargs=pageargs) + h = context.get('h', UNDEFINED) + # SOURCE LINE 1 + context.write(u'

\n Welcome to Yolanda\n

\n\n

\n This is the front page.\n

\n\n

\n upload video\n

\n\n

\n\n') + # SOURCE LINE 15 + context.write(unicode( h.form( \ + h.url(action='/results'), \ + method='get', \ + enctype='application/x-www-form-urlencoded' \ +) )) + # SOURCE LINE 19 + context.write(u'\n\n') + # SOURCE LINE 21 + context.write(unicode( h.text_field('query') )) + context.write(u'\n') + # SOURCE LINE 22 + context.write(unicode( h.submit('find video') )) + context.write(u'\n\n') + # SOURCE LINE 24 + context.write(unicode( h.end_form() )) + context.write(u'\n\n

\n
\n\n \n search for videos\n \n\n \n \n\n
\n
\n

\n') + return '' + finally: + context.caller_stack.pop_frame() + + diff --git a/trunk/data/templates/index.mako.pyc b/trunk/data/templates/index.mako.pyc new file mode 100644 index 0000000000000000000000000000000000000000..832dba2e46eb7c54a4d92ec11ba2ee9e9ede1a6a GIT binary patch literal 1834 zcmbtU&2HO95FS#tY|)Y3{H^XH#FPicMa;r}Tf zok0lP4qXxD4$U0OU7ER+_h{B5M>?eTXtqZJ+I0_X_97AxmYcJ z{pG9QgW!)(^(WYcSyjleRJjgylZLA*PfC%5263*oJ6Y6uVx$gLDdh63NUkb<#NOL| z>R`__u>MOt`XMwo0EpY6TO#L&zsR^u%?B#v0SYxv-8LyyGpZNqm&L^%3SxMLem zoY2Kfw81)koPqSegW_WJ0jQZ6u3VigWYR3OVdk=S2^nP{pL;&8moiUL7~fR>_gzW6 zDCC!3RCgBNWJ>$EO(y+$Q%2;Y|5^!IMPYJ&&(Z@! zL`iB?RceM7Hd42_(N>Rc$|_;F#TL@o&XQ$nR<+b0vRhr}DoxloT%KNEU!TsarZ{bz z99ET(qUEmhJllq^TG^~xPT12P)GTZ4&Zli#=!;Koo9sV3gQ{t#vgGD5cR5!aRUTlRTGA ztWA<$8K%2#br#PXfWZfcDWy^~<*8u?5Z_LozxeEn$&2TtanVQvwCHCAT>Y(CN3+nVq)}19NZZ?J?F%E?4_4F9RFx_#HEL0koZE-0Z!|J%GgaR=lw)6NAt2PKh7(NcJg7v*q zx8R(I^)nvUmc%$_vp6;TU3*(l!j+YtgE(3Wo$n>RW3SrxvZovYzeii d|HrBw6A^N3b9v5$XwLA7GXRa\n\n

\n Welcome to Yolanda\n

\n\n

\n This is the front page.\n

\n\n

\n upload video\n

\n\n

\n

\n
\n\n \n search for videos\n \n\n \n \n\n
\n
\n

\n\n\n') + return '' + finally: + context.caller_stack.pop_frame() + + diff --git a/trunk/data/templates/index.myt.pyc b/trunk/data/templates/index.myt.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e737a17e664f733ab3250a148b339ab7d3c6c28 GIT binary patch literal 1409 zcmbtU&5q+l5H2T~%uJT-to96&$3iHVjKz(ECt}6!0z%}F0WIWW^|&i>YuawpUEZ0X zHT$Kjj%pUNpZE zTmje!mJ!$GO^bdGT#crowK&GM3N>I$(aGiV{tackACjGN1o) z`s=gs2~%n5Dokr*LmGUMZk$!MRw=Qat38EPV-;aYO|9|ftlCf*iSmvtA|?gIkmpxC z!%JS?Fg$)ExCMxQ{1B)ofq5fz^i!`p?n@wUBZxQ>7q2*ScRGVk=R0OxOa^RfPU38% z)~NhCw7>Cv+39o|m#8%QcsiYpMp^msY!vf&g|=X~Vsi2KTZcwjDu<)2*-Cs2YN&HgF5a=waHLB`eRN$N4QmO>J9 zCQ7HzlQmKjV_ndu!Sh5ljWvZ5;q+#DeSJL@^=a!Zi#Uxs*`gF*vXw!r0}|sB`hH{< z*I4Vl;Qc}12o+__7Pn}_L$&l??;+dNO-u0>9^nn6tyRTPe`wKfk~n>MPxg25&|X%C z6<#abvc`&wqEpyikfnPc1SQk#?k$c zQ06Po=tv4fn}WIuzxIZZjzz*XTY-IB6r5uAYSHzHSjqFRbL-f6m@oz1^4|@i6>)F; zyBp4$4LxEro-@K=FP+{9_8<#HC6uNxAW&O zUVb@$@tnrY$}6=tMP9enC3kG`g$~5(QtByB~^Ar~1;68x=KZ@aq4Q7?ot;LxH RCWwRYN5|3d?s+QT{$Ez0VI=?n literal 0 HcmV?d00001 diff --git a/trunk/data/templates/results.mako.py b/trunk/data/templates/results.mako.py new file mode 100644 index 0000000..4de22eb --- /dev/null +++ b/trunk/data/templates/results.mako.py @@ -0,0 +1,62 @@ +from mako import runtime, filters, cache +UNDEFINED = runtime.UNDEFINED +_magic_number = 2 +_modified_time = 1216910187.0066929 +_template_filename='/home/nils/src/yolanda/trunk/yolanda/templates/results.mako' +_template_uri='/results.mako' +_template_cache=cache.Cache(__name__, _modified_time) +_source_encoding=None +_exports = ['result'] + + +def render_body(context,**pageargs): + context.caller_stack.push_frame() + try: + __M_locals = dict(pageargs=pageargs) + h = context.get('h', UNDEFINED) + c = context.get('c', UNDEFINED) + def result(x): + return render_result(context.locals_(__M_locals),x) + # SOURCE LINE 1 + context.write(u'\n\n\n\n\n') + # SOURCE LINE 6 + context.write(unicode( h.javascript_include_tag('/javascripts/effects.js', builtins=True) )) + context.write(u'\n\n\n\n\n\n\n') + # SOURCE LINE 18 + context.write(u'\n\n

\n Here be results for ') + # SOURCE LINE 21 + context.write(unicode(c.query)) + context.write(u'.\n

\n\n') + # SOURCE LINE 24 + for x in range(1,10): + # SOURCE LINE 25 + context.write(u' ') + context.write(unicode(result(x))) + context.write(u'\n') + # SOURCE LINE 27 + context.write(u'\n\n\n\n\n') + return '' + finally: + context.caller_stack.pop_frame() + + +def render_result(context,x): + context.caller_stack.push_frame() + try: + h = context.get('h', UNDEFINED) + # SOURCE LINE 13 + context.write(u'\n
\n ') + # SOURCE LINE 15 + context.write(unicode( h.draggable_element(x, revert=True) )) + context.write(u'\n thumbnail and infos for video ') + # SOURCE LINE 16 + context.write(unicode(x)) + context.write(u'\n
\n') + return '' + finally: + context.caller_stack.pop_frame() + + diff --git a/trunk/data/templates/results.mako.pyc b/trunk/data/templates/results.mako.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b65c4518306375f647d3bf76bc800c2d6f760e46 GIT binary patch literal 2284 zcmbtV&2A$_5U%!L;>kM6CTL+1KbD1rC8YSoVYS%^v{|$u;ll*9$PyY&rrUOJ#xvgO zo{*sA6vT!z63@V$3rAi7jywi00AJPEGC?2?8GCBFtE;Q4zy7NFr$0Ku$@kY!6IwhC zd_TbJJcPzy(FswiXrw5u(Wpjgokn$1Mv-mMs6iUqCTVC}q@h_O-K5bvnL61vnSe}- zu3)o4x=o`F=@w1kZjk}nL%b#H*iHVIM35K)A7K=&&jH1X7e=m#tjPN z%GA5PS$vYa4$uF)#s{q*jM@eF)ptsU>x`0b zFbOwx*T}D9OksFsp;@&w z2bil4&z1AIX&;Em*(c-!(m0?y9O2=Y59qSFjG*%mFAchopl&+a6ss4%(z7a7y(J30 zO-Ikbq6I`70?`*x9QE%4z9IHNG><1HE+)=1x>J!!!fk$;1G{+LJqU2}8nhEkvHk^d zxJP}q8}^w7o=>kZnKngK9hq<@&67BFkr;~qv&x!}F^WEos&O$*^30nv-^U33KbLgu zL92fy(%$?$*rb1&O=kyy%t;^d9EICIEmS z6mPz4K=7QBRYA!}!)W1`my%$)7Eu2Vgl7RTQvmFIoSc9-IKk3Qqj3=UW*J!H=-E-1&iF+ffhQXN%S zTWW`Y^-is)I<-#i9^^K)Y8`c7-GyAQB}@(ukt2M}vwwyFx9zH^{2+a)D*(2tB5Wbm z7nz`{4xr((Qg!7qKM6+$TNs5L%Dh-s$rfPzs-X#FN*{)W=LwAO{(eUY@Qe1g|EXxcDw>mTDQ$V d$AsI*R?E~JFfNWy_6^lmt;KH#-*&zI_FtE9;Zgtq literal 0 HcmV?d00001 diff --git a/trunk/data/templates/results.myt.py b/trunk/data/templates/results.myt.py new file mode 100644 index 0000000..809274c --- /dev/null +++ b/trunk/data/templates/results.myt.py @@ -0,0 +1,44 @@ +from mako import runtime, filters, cache +UNDEFINED = runtime.UNDEFINED +_magic_number = 2 +_modified_time = 1216817791.7502799 +_template_filename='/home/nils/src/yolanda/trunk/yolanda/templates/results.myt' +_template_uri='/results.myt' +_template_cache=cache.Cache(__name__, _modified_time) +_source_encoding=None +_exports = [] + + +def render_body(context,**pageargs): + context.caller_stack.push_frame() + try: + __M_locals = dict(pageargs=pageargs) + h = context.get('h', UNDEFINED) + c = context.get('c', UNDEFINED) + # SOURCE LINE 1 + context.write(u'

\n Welcome to Yolanda\n

\n\n

\n This is the search page.\n

\n\n

\n') + # SOURCE LINE 10 + h.start_form(h.url_for(action='save', title=c.query), method="get") + + context.write(u'\n ') + # SOURCE LINE 11 + h.text_area(name='content', rows=7, cols=40, content=c.content) + + context.write(u'
\n ') + # SOURCE LINE 12 + h.submit(value="Save changes", name='commit') + + context.write(u'\n') + # SOURCE LINE 13 + h.end_form() + + context.write(u'\n\n ') + # SOURCE LINE 15 + c.query + + context.write(u'\n

\n') + return '' + finally: + context.caller_stack.pop_frame() + + diff --git a/trunk/data/templates/results.myt.pyc b/trunk/data/templates/results.myt.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be8625fc38c9995a7d58286cdf4f299d40168797 GIT binary patch literal 1568 zcmbtUU60#D6uskQvx&RumOu+gNEivEh=+}Mt)dDu0+{1U`Ff^)AoTab`=!0}9Gj_=2rb7$t~->2bs@Bi>=M%T{}{~x0H z9G%5$=z^#;v^G=*v<|2o(0V||87hXf9+CxmKo;nTERaL82eclO8&EMJ7m^#%3)tKu zdr0dkZHU&l$&ToI42}gnosW^M_!G~3fDs>}YrC3@%IWyLDA~214}fQBmb)UrX!GOn zx1WA_=hu(?easelQ@KT5lz!pcY_V&~w6^Jj5$EFN%vIYmW#<>I^IggQq}s7R68FCW znE@cVOiACeimMcW+FN0E1JX>s}8lmp%5nV)hL>eT;2!Eyh&6z6NkQe-lEjSSqb1Gyv#p%5Jq?&yD~$$B5tB@`a*@vg?tQ`+uq{KyzmiT&RygYEz2VbdjdOH zs2PtCGR?SXYG{rsrB9u15iYoN`W5>pZ!F8E+Boi{rkY>v>-2hiWeDJER5DlAoot0@dDcdYo}VUqnwFi@?Q@FUQI@Cm#(B+*dfwvleBedEQyt_@6JG1tLJLl2ar75X4`X^i*_1Q)w<+Z zPpS|~k}s070e>G0(O4`+v%dT9!)a5-IsLbjd9vN{Ed*-83EG@Bb|;MeyAs_@&A=R+ znVALCV2<`4+C8)o?J$^{aj=@-fuYJ*r58;sZn2akmir^Vi;k!0k}BO4SyFe^nQK`} zl2nZ?&I@M~y@X~0?I|X>j+|~D^}T^RR6*AMvD{E9Ws-\n\n

\n Welcome to Yolanda\n

\n\n

\n This is the search page.\n

\n\n\n') + return '' + finally: + context.caller_stack.pop_frame() + + diff --git a/trunk/data/templates/search.myt.pyc b/trunk/data/templates/search.myt.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4930ea13fd9eae82d5d04d9030413704916d516 GIT binary patch literal 1049 zcmb_a!EVz)5S_KtG<8XfdPc~VIOLK>9Fd|5L|cInIi#S1FDrL<6I-#pmUk=~C|ruf zU+@!r1b04#0~}#yQ;3j|xUk+G@4TIvoq4mLzV@Rxw?8~ma6LNozfa3$Bs5I{3xGmE zBA^H$37`le2|*YEc?XgXXhJtY6WRq$$R_9wNP1vG$hW{mV7hQcHrt>#A?d>$AlU)k zh4-}CW$<*+qs#IiGzKB6#gyKA40_jy6U>7YZQCdlR1>6}uSyO!vM z@&0faXC~FAiHF0(C>m#X52KjInJE+%7Nd<{u1bo=BR-7A^~&N|mb;iHW+q-$5p(PV zvLlPghn`tW1p3fO*TI09#2X}3S`?;{4pX(jh=96vnVdB#QP0WhT%qUvRg6ZasbhcX(LudLZc}3_qDY=wz2xK_3lMz~ zirt_udckCHlK`K1nJ(;\n\n\n\n\n\n\n \n\n \n\n \n Yolanda - ') + # SOURCE LINE 22 + context.write(unicode(self.title())) + context.write(u'\n \n\n\n\n\n\n
\n

\n ') + # SOURCE LINE 31 + context.write(unicode(self.heading())) + context.write(u'\n

\n
\n\n \n\n ') + # SOURCE LINE 50 + context.write(unicode(self.body())) + context.write(u'\n\n \n\n \n\n\n\n\n') + return '' + finally: + context.caller_stack.pop_frame() + + diff --git a/trunk/data/templates/xhtml/base.mako.pyc b/trunk/data/templates/xhtml/base.mako.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3bde14bcbb959f79c730aca46c2a4e38176bfc28 GIT binary patch literal 3512 zcmcgv&2HO95ME0DRpK~xdnu3tTNVfm#1if1(4?l6wzi9;O`Jehki-{aMXt!Lmp|by zEvZOO>9Mz>572uL1&Y2%`v!f4zCb&()URD9mmri#?GC@4nVp%P8U6mxTJ5*Lf4u9H z(X{}-U%;&*cm(jZ$O$3RBF7ey6>?l5vPzDt#Nrka3*>l#1VCLR0Z^An0F-4CERy3D z!mC8A5?&*GiM#^LB@!%?<24cza(smZOXLR_tRwMga|MKnf8pA!!bmT}BQFvyVs6Gg zAvMpHUIe<&{D_MRjKcN5wtl_!$)8^qEtok`8gnNRQaLL3onb0j5->*tpOfi~$C+fB zD`ybtSUO#%cq3*fX>k=@4!~`zy%^!Q2ab<`8;a% zJPH<`6VDpxsUNm3*y6G=IjOwz8VtwV2*fEB0azK{i6pFd(*YP2ZG)E^?Mx>~CfNfEKdbt z=SL%!7xO$aFv=tZq6m1ZrclFwGSyd1=ps`u=L!s?Ad3(JPLI++S78`(T_CCq2h9p{UKREH)<7+3gj-zzG_K+t_-3nhkRiMtatEJZ_CV;yN&< zdt(s2j`&^r>Gt+#Tll<1T>x|p`qimG(5S1Q<}ZD3lyJObZGW+UF8Ap*p2GgtyYU=zplzO|xu)GBoZI^Rre{6v7Sfyz zFrUc8fJ>X^sf6>Kuu~D5WPu5298Ini^M_?(-%%<&Wl{u8r};P`&P2_2#DOF_po#--C;UEsvoS7>3S`8nDA%$}e*tevi>l6|k>^h^Q4p|;5 zcB`f#cacpjB>FNue8{dm_mpP-iN-XS6)N(2kUh9*2m;~jHZ}_yTffJL`v+g&J3QDo ziL;*zUACn~BJh-%7PZKw2g$@BOo=hnQ5i8j;caYWVfpiVg3G`pTUB&pp-pSTlK`2- z29G;1;Rolc~)bKThdZ62w;|)*Gd*I0wwx!zG(6kYW6|#J&H#W#{4xv}Rs5@?C zLwyOD<)9##4K+h6s%?~DtyxuT-P*7=Dr=Q%)>`Gm(R~AcaXv${Rw{?37f?%VyxYj4 zjjdQ4d;0b|JTz7%FJ__ey`+e{kRP##d2t#Duv_4nKL%Kiys^q)PstN>pIJL07vLZt^)Z+H;w3lW)-QJyeepb^x z!i&Pm9C-tdJOXdRnHz7wjT3xTvm28{h>I;|w`;p=daJ9x`l|YuKl+jT{m0K!T0R~8 zeuCkCf-v|hIwi^#O%&w;O#;e8nuMgRqO3!c4jE|I$UxgA1I;>_HJWUY4Jqr9jmUQC z9D6p&Y}2Gq2HVzY3e7f|4f=s-vO}gPlWSxmnOrBcDU)3?TQa#prZ1D5Z0B&e1OKwW z@C-xD{5nM4ls+r0%ull1+uHdx=+h*f*(|_p`rglf{`TQJzkcdI#%eUH3Og#Z+>KnF zjuus(lqMN@*g3se*5xY{0&%JdEqY{*n-+|D5OHQr?yq3QVw!81Vnb}AK~+E zK_c$)OqMJz!_Sy;++|}745{ZCWgo==SxrqZE2TQ9|aN#kZ zA7Qv}AXKptJDW zWT}^G{T8@e&ncQ$^LB$Y7=bvx#`c($T7RkY3Rd0avdnM7cx};RYJFUp#p_r)K9y7- zb+8lk`J*<1=e58g3jIF7UBxCSra3b0|d#g#KTZr+5926&Eao}xA09W1J* zoaX3cgSVrY+g(dnE`ylsHr`|L8o%JWyb2y}!|oE0WmkO{nq_AICRc_Aqb_Km3QIp= z!u?+uFoTyE$Zhies|bvToC@JG7p*jtSaKqLoC*Ck3gfef\n') + # SOURCE LINE 13 + for result in c.results: + # SOURCE LINE 14 + context.write(u'
  • \n \n \'thumbnail\n \n
    \n \n ') + # SOURCE LINE 20 + context.write(unicode(result['title'])) + context.write(u'\n \n
  • \n') + # SOURCE LINE 24 + context.write(u' \n') + return '' + finally: + context.caller_stack.pop_frame() + + +def render_heading(context): + context.caller_stack.push_frame() + try: + c = context.get('c', UNDEFINED) + # SOURCE LINE 7 + context.write(u'\n 9001 results for "') + # SOURCE LINE 8 + context.write(unicode(c.query)) + context.write(u'":\n') + return '' + finally: + context.caller_stack.pop_frame() + + +def render_title(context): + context.caller_stack.push_frame() + try: + c = context.get('c', UNDEFINED) + # SOURCE LINE 3 + context.write(u'\n results for "') + # SOURCE LINE 4 + context.write(unicode(c.query)) + context.write(u'"\n') + return '' + finally: + context.caller_stack.pop_frame() + + diff --git a/trunk/data/templates/xhtml/results.mako.pyc b/trunk/data/templates/xhtml/results.mako.pyc new file mode 100644 index 0000000000000000000000000000000000000000..736d507305f2b1e3cb306e19c8710fac32cced22 GIT binary patch literal 3893 zcmd5<&2k$>5bj;sjwMHS;=~Do074uhI9SOID91%A2?a@^!@8(YE>c_T-LbTIrB!xk zgH1W7P!Ou}0K5SYz>UY?&Vk~>nHLD(*Sm@xIe{Dug`^qH^z`)h&(}S(KmFNk-2d(I z$Dvf88T@~Umj8$@!q1T%k;IWrM-o>yT}f)PSrf-N63@uyj6|T$N(AbhM4+6IXjV4o z#ndFOi)o0NlZW70km!_bHYEZZc;=;#EsGM>}74o*vSQU}WtHFa=C zqD38?m1s!^E0np>ISpOoC-`(~7}*o(vSMW8q0#YnoLH0Pb{6z72nQy1G3x*RR*ebMku|&4QaHtQ@Gsi^vv;Gw!qI=@+ST!% zrFSQK*aH<#f}GPBaca(rv*2m)7L);zzqB85^=tF zZXT!~%Z|I{zJ4kCLz`R37-*U%~y1Er{)1=Vge3QiiZ57|SI zT4o`1O<+iFgK$U7%ecq~KqiWTR)r`IE%1%HYpmt2&w4j*e)LK2<_)cYUjfHuwJt_+ zm`27Uij;Ajj!QXZ4$yFq6<>Aq=)?}1s9V$z-U_D2;|EK`Rx#R2qrLN#{3<$eny5HS z&a%7gHmmPN(B@rDcouakdL1p_fWOMJJOTU_Ez^p5<~;BWJOaWB_==(x9Y-uM5BNB{ ze<)&S<;LA#<-v@yW3hxk_s&R(Yk(RDFaW&IHK#&%$$^8HvJTiGVO}mg%Tqtf)0pO2 znBsAnOD}%x$tiX`_K3))^4z;EcPd>Mm4K68Gm%964rk&iIJc+B94HJ5MyJujXDv-y zadfp^rB!>qQLJK(OZ==Q@u6j`mgKTu3tEHBY+r3FitopfNquIz!c?aPEBMqd6&nxx zE!-ZkRnuZn47Wx>oD{@pyA>q%>LoiNwzku()%FOKVx8-kx>I^|gDJvR)|%#-=vuJs zJV&LX1^Tn*9TvORO=9?lNL2&6X|mq%=tfO!?-h(ZUI9GT0`DR_8n4Oey@8PyrXovx znB%<(LWdTWX~+!r-eRZqkk^_rAZ5N{dQ4gB@w{b#^LHs!Q*#-q*>oE+hraDJ-SeQL zRpZmHrYZ{=YueKrSAt1}wCZfSHA&3!ct)yfEoWl7hfzJt(<{bRR}Yjb#j4yzmLA41 zk`PLkrwP5)n?mpVmoHywRnRSAQm}BgKd3@8kI9Qeqfw#QdxgpN%9zl`GA0M*5~O2t zzg>i=sz_G1+8%{7KdWFM2QGMR?aAEr^f9h=D4*C#s2pIje(yhs_| z?mY%v>*002PI3hxrYsdvX_!Z`Q}3$`(}5H*NohwZRP!z zyk3hPpYE|(c<-P)s2Vyto&!Fo5^FHJNX$Atlrw)WI(28R`Yz*tsaBt>yY*WAe7#j) F{0m;t7vlf` literal 0 HcmV?d00001 diff --git a/trunk/development.ini b/trunk/development.ini new file mode 100644 index 0000000..902f4b3 --- /dev/null +++ b/trunk/development.ini @@ -0,0 +1,64 @@ +# +# Yolanda - Pylons development environment configuration +# +# The %(here)s variable will be replaced with the parent directory of this file +# +[DEFAULT] +debug = true +# Uncomment and replace with the address which should receive any error reports +#email_to = you@yourdomain.com +smtp_server = localhost +error_email_from = paste@localhost + +[server:main] +use = egg:Paste#http +host = 0.0.0.0 +port = 5000 + +[app:main] +use = egg:Yolanda +full_stack = true +cache_dir = %(here)s/data +beaker.session.key = yolanda +beaker.session.secret = somesecret + +# If you'd like to fine-tune the individual locations of the cache data dirs +# for the Cache data, or the Session saves, un-comment the desired settings +# here: +#beaker.cache.data_dir = %(here)s/data/cache +#beaker.session.data_dir = %(here)s/data/sessions + +# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* +# Debug mode will enable the interactive debugging tool, allowing ANYONE to +# execute malicious code after an exception is raised. +#set debug = false + + +# Logging configuration +[loggers] +keys = root, yolanda + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = INFO +handlers = console + +[logger_yolanda] +level = DEBUG +handlers = +qualname = yolanda + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/trunk/docs/index.txt b/trunk/docs/index.txt new file mode 100644 index 0000000..6e3b34d --- /dev/null +++ b/trunk/docs/index.txt @@ -0,0 +1,12 @@ +yolanda ++++++++ + +This is the main index page of your documentation. It should be written in +`reStructuredText format `_. + +You can generate your documentation in HTML format by running this command:: + + setup.py pudge + +For this to work you will need to download and install ``buildutils`` and +``pudge``. diff --git a/trunk/setup.cfg b/trunk/setup.cfg new file mode 100644 index 0000000..f429673 --- /dev/null +++ b/trunk/setup.cfg @@ -0,0 +1,59 @@ +[egg_info] +tag_build = dev +tag_svn_revision = true + +[easy_install] +find_links = http://www.pylonshq.com/download/ + +[pudge] +theme = pythonpaste.org + +# Add extra doc files here with spaces between them +docs = docs/index.txt + +# Doc Settings +doc_base = docs/ +dest = docs/html + +# Add extra modules here separated with commas +modules = yolanda +title = Yolanda +organization = Pylons + +# Highlight code-block sections with Pygments +highlighter = pygments + +# Optionally add extra links +#organization_url = http://pylonshq.com/ +#trac_url = http://pylonshq.com/project +settings = no_about=true + +# Optionally add extra settings +# link1=/community/ Community +# link2=/download/ Download + +[publish] +doc-dir=docs/html +make-dirs=1 + +# Babel configuration +[compile_catalog] +domain = yolanda +directory = yolanda/i18n +statistics = true + +[extract_messages] +add_comments = TRANSLATORS: +output_file = yolanda/i18n/yolanda.pot +width = 80 + +[init_catalog] +domain = yolanda +input_file = yolanda/i18n/yolanda.pot +output_dir = yolanda/i18n + +[update_catalog] +domain = yolanda +input_file = yolanda/i18n/yolanda.pot +output_dir = yolanda/i18n +previous = true diff --git a/trunk/setup.py b/trunk/setup.py new file mode 100644 index 0000000..c5a63de --- /dev/null +++ b/trunk/setup.py @@ -0,0 +1,31 @@ +try: + from setuptools import setup, find_packages +except ImportError: + from ez_setup import use_setuptools + use_setuptools() + from setuptools import setup, find_packages + +setup( + name='Yolanda', + version="", + #description='', + #author='', + #author_email='', + #url='', + install_requires=["Pylons>=0.9.6.1"], + packages=find_packages(exclude=['ez_setup']), + include_package_data=True, + test_suite='nose.collector', + package_data={'yolanda': ['i18n/*/LC_MESSAGES/*.mo']}, + #message_extractors = {'yolanda': [ + # ('**.py', 'python', None), + # ('templates/**.mako', 'mako', None), + # ('public/**', 'ignore', None)]}, + entry_points=""" + [paste.app_factory] + main = yolanda.config.middleware:make_app + + [paste.app_install] + main = pylons.util:PylonsInstaller + """, +) diff --git a/trunk/test.ini b/trunk/test.ini new file mode 100644 index 0000000..50367f9 --- /dev/null +++ b/trunk/test.ini @@ -0,0 +1,21 @@ +# +# Yolanda - Pylons testing environment configuration +# +# The %(here)s variable will be replaced with the parent directory of this file +# +[DEFAULT] +debug = true +# Uncomment and replace with the address which should receive any error reports +#email_to = you@yourdomain.com +smtp_server = localhost +error_email_from = paste@localhost + +[server:main] +use = egg:Paste#http +host = 0.0.0.0 +port = 5000 + +[app:main] +use = config:development.ini + +# Add additional test specific configuration options as necessary. diff --git a/trunk/yolanda/__init__.py b/trunk/yolanda/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/trunk/yolanda/__init__.pyc b/trunk/yolanda/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88e92f7d7ff6427437a8de4d3084f130a95c1c90 GIT binary patch literal 135 zcmdn|iI*$It<58u0SXv_v;z&ryk0?NF$YkuO>TZlX-=vg$cADd GW&i+vxF44Q literal 0 HcmV?d00001 diff --git a/trunk/yolanda/config/environment.py b/trunk/yolanda/config/environment.py new file mode 100644 index 0000000..efd35df --- /dev/null +++ b/trunk/yolanda/config/environment.py @@ -0,0 +1,33 @@ +"""Pylons environment configuration""" +import os + +from pylons import config + +import yolanda.lib.app_globals as app_globals +import yolanda.lib.helpers +from yolanda.config.routing import make_map + +def load_environment(global_conf, app_conf): + """Configure the Pylons environment via the ``pylons.config`` + object + """ + # Pylons paths + root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + paths = dict(root=root, + controllers=os.path.join(root, 'controllers'), + static_files=os.path.join(root, 'public'), + templates=[os.path.join(root, 'templates')]) + + # Initialize config with the basic options + config.init_app(global_conf, app_conf, package='yolanda', + template_engine='mako', paths=paths) + + config['routes.map'] = make_map() + config['pylons.g'] = app_globals.Globals() + config['pylons.h'] = yolanda.lib.helpers + + # Customize templating options via this variable + tmpl_options = config['buffet.template_options'] + + # CONFIGURATION OPTIONS HERE (note: all config options will override + # any Pylons config options) diff --git a/trunk/yolanda/config/environment.pyc b/trunk/yolanda/config/environment.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b88d7fa43ada384ecc5c3cb4d102745426d292d GIT binary patch literal 1319 zcmb_bOK;Oa5FXokw0X1&v)Q%0n@W|^QxSiN zKf~|f55PBTr-a85$Ge%wx3e?fjK6;Gck(x1-epujZT!E&vY)W!L{sbml!m)2mOlYV{sQ;HyxT5ocj+{%<afz7JxC6dT@`!dsJJ1Gd z+LVKoW6C?Ui-3#*cMK@w@-AJt4$1Cb??La8?2|n4{yucTPU!hvgYr}GH{c52bE!31 zV(3<4_zyO3Wa?eBS>dT3R}9W(ogp4GzZRMEA_yTWjd6}C1j?00DN$Oag3BD*ktGYM zg!PRmwsR#j)PNGirckMagD0p+vvs-@UcNOd)p_bp4^WBFOR0sw4&5_go)5W|wH-*M z*&@;yEw$X=I_c%1va-+MnQs>h;l}&R6I1ZK*sGDhjK{%Pe+kF-+2pd+>88poom+3` zI}%@3l6Z8EqP%czq>kYw#~7)lOVXl<{UkC&P?DuG^Hf!Jzpdn$(JsQKwK`@9$JOI9wB*{&dB(XQ} z=UBC;qKTVQXEH|Z;{$?X4jw<@FpvL0)$CNXF>D{AN`K7rAobGo9-qVii;Dljho7s9 Xjmfu4Tyk$M*VYPp;UIhjE(YOGHaj?! literal 0 HcmV?d00001 diff --git a/trunk/yolanda/config/middleware.py b/trunk/yolanda/config/middleware.py new file mode 100644 index 0000000..e340ab1 --- /dev/null +++ b/trunk/yolanda/config/middleware.py @@ -0,0 +1,57 @@ +"""Pylons middleware initialization""" +from paste.cascade import Cascade +from paste.registry import RegistryManager +from paste.urlparser import StaticURLParser +from paste.deploy.converters import asbool + +from pylons import config +from pylons.error import error_template +from pylons.middleware import error_mapper, ErrorDocuments, ErrorHandler, \ + StaticJavascripts +from pylons.wsgiapp import PylonsApp + +from yolanda.config.environment import load_environment + +def make_app(global_conf, full_stack=True, **app_conf): + """Create a Pylons WSGI application and return it + + ``global_conf`` + The inherited configuration for this application. Normally from + the [DEFAULT] section of the Paste ini file. + + ``full_stack`` + Whether or not this application provides a full WSGI stack (by + default, meaning it handles its own exceptions and errors). + Disable full_stack when this application is "managed" by + another WSGI middleware. + + ``app_conf`` + The application's local configuration. Normally specified in the + [app:] section of the Paste ini file (where + defaults to main). + """ + # Configure the Pylons environment + load_environment(global_conf, app_conf) + + # The Pylons WSGI app + app = PylonsApp() + + # CUSTOM MIDDLEWARE HERE (filtered by error handling middlewares) + + if asbool(full_stack): + # Handle Python exceptions + app = ErrorHandler(app, global_conf, error_template=error_template, + **config['pylons.errorware']) + + # Display error documents for 401, 403, 404 status codes (and + # 500 when debug is disabled) + app = ErrorDocuments(app, global_conf, mapper=error_mapper, **app_conf) + + # Establish the Registry for this application + app = RegistryManager(app) + + # Static files + javascripts_app = StaticJavascripts() + static_app = StaticURLParser(config['pylons.paths']['static_files']) + app = Cascade([static_app, javascripts_app, app]) + return app diff --git a/trunk/yolanda/config/middleware.pyc b/trunk/yolanda/config/middleware.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbc07fd12b9441457362cce46d08b8ded9a1fd35 GIT binary patch literal 2075 zcmb_dUvC>l5TEnE*iM`{BxwoaVU-t*gzQ&9RYldb6ev}6Nmc2p%Gunl?dA4vPrK^` zqx7kWH$DQNf)_p)UjSxy9owi#ym0odcV=g2e>=aK@$Y~3y4llTo~5vSw(<8XeC;1N zWB>_{5o9&UBTzL+Y7miJhrAA|0ZAjs4al3IT9CAY+=P4!R2!0ZkXw*;$ro;_5g2_@k$(8(xJE=?g7e0dsE!`FlkGV~GCW2xQ z6|tB~>&)VNUh=6h>xFZN`_q^4^D}Pj-9ig@aC@b-3Wg-7x}3;qkatlQ#%MEkqNo&i zV$eX9+ga%gURA<4GJHaYr#hV%qIA~Vc-1pr;$4i}N1K4+TYinWjjWsv=X7u>-272h z1yvtaO7mCxC z8WSm(mtIHuiy7s`Oc?1z#sXt=6WmO+VQwbvrtcwpp-sV+TCj=H#mbLEKd(=pJbm=? z`NbP%MM^2g^aLFUcE&B@#q?tnsl@OO(PXaF*gBr(8-QNT1a2`5&n~rl?|fDneJwMA zpcw6E{_@@l8(b|`crr2JbLBo`h2W(urx*w}^XX%8YMH(%nfNgk72!l@7%`uo_S50Y z$EmdZN(p~Xz{zfAqI@3{hUld5Ws;q+4GX=o z4H9f6QaO>xog`pl1^zX9`SL-@3-Rzj_+SIP6}E?9ymGLNpk+?8g3EFln7B!4NHtaY z1~c?wqyB>F4-l%@Qduw8EAD2YhLI&~9AnA>J0OdgT5jB>p-w}a2J#$Jk6!>+UpGFGk^95uHe)_r4)27ccX9*P6B06*9- za5kFhLX1kO?8usQw9pFEg^!$>m-$Kxr8C-Kxmx)13!V!)gO0WL$n!z3-f8q|dr`0P zaeb%Wi4LQq=*8eeT=K1WJkE4F9y@B~6_w5~4b9nK+;_;JHp>?6J2;KIyBe29}Z5&r`lmH<8|bT(JwA!U@MBU({Ed}{Q2 IQtRXAZ?duw)&Kwi literal 0 HcmV?d00001 diff --git a/trunk/yolanda/config/routing.py b/trunk/yolanda/config/routing.py new file mode 100644 index 0000000..34d164b --- /dev/null +++ b/trunk/yolanda/config/routing.py @@ -0,0 +1,46 @@ +"""Routes configuration + +The more specific and detailed routes should be defined first so they +may take precedent over the more generic routes. For more information +refer to the routes manual at http://routes.groovie.org/docs/ +""" +from pylons import config +from routes import Mapper + +def make_map(): + """Create, configure and return the routes Mapper""" + map = Mapper(directory=config['pylons.paths']['controllers'], + always_scan=config['debug']) + + # The ErrorController route (handles 404/500 error pages); it should + # likely stay at the top, ensuring it can always be resolved + map.connect('error/:action/:id', controller='error') + + # CUSTOM ROUTES HERE + + # front page (search form and search errors) + map.connect('', controller='index', action='index') + + # search results + map.connect('search_results', 'results', controller='search', action='results') + + # videos + def video_expand(kargs): + # only alter kargs if a video keyword arg is present + if 'video' not in kargs: + return kargs + + video = kargs.pop('video') + kargs['id'] = video['id'] + kargs['title'] = video['title'] + + return kargs + + map.connect('video_page', 'video/:id/:title', controller='video', _filter=video_expand) + # map.connect('video_file', 'video/:id.ogv', controller='video', action='file' _filter=video_expand) + + # everything else + map.connect(':controller/:action/:id') + # map.connect('*url', controller='template', action='view') + + return map diff --git a/trunk/yolanda/config/routing.pyc b/trunk/yolanda/config/routing.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b4531a3cc92687d49670733af17c5d2d463d651 GIT binary patch literal 1432 zcmb_cy>1gh5S}~RiR0kJ`9WYQ#g#6QuRx-(B7_7&G^B8-(pa0@vAy`bd)nO#v6NJy z^r-Cm>T; zBv7VskwU_D0~QS^n{d%2y9u8uum!RO=YuUy{y}PNYL6}}jGn4lZG~4xcRC;Dm@SRP z%vD&ZsVXv|WhT)JRieynOmcHmmomFV@=TQ`$5dJ8GiNeC$5m%3R+$$I%qoioO4L3x zS7_N8tItrQrQ)&PFneokbSOPFb{U(oIOUvBbMxk<(6uNt;j_8-)hN%`6=v3$D}_U2 zXSpUrik=Y#!TR2ABQYfA2IlGh~eD=8m9^#RvDVc91L*=j-m4$@nI z8vvDp+yc1`vJH1hlB}Gl#g4UIfsTy##^TA_objTfB6ds@5lZb&Wi@vrxfW77`4(oR)MJl4i8@qCk$f{PQ z(Qa4?KX-nYE(j)XO<5w*$+jpziItnULTKOObiAx*?to5ct+Dw?6udb3NJ-!MD?fyX zAcB)HKhr$-~iA7hJ-g#zXa}LWI+yxWKL^VjxN!%M!wCV)N$89j} z2#t;qso)~K7}`i9#nD%C$`%pIR)Z`?vq^={LVH(AqVfC|nuh!J%9j{-hTmJ6YQWy$ zTL?RIV;*2Y5|w*Fr+jXfm}^zK+}R>unUX#sk$YR~#l02RF>J5WvthOJOh;&7g4Y#g zoRA$jg0!2o)BR*G*-Hb)F{%q8cC3^ZyLm4iy(Tp|ZR(?vNCu$4R$&)ao}*8aulu&2Hl?{8hy{ vCiF>9CSh^n#>QrOJ>rJP37(Su&|^6L10#+bJzW}Em-sSlBCD;Wm-N!#t}0$v literal 0 HcmV?d00001 diff --git a/trunk/yolanda/controllers/__init__.py b/trunk/yolanda/controllers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/trunk/yolanda/controllers/__init__.pyc b/trunk/yolanda/controllers/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5f0ddedcd0090ace5a75f905254e4769ee7829a GIT binary patch literal 147 zcmdn|iI*$It<58u0SXv_v;zm`WgATsrq@DImP27bZ zlsqlshxjvo0P2))8wsAWBX_x`FV$7&RMq_T_pN^Z{Lh~d2)kQqc|)D&ZACpb<3k{nSbFg{@akXQtveZHhqb zsh+NNwlLM)R&zPu7-vf2HSvoriUa>2g{|~j%+}S+&PRv%hRs^fY(YaYkbx4g4MI-< z?-`3AY%(b!R<@-q)4?3I)FsQdOm<{aXu@RY$|O@JJ1{81=V9NZ9zlRT49iJqpXXok5CqF-9Z`hwU3jiEY1|@lK<|HYLYS=92HVd*0zR7QN zsxGYKRBZ9CIfczV0Ml=>9CkewGr6FFQP>mVzh!N-s7o4Ew(ukGveCLOIKRv&xK*{> zzh(Pe_aljmQ4T#my-Un{tb1Ur;#Tx|bU%6!Wq=(6SuN0i$;un9K|$XN^z0SWz!+XK zra%%0{AVo2<$tY^iO@{(A}4mUAf=0W}18wPe?f4O| zKx!>bD{hf#Dj%mbE$e($;1wHEe8bW-xx>2TVgimNF%GVY_I^d5ApRZ?DfVu!8z1$K z+DGjHKod`DKLqNMj^P&13fRLf(8;IRhhk}@vWJJpEqzYXHXw>^BN`TVI-D9$LdH{8 d4xcM==32w^2<^KKvfrbEWa4IgGdhm@@xLoi7Ha?i literal 0 HcmV?d00001 diff --git a/trunk/yolanda/controllers/index.py b/trunk/yolanda/controllers/index.py new file mode 100644 index 0000000..977b0cf --- /dev/null +++ b/trunk/yolanda/controllers/index.py @@ -0,0 +1,10 @@ +import logging + +from yolanda.lib.base import * + +log = logging.getLogger(__name__) + +class IndexController(BaseController): + + def index(self): + return render('/xhtml/index.mako') diff --git a/trunk/yolanda/controllers/index.pyc b/trunk/yolanda/controllers/index.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f4b9f0a1133452032b74f0ec2ac9825d6456e76 GIT binary patch literal 687 zcmb_ZOHRWu5S_RmpaKfFh*;EXBm}74fP}h8*^o_?CT<$VagaTg+I3lQ4z9o@I1d+q z8K-J5P|NdXY>nT%8Grv?41T^opEB639{EQy_dt--4xj>v+gLyqz^ei%1*i^e1Bknj zcR=-E5kTIB4}dMeTioY&vyjQkKU&i;pb!~ua7g%Uabt(sOwpAxL1OWU5iOrrE6 zBo7|kEk$zK)JmFCJLzmDH;qnBo=UVUQ|(XLz6ZCf^S(jfHy1r)X4V5i*dfGIf+R6% zt&#*;caqdizS4AzSjIuZ5p+a6r4uqQp)W#?kwG^_QJMm;DBkro(&cj%Re&PUW6EaQt8AVjza%AIguLWB>pF literal 0 HcmV?d00001 diff --git a/trunk/yolanda/controllers/search.py b/trunk/yolanda/controllers/search.py new file mode 100644 index 0000000..3981ae4 --- /dev/null +++ b/trunk/yolanda/controllers/search.py @@ -0,0 +1,31 @@ +import logging + +from yolanda.lib.base import * + +log = logging.getLogger(__name__) + +class SearchController(BaseController): + + def results(self): + + # maybe c.query could / should be a dictionary ? + c.query = request.params['query'] + + # c.results dummy + c.results = [ + {'title': 'foobar', 'id': '23' , 'thumbnail': h.url_for('/images/404.png')}, + {'title': 'blablupp', 'id': '42', 'thumbnail': h.url_for('/images/404.png')}, + {'title': 'uiae nrdt', 'id': '555' , 'thumbnail': h.url_for('/images/404.png')}, + {'title': 'uiaenrtd uiaenrtd uiaenrdt', 'id': '666666666', 'thumbnail': h.url_for('/images/404.png')}, + {'title': 'foobar', 'id': '23' , 'thumbnail': h.url_for('/images/404.png')}, + {'title': 'blablupp', 'id': '42', 'thumbnail': h.url_for('/images/404.png')}, + {'title': 'James Bond drives a bulletproof Aston Martin !!!', 'id': '555' , 'thumbnail': h.url_for('/images/404.png')}, + {'title': 'uiaenrtd uiaenrtd uiaenrdt uiaenrtd uiaenrtd', 'id': '666666666', 'thumbnail': h.url_for('/images/404.png')}, + {'title': 'foobar', 'id': '123' , 'thumbnail': h.url_for('/images/404.png')}, + {'title': 'blablupp', 'id': '42', 'thumbnail': h.url_for('/images/404.png')}, + {'title': 'lolwtf hax !!!11', 'id': '9001', 'thumbnail': h.url_for('/images/404.png')} + ] + + return render('/xhtml/results.mako') + # return request.params['query'] + # return h.form(h.url(action='search'), method='get') diff --git a/trunk/yolanda/controllers/search.pyc b/trunk/yolanda/controllers/search.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a1c40c7cd72eb4accaefd0791572f08fa5d126c GIT binary patch literal 1536 zcmb_c&2AGh5T0y)+NLdSDMEtN_QVRIY|hXueZRqWy@;J9xdmxwK(8HGJu$6_d<{Y-V5VkgltuKV#EVoChD6TcV#8 z;m*#Ed$cgZ-!V~oYMtFZ#}`N&{Ru~5Do)u~r$YxD;7PmPaoZ%srzz$-w#t^|;dNWMu5j#(VNMRuxj&iyO^RozkO-X7Gc1 zN>ZGfT*XDEUF_^IJ~LVrQp9M>VsfbsFK<7g{Cm)vo^_c%C)XDMs++Y3m4AQjYQ%N& z0e*rASFH^b$Gi*~W@vFZOKHJs0r> z{0Tq8x9|fn-lW;KfZ$Lo9^1QhwpeaJ3tu&CY zBLjJj3dliGnL-=WczOI(VW1wY#$t*VtOLgo9=xjv1I#7m(-htj?`oJJRAGsvbYOio zNT8L{n?RDIpb1PyY7=$<)3bDMueWxJL76n1Yg{A&O|b)&H`{wR9HNs)s=VdJD)dP| z+X{WyYJ6L;4<2*@wX6C*GSv1A-piQ-X%#G_r6?UQN~3d4riQ>+Onmp{E+ogU&A_3n ztlH*Kp>&q1=T0FsX^B}~**gi3~4s=_co|n$Yyv{4hta+{$ip9?blkg%M6ZUzRP2C(b%N3UepJ%l* zTmmv9U)kCE)HX)Qu0Ca2)(v(n#~3oiXyRGZWAuQx*E( zCc}6`M1c*9``zOujmP|Cr6@Iel1^kmiub~RH|;&s{QIscg_wi=rRrCaUPG0p literal 0 HcmV?d00001 diff --git a/trunk/yolanda/controllers/video.py b/trunk/yolanda/controllers/video.py new file mode 100644 index 0000000..8697bda --- /dev/null +++ b/trunk/yolanda/controllers/video.py @@ -0,0 +1,14 @@ +import logging + +from yolanda.lib.base import * + +log = logging.getLogger(__name__) + +class VideoController(BaseController): + + def index(self): + return 'show a video html page' + + def file(self): + return 'serve video' + diff --git a/trunk/yolanda/controllers/video.pyc b/trunk/yolanda/controllers/video.pyc new file mode 100644 index 0000000000000000000000000000000000000000..546ab92ae7a48224c47e9c0a14cd9fec466f0eea GIT binary patch literal 846 zcmb_ay;8zJ5Z+t>1yQUltWstyNbQWH4m1`HMR1%kO$^BrG8{Q3cc9eR>D%~bzJTr~ z2&IMGl#Oj7B-G zOl;Se1l~l=(91KaJzd1!O35fsBF_|ye7e=*Z3EgXD|F{8Q#PF^_}b)L%ml1IsUEQ} z7E7#{?)dqfU~k;G*>NVZ&E+a;F5Ao@K^W%I48zd0N@b>!g(TItN%h%lN28SfHz%K8 z?tpgrY7Nn}UDgbPRB4*!sW~NiGx@H}M%_`Q(ePMPH236#h0oJA%#dQt37tLi+5K2$ XmA&%TJgTc|IM>{RZVI@D$o^l zXq~}NfFA%~)-zCZxT+WA$q+toH52>2HBuzw-72yV)^CK3%x}JGnapoob%8e%`AF|N z)2Bx$PWR4)=+0Z*@i~GFI@%yCYn zOk^@>k+foJ2*&mQM5pY=nPh}D-}B2c;S@v1d%}}z(BB3fvC4xHndz!uWrh^vAcCRl z&W6hxdBOPLL^x{OjV7|kmk7<)?{wpgjZF-)IeLq!MU%qduFsk^n+E&J`>~rZ_Q&)X zeK{xAoIjyp)C`!{lx8|~Vy8JzOSEvl^J=i9Qnxu*UUJ@6DBttR(*KZZsYAI=f;t59Tny#wux|~z}+wVJZ`R%XY7g&GW^#6*M8%ID12$B)X z7ODuk1<`_TL$skg5FO|)L>IaT(SzQA*nsXs^bzr$HmXhN7$R=;4yrBaZHR5?9f%$1 zU5MSr*G07lJ%AWM??dc2)*h+@=tGD@=sOU1ppPJq8s7%0W9SozlSc2OdI#!VsP`b= z4>gnJF4R4Udnh*{V@#>27{375z>nes%z%!#51Ft*eaP~gmt%-i$Wy3~P;TKm!uDbZ z5gACkXu)ieLU&Ga@ahjlv|ikY_!wm$=R*e1y(aO)Tqcv;$>fQty){}(n|%H3ERLU9 zbEQh@5>F={(}`OL3Y|NbOpQ(4auO6(&pt`=x=aimw~3it$ilmL>6KPL%QBg)ZY6M| zSp7-gaDxi)#2yOYWtkUq>3h60^;FG*Yv%csm9Li4dEXCvw=lJn!QrHH%G5)S;&(|r zKmYFRZK=aH+c|hXG1mK-cGBmwtjV=Ss+Fa(RBh(Xu*Ii2--R=^nyx~=t6Zxx_p*t_ zi88-Qa#_!$_wpz2`P$R0se#M4vM!~48tVBcbOm|C$6+4Ra{DACO)oJHW}N0WJrAJ@ zuANth))QLpkc6iJi0}q@L$ZbIHnGXU+!2Yh`pQ%?P<9IgE-wvOGkh8Ku633*?Qm=- z^)z%X>nmkx4j4!0bL%rJ8?1+9K@jd!+KuPtQjTk--PqY;yfT`&&&S>_>*{Y!tI3#0 zYqVIU2Xu*-<66*dayQk~`K8RVz)Y51nsTX04Hw=f{U4bb-@#4hUMt<9{qO;a&~cWP zrl9Q1+G3??tWw$`Wkl0}8xxQ+N-0lK$_G7n(wrXAq^_ThYal-PSKo+VLdp%NJUS`Q zq36=pVMri^i+@yQ#zIENp%Z1K8y~31x^*ktRQbt6> zXfE|aTIabL(nISvHg0w98J3$HM1s`e(S%*fi9AD)y?FF8K&1`MkPEg-u3WHX88aDp z471~2D?eX@+zcE=XlCfY)9Dz(FPbU&k_mCgBzn{@tUUI9fX$d% zjyaLm55h=HkT-{C;0!$Vv9*X3G#*Cs4t9}4Ou)YD(Xyv&XhsH$l(l`e5p9Ehu9TKM zWJEtu1?vzAy6i@YiTan=WDZ~nmSI`x_$5{rG9=HqdMf9=_)JjOF1K~fTJ+90;b#dd y#Zw2+jkqS{&YKjG3=OTBGTP*<;bBbMKM!ML_C2b8qI0Rc{hjdcL^RF+o)+KjpJt2z literal 0 HcmV?d00001 diff --git a/trunk/yolanda/model/__init__.py b/trunk/yolanda/model/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/trunk/yolanda/model/__init__.pyc b/trunk/yolanda/model/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42753c638bab66fdedaf5b04f6f62315171474cc GIT binary patch literal 141 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 + + + + + + + + + + + + Yolanda - ${self.title()} + + + + + + +
    +

    + ${self.heading()} +

    +
    + + + + ${self.body()} + + + + + + + + diff --git a/trunk/yolanda/templates/xhtml/index.mako b/trunk/yolanda/templates/xhtml/index.mako new file mode 100644 index 0000000..aaa1e6d --- /dev/null +++ b/trunk/yolanda/templates/xhtml/index.mako @@ -0,0 +1,11 @@ +<%inherit file="base.mako"/> + +<%def name="title()"> + front page + + +<%def name="heading()"> + Welcome, youngling ! + + +LOL INDEX diff --git a/trunk/yolanda/templates/xhtml/results.mako b/trunk/yolanda/templates/xhtml/results.mako new file mode 100644 index 0000000..78e8639 --- /dev/null +++ b/trunk/yolanda/templates/xhtml/results.mako @@ -0,0 +1,27 @@ +<%inherit file="base.mako"/> + +<%def name="title()"> + results for "${c.query}" + + +<%def name="heading()"> + 9001 results for "${c.query}": + + +<%def name="results_listing(results)"> +
      + % for result in c.results: +
    1. + + thumbnail for "${result[ + +
      + + ${result['title']} + +
    2. + % endfor +
    + + +${results_listing(c.results)} diff --git a/trunk/yolanda/tests/__init__.py b/trunk/yolanda/tests/__init__.py new file mode 100644 index 0000000..91ff2e7 --- /dev/null +++ b/trunk/yolanda/tests/__init__.py @@ -0,0 +1,40 @@ +"""Pylons application test package + +When the test runner finds and executes tests within this directory, +this file will be loaded to setup the test environment. + +It registers the root directory of the project in sys.path and +pkg_resources, in case the project hasn't been installed with +setuptools. It also initializes the application via websetup (paster +setup-app) with the project's test.ini configuration file. +""" +import os +import sys +from unittest import TestCase + +import pkg_resources +import paste.fixture +import paste.script.appinstall +from paste.deploy import loadapp +from routes import url_for + +__all__ = ['url_for', 'TestController'] + +here_dir = os.path.dirname(os.path.abspath(__file__)) +conf_dir = os.path.dirname(os.path.dirname(here_dir)) + +sys.path.insert(0, conf_dir) +pkg_resources.working_set.add_entry(conf_dir) +pkg_resources.require('Paste') +pkg_resources.require('PasteScript') + +test_file = os.path.join(conf_dir, 'test.ini') +cmd = paste.script.appinstall.SetupCommand('setup-app') +cmd.run([test_file]) + +class TestController(TestCase): + + def __init__(self, *args, **kwargs): + wsgiapp = loadapp('config:test.ini', relative_to=conf_dir) + self.app = paste.fixture.TestApp(wsgiapp) + TestCase.__init__(self, *args, **kwargs) diff --git a/trunk/yolanda/tests/functional/__init__.py b/trunk/yolanda/tests/functional/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/trunk/yolanda/tests/functional/test_account.py b/trunk/yolanda/tests/functional/test_account.py new file mode 100644 index 0000000..e2f5953 --- /dev/null +++ b/trunk/yolanda/tests/functional/test_account.py @@ -0,0 +1,7 @@ +from yolanda.tests import * + +class TestAccountController(TestController): + + def test_index(self): + response = self.app.get(url_for(controller='account')) + # Test response... diff --git a/trunk/yolanda/tests/functional/test_index.py b/trunk/yolanda/tests/functional/test_index.py new file mode 100644 index 0000000..b8838bd --- /dev/null +++ b/trunk/yolanda/tests/functional/test_index.py @@ -0,0 +1,7 @@ +from yolanda.tests import * + +class TestIndexController(TestController): + + def test_index(self): + response = self.app.get(url_for(controller='index')) + # Test response... diff --git a/trunk/yolanda/tests/functional/test_search.py b/trunk/yolanda/tests/functional/test_search.py new file mode 100644 index 0000000..6a9df42 --- /dev/null +++ b/trunk/yolanda/tests/functional/test_search.py @@ -0,0 +1,7 @@ +from yolanda.tests import * + +class TestSearchController(TestController): + + def test_index(self): + response = self.app.get(url_for(controller='search')) + # Test response... diff --git a/trunk/yolanda/tests/functional/test_video.py b/trunk/yolanda/tests/functional/test_video.py new file mode 100644 index 0000000..4a2040d --- /dev/null +++ b/trunk/yolanda/tests/functional/test_video.py @@ -0,0 +1,7 @@ +from yolanda.tests import * + +class TestVideoController(TestController): + + def test_index(self): + response = self.app.get(url_for(controller='video')) + # Test response... diff --git a/trunk/yolanda/tests/test_models.py b/trunk/yolanda/tests/test_models.py new file mode 100644 index 0000000..e69de29 diff --git a/trunk/yolanda/websetup.py b/trunk/yolanda/websetup.py new file mode 100644 index 0000000..012683e --- /dev/null +++ b/trunk/yolanda/websetup.py @@ -0,0 +1,14 @@ +"""Setup the Yolanda application""" +import logging + +from paste.deploy import appconfig +from pylons import config + +from yolanda.config.environment import load_environment + +log = logging.getLogger(__name__) + +def setup_config(command, filename, section, vars): + """Place any commands to setup yolanda here""" + conf = appconfig('config:' + filename) + load_environment(conf.global_conf, conf.local_conf)