""" tools/run_docs.py documentation runner. *** ADVANCED EXAMPLE !!! PUSHES CONFIG TO THE LIMIT ! *** for a simpler standalone example, please consult /examples/shoppingcart/run_cart.py . """ import os, sys, re # adjust path to use local directory [sys.path.insert(0, path) for path in ['./lib', './doc/lib', './examples/common', './examples/shoppingcart/lib', './examples/formvisitor/lib']] # myghty imports import myghty.http.HTTPServerHandler as HTTPServerHandler from myghty.resolver import * # determine port number try: port = int(sys.argv[1]) except: port = 8000 # create local cache directory to store generated files + sessions if not os.access('./cache', os.F_OK): os.mkdir('./cache') # now set up standalone server httpd = HTTPServerHandler.HTTPServer( port = port, # send all request content types through the full resolution chain text_only = False, # handlers. a list of regular expressions matched to directories to serve # or Interpreter configurations. handlers = [ {r'.*/$|.*\.myt$|/source/.*|/examples/shoppingcart/store/.*' : HTTPServerHandler.HSHandler( data_dir = './cache', #use_static_source = True, #debug_elements = ['resolution'], #disable_unicode=True, resolver_strategy = [ # caching. if static_source is turned on, everything below this rule # is cached based on the URI as well as contextual modifiers. URICache(), # create a group that handles all shopping cart URIs ConditionalGroup(regexp='/examples/shoppingcart/store/.*', rules = [ # create a "request-only" subgroup for resolving the lead module # components. this isolates request-level resolutions from # subrequest and component resolutions, greatly reducing the # overall number of lookups required per-component. ConditionalGroup(context='request', rules = [ #ResolveModule( # {r'.*/catalog/.*' : 'shoppingcontroller:index.catalog'}, # {r'.*/item/.*' : 'shoppingcontroller:index.item'}, # {r'.*/cart/.*' : 'shoppingcontroller:index.cart'}, # {r'.*/source/.*' : 'shoppingcontroller:index.source'}, # ), ResolvePathModule( 'shoppingcontroller', adjust = lambda u: re.sub(r'/examples/shoppingcart/store/', '/', u) ), ]), ResolveDhandler(), ResolveUpwards(), ResolveFile( {'store_comp':'./examples/shoppingcart/components'}, {'store_templ':'./examples/shoppingcart/templates'}, {'store_htdocs':'./examples/shoppingcart/htdocs'}, adjust = lambda u: re.sub(r'/examples/shoppingcart/store/', '/', u) ), NotFound() ]), # resolution rules for the /source/ browser Conditional( ResolveModule({r'.*' : 'modulecomponents:ViewSource'}), regexp='/source/.*' ), # resolution rules for the documentation viewer ConditionalGroup(regexp='^/doc/$|^/doc/.*\.myt$', rules = [ PathTranslate( (r'^/doc/$', '/doc/index.myt'), ), # upwards search, i.e. for /autohandler. the remaining rules # in this chain will be used to match against successive # /autohandler uris. ResolveUpwards(), AdjustedResolveFile( [(r'^/doc/', r'/')], {'common':'./examples/common'}, {'doc_comp':'./doc/components'}, {'doc_content':'./doc/content'}, ), NotFound() ]), # default resolution rules, after the above conditionals have not been # met PathTranslate( (r'^/examples', ''), (r'/$', '/index.myt'), ), # if a dhandler is being searched, the remainder of the rules will # be queried with successive /dhandler uris ResolveDhandler(), ResolveUpwards(), ResolveFile( {'common':'./examples/common'}, {'example_htdocs':'./examples'}, ), ], attributes = { 'store_uri' : '/examples/shoppingcart/store/', 'store_document_uri' : '/examples/shoppingcart/docs/', 'store_path' : '/examples/shoppingcart/store/', 'source_uri' : '/source/', 'source_root' : './', 'docs_static_cache': True, }, ) }, # docroots {r'/examples/shoppingcart/docs/(.*)' : './examples/shoppingcart/htdocs'}, {r'/examples/shoppingcart/store/source/(.*)' : './examples/shoppingcart/'}, {r'/doc/(.*)' : './doc/html'}, {r'/examples/(.*)' : './examples'}, {r'/source/(.*)' : '.'}, {r'/(.*)':'./examples'}, ] ) print "HTTPServer listening on port %d" % httpd.port httpd.serve_forever()