Skip to content

Commit

Permalink
Merge pull request #135 from wendall911/pyramid-example
Browse files Browse the repository at this point in the history
Pyramid example
  • Loading branch information
benoitc committed Jun 5, 2012
2 parents 7d8aa08 + 202839a commit c50b6b3
Show file tree
Hide file tree
Showing 25 changed files with 445 additions and 0 deletions.
2 changes: 2 additions & 0 deletions examples/pyramidapp/MANIFEST.in
@@ -0,0 +1,2 @@
include *.txt *.ini *.cfg *.rst
recursive-include pyramid_couchdb_example *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml
4 changes: 4 additions & 0 deletions examples/pyramidapp/README
@@ -0,0 +1,4 @@
Example implementation for http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/database/couchdb.html

$ python setup.py develop
$ pserve --reload development.ini
49 changes: 49 additions & 0 deletions examples/pyramidapp/development.ini
@@ -0,0 +1,49 @@
[app:main]
use = egg:pyramid_couchdb_example

pyramid.reload_templates = true
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid.debug_routematch = false
pyramid.debug_templates = true
pyramid.default_locale_name = en
pyramid.includes = pyramid_debugtoolbar

couchdb.uri = http://localhost:5984/
couchdb.db = mydb

[server:main]
use = egg:waitress#main
host = 0.0.0.0
port = 6543

# Begin logging configuration

[loggers]
keys = root, pyramid_couchdb_example

[handlers]
keys = console

[formatters]
keys = generic

[logger_root]
level = INFO
handlers = console

[logger_pyramid_couchdb_example]
level = DEBUG
handlers =
qualname = pyramid_couchdb_example

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s

# End logging configuration
19 changes: 19 additions & 0 deletions examples/pyramidapp/pyramid_couchdb_example.egg-info/PKG-INFO
@@ -0,0 +1,19 @@
Metadata-Version: 1.1
Name: pyramid-couchdb-example
Version: 0.0
Summary: pyramid_couchdb_example
Home-page: UNKNOWN
Author: UNKNOWN
Author-email: UNKNOWN
License: UNKNOWN
Description: Example implementation for http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/database/couchdb.html

$ python setup.py develop
$ pserve --reload development.ini

Keywords: web pyramid pylons
Platform: UNKNOWN
Classifier: Programming Language :: Python
Classifier: Framework :: Pylons
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
25 changes: 25 additions & 0 deletions examples/pyramidapp/pyramid_couchdb_example.egg-info/SOURCES.txt
@@ -0,0 +1,25 @@
MANIFEST.in
README
development.ini
setup.cfg
setup.py
pyramid_couchdb_example/__init__.py
pyramid_couchdb_example/tests.py
pyramid_couchdb_example/views.py
pyramid_couchdb_example.egg-info/PKG-INFO
pyramid_couchdb_example.egg-info/SOURCES.txt
pyramid_couchdb_example.egg-info/dependency_links.txt
pyramid_couchdb_example.egg-info/entry_points.txt
pyramid_couchdb_example.egg-info/not-zip-safe
pyramid_couchdb_example.egg-info/requires.txt
pyramid_couchdb_example.egg-info/top_level.txt
pyramid_couchdb_example/static/favicon.ico
pyramid_couchdb_example/static/footerbg.png
pyramid_couchdb_example/static/headerbg.png
pyramid_couchdb_example/static/ie6.css
pyramid_couchdb_example/static/middlebg.png
pyramid_couchdb_example/static/pylons.css
pyramid_couchdb_example/static/pyramid-small.png
pyramid_couchdb_example/static/pyramid.png
pyramid_couchdb_example/static/transparent.gif
pyramid_couchdb_example/templates/mytemplate.pt
@@ -0,0 +1 @@

@@ -0,0 +1,3 @@
[paste.app_factory]
main = pyramid_couchdb_example:main

@@ -0,0 +1 @@

@@ -0,0 +1,3 @@
pyramid
pyramid_debugtoolbar
waitress
@@ -0,0 +1 @@
pyramid_couchdb_example
52 changes: 52 additions & 0 deletions examples/pyramidapp/pyramid_couchdb_example/__init__.py
@@ -0,0 +1,52 @@
from pyramid.config import Configurator
from pyramid.events import subscriber, NewRequest, ApplicationCreated
from couchdbkit import *

import logging
log = logging.getLogger(__name__)

@subscriber(NewRequest)
def add_couchdb_to_request(event):
request = event.request
settings = request.registry.settings
db = settings['couchdb.server'].get_or_create_db(settings['couchdb.db'])
event.request.db = db

@subscriber(ApplicationCreated)
def application_created_subscriber(event):
settings = event.app.registry.settings
db = settings['couchdb.server'].get_or_create_db(settings['couchdb.db'])

try:
"""Test to see if our view exists.
"""
db.view('lists/pages')
except ResourceNotFound:
design_doc = {
'_id': '_design/lists',
'language': 'javascript',
'views': {
'pages': {
'map': '''
function(doc) {
if (doc.doc_type === 'Page') {
emit([doc.page, doc._id], null)
}
}
'''
}
}
}
db.save_doc(design_doc)

def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
config = Configurator(settings=settings)
""" Register server instance globally
"""
config.registry.settings['couchdb.server'] = Server(uri=settings['couchdb.uri'])
config.add_static_view('static', 'static', cache_max_age=3600)
config.add_route('home', '/')
config.scan()
return config.make_wsgi_app()
Binary file not shown.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions examples/pyramidapp/pyramid_couchdb_example/static/ie6.css
@@ -0,0 +1,8 @@
* html img,
* html .png{position:relative;behavior:expression((this.runtimeStyle.behavior="none")&&(this.pngSet?this.pngSet=true:(this.nodeName == "IMG" && this.src.toLowerCase().indexOf('.png')>-1?(this.runtimeStyle.backgroundImage = "none",
this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.src + "',sizingMethod='image')",
this.src = "static/transparent.gif"):(this.origBg = this.origBg? this.origBg :this.currentStyle.backgroundImage.toString().replace('url("','').replace('")',''),
this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.origBg + "',sizingMethod='crop')",
this.runtimeStyle.backgroundImage = "none")),this.pngSet=true)
);}
#wrap{display:table;height:100%}
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
65 changes: 65 additions & 0 deletions examples/pyramidapp/pyramid_couchdb_example/static/pylons.css
@@ -0,0 +1,65 @@
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;outline:0;font-size:100%;/* 16px */
vertical-align:baseline;background:transparent;}
body{line-height:1;}
ol,ul{list-style:none;}
blockquote,q{quotes:none;}
blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}
:focus{outline:0;}
ins{text-decoration:none;}
del{text-decoration:line-through;}
table{border-collapse:collapse;border-spacing:0;}
sub{vertical-align:sub;font-size:smaller;line-height:normal;}
sup{vertical-align:super;font-size:smaller;line-height:normal;}
ul,menu,dir{display:block;list-style-type:disc;margin:1em 0;padding-left:40px;}
ol{display:block;list-style-type:decimal-leading-zero;margin:1em 0;padding-left:40px;}
li{display:list-item;}
ul ul,ul ol,ul dir,ul menu,ul dl,ol ul,ol ol,ol dir,ol menu,ol dl,dir ul,dir ol,dir dir,dir menu,dir dl,menu ul,menu ol,menu dir,menu menu,menu dl,dl ul,dl ol,dl dir,dl menu,dl dl{margin-top:0;margin-bottom:0;}
ol ul,ul ul,menu ul,dir ul,ol menu,ul menu,menu menu,dir menu,ol dir,ul dir,menu dir,dir dir{list-style-type:circle;}
ol ol ul,ol ul ul,ol menu ul,ol dir ul,ol ol menu,ol ul menu,ol menu menu,ol dir menu,ol ol dir,ol ul dir,ol menu dir,ol dir dir,ul ol ul,ul ul ul,ul menu ul,ul dir ul,ul ol menu,ul ul menu,ul menu menu,ul dir menu,ul ol dir,ul ul dir,ul menu dir,ul dir dir,menu ol ul,menu ul ul,menu menu ul,menu dir ul,menu ol menu,menu ul menu,menu menu menu,menu dir menu,menu ol dir,menu ul dir,menu menu dir,menu dir dir,dir ol ul,dir ul ul,dir menu ul,dir dir ul,dir ol menu,dir ul menu,dir menu menu,dir dir menu,dir ol dir,dir ul dir,dir menu dir,dir dir dir{list-style-type:square;}
.hidden{display:none;}
p{line-height:1.5em;}
h1{font-size:1.75em;line-height:1.7em;font-family:helvetica,verdana;}
h2{font-size:1.5em;line-height:1.7em;font-family:helvetica,verdana;}
h3{font-size:1.25em;line-height:1.7em;font-family:helvetica,verdana;}
h4{font-size:1em;line-height:1.7em;font-family:helvetica,verdana;}
html,body{width:100%;height:100%;}
body{margin:0;padding:0;background-color:#ffffff;position:relative;font:16px/24px "NobileRegular","Lucida Grande",Lucida,Verdana,sans-serif;}
a{color:#1b61d6;text-decoration:none;}
a:hover{color:#e88f00;text-decoration:underline;}
body h1,
body h2,
body h3,
body h4,
body h5,
body h6{font-family:"NeutonRegular","Lucida Grande",Lucida,Verdana,sans-serif;font-weight:normal;color:#373839;font-style:normal;}
#wrap{min-height:100%;}
#header,#footer{width:100%;color:#ffffff;height:40px;position:absolute;text-align:center;line-height:40px;overflow:hidden;font-size:12px;vertical-align:middle;}
#header{background:#000000;top:0;font-size:14px;}
#footer{bottom:0;background:#000000 url(footerbg.png) repeat-x 0 top;position:relative;margin-top:-40px;clear:both;}
.header,.footer{width:750px;margin-right:auto;margin-left:auto;}
.wrapper{width:100%}
#top,#top-small,#bottom{width:100%;}
#top{color:#000000;height:230px;background:#ffffff url(headerbg.png) repeat-x 0 top;position:relative;}
#top-small{color:#000000;height:60px;background:#ffffff url(headerbg.png) repeat-x 0 top;position:relative;}
#bottom{color:#222;background-color:#ffffff;}
.top,.top-small,.middle,.bottom{width:750px;margin-right:auto;margin-left:auto;}
.top{padding-top:40px;}
.top-small{padding-top:10px;}
#middle{width:100%;height:100px;background:url(middlebg.png) repeat-x;border-top:2px solid #ffffff;border-bottom:2px solid #b2b2b2;}
.app-welcome{margin-top:25px;}
.app-name{color:#000000;font-weight:bold;}
.bottom{padding-top:50px;}
#left{width:350px;float:left;padding-right:25px;}
#right{width:350px;float:right;padding-left:25px;}
.align-left{text-align:left;}
.align-right{text-align:right;}
.align-center{text-align:center;}
ul.links{margin:0;padding:0;}
ul.links li{list-style-type:none;font-size:14px;}
form{border-style:none;}
fieldset{border-style:none;}
input{color:#222;border:1px solid #ccc;font-family:sans-serif;font-size:12px;line-height:16px;}
input[type=text],input[type=password]{width:205px;}
input[type=submit]{background-color:#ddd;font-weight:bold;}
/*Opera Fix*/
body:before{content:"";height:100%;float:left;width:0;margin-top:-32767px;}
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@@ -0,0 +1,82 @@
<!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" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal">
<head>
<title>The Pyramid Web Application Development Framework</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
<meta name="keywords" content="python web application" />
<meta name="description" content="pyramid web application" />
<link rel="shortcut icon" href="/static/favicon.ico" />
<link rel="stylesheet" href="/static/pylons.css" type="text/css" media="screen" charset="utf-8" />
<link rel="stylesheet" href="http://static.pylonsproject.org/fonts/nobile/stylesheet.css" media="screen" />
<link rel="stylesheet" href="http://static.pylonsproject.org/fonts/neuton/stylesheet.css" media="screen" />
<!--[if lte IE 6]>
<link rel="stylesheet" href="/static/ie6.css" type="text/css" media="screen" charset="utf-8" />
<![endif]-->
</head>
<body>
<div id="wrap">
<div id="top">
<div class="top align-center">
<div><img src="/static/pyramid.png" width="750" height="169" alt="pyramid"/></div>
</div>
</div>
<div id="middle">
<div class="middle align-center">
<p class="app-welcome">
Welcome to <span class="app-name">${project}</span>, an application generated by<br/>
the Pyramid web application development framework.
</p>
</div>
</div>
<div id="bottom">
<div class="bottom">
<div id="left" class="align-right">
<h2>Search documentation</h2>
<form method="get" action="http://docs.pylonsproject.org/projects/pyramid/current/search.html">
<input type="text" id="q" name="q" value="" />
<input type="submit" id="x" value="Go" />
</form>
<p>${info}</p>
<p>
${author}<br />
${content}<br />
${date}<br />
</p>
</div>
<div id="right" class="align-left">
<h2>Pyramid links</h2>
<ul class="links">
<li>
<a href="http://pylonsproject.org">Pylons Website</a>
</li>
<li>
<a href="http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/#narrative-documentation">Narrative Documentation</a>
</li>
<li>
<a href="http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/#reference-material">API Documentation</a>
</li>
<li>
<a href="http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/#tutorials">Tutorials</a>
</li>
<li>
<a href="http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/#detailed-change-history">Change History</a>
</li>
<li>
<a href="http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/#sample-applications">Sample Applications</a>
</li>
<li>
<a href="http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/#support-and-development">Support and Development</a>
</li>
<li>
<a href="irc://irc.freenode.net#pyramid">IRC Channel</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<div id="footer">
<div class="footer">&copy; Copyright 2008-2011, Agendaless Consulting.</div>
</div>
</body>
</html>
18 changes: 18 additions & 0 deletions examples/pyramidapp/pyramid_couchdb_example/tests.py
@@ -0,0 +1,18 @@
import unittest

from pyramid import testing

class ViewTests(unittest.TestCase):
def setUp(self):
self.config = testing.setUp()

def tearDown(self):
testing.tearDown()

def test_my_view(self):
from .views import my_view
#Don't actually test anything right now
#request = testing.DummyRequest()
#info = my_view(request)
#self.assertEqual(info['project'], 'pyramid_couchdb_example')
self.assertEqual(True, True)
46 changes: 46 additions & 0 deletions examples/pyramidapp/pyramid_couchdb_example/views.py
@@ -0,0 +1,46 @@
import datetime

from pyramid.view import view_config

from couchdbkit import *

import logging
log = logging.getLogger(__name__)

class Page(Document):
author = StringProperty()
page = StringProperty()
content = StringProperty()
date = DateTimeProperty()

@view_config(route_name='home', renderer='templates/mytemplate.pt')
def my_view(request):

def get_data():
return list(request.db.view('lists/pages', startkey=['home'], \
endkey=['home', {}], include_docs=True))

page_data = get_data()

if not page_data:
Page.set_db(request.db)
home = Page(
author='Wendall',
content='Using CouchDB via couchdbkit!',
page='home',
date=datetime.datetime.utcnow()
)
# save page data
home.save()

page_data = get_data()

doc = page_data[0].get('doc')

return {
'project': 'pyramid_couchdb_example',
'info': request.db.info(),
'author': doc.get('author'),
'content': doc.get('content'),
'date': doc.get('date')
}

0 comments on commit c50b6b3

Please sign in to comment.