{
"info": {
"author": "Eduardo Naufel Schettino",
"author_email": "schettino72@gmail.com",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 4 - Beta",
"Environment :: Web Environment",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Natural Language :: English",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.3",
"Topic :: Internet :: WWW/HTTP",
"Topic :: Software Development :: Libraries :: Application Frameworks",
"Topic :: Software Development :: Libraries :: Python Modules"
],
"description": "=========\nOverview\n=========\n\nAvalanche is a Python web-framework that focus on testability and reusability\n\nIt uses `Jinja2 `_ as a default template system and\ndoes not includes any persistence layer.\n\n\nAvalanche goals (or why another web framework?)\n================================================\n\n\nTestability\n-------------\n\nAvalanche was designed in a way that it makes it possible (easier for you) to\nwrite *good* unit-tests for your code. That is not only making it easy to write\ntests. A unit-test should:\n\n * give a clear error message when it fails\n * fail only when the feature under test is broken, not on every code change\n * be fast\n\n\n\nReusability\n-------------\n\nMostly every framework claims that some kind of reusability is one of\ntheir design goals.\nAvalanche \"reusability\" goals means **source-code** reusability.\n\nMany frameworks provide some mechanisms for reusable/plugable *sub-applications*\nhowever it is not always easy to re-use\nthese applications source code in case you need to configure/modify it.\nPlugable applications is also a very important feature but as of now\nAvalanche has no support for that.\n\nIt should not only be possible to write reusable code, the code should be\nreusable on the *first* time you write it.\nYou should not be advised to write the code in one way,\nand than later have to modify it to make it reusable.\nI.e. it is opposed to saying \"Use *view* (handler) functions\". And than...\n\"if you want your *views* to be re-usable convert them to class-based *views*!\".\n\n\n\nOf course Avalanche does not do miracles. Testability and reusability will\nultimately depends on the application code. But the framework\nhave a big role on setting up the *right* path.\n\nThe goals are presented below, hopefully after reading the design and tutorial\nit will be clear to you how these goals are achieved.\n\n\n\nProject Details\n===============\n\n* `Website/docs `_\n\n* This is an open-source project (`MIT license `_) written in python.\n\n* Download from `PyPi `_\n\n* Project management (bug tracker, feature requests and source code ) on `bitbucket `_.\n\n* Questions and feedback on `google group `_.\n\n\n\n\nAvalanche Design\n====================\n\n\nbeyond MVC (model-view-controller)\n-----------------------------------\n\n`MVC `_ is a software\narchitectural pattern created with the goal to isolate \"domain logic\" from\nthe user interface. This separation of concern enables the creation of better\napplication code. This pattern was very successful for many desktop frameworks\nand so served as a reference to the creation of web-frameworks. The problem is\nthat this architecture can not be mapped directly to the way web-applications\nwork.\n\nEven the so-called MVC frameworks are not really MVC. So let's just keep the\nMVC's goal. That is to write clean, re-usable and testable code.\n\n\nweb applications\n------------------\n\nEssentially all a web-application do is to receive a\n`HTTP `_ request, process it and generate a HTTP response.\n\n::\n\n +------------------+\n HTTP Request ------>| web application + -----> HTTP Response\n +------------------+\n\nSending and receiving HTTP is handled by a web-server,\nso we don't need to worry about that.\nLet's take a closer look into how the web application generates a HTTP response:\n\n\n\n::\n\n +------+ +-------+\n HTTP request ---->|router|----->|handler|----> HTTP response\n +------+ +-------+\n\nThe *router* will analyze the request and dispatch it to a request\n*handler* that will create the response.\n\n\nrequest handlers styles\n------------------------\n\nThere are mainly 3 styles of request handlers.\n * a single function\n * a class method\n * a class\n\nAvalanche uses the third style, a class. Using a class as request\nhandler suits better our goals because it provides a greater flexibility, easier\nto modify/extend and re-use parts of the handler.\n\n\nrequest handler processing\n---------------------------\n\nThe request handler processing can be divided in 3 stages:\n\n::\n\n +-----------------+ +------------+ +----------+\n request ---->| param converter |---- param objects ---->| processing |--- context ----->| renderer |----> response\n +-----------------+ +------------+ +----------+\n\n\n1) param converter - get parameters from HTTP request\n\n HTTP is a text protocol, the application will typically get some\n parameters from the request and convert string values into some native data\n types. These parameters are taken from the URI path, URI query, post-data,\n cookies, etc.\n\n This is where you will write some *glue code* to map HTTP into your application\n code.\n\n\n2) processing / context builder\n\n Processing is the application logic. It will often access a persistence\n layer (sometimes called *Model*, but this is entirely up to the application code\n and the web-framework has no role on that). It might also trigger other\n operations like doing some batch processing or accessing third-party\n applications.\n Note that typically this application logic is independent of HTTP.\n\n This processing may also consist of simple data retrieval.\n In this case the processing may generate a *context*.\n Context is a term used to represent the data that will be used by a renderer\n to create a HTTP response.\n\n A web page is often composed of several elements so sometimes it makes sense to\n divide the work into more than one \"context builder\".\n\n\n\n3) renderer - generate output\n\n The renderer will convert the result of the application processing into text\n to create a HTTP response.\n The renderer will typically use a template system to generate HTML code\n or convert the data to JSON.\n\n\nOn avalanche you should write code for the 3 stages of the handler separately and\nlet the framework put the different parts together.\n\n\nMove on to the tutorial to see how it looks like.",
"description_content_type": null,
"docs_url": "https://pythonhosted.org/avalanche/",
"download_url": "UNKNOWN",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "http://packages.python.org/avalanche/overview.html",
"keywords": null,
"license": "MIT",
"maintainer": null,
"maintainer_email": null,
"name": "avalanche",
"package_url": "https://pypi.org/project/avalanche/",
"platform": "UNKNOWN",
"project_url": "https://pypi.org/project/avalanche/",
"project_urls": {
"Download": "UNKNOWN",
"Homepage": "http://packages.python.org/avalanche/overview.html"
},
"release_url": "https://pypi.org/project/avalanche/0.3.0/",
"requires_dist": null,
"requires_python": null,
"summary": "Web Framework with a focus on testability and reusability",
"version": "0.3.0"
},
"last_serial": 853479,
"releases": {
"0.1.0": [],
"0.1.1": [
{
"comment_text": "",
"digests": {
"md5": "be44ef44430d2728e5686872b954d23e",
"sha256": "d5e99b1e1532279eae1b04b7be337579fd5ab5e4bd164ad7a0a58c660a256a38"
},
"downloads": -1,
"filename": "avalanche-0.1.1.tar.gz",
"has_sig": false,
"md5_digest": "be44ef44430d2728e5686872b954d23e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 40893,
"upload_time": "2012-03-12T05:34:32",
"url": "https://files.pythonhosted.org/packages/37/82/378bb19f904fff9879bf2638ac1622b9009af18dc5bad1a5c46da26e5d24/avalanche-0.1.1.tar.gz"
}
],
"0.2.0": [
{
"comment_text": "",
"digests": {
"md5": "7243e26c6fe4b6e94fbbce2c35be4297",
"sha256": "0b91c12ebebffdbc1d17de9c375eb7ba1e37336b701d01d278424024190fb4b9"
},
"downloads": -1,
"filename": "avalanche-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "7243e26c6fe4b6e94fbbce2c35be4297",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 52214,
"upload_time": "2012-04-17T19:25:21",
"url": "https://files.pythonhosted.org/packages/75/dd/29783ee5d6e219f8216c9e035d4cbf792739d31515bf6e2fa1de3b7bca01/avalanche-0.2.0.tar.gz"
}
],
"0.3.0": [
{
"comment_text": "",
"digests": {
"md5": "14df1cc3ce8fc812e4d57f7bfeaf0cf1",
"sha256": "55c55ddc72e8541f3b272ed4a332b9d3a53d2371b19261b110a5a39e2e3b3a4b"
},
"downloads": -1,
"filename": "avalanche-0.3.0.tar.gz",
"has_sig": false,
"md5_digest": "14df1cc3ce8fc812e4d57f7bfeaf0cf1",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14070,
"upload_time": "2013-08-31T01:16:29",
"url": "https://files.pythonhosted.org/packages/13/65/a96515ba5170d2a04906e4a4d1383b22219ced1d98bfa8cdf02a66dd277d/avalanche-0.3.0.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "14df1cc3ce8fc812e4d57f7bfeaf0cf1",
"sha256": "55c55ddc72e8541f3b272ed4a332b9d3a53d2371b19261b110a5a39e2e3b3a4b"
},
"downloads": -1,
"filename": "avalanche-0.3.0.tar.gz",
"has_sig": false,
"md5_digest": "14df1cc3ce8fc812e4d57f7bfeaf0cf1",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14070,
"upload_time": "2013-08-31T01:16:29",
"url": "https://files.pythonhosted.org/packages/13/65/a96515ba5170d2a04906e4a4d1383b22219ced1d98bfa8cdf02a66dd277d/avalanche-0.3.0.tar.gz"
}
]
}